From 669955fbdaaf0095a35817bc1fca6bcef76bf582 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 13 Mar 2023 14:40:31 +0100 Subject: [PATCH 01/29] chore: updated to Theia `1.37.0-next` - Updated `@theia/*` to `1.37.0-next.22`. - Fixed all `yarn audit` security vulnerabilities. - Updated to `electron@22.3.2`: - `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"`. Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 2 +- .../contributions/open-sketch-external.ts | 5 +- .../ide-updater/ide-updater-component.tsx | 1 - yarn.lock | 919 ++++++++++++++++-- 4 files changed, 817 insertions(+), 110 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index bb1963ee6..c6f1a76a1 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -94,7 +94,7 @@ "ps-tree": "^1.2.0", "query-string": "^7.0.1", "react-disable": "^0.1.1", - "react-markdown": "^8.0.0", + "react-markdown": "^6.0.3", "react-perfect-scrollbar": "^1.5.8", "react-select": "^5.6.0", "react-tabs": "^3.1.2", 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 af47c7c28..2f9c73957 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,6 @@ import { injectable } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; +import { CommandService } from '@theia/core/lib/common/command'; import { ArduinoMenus } from '../menu/arduino-menus'; import { SketchContribution, @@ -14,7 +15,7 @@ import { nls } from '@theia/core/lib/common/nls'; export class OpenSketchExternal extends SketchContribution { override registerCommands(registry: CommandRegistry): void { registry.registerCommand(OpenSketchExternal.Commands.OPEN_EXTERNAL, { - execute: () => this.openExternal(), + execute: () => this.openExternal(registry), }); } @@ -33,7 +34,7 @@ export class OpenSketchExternal extends SketchContribution { }); } - protected async openExternal(): Promise { + protected async openExternal(commandService: CommandService): Promise { const uri = await this.sketchServiceClient.currentSketchFile(); if (uri) { const exists = await this.fileService.exists(new URI(uri)); 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..1cec53096 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 @@ -6,7 +6,6 @@ import { ProgressInfo, UpdateInfo } from '../../../common/protocol/ide-updater'; import ProgressBar from '../../components/ProgressBar'; const ReactMarkdown = React.lazy>( - // @ts-expect-error see above () => import('react-markdown') ); diff --git a/yarn.lock b/yarn.lock index e5a69a4c7..35eac062c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1079,7 +1079,11 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +<<<<<<< HEAD "@grpc/grpc-js@^1.8.14": +======= +"@grpc/grpc-js@^1.8.12": +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -2080,17 +2084,29 @@ dependencies: defer-to-connect "^2.0.1" +<<<<<<< HEAD "@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.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.37.0-next.22.tgz#24ca959505a91433d6f6b3be8a8ab054a2a78639" + integrity sha512-rVabjWKIMo3iTbOWH+ge+jLgqRr7LXGBFz0HdQcTBEs8z/qc7zGL2RTsZFD+2Up4FTLSdny5nMA8TfpdMry6CA== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" +<<<<<<< HEAD "@theia/application-package" "1.37.0" "@theia/ffmpeg" "1.37.0" +======= + "@theia/application-package" "1.37.0-next.22+0e0e9ee4b" + "@theia/ffmpeg" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/fs-extra" "^4.0.2" "@types/semver" "^7.3.8" babel-loader "^8.2.2" @@ -2118,12 +2134,21 @@ worker-loader "^3.0.8" yargs "^15.3.1" +<<<<<<< HEAD "@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" +======= +"@theia/application-package@1.37.0-next.22", "@theia/application-package@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.37.0-next.22.tgz#820b03c7508b45f4b0a58678caad076571c1c2e5" + integrity sha512-swh6ReVt+Lxw2CF4RtDBNYslxRjMd3HqLIPFCRGR49Rh0hCLPt2VbWLrGOUKZOauGcEi9SilRPIEHF8rWQ3+8w== + dependencies: + "@theia/request" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/fs-extra" "^4.0.2" "@types/semver" "^5.4.0" "@types/write-json-file" "^2.2.1" @@ -2135,6 +2160,7 @@ semver "^5.4.1" write-json-file "^2.2.0" +<<<<<<< HEAD "@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" @@ -2167,6 +2193,40 @@ "@theia/localization-manager" "1.37.0" "@theia/ovsx-client" "1.37.0" "@theia/request" "1.37.0" +======= +"@theia/bulk-edit@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.37.0-next.22.tgz#59bc77a15aed4082a65e499da5fa08d9b2bec619" + integrity sha512-bLp8FYbLmxlvL4XdFgwYhb+0wHzkNyTx9V9sUEgaIiSFPSc4VmXijFX+L2SW1WnmYjflVkTyXkUNsgvbJQUglw== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" + +"@theia/callhierarchy@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.37.0-next.22.tgz#aef0f1a2a11e7e69ec1aad9785fd37e39180867a" + integrity sha512-vgdqYgs7d1hvgTqH8uqXpBK89qNEv2gYe0U3HuacCEqXhu+bIWh4aUCr4VOBEInHgjPaxEq6vZqg7BuEiLaxPw== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + ts-md5 "^1.2.2" + +"@theia/cli@1.37.0-next.22": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.37.0-next.22.tgz#51503dbc80765303989bea11a94400d25d820f49" + integrity sha512-UI7H/uMIb7RNznWLAv33aUvp6uBwWcPRvNVxA44+DrCNZTQkMnHEVg7EM+/b5vWMsZyZiOWE7MHzizAhyYxczA== + dependencies: + "@theia/application-manager" "1.37.0-next.22+0e0e9ee4b" + "@theia/application-package" "1.37.0-next.22+0e0e9ee4b" + "@theia/ffmpeg" "1.37.0-next.22+0e0e9ee4b" + "@theia/localization-manager" "1.37.0-next.22+0e0e9ee4b" + "@theia/ovsx-client" "1.37.0-next.22+0e0e9ee4b" + "@theia/request" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/chai" "^4.2.7" "@types/mocha" "^10.0.0" "@types/node-fetch" "^2.5.7" @@ -2184,6 +2244,7 @@ temp "^0.9.1" yargs "^15.3.1" +<<<<<<< HEAD "@theia/console@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.37.0.tgz#87144273a6550aef1a755cae19786feb352a0a91" @@ -2198,6 +2259,22 @@ 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/console@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.37.0-next.22.tgz#7c5cd15f361b3aa618dd99ce9fced92b8034eeca" + integrity sha512-NkxwYo/aWt42F9TcdMvHRNMUqyWiqB5409+xi0nVSftbMus1KjgWpnvlwUOLtUvJ2c4RDxv/ULW8TOsoWY2gyg== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + anser "^2.0.1" + +"@theia/core@1.37.0-next.22", "@theia/core@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.37.0-next.22.tgz#bf334fe3945dd6b58406ecdb4c676e5e5fa7d22f" + integrity sha512-hZNPaTQHVAhy/Vg1CR7Kwi1YmD5u9uXECFezmKHfbH7vhq6JL7wA3gRSyKE3AV+4YgbDaJBtwz1zOpmk/yzSng== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@babel/runtime" "^7.10.0" "@phosphor/algorithm" "1" @@ -2210,8 +2287,13 @@ "@phosphor/signaling" "1" "@phosphor/virtualdom" "1" "@phosphor/widgets" "1" +<<<<<<< HEAD "@theia/application-package" "1.37.0" "@theia/request" "1.37.0" +======= + "@theia/application-package" "1.37.0-next.22+0e0e9ee4b" + "@theia/request" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/body-parser" "^1.16.4" "@types/cookie" "^0.3.3" "@types/dompurify" "^2.2.2" @@ -2267,6 +2349,7 @@ ws "^7.1.2" yargs "^15.3.1" +<<<<<<< HEAD "@theia/debug@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.37.0.tgz#87e45c73cc271a01a4ad8d0e536157f1209f5237" @@ -2285,11 +2368,32 @@ "@theia/terminal" "1.37.0" "@theia/variable-resolver" "1.37.0" "@theia/workspace" "1.37.0" +======= +"@theia/debug@1.37.0-next.22", "@theia/debug@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.37.0-next.22.tgz#98f36721bd315ea69e69b928ed46d97e4a7f7bbf" + integrity sha512-7IYapbuKLq3ejeWQpkYqMIupugw6GsLx29hUWPOMXp1lfuZSVJlABxabbZEjgb+3uLIsOaK+ZZoaq19R+7Ez+w== + dependencies: + "@theia/console" "1.37.0-next.22+0e0e9ee4b" + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/markers" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + "@theia/output" "1.37.0-next.22+0e0e9ee4b" + "@theia/process" "1.37.0-next.22+0e0e9ee4b" + "@theia/task" "1.37.0-next.22+0e0e9ee4b" + "@theia/terminal" "1.37.0-next.22+0e0e9ee4b" + "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@vscode/debugprotocol" "^1.51.0" fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" +<<<<<<< HEAD "@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" @@ -2311,19 +2415,50 @@ version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.37.0.tgz#a44608fad9a7ad62a0dd6cd657d62db6ad3015e6" integrity sha512-d3aQ0E8g0FmVpT99fgrzRFpN9bl5LoIzEzwTTTFUOsDIN/TwGJ+AFmi1UpGn6nBMaszz1JClcrguuYvdJf3Djg== +======= +"@theia/editor-preview@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.37.0-next.22.tgz#aec6decc4c0b88c78659d406005552fa640eafcd" + integrity sha512-hzqinUcrvM3Q3KZf/9jWepnUlAJ6JTvku7wAXNRpimE4BjyBR1DrZyPkYl3Eqa/wuFTB9bOnNMgwjtJf/l3wJA== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" + +"@theia/editor@1.37.0-next.22", "@theia/editor@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.37.0-next.22.tgz#9722770a1df4676acf4e66f7d6452d59b9d2ea52" + integrity sha512-mKT+rg+8hNY4W/Olbz9iknohc7R2rYqTdo9KbXKj8eyJuCOETLuK7QErgplGRJZEugqXnMRjs6VgDclQ9E0SEA== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" + +"@theia/electron@1.37.0-next.22": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.37.0-next.22.tgz#56b1f45352f2a3438056e712f73b90b834381532" + integrity sha512-kxSBqpTquAhQ5XoeEYp+lOHJ7dk9rC5wdd2Afbl60MgQpQS2OiFexPT+cwAc7Pxn+PWOxuA27ik3d0WORunVkA== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: electron-store "^8.0.0" fix-path "^3.0.0" native-keymap "^2.2.1" +<<<<<<< HEAD "@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.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.37.0-next.22.tgz#87e55dc24bdb64c1bb7190887cbe8804de78fe35" + integrity sha512-FUeP1q9T9gc8vYPgHaKbdXNEdkUZxLnRcJvQHD3CWPU1ODvuDfcItoeVUlZfrWdAQ+dM7WWipsaqNDGN+Nwtdg== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@electron/get" "^2.0.0" unzipper "^0.9.11" +<<<<<<< HEAD "@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" @@ -2342,6 +2477,26 @@ integrity sha512-RI7T6hzYxLA7q3QYOdjg8NPOj9RJrBCEQ7W2+njYKLoQejXRYP2pe4lqzERT2IZC23ZA79OrXLp166YMXO/rHA== dependencies: "@theia/core" "1.37.0" +======= +"@theia/file-search@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.37.0-next.22.tgz#d586ee881b7877fac2556d4ad458d3d4f173f4cc" + integrity sha512-PZIVKq/43GrmJ+EfWlBnA25Z6OfV9hzev7zFy7F31sunRKdD0mip3UM2VAIO359zLjztgm9+0M/foGecS8LLLg== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/process" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" + "@vscode/ripgrep" "^1.14.2" + +"@theia/filesystem@1.37.0-next.22", "@theia/filesystem@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.37.0-next.22.tgz#adf68c87df51ad44d518d4e9092051ae4219c502" + integrity sha512-LidEwT1hmIIH6AS5oj7I3pax6r5Bvj/x4KiBhzVbMj3imONBjmg9uXKaYxA2CUZtMZdSG8xliFmMd8EIUi4tmw== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/body-parser" "^1.17.0" "@types/multer" "^1.4.7" "@types/rimraf" "^2.0.2" @@ -2358,6 +2513,7 @@ uuid "^8.0.0" vscode-languageserver-textdocument "^1.0.1" +<<<<<<< HEAD "@theia/keymaps@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.37.0.tgz#ead53cd813de6a9525fc5a276f5bbb5f5aa65c9b" @@ -2374,6 +2530,24 @@ 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/keymaps@1.37.0-next.22": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.37.0-next.22.tgz#1718a3b6e6f5ca034b90268b41c567e366437984" + integrity sha512-RvFya16MmDiKXlaN4dFdMFTP3I9PEckRlXDqLprG1tqQkPDh3WUz/l1QGiBi1q0hB1tCphd3jCyQCHNi6Bj3rw== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + "@theia/preferences" "1.37.0-next.22+0e0e9ee4b" + "@theia/userstorage" "1.37.0-next.22+0e0e9ee4b" + jsonc-parser "^2.2.0" + +"@theia/localization-manager@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.37.0-next.22.tgz#7a5266f6c3c5c9dc06d12765f21c0d91d484e2f3" + integrity sha512-t/fJ/4gVsnd5+lrGvSJnaTCK0BlLrJoyTLXTB7Yri25r8MO7JppnAqqAEg0prrXlzXL7vY/Sjm4A7lBsRIv5Rg== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@types/bent" "^7.0.1" "@types/fs-extra" "^4.0.2" @@ -2384,6 +2558,7 @@ glob "^7.2.0" typescript "~4.5.5" +<<<<<<< HEAD "@theia/markers@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.37.0.tgz#ea6b36bf5a8e6a45165d31e699413595529fd8a7" @@ -2399,6 +2574,23 @@ integrity sha512-4wKPlAR9VoRqPDZ5xYysTNvMmzjabst1cd8yp1tm9DREs/0coVWsWYUdP0s0TZBE570OC0MIGQGew5VGB8p9kQ== dependencies: "@theia/core" "1.37.0" +======= +"@theia/markers@1.37.0-next.22", "@theia/markers@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.37.0-next.22.tgz#d305df95d39c33722572cede89f3f703c847d1cb" + integrity sha512-5lIOytiTwrH+3rtssX876JwPrvj8u+R1CagzAjcFwH6WUr1Hs9TkExufW568uLvfMbbFIm4IHgvLBFZFQAdB5Q== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" + +"@theia/messages@1.37.0-next.22", "@theia/messages@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.37.0-next.22.tgz#79604cdf45a8ce98fad45d8a74e8e7715dc9ba22" + integrity sha512-oXADsZfwlPVMQxD1xUnhT4TmkqGDiRJdAwsN3MoemhVASGnyX8HgU2NC+3vco08tA1nK8PGAM1UGzZJNymO0QA== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) react-perfect-scrollbar "^1.5.3" ts-md5 "^1.2.2" @@ -2407,6 +2599,7 @@ resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-1.72.3.tgz#911d674c6e0c490442a355cfaa52beec919a025e" integrity sha512-2FK5m0G5oxiqCv0ZrjucMx5fVgQ9Jqv0CgxGvSzDc4wRrauBdeBoX90J99BEIOJ8Jp3W0++GoRBdh0yQNIGL2g== +<<<<<<< HEAD "@theia/monaco@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.37.0.tgz#8bd861c3b85f9627f4e4c50d59b1231362d96298" @@ -2418,12 +2611,26 @@ "@theia/markers" "1.37.0" "@theia/monaco-editor-core" "1.72.3" "@theia/outline-view" "1.37.0" +======= +"@theia/monaco@1.37.0-next.22", "@theia/monaco@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.37.0-next.22.tgz#7474669953a87ee6f4e070ecd085081d2121aafd" + integrity sha512-wM1z53w+h9B+7QVZzeFKCENOyRxJOaLXKGp+WxIw7ETO2sH5wMlAabMu17v/XQ03I3AGGNZmGVCGRa11EUtQLg== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/markers" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + "@theia/outline-view" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) fast-plist "^0.1.2" idb "^4.0.5" jsonc-parser "^2.2.0" vscode-oniguruma "1.6.1" vscode-textmate "^7.0.3" +<<<<<<< HEAD "@theia/navigator@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.37.0.tgz#05b804479419a43042678023fa5a966be2126637" @@ -2449,10 +2656,38 @@ "@theia/core" "1.37.0" "@theia/editor" "1.37.0" "@theia/monaco" "1.37.0" +======= +"@theia/navigator@1.37.0-next.22", "@theia/navigator@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.37.0-next.22.tgz#9a0b7ba76bcf2ae601fcf0362a322df1e5a07a3b" + integrity sha512-gXNDshFcwZJf1iTNFQZ7sjmgXbV+E5oh1PdYu6FzJRIJfEN0d+3W+a2ffXD6R2IN2l4I+dwjE4jL5zONIWPs9Q== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" + minimatch "^5.1.0" + +"@theia/outline-view@1.37.0-next.22", "@theia/outline-view@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.37.0-next.22.tgz#a7f42b783b2521327abce944aa4f1f8a2943f8b5" + integrity sha512-zjPe/Q2Hb08IBENKDzak1wFsPiuhlX4RsafkquNvrfi1J7Evb8VC/cenCNH1g0t1uA3UAovzREeyUnKV0a3ORQ== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + +"@theia/output@1.37.0-next.22", "@theia/output@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.37.0-next.22.tgz#b55bb5a0fbeae5570ae5012bd0fa760448a244c7" + integrity sha512-JzY8wfMadzBxhZEcmmZM6+Svn86FzxzVWGbCN0kUC6wsc8F+tncIc5HjLcYpTia+1nClEywnyCXGfqvHBJBxtg== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@theia/monaco-editor-core" "1.72.3" "@types/p-queue" "^2.3.1" p-queue "^2.4.2" +<<<<<<< HEAD "@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" @@ -2511,6 +2746,66 @@ "@theia/typehierarchy" "1.37.0" "@theia/variable-resolver" "1.37.0" "@theia/workspace" "1.37.0" +======= +"@theia/ovsx-client@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.37.0-next.22.tgz#3f27842ac68f5b423468d04ed157acc8043863d8" + integrity sha512-A3Y5dHverYEKO5IMCWx6tR3mlw9cqupGsFrN7+3atADLpK4A2/wjWApZ4DHvTVWnmwdR6J/KUuJy8j7MpDH0ww== + dependencies: + "@theia/request" "1.37.0-next.22+0e0e9ee4b" + semver "^5.4.1" + +"@theia/plugin-ext-vscode@1.37.0-next.22": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.37.0-next.22.tgz#53b3766f90081a89785b9b1150d3ca5976997dd9" + integrity sha512-wqDTGGI8kSUXiMx5iYsm9XLfkZLt1m14zksjzQwAnS6NobaMBvB0gHttot8WRSVjNkGLKbomzaxwu/zz+DnMjA== + dependencies: + "@theia/callhierarchy" "1.37.0-next.22+0e0e9ee4b" + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" + "@theia/plugin" "1.37.0-next.22+0e0e9ee4b" + "@theia/plugin-ext" "1.37.0-next.22+0e0e9ee4b" + "@theia/terminal" "1.37.0-next.22+0e0e9ee4b" + "@theia/typehierarchy" "1.37.0-next.22+0e0e9ee4b" + "@theia/userstorage" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" + filenamify "^4.1.0" + +"@theia/plugin-ext@1.37.0-next.22", "@theia/plugin-ext@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.37.0-next.22.tgz#757607faba1c4078fb7b358c6d2c2e006a37dc00" + integrity sha512-U0Mx2T5KieNJTFB4c+aVapl1/SY/dxNE53e5BbmHqC7WUnSyPIvwLmXosyxNUToxAHob9DjM9Tm4yWqm48kc4Q== + dependencies: + "@theia/bulk-edit" "1.37.0-next.22+0e0e9ee4b" + "@theia/callhierarchy" "1.37.0-next.22+0e0e9ee4b" + "@theia/console" "1.37.0-next.22+0e0e9ee4b" + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/debug" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor-preview" "1.37.0-next.22+0e0e9ee4b" + "@theia/file-search" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/markers" "1.37.0-next.22+0e0e9ee4b" + "@theia/messages" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" + "@theia/output" "1.37.0-next.22+0e0e9ee4b" + "@theia/plugin" "1.37.0-next.22+0e0e9ee4b" + "@theia/preferences" "1.37.0-next.22+0e0e9ee4b" + "@theia/scm" "1.37.0-next.22+0e0e9ee4b" + "@theia/search-in-workspace" "1.37.0-next.22+0e0e9ee4b" + "@theia/task" "1.37.0-next.22+0e0e9ee4b" + "@theia/terminal" "1.37.0-next.22+0e0e9ee4b" + "@theia/timeline" "1.37.0-next.22+0e0e9ee4b" + "@theia/typehierarchy" "1.37.0-next.22+0e0e9ee4b" + "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/mime" "^2.0.1" "@vscode/debugprotocol" "^1.51.0" decompress "^4.2.1" @@ -2528,6 +2823,7 @@ vscode-proxy-agent "^0.12.0" vscode-textmate "^7.0.3" +<<<<<<< HEAD "@theia/plugin@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.37.0.tgz#e63763b87d1dc161936e388d2880b2347f5d5d26" @@ -2545,11 +2841,31 @@ "@theia/monaco-editor-core" "1.72.3" "@theia/userstorage" "1.37.0" "@theia/workspace" "1.37.0" +======= +"@theia/plugin@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.37.0-next.22.tgz#f72c52f075b241f26089ce3e7216e6657c2a035c" + integrity sha512-mMTA74sFHn+akI14pbEcjfAJCRF09G3fqKeLQB6EeDt4n8xnMRachVref+iFZJS01Dgrplk+unoJ4O8HoIrXqQ== + +"@theia/preferences@1.37.0-next.22", "@theia/preferences@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.37.0-next.22.tgz#b1fd21abfad18703ecf4a97bdd04379480d27767" + integrity sha512-H3Qrj/ALH4+jKtKnYNkD+GCGNrGyrm8C7FwQ8FAR5eoGNfDMjESFbgtdaN/nMIRVU9Y0JmOJe4PorhZHIwSYBQ== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + "@theia/userstorage" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) async-mutex "^0.3.1" fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" +<<<<<<< HEAD "@theia/process@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.37.0.tgz#ea847e52f10e16bd466003054c81cdac9af60fe8" @@ -2563,10 +2879,26 @@ version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.37.0.tgz#1925ab93f771a807ca9cee1ae68747afb0ba866d" integrity sha512-US3wrXDOs4XNxFkWeW5Sz7dTQpDS+IMQu3i2RfFAknZOgadOJvSuQkIuKtt1tqvaP/Z1nOzQ+1Enmlr5hWWUIg== +======= +"@theia/process@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.37.0-next.22.tgz#751607033dbca2b1dd23844902e901bdf34553f7" + integrity sha512-Lv6XsYAUmzTbqH60XKN3PaFpFwgjqlh234uLpad4CP9xbKdDfCd7XNsAO3CVfSFn42bqxHiJekkzCAsKgoYfVg== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + node-pty "0.11.0-beta17" + string-argv "^0.1.1" + +"@theia/request@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.37.0-next.22.tgz#3d05757d0eaa6eb49dfdb1d746d53c7c64c4c958" + integrity sha512-Zmuc+GoLZFTUWAo/9xzt9qSKT/JoRAvvPXrdm9Snraq+mcvwcZ+88E3eQieC5ueX3UsMlSHXqDZ8oWgdhlAvAQ== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" +<<<<<<< HEAD "@theia/scm@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.37.0.tgz#fd125ccabccd09e479838bbd8162dfcab51a1e80" @@ -2575,12 +2907,23 @@ "@theia/core" "1.37.0" "@theia/editor" "1.37.0" "@theia/filesystem" "1.37.0" +======= +"@theia/scm@1.37.0-next.22", "@theia/scm@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.37.0-next.22.tgz#8c788e894bd44ba7ea9d5de553d9685227909686" + integrity sha512-hu01NgOoL8UWoThAibFdtVVSs0QUqqW3A3rdTsUe/Fs1GIfwmeH3GUd15rOov+Z0XbI8r1hGVJ/urjzf6ip3/g== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@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" +<<<<<<< HEAD "@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" @@ -2611,10 +2954,43 @@ "@theia/userstorage" "1.37.0" "@theia/variable-resolver" "1.37.0" "@theia/workspace" "1.37.0" +======= +"@theia/search-in-workspace@1.37.0-next.22", "@theia/search-in-workspace@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.37.0-next.22.tgz#a47c1506d6202e83b30c59e1bbedf5899e9ccdf4" + integrity sha512-djFQqXtyuZuKpVNFxHXm5IF8vqDsxzD6skqewh6mJBJkLDQfj57wp/7sjRlN2qIvo+smwf0gARSjDG7Y9Rjujw== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" + "@theia/process" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" + "@vscode/ripgrep" "^1.14.2" + minimatch "^5.1.0" + +"@theia/task@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.37.0-next.22.tgz#eb46842e4f64dc6bc503e078bd47ba12f3117f29" + integrity sha512-FEprtoOy+GbWLNiDE/b7HALsQT6QJ2VFPqkv6059t0o3MgnipmG5gW1GWF75q0EfASO4/vOcCoCNpZkyGvmQpw== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/markers" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" + "@theia/monaco-editor-core" "1.72.3" + "@theia/process" "1.37.0-next.22+0e0e9ee4b" + "@theia/terminal" "1.37.0-next.22+0e0e9ee4b" + "@theia/userstorage" "1.37.0-next.22+0e0e9ee4b" + "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) async-mutex "^0.3.1" jsonc-parser "^2.2.0" p-debounce "^2.1.0" +<<<<<<< HEAD "@theia/terminal@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.37.0.tgz#af5e2d521d9fecaf09b5b270a8c6ddec72f9a39e" @@ -2626,10 +3002,24 @@ "@theia/process" "1.37.0" "@theia/variable-resolver" "1.37.0" "@theia/workspace" "1.37.0" +======= +"@theia/terminal@1.37.0-next.22", "@theia/terminal@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.37.0-next.22.tgz#d84c8b146082f6746267aae6348dd4bfa76e4948" + integrity sha512-YWl+xMeYQ0LQHItjjbKroXXhb2RB/pXwhVGKXnd4/9DCVX1Qwj5E5rSZLP9UOX4XExVMmqo3jIpNRDemA6wNXA== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/process" "1.37.0-next.22+0e0e9ee4b" + "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" + "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) xterm "^4.16.0" xterm-addon-fit "^0.5.0" xterm-addon-search "^0.8.2" +<<<<<<< HEAD "@theia/timeline@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.37.0.tgz#5216056b14c340a6594eb41f7e4329034e244dbf" @@ -2671,6 +3061,49 @@ "@theia/core" "1.37.0" "@theia/filesystem" "1.37.0" "@theia/variable-resolver" "1.37.0" +======= +"@theia/timeline@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.37.0-next.22.tgz#3558baa77216783321ffd889496d9413749193bc" + integrity sha512-tDM0THdiwdboLfV6HYzLKKb544rVKnTzEZmEWm1e75dleaM3j4wqmG7HwS5cHnV9T5asM+/WupWMqcMpuNOTYw== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" + +"@theia/typehierarchy@1.37.0-next.22", "@theia/typehierarchy@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.37.0-next.22.tgz#0c82e8b611e8e0983096e04bdee4aeceb1b9f1c5" + integrity sha512-3FRVGOzcAvNUqQOHlowUUbPmpjzMN49f8jm2pXiRs90SUkY4dQvqnTJ5OKif5NAW4MAdh5YGagUOOW3/3ZiV6A== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/editor" "1.37.0-next.22+0e0e9ee4b" + "@types/uuid" "^7.0.3" + uuid "^8.0.0" + +"@theia/userstorage@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.37.0-next.22.tgz#0a0e5bfc7c5d124875ca6a1f5591c63d6c9d4e86" + integrity sha512-J4MXZG2BG8NAK97tLe1Hd4Jgq2f3ztspB+cn6UwThKe1HxA1zc7zd0eJft8rw365YVkdxNNqEQq2LpkjVI3dNQ== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + +"@theia/variable-resolver@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.37.0-next.22.tgz#5a2130943a6c49d01a5463a5429543a6e56f5e1e" + integrity sha512-8FrqRzeBUDQsvqlkSYC0zlbrQhUqD2soQu055wH0laL2CpcB9YSwLPki2EArIvSQ5Nv2chNLPEOyEHv5tyB7Zw== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + +"@theia/workspace@1.37.0-next.22", "@theia/workspace@1.37.0-next.22+0e0e9ee4b": + version "1.37.0-next.22" + resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.37.0-next.22.tgz#24c9729eeddcac5f23f09a410a274ca83b1335f5" + integrity sha512-FDgsI6sUyyD7JoDjJSyF8jYHSUyYjA888U9eItvRZD8025UNk0DsWp4gO89N4KI6wS2rmUH5WbvUjqtsRt4d8w== + dependencies: + "@theia/core" "1.37.0-next.22+0e0e9ee4b" + "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" + "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) jsonc-parser "^2.2.0" valid-filename "^2.0.1" @@ -2741,7 +3174,18 @@ "@types/node" "*" "@types/responselike" "^1.0.0" +<<<<<<< HEAD "@types/chai@^4.2.7": +======= +"@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": +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "4.3.4" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== @@ -2775,13 +3219,6 @@ 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== - 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" @@ -3010,11 +3447,6 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - "@types/multer@^1.4.7": version "1.4.7" resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.7.tgz#89cf03547c28c7bbcc726f029e2a76a7232cc79e" @@ -3055,7 +3487,7 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prop-types@*", "@types/prop-types@^15.0.0": +"@types/prop-types@*": 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== @@ -3199,7 +3631,7 @@ 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": +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== @@ -4322,10 +4754,10 @@ babel-plugin-polyfill-regenerator@^0.4.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== balanced-match@^1.0.0: version "1.0.2" @@ -4878,10 +5310,20 @@ change-case@^4.1.2: snake-case "^3.0.4" tslib "^2.0.3" -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== chardet@^0.7.0: version "0.7.0" @@ -5188,10 +5630,17 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +<<<<<<< HEAD comma-separated-tokens@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +======= +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) commander@^2.20.0, commander@^2.8.1: version "2.20.3" @@ -5511,6 +5960,20 @@ 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== +<<<<<<< HEAD +======= + 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" + +cp-file@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-9.1.0.tgz#e98e30db72d57d47b5b1d444deb70d05e5684921" + integrity sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -5518,6 +5981,7 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +<<<<<<< HEAD cp-file@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-10.0.0.tgz#bbae9ecb9f505951b862880d2901e1f56de7a4dc" @@ -5540,6 +6004,21 @@ cpy@^10.0.0: nested-error-stacks "^2.1.1" p-filter "^3.0.0" p-map "^6.0.0" +======= +cpy@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-9.0.1.tgz#7f3ad0ad5bafe0bc70645c4bb567969927cadb9f" + integrity sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg== + dependencies: + arrify "^3.0.0" + cp-file "^9.1.0" + globby "^13.1.1" + junk "^4.0.0" + micromatch "^4.0.4" + nested-error-stacks "^2.1.0" + p-filter "^3.0.0" + p-map "^5.3.0" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) create-frame@^1.0.0: version "1.0.0" @@ -5724,6 +6203,7 @@ 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== +<<<<<<< HEAD decimal.js@^10.4.3: version "10.4.3" @@ -5737,6 +6217,14 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" +======= + +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== + +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" @@ -5842,6 +6330,14 @@ deepmerge@*, 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== +<<<<<<< HEAD +======= + +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== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) default-compare@^1.0.0: version "1.0.0" @@ -5936,11 +6432,6 @@ deprecation@^2.0.0, deprecation@^2.3.1: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -dequal@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -5988,11 +6479,14 @@ 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== +<<<<<<< HEAD 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== +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dir-glob@^2.0.0: version "2.2.2" @@ -6187,10 +6681,17 @@ electron-updater@^4.6.5: lodash.isequal "^4.5.0" semver "^7.3.5" +<<<<<<< HEAD electron@^23.2.4: version "23.3.0" resolved "https://registry.yarnpkg.com/electron/-/electron-23.3.0.tgz#3e83e75d8bebe00764611c1d0c1bfa90cc197c7c" integrity sha512-DVAtptpOSxM7ycgriphSxzlkb3R92d28sFKG1hMtmPkAwHl/e87reaHXhGwyj8Xu4GY69e6yUoAJqma20w0Vgw== +======= +electron@^22.3.2: + version "22.3.6" + resolved "https://registry.yarnpkg.com/electron/-/electron-22.3.6.tgz#ab79a2da20e83b02ec9cbb22a4069468e6949b4f" + integrity sha512-/1/DivFHH5AWa/uOuqpkeg12/jjicjkBU8kYv70oeqRFwXzoyuJhgwlzER4jZXnbGjF5Nxz9900oXq/QzAViAw== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@electron/get" "^2.0.0" "@types/node" "^16.11.26" @@ -7697,7 +8198,11 @@ globby@11.1.0, globby@^11.0.1, globby@^11.0.3, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +<<<<<<< HEAD globby@^13.1.4: +======= +globby@^13.1.1: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "13.1.4" resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== @@ -7799,7 +8304,11 @@ graceful-fs@4.2.10: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +<<<<<<< HEAD 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.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: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -8019,11 +8528,14 @@ hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +<<<<<<< HEAD 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" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -8480,6 +8992,22 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +<<<<<<< HEAD +======= +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -8574,6 +9102,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -8657,6 +9190,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -8762,16 +9300,15 @@ 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== +<<<<<<< HEAD is-plain-obj@^2.1.0: +======= +is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -9164,7 +9701,11 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: array-includes "^3.1.5" object.assign "^4.1.3" +<<<<<<< HEAD junk@^4.0.1: +======= +junk@^4.0.0: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "4.0.1" resolved "https://registry.yarnpkg.com/junk/-/junk-4.0.1.tgz#7ee31f876388c05177fe36529ee714b07b50fbed" integrity sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ== @@ -9248,11 +9789,6 @@ kind-of@^6.0.0, 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== -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - lazy-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" @@ -9766,7 +10302,11 @@ macaddress@^0.2.9: resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.9.tgz#3579b8b9acd5b96b4553abf0f394185a86813cb3" integrity sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w== +<<<<<<< HEAD make-dir@3.1.0, make-dir@^3.0.2, make-dir@^3.1.0: +======= +make-dir@3.1.0, make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -9883,6 +10423,7 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" +<<<<<<< HEAD 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" @@ -9930,6 +10471,44 @@ mdast-util-to-string@^3.1.0: integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== dependencies: "@types/mdast" "^3.0.0" +======= +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-hast@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" + integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) mdurl@^1.0.1: version "1.0.1" @@ -9997,11 +10576,12 @@ methods@^1.1.2, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 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== +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== dependencies: +<<<<<<< HEAD decode-named-character-reference "^1.0.0" micromark-factory-destination "^1.0.0" micromark-factory-label "^1.0.0" @@ -10175,22 +10755,10 @@ micromark@^3.0.0: integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== dependencies: "@types/debug" "^4.0.0" +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" + parse-entities "^2.0.0" micromatch@^3.1.4: version "3.1.10" @@ -10574,11 +11142,14 @@ move-file@^2.0.0: integrity sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA== dependencies: path-exists "^4.0.0" +<<<<<<< HEAD mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) ms@2.0.0: version "2.0.0" @@ -11580,18 +12151,25 @@ p-map@4.0.0, p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +<<<<<<< HEAD p-map@^5.1.0: +======= +p-map@^5.1.0, p-map@^5.3.0: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" +<<<<<<< HEAD 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== +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) p-pipe@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" @@ -11637,7 +12215,11 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +<<<<<<< HEAD p-timeout@^5.0.2, p-timeout@^5.1.0: +======= +p-timeout@^5.1.0: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -11734,6 +12316,18 @@ parse-conflict-json@^3.0.0: just-diff "^6.0.0" just-diff-apply "^5.2.0" +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -12165,7 +12759,11 @@ promzard@^0.3.0: dependencies: read "1" +<<<<<<< HEAD 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: +======= +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: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -12174,10 +12772,19 @@ prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.6, prop-types@^15.6.0, object-assign "^4.1.1" react-is "^16.13.1" +<<<<<<< HEAD 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== +======= +property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) proto-list@~1.2.1: version "1.2.4" @@ -12451,31 +13058,34 @@ react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.0: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + 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== -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== +react-markdown@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-6.0.3.tgz#625ec767fa321d91801129387e7d31ee0cb99254" + integrity sha512-kQbpWiMoBHnj9myLlmZG9T1JdoT/OEyHK7hqM6CqFT14MAkgWiWBUYijLyBmxbntaN6dCDicPcUhWhci1QYodg== dependencies: "@types/hast" "^2.0.0" - "@types/prop-types" "^15.0.0" - "@types/unist" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-whitespace "^2.0.0" - prop-types "^15.0.0" - property-information "^6.0.0" - react-is "^18.0.0" - remark-parse "^10.0.0" - remark-rehype "^10.0.0" - space-separated-tokens "^2.0.0" + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + prop-types "^15.7.2" + property-information "^5.3.0" + react-is "^17.0.0" + remark-parse "^9.0.0" + remark-rehype "^8.0.0" + space-separated-tokens "^1.1.0" style-to-object "^0.3.0" - unified "^10.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" + unified "^9.0.0" + unist-util-visit "^2.0.0" + vfile "^4.0.0" react-perfect-scrollbar@^1.5.3, react-perfect-scrollbar@^1.5.8: version "1.5.8" @@ -12798,24 +13408,19 @@ relative@^3.0.2: dependencies: 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== +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" + mdast-util-from-markdown "^0.8.0" -remark-rehype@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" - integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== +remark-rehype@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" + integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^12.1.0" - unified "^10.0.0" + mdast-util-to-hast "^10.2.0" remarkable@^1.6.2, remarkable@^1.7.1: version "1.7.4" @@ -13037,9 +13642,23 @@ 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== +<<<<<<< HEAD +======= dependencies: tslib "^2.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== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +<<<<<<< HEAD sade@^1.7.3: version "1.8.1" resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" @@ -13057,6 +13676,8 @@ safe-array-concat@^1.0.0: has-symbols "^1.0.3" isarray "^2.0.5" +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" @@ -13596,10 +14217,17 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +<<<<<<< HEAD space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== +======= +space-separated-tokens@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) spdx-correct@^3.0.0: version "3.2.0" @@ -14327,11 +14955,14 @@ 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== +<<<<<<< HEAD trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) trim-newlines@^3.0.0: version "3.0.1" @@ -14345,10 +14976,10 @@ trim-repeated@^1.0.0: dependencies: escape-string-regexp "^1.0.2" -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== +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== ts-md5@^1.2.2: version "1.3.1" @@ -14564,18 +15195,17 @@ unicode-property-aliases-ecmascript@^2.0.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" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== +unified@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" + bail "^1.0.0" extend "^3.0.0" is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" union-value@^1.0.0: version "1.0.1" @@ -14612,6 +15242,7 @@ 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== +<<<<<<< HEAD dependencies: imurmurhash "^0.1.4" @@ -14631,16 +15262,26 @@ unist-util-is@^5.0.0: 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== +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: - "@types/unist" "^2.0.0" + imurmurhash "^0.1.4" +<<<<<<< HEAD unist-util-position@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== +======= +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== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: - "@types/unist" "^2.0.0" + crypto-random-string "^2.0.0" +<<<<<<< HEAD unist-util-stringify-position@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" @@ -14664,6 +15305,51 @@ unist-util-visit@^4.0.0: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" unist-util-visit-parents "^5.1.1" +======= +unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) universal-user-agent@^6.0.0: version "6.0.0" @@ -14851,6 +15537,7 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== +<<<<<<< HEAD uvu@^0.5.0: version "0.5.6" resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" @@ -14861,6 +15548,8 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" +======= +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" @@ -14912,23 +15601,37 @@ 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== +<<<<<<< HEAD vfile-message@^3.0.0: version "3.1.4" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== +======= +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" + unist-util-stringify-position "^2.0.0" +<<<<<<< HEAD vfile@^5.0.0: version "5.3.7" resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== +======= +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" vhost@^3.0.2: version "3.0.2" @@ -15176,7 +15879,11 @@ which-typed-array@^1.1.2, which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" +<<<<<<< HEAD which@1.3.1, which@^1.2.9: +======= +which@1.3.1, which@^1.2.9, which@^1.3.1: +>>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== From 11d5afa17b17692687cf6456f8a10a84dad9aad1 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 25 Nov 2022 18:48:19 +0100 Subject: [PATCH 02/29] feat: use a monaco editor for the monitor output Closes #105 Signed-off-by: Akos Kitta --- .../browser/arduino-ide-frontend-module.ts | 28 +- .../monitor/monitor-context-menu-service.ts | 16 + .../serial/monitor/monitor-editor-factory.ts | 46 ++ .../monitor/monitor-editor-model-factory.ts | 8 + .../monitor/monitor-resource-provider.ts | 32 ++ .../serial/monitor/monitor-resource.ts | 15 + .../src/browser/serial/monitor/monitor-uri.ts | 3 + .../monitor/monitor-view-contribution.tsx | 66 ++- .../browser/serial/monitor/monitor-widget.tsx | 402 +++++++++++++----- .../src/browser/style/monitor.css | 11 + .../theia/monaco/monaco-text-model-service.ts | 43 +- 11 files changed, 552 insertions(+), 118 deletions(-) create mode 100644 arduino-ide-extension/src/browser/serial/monitor/monitor-context-menu-service.ts create mode 100644 arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts create mode 100644 arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts create mode 100644 arduino-ide-extension/src/browser/serial/monitor/monitor-resource-provider.ts create mode 100644 arduino-ide-extension/src/browser/serial/monitor/monitor-resource.ts create mode 100644 arduino-ide-extension/src/browser/serial/monitor/monitor-uri.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 89d13fd93..94c469dc1 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -159,7 +159,10 @@ import { MonitorManagerProxyFactory, MonitorManagerProxyPath, } from '../common/protocol'; -import { MonacoTextModelService as TheiaMonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service'; +import { + MonacoEditorModelFactory, + MonacoTextModelService as TheiaMonacoTextModelService, +} from '@theia/monaco/lib/browser/monaco-text-model-service'; import { MonacoTextModelService } from './theia/monaco/monaco-text-model-service'; import { ResponseServiceImpl } from './response-service-impl'; import { @@ -253,7 +256,7 @@ import { UserFieldsDialog, UserFieldsDialogProps, } from './dialogs/user-fields/user-fields-dialog'; -import { nls } from '@theia/core/lib/common'; +import { nls, ResourceResolver } from '@theia/core/lib/common'; import { IDEUpdaterCommands } from './ide-updater/ide-updater-commands'; import { IDEUpdater, @@ -317,6 +320,7 @@ import { } from './widgets/component-list/filter-renderer'; import { CheckForUpdates } from './contributions/check-for-updates'; import { OutputEditorFactory } from './theia/output/output-editor-factory'; +import { OutputEditorFactory as TheiaOutputEditorFactory } from '@theia/output/lib/browser/output-editor-factory'; import { StartupTaskProvider } from '../electron-common/startup-task'; import { DeleteSketch } from './contributions/delete-sketch'; import { UserFields } from './contributions/user-fields'; @@ -354,6 +358,10 @@ 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 { MonitorResourceProvider } from './serial/monitor/monitor-resource-provider'; +import { MonitorEditorFactory } from './serial/monitor/monitor-editor-factory'; +import { MonitorEditorModelFactory } from './serial/monitor/monitor-editor-model-factory'; +import { MonitorContextMenuService } from './serial/monitor/monitor-context-menu-service'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -501,9 +509,9 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(MonitorModel).toSelf().inSingletonScope(); bindViewContribution(bind, MonitorViewContribution); bind(TabBarToolbarContribution).toService(MonitorViewContribution); - bind(WidgetFactory).toDynamicValue((context) => ({ + bind(WidgetFactory).toDynamicValue(({ container }) => ({ id: MonitorWidget.ID, - createWidget: () => context.container.get(MonitorWidget), + createWidget: () => container.get(MonitorWidget), })); bind(MonitorManagerProxyFactory).toFactory( @@ -527,6 +535,15 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { .to(MonitorManagerProxyClientImpl) .inSingletonScope(); + bind(MonitorResourceProvider).toSelf().inSingletonScope(); + bind(ResourceResolver).toService(MonitorResourceProvider); + bind(MonitorEditorFactory).toSelf().inSingletonScope(); + bind(MonacoEditorFactory).toService(MonitorEditorFactory); + bind(MonacoEditorModelFactory) + .to(MonitorEditorModelFactory) + .inSingletonScope(); + bind(MonitorContextMenuService).toSelf().inSingletonScope(); + bind(WorkspaceService).toSelf().inSingletonScope(); rebind(TheiaWorkspaceService).toService(WorkspaceService); bind(WorkspaceVariableContribution).toSelf().inSingletonScope(); @@ -639,8 +656,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // To disable the highlighting of non-unicode characters in the _Output_ view bind(OutputEditorFactory).toSelf().inSingletonScope(); - // Rebind to `TheiaOutputEditorFactory` when https://github.com/eclipse-theia/theia/pull/11615 is available. - rebind(MonacoEditorFactory).toService(OutputEditorFactory); + rebind(TheiaOutputEditorFactory).toService(OutputEditorFactory); bind(ArduinoDaemon) .toDynamicValue((context) => diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-context-menu-service.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-context-menu-service.ts new file mode 100644 index 000000000..387c12fb0 --- /dev/null +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-context-menu-service.ts @@ -0,0 +1,16 @@ +import type { MenuPath } from '@theia/core/lib/common/menu'; +import { injectable } from '@theia/core/shared/inversify'; +import { MonacoContextMenuService } from '@theia/monaco/lib/browser/monaco-context-menu'; + +export namespace MonitorContextMenu { + export const MENU_PATH: MenuPath = ['monitor_context_menu']; + export const TEXT_EDIT_GROUP = [...MENU_PATH, '0_text_edit_group']; + export const WIDGET_GROUP = [...MENU_PATH, '1_widget_group']; +} + +@injectable() +export class MonitorContextMenuService extends MonacoContextMenuService { + protected override menuPath(): MenuPath { + return MonitorContextMenu.MENU_PATH; + } +} diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts new file mode 100644 index 000000000..ef055bc00 --- /dev/null +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts @@ -0,0 +1,46 @@ +import { inject, injectable } from '@theia/core/shared/inversify'; +import { IContextMenuService } from '@theia/monaco-editor-core/esm/vs/platform/contextview/browser/contextView'; +import { MonacoContextMenuService } from '@theia/monaco/lib/browser/monaco-context-menu'; +import { + EditorServiceOverrides, + MonacoEditor, +} from '@theia/monaco/lib/browser/monaco-editor'; +import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; +import { OutputEditorFactory } from '../../theia/output/output-editor-factory'; +import { MonitorContextMenuService } from './monitor-context-menu-service'; +import { MonitorUri } from './monitor-uri'; + +@injectable() +export class MonitorEditorFactory extends OutputEditorFactory { + @inject(MonitorContextMenuService) + private readonly monitorContextMenuService: MonacoContextMenuService; + + override readonly scheme: string = MonitorUri.scheme; + + protected override createOptions( + model: MonacoEditorModel, + defaultOptions: MonacoEditor.IOptions + ): MonacoEditor.IOptions { + return { + ...super.createOptions(model, defaultOptions), + // To hide the margin in the editor https://github.com/microsoft/monaco-editor/issues/1960 + lineNumbers: 'off', + glyphMargin: false, + folding: false, + lineDecorationsWidth: 0, + lineNumbersMinChars: 0, + }; + } + + protected override *createOverrides( + model: MonacoEditorModel, + defaultOverrides: EditorServiceOverrides + ): EditorServiceOverrides { + yield [IContextMenuService, this.monitorContextMenuService]; + for (const [identifier, provider] of defaultOverrides) { + if (identifier !== IContextMenuService) { + yield [identifier, provider]; + } + } + } +} diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts new file mode 100644 index 000000000..0f6ef2ab4 --- /dev/null +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts @@ -0,0 +1,8 @@ +import { injectable } from '@theia/core/shared/inversify'; +import { OutputEditorModelFactory } from '@theia/output/lib/browser/output-editor-model-factory'; +import { MonitorUri } from './monitor-uri'; + +@injectable() +export class MonitorEditorModelFactory extends OutputEditorModelFactory { + override readonly scheme: string = MonitorUri.scheme; +} diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-resource-provider.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-resource-provider.ts new file mode 100644 index 000000000..93e856c19 --- /dev/null +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-resource-provider.ts @@ -0,0 +1,32 @@ +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { Resource, ResourceResolver } from '@theia/core/lib/common/resource'; +import URI from '@theia/core/lib/common/uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { IReference } from '@theia/monaco-editor-core/esm/vs/base/common/lifecycle'; +import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; +import { MonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service'; +import { MonitorResource } from './monitor-resource'; +import { MonitorUri } from './monitor-uri'; + +@injectable() +export class MonitorResourceProvider implements ResourceResolver { + readonly resource: MonitorResource; + + constructor( + @inject(MonacoTextModelService) textModelService: MonacoTextModelService + ) { + const editorModelRef = new Deferred>(); + this.resource = new MonitorResource(MonitorUri, editorModelRef); + textModelService + .createModelReference(MonitorUri) + .then((ref) => editorModelRef.resolve(ref)); + } + + async resolve(uri: URI): Promise { + if (this.resource.uri.toString() === uri.toString()) { + return this.resource; + } + // Note: this is totally normal. This is the way Theia loads a resource. + throw new Error(`Cannot handle URI: ${uri.toString()}`); + } +} diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-resource.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-resource.ts new file mode 100644 index 000000000..c0afb7b99 --- /dev/null +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-resource.ts @@ -0,0 +1,15 @@ +import type { ResourceReadOptions } from '@theia/core/lib/common/resource'; +import { OutputResource } from '@theia/output/lib/browser/output-resource'; + +export class MonitorResource extends OutputResource { + override async readContents(options?: ResourceReadOptions): Promise { + if (!this._textModel) { + return ''; + } + return super.readContents(options); + } + + async reset(): Promise { + this.textModel?.setValue(''); + } +} diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-uri.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-uri.ts new file mode 100644 index 000000000..83bed2374 --- /dev/null +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-uri.ts @@ -0,0 +1,3 @@ +import URI from '@theia/core/lib/common/uri'; + +export const MonitorUri = new URI('monitor:/arduino'); 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..38fb6098c 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,11 @@ 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 { + AbstractViewContribution, + codicon, + CommonCommands, + Widget, +} from '@theia/core/lib/browser'; import { MonitorWidget } from './monitor-widget'; import { MenuModelRegistry, Command, CommandRegistry } from '@theia/core'; import { @@ -13,6 +18,8 @@ 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 { MonitorContextMenu } from './monitor-context-menu-service'; +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; export namespace SerialMonitor { export namespace Commands { @@ -37,7 +44,10 @@ export namespace SerialMonitor { iconClass: codicon('clear-all'), }, 'vscode/output.contribution/clearOutput.label' - ); + ) as Command & { label: string }; + export const COPY_ALL: Command = { + id: 'serial-monitor-copy-all', + }; } } @@ -51,6 +61,9 @@ export class MonitorViewContribution MonitorWidget.ID + ':toggle-toolbar'; static readonly RESET_SERIAL_MONITOR = MonitorWidget.ID + ':reset'; + @inject(ClipboardService) + private readonly clipboardService: ClipboardService; + constructor( @inject(MonitorModel) protected readonly model: MonitorModel, @@ -78,6 +91,17 @@ export class MonitorViewContribution order: '5', }); } + menus.registerMenuAction(MonitorContextMenu.TEXT_EDIT_GROUP, { + commandId: CommonCommands.COPY.id, + }); + menus.registerMenuAction(MonitorContextMenu.TEXT_EDIT_GROUP, { + commandId: SerialMonitor.Commands.COPY_ALL.id, + label: nls.localizeByDefault('Copy All'), + }); + menus.registerMenuAction(MonitorContextMenu.WIDGET_GROUP, { + commandId: SerialMonitor.Commands.CLEAR_OUTPUT.id, + label: nls.localizeByDefault('Clear Output'), + }); } registerToolbarItems(registry: TabBarToolbarRegistry): void { @@ -105,12 +129,25 @@ export class MonitorViewContribution override registerCommands(commands: CommandRegistry): void { commands.registerCommand(SerialMonitor.Commands.CLEAR_OUTPUT, { - isEnabled: (widget) => widget instanceof MonitorWidget, - isVisible: (widget) => widget instanceof MonitorWidget, - execute: (widget) => { - if (widget instanceof MonitorWidget) { - widget.clearConsole(); + isEnabled: (arg) => { + if (arg instanceof Widget) { + return arg instanceof MonitorWidget; } + return this.shell.currentWidget instanceof MonitorWidget; + }, + isVisible: (arg) => { + if (arg instanceof Widget) { + return arg instanceof MonitorWidget; + } + return this.shell.currentWidget instanceof MonitorWidget; + }, + execute: () => { + this.widget.then((widget) => { + this.withWidget(widget, (output) => { + output.clearConsole(); + return true; + }); + }); }, }); if (this.toggleCommand) { @@ -130,6 +167,14 @@ export class MonitorViewContribution { id: MonitorViewContribution.RESET_SERIAL_MONITOR }, { execute: () => this.reset() } ); + commands.registerCommand(SerialMonitor.Commands.COPY_ALL, { + execute: () => { + const text = this.tryGetWidget()?.text; + if (text) { + this.clipboardService.writeText(text); + } + }, + }); } protected async toggle(): Promise { @@ -191,4 +236,11 @@ export class MonitorViewContribution protected async doToggleTimestamp(): Promise { this.model.toggleTimestamp(); } + + private withWidget( + widget: Widget | undefined = this.tryGetWidget(), + predicate: (monitorWidget: MonitorWidget) => boolean = () => true + ): boolean | false { + return widget instanceof MonitorWidget ? predicate(widget) : false; + } } 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..f3987dc76 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -1,55 +1,64 @@ -import * as React from '@theia/core/shared/react'; -import { - injectable, - inject, - postConstruct, -} from '@theia/core/shared/inversify'; -import { Emitter } from '@theia/core/lib/common/event'; +import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { BaseWidget, Widget } from '@theia/core/lib/browser/widgets/widget'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; +import { nls } from '@theia/core/lib/common/nls'; +import { SelectionService } from '@theia/core/lib/common/selection-service'; +import { toArray } from '@theia/core/shared/@phosphor/algorithm'; +import { Message, MessageLoop } from '@theia/core/shared/@phosphor/messaging'; +import { DockPanel } from '@theia/core/shared/@phosphor/widgets'; import { - ReactWidget, - Message, - Widget, - MessageLoop, -} from '@theia/core/lib/browser/widgets'; -import { ArduinoSelect } from '../../widgets/arduino-select'; -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'; + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import * as React from '@theia/core/shared/react'; +import * as ReactDOM from '@theia/core/shared/react-dom'; +import { EditorWidget } from '@theia/editor/lib/browser'; +import * as monaco from '@theia/monaco-editor-core'; +import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; +import { MonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider'; +import PQueue from 'p-queue'; import { MonitorEOL, MonitorManagerProxyClient, MonitorSettings, } from '../../../common/protocol'; +import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { ArduinoSelect } from '../../widgets/arduino-select'; +import { MonitorResourceProvider } from './monitor-resource-provider'; +import { SerialMonitorSendInput } from './serial-monitor-send-input'; +import { SerialMonitorOutput } from './serial-monitor-send-output'; @injectable() -export class MonitorWidget extends ReactWidget { +export class MonitorWidget extends BaseWidget { + static readonly ID = 'serial-monitor'; static readonly LABEL = nls.localize( 'arduino/common/serialMonitor', 'Serial Monitor' ); - static readonly ID = 'serial-monitor'; - - protected settings: MonitorSettings = {}; - - protected widgetHeight: number; + private settings: MonitorSettings = {}; + private widgetHeight: number; /** * 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; /** * Guard against re-rendering the view after the close was requested. * See: https://github.com/eclipse-theia/theia/issues/6704 */ - protected closing = false; - protected readonly clearOutputEmitter = new Emitter(); + private readonly contentNode: HTMLDivElement; + private readonly headerNode: HTMLDivElement; + private readonly editorContainer: DockPanel; + private closing = false; + protected readonly appendContentQueue = new PQueue({ + autoStart: true, + concurrency: 1, + }); @inject(MonitorModel) private readonly monitorModel: MonitorModel; @@ -62,6 +71,13 @@ export class MonitorWidget extends ReactWidget { private readonly toDisposeOnReset: DisposableCollection; + @inject(SelectionService) + private readonly selectionService: SelectionService; + @inject(MonacoEditorProvider) + private readonly editorProvider: MonacoEditorProvider; + @inject(MonitorResourceProvider) + private readonly resourceProvider: MonitorResourceProvider; + constructor() { super(); this.id = MonitorWidget.ID; @@ -70,7 +86,31 @@ export class MonitorWidget extends ReactWidget { this.title.closable = true; this.scrollOptions = undefined; this.toDisposeOnReset = new DisposableCollection(); - this.toDispose.push(this.clearOutputEmitter); + this.toDispose.push( + Disposable.create(() => this.monitorManagerProxy.disconnect()) + ); + + this.contentNode = document.createElement('div'); + this.contentNode.classList.add('content'); + this.headerNode = document.createElement('div'); + this.headerNode.classList.add('header'); + this.contentNode.appendChild(this.headerNode); + this.node.appendChild(this.contentNode); + + this.editorContainer = new NoopDragOverDockPanel({ + spacing: 0, + mode: 'single-document', + }); + this.editorContainer.addClass('editor-container'); + this.editorContainer.node.tabIndex = -1; + + this.toDispose.pushAll([ + Disposable.create(() => this.monitorManagerProxy.disconnect()), + Disposable.create(() => { + this.appendContentQueue.pause(); + this.appendContentQueue.clear(); + }), + ]); } @postConstruct() @@ -83,6 +123,25 @@ export class MonitorWidget extends ReactWidget { this.updateSettings(event) ), ]); + this.toDispose.pushAll([ + this.monitorModel.onChange(async ({ property }) => { + if (property === 'connected') { + const { connectionStatus } = this.monitorModel; + if (connectionStatus === 'not-connected') { + await this.clearConsole(); + } + } + this.update(); + }), + this.monitorManagerProxy.onMonitorSettingsDidChange((settings) => + this.updateSettings(settings) + ), + this.monitorManagerProxy.onMessagesReceived(({ messages }) => { + messages.forEach((message) => this.appendContent({ message })); + }), + ]); + this.getCurrentSettings().then((settings) => this.updateSettings(settings)); + this.monitorManagerProxy.startMonitor(); this.startMonitor(); } @@ -90,49 +149,72 @@ export class MonitorWidget extends ReactWidget { this.init(); } - private updateSettings(settings: MonitorSettings): void { - this.settings = { - ...this.settings, - pluggableMonitorSettings: { - ...this.settings.pluggableMonitorSettings, - ...settings.pluggableMonitorSettings, - }, - }; - this.update(); - } - - clearConsole(): void { - this.clearOutputEmitter.fire(undefined); - this.update(); + async clearConsole(): Promise { + return this.resourceProvider.resource.reset(); } - override dispose(): void { - this.toDisposeOnReset.dispose(); - super.dispose(); + get text(): string | undefined { + return this.editor?.getControl().getModel()?.getValue(); } - protected override onCloseRequest(msg: Message): void { - this.closing = true; - super.onCloseRequest(msg); + protected override onAfterAttach(message: Message): void { + super.onAfterAttach(message); + ReactDOM.render( + {this.renderHeader()}, + this.headerNode + ); + Widget.attach(this.editorContainer, this.contentNode); + this.toDisposeOnDetach.push( + Disposable.create(() => Widget.detach(this.editorContainer)) + ); } - protected override onUpdateRequest(msg: Message): void { + protected override onUpdateRequest(message: Message): void { // TODO: `this.isAttached` // See: https://github.com/eclipse-theia/theia/issues/6704#issuecomment-562574713 if (!this.closing && this.isAttached) { - super.onUpdateRequest(msg); + super.onUpdateRequest(message); } } - protected override onResize(msg: Widget.ResizeMessage): void { - super.onResize(msg); - this.widgetHeight = msg.height; + protected override onActivateRequest(message: Message): void { + super.onActivateRequest(message); + (this.focusNode || this.node).focus(); + } + + protected override onCloseRequest(message: Message): void { + this.closing = true; + super.onCloseRequest(message); + } + + protected override onResize(message: Widget.ResizeMessage): void { + super.onResize(message); + MessageLoop.sendMessage( + this.editorContainer, + Widget.ResizeMessage.UnknownSize + ); + for (const widget of toArray(this.editorContainer.widgets())) { + MessageLoop.sendMessage(widget, Widget.ResizeMessage.UnknownSize); + } + this.widgetHeight = message.height; this.update(); + this.refreshEditorWidget(); } - protected override onActivateRequest(msg: Message): void { - super.onActivateRequest(msg); - (this.focusNode || this.node).focus(); + private updateSettings(settings: MonitorSettings): void { + this.settings = { + ...this.settings, + pluggableMonitorSettings: { + ...this.settings.pluggableMonitorSettings, + ...settings.pluggableMonitorSettings, + }, + }; + this.update(); + } + + override dispose(): void { + this.toDisposeOnReset.dispose(); + super.dispose(); } protected override onAfterShow(msg: Message): void { @@ -140,16 +222,6 @@ export class MonitorWidget extends ReactWidget { this.update(); } - protected onFocusResolved = (element: HTMLElement | undefined): void => { - if (this.closing || !this.isAttached) { - return; - } - this.focusNode = element; - requestAnimationFrame(() => - MessageLoop.sendMessage(this, Widget.Msg.ActivateRequest) - ); - }; - protected get lineEndings(): SerialMonitorOutput.SelectOption[] { return [ { @@ -190,28 +262,25 @@ export class MonitorWidget extends ReactWidget { const board = this.boardsServiceProvider.boardsConfig.selectedBoard; const port = this.boardsServiceProvider.boardsConfig.selectedPort; if (!board || !port) { - return this.settings || {}; + return this.settings ?? {}; } return this.monitorManagerProxy.getCurrentSettings(board, port); } - protected render(): React.ReactNode { + private renderHeader(): React.ReactNode { const baudrate = this.settings?.pluggableMonitorSettings ? this.settings.pluggableMonitorSettings.baudrate : undefined; - - const baudrateOptions = baudrate?.values.map((b) => ({ - label: nls.localize('arduino/monitor/baudRate', '{0} baud', b), - value: b, + const baudrateOptions = baudrate?.values.map((value) => ({ + label: `${value} baud`, + value, })); - const baudrateSelectedOption = baudrateOptions?.find( - (b) => b.value === baudrate?.selectedValue + const selectedBaudrateOption = baudrateOptions?.find( + (baud) => baud.value === baudrate?.selectedValue ); - const lineEnding = - this.lineEndings.find( - (item) => item.value === this.monitorModel.lineEnding - ) || MonitorEOL.DEFAULT; + lineEndings.find((item) => item.value === this.monitorModel.lineEnding) ?? + defaultLineEnding; return (
@@ -228,58 +297,193 @@ export class MonitorWidget extends ReactWidget {
- {baudrateOptions && baudrateSelectedOption && ( + {baudrateOptions && selectedBaudrateOption && (
)}
-
- -
); } - protected readonly onSend = (value: string): void => this.doSend(value); - protected doSend(value: string): void { + private readonly onFocusResolved = ( + element: HTMLElement | undefined + ): void => { + if (this.closing || !this.isAttached) { + return; + } + this.focusNode = element; + requestAnimationFrame(() => + MessageLoop.sendMessage(this, Widget.Msg.ActivateRequest) + ); + }; + + private readonly onSend = (value: string): void => this.monitorManagerProxy.send(value); - } - protected readonly onChangeLineEnding = ( + private readonly onChangeLineEnding = ( option: SerialMonitorOutput.SelectOption ): void => { this.monitorModel.lineEnding = option.value; }; - protected readonly onChangeBaudRate = ({ - value, - }: { - value: string; - }): void => { + private readonly onChangeBaudRate = ({ value }: { value: string }): void => { this.getCurrentSettings().then(({ pluggableMonitorSettings }) => { - if (!pluggableMonitorSettings || !pluggableMonitorSettings['baudrate']) + if (!pluggableMonitorSettings || !pluggableMonitorSettings['baudrate']) { return; + } const baudRateSettings = pluggableMonitorSettings['baudrate']; baudRateSettings.selectedValue = value; this.monitorManagerProxy.changeSettings({ pluggableMonitorSettings }); }); }; + + private async refreshEditorWidget( + { preserveFocus }: { preserveFocus: boolean } = { preserveFocus: false } + ): Promise { + const editorWidget = this.editorWidget; + if (editorWidget) { + if (!preserveFocus) { + this.activate(); + return; + } + } + const widget = await this.createEditorWidget(); + this.editorContainer.addWidget(widget); + this.toDispose.pushAll([ + Disposable.create(() => widget.close()), + this.resourceProvider.resource.onDidChangeContents(() => + this.revealLastLine() + ), + ]); + if (!preserveFocus) { + this.activate(); + } + this.revealLastLine(); + } + + private revealLastLine(): void { + if (this.isLocked) { + return; + } + const editor = this.editor; + if (editor) { + const model = editor.getControl().getModel(); + if (model) { + const lineNumber = model.getLineCount(); + const column = model.getLineMaxColumn(lineNumber); + editor + .getControl() + .revealPosition( + { lineNumber, column }, + monaco.editor.ScrollType.Smooth + ); + } + } + } + + private get isLocked(): boolean { + return !this.monitorModel.autoscroll; + } + + private async createEditorWidget(): Promise { + const editor = await this.editorProvider.get( + this.resourceProvider.resource.uri + ); + return new EditorWidget(editor, this.selectionService); + } + + private get editorWidget(): EditorWidget | undefined { + for (const widget of toArray(this.editorContainer.children())) { + if (widget instanceof EditorWidget) { + return widget; + } + } + return undefined; + } + + private get editor(): MonacoEditor | undefined { + const widget = this.editorWidget; + if (widget instanceof EditorWidget) { + if (widget.editor instanceof MonacoEditor) { + return widget.editor; + } + } + return undefined; + } + + private async appendContent({ message }: { message: string }): Promise { + return this.appendContentQueue.add(async () => { + const textModel = ( + await this.resourceProvider.resource.editorModelRef.promise + ).object.textEditorModel; + const lastLine = textModel.getLineCount(); + const lastLineMaxColumn = textModel.getLineMaxColumn(lastLine); + const position = new monaco.Position(lastLine, lastLineMaxColumn); + const range = new monaco.Range( + position.lineNumber, + position.column, + position.lineNumber, + position.column + ); + const edits = [ + { + range, + text: message, + forceMoveMarkers: true, + }, + ]; + // We do not use `pushEditOperations` as we do not need undo/redo support. VS Code uses `applyEdits` too. + // https://github.com/microsoft/vscode/blob/dc348340fd1a6c583cb63a1e7e6b4fd657e01e01/src/vs/workbench/services/output/common/outputChannelModel.ts#L108-L115 + textModel.applyEdits(edits); + }); + } } + +const defaultLineEnding: SerialMonitorOutput.SelectOption = { + label: nls.localize('arduino/serial/newLine', 'New Line'), + value: '\n', +}; +const lineEndings: SerialMonitorOutput.SelectOption[] = [ + { + label: nls.localize('arduino/serial/noLineEndings', 'No Line Ending'), + value: '', + }, + defaultLineEnding, + { + label: nls.localize('arduino/serial/carriageReturn', 'Carriage Return'), + value: '\r', + }, + { + label: nls.localize('arduino/serial/newLineCarriageReturn', 'Both NL & CR'), + value: '\r\n', + }, +]; + +/** + * Customized `DockPanel` that does not allow dropping widgets into it. + * Intercepts `'p-dragover'` events, and sets the desired drop action to `'none'`. + */ +class NoopDragOverDockPanel extends DockPanel {} +NoopDragOverDockPanel.prototype['_evtDragOver'] = () => { + /* NOOP */ +}; +NoopDragOverDockPanel.prototype['_evtDrop'] = () => { + /* NOOP */ +}; +NoopDragOverDockPanel.prototype['_evtDragLeave'] = () => { + /* NOOP */ +}; diff --git a/arduino-ide-extension/src/browser/style/monitor.css b/arduino-ide-extension/src/browser/style/monitor.css index 6787ea4cb..575837b00 100644 --- a/arduino-ide-extension/src/browser/style/monitor.css +++ b/arduino-ide-extension/src/browser/style/monitor.css @@ -93,3 +93,14 @@ .p-TabBar-toolbar .item .clear-all { background: var(--theia-icon-clear) no-repeat; } + +#serial-monitor .content { + display: flex; + flex-direction: column; + height: 100%; +} + +#serial-monitor .editor-container { + height: 100%; + margin: 0px 5px; +} 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..8f77343bc 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 @@ -1,18 +1,48 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; -import { Resource } from '@theia/core/lib/common/resource'; -import { ILogger, Log, Loggable } from '@theia/core/lib/common/logger'; +import type { ILogger, Log, Loggable } from '@theia/core/lib/common/logger'; +import { OS } from '@theia/core/lib/common/os'; +import type { Resource } from '@theia/core/lib/common/resource'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { URI as CodeURI } from '@theia/core/shared/vscode-uri'; +import type { EditorPreferences } from '@theia/editor/lib/browser/editor-preferences'; +import { ITextResourcePropertiesService } from '@theia/monaco-editor-core/esm/vs/editor/common/services/textResourceConfiguration'; +import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; -import { EditorPreferences } from '@theia/editor/lib/browser/editor-preferences'; -import { MonacoToProtocolConverter } from '@theia/monaco/lib/browser/monaco-to-protocol-converter'; -import { ProtocolToMonacoConverter } from '@theia/monaco/lib/browser/protocol-to-monaco-converter'; import { MonacoTextModelService as TheiaMonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service'; import { SketchesServiceClientImpl } from '../../sketches-service-client-impl'; +import type { MonacoToProtocolConverter } from '@theia/monaco/lib/browser/monaco-to-protocol-converter'; +import type { ProtocolToMonacoConverter } from '@theia/monaco/lib/browser/protocol-to-monaco-converter'; +import { MonitorUri } from '../../serial/monitor/monitor-uri'; @injectable() export class MonacoTextModelService extends TheiaMonacoTextModelService { @inject(SketchesServiceClientImpl) protected readonly sketchesServiceClient: SketchesServiceClientImpl; + @postConstruct() + override init(): void { + const resourcePropertiesService = StandaloneServices.get( + ITextResourcePropertiesService + ); + if (resourcePropertiesService) { + resourcePropertiesService.getEOL = (resource: CodeURI) => { + if (MonitorUri.toString() === resource.toString()) { + // The CLI seems to send `\r\n` through the monitor when calling `Serial.println` from `ino` code. + // See: https://github.com/arduino/arduino-ide/issues/391#issuecomment-850622814 + return '\r\n'; + } + const eol = this.editorPreferences['files.eol']; + if (eol && eol !== 'auto') { + return eol; + } + return OS.backend.isWindows ? '\r\n' : '\n'; + }; + } + } + protected override async createModel( resource: Resource ): Promise { @@ -75,6 +105,7 @@ class MaybeReadonlyMonacoEditorModel extends SilentMonacoEditorModel { } this._dirty = dirty; if (dirty === false) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any (this as any).updateSavedVersionId(); } this.onDirtyChangedEmitter.fire(undefined); From 206c1a415340dca57128c4eb4a8e026307a0ba97 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 25 Nov 2022 21:23:37 +0100 Subject: [PATCH 03/29] chore: remove react-window first naive impl with `setValue` Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 3 +- .../browser/serial/monitor/monitor-utils.ts | 35 ++++- .../browser/serial/monitor/monitor-widget.tsx | 48 +++--- .../monitor/serial-monitor-send-output.tsx | 148 ------------------ .../src/browser/style/monitor.css | 9 -- .../src/test/browser/monitor-utils.test.ts | 54 +++---- yarn.lock | 23 +-- 7 files changed, 84 insertions(+), 236 deletions(-) delete mode 100644 arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index c6f1a76a1..bacdab7d6 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -98,7 +98,7 @@ "react-perfect-scrollbar": "^1.5.8", "react-select": "^5.6.0", "react-tabs": "^3.1.2", - "react-window": "^1.8.6", + "react-virtualized": "^9.22.3", "semver": "^7.3.2", "string-natural-compare": "^2.0.3", "temp": "^0.9.1", @@ -110,7 +110,6 @@ "@octokit/rest": "^18.12.0", "@types/chai": "^4.2.7", "@types/mocha": "^5.2.7", - "@types/react-window": "^1.8.5", "chai": "^4.2.0", "decompress": "^4.2.0", "decompress-tarbz2": "^4.1.1", diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts index 41cb4f450..1c000b32e 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts @@ -1,4 +1,27 @@ -import { Line, SerialMonitorOutput } from './serial-monitor-send-output'; +import dateFormat = require('dateformat'); + +export interface Line { + message: string; + timestamp?: Date; + length: number; +} + +export interface State { + lines: Line[]; + timestamp: boolean; + charCount: number; +} + +export interface SelectOption { + readonly label: string; + readonly value: T; +} + +export const MAX_CHARACTERS = 1_000_000; + +export function format(timestamp: Date | undefined): string { + return timestamp ? `${dateFormat(timestamp, 'HH:MM:ss.l')} -> ` : ''; +} export function messagesToLines( messages: string[], @@ -8,7 +31,7 @@ export function messagesToLines( ): [Line[], number] { const linesToAdd: Line[] = prevLines.length ? [prevLines[prevLines.length - 1]] - : [{ message: '', lineLen: 0 }]; + : [{ message: '', length: 0 }]; if (!(Symbol.iterator in Object(messages))) return [prevLines, charCount]; for (const message of messages) { @@ -21,12 +44,12 @@ export function messagesToLines( linesToAdd.push({ message, timestamp: new Date(), - lineLen: messageLen, + length: messageLen, }); } else { // concatenate to the last line linesToAdd[linesToAdd.length - 1].message += message; - linesToAdd[linesToAdd.length - 1].lineLen += messageLen; + linesToAdd[linesToAdd.length - 1].length += messageLen; if (!linesToAdd[linesToAdd.length - 1].timestamp) { linesToAdd[linesToAdd.length - 1].timestamp = new Date(); } @@ -40,12 +63,12 @@ export function messagesToLines( export function truncateLines( lines: Line[], charCount: number, - maxCharacters: number = SerialMonitorOutput.MAX_CHARACTERS + maxCharacters: number = MAX_CHARACTERS ): [Line[], number] { let charsToDelete = charCount - maxCharacters; let lineIndex = 0; while (charsToDelete > 0 || lineIndex > 0) { - const firstLineLength = lines[lineIndex]?.lineLen; + const firstLineLength = lines[lineIndex]?.length; if (charsToDelete >= firstLineLength) { // every time a full line to delete is found, move the index. 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 f3987dc76..8372e5ab9 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -30,8 +30,8 @@ import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; import { ArduinoSelect } from '../../widgets/arduino-select'; import { MonitorResourceProvider } from './monitor-resource-provider'; +import { messagesToLines, SelectOption, truncateLines } from './monitor-utils'; import { SerialMonitorSendInput } from './serial-monitor-send-input'; -import { SerialMonitorOutput } from './serial-monitor-send-output'; @injectable() export class MonitorWidget extends BaseWidget { @@ -136,9 +136,9 @@ export class MonitorWidget extends BaseWidget { this.monitorManagerProxy.onMonitorSettingsDidChange((settings) => this.updateSettings(settings) ), - this.monitorManagerProxy.onMessagesReceived(({ messages }) => { - messages.forEach((message) => this.appendContent({ message })); - }), + this.monitorManagerProxy.onMessagesReceived(({ messages }) => + this.appendContent(messages) + ), ]); this.getCurrentSettings().then((settings) => this.updateSettings(settings)); this.monitorManagerProxy.startMonitor(); @@ -222,7 +222,7 @@ export class MonitorWidget extends BaseWidget { this.update(); } - protected get lineEndings(): SerialMonitorOutput.SelectOption[] { + protected get lineEndings(): SelectOption[] { return [ { label: nls.localize('arduino/serial/noLineEndings', 'No Line Ending'), @@ -335,7 +335,7 @@ export class MonitorWidget extends BaseWidget { this.monitorManagerProxy.send(value); private readonly onChangeLineEnding = ( - option: SerialMonitorOutput.SelectOption + option: SelectOption ): void => { this.monitorModel.lineEnding = option.value; }; @@ -425,39 +425,33 @@ export class MonitorWidget extends BaseWidget { return undefined; } - private async appendContent({ message }: { message: string }): Promise { + private async appendContent(messages: string[]): Promise { return this.appendContentQueue.add(async () => { const textModel = ( await this.resourceProvider.resource.editorModelRef.promise ).object.textEditorModel; - const lastLine = textModel.getLineCount(); - const lastLineMaxColumn = textModel.getLineMaxColumn(lastLine); - const position = new monaco.Position(lastLine, lastLineMaxColumn); - const range = new monaco.Range( - position.lineNumber, - position.column, - position.lineNumber, - position.column + const oldLines = textModel + .getLinesContent() + .map((line) => ({ message: line, length: line.length })); + const oldCharCount = textModel.getValueLength( + monaco.editor.EndOfLinePreference.LF + ); + const [newLines, totalCharCount] = messagesToLines( + messages, + oldLines, + oldCharCount ); - const edits = [ - { - range, - text: message, - forceMoveMarkers: true, - }, - ]; - // We do not use `pushEditOperations` as we do not need undo/redo support. VS Code uses `applyEdits` too. - // https://github.com/microsoft/vscode/blob/dc348340fd1a6c583cb63a1e7e6b4fd657e01e01/src/vs/workbench/services/output/common/outputChannelModel.ts#L108-L115 - textModel.applyEdits(edits); + const [lines] = truncateLines(newLines, totalCharCount); + textModel.setValue(lines.map(({ message }) => message.trim()).join('\n')); }); } } -const defaultLineEnding: SerialMonitorOutput.SelectOption = { +const defaultLineEnding: SelectOption = { label: nls.localize('arduino/serial/newLine', 'New Line'), value: '\n', }; -const lineEndings: SerialMonitorOutput.SelectOption[] = [ +const lineEndings: SelectOption[] = [ { label: nls.localize('arduino/serial/noLineEndings', 'No Line Ending'), value: '', 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 deleted file mode 100644 index 70a275b5c..000000000 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx +++ /dev/null @@ -1,148 +0,0 @@ -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 from 'dateformat'; -import { messagesToLines, truncateLines } from './monitor-utils'; -import { MonitorManagerProxyClient } from '../../../common/protocol'; -import { MonitorModel } from '../../monitor-model'; - -export type Line = { message: string; timestamp?: Date; lineLen: number }; - -export class SerialMonitorOutput extends React.Component< - SerialMonitorOutput.Props, - SerialMonitorOutput.State -> { - /** - * Do not touch it. It is used to be able to "follow" the serial monitor log. - */ - protected toDisposeBeforeUnmount = new DisposableCollection(); - private listRef: React.RefObject; - - constructor(props: Readonly) { - super(props); - this.listRef = React.createRef(); - this.state = { - lines: [], - timestamp: this.props.monitorModel.timestamp, - charCount: 0, - }; - } - - override render(): React.ReactNode { - return ( - - {Row} - - ); - } - - override shouldComponentUpdate(): boolean { - return true; - } - - override componentDidMount(): void { - this.scrollToBottom(); - this.toDisposeBeforeUnmount.pushAll([ - this.props.monitorManagerProxy.onMessagesReceived(({ messages }) => { - const [newLines, totalCharCount] = messagesToLines( - messages, - this.state.lines, - this.state.charCount - ); - const [lines, charCount] = truncateLines(newLines, totalCharCount); - this.setState( - { - lines, - charCount, - }, - () => this.scrollToBottom() - ); - }), - this.props.clearConsoleEvent(() => - this.setState({ lines: [], charCount: 0 }) - ), - this.props.monitorModel.onChange(({ property }) => { - if (property === 'timestamp') { - const { timestamp } = this.props.monitorModel; - this.setState({ timestamp }); - } - if (property === 'autoscroll') { - this.scrollToBottom(); - } - }), - ]); - } - - override componentWillUnmount(): void { - // TODO: "Your preferred browser's local storage is almost full." Discard `content` before saving layout? - this.toDisposeBeforeUnmount.dispose(); - } - - private readonly scrollToBottom = () => { - if (this.listRef.current && this.props.monitorModel.autoscroll) { - this.listRef.current.scrollToItem(this.state.lines.length, 'end'); - } - }; -} - -const _Row = ({ - index, - style, - data, -}: { - index: number; - style: any; - data: { lines: Line[]; timestamp: boolean }; -}) => { - const timestamp = - (data.timestamp && - `${dateFormat(data.lines[index].timestamp, 'HH:MM:ss.l')} -> `) || - ''; - return ( - (data.lines[index].lineLen && ( -
-
-          {timestamp}
-          {data.lines[index].message}
-        
-
- )) || - null - ); -}; -const Row = React.memo(_Row, areEqual); - -export namespace SerialMonitorOutput { - export interface Props { - readonly monitorModel: MonitorModel; - readonly monitorManagerProxy: MonitorManagerProxyClient; - readonly clearConsoleEvent: Event; - readonly height: number; - } - - export interface State { - lines: Line[]; - timestamp: boolean; - charCount: number; - } - - export interface SelectOption { - readonly label: string; - readonly value: T; - } - - export const MAX_CHARACTERS = 1_000_000; -} diff --git a/arduino-ide-extension/src/browser/style/monitor.css b/arduino-ide-extension/src/browser/style/monitor.css index 575837b00..274795ac1 100644 --- a/arduino-ide-extension/src/browser/style/monitor.css +++ b/arduino-ide-extension/src/browser/style/monitor.css @@ -9,15 +9,6 @@ flex-direction: column; } -.serial-monitor-messages { - white-space: 'pre'; - font-family: monospace -} - -.serial-monitor-messages pre { - margin: 0px; -} - .serial-monitor .head { display: flex; padding: 0px 5px 5px 0px; diff --git a/arduino-ide-extension/src/test/browser/monitor-utils.test.ts b/arduino-ide-extension/src/test/browser/monitor-utils.test.ts index cf1025740..521a898d4 100644 --- a/arduino-ide-extension/src/test/browser/monitor-utils.test.ts +++ b/arduino-ide-extension/src/test/browser/monitor-utils.test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { + Line, messagesToLines, truncateLines, } from '../../browser/serial/monitor/monitor-utils'; -import { Line } from '../../browser/serial/monitor/serial-monitor-send-output'; import { set, reset } from 'mockdate'; type TestLine = { @@ -21,41 +21,41 @@ const date = new Date(); const testLines: TestLine[] = [ { messages: ['Hello'], - expected: { lines: [{ message: 'Hello', lineLen: 5 }], charCount: 5 }, + expected: { lines: [{ message: 'Hello', length: 5 }], charCount: 5 }, }, { messages: ['Hello', 'Dog!'], - expected: { lines: [{ message: 'HelloDog!', lineLen: 9 }], charCount: 9 }, + expected: { lines: [{ message: 'HelloDog!', length: 9 }], charCount: 9 }, }, { messages: ['Hello\n', 'Dog!'], expected: { lines: [ - { message: 'Hello\n', lineLen: 6 }, - { message: 'Dog!', lineLen: 4 }, + { message: 'Hello\n', length: 6 }, + { message: 'Dog!', length: 4 }, ], charCount: 10, }, }, { messages: ['Dog!'], - prevLines: { lines: [{ message: 'Hello\n', lineLen: 6 }], charCount: 6 }, + prevLines: { lines: [{ message: 'Hello\n', length: 6 }], charCount: 6 }, expected: { lines: [ - { message: 'Hello\n', lineLen: 6 }, - { message: 'Dog!', lineLen: 4 }, + { message: 'Hello\n', length: 6 }, + { message: 'Dog!', length: 4 }, ], charCount: 10, }, }, { messages: [' Dog!\n', " Who's a good ", 'boy?\n', "You're a good boy!"], - prevLines: { lines: [{ message: 'Hello', lineLen: 5 }], charCount: 5 }, + prevLines: { lines: [{ message: 'Hello', length: 5 }], charCount: 5 }, expected: { lines: [ - { message: 'Hello Dog!\n', lineLen: 11 }, - { message: " Who's a good boy?\n", lineLen: 19 }, - { message: "You're a good boy!", lineLen: 8 }, + { message: 'Hello Dog!\n', length: 11 }, + { message: " Who's a good boy?\n", length: 19 }, + { message: "You're a good boy!", length: 8 }, ], charCount: 48, }, @@ -63,8 +63,8 @@ const testLines: TestLine[] = [ maxCharacters: 20, charCount: 20, lines: [ - { message: '?\n', lineLen: 2 }, - { message: "You're a good boy!", lineLen: 8 }, + { message: '?\n', length: 2 }, + { message: "You're a good boy!", length: 8 }, ], }, }, @@ -72,16 +72,16 @@ const testLines: TestLine[] = [ messages: ['boy?\n', "You're a good boy!"], prevLines: { lines: [ - { message: 'Hello Dog!\n', lineLen: 11 }, - { message: " Who's a good ", lineLen: 14 }, + { message: 'Hello Dog!\n', length: 11 }, + { message: " Who's a good ", length: 14 }, ], charCount: 25, }, expected: { lines: [ - { message: 'Hello Dog!\n', lineLen: 11 }, - { message: " Who's a good boy?\n", lineLen: 19 }, - { message: "You're a good boy!", lineLen: 8 }, + { message: 'Hello Dog!\n', length: 11 }, + { message: " Who's a good boy?\n", length: 19 }, + { message: "You're a good boy!", length: 8 }, ], charCount: 48, }, @@ -89,22 +89,22 @@ const testLines: TestLine[] = [ maxCharacters: 20, charCount: 20, lines: [ - { message: '?\n', lineLen: 2 }, - { message: "You're a good boy!", lineLen: 8 }, + { message: '?\n', length: 2 }, + { message: "You're a good boy!", length: 8 }, ], }, }, { messages: ["Who's a good boy?\n", 'Yo'], prevLines: { - lines: [{ message: 'Hello Dog!\n', lineLen: 11 }], + lines: [{ message: 'Hello Dog!\n', length: 11 }], charCount: 11, }, expected: { lines: [ - { message: 'Hello Dog!\n', lineLen: 11 }, - { message: "Who's a good boy?\n", lineLen: 18 }, - { message: 'Yo', lineLen: 2 }, + { message: 'Hello Dog!\n', length: 11 }, + { message: "Who's a good boy?\n", length: 18 }, + { message: 'Yo', length: 2 }, ], charCount: 31, }, @@ -112,8 +112,8 @@ const testLines: TestLine[] = [ maxCharacters: 20, charCount: 20, lines: [ - { message: "Who's a good boy?\n", lineLen: 18 }, - { message: 'Yo', lineLen: 2 }, + { message: "Who's a good boy?\n", length: 18 }, + { message: 'Yo', length: 2 }, ], }, }, diff --git a/yarn.lock b/yarn.lock index 35eac062c..a55bbc173 100644 --- a/yarn.lock +++ b/yarn.lock @@ -876,10 +876,12 @@ "@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.10.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + dependencies: + regenerator-runtime "^0.13.4" "@babel/runtime@^7.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" @@ -10529,11 +10531,6 @@ mem@^4.0.0: 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" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - memoize-one@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" @@ -13144,14 +13141,6 @@ react-virtuoso@^2.17.0: "@virtuoso.dev/react-urx" "^0.2.12" "@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== - 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" From d6c19583df30f2e9447b727094160078ab9aa56f Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 25 Nov 2022 21:57:49 +0100 Subject: [PATCH 04/29] feat: speed up message append Signed-off-by: Akos Kitta --- .../browser/serial/monitor/monitor-widget.tsx | 28 +++++++-------- .../theia/monaco/monaco-text-model-service.ts | 34 ++----------------- 2 files changed, 16 insertions(+), 46 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 8372e5ab9..6fb9613f8 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -30,7 +30,7 @@ import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; import { ArduinoSelect } from '../../widgets/arduino-select'; import { MonitorResourceProvider } from './monitor-resource-provider'; -import { messagesToLines, SelectOption, truncateLines } from './monitor-utils'; +import { SelectOption } from './monitor-utils'; import { SerialMonitorSendInput } from './serial-monitor-send-input'; @injectable() @@ -430,19 +430,19 @@ export class MonitorWidget extends BaseWidget { const textModel = ( await this.resourceProvider.resource.editorModelRef.promise ).object.textEditorModel; - const oldLines = textModel - .getLinesContent() - .map((line) => ({ message: line, length: line.length })); - const oldCharCount = textModel.getValueLength( - monaco.editor.EndOfLinePreference.LF - ); - const [newLines, totalCharCount] = messagesToLines( - messages, - oldLines, - oldCharCount - ); - const [lines] = truncateLines(newLines, totalCharCount); - textModel.setValue(lines.map(({ message }) => message.trim()).join('\n')); + const end = textModel.getFullModelRange().getEndPosition(); + textModel.applyEdits([ + { + range: new monaco.Range( + end.lineNumber, + end.column, + end.lineNumber, + end.column + ), + text: messages.join(''), + forceMoveMarkers: false, + }, + ]); }); } } 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 8f77343bc..033481ca8 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 @@ -1,48 +1,18 @@ import type { ILogger, Log, Loggable } from '@theia/core/lib/common/logger'; -import { OS } from '@theia/core/lib/common/os'; import type { Resource } from '@theia/core/lib/common/resource'; -import { - inject, - injectable, - postConstruct, -} from '@theia/core/shared/inversify'; -import { URI as CodeURI } from '@theia/core/shared/vscode-uri'; +import { inject, injectable } from '@theia/core/shared/inversify'; import type { EditorPreferences } from '@theia/editor/lib/browser/editor-preferences'; -import { ITextResourcePropertiesService } from '@theia/monaco-editor-core/esm/vs/editor/common/services/textResourceConfiguration'; -import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; import { MonacoTextModelService as TheiaMonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service'; -import { SketchesServiceClientImpl } from '../../sketches-service-client-impl'; import type { MonacoToProtocolConverter } from '@theia/monaco/lib/browser/monaco-to-protocol-converter'; import type { ProtocolToMonacoConverter } from '@theia/monaco/lib/browser/protocol-to-monaco-converter'; -import { MonitorUri } from '../../serial/monitor/monitor-uri'; +import { SketchesServiceClientImpl } from '../../sketches-service-client-impl'; @injectable() export class MonacoTextModelService extends TheiaMonacoTextModelService { @inject(SketchesServiceClientImpl) protected readonly sketchesServiceClient: SketchesServiceClientImpl; - @postConstruct() - override init(): void { - const resourcePropertiesService = StandaloneServices.get( - ITextResourcePropertiesService - ); - if (resourcePropertiesService) { - resourcePropertiesService.getEOL = (resource: CodeURI) => { - if (MonitorUri.toString() === resource.toString()) { - // The CLI seems to send `\r\n` through the monitor when calling `Serial.println` from `ino` code. - // See: https://github.com/arduino/arduino-ide/issues/391#issuecomment-850622814 - return '\r\n'; - } - const eol = this.editorPreferences['files.eol']; - if (eol && eol !== 'auto') { - return eol; - } - return OS.backend.isWindows ? '\r\n' : '\n'; - }; - } - } - protected override async createModel( resource: Resource ): Promise { From ca87e2167e0aa8473af92d823930f340d89a5449 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 25 Nov 2022 22:01:12 +0100 Subject: [PATCH 05/29] fix: text selection Signed-off-by: Akos Kitta --- .../src/browser/serial/monitor/monitor-widget.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6fb9613f8..735d42a78 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -440,7 +440,7 @@ export class MonitorWidget extends BaseWidget { end.column ), text: messages.join(''), - forceMoveMarkers: false, + forceMoveMarkers: true, }, ]); }); From ff60a6efe9a2dd88c9830604b9e3ea2a18da7467 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 25 Nov 2022 22:41:33 +0100 Subject: [PATCH 06/29] feat: simplify received data buffering Signed-off-by: Akos Kitta --- .../browser/serial/monitor/monitor-utils.ts | 74 -------- .../src/node/monitor-service.ts | 23 +-- .../src/test/browser/monitor-utils.test.ts | 171 ------------------ 3 files changed, 7 insertions(+), 261 deletions(-) delete mode 100644 arduino-ide-extension/src/test/browser/monitor-utils.test.ts diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts index 1c000b32e..7b11740e8 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts @@ -6,12 +6,6 @@ export interface Line { length: number; } -export interface State { - lines: Line[]; - timestamp: boolean; - charCount: number; -} - export interface SelectOption { readonly label: string; readonly value: T; @@ -22,71 +16,3 @@ export const MAX_CHARACTERS = 1_000_000; export function format(timestamp: Date | undefined): string { return timestamp ? `${dateFormat(timestamp, 'HH:MM:ss.l')} -> ` : ''; } - -export function messagesToLines( - messages: string[], - prevLines: Line[] = [], - charCount = 0, - separator = '\n' -): [Line[], number] { - const linesToAdd: Line[] = prevLines.length - ? [prevLines[prevLines.length - 1]] - : [{ message: '', length: 0 }]; - if (!(Symbol.iterator in Object(messages))) return [prevLines, charCount]; - - for (const message of messages) { - const messageLen = message.length; - charCount += messageLen; - const lastLine = linesToAdd[linesToAdd.length - 1]; - - // if the previous messages ends with "separator" add a new line - if (lastLine.message.charAt(lastLine.message.length - 1) === separator) { - linesToAdd.push({ - message, - timestamp: new Date(), - length: messageLen, - }); - } else { - // concatenate to the last line - linesToAdd[linesToAdd.length - 1].message += message; - linesToAdd[linesToAdd.length - 1].length += messageLen; - if (!linesToAdd[linesToAdd.length - 1].timestamp) { - linesToAdd[linesToAdd.length - 1].timestamp = new Date(); - } - } - } - - prevLines.splice(prevLines.length - 1, 1, ...linesToAdd); - return [prevLines, charCount]; -} - -export function truncateLines( - lines: Line[], - charCount: number, - maxCharacters: number = MAX_CHARACTERS -): [Line[], number] { - let charsToDelete = charCount - maxCharacters; - let lineIndex = 0; - while (charsToDelete > 0 || lineIndex > 0) { - const firstLineLength = lines[lineIndex]?.length; - - if (charsToDelete >= firstLineLength) { - // every time a full line to delete is found, move the index. - lineIndex++; - charsToDelete -= firstLineLength; - charCount -= firstLineLength; - continue; - } - - // delete all previous lines - lines.splice(0, lineIndex); - lineIndex = 0; - - const newFirstLine = lines[0]?.message?.substring(charsToDelete); - const deletedCharsCount = firstLineLength - newFirstLine.length; - charCount -= deletedCharsCount; - charsToDelete -= deletedCharsCount; - lines[0].message = newFirstLine; - } - return [lines, charCount]; -} diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index e6c3172f1..c004d55f0 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -76,7 +76,7 @@ export class MonitorService extends CoreClientAware implements Disposable { // List of messages received from the running pluggable monitor. // These are flushed from time to time to the frontend. - private messages: string[] = []; + private messages: Uint8Array[] = []; // Handles messages received from the frontend via websocket. private onMessageReceived?: Disposable; @@ -370,11 +370,9 @@ export class MonitorService extends CoreClientAware implements Disposable { return; } const data = monitorResponse.getRxData(); - const message = - typeof data === 'string' - ? data - : this.streamingTextDecoder.decode(data, { stream: true }); - this.messages.push(...splitLines(message)); + this.messages.push( + typeof data === 'string' ? new TextEncoder().encode(data) : data + ); }, }, ]; @@ -701,7 +699,9 @@ export class MonitorService extends CoreClientAware implements Disposable { if (!this.flushMessagesInterval) { const flushMessagesToFrontend = () => { if (this.messages.length) { - this.webSocketProvider.sendMessage(JSON.stringify(this.messages)); + this.webSocketProvider.sendMessage( + JSON.stringify([Buffer.concat(this.messages).toString('utf8')]) + ); this.messages = []; } }; @@ -771,12 +771,3 @@ export class MonitorService extends CoreClientAware implements Disposable { } } } - -/** - * Splits a string into an array without removing newline char. - * @param s string to split into lines - * @returns an lines array - */ -function splitLines(s: string): string[] { - return s.split(/(?<=\n)/); -} diff --git a/arduino-ide-extension/src/test/browser/monitor-utils.test.ts b/arduino-ide-extension/src/test/browser/monitor-utils.test.ts deleted file mode 100644 index 521a898d4..000000000 --- a/arduino-ide-extension/src/test/browser/monitor-utils.test.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { expect } from 'chai'; -import { - Line, - messagesToLines, - truncateLines, -} from '../../browser/serial/monitor/monitor-utils'; -import { set, reset } from 'mockdate'; - -type TestLine = { - messages: string[]; - prevLines?: { lines: Line[]; charCount: number }; - expected: { lines: Line[]; charCount: number }; - expectedTruncated?: { - lines: Line[]; - charCount: number; - maxCharacters?: number; - }; -}; - -const date = new Date(); -const testLines: TestLine[] = [ - { - messages: ['Hello'], - expected: { lines: [{ message: 'Hello', length: 5 }], charCount: 5 }, - }, - { - messages: ['Hello', 'Dog!'], - expected: { lines: [{ message: 'HelloDog!', length: 9 }], charCount: 9 }, - }, - { - messages: ['Hello\n', 'Dog!'], - expected: { - lines: [ - { message: 'Hello\n', length: 6 }, - { message: 'Dog!', length: 4 }, - ], - charCount: 10, - }, - }, - { - messages: ['Dog!'], - prevLines: { lines: [{ message: 'Hello\n', length: 6 }], charCount: 6 }, - expected: { - lines: [ - { message: 'Hello\n', length: 6 }, - { message: 'Dog!', length: 4 }, - ], - charCount: 10, - }, - }, - { - messages: [' Dog!\n', " Who's a good ", 'boy?\n', "You're a good boy!"], - prevLines: { lines: [{ message: 'Hello', length: 5 }], charCount: 5 }, - expected: { - lines: [ - { message: 'Hello Dog!\n', length: 11 }, - { message: " Who's a good boy?\n", length: 19 }, - { message: "You're a good boy!", length: 8 }, - ], - charCount: 48, - }, - expectedTruncated: { - maxCharacters: 20, - charCount: 20, - lines: [ - { message: '?\n', length: 2 }, - { message: "You're a good boy!", length: 8 }, - ], - }, - }, - { - messages: ['boy?\n', "You're a good boy!"], - prevLines: { - lines: [ - { message: 'Hello Dog!\n', length: 11 }, - { message: " Who's a good ", length: 14 }, - ], - charCount: 25, - }, - expected: { - lines: [ - { message: 'Hello Dog!\n', length: 11 }, - { message: " Who's a good boy?\n", length: 19 }, - { message: "You're a good boy!", length: 8 }, - ], - charCount: 48, - }, - expectedTruncated: { - maxCharacters: 20, - charCount: 20, - lines: [ - { message: '?\n', length: 2 }, - { message: "You're a good boy!", length: 8 }, - ], - }, - }, - { - messages: ["Who's a good boy?\n", 'Yo'], - prevLines: { - lines: [{ message: 'Hello Dog!\n', length: 11 }], - charCount: 11, - }, - expected: { - lines: [ - { message: 'Hello Dog!\n', length: 11 }, - { message: "Who's a good boy?\n", length: 18 }, - { message: 'Yo', length: 2 }, - ], - charCount: 31, - }, - expectedTruncated: { - maxCharacters: 20, - charCount: 20, - lines: [ - { message: "Who's a good boy?\n", length: 18 }, - { message: 'Yo', length: 2 }, - ], - }, - }, -]; - -testLines.forEach((t) => - [...t.expected.lines, ...(t.prevLines?.lines || [])].forEach( - (l) => (l.timestamp = date) - ) -); - -describe('Monitor Utils', () => { - beforeEach(() => { - set(date); - }); - - afterEach(() => { - reset(); - }); - - testLines.forEach((testLine) => { - context('when converting messages', () => { - it('should give the right result', () => { - const [newLines, addedCharCount] = messagesToLines( - testLine.messages, - testLine.prevLines?.lines, - testLine.prevLines?.charCount - ); - newLines.forEach((line, index) => { - expect(line.message).to.equal(testLine.expected.lines[index].message); - expect(line.timestamp).to.deep.equal( - testLine.expected.lines[index].timestamp - ); - }); - expect(addedCharCount).to.equal(testLine.expected.charCount); - - const [truncatedLines, totalCharCount] = truncateLines( - newLines, - addedCharCount, - testLine.expectedTruncated?.maxCharacters - ); - let charCount = 0; - if (testLine.expectedTruncated) { - truncatedLines.forEach((line, index) => { - expect(line.message).to.equal( - testLine.expectedTruncated?.lines[index].message - ); - charCount += line.message.length; - }); - expect(totalCharCount).to.equal(charCount); - } - }); - }); - }); -}); From 5400cd9dbc3479192e71ffb32090cb0f221afc00 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 29 Nov 2022 15:25:55 +0100 Subject: [PATCH 07/29] fix: warning if IDE2 window blurs then gains focus Unregistered menu action for removed command `workbench.action.files.newUntitledFile`. Signed-off-by: Akos Kitta --- .../src/browser/theia/core/common-frontend-contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..580180817 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 @@ -46,7 +46,7 @@ export class CommonFrontendContribution extends TheiaCommonFrontendContribution CommonCommands.SELECT_ICON_THEME, CommonCommands.SELECT_COLOR_THEME, CommonCommands.ABOUT_COMMAND, - CommonCommands.SAVE_WITHOUT_FORMATTING, // Patched for https://github.com/eclipse-theia/theia/pull/8877, + CommonCommands.SAVE_WITHOUT_FORMATTING, // Patched for https://github.com/eclipse-theia/theia/pull/8877 CommonCommands.NEW_UNTITLED_FILE, ]) { registry.unregisterMenuAction(command); From 07433ce75f5e6a557e5615dd5e0acef8019941a4 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 29 Nov 2022 17:10:19 +0100 Subject: [PATCH 08/29] fix: clear editor content on widget dispose Signed-off-by: Akos Kitta --- .../src/browser/serial/monitor/monitor-widget.tsx | 1 + 1 file changed, 1 insertion(+) 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 735d42a78..f7211403b 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -110,6 +110,7 @@ export class MonitorWidget extends BaseWidget { this.appendContentQueue.pause(); this.appendContentQueue.clear(); }), + Disposable.create(() => this.clearConsole()), ]); } From 86749a7b27607848659025847f55ca26f801fefb Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 29 Nov 2022 17:10:46 +0100 Subject: [PATCH 09/29] fix: use CRLF EOL for the monitor editor model Signed-off-by: Akos Kitta --- .../theia/monaco/monaco-text-model-service.ts | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) 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 033481ca8..6e757f5ed 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 @@ -1,11 +1,20 @@ import type { ILogger, Log, Loggable } from '@theia/core/lib/common/logger'; +import { OS } from '@theia/core/lib/common/os'; import type { Resource } from '@theia/core/lib/common/resource'; -import { inject, injectable } from '@theia/core/shared/inversify'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; +import { URI as CodeURI } from '@theia/core/shared/vscode-uri'; import type { EditorPreferences } from '@theia/editor/lib/browser/editor-preferences'; +import { ITextResourcePropertiesService } from '@theia/monaco-editor-core/esm/vs/editor/common/services/textResourceConfiguration'; +import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; import { MonacoTextModelService as TheiaMonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service'; import type { MonacoToProtocolConverter } from '@theia/monaco/lib/browser/monaco-to-protocol-converter'; import type { ProtocolToMonacoConverter } from '@theia/monaco/lib/browser/protocol-to-monaco-converter'; +import { MonitorUri } from '../../serial/monitor/monitor-uri'; import { SketchesServiceClientImpl } from '../../sketches-service-client-impl'; @injectable() @@ -13,6 +22,27 @@ export class MonacoTextModelService extends TheiaMonacoTextModelService { @inject(SketchesServiceClientImpl) protected readonly sketchesServiceClient: SketchesServiceClientImpl; + @postConstruct() + override init(): void { + const resourcePropertiesService = StandaloneServices.get( + ITextResourcePropertiesService + ); + if (resourcePropertiesService) { + resourcePropertiesService.getEOL = (resource: CodeURI) => { + if (MonitorUri.toString() === resource.toString()) { + // The CLI seems to send `\r\n` through the monitor when calling `Serial.println` from `ino` code. + // See: https://github.com/arduino/arduino-ide/issues/391#issuecomment-850622814 + return '\r\n'; + } + const eol = this.editorPreferences['files.eol']; + if (eol && eol !== 'auto') { + return eol; + } + return OS.backend.isWindows ? '\r\n' : '\n'; + }; + } + } + protected override async createModel( resource: Resource ): Promise { From 19c4a89d62468f1f98261679bc18b4f1e40464fa Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 30 Nov 2022 10:20:20 +0100 Subject: [PATCH 10/29] fix: extra empty line if last message end with CR Signed-off-by: Akos Kitta --- .../browser/serial/monitor/monitor-widget.tsx | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 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 f7211403b..c77be542f 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -427,24 +427,40 @@ export class MonitorWidget extends BaseWidget { } private async appendContent(messages: string[]): Promise { - return this.appendContentQueue.add(async () => { - const textModel = ( - await this.resourceProvider.resource.editorModelRef.promise - ).object.textEditorModel; - const end = textModel.getFullModelRange().getEndPosition(); - textModel.applyEdits([ - { - range: new monaco.Range( - end.lineNumber, - end.column, - end.lineNumber, - end.column - ), - text: messages.join(''), - forceMoveMarkers: true, - }, - ]); - }); + const textModel = ( + await this.resourceProvider.resource.editorModelRef.promise + ).object.textEditorModel; + return messages + .map((message) => + this.appendContentQueue.add(async () => { + const end = textModel.getFullModelRange().getEndPosition(); + const range = monaco.Range.fromPositions(end, end); + const text = + this.lastMessageDidEndWithCR && this.startsWithNL(message) + ? message.substring(1) + : message; + textModel.applyEdits([ + { + range, + text, + forceMoveMarkers: true, + }, + ]); + this.lastMessageDidEndWithCR = this.endWithCR(message); + }) + ) + .reduce(async (acc, curr) => { + await acc; + return curr; + }, Promise.resolve()); + } + + private lastMessageDidEndWithCR = false; + private endWithCR(message: string): boolean { + return message.charCodeAt(message.length - 1) === 13; + } + private startsWithNL(message: string): boolean { + return message.charCodeAt(0) === 10; } } From cdc6a116a7cf1ab845396146fa560e04e2e7aebf Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 30 Nov 2022 11:19:00 +0100 Subject: [PATCH 11/29] feat: limit max line and column number Signed-off-by: Akos Kitta --- .../src/browser/arduino-preferences.ts | 18 ++++ .../serial/monitor/monitor-editor-factory.ts | 21 +++-- .../monitor/monitor-resource-provider.ts | 1 - .../browser/serial/monitor/monitor-widget.tsx | 85 ++++++++++++++----- i18n/en.json | 4 + 5 files changed, 101 insertions(+), 28 deletions(-) diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index 5adc8b9c2..05edad4af 100644 --- a/arduino-ide-extension/src/browser/arduino-preferences.ts +++ b/arduino-ide-extension/src/browser/arduino-preferences.ts @@ -258,6 +258,22 @@ export const ArduinoConfigSchema: PreferenceSchema = { ), default: undefined, }, + 'arduino.monitor.stopRenderingLineAfter': { + type: 'number', + markdownDescription: nls.localize( + 'arduino/preferences/monitor/stopRenderingLineAfter', + 'Performance guard: Stop rendering a line after x characters in the _Serial Monitor_ view. Defaults to 1000. Use -1 to never stop rendering.' + ), + default: 1_000, + }, + 'arduino.monitor.maxLineNumber': { + type: 'number', + markdownDescription: nls.localize( + 'arduino/preferences/monitor/maxLineNumber', + 'Performance guard: Truncates previous lines after x lines in the _Serial Monitor_ view. Defaults to 1000. Use -1 to never truncate lines.' + ), + default: 1_000, + }, }, }; @@ -288,6 +304,8 @@ export interface ArduinoConfiguration { 'arduino.cli.daemon.debug': boolean; 'arduino.sketch.inoBlueprint': string; 'arduino.checkForUpdates': boolean; + 'arduino.monitor.stopRenderingLineAfter': number; + 'arduino.monitor.maxLineNumber': number; } export const ArduinoPreferences = Symbol('ArduinoPreferences'); diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts index ef055bc00..393be0b26 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts @@ -6,14 +6,26 @@ import { MonacoEditor, } from '@theia/monaco/lib/browser/monaco-editor'; import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; +import { ArduinoPreferences } from '../../arduino-preferences'; import { OutputEditorFactory } from '../../theia/output/output-editor-factory'; import { MonitorContextMenuService } from './monitor-context-menu-service'; import { MonitorUri } from './monitor-uri'; +// To hide the margin in the editor https://github.com/microsoft/monaco-editor/issues/1960 +const noMargin = { + lineNumbers: 'off', + glyphMargin: false, + folding: false, + lineDecorationsWidth: 0, + lineNumbersMinChars: 0, +} as const; + @injectable() export class MonitorEditorFactory extends OutputEditorFactory { @inject(MonitorContextMenuService) private readonly monitorContextMenuService: MonacoContextMenuService; + @inject(ArduinoPreferences) + private readonly preference: ArduinoPreferences; override readonly scheme: string = MonitorUri.scheme; @@ -23,12 +35,9 @@ export class MonitorEditorFactory extends OutputEditorFactory { ): MonacoEditor.IOptions { return { ...super.createOptions(model, defaultOptions), - // To hide the margin in the editor https://github.com/microsoft/monaco-editor/issues/1960 - lineNumbers: 'off', - glyphMargin: false, - folding: false, - lineDecorationsWidth: 0, - lineNumbersMinChars: 0, + ...noMargin, + stopRenderingLineAfter: + this.preference['arduino.monitor.stopRenderingLineAfter'], }; } diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-resource-provider.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-resource-provider.ts index 93e856c19..2a0abd7d0 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-resource-provider.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-resource-provider.ts @@ -26,7 +26,6 @@ export class MonitorResourceProvider implements ResourceResolver { if (this.resource.uri.toString() === uri.toString()) { return this.resource; } - // Note: this is totally normal. This is the way Theia loads a resource. throw new Error(`Cannot handle URI: ${uri.toString()}`); } } 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 c77be542f..61cf01836 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -26,6 +26,7 @@ import { MonitorManagerProxyClient, MonitorSettings, } from '../../../common/protocol'; +import { ArduinoPreferences } from '../../arduino-preferences'; import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; import { ArduinoSelect } from '../../widgets/arduino-select'; @@ -51,15 +52,17 @@ export class MonitorWidget extends BaseWidget { * Guard against re-rendering the view after the close was requested. * See: https://github.com/eclipse-theia/theia/issues/6704 */ + private closing = false; private readonly contentNode: HTMLDivElement; private readonly headerNode: HTMLDivElement; private readonly editorContainer: DockPanel; - private closing = false; protected readonly appendContentQueue = new PQueue({ autoStart: true, concurrency: 1, }); + private maxLineNumber: number; + @inject(MonitorModel) private readonly monitorModel: MonitorModel; @inject(MonitorManagerProxyClient) @@ -77,6 +80,8 @@ export class MonitorWidget extends BaseWidget { private readonly editorProvider: MonacoEditorProvider; @inject(MonitorResourceProvider) private readonly resourceProvider: MonitorResourceProvider; + @inject(ArduinoPreferences) + private readonly preference: ArduinoPreferences; constructor() { super(); @@ -103,7 +108,10 @@ export class MonitorWidget extends BaseWidget { }); this.editorContainer.addClass('editor-container'); this.editorContainer.node.tabIndex = -1; + } + @postConstruct() + protected init(): void { this.toDispose.pushAll([ Disposable.create(() => this.monitorManagerProxy.disconnect()), Disposable.create(() => { @@ -111,20 +119,20 @@ export class MonitorWidget extends BaseWidget { this.appendContentQueue.clear(); }), Disposable.create(() => this.clearConsole()), - ]); - } - - @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.toDispose.pushAll([ + this.preference.onPreferenceChanged(({ preferenceName, newValue }) => { + if (typeof newValue === 'number') { + switch (preferenceName) { + case 'arduino.monitor.maxLineNumber': { + this.handleDidChangeMaxLineNumber(newValue); + return; + } + case 'arduino.monitor.stopRenderingLineAfter': { + this.handleDidChangeStopRenderingLineAfter(newValue); + return; + } + } + } + }), this.monitorModel.onChange(async ({ property }) => { if (property === 'connected') { const { connectionStatus } = this.monitorModel; @@ -141,6 +149,7 @@ export class MonitorWidget extends BaseWidget { this.appendContent(messages) ), ]); + this.maxLineNumber = this.preference['arduino.monitor.maxLineNumber']; this.getCurrentSettings().then((settings) => this.updateSettings(settings)); this.monitorManagerProxy.startMonitor(); this.startMonitor(); @@ -366,9 +375,10 @@ export class MonitorWidget extends BaseWidget { this.editorContainer.addWidget(widget); this.toDispose.pushAll([ Disposable.create(() => widget.close()), - this.resourceProvider.resource.onDidChangeContents(() => - this.revealLastLine() - ), + this.resourceProvider.resource.onDidChangeContents(() => { + this.ensureMaxLineNumbers(); + this.revealLastLine(); + }), ]); if (!preserveFocus) { this.activate(); @@ -427,9 +437,7 @@ export class MonitorWidget extends BaseWidget { } private async appendContent(messages: string[]): Promise { - const textModel = ( - await this.resourceProvider.resource.editorModelRef.promise - ).object.textEditorModel; + const textModel = await this.textModel(); return messages .map((message) => this.appendContentQueue.add(async () => { @@ -456,12 +464,47 @@ export class MonitorWidget extends BaseWidget { } private lastMessageDidEndWithCR = false; + private async textModel() { + return (await this.resourceProvider.resource.editorModelRef.promise).object + .textEditorModel; + } + private endWithCR(message: string): boolean { return message.charCodeAt(message.length - 1) === 13; } + private startsWithNL(message: string): boolean { return message.charCodeAt(0) === 10; } + + private handleDidChangeMaxLineNumber(maxLineNumber: number): void { + this.maxLineNumber = maxLineNumber; + this.appendContent(['']); // This is a NOOP change but will update the model that will fire an event and the line numbers can be adjusted + } + + private handleDidChangeStopRenderingLineAfter( + stopRenderingLineAfter: number + ): void { + this.editor?.getControl().updateOptions({ stopRenderingLineAfter }); + } + + private ensureMaxLineNumbers(): void { + if (!this.editor) { + return; + } + this.textModel().then((model) => { + const lineCount = model.getLineCount(); + const linesToRemove = lineCount - this.maxLineNumber; + if (linesToRemove > 0) { + model.applyEdits([ + { + range: new monaco.Range(1, 1, linesToRemove + 1, 1), + text: null, + }, + ]); + } + }); + } } const defaultLineEnding: SelectOption = { diff --git a/i18n/en.json b/i18n/en.json index ecd94c757..6895b70c6 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -381,6 +381,10 @@ "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": { + "inoBlueprint": "Performance guard: Stop rendering a line after x characters in the _Serial Monitor_ view. Defaults to 1000. Use -1 to never stop rendering.", + "stopRenderingLineAfter": "Performance guard: Stop rendering a line after x characters in the _Serial Monitor_ view. Defaults to 1000. Use -1 to never stop rendering." + }, "network": "Network", "newSketchbookLocation": "Select new sketchbook location", "noCliConfig": "Could not load the CLI configuration", From 9a67e0d2981dfd31bd6455d25e42fc42605edbe1 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 30 Nov 2022 11:22:43 +0100 Subject: [PATCH 12/29] fix: createRoot for React 18+ Signed-off-by: Akos Kitta --- .../browser/serial/monitor/monitor-widget.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 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 61cf01836..be4d2257e 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -15,7 +15,7 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; +import { Root, createRoot } from '@theia/core/shared/react-dom/client'; import { EditorWidget } from '@theia/editor/lib/browser'; import * as monaco from '@theia/monaco-editor-core'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; @@ -54,7 +54,7 @@ export class MonitorWidget extends BaseWidget { */ private closing = false; private readonly contentNode: HTMLDivElement; - private readonly headerNode: HTMLDivElement; + private readonly headerRoot: Root; private readonly editorContainer: DockPanel; protected readonly appendContentQueue = new PQueue({ autoStart: true, @@ -94,14 +94,13 @@ export class MonitorWidget extends BaseWidget { this.toDispose.push( Disposable.create(() => this.monitorManagerProxy.disconnect()) ); - this.contentNode = document.createElement('div'); this.contentNode.classList.add('content'); - this.headerNode = document.createElement('div'); - this.headerNode.classList.add('header'); - this.contentNode.appendChild(this.headerNode); + const headerNode = document.createElement('div'); + headerNode.classList.add('header'); + this.contentNode.appendChild(headerNode); + this.headerRoot = createRoot(headerNode); this.node.appendChild(this.contentNode); - this.editorContainer = new NoopDragOverDockPanel({ spacing: 0, mode: 'single-document', @@ -169,9 +168,8 @@ export class MonitorWidget extends BaseWidget { protected override onAfterAttach(message: Message): void { super.onAfterAttach(message); - ReactDOM.render( - {this.renderHeader()}, - this.headerNode + this.headerRoot.render( + {this.renderHeader()} ); Widget.attach(this.editorContainer, this.contentNode); this.toDisposeOnDetach.push( From 22afb80b8f9bb365a1bb5ca9699f5e0110e048a9 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 30 Nov 2022 13:52:41 +0100 Subject: [PATCH 13/29] fix: negative max line number Signed-off-by: Akos Kitta --- .../serial/monitor/monitor-editor-factory.ts | 2 +- .../browser/serial/monitor/monitor-widget.tsx | 58 ++++++++++--------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts index 393be0b26..4bf4295e0 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts @@ -19,7 +19,6 @@ const noMargin = { lineDecorationsWidth: 0, lineNumbersMinChars: 0, } as const; - @injectable() export class MonitorEditorFactory extends OutputEditorFactory { @inject(MonitorContextMenuService) @@ -38,6 +37,7 @@ export class MonitorEditorFactory extends OutputEditorFactory { ...noMargin, stopRenderingLineAfter: this.preference['arduino.monitor.stopRenderingLineAfter'], + hideCursorInOverviewRuler: true, }; } 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 be4d2257e..268674c89 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -15,7 +15,7 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import * as React from '@theia/core/shared/react'; -import { Root, createRoot } from '@theia/core/shared/react-dom/client'; +import { createRoot, Root } from '@theia/core/shared/react-dom/client'; import { EditorWidget } from '@theia/editor/lib/browser'; import * as monaco from '@theia/monaco-editor-core'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; @@ -33,6 +33,7 @@ import { ArduinoSelect } from '../../widgets/arduino-select'; import { MonitorResourceProvider } from './monitor-resource-provider'; import { SelectOption } from './monitor-utils'; import { SerialMonitorSendInput } from './serial-monitor-send-input'; +import debounce = require('lodash.debounce'); @injectable() export class MonitorWidget extends BaseWidget { @@ -42,27 +43,6 @@ export class MonitorWidget extends BaseWidget { 'Serial Monitor' ); - private settings: MonitorSettings = {}; - private widgetHeight: number; - /** - * Do not touch or use it. It is for setting the focus on the `input` after the widget activation. - */ - private focusNode: HTMLElement | undefined; - /** - * Guard against re-rendering the view after the close was requested. - * See: https://github.com/eclipse-theia/theia/issues/6704 - */ - private closing = false; - private readonly contentNode: HTMLDivElement; - private readonly headerRoot: Root; - private readonly editorContainer: DockPanel; - protected readonly appendContentQueue = new PQueue({ - autoStart: true, - concurrency: 1, - }); - - private maxLineNumber: number; - @inject(MonitorModel) private readonly monitorModel: MonitorModel; @inject(MonitorManagerProxyClient) @@ -83,6 +63,26 @@ export class MonitorWidget extends BaseWidget { @inject(ArduinoPreferences) private readonly preference: ArduinoPreferences; + private settings: MonitorSettings = {}; + private widgetHeight: number; + /** + * Do not touch or use it. It is for setting the focus on the `input` after the widget activation. + */ + private focusNode: HTMLElement | undefined; + /** + * Guard against re-rendering the view after the close was requested. + * See: https://github.com/eclipse-theia/theia/issues/6704 + */ + private closing = false; + private maxLineNumber: number; + private readonly contentNode: HTMLDivElement; + private readonly headerRoot: Root; + private readonly editorContainer: DockPanel; + protected readonly appendContentQueue = new PQueue({ + autoStart: true, + concurrency: 1, + }); + constructor() { super(); this.id = MonitorWidget.ID; @@ -374,7 +374,7 @@ export class MonitorWidget extends BaseWidget { this.toDispose.pushAll([ Disposable.create(() => widget.close()), this.resourceProvider.resource.onDidChangeContents(() => { - this.ensureMaxLineNumbers(); + this.ensureMaxLineNotExceeded(); this.revealLastLine(); }), ]); @@ -477,7 +477,7 @@ export class MonitorWidget extends BaseWidget { private handleDidChangeMaxLineNumber(maxLineNumber: number): void { this.maxLineNumber = maxLineNumber; - this.appendContent(['']); // This is a NOOP change but will update the model that will fire an event and the line numbers can be adjusted + this.appendContent(['']); // This is a NOOP change but will update the model and adjusts the line numbers if required } private handleDidChangeStopRenderingLineAfter( @@ -486,8 +486,14 @@ export class MonitorWidget extends BaseWidget { this.editor?.getControl().updateOptions({ stopRenderingLineAfter }); } - private ensureMaxLineNumbers(): void { - if (!this.editor) { + private readonly ensureMaxLineNotExceeded = debounce( + () => this.maybeTrimLines(), + 16, // ~60Hz + { maxWait: 16 } + ); + + private maybeTrimLines(): void { + if (!this.editor || this.maxLineNumber < 0) { return; } this.textModel().then((model) => { From 53629c7b2fac188e156cbc677f3099f095a454d3 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 1 Dec 2022 10:51:46 +0100 Subject: [PATCH 14/29] feat: editor options tweaks + timestamp Signed-off-by: Akos Kitta --- .../serial/monitor/monitor-editor-factory.ts | 7 + .../browser/serial/monitor/monitor-utils.ts | 6 + .../browser/serial/monitor/monitor-widget.tsx | 229 ++++++++++++------ arduino-ide-extension/src/common/utils.ts | 9 + 4 files changed, 176 insertions(+), 75 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts index 4bf4295e0..0683974f2 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts @@ -38,6 +38,13 @@ export class MonitorEditorFactory extends OutputEditorFactory { stopRenderingLineAfter: this.preference['arduino.monitor.stopRenderingLineAfter'], hideCursorInOverviewRuler: true, + trimAutoWhitespace: false, + maxTokenizationLineLength: 0, + cursorBlinking: 'solid', + cursorStyle: undefined, + domReadOnly: true, + renderLineHighlight: 'none', + renderValidationDecorations: 'off', }; } diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts index 7b11740e8..475c63617 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts @@ -16,3 +16,9 @@ export const MAX_CHARACTERS = 1_000_000; export function format(timestamp: Date | undefined): string { return timestamp ? `${dateFormat(timestamp, 'HH:MM:ss.l')} -> ` : ''; } + +/** + * Derived from the `HH:MM:ss.l` date format with the ` -> ` suffix. + * Example: `17:43:29.108 -> `. + */ +export const timestampLength = '17:43:29.108 -> '.length; 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 268674c89..139a27931 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -26,14 +26,14 @@ import { MonitorManagerProxyClient, MonitorSettings, } from '../../../common/protocol'; +import { splitLines } from '../../../common/utils'; import { ArduinoPreferences } from '../../arduino-preferences'; import { BoardsServiceProvider } from '../../boards/boards-service-provider'; import { MonitorModel } from '../../monitor-model'; import { ArduinoSelect } from '../../widgets/arduino-select'; import { MonitorResourceProvider } from './monitor-resource-provider'; -import { SelectOption } from './monitor-utils'; +import { format, SelectOption, timestampLength } from './monitor-utils'; import { SerialMonitorSendInput } from './serial-monitor-send-input'; -import debounce = require('lodash.debounce'); @injectable() export class MonitorWidget extends BaseWidget { @@ -75,10 +75,13 @@ export class MonitorWidget extends BaseWidget { */ private closing = false; private maxLineNumber: number; + private shouldHandleNextLeadingNL = false; + private removedLinesCount = 0; + private readonly lineNumber2Timestamp: Record; private readonly contentNode: HTMLDivElement; private readonly headerRoot: Root; private readonly editorContainer: DockPanel; - protected readonly appendContentQueue = new PQueue({ + protected readonly queue = new PQueue({ autoStart: true, concurrency: 1, }); @@ -107,6 +110,7 @@ export class MonitorWidget extends BaseWidget { }); this.editorContainer.addClass('editor-container'); this.editorContainer.node.tabIndex = -1; + this.lineNumber2Timestamp = {}; } @postConstruct() @@ -114,8 +118,8 @@ export class MonitorWidget extends BaseWidget { this.toDispose.pushAll([ Disposable.create(() => this.monitorManagerProxy.disconnect()), Disposable.create(() => { - this.appendContentQueue.pause(); - this.appendContentQueue.clear(); + this.queue.pause(); + this.queue.clear(); }), Disposable.create(() => this.clearConsole()), this.preference.onPreferenceChanged(({ preferenceName, newValue }) => { @@ -123,29 +127,35 @@ export class MonitorWidget extends BaseWidget { switch (preferenceName) { case 'arduino.monitor.maxLineNumber': { this.handleDidChangeMaxLineNumber(newValue); - return; + break; } case 'arduino.monitor.stopRenderingLineAfter': { this.handleDidChangeStopRenderingLineAfter(newValue); - return; + break; } } } }), - this.monitorModel.onChange(async ({ property }) => { - if (property === 'connected') { - const { connectionStatus } = this.monitorModel; - if (connectionStatus === 'not-connected') { - await this.clearConsole(); + this.monitorModel.onChange(({ property }) => { + switch (property) { + case 'connected': { + this.handleDidChangeConnected(); + break; + } + case 'timestamp': { + this.handleDidChangeTimestamp(); + break; + } + default: { + this.update(); } } - this.update(); }), this.monitorManagerProxy.onMonitorSettingsDidChange((settings) => this.updateSettings(settings) ), this.monitorManagerProxy.onMessagesReceived(({ messages }) => - this.appendContent(messages) + this.appendToTextModel(messages) ), ]); this.maxLineNumber = this.preference['arduino.monitor.maxLineNumber']; @@ -339,26 +349,6 @@ export class MonitorWidget extends BaseWidget { ); }; - private readonly onSend = (value: string): void => - this.monitorManagerProxy.send(value); - - private readonly onChangeLineEnding = ( - option: SelectOption - ): void => { - this.monitorModel.lineEnding = option.value; - }; - - private readonly onChangeBaudRate = ({ value }: { value: string }): void => { - this.getCurrentSettings().then(({ pluggableMonitorSettings }) => { - if (!pluggableMonitorSettings || !pluggableMonitorSettings['baudrate']) { - return; - } - const baudRateSettings = pluggableMonitorSettings['baudrate']; - baudRateSettings.selectedValue = value; - this.monitorManagerProxy.changeSettings({ pluggableMonitorSettings }); - }); - }; - private async refreshEditorWidget( { preserveFocus }: { preserveFocus: boolean } = { preserveFocus: false } ): Promise { @@ -371,11 +361,12 @@ export class MonitorWidget extends BaseWidget { } const widget = await this.createEditorWidget(); this.editorContainer.addWidget(widget); + const textModel = await this.textModel(); this.toDispose.pushAll([ Disposable.create(() => widget.close()), - this.resourceProvider.resource.onDidChangeContents(() => { - this.ensureMaxLineNotExceeded(); + textModel.onDidChangeContent(({ changes }) => { this.revealLastLine(); + this.updateTimestamps(changes); }), ]); if (!preserveFocus) { @@ -390,15 +381,15 @@ export class MonitorWidget extends BaseWidget { } const editor = this.editor; if (editor) { - const model = editor.getControl().getModel(); - if (model) { - const lineNumber = model.getLineCount(); - const column = model.getLineMaxColumn(lineNumber); + const textModel = editor.getControl().getModel(); + if (textModel) { + const lineNumber = textModel.getLineCount(); + // const column = model.getLineMaxColumn(lineNumber); editor .getControl() .revealPosition( - { lineNumber, column }, - monaco.editor.ScrollType.Smooth + { lineNumber, column: 1 }, + monaco.editor.ScrollType.Immediate ); } } @@ -416,10 +407,13 @@ export class MonitorWidget extends BaseWidget { } private get editorWidget(): EditorWidget | undefined { - for (const widget of toArray(this.editorContainer.children())) { - if (widget instanceof EditorWidget) { - return widget; + const itr = this.editorContainer.children(); + let child = itr.next(); + while (child) { + if (child instanceof EditorWidget) { + return child; } + child = itr.next(); } return undefined; } @@ -434,17 +428,28 @@ export class MonitorWidget extends BaseWidget { return undefined; } - private async appendContent(messages: string[]): Promise { + private async appendToTextModel(messages: string[]): Promise { const textModel = await this.textModel(); return messages .map((message) => - this.appendContentQueue.add(async () => { + this.queue.add(async () => { const end = textModel.getFullModelRange().getEndPosition(); const range = monaco.Range.fromPositions(end, end); - const text = - this.lastMessageDidEndWithCR && this.startsWithNL(message) + let text = + this.shouldHandleNextLeadingNL && this.startsWithNL(message) ? message.substring(1) : message; + if (this.monitorModel.timestamp) { + text = splitLines(text) + .map((line, index) => { + const now = new Date(); + if (index === 0) { + return format(end.column === 1 ? now : undefined) + line; + } + return format(now) + line; + }) + .join(''); + } textModel.applyEdits([ { range, @@ -452,22 +457,22 @@ export class MonitorWidget extends BaseWidget { forceMoveMarkers: true, }, ]); - this.lastMessageDidEndWithCR = this.endWithCR(message); + this.shouldHandleNextLeadingNL = this.endsWithCR(message); + this.maybeRemoveExceedingLines(textModel); }) ) - .reduce(async (acc, curr) => { - await acc; + .reduce(async (prev, curr) => { + await prev; return curr; }, Promise.resolve()); } - private lastMessageDidEndWithCR = false; - private async textModel() { + private async textModel(): Promise { return (await this.resourceProvider.resource.editorModelRef.promise).object .textEditorModel; } - private endWithCR(message: string): boolean { + private endsWithCR(message: string): boolean { return message.charCodeAt(message.length - 1) === 13; } @@ -475,9 +480,70 @@ export class MonitorWidget extends BaseWidget { return message.charCodeAt(0) === 10; } + private updateTimestamps(changes: monaco.editor.IModelContentChange[]): void { + for (const { + text, + rangeLength, + range: { startLineNumber, endLineNumber }, + } of changes) { + const lineNumbers = [startLineNumber, endLineNumber].map( + (lineNumber) => lineNumber + this.removedLinesCount + ); + if (rangeLength > 0 && !text) { + // deletions + lineNumbers.forEach( + (lineNumber) => delete this.lineNumber2Timestamp[lineNumber] + ); + } else if (rangeLength === 0 && text) { + // insertions + lineNumbers.forEach((lineNumber) => { + if (!this.lineNumber2Timestamp[lineNumber]) { + this.lineNumber2Timestamp[lineNumber] = format(new Date()); + } + }); + } + } + } + + private async handleDidChangeConnected(): Promise { + const { connectionStatus } = this.monitorModel; + if (connectionStatus === 'not-connected') { + this.clearConsole(); + } + this.update(); + } + + private async handleDidChangeTimestamp(): Promise { + const { timestamp } = this.monitorModel; + const textModel = await this.textModel(); + const lineCount = textModel.getLineCount(); + const operations: monaco.editor.IIdentifiedSingleEditOperation[] = []; + for (let i = 0; i < lineCount; i++) { + const lineStart = new monaco.Position(i + 1, 1); + if (timestamp) { + operations.push({ + range: monaco.Range.fromPositions(lineStart, lineStart), + text: this.lineNumber2Timestamp[this.removedLinesCount + i + 1], + forceMoveMarkers: true, + }); + } else { + const timestampEnd = new monaco.Position( + lineStart.lineNumber, + lineStart.column + timestampLength + ); + operations.push({ + range: monaco.Range.fromPositions(lineStart, timestampEnd), + text: null, + forceMoveMarkers: true, + }); + } + } + textModel.applyEdits(operations); + } + private handleDidChangeMaxLineNumber(maxLineNumber: number): void { this.maxLineNumber = maxLineNumber; - this.appendContent(['']); // This is a NOOP change but will update the model and adjusts the line numbers if required + this.appendToTextModel(['']); // This is a NOOP change but will update the model and adjusts the line numbers if required } private handleDidChangeStopRenderingLineAfter( @@ -486,29 +552,42 @@ export class MonitorWidget extends BaseWidget { this.editor?.getControl().updateOptions({ stopRenderingLineAfter }); } - private readonly ensureMaxLineNotExceeded = debounce( - () => this.maybeTrimLines(), - 16, // ~60Hz - { maxWait: 16 } - ); - - private maybeTrimLines(): void { - if (!this.editor || this.maxLineNumber < 0) { + private maybeRemoveExceedingLines(textModel: monaco.editor.ITextModel): void { + if (this.maxLineNumber < 0) { return; } - this.textModel().then((model) => { - const lineCount = model.getLineCount(); - const linesToRemove = lineCount - this.maxLineNumber; - if (linesToRemove > 0) { - model.applyEdits([ - { - range: new monaco.Range(1, 1, linesToRemove + 1, 1), - text: null, - }, - ]); + const lineCount = textModel.getLineCount(); + const linesToRemove = lineCount - this.maxLineNumber; + if (linesToRemove > 0) { + textModel.applyEdits([ + { + range: new monaco.Range(1, 1, linesToRemove + 1, 1), + text: null, + }, + ]); + this.removedLinesCount += linesToRemove; + } + } + + private readonly onSend = (value: string): void => + this.monitorManagerProxy.send(value); + + private readonly onChangeLineEnding = ( + option: SelectOption + ): void => { + this.monitorModel.lineEnding = option.value; + }; + + private readonly onChangeBaudRate = ({ value }: { value: string }): void => { + this.getCurrentSettings().then(({ pluggableMonitorSettings }) => { + if (!pluggableMonitorSettings || !pluggableMonitorSettings['baudrate']) { + return; } + const baudRateSettings = pluggableMonitorSettings['baudrate']; + baudRateSettings.selectedValue = value; + this.monitorManagerProxy.changeSettings({ pluggableMonitorSettings }); }); - } + }; } const defaultLineEnding: SelectOption = { diff --git a/arduino-ide-extension/src/common/utils.ts b/arduino-ide-extension/src/common/utils.ts index 56ed366c1..51c2ad81e 100644 --- a/arduino-ide-extension/src/common/utils.ts +++ b/arduino-ide-extension/src/common/utils.ts @@ -38,3 +38,12 @@ export function uint8ArrayToString(uint8Array: Uint8Array): string { export function stringToUint8Array(text: string): Uint8Array { return Uint8Array.from(text, (char) => char.charCodeAt(0)); } + +/** + * Splits a string into an array without removing newline char. + * @param s string to split into lines + * @returns an lines array + */ +export function splitLines(s: string): string[] { + return s.split(/(?<=\n)/); +} From 81acd66909c70fbd4de15a0202596684127284f8 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 1 Dec 2022 16:16:50 +0100 Subject: [PATCH 15/29] fix: attempt to improve performance vol1 simplified data sent from CLI reuse textModel and line numbers on the client Signed-off-by: Akos Kitta --- .../monitor-manager-proxy-client-impl.ts | 8 +- .../browser/serial/monitor/monitor-widget.tsx | 249 ++++++++---------- .../src/common/protocol/monitor-service.ts | 2 +- .../src/node/monitor-service.ts | 7 +- 4 files changed, 114 insertions(+), 152 deletions(-) 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..936a3a3e8 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 @@ -38,8 +38,8 @@ export class MonitorManagerProxyClientImpl // this event is triggered. // Ideally a frontend component is connected to this event // to update the UI. - private readonly onMessagesReceivedEmitter = new Emitter<{ - messages: string[]; + protected readonly onMessagesReceivedEmitter = new Emitter<{ + message: string; }>(); readonly onMessagesReceived = this.onMessagesReceivedEmitter.event; @@ -90,8 +90,8 @@ export class MonitorManagerProxyClientImpl this.webSocket.onerror = () => opened.reject(); this.webSocket.onmessage = (message) => { const parsedMessage = JSON.parse(message.data); - if (Array.isArray(parsedMessage)) - this.onMessagesReceivedEmitter.fire({ messages: parsedMessage }); + if (typeof parsedMessage === 'string') + this.onMessagesReceivedEmitter.fire({ message: parsedMessage }); else if ( parsedMessage.command === Monitor.MiddlewareCommand.ON_SETTINGS_DID_CHANGE 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 139a27931..5489340b7 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -20,7 +20,6 @@ import { EditorWidget } from '@theia/editor/lib/browser'; import * as monaco from '@theia/monaco-editor-core'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; import { MonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider'; -import PQueue from 'p-queue'; import { MonitorEOL, MonitorManagerProxyClient, @@ -74,6 +73,7 @@ export class MonitorWidget extends BaseWidget { * See: https://github.com/eclipse-theia/theia/issues/6704 */ private closing = false; + private textModel: monaco.editor.ITextModel | undefined; private maxLineNumber: number; private shouldHandleNextLeadingNL = false; private removedLinesCount = 0; @@ -81,10 +81,6 @@ export class MonitorWidget extends BaseWidget { private readonly contentNode: HTMLDivElement; private readonly headerRoot: Root; private readonly editorContainer: DockPanel; - protected readonly queue = new PQueue({ - autoStart: true, - concurrency: 1, - }); constructor() { super(); @@ -117,10 +113,6 @@ export class MonitorWidget extends BaseWidget { protected init(): void { this.toDispose.pushAll([ Disposable.create(() => this.monitorManagerProxy.disconnect()), - Disposable.create(() => { - this.queue.pause(); - this.queue.clear(); - }), Disposable.create(() => this.clearConsole()), this.preference.onPreferenceChanged(({ preferenceName, newValue }) => { if (typeof newValue === 'number') { @@ -146,26 +138,26 @@ export class MonitorWidget extends BaseWidget { this.handleDidChangeTimestamp(); break; } - default: { - this.update(); - } } }), this.monitorManagerProxy.onMonitorSettingsDidChange((settings) => this.updateSettings(settings) ), - this.monitorManagerProxy.onMessagesReceived(({ messages }) => - this.appendToTextModel(messages) + this.monitorManagerProxy.onMessagesReceived(({ message }) => + this.appendToTextModel(message) ), ]); this.maxLineNumber = this.preference['arduino.monitor.maxLineNumber']; - this.getCurrentSettings().then((settings) => this.updateSettings(settings)); - this.monitorManagerProxy.startMonitor(); - this.startMonitor(); - } - - reset(): void { - this.init(); + this.getCurrentSettings().then((settings) => { + if (settings) { + this.updateSettings(settings); + } + }); + this.appStateService + .reachedState('ready') + .then(() => + setTimeout(() => this.monitorManagerProxy.startMonitor(), 5_000) + ); } async clearConsole(): Promise { @@ -178,9 +170,7 @@ export class MonitorWidget extends BaseWidget { protected override onAfterAttach(message: Message): void { super.onAfterAttach(message); - this.headerRoot.render( - {this.renderHeader()} - ); + this.renderHeader(); Widget.attach(this.editorContainer, this.contentNode); this.toDisposeOnDetach.push( Disposable.create(() => Widget.detach(this.editorContainer)) @@ -227,65 +217,30 @@ export class MonitorWidget extends BaseWidget { ...settings.pluggableMonitorSettings, }, }; - this.update(); - } - - override dispose(): void { - this.toDisposeOnReset.dispose(); - super.dispose(); - } - - protected override onAfterShow(msg: Message): void { - super.onAfterShow(msg); - this.update(); - } - - protected get lineEndings(): SelectOption[] { - return [ - { - label: nls.localize('arduino/serial/noLineEndings', 'No Line Ending'), - value: '', - }, - { - label: nls.localize('arduino/serial/newLine', 'New Line'), - value: '\n', - }, - { - label: nls.localize('arduino/serial/carriageReturn', 'Carriage Return'), - value: '\r', - }, - { - label: nls.localize( - 'arduino/serial/newLineCarriageReturn', - 'Both NL & CR' - ), - value: '\r\n', - }, - ]; - } - - private async startMonitor(): Promise { - await this.appStateService.reachedState('ready'); - await this.boardsServiceProvider.reconciled; - await this.syncSettings(); - await this.monitorManagerProxy.startMonitor(); + // Skip re-rendering the header when settings is an empty object + if (Object.keys(settings).length) { + this.renderHeader(); + } } - private async syncSettings(): Promise { - const settings = await this.getCurrentSettings(); - this.updateSettings(settings); + private async getCurrentSettings(): Promise { + const { + boardsConfig: { selectedBoard, selectedPort }, + } = this.boardsServiceProvider; + if (!selectedBoard || !selectedPort) { + return undefined; + } + return this.monitorManagerProxy.getCurrentSettings( + selectedBoard, + selectedPort + ); } - private async getCurrentSettings(): Promise { - const board = this.boardsServiceProvider.boardsConfig.selectedBoard; - const port = this.boardsServiceProvider.boardsConfig.selectedPort; - if (!board || !port) { - return this.settings ?? {}; - } - return this.monitorManagerProxy.getCurrentSettings(board, port); + private renderHeader() { + this.headerRoot.render(<>{this.header()}); } - private renderHeader(): React.ReactNode { + private header(): React.ReactNode { const baudrate = this.settings?.pluggableMonitorSettings ? this.settings.pluggableMonitorSettings.baudrate : undefined; @@ -361,13 +316,9 @@ export class MonitorWidget extends BaseWidget { } const widget = await this.createEditorWidget(); this.editorContainer.addWidget(widget); - const textModel = await this.textModel(); this.toDispose.pushAll([ Disposable.create(() => widget.close()), - textModel.onDidChangeContent(({ changes }) => { - this.revealLastLine(); - this.updateTimestamps(changes); - }), + Disposable.create(() => (this.textModel = undefined)), ]); if (!preserveFocus) { this.activate(); @@ -375,23 +326,28 @@ export class MonitorWidget extends BaseWidget { this.revealLastLine(); } - private revealLastLine(): void { + private revealLastLine( + textModel: monaco.editor.ITextModel | undefined = this.textModel, + lineNumber?: number + ): void { if (this.isLocked) { return; } + if (!textModel) { + return; + } const editor = this.editor; if (editor) { - const textModel = editor.getControl().getModel(); - if (textModel) { - const lineNumber = textModel.getLineCount(); - // const column = model.getLineMaxColumn(lineNumber); - editor - .getControl() - .revealPosition( - { lineNumber, column: 1 }, - monaco.editor.ScrollType.Immediate - ); - } + editor.getControl().revealPosition( + { + lineNumber: + typeof lineNumber === 'number' + ? lineNumber + : textModel.getLineCount(), + column: 1, + }, + monaco.editor.ScrollType.Immediate + ); } } @@ -403,6 +359,7 @@ export class MonitorWidget extends BaseWidget { const editor = await this.editorProvider.get( this.resourceProvider.resource.uri ); + this.textModel = editor.getControl().getModel() ?? undefined; return new EditorWidget(editor, this.selectionService); } @@ -428,48 +385,44 @@ export class MonitorWidget extends BaseWidget { return undefined; } - private async appendToTextModel(messages: string[]): Promise { - const textModel = await this.textModel(); - return messages - .map((message) => - this.queue.add(async () => { - const end = textModel.getFullModelRange().getEndPosition(); - const range = monaco.Range.fromPositions(end, end); - let text = - this.shouldHandleNextLeadingNL && this.startsWithNL(message) - ? message.substring(1) - : message; - if (this.monitorModel.timestamp) { - text = splitLines(text) - .map((line, index) => { - const now = new Date(); - if (index === 0) { - return format(end.column === 1 ? now : undefined) + line; - } - return format(now) + line; - }) - .join(''); + private async appendToTextModel(message: string): Promise { + const textModel = this.textModel; + if (!textModel) { + console.warn( + `Received message chunks from the serial monitor, but the text model is not available. Skipping.` + ); + return; + } + const end = textModel.getFullModelRange().getEndPosition(); + const range = monaco.Range.fromPositions(end, end); + let text = + this.shouldHandleNextLeadingNL && this.startsWithNL(message) + ? message.substring(1) + : message; + if (this.monitorModel.timestamp) { + text = splitLines(text) + .map((line, index) => { + const now = new Date(); + if (index === 0) { + return format(end.column === 1 ? now : undefined) + line; } - textModel.applyEdits([ - { - range, - text, - forceMoveMarkers: true, - }, - ]); - this.shouldHandleNextLeadingNL = this.endsWithCR(message); - this.maybeRemoveExceedingLines(textModel); + return format(now) + line; }) - ) - .reduce(async (prev, curr) => { - await prev; - return curr; - }, Promise.resolve()); - } - - private async textModel(): Promise { - return (await this.resourceProvider.resource.editorModelRef.promise).object - .textEditorModel; + .join(''); + } + textModel.applyEdits([ + { + range, + text, + forceMoveMarkers: true, + }, + ]); + this.shouldHandleNextLeadingNL = this.endsWithCR(message); + this.revealLastLine(textModel, end.lineNumber); + this.maybeRemoveExceedingLines(textModel); + // requestIdleCallback(() => this.revealLastLine(), { timeout: 32 }); // ~30Hz + if (typeof this.updateTimestamps || typeof this.maybeRemoveExceedingLines) { + } } private endsWithCR(message: string): boolean { @@ -514,9 +467,11 @@ export class MonitorWidget extends BaseWidget { } private async handleDidChangeTimestamp(): Promise { + if (!this.textModel) { + return; + } const { timestamp } = this.monitorModel; - const textModel = await this.textModel(); - const lineCount = textModel.getLineCount(); + const lineCount = this.textModel.getLineCount(); const operations: monaco.editor.IIdentifiedSingleEditOperation[] = []; for (let i = 0; i < lineCount; i++) { const lineStart = new monaco.Position(i + 1, 1); @@ -538,12 +493,12 @@ export class MonitorWidget extends BaseWidget { }); } } - textModel.applyEdits(operations); + this.textModel.applyEdits(operations); } private handleDidChangeMaxLineNumber(maxLineNumber: number): void { this.maxLineNumber = maxLineNumber; - this.appendToTextModel(['']); // This is a NOOP change but will update the model and adjusts the line numbers if required + this.appendToTextModel(''); // This is a NOOP change but will update the model and adjusts the line numbers if required } private handleDidChangeStopRenderingLineAfter( @@ -579,13 +534,19 @@ export class MonitorWidget extends BaseWidget { }; private readonly onChangeBaudRate = ({ value }: { value: string }): void => { - this.getCurrentSettings().then(({ pluggableMonitorSettings }) => { - if (!pluggableMonitorSettings || !pluggableMonitorSettings['baudrate']) { - return; + this.getCurrentSettings().then((settings) => { + if (settings) { + const { pluggableMonitorSettings } = settings; + if ( + !pluggableMonitorSettings || + !pluggableMonitorSettings['baudrate'] + ) { + return; + } + const baudRateSettings = pluggableMonitorSettings['baudrate']; + baudRateSettings.selectedValue = value; + this.monitorManagerProxy.changeSettings({ pluggableMonitorSettings }); } - const baudRateSettings = pluggableMonitorSettings['baudrate']; - baudRateSettings.selectedValue = value; - this.monitorManagerProxy.changeSettings({ pluggableMonitorSettings }); }); }; } diff --git a/arduino-ide-extension/src/common/protocol/monitor-service.ts b/arduino-ide-extension/src/common/protocol/monitor-service.ts index 5eb793f5b..d57234189 100644 --- a/arduino-ide-extension/src/common/protocol/monitor-service.ts +++ b/arduino-ide-extension/src/common/protocol/monitor-service.ts @@ -30,7 +30,7 @@ export interface MonitorManagerProxy export const MonitorManagerProxyClient = Symbol('MonitorManagerProxyClient'); export interface MonitorManagerProxyClient { - onMessagesReceived: Event<{ messages: string[] }>; + onMessagesReceived: Event<{ message: string }>; onMonitorSettingsDidChange: Event; onMonitorShouldReset: Event; connect(addressPort: number): Promise; diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index c004d55f0..c947559be 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -699,13 +699,14 @@ export class MonitorService extends CoreClientAware implements Disposable { if (!this.flushMessagesInterval) { const flushMessagesToFrontend = () => { if (this.messages.length) { - this.webSocketProvider.sendMessage( - JSON.stringify([Buffer.concat(this.messages).toString('utf8')]) + const message = JSON.stringify( + Buffer.concat(this.messages).toString('utf8') ); + this.webSocketProvider.sendMessage(message); this.messages = []; } }; - this.flushMessagesInterval = setInterval(flushMessagesToFrontend, 32); + this.flushMessagesInterval = setInterval(flushMessagesToFrontend, 200); } if (!this.onMessageReceived) { From d94c0537748eea97c97ad9d1b497a983e986da70 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 2 Dec 2022 11:29:01 +0100 Subject: [PATCH 16/29] detached monaco text model from Theia sync Signed-off-by: Akos Kitta --- .../monitor/monitor-editor-model-factory.ts | 49 +++++++- .../browser/serial/monitor/monitor-widget.tsx | 19 ++- .../browser/theia/plugin-ext/hosted-plugin.ts | 108 +++++++++++++++++- .../src/node/monitor-service.ts | 2 +- 4 files changed, 170 insertions(+), 8 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts index 0f6ef2ab4..082fcaa6a 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts @@ -1,8 +1,55 @@ +import type { CancellationToken, Resource } from '@theia/core'; +import { SaveOptions } from '@theia/core/lib/browser'; import { injectable } from '@theia/core/shared/inversify'; -import { OutputEditorModelFactory } from '@theia/output/lib/browser/output-editor-model-factory'; +import { + MonacoEditorModel, + TextDocumentSaveReason, +} from '@theia/monaco/lib/browser/monaco-editor-model'; +import { + OutputEditorModel, + OutputEditorModelFactory, +} from '@theia/output/lib/browser/output-editor-model-factory'; import { MonitorUri } from './monitor-uri'; @injectable() export class MonitorEditorModelFactory extends OutputEditorModelFactory { override readonly scheme: string = MonitorUri.scheme; + override createModel(resource: Resource): MonacoEditorModel { + const model = new MonitorEditorModel(resource, this.m2p, this.p2m); + model.autoSave = 'off'; + return model; + } +} + +class MonitorEditorModel extends OutputEditorModel { + override get readOnly(): boolean { + return true; + } + + override isReadonly(): boolean { + return true; + } + + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + protected override setDirty(dirty: boolean): void { + // NOOP + } + + protected override async doSave( + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + reason: TextDocumentSaveReason, + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + token: CancellationToken, + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + overwriteEncoding?: boolean | undefined, + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + options?: SaveOptions | undefined + ): Promise { + // NOOP + } + + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + protected override async doSync(token: CancellationToken): Promise { + // NOOP + } } 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 5489340b7..9bc3c9d67 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -385,7 +385,7 @@ export class MonitorWidget extends BaseWidget { return undefined; } - private async appendToTextModel(message: string): Promise { + private appendToTextModel(message: string): void { const textModel = this.textModel; if (!textModel) { console.warn( @@ -410,21 +410,32 @@ export class MonitorWidget extends BaseWidget { }) .join(''); } - textModel.applyEdits([ + this.applyEditsUnsafe(textModel, [ { range, text, - forceMoveMarkers: true, + // forceMoveMarkers: true, }, ]); this.shouldHandleNextLeadingNL = this.endsWithCR(message); this.revealLastLine(textModel, end.lineNumber); - this.maybeRemoveExceedingLines(textModel); + // this.maybeRemoveExceedingLines(textModel); // requestIdleCallback(() => this.revealLastLine(), { timeout: 32 }); // ~30Hz if (typeof this.updateTimestamps || typeof this.maybeRemoveExceedingLines) { } } + private applyEditsUnsafe( + textModel: monaco.editor.ITextModel, + rawOperations: monaco.editor.IIdentifiedSingleEditOperation[] + ): void { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const unsafeTextModel = textModel as any; + const operations = + unsafeTextModel['_validateEditOperations'](rawOperations); + return unsafeTextModel['_doApplyEdits'](operations, false); + } + private endsWithCR(message: string): boolean { return message.charCodeAt(message.length - 1) === 13; } 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..020e78781 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,60 @@ -import { Emitter, Event, JsonRpcProxy } from '@theia/core'; +import { + Emitter, + Event, + JsonRpcProxy, + UntitledResourceResolver, +} from '@theia/core'; +import { ApplicationShell, OpenerService } from '@theia/core/lib/browser'; import { injectable, interfaces } from '@theia/core/shared/inversify'; +import { EditorManager } from '@theia/editor/lib/browser'; +import * as monaco from '@theia/monaco-editor-core'; +import { MonacoBulkEditService } from '@theia/monaco/lib/browser/monaco-bulk-edit-service'; +import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; +import { MonacoEditorService } from '@theia/monaco/lib/browser/monaco-editor-service'; +import { MonacoLanguages } from '@theia/monaco/lib/browser/monaco-languages'; +import { ConnectionImpl } from '@theia/plugin-ext/lib/common/connection'; +import { PLUGIN_RPC_CONTEXT } from '@theia/plugin-ext/lib/common/plugin-api-rpc'; import { HostedPluginServer } from '@theia/plugin-ext/lib/common/plugin-protocol'; -import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; +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 { DocumentsMainImpl } from '@theia/plugin-ext/lib/main/browser/documents-main'; +import { EditorsAndDocumentsMain } from '@theia/plugin-ext/lib/main/browser/editors-and-documents-main'; +import { setUpPluginApi } from '@theia/plugin-ext/lib/main/browser/main-context'; +import { EditorModelService } from '@theia/plugin-ext/lib/main/browser/text-editor-model-service'; +import { TextEditorsMainImpl } from '@theia/plugin-ext/lib/main/browser/text-editors-main'; +import { MonitorUri } from '../../serial/monitor/monitor-uri'; +import { DebugMainImpl } from './debug-main'; + +const originalOnModelAdded = DocumentsMainImpl.prototype['onModelAdded']; +const originalOnModelRemoved = DocumentsMainImpl.prototype['onModelRemoved']; +const originalOnModelChanged = DocumentsMainImpl.prototype['onModelChanged']; +DocumentsMainImpl.prototype['onModelAdded'] = function (event: { + model: MonacoEditorModel; + oldModeId: string; +}) { + if (event.model.uri.toString() === MonitorUri.toString()) { + return; + } + originalOnModelAdded.bind(this)(event); +}; +DocumentsMainImpl.prototype['onModelRemoved'] = function (uri: monaco.Uri) { + if (uri.toString() === MonitorUri.toString()) { + return; + } + return originalOnModelRemoved.bind(this)(uri); +}; +DocumentsMainImpl.prototype['onModelChanged'] = function ( + model: MonacoEditorModel +) { + if (model.uri.toString() === MonitorUri.toString()) { + return; + } + originalOnModelChanged.bind(this)(model); +}; @injectable() export class HostedPluginSupport extends TheiaHostedPluginSupport { @@ -32,4 +85,55 @@ 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.patchDocumentsMain(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); + } + + private patchDocumentsMain(rpc: RPCProtocol): void { + const editorsAndDocuments = new EditorsAndDocumentsMain( + rpc, + this.container + ); + + const documentsMain = new DocumentsMainImpl( + editorsAndDocuments, + this.container.get(EditorModelService), + rpc, + this.container.get(EditorManager), + this.container.get(OpenerService), + this.container.get(ApplicationShell), + this.container.get(UntitledResourceResolver), + this.container.get(MonacoLanguages) + ); + rpc.set(PLUGIN_RPC_CONTEXT.DOCUMENTS_MAIN, documentsMain); + + const editorsMain = new TextEditorsMainImpl( + editorsAndDocuments, + documentsMain, + rpc, + this.container.get(MonacoBulkEditService), + this.container.get(MonacoEditorService) + ); + rpc.set(PLUGIN_RPC_CONTEXT.TEXT_EDITORS_MAIN, editorsMain); + } } diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index c947559be..76b87fd31 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -706,7 +706,7 @@ export class MonitorService extends CoreClientAware implements Disposable { this.messages = []; } }; - this.flushMessagesInterval = setInterval(flushMessagesToFrontend, 200); + this.flushMessagesInterval = setInterval(flushMessagesToFrontend, 32); } if (!this.onMessageReceived) { From a677747232e6dae3966d5a212f1adeedcadf573b Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 2 Dec 2022 13:41:50 +0100 Subject: [PATCH 17/29] use unsafe apply edit for line deletion Signed-off-by: Akos Kitta --- .../src/browser/serial/monitor/monitor-widget.tsx | 10 +++------- .../src/node/auth/authentication-service-impl.ts | 2 +- 2 files changed, 4 insertions(+), 8 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 9bc3c9d67..786fe5aef 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -217,10 +217,7 @@ export class MonitorWidget extends BaseWidget { ...settings.pluggableMonitorSettings, }, }; - // Skip re-rendering the header when settings is an empty object - if (Object.keys(settings).length) { - this.renderHeader(); - } + this.renderHeader(); } private async getCurrentSettings(): Promise { @@ -419,8 +416,7 @@ export class MonitorWidget extends BaseWidget { ]); this.shouldHandleNextLeadingNL = this.endsWithCR(message); this.revealLastLine(textModel, end.lineNumber); - // this.maybeRemoveExceedingLines(textModel); - // requestIdleCallback(() => this.revealLastLine(), { timeout: 32 }); // ~30Hz + this.maybeRemoveExceedingLines(textModel); if (typeof this.updateTimestamps || typeof this.maybeRemoveExceedingLines) { } } @@ -525,7 +521,7 @@ export class MonitorWidget extends BaseWidget { const lineCount = textModel.getLineCount(); const linesToRemove = lineCount - this.maxLineNumber; if (linesToRemove > 0) { - textModel.applyEdits([ + this.applyEditsUnsafe(textModel, [ { range: new monaco.Range(1, 1, linesToRemove + 1, 1), text: null, 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 75e9607b8..25955f997 100644 --- a/arduino-ide-extension/src/node/auth/authentication-service-impl.ts +++ b/arduino-ide-extension/src/node/auth/authentication-service-impl.ts @@ -48,7 +48,7 @@ export class AuthenticationServiceImpl async initAuthSession(): Promise { if (!this.initialized) { - await this.delegate.init(); + // await this.delegate.init(); this.initialized = true; } } From 49c6efc248027af494cf15f9e4db9f9c295a6eab Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 2 Dec 2022 14:39:20 +0100 Subject: [PATCH 18/29] fix: memory leak Signed-off-by: Akos Kitta --- .../browser/serial/monitor/monitor-editor-model-factory.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts index 082fcaa6a..fdf41e279 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts @@ -52,4 +52,8 @@ class MonitorEditorModel extends OutputEditorModel { protected override async doSync(token: CancellationToken): Promise { // NOOP } + + protected override markAsDirty(): void { + // NOOP + } } From d5cae912625cc7c8df9823a196613757bea0fb7e Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 2 Dec 2022 15:34:39 +0100 Subject: [PATCH 19/29] fix: another memory leak Signed-off-by: Akos Kitta --- .../monitor/monitor-editor-model-factory.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts index fdf41e279..d801a06ef 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts @@ -1,22 +1,25 @@ import type { CancellationToken, Resource } from '@theia/core'; -import { SaveOptions } from '@theia/core/lib/browser'; +import type { SaveOptions } from '@theia/core/lib/browser'; import { injectable } from '@theia/core/shared/inversify'; +import type { TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol'; import { MonacoEditorModel, - TextDocumentSaveReason, + TextDocumentSaveReason } from '@theia/monaco/lib/browser/monaco-editor-model'; import { OutputEditorModel, - OutputEditorModelFactory, + OutputEditorModelFactory } from '@theia/output/lib/browser/output-editor-model-factory'; import { MonitorUri } from './monitor-uri'; @injectable() export class MonitorEditorModelFactory extends OutputEditorModelFactory { override readonly scheme: string = MonitorUri.scheme; + override createModel(resource: Resource): MonacoEditorModel { const model = new MonitorEditorModel(resource, this.m2p, this.p2m); model.autoSave = 'off'; + model['ignoreContentChanges'] = true; return model; } } @@ -35,6 +38,10 @@ class MonitorEditorModel extends OutputEditorModel { // NOOP } + protected override markAsDirty(): void { + // NOOP + } + protected override async doSave( // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars reason: TextDocumentSaveReason, @@ -53,7 +60,8 @@ class MonitorEditorModel extends OutputEditorModel { // NOOP } - protected override markAsDirty(): void { + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + protected override pushContentChanges(contentChanges: TextDocumentContentChangeEvent[]): void { // NOOP } } From 7bdbf66cfb5818029a37c1692639828eb5517bdc Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 2 Dec 2022 16:40:49 +0100 Subject: [PATCH 20/29] fix: calculate insert and line cleanup in one edit Signed-off-by: Akos Kitta --- .../browser/serial/monitor/monitor-widget.tsx | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 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 786fe5aef..d1edefa80 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -357,6 +357,9 @@ export class MonitorWidget extends BaseWidget { this.resourceProvider.resource.uri ); this.textModel = editor.getControl().getModel() ?? undefined; + if (this.textModel) { + this.textModel.updateOptions({ trimAutoWhitespace: false }); + } return new EditorWidget(editor, this.selectionService); } @@ -407,21 +410,31 @@ export class MonitorWidget extends BaseWidget { }) .join(''); } - this.applyEditsUnsafe(textModel, [ + const operations: monaco.editor.IIdentifiedSingleEditOperation[] = [ { range, text, - // forceMoveMarkers: true, + forceMoveMarkers: true, }, - ]); + ]; + if (this.maxLineNumber > 0) { + const estimatedLintCount = + textModel.getLineCount() + text.split(/\r\n|\r|\n/gm).length - 1; + const linesToRemove = estimatedLintCount - this.maxLineNumber; + if (linesToRemove > 0) { + operations.push({ + range: new monaco.Range(1, 1, linesToRemove + 1, 1), + text: null, + }); + this.removedLinesCount += linesToRemove; + } + } + textModel.applyEdits(operations); this.shouldHandleNextLeadingNL = this.endsWithCR(message); this.revealLastLine(textModel, end.lineNumber); - this.maybeRemoveExceedingLines(textModel); - if (typeof this.updateTimestamps || typeof this.maybeRemoveExceedingLines) { - } } - private applyEditsUnsafe( + /*TODO*/ protected applyEditsUnsafe( textModel: monaco.editor.ITextModel, rawOperations: monaco.editor.IIdentifiedSingleEditOperation[] ): void { @@ -440,7 +453,9 @@ export class MonitorWidget extends BaseWidget { return message.charCodeAt(0) === 10; } - private updateTimestamps(changes: monaco.editor.IModelContentChange[]): void { + /*TODO*/ protected updateTimestamps( + changes: monaco.editor.IModelContentChange[] + ): void { for (const { text, rangeLength, @@ -514,23 +529,6 @@ export class MonitorWidget extends BaseWidget { this.editor?.getControl().updateOptions({ stopRenderingLineAfter }); } - private maybeRemoveExceedingLines(textModel: monaco.editor.ITextModel): void { - if (this.maxLineNumber < 0) { - return; - } - const lineCount = textModel.getLineCount(); - const linesToRemove = lineCount - this.maxLineNumber; - if (linesToRemove > 0) { - this.applyEditsUnsafe(textModel, [ - { - range: new monaco.Range(1, 1, linesToRemove + 1, 1), - text: null, - }, - ]); - this.removedLinesCount += linesToRemove; - } - } - private readonly onSend = (value: string): void => this.monitorManagerProxy.send(value); From d9c7276eeb94e3cb2b4696097b6748e12048b1e9 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 5 Dec 2022 15:12:04 +0100 Subject: [PATCH 21/29] fix: disabled additional monaco features Signed-off-by: Akos Kitta --- .../serial/monitor/monitor-editor-factory.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts index 0683974f2..41688c771 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts @@ -45,6 +45,31 @@ export class MonitorEditorFactory extends OutputEditorFactory { domReadOnly: true, renderLineHighlight: 'none', renderValidationDecorations: 'off', + fixedOverflowWidgets: false, + acceptSuggestionOnCommitCharacter: false, + acceptSuggestionOnEnter: 'off', + autoClosingBrackets: 'never', + autoClosingDelete: 'never', + autoClosingOvertype: 'never', + autoClosingQuotes: 'never', + autoIndent: 'none', + unusualLineTerminators: 'off', + glyphMargin: false, + lineDecorationsWidth: 0, + disableLayerHinting: true, + disableMonospaceOptimizations: true, + inlineSuggest: { enabled: false }, + quickSuggestions: false, + parameterHints: { enabled: false }, + suggestOnTriggerCharacters: false, + snippetSuggestions: 'none', + tabCompletion: 'off', + codeLens: false, + lightbulb: { enabled: false }, + folding: false, + matchBrackets: 'never', + renderLineHighlightOnlyWhenFocus: true, + inlayHints: { enabled: 'off', displayStyle: 'compact' }, }; } From bb26bdce2a7ea797ad29153a8a5f9802f198f1f3 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Mon, 5 Dec 2022 15:15:40 +0100 Subject: [PATCH 22/29] use unsafe edit, access line numbers once --- .../serial/monitor/monitor-editor-model-factory.ts | 10 ++++++---- .../src/browser/serial/monitor/monitor-widget.tsx | 11 ++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts index d801a06ef..f0311d618 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-model-factory.ts @@ -4,11 +4,11 @@ import { injectable } from '@theia/core/shared/inversify'; import type { TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol'; import { MonacoEditorModel, - TextDocumentSaveReason + TextDocumentSaveReason, } from '@theia/monaco/lib/browser/monaco-editor-model'; import { OutputEditorModel, - OutputEditorModelFactory + OutputEditorModelFactory, } from '@theia/output/lib/browser/output-editor-model-factory'; import { MonitorUri } from './monitor-uri'; @@ -60,8 +60,10 @@ class MonitorEditorModel extends OutputEditorModel { // NOOP } - // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars - protected override pushContentChanges(contentChanges: TextDocumentContentChangeEvent[]): void { + protected override pushContentChanges( + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + contentChanges: TextDocumentContentChangeEvent[] + ): void { // NOOP } } 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 d1edefa80..60240e405 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -418,23 +418,24 @@ export class MonitorWidget extends BaseWidget { }, ]; if (this.maxLineNumber > 0) { - const estimatedLintCount = - textModel.getLineCount() + text.split(/\r\n|\r|\n/gm).length - 1; - const linesToRemove = estimatedLintCount - this.maxLineNumber; + const estimatedLineCount = + end.lineNumber + text.split(/\r\n|\r|\n/gm).length - 1; + const linesToRemove = estimatedLineCount - this.maxLineNumber; if (linesToRemove > 0) { operations.push({ range: new monaco.Range(1, 1, linesToRemove + 1, 1), text: null, + forceMoveMarkers: true, }); this.removedLinesCount += linesToRemove; } } - textModel.applyEdits(operations); + this.applyEditsUnsafe(textModel, operations); this.shouldHandleNextLeadingNL = this.endsWithCR(message); this.revealLastLine(textModel, end.lineNumber); } - /*TODO*/ protected applyEditsUnsafe( + private applyEditsUnsafe( textModel: monaco.editor.ITextModel, rawOperations: monaco.editor.IIdentifiedSingleEditOperation[] ): void { From 8e5c523427e6e09b238d789a4d594c51062dd874 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 6 Dec 2022 11:51:48 +0100 Subject: [PATCH 23/29] fix: double monitor model due to premature dispose in ctor Signed-off-by: Akos Kitta --- .../serial/monitor/monitor-resource.ts | 47 ++++++++++++++++--- .../theia/monaco/monaco-editor-provider.ts | 15 ++++-- .../theia/monaco/monaco-text-model-service.ts | 15 +++++- 3 files changed, 65 insertions(+), 12 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-resource.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-resource.ts index c0afb7b99..40f3bd4e3 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-resource.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-resource.ts @@ -1,12 +1,45 @@ -import type { ResourceReadOptions } from '@theia/core/lib/common/resource'; -import { OutputResource } from '@theia/output/lib/browser/output-resource'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import type { + Resource, + ResourceReadOptions, +} from '@theia/core/lib/common/resource'; +import URI from '@theia/core/lib/common/uri'; +import * as monaco from '@theia/monaco-editor-core'; +import { IReference } from '@theia/monaco-editor-core/esm/vs/base/common/lifecycle'; +import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; -export class MonitorResource extends OutputResource { - override async readContents(options?: ResourceReadOptions): Promise { - if (!this._textModel) { - return ''; +export class MonitorResource implements Resource { + private _textModel: monaco.editor.ITextModel | undefined; + private _disposed = false; + + constructor( + readonly uri: URI, + readonly editorModelRef: Deferred> + ) { + this.editorModelRef.promise.then((modelRef) => { + if (this._disposed) { + modelRef.dispose(); + return; + } + this._textModel = modelRef.object.textEditorModel; + }); + } + + get textModel(): monaco.editor.ITextModel | undefined { + return this._textModel; + } + + dispose(): void { + if (this._disposed) { + return; } - return super.readContents(options); + this._disposed = true; + this.textModel?.dispose(); + } + + // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars + async readContents(options?: ResourceReadOptions): Promise { + return this._textModel?.getValue() ?? ''; } async reset(): Promise { 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..818fac65a 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 & { cancel: () => void; }; @@ -24,7 +26,7 @@ interface EditorFactory { @injectable() export class MonacoEditorProvider extends TheiaMonacoEditorProvider { @inject(SketchesServiceClientImpl) - protected readonly sketchesServiceClient: SketchesServiceClientImpl; + private readonly sketchesServiceClient: SketchesServiceClientImpl; protected override async doCreateEditor( uri: URI, @@ -39,7 +41,10 @@ export class MonacoEditorProvider extends TheiaMonacoEditorProvider { private installCustomReferencesController(editor: MonacoEditor): Disposable { const control = editor.getControl(); - const referencesController: any = control.getContribution('editor.contrib.referencesController'); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const referencesController: any = control.getContribution( + 'editor.contrib.referencesController' + ); const originalToggleWidget = referencesController.toggleWidget; const toDispose = new DisposableCollection(); const toDisposeBeforeToggleWidget = new DisposableCollection(); @@ -57,11 +62,13 @@ export class MonacoEditorProvider extends TheiaMonacoEditorProvider { if (referencesController._widget) { if ('onDidClose' in referencesController._widget) { toDisposeBeforeToggleWidget.push( + // eslint-disable-next-line @typescript-eslint/no-explicit-any (referencesController._widget as any).onDidClose(() => toDisposeBeforeToggleWidget.dispose() ) ); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any const preview = (referencesController._widget as any) ._preview as monaco.editor.ICodeEditor; if (preview) { 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 6e757f5ed..189e90e41 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 @@ -7,7 +7,10 @@ import { postConstruct, } from '@theia/core/shared/inversify'; import { URI as CodeURI } from '@theia/core/shared/vscode-uri'; -import type { EditorPreferences } from '@theia/editor/lib/browser/editor-preferences'; +import type { + EditorPreferenceChange, + EditorPreferences, +} from '@theia/editor/lib/browser/editor-preferences'; import { ITextResourcePropertiesService } from '@theia/monaco-editor-core/esm/vs/editor/common/services/textResourceConfiguration'; import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; @@ -61,6 +64,16 @@ export class MonacoTextModelService extends TheiaMonacoTextModelService { readOnly ); } + + protected override updateModel( + model: MonacoEditorModel, + change?: EditorPreferenceChange | undefined + ): void { + if (model.uri.toString() === MonitorUri.toString()) { + return; + } + super.updateModel(model, change); + } } // https://github.com/eclipse-theia/theia/pull/8491 From 845769b56f07f801024fd652bd7584e3c4ad8181 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 6 Dec 2022 14:05:49 +0100 Subject: [PATCH 24/29] fix: multiple widgets after close. header must be explicitly unmounted Signed-off-by: Akos Kitta --- .../serial/monitor/monitor-editor-factory.ts | 2 +- .../browser/serial/monitor/monitor-widget.tsx | 24 ++++++---- .../browser/theia/plugin-ext/hosted-plugin.ts | 12 ----- .../src/node/monitor-service.ts | 2 +- yarn.lock | 47 +++++++++++++------ 5 files changed, 49 insertions(+), 38 deletions(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts index 41688c771..1e6570b6d 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-editor-factory.ts @@ -69,7 +69,7 @@ export class MonitorEditorFactory extends OutputEditorFactory { folding: false, matchBrackets: 'never', renderLineHighlightOnlyWhenFocus: true, - inlayHints: { enabled: 'off', displayStyle: 'compact' }, + inlayHints: { enabled: 'off' }, }; } 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 60240e405..0699d9f6e 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -50,9 +50,6 @@ export class MonitorWidget extends BaseWidget { private readonly boardsServiceProvider: BoardsServiceProvider; @inject(FrontendApplicationStateService) private readonly appStateService: FrontendApplicationStateService; - - private readonly toDisposeOnReset: DisposableCollection; - @inject(SelectionService) private readonly selectionService: SelectionService; @inject(MonacoEditorProvider) @@ -81,6 +78,7 @@ export class MonitorWidget extends BaseWidget { private readonly contentNode: HTMLDivElement; private readonly headerRoot: Root; private readonly editorContainer: DockPanel; + private readonly toDisposeOnReset: DisposableCollection; constructor() { super(); @@ -89,10 +87,6 @@ export class MonitorWidget extends BaseWidget { this.title.iconClass = 'monitor-tab-icon'; this.title.closable = true; this.scrollOptions = undefined; - this.toDisposeOnReset = new DisposableCollection(); - this.toDispose.push( - Disposable.create(() => this.monitorManagerProxy.disconnect()) - ); this.contentNode = document.createElement('div'); this.contentNode.classList.add('content'); const headerNode = document.createElement('div'); @@ -107,11 +101,15 @@ export class MonitorWidget extends BaseWidget { this.editorContainer.addClass('editor-container'); this.editorContainer.node.tabIndex = -1; this.lineNumber2Timestamp = {}; + this.toDisposeOnReset = new DisposableCollection(); } @postConstruct() protected init(): void { - this.toDispose.pushAll([ + this.toDisposeOnReset.dispose(); + this.toDisposeOnReset.pushAll([ + Disposable.create(() => this.monitorManagerProxy.disconnect()), + Disposable.create(() => this.headerRoot.unmount()), Disposable.create(() => this.monitorManagerProxy.disconnect()), Disposable.create(() => this.clearConsole()), this.preference.onPreferenceChanged(({ preferenceName, newValue }) => { @@ -160,6 +158,10 @@ export class MonitorWidget extends BaseWidget { ); } + reset(): void { + this.init(); + } + async clearConsole(): Promise { return this.resourceProvider.resource.reset(); } @@ -314,7 +316,11 @@ export class MonitorWidget extends BaseWidget { const widget = await this.createEditorWidget(); this.editorContainer.addWidget(widget); this.toDispose.pushAll([ - Disposable.create(() => widget.close()), + Disposable.create(() => { + this.editorContainer.layout?.removeWidget(widget); + widget.close(); + widget.dispose(); + }), Disposable.create(() => (this.textModel = undefined)), ]); if (!preserveFocus) { 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 020e78781..5928655d7 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 @@ -12,7 +12,6 @@ import { MonacoBulkEditService } from '@theia/monaco/lib/browser/monaco-bulk-edi import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; import { MonacoEditorService } from '@theia/monaco/lib/browser/monaco-editor-service'; import { MonacoLanguages } from '@theia/monaco/lib/browser/monaco-languages'; -import { ConnectionImpl } from '@theia/plugin-ext/lib/common/connection'; import { PLUGIN_RPC_CONTEXT } from '@theia/plugin-ext/lib/common/plugin-api-rpc'; import { HostedPluginServer } from '@theia/plugin-ext/lib/common/plugin-protocol'; import { RPCProtocol } from '@theia/plugin-ext/lib/common/rpc-protocol'; @@ -27,7 +26,6 @@ import { setUpPluginApi } from '@theia/plugin-ext/lib/main/browser/main-context' import { EditorModelService } from '@theia/plugin-ext/lib/main/browser/text-editor-model-service'; import { TextEditorsMainImpl } from '@theia/plugin-ext/lib/main/browser/text-editors-main'; import { MonitorUri } from '../../serial/monitor/monitor-uri'; -import { DebugMainImpl } from './debug-main'; const originalOnModelAdded = DocumentsMainImpl.prototype['onModelAdded']; const originalOnModelRemoved = DocumentsMainImpl.prototype['onModelRemoved']; @@ -92,7 +90,6 @@ export class HostedPluginSupport extends TheiaHostedPluginSupport { const rpc = host === 'frontend' ? new PluginWorker().rpc : this.createServerRpc(host); setUpPluginApi(rpc, this.container); - this.patchDebugMain(rpc); this.patchDocumentsMain(rpc); this.mainPluginApiProviders .getContributions() @@ -100,15 +97,6 @@ export class HostedPluginSupport extends TheiaHostedPluginSupport { 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); - } - private patchDocumentsMain(rpc: RPCProtocol): void { const editorsAndDocuments = new EditorsAndDocumentsMain( rpc, diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index 76b87fd31..9b85bed76 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -97,7 +97,7 @@ export class MonitorService extends CoreClientAware implements Disposable { private readonly board: Board; private readonly port: Port; private readonly monitorID: string; - private readonly streamingTextDecoder = new TextDecoder('utf8'); + // private readonly streamingTextDecoder = new TextDecoder('utf8'); /** * The lightweight representation of the port configuration currently in use for the running monitor. diff --git a/yarn.lock b/yarn.lock index a55bbc173..b4676ea27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -876,14 +876,12 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@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.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": +"@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.7.2", "@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== @@ -3530,14 +3528,16 @@ 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== +"@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/react" "*" + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" -"@types/react@*", "@types/react@^18.0.15": +"@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== @@ -5548,7 +5548,7 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -clsx@^1.1.0: +clsx@^1.0.4, 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== @@ -6532,7 +6532,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-helpers@^5.0.1: +dom-helpers@^5.0.1, dom-helpers@^5.1.3: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== @@ -13065,6 +13065,11 @@ 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@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-6.0.3.tgz#625ec767fa321d91801129387e7d31ee0cb99254" @@ -13133,6 +13138,18 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" +react-virtualized@^9.22.3: + version "9.22.5" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.5.tgz#bfb96fed519de378b50d8c0064b92994b3b91620" + integrity sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ== + 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 1880fe9c71e546aa6619a0a2e501450ddd9204e6 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 27 Apr 2023 17:05:32 +0200 Subject: [PATCH 25/29] fix: widget lifecycle + use new `connectionStatus` Signed-off-by: Akos Kitta --- .../browser/serial/monitor/monitor-view-contribution.tsx | 2 +- .../src/browser/serial/monitor/monitor-widget.tsx | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) 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 38fb6098c..652178b6e 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 @@ -180,7 +180,7 @@ export class MonitorViewContribution protected async toggle(): Promise { const widget = this.tryGetWidget(); if (widget) { - widget.dispose(); + widget.close(); } else { await this.openView({ activate: true, reveal: true }); } 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 0699d9f6e..ad61a82f4 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -102,6 +102,7 @@ export class MonitorWidget extends BaseWidget { this.editorContainer.node.tabIndex = -1; this.lineNumber2Timestamp = {}; this.toDisposeOnReset = new DisposableCollection(); + this.toDispose.push(Disposable.create(() => this.headerRoot.unmount())); } @postConstruct() @@ -109,7 +110,6 @@ export class MonitorWidget extends BaseWidget { this.toDisposeOnReset.dispose(); this.toDisposeOnReset.pushAll([ Disposable.create(() => this.monitorManagerProxy.disconnect()), - Disposable.create(() => this.headerRoot.unmount()), Disposable.create(() => this.monitorManagerProxy.disconnect()), Disposable.create(() => this.clearConsole()), this.preference.onPreferenceChanged(({ preferenceName, newValue }) => { @@ -128,7 +128,7 @@ export class MonitorWidget extends BaseWidget { }), this.monitorModel.onChange(({ property }) => { switch (property) { - case 'connected': { + case 'connectionStatus': { this.handleDidChangeConnected(); break; } @@ -166,6 +166,11 @@ export class MonitorWidget extends BaseWidget { return this.resourceProvider.resource.reset(); } + override dispose(): void { + this.toDisposeOnReset.dispose(); + super.dispose(); + } + get text(): string | undefined { return this.editor?.getControl().getModel()?.getValue(); } From c42a34ea3d92f6190457662d05e1238c375a1a31 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Thu, 27 Apr 2023 17:41:42 +0200 Subject: [PATCH 26/29] fix: docMain patching: dispose original Signed-off-by: Akos Kitta --- .../browser/theia/plugin-ext/hosted-plugin.ts | 98 +- yarn.lock | 933 +----------------- 2 files changed, 35 insertions(+), 996 deletions(-) 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 5928655d7..4ef0dccae 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,59 +1,23 @@ -import { - Emitter, - Event, - JsonRpcProxy, - UntitledResourceResolver, -} from '@theia/core'; -import { ApplicationShell, OpenerService } from '@theia/core/lib/browser'; +import { Emitter, Event, JsonRpcProxy } from '@theia/core'; import { injectable, interfaces } from '@theia/core/shared/inversify'; -import { EditorManager } from '@theia/editor/lib/browser'; import * as monaco from '@theia/monaco-editor-core'; -import { MonacoBulkEditService } from '@theia/monaco/lib/browser/monaco-bulk-edit-service'; import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; -import { MonacoEditorService } from '@theia/monaco/lib/browser/monaco-editor-service'; -import { MonacoLanguages } from '@theia/monaco/lib/browser/monaco-languages'; import { PLUGIN_RPC_CONTEXT } from '@theia/plugin-ext/lib/common/plugin-api-rpc'; import { HostedPluginServer } from '@theia/plugin-ext/lib/common/plugin-protocol'; -import { RPCProtocol } from '@theia/plugin-ext/lib/common/rpc-protocol'; +import { RpcInvocationHandler } from '@theia/plugin-ext/lib/common/proxy-handler'; +import { + RPCProtocol, + RPCProtocolImpl, +} 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 { DocumentsMainImpl } from '@theia/plugin-ext/lib/main/browser/documents-main'; -import { EditorsAndDocumentsMain } from '@theia/plugin-ext/lib/main/browser/editors-and-documents-main'; import { setUpPluginApi } from '@theia/plugin-ext/lib/main/browser/main-context'; -import { EditorModelService } from '@theia/plugin-ext/lib/main/browser/text-editor-model-service'; -import { TextEditorsMainImpl } from '@theia/plugin-ext/lib/main/browser/text-editors-main'; import { MonitorUri } from '../../serial/monitor/monitor-uri'; -const originalOnModelAdded = DocumentsMainImpl.prototype['onModelAdded']; -const originalOnModelRemoved = DocumentsMainImpl.prototype['onModelRemoved']; -const originalOnModelChanged = DocumentsMainImpl.prototype['onModelChanged']; -DocumentsMainImpl.prototype['onModelAdded'] = function (event: { - model: MonacoEditorModel; - oldModeId: string; -}) { - if (event.model.uri.toString() === MonitorUri.toString()) { - return; - } - originalOnModelAdded.bind(this)(event); -}; -DocumentsMainImpl.prototype['onModelRemoved'] = function (uri: monaco.Uri) { - if (uri.toString() === MonitorUri.toString()) { - return; - } - return originalOnModelRemoved.bind(this)(uri); -}; -DocumentsMainImpl.prototype['onModelChanged'] = function ( - model: MonacoEditorModel -) { - if (model.uri.toString() === MonitorUri.toString()) { - return; - } - originalOnModelChanged.bind(this)(model); -}; - @injectable() export class HostedPluginSupport extends TheiaHostedPluginSupport { private readonly onDidLoadEmitter = new Emitter(); @@ -98,30 +62,36 @@ export class HostedPluginSupport extends TheiaHostedPluginSupport { } private patchDocumentsMain(rpc: RPCProtocol): void { - const editorsAndDocuments = new EditorsAndDocumentsMain( - rpc, - this.container + const handler: RpcInvocationHandler = (rpc)['locals'].get( + PLUGIN_RPC_CONTEXT.DOCUMENTS_MAIN.id ); + const documentsMain: DocumentsMainImpl = handler.target; - const documentsMain = new DocumentsMainImpl( - editorsAndDocuments, - this.container.get(EditorModelService), - rpc, - this.container.get(EditorManager), - this.container.get(OpenerService), - this.container.get(ApplicationShell), - this.container.get(UntitledResourceResolver), - this.container.get(MonacoLanguages) - ); - rpc.set(PLUGIN_RPC_CONTEXT.DOCUMENTS_MAIN, documentsMain); + const originalOnModelAdded = documentsMain['onModelAdded']; + documentsMain['onModelAdded'] = function (event: { + model: MonacoEditorModel; + oldModeId: string; + }) { + if (event.model.uri.toString() === MonitorUri.toString()) { + return; + } + originalOnModelAdded.bind(this)(event); + }; - const editorsMain = new TextEditorsMainImpl( - editorsAndDocuments, - documentsMain, - rpc, - this.container.get(MonacoBulkEditService), - this.container.get(MonacoEditorService) - ); - rpc.set(PLUGIN_RPC_CONTEXT.TEXT_EDITORS_MAIN, editorsMain); + const originalOnModelChanged = documentsMain['onModelChanged']; + documentsMain['onModelChanged'] = function (model: MonacoEditorModel) { + if (model.uri.toString() === MonitorUri.toString()) { + return; + } + originalOnModelChanged.bind(this)(model); + }; + + const originalOnModelRemoved = documentsMain['onModelRemoved']; + documentsMain['onModelRemoved'] = function (uri: monaco.Uri) { + if (uri.toString() === MonitorUri.toString()) { + return; + } + return originalOnModelRemoved.bind(documentsMain)(uri); + }; } } diff --git a/yarn.lock b/yarn.lock index b4676ea27..51b4a8d45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1079,11 +1079,7 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -<<<<<<< HEAD "@grpc/grpc-js@^1.8.14": -======= -"@grpc/grpc-js@^1.8.12": ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -2084,29 +2080,17 @@ dependencies: defer-to-connect "^2.0.1" -<<<<<<< HEAD "@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.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.37.0-next.22.tgz#24ca959505a91433d6f6b3be8a8ab054a2a78639" - integrity sha512-rVabjWKIMo3iTbOWH+ge+jLgqRr7LXGBFz0HdQcTBEs8z/qc7zGL2RTsZFD+2Up4FTLSdny5nMA8TfpdMry6CA== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" -<<<<<<< HEAD "@theia/application-package" "1.37.0" "@theia/ffmpeg" "1.37.0" -======= - "@theia/application-package" "1.37.0-next.22+0e0e9ee4b" - "@theia/ffmpeg" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/fs-extra" "^4.0.2" "@types/semver" "^7.3.8" babel-loader "^8.2.2" @@ -2134,21 +2118,12 @@ worker-loader "^3.0.8" yargs "^15.3.1" -<<<<<<< HEAD "@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" -======= -"@theia/application-package@1.37.0-next.22", "@theia/application-package@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.37.0-next.22.tgz#820b03c7508b45f4b0a58678caad076571c1c2e5" - integrity sha512-swh6ReVt+Lxw2CF4RtDBNYslxRjMd3HqLIPFCRGR49Rh0hCLPt2VbWLrGOUKZOauGcEi9SilRPIEHF8rWQ3+8w== - dependencies: - "@theia/request" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/fs-extra" "^4.0.2" "@types/semver" "^5.4.0" "@types/write-json-file" "^2.2.1" @@ -2160,7 +2135,6 @@ semver "^5.4.1" write-json-file "^2.2.0" -<<<<<<< HEAD "@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" @@ -2193,40 +2167,6 @@ "@theia/localization-manager" "1.37.0" "@theia/ovsx-client" "1.37.0" "@theia/request" "1.37.0" -======= -"@theia/bulk-edit@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.37.0-next.22.tgz#59bc77a15aed4082a65e499da5fa08d9b2bec619" - integrity sha512-bLp8FYbLmxlvL4XdFgwYhb+0wHzkNyTx9V9sUEgaIiSFPSc4VmXijFX+L2SW1WnmYjflVkTyXkUNsgvbJQUglw== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" - -"@theia/callhierarchy@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.37.0-next.22.tgz#aef0f1a2a11e7e69ec1aad9785fd37e39180867a" - integrity sha512-vgdqYgs7d1hvgTqH8uqXpBK89qNEv2gYe0U3HuacCEqXhu+bIWh4aUCr4VOBEInHgjPaxEq6vZqg7BuEiLaxPw== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - ts-md5 "^1.2.2" - -"@theia/cli@1.37.0-next.22": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.37.0-next.22.tgz#51503dbc80765303989bea11a94400d25d820f49" - integrity sha512-UI7H/uMIb7RNznWLAv33aUvp6uBwWcPRvNVxA44+DrCNZTQkMnHEVg7EM+/b5vWMsZyZiOWE7MHzizAhyYxczA== - dependencies: - "@theia/application-manager" "1.37.0-next.22+0e0e9ee4b" - "@theia/application-package" "1.37.0-next.22+0e0e9ee4b" - "@theia/ffmpeg" "1.37.0-next.22+0e0e9ee4b" - "@theia/localization-manager" "1.37.0-next.22+0e0e9ee4b" - "@theia/ovsx-client" "1.37.0-next.22+0e0e9ee4b" - "@theia/request" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/chai" "^4.2.7" "@types/mocha" "^10.0.0" "@types/node-fetch" "^2.5.7" @@ -2244,7 +2184,6 @@ temp "^0.9.1" yargs "^15.3.1" -<<<<<<< HEAD "@theia/console@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.37.0.tgz#87144273a6550aef1a755cae19786feb352a0a91" @@ -2259,22 +2198,6 @@ 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/console@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.37.0-next.22.tgz#7c5cd15f361b3aa618dd99ce9fced92b8034eeca" - integrity sha512-NkxwYo/aWt42F9TcdMvHRNMUqyWiqB5409+xi0nVSftbMus1KjgWpnvlwUOLtUvJ2c4RDxv/ULW8TOsoWY2gyg== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - anser "^2.0.1" - -"@theia/core@1.37.0-next.22", "@theia/core@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.37.0-next.22.tgz#bf334fe3945dd6b58406ecdb4c676e5e5fa7d22f" - integrity sha512-hZNPaTQHVAhy/Vg1CR7Kwi1YmD5u9uXECFezmKHfbH7vhq6JL7wA3gRSyKE3AV+4YgbDaJBtwz1zOpmk/yzSng== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@babel/runtime" "^7.10.0" "@phosphor/algorithm" "1" @@ -2287,13 +2210,8 @@ "@phosphor/signaling" "1" "@phosphor/virtualdom" "1" "@phosphor/widgets" "1" -<<<<<<< HEAD "@theia/application-package" "1.37.0" "@theia/request" "1.37.0" -======= - "@theia/application-package" "1.37.0-next.22+0e0e9ee4b" - "@theia/request" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/body-parser" "^1.16.4" "@types/cookie" "^0.3.3" "@types/dompurify" "^2.2.2" @@ -2349,7 +2267,6 @@ ws "^7.1.2" yargs "^15.3.1" -<<<<<<< HEAD "@theia/debug@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.37.0.tgz#87e45c73cc271a01a4ad8d0e536157f1209f5237" @@ -2368,32 +2285,11 @@ "@theia/terminal" "1.37.0" "@theia/variable-resolver" "1.37.0" "@theia/workspace" "1.37.0" -======= -"@theia/debug@1.37.0-next.22", "@theia/debug@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.37.0-next.22.tgz#98f36721bd315ea69e69b928ed46d97e4a7f7bbf" - integrity sha512-7IYapbuKLq3ejeWQpkYqMIupugw6GsLx29hUWPOMXp1lfuZSVJlABxabbZEjgb+3uLIsOaK+ZZoaq19R+7Ez+w== - dependencies: - "@theia/console" "1.37.0-next.22+0e0e9ee4b" - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/markers" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - "@theia/output" "1.37.0-next.22+0e0e9ee4b" - "@theia/process" "1.37.0-next.22+0e0e9ee4b" - "@theia/task" "1.37.0-next.22+0e0e9ee4b" - "@theia/terminal" "1.37.0-next.22+0e0e9ee4b" - "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@vscode/debugprotocol" "^1.51.0" fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" -<<<<<<< HEAD "@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" @@ -2415,50 +2311,19 @@ version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.37.0.tgz#a44608fad9a7ad62a0dd6cd657d62db6ad3015e6" integrity sha512-d3aQ0E8g0FmVpT99fgrzRFpN9bl5LoIzEzwTTTFUOsDIN/TwGJ+AFmi1UpGn6nBMaszz1JClcrguuYvdJf3Djg== -======= -"@theia/editor-preview@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.37.0-next.22.tgz#aec6decc4c0b88c78659d406005552fa640eafcd" - integrity sha512-hzqinUcrvM3Q3KZf/9jWepnUlAJ6JTvku7wAXNRpimE4BjyBR1DrZyPkYl3Eqa/wuFTB9bOnNMgwjtJf/l3wJA== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" - -"@theia/editor@1.37.0-next.22", "@theia/editor@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.37.0-next.22.tgz#9722770a1df4676acf4e66f7d6452d59b9d2ea52" - integrity sha512-mKT+rg+8hNY4W/Olbz9iknohc7R2rYqTdo9KbXKj8eyJuCOETLuK7QErgplGRJZEugqXnMRjs6VgDclQ9E0SEA== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" - -"@theia/electron@1.37.0-next.22": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.37.0-next.22.tgz#56b1f45352f2a3438056e712f73b90b834381532" - integrity sha512-kxSBqpTquAhQ5XoeEYp+lOHJ7dk9rC5wdd2Afbl60MgQpQS2OiFexPT+cwAc7Pxn+PWOxuA27ik3d0WORunVkA== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: electron-store "^8.0.0" fix-path "^3.0.0" native-keymap "^2.2.1" -<<<<<<< HEAD "@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.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.37.0-next.22.tgz#87e55dc24bdb64c1bb7190887cbe8804de78fe35" - integrity sha512-FUeP1q9T9gc8vYPgHaKbdXNEdkUZxLnRcJvQHD3CWPU1ODvuDfcItoeVUlZfrWdAQ+dM7WWipsaqNDGN+Nwtdg== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@electron/get" "^2.0.0" unzipper "^0.9.11" -<<<<<<< HEAD "@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" @@ -2477,26 +2342,6 @@ integrity sha512-RI7T6hzYxLA7q3QYOdjg8NPOj9RJrBCEQ7W2+njYKLoQejXRYP2pe4lqzERT2IZC23ZA79OrXLp166YMXO/rHA== dependencies: "@theia/core" "1.37.0" -======= -"@theia/file-search@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.37.0-next.22.tgz#d586ee881b7877fac2556d4ad458d3d4f173f4cc" - integrity sha512-PZIVKq/43GrmJ+EfWlBnA25Z6OfV9hzev7zFy7F31sunRKdD0mip3UM2VAIO359zLjztgm9+0M/foGecS8LLLg== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/process" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" - "@vscode/ripgrep" "^1.14.2" - -"@theia/filesystem@1.37.0-next.22", "@theia/filesystem@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.37.0-next.22.tgz#adf68c87df51ad44d518d4e9092051ae4219c502" - integrity sha512-LidEwT1hmIIH6AS5oj7I3pax6r5Bvj/x4KiBhzVbMj3imONBjmg9uXKaYxA2CUZtMZdSG8xliFmMd8EIUi4tmw== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/body-parser" "^1.17.0" "@types/multer" "^1.4.7" "@types/rimraf" "^2.0.2" @@ -2513,7 +2358,6 @@ uuid "^8.0.0" vscode-languageserver-textdocument "^1.0.1" -<<<<<<< HEAD "@theia/keymaps@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.37.0.tgz#ead53cd813de6a9525fc5a276f5bbb5f5aa65c9b" @@ -2530,24 +2374,6 @@ 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/keymaps@1.37.0-next.22": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.37.0-next.22.tgz#1718a3b6e6f5ca034b90268b41c567e366437984" - integrity sha512-RvFya16MmDiKXlaN4dFdMFTP3I9PEckRlXDqLprG1tqQkPDh3WUz/l1QGiBi1q0hB1tCphd3jCyQCHNi6Bj3rw== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - "@theia/preferences" "1.37.0-next.22+0e0e9ee4b" - "@theia/userstorage" "1.37.0-next.22+0e0e9ee4b" - jsonc-parser "^2.2.0" - -"@theia/localization-manager@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.37.0-next.22.tgz#7a5266f6c3c5c9dc06d12765f21c0d91d484e2f3" - integrity sha512-t/fJ/4gVsnd5+lrGvSJnaTCK0BlLrJoyTLXTB7Yri25r8MO7JppnAqqAEg0prrXlzXL7vY/Sjm4A7lBsRIv5Rg== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@types/bent" "^7.0.1" "@types/fs-extra" "^4.0.2" @@ -2558,7 +2384,6 @@ glob "^7.2.0" typescript "~4.5.5" -<<<<<<< HEAD "@theia/markers@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.37.0.tgz#ea6b36bf5a8e6a45165d31e699413595529fd8a7" @@ -2574,23 +2399,6 @@ integrity sha512-4wKPlAR9VoRqPDZ5xYysTNvMmzjabst1cd8yp1tm9DREs/0coVWsWYUdP0s0TZBE570OC0MIGQGew5VGB8p9kQ== dependencies: "@theia/core" "1.37.0" -======= -"@theia/markers@1.37.0-next.22", "@theia/markers@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.37.0-next.22.tgz#d305df95d39c33722572cede89f3f703c847d1cb" - integrity sha512-5lIOytiTwrH+3rtssX876JwPrvj8u+R1CagzAjcFwH6WUr1Hs9TkExufW568uLvfMbbFIm4IHgvLBFZFQAdB5Q== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" - -"@theia/messages@1.37.0-next.22", "@theia/messages@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.37.0-next.22.tgz#79604cdf45a8ce98fad45d8a74e8e7715dc9ba22" - integrity sha512-oXADsZfwlPVMQxD1xUnhT4TmkqGDiRJdAwsN3MoemhVASGnyX8HgU2NC+3vco08tA1nK8PGAM1UGzZJNymO0QA== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) react-perfect-scrollbar "^1.5.3" ts-md5 "^1.2.2" @@ -2599,7 +2407,6 @@ resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-1.72.3.tgz#911d674c6e0c490442a355cfaa52beec919a025e" integrity sha512-2FK5m0G5oxiqCv0ZrjucMx5fVgQ9Jqv0CgxGvSzDc4wRrauBdeBoX90J99BEIOJ8Jp3W0++GoRBdh0yQNIGL2g== -<<<<<<< HEAD "@theia/monaco@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.37.0.tgz#8bd861c3b85f9627f4e4c50d59b1231362d96298" @@ -2611,26 +2418,12 @@ "@theia/markers" "1.37.0" "@theia/monaco-editor-core" "1.72.3" "@theia/outline-view" "1.37.0" -======= -"@theia/monaco@1.37.0-next.22", "@theia/monaco@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.37.0-next.22.tgz#7474669953a87ee6f4e070ecd085081d2121aafd" - integrity sha512-wM1z53w+h9B+7QVZzeFKCENOyRxJOaLXKGp+WxIw7ETO2sH5wMlAabMu17v/XQ03I3AGGNZmGVCGRa11EUtQLg== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/markers" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - "@theia/outline-view" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) fast-plist "^0.1.2" idb "^4.0.5" jsonc-parser "^2.2.0" vscode-oniguruma "1.6.1" vscode-textmate "^7.0.3" -<<<<<<< HEAD "@theia/navigator@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.37.0.tgz#05b804479419a43042678023fa5a966be2126637" @@ -2656,38 +2449,10 @@ "@theia/core" "1.37.0" "@theia/editor" "1.37.0" "@theia/monaco" "1.37.0" -======= -"@theia/navigator@1.37.0-next.22", "@theia/navigator@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.37.0-next.22.tgz#9a0b7ba76bcf2ae601fcf0362a322df1e5a07a3b" - integrity sha512-gXNDshFcwZJf1iTNFQZ7sjmgXbV+E5oh1PdYu6FzJRIJfEN0d+3W+a2ffXD6R2IN2l4I+dwjE4jL5zONIWPs9Q== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" - minimatch "^5.1.0" - -"@theia/outline-view@1.37.0-next.22", "@theia/outline-view@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.37.0-next.22.tgz#a7f42b783b2521327abce944aa4f1f8a2943f8b5" - integrity sha512-zjPe/Q2Hb08IBENKDzak1wFsPiuhlX4RsafkquNvrfi1J7Evb8VC/cenCNH1g0t1uA3UAovzREeyUnKV0a3ORQ== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - -"@theia/output@1.37.0-next.22", "@theia/output@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.37.0-next.22.tgz#b55bb5a0fbeae5570ae5012bd0fa760448a244c7" - integrity sha512-JzY8wfMadzBxhZEcmmZM6+Svn86FzxzVWGbCN0kUC6wsc8F+tncIc5HjLcYpTia+1nClEywnyCXGfqvHBJBxtg== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@theia/monaco-editor-core" "1.72.3" "@types/p-queue" "^2.3.1" p-queue "^2.4.2" -<<<<<<< HEAD "@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" @@ -2746,66 +2511,6 @@ "@theia/typehierarchy" "1.37.0" "@theia/variable-resolver" "1.37.0" "@theia/workspace" "1.37.0" -======= -"@theia/ovsx-client@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.37.0-next.22.tgz#3f27842ac68f5b423468d04ed157acc8043863d8" - integrity sha512-A3Y5dHverYEKO5IMCWx6tR3mlw9cqupGsFrN7+3atADLpK4A2/wjWApZ4DHvTVWnmwdR6J/KUuJy8j7MpDH0ww== - dependencies: - "@theia/request" "1.37.0-next.22+0e0e9ee4b" - semver "^5.4.1" - -"@theia/plugin-ext-vscode@1.37.0-next.22": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.37.0-next.22.tgz#53b3766f90081a89785b9b1150d3ca5976997dd9" - integrity sha512-wqDTGGI8kSUXiMx5iYsm9XLfkZLt1m14zksjzQwAnS6NobaMBvB0gHttot8WRSVjNkGLKbomzaxwu/zz+DnMjA== - dependencies: - "@theia/callhierarchy" "1.37.0-next.22+0e0e9ee4b" - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" - "@theia/plugin" "1.37.0-next.22+0e0e9ee4b" - "@theia/plugin-ext" "1.37.0-next.22+0e0e9ee4b" - "@theia/terminal" "1.37.0-next.22+0e0e9ee4b" - "@theia/typehierarchy" "1.37.0-next.22+0e0e9ee4b" - "@theia/userstorage" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" - filenamify "^4.1.0" - -"@theia/plugin-ext@1.37.0-next.22", "@theia/plugin-ext@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.37.0-next.22.tgz#757607faba1c4078fb7b358c6d2c2e006a37dc00" - integrity sha512-U0Mx2T5KieNJTFB4c+aVapl1/SY/dxNE53e5BbmHqC7WUnSyPIvwLmXosyxNUToxAHob9DjM9Tm4yWqm48kc4Q== - dependencies: - "@theia/bulk-edit" "1.37.0-next.22+0e0e9ee4b" - "@theia/callhierarchy" "1.37.0-next.22+0e0e9ee4b" - "@theia/console" "1.37.0-next.22+0e0e9ee4b" - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/debug" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor-preview" "1.37.0-next.22+0e0e9ee4b" - "@theia/file-search" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/markers" "1.37.0-next.22+0e0e9ee4b" - "@theia/messages" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" - "@theia/output" "1.37.0-next.22+0e0e9ee4b" - "@theia/plugin" "1.37.0-next.22+0e0e9ee4b" - "@theia/preferences" "1.37.0-next.22+0e0e9ee4b" - "@theia/scm" "1.37.0-next.22+0e0e9ee4b" - "@theia/search-in-workspace" "1.37.0-next.22+0e0e9ee4b" - "@theia/task" "1.37.0-next.22+0e0e9ee4b" - "@theia/terminal" "1.37.0-next.22+0e0e9ee4b" - "@theia/timeline" "1.37.0-next.22+0e0e9ee4b" - "@theia/typehierarchy" "1.37.0-next.22+0e0e9ee4b" - "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@types/mime" "^2.0.1" "@vscode/debugprotocol" "^1.51.0" decompress "^4.2.1" @@ -2823,7 +2528,6 @@ vscode-proxy-agent "^0.12.0" vscode-textmate "^7.0.3" -<<<<<<< HEAD "@theia/plugin@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.37.0.tgz#e63763b87d1dc161936e388d2880b2347f5d5d26" @@ -2841,31 +2545,11 @@ "@theia/monaco-editor-core" "1.72.3" "@theia/userstorage" "1.37.0" "@theia/workspace" "1.37.0" -======= -"@theia/plugin@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.37.0-next.22.tgz#f72c52f075b241f26089ce3e7216e6657c2a035c" - integrity sha512-mMTA74sFHn+akI14pbEcjfAJCRF09G3fqKeLQB6EeDt4n8xnMRachVref+iFZJS01Dgrplk+unoJ4O8HoIrXqQ== - -"@theia/preferences@1.37.0-next.22", "@theia/preferences@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.37.0-next.22.tgz#b1fd21abfad18703ecf4a97bdd04379480d27767" - integrity sha512-H3Qrj/ALH4+jKtKnYNkD+GCGNrGyrm8C7FwQ8FAR5eoGNfDMjESFbgtdaN/nMIRVU9Y0JmOJe4PorhZHIwSYBQ== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - "@theia/userstorage" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) async-mutex "^0.3.1" fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" -<<<<<<< HEAD "@theia/process@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.37.0.tgz#ea847e52f10e16bd466003054c81cdac9af60fe8" @@ -2879,26 +2563,10 @@ version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.37.0.tgz#1925ab93f771a807ca9cee1ae68747afb0ba866d" integrity sha512-US3wrXDOs4XNxFkWeW5Sz7dTQpDS+IMQu3i2RfFAknZOgadOJvSuQkIuKtt1tqvaP/Z1nOzQ+1Enmlr5hWWUIg== -======= -"@theia/process@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.37.0-next.22.tgz#751607033dbca2b1dd23844902e901bdf34553f7" - integrity sha512-Lv6XsYAUmzTbqH60XKN3PaFpFwgjqlh234uLpad4CP9xbKdDfCd7XNsAO3CVfSFn42bqxHiJekkzCAsKgoYfVg== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - node-pty "0.11.0-beta17" - string-argv "^0.1.1" - -"@theia/request@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.37.0-next.22.tgz#3d05757d0eaa6eb49dfdb1d746d53c7c64c4c958" - integrity sha512-Zmuc+GoLZFTUWAo/9xzt9qSKT/JoRAvvPXrdm9Snraq+mcvwcZ+88E3eQieC5ueX3UsMlSHXqDZ8oWgdhlAvAQ== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" -<<<<<<< HEAD "@theia/scm@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.37.0.tgz#fd125ccabccd09e479838bbd8162dfcab51a1e80" @@ -2907,23 +2575,12 @@ "@theia/core" "1.37.0" "@theia/editor" "1.37.0" "@theia/filesystem" "1.37.0" -======= -"@theia/scm@1.37.0-next.22", "@theia/scm@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.37.0-next.22.tgz#8c788e894bd44ba7ea9d5de553d9685227909686" - integrity sha512-hu01NgOoL8UWoThAibFdtVVSs0QUqqW3A3rdTsUe/Fs1GIfwmeH3GUd15rOov+Z0XbI8r1hGVJ/urjzf6ip3/g== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) "@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" -<<<<<<< HEAD "@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" @@ -2954,43 +2611,10 @@ "@theia/userstorage" "1.37.0" "@theia/variable-resolver" "1.37.0" "@theia/workspace" "1.37.0" -======= -"@theia/search-in-workspace@1.37.0-next.22", "@theia/search-in-workspace@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.37.0-next.22.tgz#a47c1506d6202e83b30c59e1bbedf5899e9ccdf4" - integrity sha512-djFQqXtyuZuKpVNFxHXm5IF8vqDsxzD6skqewh6mJBJkLDQfj57wp/7sjRlN2qIvo+smwf0gARSjDG7Y9Rjujw== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" - "@theia/process" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" - "@vscode/ripgrep" "^1.14.2" - minimatch "^5.1.0" - -"@theia/task@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.37.0-next.22.tgz#eb46842e4f64dc6bc503e078bd47ba12f3117f29" - integrity sha512-FEprtoOy+GbWLNiDE/b7HALsQT6QJ2VFPqkv6059t0o3MgnipmG5gW1GWF75q0EfASO4/vOcCoCNpZkyGvmQpw== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/markers" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco" "1.37.0-next.22+0e0e9ee4b" - "@theia/monaco-editor-core" "1.72.3" - "@theia/process" "1.37.0-next.22+0e0e9ee4b" - "@theia/terminal" "1.37.0-next.22+0e0e9ee4b" - "@theia/userstorage" "1.37.0-next.22+0e0e9ee4b" - "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) async-mutex "^0.3.1" jsonc-parser "^2.2.0" p-debounce "^2.1.0" -<<<<<<< HEAD "@theia/terminal@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.37.0.tgz#af5e2d521d9fecaf09b5b270a8c6ddec72f9a39e" @@ -3002,24 +2626,10 @@ "@theia/process" "1.37.0" "@theia/variable-resolver" "1.37.0" "@theia/workspace" "1.37.0" -======= -"@theia/terminal@1.37.0-next.22", "@theia/terminal@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.37.0-next.22.tgz#d84c8b146082f6746267aae6348dd4bfa76e4948" - integrity sha512-YWl+xMeYQ0LQHItjjbKroXXhb2RB/pXwhVGKXnd4/9DCVX1Qwj5E5rSZLP9UOX4XExVMmqo3jIpNRDemA6wNXA== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/process" "1.37.0-next.22+0e0e9ee4b" - "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" - "@theia/workspace" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) xterm "^4.16.0" xterm-addon-fit "^0.5.0" xterm-addon-search "^0.8.2" -<<<<<<< HEAD "@theia/timeline@1.37.0": version "1.37.0" resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.37.0.tgz#5216056b14c340a6594eb41f7e4329034e244dbf" @@ -3061,49 +2671,6 @@ "@theia/core" "1.37.0" "@theia/filesystem" "1.37.0" "@theia/variable-resolver" "1.37.0" -======= -"@theia/timeline@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.37.0-next.22.tgz#3558baa77216783321ffd889496d9413749193bc" - integrity sha512-tDM0THdiwdboLfV6HYzLKKb544rVKnTzEZmEWm1e75dleaM3j4wqmG7HwS5cHnV9T5asM+/WupWMqcMpuNOTYw== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/navigator" "1.37.0-next.22+0e0e9ee4b" - -"@theia/typehierarchy@1.37.0-next.22", "@theia/typehierarchy@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.37.0-next.22.tgz#0c82e8b611e8e0983096e04bdee4aeceb1b9f1c5" - integrity sha512-3FRVGOzcAvNUqQOHlowUUbPmpjzMN49f8jm2pXiRs90SUkY4dQvqnTJ5OKif5NAW4MAdh5YGagUOOW3/3ZiV6A== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/editor" "1.37.0-next.22+0e0e9ee4b" - "@types/uuid" "^7.0.3" - uuid "^8.0.0" - -"@theia/userstorage@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.37.0-next.22.tgz#0a0e5bfc7c5d124875ca6a1f5591c63d6c9d4e86" - integrity sha512-J4MXZG2BG8NAK97tLe1Hd4Jgq2f3ztspB+cn6UwThKe1HxA1zc7zd0eJft8rw365YVkdxNNqEQq2LpkjVI3dNQ== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - -"@theia/variable-resolver@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.37.0-next.22.tgz#5a2130943a6c49d01a5463a5429543a6e56f5e1e" - integrity sha512-8FrqRzeBUDQsvqlkSYC0zlbrQhUqD2soQu055wH0laL2CpcB9YSwLPki2EArIvSQ5Nv2chNLPEOyEHv5tyB7Zw== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - -"@theia/workspace@1.37.0-next.22", "@theia/workspace@1.37.0-next.22+0e0e9ee4b": - version "1.37.0-next.22" - resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.37.0-next.22.tgz#24c9729eeddcac5f23f09a410a274ca83b1335f5" - integrity sha512-FDgsI6sUyyD7JoDjJSyF8jYHSUyYjA888U9eItvRZD8025UNk0DsWp4gO89N4KI6wS2rmUH5WbvUjqtsRt4d8w== - dependencies: - "@theia/core" "1.37.0-next.22+0e0e9ee4b" - "@theia/filesystem" "1.37.0-next.22+0e0e9ee4b" - "@theia/variable-resolver" "1.37.0-next.22+0e0e9ee4b" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) jsonc-parser "^2.2.0" valid-filename "^2.0.1" @@ -3174,18 +2741,7 @@ "@types/node" "*" "@types/responselike" "^1.0.0" -<<<<<<< HEAD "@types/chai@^4.2.7": -======= -"@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": ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "4.3.4" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== @@ -5632,17 +5188,10 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -<<<<<<< HEAD -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -======= comma-separated-tokens@^1.0.0: version "1.0.8" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) commander@^2.20.0, commander@^2.8.1: version "2.20.3" @@ -5962,8 +5511,6 @@ 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== -<<<<<<< HEAD -======= dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -5971,19 +5518,6 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cp-file@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-9.1.0.tgz#e98e30db72d57d47b5b1d444deb70d05e5684921" - integrity sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) - 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" - -<<<<<<< HEAD cp-file@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-10.0.0.tgz#bbae9ecb9f505951b862880d2901e1f56de7a4dc" @@ -6006,21 +5540,6 @@ cpy@^10.0.0: nested-error-stacks "^2.1.1" p-filter "^3.0.0" p-map "^6.0.0" -======= -cpy@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-9.0.1.tgz#7f3ad0ad5bafe0bc70645c4bb567969927cadb9f" - integrity sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg== - dependencies: - arrify "^3.0.0" - cp-file "^9.1.0" - globby "^13.1.1" - junk "^4.0.0" - micromatch "^4.0.4" - nested-error-stacks "^2.1.0" - p-filter "^3.0.0" - p-map "^5.3.0" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) create-frame@^1.0.0: version "1.0.0" @@ -6205,28 +5724,12 @@ 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== -<<<<<<< HEAD - -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" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - -======= 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== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" @@ -6332,14 +5835,6 @@ deepmerge@*, 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== -<<<<<<< HEAD -======= - -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== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) default-compare@^1.0.0: version "1.0.0" @@ -6481,14 +5976,6 @@ 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== -<<<<<<< HEAD - -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== -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dir-glob@^2.0.0: version "2.2.2" @@ -6683,17 +6170,10 @@ electron-updater@^4.6.5: lodash.isequal "^4.5.0" semver "^7.3.5" -<<<<<<< HEAD electron@^23.2.4: version "23.3.0" resolved "https://registry.yarnpkg.com/electron/-/electron-23.3.0.tgz#3e83e75d8bebe00764611c1d0c1bfa90cc197c7c" integrity sha512-DVAtptpOSxM7ycgriphSxzlkb3R92d28sFKG1hMtmPkAwHl/e87reaHXhGwyj8Xu4GY69e6yUoAJqma20w0Vgw== -======= -electron@^22.3.2: - version "22.3.6" - resolved "https://registry.yarnpkg.com/electron/-/electron-22.3.6.tgz#ab79a2da20e83b02ec9cbb22a4069468e6949b4f" - integrity sha512-/1/DivFHH5AWa/uOuqpkeg12/jjicjkBU8kYv70oeqRFwXzoyuJhgwlzER4jZXnbGjF5Nxz9900oXq/QzAViAw== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@electron/get" "^2.0.0" "@types/node" "^16.11.26" @@ -8200,11 +7680,7 @@ globby@11.1.0, globby@^11.0.1, globby@^11.0.3, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -<<<<<<< HEAD globby@^13.1.4: -======= -globby@^13.1.1: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "13.1.4" resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== @@ -8306,11 +7782,7 @@ graceful-fs@4.2.10: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -<<<<<<< HEAD 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.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: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -8530,14 +8002,6 @@ hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" -<<<<<<< HEAD -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" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== - -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -8994,8 +8458,6 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -<<<<<<< HEAD -======= is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" @@ -9009,7 +8471,6 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -9302,11 +8763,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== -<<<<<<< HEAD -is-plain-obj@^2.1.0: -======= is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -9703,11 +9160,7 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: array-includes "^3.1.5" object.assign "^4.1.3" -<<<<<<< HEAD junk@^4.0.1: -======= -junk@^4.0.0: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "4.0.1" resolved "https://registry.yarnpkg.com/junk/-/junk-4.0.1.tgz#7ee31f876388c05177fe36529ee714b07b50fbed" integrity sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ== @@ -10304,11 +9757,7 @@ macaddress@^0.2.9: resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.9.tgz#3579b8b9acd5b96b4553abf0f394185a86813cb3" integrity sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w== -<<<<<<< HEAD make-dir@3.1.0, make-dir@^3.0.2, make-dir@^3.1.0: -======= -make-dir@3.1.0, make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -10425,55 +9874,6 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" -<<<<<<< HEAD -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" - 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.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" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - -mdast-util-to-hast@^12.1.0: - 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" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" - trim-lines "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - -mdast-util-to-string@^3.1.0: - version "3.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" -======= mdast-util-definitions@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" @@ -10510,9 +9910,8 @@ mdast-util-to-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) -mdurl@^1.0.1: +mdurl@^1.0.0, 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== @@ -10578,182 +9977,6 @@ micromark@~2.11.0: resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== dependencies: -<<<<<<< HEAD - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^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== - 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== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^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== - 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== - 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== - 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" - -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== - 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== - 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== - 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== - 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== - 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== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^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== - -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== - -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== - 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== - 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== - 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== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^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== - -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== - -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== - dependencies: - "@types/debug" "^4.0.0" -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) debug "^4.0.0" parse-entities "^2.0.0" @@ -11139,14 +10362,6 @@ move-file@^2.0.0: integrity sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA== dependencies: path-exists "^4.0.0" -<<<<<<< HEAD - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) ms@2.0.0: version "2.0.0" @@ -12148,25 +11363,18 @@ p-map@4.0.0, p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -<<<<<<< HEAD p-map@^5.1.0: -======= -p-map@^5.1.0, p-map@^5.3.0: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" -<<<<<<< HEAD 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== -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) p-pipe@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" @@ -12212,11 +11420,7 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" -<<<<<<< HEAD p-timeout@^5.0.2, p-timeout@^5.1.0: -======= -p-timeout@^5.1.0: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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== @@ -12756,11 +11960,7 @@ promzard@^0.3.0: dependencies: read "1" -<<<<<<< HEAD -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: -======= 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: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -12769,19 +11969,12 @@ prop-types@^15.5.0, prop-types@^15.5.6, prop-types@^15.6.0, prop-types@^15.6.1, object-assign "^4.1.1" react-is "^16.13.1" -<<<<<<< HEAD -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== -======= property-information@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== dependencies: xtend "^4.0.0" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) proto-list@~1.2.1: version "1.2.4" @@ -13648,8 +12841,6 @@ 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== -<<<<<<< HEAD -======= dependencies: tslib "^2.1.0" @@ -13657,33 +12848,12 @@ 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== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: call-bind "^1.0.2" get-intrinsic "^1.2.0" has-symbols "^1.0.3" isarray "^2.0.5" -<<<<<<< HEAD -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - 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== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" @@ -14223,17 +13393,10 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -<<<<<<< HEAD -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== -======= space-separated-tokens@^1.1.0: version "1.1.5" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) spdx-correct@^3.0.0: version "3.2.0" @@ -14961,14 +14124,6 @@ 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== -<<<<<<< HEAD - -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) trim-newlines@^3.0.0: version "3.0.1" @@ -15248,7 +14403,6 @@ 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== -<<<<<<< HEAD dependencies: imurmurhash "^0.1.4" @@ -15259,59 +14413,6 @@ unique-string@^2.0.0: 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.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" - integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) - dependencies: - imurmurhash "^0.1.4" - -<<<<<<< HEAD -unist-util-position@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" - integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== -======= -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== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) - dependencies: - crypto-random-string "^2.0.0" - -<<<<<<< HEAD -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-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.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.1.1" -======= unist-builder@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" @@ -15355,7 +14456,6 @@ unist-util-visit@^2.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) universal-user-agent@^6.0.0: version "6.0.0" @@ -15543,19 +14643,6 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== -<<<<<<< HEAD -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - -======= ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) 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" @@ -15607,32 +14694,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== -<<<<<<< HEAD -vfile-message@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== -======= vfile-message@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^2.0.0" -<<<<<<< HEAD -vfile@^5.0.0: - version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== -======= vfile@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" @@ -15885,11 +14958,7 @@ which-typed-array@^1.1.2, which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -<<<<<<< HEAD which@1.3.1, which@^1.2.9: -======= -which@1.3.1, which@^1.2.9, which@^1.3.1: ->>>>>>> 83c13ee9 (chore: updated to Theia `1.37.0-next`) version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== From 6cb12081a060c8f17cced856888120f1a95d73c2 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 30 Jun 2023 14:03:15 +0200 Subject: [PATCH 27/29] feat: move monitor service to a child process part 1 Signed-off-by: Akos Kitta --- .../src/node/arduino-ide-backend-module.ts | 4 +- .../src/node/monitor-service.ts | 2 +- .../src/node/monitor-service/index.ts | 26 +++++++++ .../monitor-service-protocol.ts | 46 +++++++++++++++ .../monitor-service/web-socket-provider.ts | 49 ++++++++++++++++ .../monitor-settings-provider-impl.ts | 48 +++++++++------- .../web-socket/web-socket-provider-impl.ts | 56 ------------------- .../node/web-socket/web-socket-provider.ts | 11 ---- 8 files changed, 152 insertions(+), 90 deletions(-) create mode 100644 arduino-ide-extension/src/node/monitor-service/index.ts create mode 100644 arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts create mode 100644 arduino-ide-extension/src/node/monitor-service/web-socket-provider.ts delete mode 100644 arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts delete mode 100644 arduino-ide-extension/src/node/web-socket/web-socket-provider.ts 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..a8c6a4c6d 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -99,8 +99,8 @@ import { MonitorServiceFactory, MonitorServiceFactoryOptions, } from './monitor-service-factory'; -import WebSocketProviderImpl from './web-socket/web-socket-provider-impl'; -import { WebSocketProvider } from './web-socket/web-socket-provider'; +import WebSocketProviderImpl from './web-socket/web-socket-provider'; +import { WebSocketProvider } from './monitor-service/web-socket-provider'; import { ClangFormatter } from './clang-formatter'; import { FormatterPath } from '../common/protocol/formatter'; import { HostedPluginLocalizationService } from './theia/plugin-ext/hosted-plugin-localization-service'; diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index 9b85bed76..df53ee2b3 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -28,7 +28,7 @@ import { MonitorResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/monitor_pb'; import { CoreClientAware } from './core-client-provider'; -import { WebSocketProvider } from './web-socket/web-socket-provider'; +import { WebSocketProvider } from './monitor-service/web-socket-provider'; import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; import { MonitorSettingsProvider } from './monitor-settings/monitor-settings-provider'; import { diff --git a/arduino-ide-extension/src/node/monitor-service/index.ts b/arduino-ide-extension/src/node/monitor-service/index.ts new file mode 100644 index 000000000..41f26a2cd --- /dev/null +++ b/arduino-ide-extension/src/node/monitor-service/index.ts @@ -0,0 +1,26 @@ +import yargs from '@theia/core/shared/yargs'; +// import { FileSystemWatcherServiceClient } from '../../common/filesystem-watcher-protocol'; +// import { NsfwFileSystemWatcherService } from './nsfw-filesystem-service'; + +const options: { + verbose?: boolean; +} = yargs + .option('verbose', { + default: false, + alias: 'v', + type: 'boolean', + }) + .option('monitorOptions', { + alias: 'o', + type: 'string', + coerce: JSON.parse, + }).argv; + +export default ((connection) => { + const server = new NsfwFileSystemWatcherService(options); + const factory = new JsonRpcProxyFactory( + server + ); + server.setClient(factory.createProxy()); + factory.listen(connection); +}); diff --git a/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts b/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts new file mode 100644 index 000000000..88130d362 --- /dev/null +++ b/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts @@ -0,0 +1,46 @@ +import type { AddressInfo } from '@theia/core/shared/ws'; +import type { Port as ProtocolPort } from '../../common/protocol/boards-service'; +import type { MonitorSettings } from '../../common/protocol/monitor-service'; + +type Port = Pick; +type FQBN = string; + +export interface MonitorServiceOptions { + readonly daemonPort: string; // TODO: ask + readonly port: Port | undefined; + readonly fqbn: FQBN | undefined; +} + +export interface MonitorService {} + +export type MonitorDataType = 'message' | 'configuration'; +export interface MonitorData { + readonly type: MonitorDataType; + readonly data: unknown; +} + +export interface MonitorMessage extends MonitorData { + readonly type: 'message'; + readonly data: string; +} + +export interface MonitorSettingsChange extends MonitorData { + readonly type: 'configuration'; + readonly data: MonitorSettings; +} + +export interface MonitorServiceClient { + readonly options: MonitorServiceOptions; + onOpen(websocketAddress: AddressInfo): void; + onData(data: MonitorData): void; + onClose(): void; + onError(reason: unknown): void; +} + +export type MonitorServiceId = string; +export function createMonitorServiceId( + fqbn: FQBN, + port: Port +): MonitorServiceId { + return ''; +} diff --git a/arduino-ide-extension/src/node/monitor-service/web-socket-provider.ts b/arduino-ide-extension/src/node/monitor-service/web-socket-provider.ts new file mode 100644 index 000000000..1b6b2631a --- /dev/null +++ b/arduino-ide-extension/src/node/monitor-service/web-socket-provider.ts @@ -0,0 +1,49 @@ +import { Emitter } from '@theia/core/lib/common/event'; +import WebSocket from '@theia/core/shared/ws'; + +export default class WebSocketProviderImpl { + private readonly server: WebSocket.Server; + private readonly clients: WebSocket[] = []; + + private readonly onDidReceiveMessageEmitter = new Emitter(); + readonly onDidReceiveMessage = this.onDidReceiveMessageEmitter.event; + + private readonly onLastClientDidDisconnectEmitter = new Emitter(); + readonly onLastClientDidDisconnect = + this.onLastClientDidDisconnectEmitter.event; + + constructor() { + this.server = new WebSocket.Server({ port: 0 }); + this.server.on('connection', (ws) => this.addClient(ws)); + } + + private addClient(ws: WebSocket): void { + this.clients.push(ws); + ws.onclose = () => { + this.clients.splice(this.clients.indexOf(ws), 1); + if (!this.clients.length) { + this.onLastClientDidDisconnectEmitter.fire(); + } + }; + ws.onmessage = (res) => { + this.onDidReceiveMessageEmitter.fire(res.data.toString()); + }; + } + + getAddress(): ReturnType { + return this.server.address(); + } + + sendMessage(message: string): void { + for (const ws of this.clients) { + try { + ws.send(message); + } catch (err) { + console.error( + `Failed to send monitor message to client. Closing websocket. Message was: ${message}` + ); + ws.close(); + } + } + } +} 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..f402f6038 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 { promises as fs } from 'node:fs'; import { join } from 'node:path'; import { injectable, @@ -7,7 +7,6 @@ import { } from '@theia/core/shared/inversify'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { FileUri } from '@theia/core/lib/node/file-uri'; -import { promisify } from 'util'; import { MonitorSettingsProvider } from './monitor-settings-provider'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { @@ -16,6 +15,7 @@ import { } from './monitor-settings-utils'; import { ILogger } from '@theia/core'; import { PluggableMonitorSettings } from '../../common/protocol'; +import { ErrnoException } from '../utils/errors'; const MONITOR_SETTINGS_FILE = 'pluggable-monitor-settings.json'; @@ -47,7 +47,7 @@ export class MonitorSettingsProviderImpl implements MonitorSettingsProvider { ); // read existing settings - await this.readSettingsFromFS(); + this.monitorSettings = await this.readSettings(); // init is done, resolve the deferred and unblock any call that was waiting for it this.ready.resolve(); @@ -82,7 +82,7 @@ export class MonitorSettingsProviderImpl implements MonitorSettingsProvider { ); this.monitorSettings[monitorId] = newSettings; - await this.writeSettingsToFS(); + await this.writeSettings(this.monitorSettings); return newSettings; } @@ -93,33 +93,41 @@ export class MonitorSettingsProviderImpl implements MonitorSettingsProvider { return reconcileSettings(newSettings, defaultSettings); } - private async readSettingsFromFS(): Promise { - const rawJson = await promisify(fs.readFile)( - this.pluggableMonitorSettingsPath, - { + private async readSettings(): Promise< + Record + > { + let rawJson: string | undefined; + try { + rawJson = await fs.readFile(this.pluggableMonitorSettingsPath, { encoding: 'utf8', - flag: 'a+', // a+ = append and read, creating the file if it doesn't exist + }); + } catch (err) { + if (!ErrnoException.isENOENT(err)) { + throw err; } - ); - + } if (!rawJson) { - this.monitorSettings = {}; + return {}; } - try { - this.monitorSettings = JSON.parse(rawJson); - } catch (error) { + const settings = JSON.parse(rawJson); + return settings; + } catch (err) { this.logger.error( - 'Could not parse the pluggable monitor settings file. Using empty file.' + 'Could not parse the pluggable monitor settings file. Ignoring settings file.', + err ); - this.monitorSettings = {}; + return {}; } } - private async writeSettingsToFS(): Promise { - await promisify(fs.writeFile)( + private async writeSettings( + settings: Record + ): Promise { + await fs.writeFile( this.pluggableMonitorSettingsPath, - JSON.stringify(this.monitorSettings) + JSON.stringify(settings), + { encoding: 'utf8' } ); } 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 deleted file mode 100644 index b32559651..000000000 --- a/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Emitter } from '@theia/core'; -import { injectable } from '@theia/core/shared/inversify'; -import * as WebSocket from '@theia/core/shared/ws'; -import { WebSocketProvider } from './web-socket-provider'; - -@injectable() -export default class WebSocketProviderImpl implements WebSocketProvider { - protected wsClients: WebSocket[]; - protected server: WebSocket.Server; - - protected readonly onMessage = new Emitter(); - public readonly onMessageReceived = this.onMessage.event; - - protected readonly onConnectedClients = new Emitter(); - public readonly onClientsNumberChanged = this.onConnectedClients.event; - - constructor() { - this.wsClients = []; - this.server = new WebSocket.Server({ port: 0 }); - - const addClient = this.addClient.bind(this); - this.server.on('connection', addClient); - } - - private addClient(ws: WebSocket): void { - this.wsClients.push(ws); - this.onConnectedClients.fire(this.wsClients.length); - - ws.onclose = () => { - this.wsClients.splice(this.wsClients.indexOf(ws), 1); - this.onConnectedClients.fire(this.wsClients.length); - }; - - ws.onmessage = (res) => { - this.onMessage.fire(res.data.toString()); - }; - } - - getConnectedClientsNumber(): number { - return this.wsClients.length; - } - - getAddress(): WebSocket.AddressInfo { - return this.server.address() as WebSocket.AddressInfo; - } - - sendMessage(message: string): void { - this.wsClients.forEach((w) => { - try { - w.send(message); - } catch { - w.close(); - } - }); - } -} 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 deleted file mode 100644 index f5daf5b47..000000000 --- a/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Event } from '@theia/core/lib/common/event'; -import * as WebSocket from '@theia/core/shared/ws'; - -export const WebSocketProvider = Symbol('WebSocketProvider'); -export interface WebSocketProvider { - getAddress(): WebSocket.AddressInfo; - sendMessage(message: string): void; - onMessageReceived: Event; - onClientsNumberChanged: Event; - getConnectedClientsNumber(): number; -} From ecc40d4c522107b016e7d48a63abc80280d694a7 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 30 Jun 2023 16:45:38 +0200 Subject: [PATCH 28/29] feat: move monitor service to a child process Signed-off-by: Akos Kitta --- .../src/browser/notification-center.ts | 4 +- .../theia/core/connection-status-service.ts | 10 +- .../src/common/protocol/arduino-daemon.ts | 8 +- .../common/protocol/notification-service.ts | 2 +- .../src/node/arduino-daemon-impl.ts | 32 +-- .../src/node/arduino-ide-backend-module.ts | 7 - .../src/node/core-client-provider.ts | 214 ++++++++++-------- .../src/node/monitor-service/index.ts | 35 +-- .../monitor-service-protocol.ts | 22 +- .../monitor-service-server.ts} | 188 ++++++++------- .../monitor-service/web-socket-provider.ts | 38 +++- .../src/node/notification-service-server.ts | 2 +- .../src/test/node/arduino-daemon-impl.test.ts | 2 +- .../src/test/node/test-bindings.ts | 2 +- 14 files changed, 325 insertions(+), 241 deletions(-) rename arduino-ide-extension/src/node/{monitor-service.ts => monitor-service/monitor-service-server.ts} (85%) diff --git a/arduino-ide-extension/src/browser/notification-center.ts b/arduino-ide-extension/src/browser/notification-center.ts index 96c938d25..9825833fa 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(); private readonly indexUpdateDidFailEmitter = new Emitter(); - private readonly daemonDidStartEmitter = new Emitter(); + private readonly daemonDidStartEmitter = new Emitter(); private readonly daemonDidStopEmitter = new Emitter(); private readonly configDidChangeEmitter = new Emitter(); 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 b38f8d084..5db0dbf1e 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(); - private _port: string | undefined; + private readonly onPortDidChangeEmitter = new Emitter(); + 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 { + get onDidChangePort(): Event { 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; + getPort(): Promise; /** * 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; - start(): Promise; + tryGetPort(): Promise; + start(): Promise; stop(): Promise; - restart(): Promise; + restart(): Promise; } diff --git a/arduino-ide-extension/src/common/protocol/notification-service.ts b/arduino-ide-extension/src/common/protocol/notification-service.ts index eba8f798e..44e43cd14 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-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 0e48f3c60..d3890aa5e 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(); + private readonly onDaemonStartedEmitter = new Emitter(); private readonly onDaemonStoppedEmitter = new Emitter(); private _running = false; - private _port = new Deferred(); + private _port = new Deferred(); // Backend application lifecycle. @@ -53,18 +53,18 @@ export class ArduinoDaemonImpl // Daemon API - async getPort(): Promise { + async getPort(): Promise { return this._port.promise; } - async tryGetPort(): Promise { + async tryGetPort(): Promise { if (this._running) { return this._port.promise; } return undefined; } - async start(): Promise { + async start(): Promise { try { this.toDispose.dispose(); // This will `kill` the previously started daemon process, if any. const cliPath = this.getExecPath(); @@ -117,13 +117,13 @@ export class ArduinoDaemonImpl this.toDispose.dispose(); } - async restart(): Promise { + async restart(): Promise { return this.start(); } // Backend only daemon API - get onDaemonStarted(): Event { + get onDaemonStarted(): Event { return this.onDaemonStartedEmitter.event; } @@ -166,11 +166,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 = { shell: true }; const daemon = spawn(`"${cliPath}"`, args, options); @@ -188,7 +188,7 @@ export class ArduinoDaemonImpl return; } - let port = ''; + let port: number | undefined = undefined; let address = ''; message .split('\n') @@ -197,7 +197,11 @@ export class ArduinoDaemonImpl try { const parsedLine = JSON.parse(line); if ('Port' in parsedLine) { - port = parsedLine.Port; + const maybePort = parsedLine.Port; + const parsedPort = Number.parseInt(maybePort, 10); + if (!Number.isNaN(parsedPort)) { + port = parsedPort; + } } if ('IP' in parsedLine) { address = parsedLine.IP; @@ -207,7 +211,7 @@ export class ArduinoDaemonImpl } }); - if (port.length && address.length) { + if (typeof port === 'number' && address.length) { grpcServerIsReady = true; ready.resolve({ daemon, port }); } @@ -239,7 +243,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); @@ -252,7 +256,7 @@ export class ArduinoDaemonImpl } this._running = false; this._port.reject(); // Reject all pending. - this._port = new Deferred(); + this._port = new Deferred(); this.onDaemonStoppedEmitter.fire(); this.notificationService.notifyDaemonDidStop(); } 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 a8c6a4c6d..68b5be467 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -92,15 +92,12 @@ import { MonitorManagerProxyClient, MonitorManagerProxyPath, } from '../common/protocol/monitor-service'; -import { MonitorService, MonitorServiceName } from './monitor-service'; import { MonitorSettingsProvider } from './monitor-settings/monitor-settings-provider'; import { MonitorSettingsProviderImpl } from './monitor-settings/monitor-settings-provider-impl'; import { MonitorServiceFactory, MonitorServiceFactoryOptions, } from './monitor-service-factory'; -import WebSocketProviderImpl from './web-socket/web-socket-provider'; -import { WebSocketProvider } from './monitor-service/web-socket-provider'; import { ClangFormatter } from './clang-formatter'; import { FormatterPath } from '../common/protocol/formatter'; import { HostedPluginLocalizationService } from './theia/plugin-ext/hosted-plugin-localization-service'; @@ -252,9 +249,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(MonitorSettingsProviderImpl).toSelf().inSingletonScope(); bind(MonitorSettingsProvider).toService(MonitorSettingsProviderImpl); - bind(WebSocketProviderImpl).toSelf(); - bind(WebSocketProvider).toService(WebSocketProviderImpl); - bind(MonitorServiceFactory).toFactory( ({ container }) => (options: MonitorServiceFactoryOptions) => { @@ -346,7 +340,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { 'config', // Logger for the CLI config reading and manipulation 'sketches-service', // For creating, loading, and cloning sketches MonitorManagerName, // Logger for the monitor manager and its services - MonitorServiceName, ].forEach((name) => bindChildLogger(bind, name)); // Cloud sketchbook bindings diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index 28e8f028c..99da8ed7d 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -128,10 +128,9 @@ export class CoreClientProvider { /** * Encapsulates both the gRPC core client creation (`CreateRequest`) and initialization (`InitRequest`). */ - private async create(port: string): Promise { + private async create(port: number): Promise { this.closeClient(); - const address = this.address(port); - const client = await this.createClient(address); + const client = await createCoreClient(port); this.toDisposeOnCloseClient.pushAll([ Disposable.create(() => client.client.close()), ]); @@ -195,74 +194,12 @@ export class CoreClientProvider { return this.toDisposeOnCloseClient.dispose(); } - private async createClient( - address: string - ): Promise { - // 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; - - const instance = await new Promise((resolve, reject) => { - client.create(new CreateRequest(), (err, resp) => { - if (err) { - reject(err); - return; - } - const instance = resp.getInstance(); - if (!instance) { - reject( - new Error( - '`CreateResponse` was OK, but the retrieved `instance` was `undefined`.' - ) - ); - return; - } - resolve(instance); - }); - }); - - return { instance, client }; - } - - private async initInstance({ - client, - instance, - }: CoreClientProvider.Client): Promise { - return new Promise((resolve, reject) => { - const errors: RpcStatus[] = []; - client - .init(new InitRequest().setInstance(instance)) - .on('data', (resp: InitResponse) => { - // XXX: The CLI never sends `initProgress`, it's always `error` or nothing. Is this a CLI bug? - // According to the gRPC API, the CLI should send either a `TaskProgress` or a `DownloadProgress`, but it does not. - const error = resp.getError(); - if (error) { - const { code, message } = Status.toObject(false, error); - console.error( - `Detected an error response during the gRPC core client initialization: code: ${code}, message: ${message}` - ); - errors.push(error); - } - }) - .on('error', reject) - .on('end', async () => { - const error = await this.evaluateErrorStatus(errors); - if (error) { - reject(error); - return; - } - resolve(); - }); - }); + private async initInstance( + coreClient: CoreClientProvider.Client + ): Promise { + return initInstance(coreClient, (status) => + this.evaluateErrorStatus(status) + ); } private async evaluateErrorStatus( @@ -406,33 +343,6 @@ export class CoreClientProvider { this.notificationService.notifyIndexUpdateDidComplete(params), }); } - - private address(port: string): string { - return `localhost:${port}`; - } - - private get channelOptions(): Record { - 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) { - return this._version; - } - const json = require('../../package.json'); - if ('version' in json) { - this._version = json.version; - } - if (!this._version) { - this._version = '0.0.0'; - } - return this._version; - } } export namespace CoreClientProvider { export interface Client { @@ -561,3 +471,111 @@ function evaluate( const status = RpcStatus.toObject(false, subject); return predicate(status); } + +let _version: string | undefined = undefined; +function version(): string { + if (_version) { + return _version; + } + const json = require('../../package.json'); + if ('version' in json) { + _version = json.version; + } + if (!_version) { + _version = '0.0.0'; + } + return _version; +} + +function localhost(port: number): string { + return `localhost:${port}`; +} + +const defaultChannelOptions = { + 'grpc.max_send_message_length': 512 * 1024 * 1024, + 'grpc.max_receive_message_length': 512 * 1024 * 1024, + 'grpc.primary_user_agent': `arduino-ide/${version()}`, +}; +export async function createCoreClient( + /** + * If `number`, it's the port, and the host will be `localhost`. Otherwise the address string. + */ + addressOrPort: string | number, + channelOptions: Record = defaultChannelOptions +): Promise { + // 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( + typeof addressOrPort === 'number' + ? localhost(addressOrPort) + : addressOrPort, + grpc.credentials.createInsecure(), + channelOptions + ) as ArduinoCoreServiceClient; + + const instance = await new Promise((resolve, reject) => { + client.create(new CreateRequest(), (err, resp) => { + if (err) { + reject(err); + return; + } + const instance = resp.getInstance(); + if (!instance) { + reject( + new Error( + '`CreateResponse` was OK, but the retrieved `instance` was `undefined`.' + ) + ); + return; + } + resolve(instance); + }); + }); + + return { instance, client }; +} + +export type EvaluateErrorStatus = ( + status: RpcStatus[] +) => Promise; +export const strictStatusEvaluator = async (status: RpcStatus[]) => { + const first = status.slice().shift(); + return first ? new Error(first.toObject(false).message) : undefined; +}; + +export async function initInstance( + { client, instance }: CoreClientProvider.Client, + evaluateErrorStatus: EvaluateErrorStatus = strictStatusEvaluator +): Promise { + return new Promise((resolve, reject) => { + const errors: RpcStatus[] = []; + client + .init(new InitRequest().setInstance(instance)) + .on('data', (resp: InitResponse) => { + // XXX: The CLI never sends `initProgress`, it's always `error` or nothing. Is this a CLI bug? + // According to the gRPC API, the CLI should send either a `TaskProgress` or a `DownloadProgress`, but it does not. + const error = resp.getError(); + if (error) { + const { code, message } = Status.toObject(false, error); + console.error( + `Detected an error response during the gRPC core client initialization: code: ${code}, message: ${message}` + ); + errors.push(error); + } + }) + .on('error', reject) + .on('end', async () => { + const error = await evaluateErrorStatus(errors); + if (error) { + reject(error); + return; + } + resolve(); + }); + }); +} diff --git a/arduino-ide-extension/src/node/monitor-service/index.ts b/arduino-ide-extension/src/node/monitor-service/index.ts index 41f26a2cd..76a04b450 100644 --- a/arduino-ide-extension/src/node/monitor-service/index.ts +++ b/arduino-ide-extension/src/node/monitor-service/index.ts @@ -1,26 +1,31 @@ +import { JsonRpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory'; +import { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol'; import yargs from '@theia/core/shared/yargs'; -// import { FileSystemWatcherServiceClient } from '../../common/filesystem-watcher-protocol'; -// import { NsfwFileSystemWatcherService } from './nsfw-filesystem-service'; +import { + MonitorServiceClient, + MonitorServiceOptions, +} from './monitor-service-protocol'; +import { MonitorService } from './monitor-service-server'; -const options: { - verbose?: boolean; -} = yargs - .option('verbose', { - default: false, - alias: 'v', - type: 'boolean', - }) +const options = yargs .option('monitorOptions', { alias: 'o', type: 'string', coerce: JSON.parse, - }).argv; + }) + .option('verbose', { + default: false, + alias: 'v', + type: 'boolean', + }).argv as unknown as { + verbose?: boolean; + monitorOptions: MonitorServiceOptions; +}; export default ((connection) => { - const server = new NsfwFileSystemWatcherService(options); - const factory = new JsonRpcProxyFactory( - server - ); + const { monitorOptions } = options; + const server = new MonitorService(monitorOptions); + const factory = new JsonRpcProxyFactory(server); server.setClient(factory.createProxy()); factory.listen(connection); }); diff --git a/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts b/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts index 88130d362..f260a883e 100644 --- a/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts +++ b/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts @@ -1,3 +1,4 @@ +import { JsonRpcServer } from '@theia/core'; import type { AddressInfo } from '@theia/core/shared/ws'; import type { Port as ProtocolPort } from '../../common/protocol/boards-service'; import type { MonitorSettings } from '../../common/protocol/monitor-service'; @@ -6,14 +7,21 @@ type Port = Pick; type FQBN = string; export interface MonitorServiceOptions { - readonly daemonPort: string; // TODO: ask + readonly daemonPort: number; readonly port: Port | undefined; readonly fqbn: FQBN | undefined; } -export interface MonitorService {} +export type MonitorServiceServer = JsonRpcServer; -export type MonitorDataType = 'message' | 'configuration'; +export interface MonitorService { + start(): Promise; + pause(): Promise; + stop(): Promise; + sendData(data: MonitorData): void; +} + +export type MonitorDataType = 'message' | 'configuration' | 'address'; export interface MonitorData { readonly type: MonitorDataType; readonly data: unknown; @@ -29,11 +37,15 @@ export interface MonitorSettingsChange extends MonitorData { readonly data: MonitorSettings; } +export interface MonitorAddressInfo extends MonitorData { + readonly type: 'address'; + readonly data: string | AddressInfo; +} + export interface MonitorServiceClient { readonly options: MonitorServiceOptions; - onOpen(websocketAddress: AddressInfo): void; onData(data: MonitorData): void; - onClose(): void; + onClose(reason?: unknown): void; onError(reason: unknown): void; } diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service/monitor-service-server.ts similarity index 85% rename from arduino-ide-extension/src/node/monitor-service.ts rename to arduino-ide-extension/src/node/monitor-service/monitor-service-server.ts index df53ee2b3..21c9d4b9f 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service/monitor-service-server.ts @@ -2,11 +2,10 @@ import { ClientDuplexStream, status } from '@grpc/grpc-js'; import { ApplicationError, Disposable, + DisposableCollection, Emitter, - ILogger, nls, } from '@theia/core'; -import { inject, named, postConstruct } from '@theia/core/shared/inversify'; import { Board, Port, @@ -18,7 +17,7 @@ import { isMonitorConnected, MonitorSettings, PluggableMonitorSettings, -} from '../common/protocol'; +} from '../../common/protocol/index'; import { EnumerateMonitorPortSettingsRequest, EnumerateMonitorPortSettingsResponse, @@ -26,20 +25,26 @@ import { MonitorPortSetting, MonitorRequest, MonitorResponse, -} from './cli-protocol/cc/arduino/cli/commands/v1/monitor_pb'; -import { CoreClientAware } from './core-client-provider'; -import { WebSocketProvider } from './monitor-service/web-socket-provider'; -import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; -import { MonitorSettingsProvider } from './monitor-settings/monitor-settings-provider'; +} from '../cli-protocol/cc/arduino/cli/commands/v1/monitor_pb'; +import { Port as RpcPort } from '../cli-protocol/cc/arduino/cli/commands/v1/port_pb'; import { Deferred, retry, timeoutReject, } from '@theia/core/lib/common/promise-util'; -import { MonitorServiceFactoryOptions } from './monitor-service-factory'; -import { ServiceError } from './service-error'; +import { ServiceError } from '../service-error'; +import { + MonitorServiceClient, + MonitorServiceOptions, + MonitorServiceServer, +} from './monitor-service-protocol'; +import WebSocketProviderImpl from './web-socket-provider'; +import { + CoreClientProvider, + createCoreClient, + initInstance, +} from '../core-client-provider'; -export const MonitorServiceName = 'monitor-service'; type DuplexHandlerKeys = | 'close' | 'end' @@ -55,16 +60,8 @@ interface DuplexHandler { const MAX_WRITE_TO_STREAM_TRIES = 10; const WRITE_TO_STREAM_TIMEOUT_MS = 30000; -export class MonitorService extends CoreClientAware implements Disposable { - @inject(ILogger) - @named(MonitorServiceName) - private readonly logger: ILogger; - - @inject(MonitorSettingsProvider) - private readonly monitorSettingsProvider: MonitorSettingsProvider; - - @inject(WebSocketProvider) - private readonly webSocketProvider: WebSocketProvider; +export class MonitorService implements Disposable, MonitorServiceServer { + private readonly webSocketProvider: WebSocketProviderImpl; // Bidirectional gRPC stream used to receive and send data from the running // pluggable monitor managed by the Arduino CLI. @@ -92,12 +89,15 @@ export class MonitorService extends CoreClientAware implements Disposable { private readonly onDisposeEmitter = new Emitter(); readonly onDispose = this.onDisposeEmitter.event; + private readonly toDisposeOnClose = new DisposableCollection(); + private _initialized = new Deferred(); private creating: Deferred; private readonly board: Board; private readonly port: Port; private readonly monitorID: string; - // private readonly streamingTextDecoder = new TextDecoder('utf8'); + private monitorClient: MonitorServiceClient | undefined; // the client is the Theia backend process, the parent of this process + private readonly coreClient: Deferred; // a dedicated core client for the monitor service process /** * The lightweight representation of the port configuration currently in use for the running monitor. @@ -108,52 +108,86 @@ export class MonitorService extends CoreClientAware implements Disposable { | MonitorPortConfiguration.AsObject | undefined; - constructor( - @inject(MonitorServiceFactoryOptions) options: MonitorServiceFactoryOptions - ) { - super(); - this.board = options.board; - this.port = options.port; - this.monitorID = options.monitorID; + constructor(private readonly options: MonitorServiceOptions) { + this.webSocketProvider = new WebSocketProviderImpl(); + this.toDisposeOnClose.pushAll([ + this.webSocketProvider, + this.webSocketProvider.onLastClientDidDisconnect(() => { + /**/ + }), + this.webSocketProvider.onDidReceiveMessage((message) => + this.getClient()?.onData({ type: 'message', data: message }) + ), + ]); + this.coreClient = new Deferred(); + this.initClient().then( + (client) => this.coreClient.resolve(client), + (reason) => this.coreClient.reject(reason) + ); } - @postConstruct() - protected init(): void { - this.onWSClientsNumberChanged = - this.webSocketProvider.onClientsNumberChanged(async (clients: number) => { - if (clients === 0) { - // There are no more clients that want to receive - // data from this monitor, we can freely close - // and dispose it. - this.dispose(); - return; - } - this.updateClientsSettings(this.settings); + private async initClient(): Promise { + const coreClient = await createCoreClient(this.options.daemonPort); + this.toDisposeOnClose.push( + Disposable.create(() => coreClient.client.close()) + ); + await initInstance(coreClient); + return coreClient; + } + + setClient(client: MonitorServiceClient | undefined): void { + if (this.monitorClient && client) { + throw new Error(`Client already set.`); + } + if (!this.monitorClient && !client) { + throw new Error(`Client is still unset`); + } + this.monitorClient = client; + if (this.monitorClient) { + this.monitorClient.onData({ + type: 'address', + data: this.webSocketProvider.getAddress(), }); + } + } - this.portMonitorSettings(this.port.protocol, this.board.fqbn!, true).then( - async (settings) => { - this.settings = { - ...this.settings, - pluggableMonitorSettings: - await this.monitorSettingsProvider.getSettings( - this.monitorID, - settings - ), - }; - this._initialized.resolve(); - } - ); + getClient(): MonitorServiceClient | undefined { + return this.monitorClient; } + // @postConstruct() + // protected init(): void { + // this.onWSClientsNumberChanged = + // this.webSocketProvider.onClientsNumberChanged(async (clients: number) => { + // if (clients === 0) { + // // There are no more clients that want to receive + // // data from this monitor, we can freely close + // // and dispose it. + // this.dispose(); + // return; + // } + // this.updateClientsSettings(this.settings); + // }); + + // this.portMonitorSettings(this.port.protocol, this.board.fqbn!, true).then( + // async (settings) => { + // this.settings = { + // ...this.settings, + // pluggableMonitorSettings: + // await this.monitorSettingsProvider.getSettings( + // this.monitorID, + // settings + // ), + // }; + // this._initialized.resolve(); + // } + // ); + // } + get initialized(): Promise { return this._initialized.promise; } - getWebsocketAddressPort(): number { - return this.webSocketProvider.getAddress().port; - } - dispose(): void { this.stop(); this.onDisposeEmitter.fire(); @@ -201,7 +235,7 @@ export class MonitorService extends CoreClientAware implements Disposable { return this.creating.promise; } - this.logger.info('starting monitor'); + console.info('starting monitor'); try { // get default monitor settings from the CLI @@ -226,7 +260,7 @@ export class MonitorService extends CoreClientAware implements Disposable { }, }; - const coreClient = await this.coreClient; + const coreClient = await this.coreClient.promise; const { instance } = coreClient; const monitorRequest = new MonitorRequest(); @@ -255,13 +289,13 @@ export class MonitorService extends CoreClientAware implements Disposable { false, config ); - this.logger.info( + console.info( `Using port configuration for ${this.port.protocol}:${ this.port.address }: ${JSON.stringify(this.currentPortConfigSnapshot)}` ); this.startMessagesHandlers(); - this.logger.info( + console.info( `started monitor to ${this.port?.address} using ${this.port?.protocol}` ); this.updateClientsSettings({ @@ -274,7 +308,7 @@ export class MonitorService extends CoreClientAware implements Disposable { this.creating.resolve(); return this.creating.promise; } catch (err) { - this.logger.warn( + console.warn( `failed starting monitor to ${this.port?.address} using ${this.port?.protocol}` ); const appError = ApplicationError.is(err) @@ -300,7 +334,7 @@ export class MonitorService extends CoreClientAware implements Disposable { async createDuplex(): Promise< ClientDuplexStream > { - const coreClient = await this.coreClient; + const coreClient = await this.coreClient.promise; return coreClient.client.monitor(); } @@ -320,7 +354,7 @@ export class MonitorService extends CoreClientAware implements Disposable { }, }); } - this.logger.info( + console.info( `monitor to ${this.port?.address} using ${this.port?.protocol} closed by client` ); }) @@ -334,7 +368,7 @@ export class MonitorService extends CoreClientAware implements Disposable { }, }); } - this.logger.info( + console.info( `monitor to ${this.port?.address} using ${this.port?.protocol} closed by server` ); }); @@ -352,7 +386,7 @@ export class MonitorService extends CoreClientAware implements Disposable { { key: 'error', callback: async (err: Error) => { - this.logger.error(err); + console.error(err); const details = ServiceError.is(err) ? err.details : err.message; reject(createConnectionFailedError(this.port, details)); }, @@ -362,7 +396,7 @@ export class MonitorService extends CoreClientAware implements Disposable { callback: async (monitorResponse: MonitorResponse) => { if (monitorResponse.getError()) { // TODO: Maybe disconnect - this.logger.error(monitorResponse.getError()); + console.error(monitorResponse.getError()); return; } if (monitorResponse.getSuccess()) { @@ -418,7 +452,7 @@ export class MonitorService extends CoreClientAware implements Disposable { async pause(): Promise { return new Promise(async (resolve) => { if (!this.duplex) { - this.logger.warn( + console.warn( `monitor to ${this.port?.address} using ${this.port?.protocol} already stopped` ); return resolve(); @@ -426,7 +460,7 @@ export class MonitorService extends CoreClientAware implements Disposable { // It's enough to close the connection with the client // to stop the monitor process this.duplex.end(); - this.logger.info( + console.info( `stopped monitor to ${this.port?.address} using ${this.port?.protocol}` ); @@ -452,7 +486,7 @@ export class MonitorService extends CoreClientAware implements Disposable { if (!this.duplex) { throw createNotConnectedError(this.port); } - const coreClient = await this.coreClient; + const coreClient = await this.coreClient.promise; const { instance } = coreClient; const req = new MonitorRequest(); @@ -489,7 +523,7 @@ export class MonitorService extends CoreClientAware implements Disposable { fqbn: string, swallowsPlatformNotFoundError = false ): Promise { - const coreClient = await this.coreClient; + const coreClient = await this.coreClient.promise; const { client, instance } = coreClient; const req = new EnumerateMonitorPortSettingsRequest(); req.setInstance(instance); @@ -580,16 +614,16 @@ export class MonitorService extends CoreClientAware implements Disposable { const diffConfig = await this.maybeUpdatePortConfigSnapshot(config); if (!diffConfig) { - this.logger.info( + console.info( `No port configuration changes have been detected. No need to send configure commands to the running monitor ${this.port.protocol}:${this.port.address}.` ); return; } - const coreClient = await this.coreClient; + const coreClient = await this.coreClient.promise; const { instance } = coreClient; - this.logger.info( + console.info( `Sending monitor request with new port configuration: ${JSON.stringify( MonitorPortConfiguration.toObject(false, diffConfig) )}` @@ -663,7 +697,7 @@ export class MonitorService extends CoreClientAware implements Disposable { }, new MonitorPortConfiguration()); this.currentPortConfigSnapshot = otherPortConfigSnapshot; - this.logger.info( + console.info( `Updated the port configuration for ${this.port.protocol}:${ this.port.address }: ${JSON.stringify(this.currentPortConfigSnapshot)}` @@ -710,7 +744,7 @@ export class MonitorService extends CoreClientAware implements Disposable { } if (!this.onMessageReceived) { - this.onMessageReceived = this.webSocketProvider.onMessageReceived( + this.onMessageReceived = this.webSocketProvider.onDidReceiveMessage( (msg: string) => { const message: Monitor.Message = JSON.parse(msg); diff --git a/arduino-ide-extension/src/node/monitor-service/web-socket-provider.ts b/arduino-ide-extension/src/node/monitor-service/web-socket-provider.ts index 1b6b2631a..91303269f 100644 --- a/arduino-ide-extension/src/node/monitor-service/web-socket-provider.ts +++ b/arduino-ide-extension/src/node/monitor-service/web-socket-provider.ts @@ -1,22 +1,40 @@ -import { Emitter } from '@theia/core/lib/common/event'; -import WebSocket from '@theia/core/shared/ws'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; +import { Event, Emitter } from '@theia/core/lib/common/event'; +import WebSocket, { AddressInfo } from '@theia/core/shared/ws'; -export default class WebSocketProviderImpl { +export default class WebSocketProviderImpl implements Disposable { + private readonly toDispose: DisposableCollection; private readonly server: WebSocket.Server; - private readonly clients: WebSocket[] = []; + private readonly clients: WebSocket[]; - private readonly onDidReceiveMessageEmitter = new Emitter(); - readonly onDidReceiveMessage = this.onDidReceiveMessageEmitter.event; + private readonly onDidReceiveMessageEmitter: Emitter; + readonly onDidReceiveMessage: Event; - private readonly onLastClientDidDisconnectEmitter = new Emitter(); - readonly onLastClientDidDisconnect = - this.onLastClientDidDisconnectEmitter.event; + private readonly onLastClientDidDisconnectEmitter: Emitter; + readonly onLastClientDidDisconnect: Event; constructor() { + this.onDidReceiveMessageEmitter = new Emitter(); + this.onLastClientDidDisconnectEmitter = new Emitter(); this.server = new WebSocket.Server({ port: 0 }); + this.toDispose = new DisposableCollection( + this.onDidReceiveMessageEmitter, + this.onLastClientDidDisconnectEmitter, + Disposable.create(() => this.server.close()) + ); + this.onDidReceiveMessage = this.onDidReceiveMessageEmitter.event; + this.onLastClientDidDisconnect = + this.onLastClientDidDisconnectEmitter.event; this.server.on('connection', (ws) => this.addClient(ws)); } + dispose(): void { + this.toDispose.dispose(); + } + private addClient(ws: WebSocket): void { this.clients.push(ws); ws.onclose = () => { @@ -30,7 +48,7 @@ export default class WebSocketProviderImpl { }; } - getAddress(): ReturnType { + getAddress(): string | AddressInfo { return this.server.address(); } diff --git a/arduino-ide-extension/src/node/notification-service-server.ts b/arduino-ide-extension/src/node/notification-service-server.ts index ce6a96304..5c9515963 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/test/node/arduino-daemon-impl.test.ts b/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts index 9a5d3f875..db7735fbf 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/test-bindings.ts b/arduino-ide-extension/src/test/node/test-bindings.ts index 30d8513a9..ec101d3df 100644 --- a/arduino-ide-extension/src/test/node/test-bindings.ts +++ b/arduino-ide-extension/src/test/node/test-bindings.ts @@ -198,7 +198,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 f7cc266fcabb8474c9b04547f3bf5f546368ece3 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 7 Jul 2023 14:30:28 +0200 Subject: [PATCH 29/29] xxx Signed-off-by: Akos Kitta --- .../src/node/monitor-service/index.ts | 4 +- .../monitor-service-protocol.ts | 62 ++++++++++++------- .../monitor-service/monitor-service-server.ts | 4 +- 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/arduino-ide-extension/src/node/monitor-service/index.ts b/arduino-ide-extension/src/node/monitor-service/index.ts index 76a04b450..86d5226cc 100644 --- a/arduino-ide-extension/src/node/monitor-service/index.ts +++ b/arduino-ide-extension/src/node/monitor-service/index.ts @@ -3,7 +3,7 @@ import { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol'; import yargs from '@theia/core/shared/yargs'; import { MonitorServiceClient, - MonitorServiceOptions, + AcquireMonitorParams, } from './monitor-service-protocol'; import { MonitorService } from './monitor-service-server'; @@ -19,7 +19,7 @@ const options = yargs type: 'boolean', }).argv as unknown as { verbose?: boolean; - monitorOptions: MonitorServiceOptions; + monitorOptions: AcquireMonitorParams; }; export default ((connection) => { diff --git a/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts b/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts index f260a883e..d9790c4ef 100644 --- a/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts +++ b/arduino-ide-extension/src/node/monitor-service/monitor-service-protocol.ts @@ -1,4 +1,5 @@ -import { JsonRpcServer } from '@theia/core'; +import { JsonRpcServer } from '@theia/core/lib/common/messaging/proxy-factory'; +import type { Disposable } from '@theia/core/lib/common/disposable'; import type { AddressInfo } from '@theia/core/shared/ws'; import type { Port as ProtocolPort } from '../../common/protocol/boards-service'; import type { MonitorSettings } from '../../common/protocol/monitor-service'; @@ -6,22 +7,25 @@ import type { MonitorSettings } from '../../common/protocol/monitor-service'; type Port = Pick; type FQBN = string; -export interface MonitorServiceOptions { +export interface AcquireMonitorParams { readonly daemonPort: number; readonly port: Port | undefined; readonly fqbn: FQBN | undefined; } -export type MonitorServiceServer = JsonRpcServer; +export interface MonitorInitParams { + readonly port: Port; + readonly fqbn: FQBN | undefined; +} -export interface MonitorService { - start(): Promise; - pause(): Promise; - stop(): Promise; - sendData(data: MonitorData): void; +export type MonitorID = string; +export function createMonitorID(params: MonitorInitParams): MonitorID { + return ''; } -export type MonitorDataType = 'message' | 'configuration' | 'address'; +export type MonitorServiceServer = JsonRpcServer; + +export type MonitorDataType = 'message' | 'settings'; export interface MonitorData { readonly type: MonitorDataType; readonly data: unknown; @@ -33,26 +37,40 @@ export interface MonitorMessage extends MonitorData { } export interface MonitorSettingsChange extends MonitorData { - readonly type: 'configuration'; + readonly type: 'settings'; readonly data: MonitorSettings; } -export interface MonitorAddressInfo extends MonitorData { - readonly type: 'address'; - readonly data: string | AddressInfo; -} - export interface MonitorServiceClient { - readonly options: MonitorServiceOptions; onData(data: MonitorData): void; onClose(reason?: unknown): void; onError(reason: unknown): void; } -export type MonitorServiceId = string; -export function createMonitorServiceId( - fqbn: FQBN, - port: Port -): MonitorServiceId { - return ''; +interface MonitorService2 extends MonitorServiceClient, Disposable { + send(message: string): void; +} + +interface MonitorManager2 { + acquireMonitor(params: AcquireMonitorParams): Promise; + connect( + addressInfo: AddressInfo + ): Promise<{ service: MonitorService2; id: MonitorID }>; + disconnect(id: MonitorID): Promise; +} + +type OrUndefined = { + [P in keyof T]: T[P] | undefined; +}; + +type MonitorPauseReason = 'upload' | 'burn-bootloader' | 'flash-firmware'; +interface MonitorManagerServer2 { + pause( + params: OrUndefined, + reason: MonitorPauseReason + ): Promise; + resume( + params: OrUndefined, + reason: MonitorPauseReason + ): Promise; } diff --git a/arduino-ide-extension/src/node/monitor-service/monitor-service-server.ts b/arduino-ide-extension/src/node/monitor-service/monitor-service-server.ts index 21c9d4b9f..59846b283 100644 --- a/arduino-ide-extension/src/node/monitor-service/monitor-service-server.ts +++ b/arduino-ide-extension/src/node/monitor-service/monitor-service-server.ts @@ -35,7 +35,7 @@ import { import { ServiceError } from '../service-error'; import { MonitorServiceClient, - MonitorServiceOptions, + AcquireMonitorParams, MonitorServiceServer, } from './monitor-service-protocol'; import WebSocketProviderImpl from './web-socket-provider'; @@ -108,7 +108,7 @@ export class MonitorService implements Disposable, MonitorServiceServer { | MonitorPortConfiguration.AsObject | undefined; - constructor(private readonly options: MonitorServiceOptions) { + constructor(private readonly options: AcquireMonitorParams) { this.webSocketProvider = new WebSocketProviderImpl(); this.toDisposeOnClose.pushAll([ this.webSocketProvider,