diff --git a/.editorconfig b/.editorconfig index b9c69ddd1..14039a4e7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,3 +13,6 @@ indent_size = 2 [*.md] indent_size = 2 + +[*.yml] +indent_size = 2 diff --git a/docs/versions-and-history.md b/docs/versions-and-history.md index 9cc7e1fb4..e97c6b6e5 100644 --- a/docs/versions-and-history.md +++ b/docs/versions-and-history.md @@ -6,7 +6,7 @@ The following table describes which version of **monaco-languageclient** and **@ | monaco-languageclient | monaco-editor-wrapper | monaco-editor-react | monaco-vscode-api / editor-api | vscode | monaco-editor | release date | comment | | :---- | :---- | :--- | :--- | :--- | :--- | :--- | :--- | -| 9.0.0-next.1 | 6.0.0-next.1 | 6.0.0-next.1 | 9.0.3 | 1.93.1 | 0.52.0 | 2024-09-xy | | +| 9.0.0-next.2 | 6.0.0-next.2 | 6.0.0-next.2 | 9.0.3 | 1.93.1 | 0.52.0 | 2024-10-xy | | | 8.8.3 | 5.5.3 | 4.5.3 | 8.0.4 | 1.92.2 | 0.51.0 | 2024-08-26 | | | 8.8.2 | 5.5.2 | 4.5.2 | 8.0.2 | 1.92.2 | 0.50.0 | 2024-08-21 | | | 8.8.1 | 5.5.1 | 4.5.1 | 8.0.1 | 1.92.1 | 0.50.0 | 2024-08-12 | | diff --git a/package-lock.json b/package-lock.json index 6c6d53ed8..6b2683a13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,28 +15,28 @@ "@codingame/esbuild-import-meta-url-plugin": "~1.0.2", "@codingame/monaco-vscode-rollup-vsix-plugin": "~9.0.3", "@testing-library/react": "~16.0.1", - "@types/node": "~20.16.9", - "@types/react": "~18.3.9", + "@types/node": "~20.16.10", + "@types/react": "~18.3.10", "@types/react-dom": "~18.3.0", "@types/vscode": "~1.93.0", "@typescript-eslint/eslint-plugin": "~7.18.0", "@typescript-eslint/parser": "~7.18.0", - "@vitejs/plugin-react": "~4.3.1", - "@vitest/browser": "~2.1.1", + "@vitejs/plugin-react": "~4.3.2", + "@vitest/browser": "~2.1.2", "editorconfig": "~2.0.0", "esbuild": "~0.24.0", - "eslint": "~8.57.0", + "eslint": "~8.57.1", "eslint-plugin-header": "~3.1.1", "eslint-plugin-import": "~2.29.1", "eslint-plugin-unused-imports": "~3.2.0", "http-server": "~14.1.1", "minimatch": "~10.0.1", "playwright": "~1.47.2", - "typescript": "~5.5.4", + "typescript": "~5.6.2", "vite": "~5.4.8", - "vite-node": "~2.1.1", - "vitest": "~2.1.1", - "webdriverio": "~9.1.1" + "vite-node": "~2.1.2", + "vitest": "~2.1.2", + "webdriverio": "~9.1.2" } }, "node_modules/@ampproject/remapping": { @@ -53,12 +53,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { @@ -66,30 +67,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -114,29 +117,31 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.9", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -149,71 +154,36 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -232,77 +202,71 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -316,6 +280,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -328,6 +293,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -342,6 +308,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -350,13 +317,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -366,6 +335,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -375,6 +345,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -383,10 +354,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -437,33 +412,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -472,13 +446,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -569,6 +544,15 @@ "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" } }, + "node_modules/@codingame/monaco-vscode-bulk-edit-service-override": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-bulk-edit-service-override/-/monaco-vscode-bulk-edit-service-override-9.0.3.tgz", + "integrity": "sha512-fLNVfoHWp/W9viMdRtx310P9pPmSU5H3R87208cyew652ZQN1VlpSoM4a5X0lRxj4PZSVL+qNxgCi8bypo4hXw==", + "license": "MIT", + "dependencies": { + "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" + } + }, "node_modules/@codingame/monaco-vscode-configuration-service-override": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-configuration-service-override/-/monaco-vscode-configuration-service-override-9.0.3.tgz", @@ -990,6 +974,70 @@ "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" } }, + "node_modules/@codingame/monaco-vscode-view-banner-service-override": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-view-banner-service-override/-/monaco-vscode-view-banner-service-override-9.0.3.tgz", + "integrity": "sha512-bAzK6mJlJYaXGv5gZrvRR3hxuTCyXzSRv0WiJPv+sP+Gq3KQbI3tyLDrudJ7Zp4+Vh7HMfvV4BwQaE3v1dm3Cw==", + "license": "MIT", + "dependencies": { + "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" + } + }, + "node_modules/@codingame/monaco-vscode-view-common-service-override": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-view-common-service-override/-/monaco-vscode-view-common-service-override-9.0.3.tgz", + "integrity": "sha512-wa6pP3G86SwKo1bGbRt8zOaR06cFTTL3DVo7Ja5AB5K5vcW2hKlFuRZ0Rdl6CQyD71inMS85GOSeeN/Ful0t/A==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-bulk-edit-service-override": "9.0.3", + "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" + } + }, + "node_modules/@codingame/monaco-vscode-view-status-bar-service-override": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-view-status-bar-service-override/-/monaco-vscode-view-status-bar-service-override-9.0.3.tgz", + "integrity": "sha512-MRMtBZHsATlmjsELGIX4ediyH48FpsKxFTDstXecR5rE+6Y2VUJJHTZiAQRbADMD7as9eVH91Yi/+66ZiC0fag==", + "license": "MIT", + "dependencies": { + "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" + } + }, + "node_modules/@codingame/monaco-vscode-view-title-bar-service-override": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-view-title-bar-service-override/-/monaco-vscode-view-title-bar-service-override-9.0.3.tgz", + "integrity": "sha512-uO5PmEdMFtyGQwj387lbSXYkua8fQqj50WkM2HoVjGmxu4vgKHHMVpgGDSW80wPQl8ya37O3o8I2xrd3Mf65yg==", + "license": "MIT", + "dependencies": { + "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" + } + }, + "node_modules/@codingame/monaco-vscode-views-service-override": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-views-service-override/-/monaco-vscode-views-service-override-9.0.3.tgz", + "integrity": "sha512-8q+GmdCVSBL9CSER0PspRkFmdBPW3PqgfN8OyZtWxCiFj2ZXSR063mzsYbPqUk4+g0cOmbOjNxShWVfs8lWQdg==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-keybindings-service-override": "9.0.3", + "@codingame/monaco-vscode-quickaccess-service-override": "9.0.3", + "@codingame/monaco-vscode-view-common-service-override": "9.0.3", + "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" + } + }, + "node_modules/@codingame/monaco-vscode-workbench-service-override": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-workbench-service-override/-/monaco-vscode-workbench-service-override-9.0.3.tgz", + "integrity": "sha512-LeN6GsE0l1TiUNoAFW37AjQtD59Hr4xPhTw0Ny6yaqmQ6ancb90JbAfML3E4JZEpMuT+mWZvvWNu+VwIblIzgQ==", + "license": "MIT", + "dependencies": { + "@codingame/monaco-vscode-keybindings-service-override": "9.0.3", + "@codingame/monaco-vscode-quickaccess-service-override": "9.0.3", + "@codingame/monaco-vscode-view-banner-service-override": "9.0.3", + "@codingame/monaco-vscode-view-common-service-override": "9.0.3", + "@codingame/monaco-vscode-view-status-bar-service-override": "9.0.3", + "@codingame/monaco-vscode-view-title-bar-service-override": "9.0.3", + "vscode": "npm:@codingame/monaco-vscode-api@9.0.3" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1517,22 +1565,24 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -1545,6 +1595,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1555,6 +1606,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1580,36 +1632,36 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@inquirer/confirm": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", - "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", + "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^9.0.10", - "@inquirer/type": "^1.5.2" + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" }, "engines": { "node": ">=18" } }, "node_modules/@inquirer/core": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.10.tgz", - "integrity": "sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.2", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", "@types/mute-stream": "^0.0.4", - "@types/node": "^22.1.0", + "@types/node": "^22.5.5", "@types/wrap-ansi": "^3.0.0", "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", "cli-width": "^4.1.0", "mute-stream": "^1.0.0", "signal-exit": "^4.1.0", @@ -1621,27 +1673,33 @@ "node": ">=18" } }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", + "node_modules/@inquirer/core/node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.13.0" + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@inquirer/core/node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", + "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", "dev": true, "license": "MIT", "engines": { @@ -1649,9 +1707,9 @@ } }, "node_modules/@inquirer/type": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz", - "integrity": "sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", "dev": true, "license": "MIT", "dependencies": { @@ -1863,9 +1921,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "version": "0.35.9", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.9.tgz", + "integrity": "sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1873,7 +1931,7 @@ "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", + "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" }, "engines": { @@ -2479,9 +2537,9 @@ } }, "node_modules/@types/node": { - "version": "20.16.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.9.tgz", - "integrity": "sha512-rkvIVJxsOfBejxK7I0FO5sa2WxFmJCzoDwcd88+fq/CUfynNywTo/1/T6hyFz22CyztsnLS9nVlHOnTI36RH5w==", + "version": "20.16.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", + "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", "dev": true, "license": "MIT", "dependencies": { @@ -2507,9 +2565,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.3.9", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.9.tgz", - "integrity": "sha512-+BpAVyTpJkNWWSSnaLBk6ePpHLOGJKnEQNbINNovPWzvEUyAe3e+/d494QdEh71RekM/qV7lw6jzf1HGrJyAtQ==", + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2826,14 +2884,15 @@ "dev": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", + "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, @@ -2845,16 +2904,16 @@ } }, "node_modules/@vitest/browser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.1.tgz", - "integrity": "sha512-wLKqohwlZI24xMIEZAPwv9SVliv1avaIBeE0ou471D++BRPhiw2mubKBczFFIDHXuSL7UXb8/JQK9Ui6ttW9bQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.2.tgz", + "integrity": "sha512-tqpGfz2sfjFFNuZ2iLZ6EGRVnH8z18O93ZIicbLsxDhiLgRNz84UcjSvX4pbheuddW+BJeNbLGdM3BU8vohbEg==", "dev": true, "license": "MIT", "dependencies": { "@testing-library/dom": "^10.4.0", "@testing-library/user-event": "^14.5.2", - "@vitest/mocker": "2.1.1", - "@vitest/utils": "2.1.1", + "@vitest/mocker": "2.1.2", + "@vitest/utils": "2.1.2", "magic-string": "^0.30.11", "msw": "^2.3.5", "sirv": "^2.0.4", @@ -2866,7 +2925,7 @@ }, "peerDependencies": { "playwright": "*", - "vitest": "2.1.1", + "vitest": "2.1.2", "webdriverio": "*" }, "peerDependenciesMeta": { @@ -2882,14 +2941,14 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", - "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.2.tgz", + "integrity": "sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.1", - "@vitest/utils": "2.1.1", + "@vitest/spy": "2.1.2", + "@vitest/utils": "2.1.2", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" }, @@ -2898,9 +2957,9 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", - "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.2.tgz", + "integrity": "sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==", "dev": true, "license": "MIT", "dependencies": { @@ -2912,7 +2971,7 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/spy": "2.1.1", + "@vitest/spy": "2.1.2", "msw": "^2.3.5", "vite": "^5.0.0" }, @@ -2936,9 +2995,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", - "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.2.tgz", + "integrity": "sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==", "dev": true, "license": "MIT", "dependencies": { @@ -2949,13 +3008,13 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", - "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.2.tgz", + "integrity": "sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.1", + "@vitest/utils": "2.1.2", "pathe": "^1.1.2" }, "funding": { @@ -2963,13 +3022,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", - "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.2.tgz", + "integrity": "sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.1", + "@vitest/pretty-format": "2.1.2", "magic-string": "^0.30.11", "pathe": "^1.1.2" }, @@ -2978,9 +3037,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", - "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.2.tgz", + "integrity": "sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==", "dev": true, "license": "MIT", "dependencies": { @@ -2991,13 +3050,13 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", - "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.2.tgz", + "integrity": "sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.1", + "@vitest/pretty-format": "2.1.2", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" }, @@ -3016,15 +3075,15 @@ "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==" }, "node_modules/@wdio/config": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.1.0.tgz", - "integrity": "sha512-lxrUJK5ZRilRMrKgamooGbmxpE9qeYFSpF2R3H8HGZXnFDUMUQnWYY2Hn6O5Hw0BA9DxZKqCi1hrBxRws9O2ww==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.1.2.tgz", + "integrity": "sha512-M8jDFgTxOeljv5M75em7oCu2cV16jHWH6HWj5CD3ZNzaMeHf+EkIuHNyREJjt8PCnssehzXD26TF63tGPHdksA==", "dev": true, "license": "MIT", "dependencies": { "@wdio/logger": "9.1.0", - "@wdio/types": "9.1.0", - "@wdio/utils": "9.1.0", + "@wdio/types": "9.1.2", + "@wdio/utils": "9.1.2", "decamelize": "^6.0.0", "deepmerge-ts": "^7.0.3", "glob": "^10.2.2", @@ -3150,9 +3209,9 @@ } }, "node_modules/@wdio/types": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.1.0.tgz", - "integrity": "sha512-bi3DTse8Nlat7FTCnciPnJWYggpRSszLQ70ReCcegAUlaancV+Y8ma4IWZROsBQ6f1hB+JIS9gwc/HGcp+6XSQ==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.1.2.tgz", + "integrity": "sha512-mROY3xSBBNujSH0Opo3Sfi1QUm3l7HbVQ8/bDmPCwHXOeYlx0q14rLyyZI3LrN5uJ0KPpuNrVgE36NFaG8+xxw==", "dev": true, "license": "MIT", "dependencies": { @@ -3163,15 +3222,15 @@ } }, "node_modules/@wdio/utils": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.1.0.tgz", - "integrity": "sha512-iH+P/Dakttc7MRsVaikLLe13SDkm9Z+GAAOi6yu6I3x+ao6563KECjsLqJxLCKtbfOjqAqID19QBAtPQTRBVRA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.1.2.tgz", + "integrity": "sha512-8APCnvJjHkG/6KwXtrPhEYR29Ph+vs1Gx2mGRnbYXNgbworfPEIZETpienHXhDEbINdqSb7EY5LkapIjP7nKbg==", "dev": true, "license": "MIT", "dependencies": { "@puppeteer/browsers": "^2.2.0", "@wdio/logger": "9.1.0", - "@wdio/types": "9.1.0", + "@wdio/types": "9.1.2", "decamelize": "^6.0.0", "deepmerge-ts": "^7.0.3", "edgedriver": "^5.6.1", @@ -3808,9 +3867,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -3826,10 +3885,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, "bin": { @@ -3919,9 +3979,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001642", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", - "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", + "version": "1.0.30001666", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", + "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", "dev": true, "funding": [ { @@ -3936,7 +3996,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chai": { "version": "5.1.1", @@ -4049,19 +4110,6 @@ "chevrotain": "^11.0.0" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -4801,10 +4849,11 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.828", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.828.tgz", - "integrity": "sha512-QOIJiWpQJDHAVO4P58pwb133Cwee0nbvy/MV1CwzZVGpkH1RX33N3vsaWRCpR6bF63AAq366neZrRTu7Qlsbbw==", - "dev": true + "version": "1.5.31", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz", + "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5043,10 +5092,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5092,16 +5142,17 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -5992,9 +6043,9 @@ } }, "node_modules/geckodriver": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.4.4.tgz", - "integrity": "sha512-0zaw19tcmWeluqx7+Y559JGBtidu1D0Lb8ElYKiNEQu8r3sCfrLUf5V10xypl8u29ZLbgRV7WflxCJVTCkCMFA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.5.0.tgz", + "integrity": "sha512-EnBCT9kJ5oEoP3DaJKjzxAhm7bbNNK6k2q7oCkCT58OIOOiE6Hsr+nVDHflsNaR68HMGtBKOLSZ+YvCDHecScw==", "dev": true, "hasInstallScript": true, "license": "MPL-2.0", @@ -6220,6 +6271,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7005,15 +7057,16 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -7397,6 +7450,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -7621,9 +7675,9 @@ "dev": true }, "node_modules/msw": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.5.tgz", - "integrity": "sha512-+GUI4gX5YC5Bv33epBrD+BGdmDvBg2XGruiWnI3GbIbRmMMBeZ5gs3mJ51OWSGHgJKztZ8AtZeYMMNMVrje2/Q==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz", + "integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7632,7 +7686,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.29.0", + "@mswjs/interceptors": "^0.35.8", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", @@ -7641,7 +7695,7 @@ "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", + "path-to-regexp": "^6.3.0", "strict-event-emitter": "^0.5.1", "type-fest": "^4.9.0", "yargs": "^17.7.2" @@ -7656,7 +7710,7 @@ "url": "https://github.com/sponsors/mswjs" }, "peerDependencies": { - "typescript": ">= 4.7.x" + "typescript": ">= 4.8.x" }, "peerDependenciesMeta": { "typescript": { @@ -7757,10 +7811,11 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -8118,9 +8173,9 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true, "license": "MIT" }, @@ -8158,10 +8213,11 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8420,9 +8476,9 @@ } }, "node_modules/pyright": { - "version": "1.1.382", - "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.382.tgz", - "integrity": "sha512-AsTbuh5OiV12GpWqSrekJHWj+dP4KEdB69rBh8Nr+n4OHeXKr5hFtGDksrlhcIGFW6WouHvZERkwA12FHPwWOg==", + "version": "1.1.383", + "resolved": "https://registry.npmjs.org/pyright/-/pyright-1.1.383.tgz", + "integrity": "sha512-b540vUDWGXFlVwhxREgCrvKYT9bnUUPiDtSv5s7sUGxIokTxc06bPC2vfnGunUqaUu6hgIqlv1GRFdOKIEb09A==", "license": "MIT", "bin": { "pyright": "index.js", @@ -9693,9 +9749,9 @@ } }, "node_modules/type-fest": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", - "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -9792,9 +9848,9 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -9904,9 +9960,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -9922,9 +9978,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -10064,9 +10121,9 @@ } }, "node_modules/vite-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", - "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.2.tgz", + "integrity": "sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10492,19 +10549,19 @@ } }, "node_modules/vitest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", - "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.2.tgz", + "integrity": "sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.1", - "@vitest/mocker": "2.1.1", - "@vitest/pretty-format": "^2.1.1", - "@vitest/runner": "2.1.1", - "@vitest/snapshot": "2.1.1", - "@vitest/spy": "2.1.1", - "@vitest/utils": "2.1.1", + "@vitest/expect": "2.1.2", + "@vitest/mocker": "2.1.2", + "@vitest/pretty-format": "^2.1.2", + "@vitest/runner": "2.1.2", + "@vitest/snapshot": "2.1.2", + "@vitest/spy": "2.1.2", + "@vitest/utils": "2.1.2", "chai": "^5.1.1", "debug": "^4.3.6", "magic-string": "^0.30.11", @@ -10515,7 +10572,7 @@ "tinypool": "^1.0.0", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.1", + "vite-node": "2.1.2", "why-is-node-running": "^2.3.0" }, "bin": { @@ -10530,8 +10587,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.1", - "@vitest/ui": "2.1.1", + "@vitest/browser": "2.1.2", + "@vitest/ui": "2.1.2", "happy-dom": "*", "jsdom": "*" }, @@ -10718,19 +10775,19 @@ } }, "node_modules/webdriver": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.1.1.tgz", - "integrity": "sha512-XRZitu+W3xpnuA6gFgiSGBCt2P8m4g2Yzt+zXgPqlKiDGwr27F5m40pP2AnlQBlQO7hw0OJJa68QR1KW2D9cHA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.1.2.tgz", + "integrity": "sha512-NjeYVTCSMwQrd+EDpSSB8YnSNzYeEPU2IoJhvjaXUwTEhoaIvz6x6fM4UqCbm/ph8lZ1uWux43fqIcfDzFQl5Q==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "9.1.0", + "@wdio/config": "9.1.2", "@wdio/logger": "9.1.0", "@wdio/protocols": "9.0.8", - "@wdio/types": "9.1.0", - "@wdio/utils": "9.1.0", + "@wdio/types": "9.1.2", + "@wdio/utils": "9.1.2", "deepmerge-ts": "^7.0.3", "ws": "^8.8.0" }, @@ -10739,20 +10796,20 @@ } }, "node_modules/webdriverio": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.1.1.tgz", - "integrity": "sha512-jREz3Vy7ItpNn0HG/vh5oZYAzSv4PGGy8mxht7j4BXkcUjkPCBfHtAAXHRwwJVxu1rWJLzn4QhfjLIaEFe73NA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.1.2.tgz", + "integrity": "sha512-Yk/OmxUmse6YVBMr+iM5zH3LKiy07cJQsq19qL2Zj29+2I3b8kK8uGxx8+DhqYF/A/MVwHUFxACzQDYsdW6pjw==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "^20.11.30", "@types/sinonjs__fake-timers": "^8.1.5", - "@wdio/config": "9.1.0", + "@wdio/config": "9.1.2", "@wdio/logger": "9.1.0", "@wdio/protocols": "9.0.8", "@wdio/repl": "9.0.8", - "@wdio/types": "9.1.0", - "@wdio/utils": "9.1.0", + "@wdio/types": "9.1.2", + "@wdio/utils": "9.1.2", "archiver": "^7.0.1", "aria-query": "^5.3.0", "cheerio": "^1.0.0-rc.12", @@ -10771,7 +10828,7 @@ "rgb2hex": "0.2.5", "serialize-error": "^11.0.3", "urlpattern-polyfill": "^10.0.0", - "webdriver": "9.1.1" + "webdriver": "9.1.2" }, "engines": { "node": ">=18.20.0" @@ -10971,7 +11028,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", @@ -11074,7 +11132,7 @@ }, "packages/client": { "name": "monaco-languageclient", - "version": "9.0.0-next.1", + "version": "9.0.0-next.2", "license": "MIT", "dependencies": { "@codingame/monaco-vscode-extensions-service-override": "~9.0.3", @@ -11126,13 +11184,13 @@ "@codingame/monaco-vscode-theme-service-override": "~9.0.3", "@codingame/monaco-vscode-typescript-basics-default-extension": "~9.0.3", "@codingame/monaco-vscode-typescript-language-features-default-extension": "~9.0.3", - "@typefox/monaco-editor-react": "~6.0.0-next.1", + "@typefox/monaco-editor-react": "~6.0.0-next.2", "express": "~4.21.0", "langium": "~3.2.0", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-editor-wrapper": "~6.0.0-next.1", - "monaco-languageclient": "~9.0.0-next.1", - "pyright": "~1.1.382", + "monaco-editor-wrapper": "~6.0.0-next.2", + "monaco-languageclient": "~9.0.0-next.2", + "pyright": "~1.1.383", "react": "~18.3.1", "react-dom": "~18.3.1", "request-light": "~0.8.0", @@ -11165,7 +11223,7 @@ }, "packages/wrapper": { "name": "monaco-editor-wrapper", - "version": "6.0.0-next.1", + "version": "6.0.0-next.2", "license": "MIT", "dependencies": { "@codingame/monaco-vscode-configuration-service-override": "~9.0.3", @@ -11188,6 +11246,8 @@ "@codingame/monaco-vscode-textmate-service-override": "~9.0.3", "@codingame/monaco-vscode-theme-defaults-default-extension": "~9.0.3", "@codingame/monaco-vscode-theme-service-override": "~9.0.3", + "@codingame/monaco-vscode-views-service-override": "~9.0.3", + "@codingame/monaco-vscode-workbench-service-override": "~9.0.3", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3", "vscode-languageclient": "~9.0.1", @@ -11203,7 +11263,7 @@ }, "peerDependencies": { "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-languageclient": "~9.0.0-next.1", + "monaco-languageclient": "~9.0.0-next.2", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3" }, "peerDependenciesMeta": { @@ -11220,19 +11280,19 @@ }, "packages/wrapper-react": { "name": "@typefox/monaco-editor-react", - "version": "6.0.0-next.1", + "version": "6.0.0-next.2", "license": "MIT", "dependencies": { "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-editor-wrapper": "~6.0.0-next.1", - "monaco-languageclient": "~9.0.0-next.1", + "monaco-editor-wrapper": "~6.0.0-next.2", + "monaco-languageclient": "~9.0.0-next.2", "react": "~18.3.1", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3" }, "peerDependencies": { "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-editor-wrapper": "~6.0.0-next.1", - "monaco-languageclient": "~9.0.0-next.1", + "monaco-editor-wrapper": "~6.0.0-next.2", + "monaco-languageclient": "~9.0.0-next.2", "react": "~18.3.1", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3" }, diff --git a/package.json b/package.json index a5ac18fd7..a8c2fe6fd 100644 --- a/package.json +++ b/package.json @@ -5,31 +5,31 @@ "@codingame/esbuild-import-meta-url-plugin": "~1.0.2", "@codingame/monaco-vscode-rollup-vsix-plugin": "~9.0.3", "@testing-library/react": "~16.0.1", - "@types/node": "~20.16.9", - "@types/react": "~18.3.9", + "@types/node": "~20.16.10", + "@types/react": "~18.3.10", "@types/react-dom": "~18.3.0", "@types/vscode": "~1.93.0", "@typescript-eslint/eslint-plugin": "~7.18.0", "@typescript-eslint/parser": "~7.18.0", - "@vitejs/plugin-react": "~4.3.1", - "@vitest/browser": "~2.1.1", + "@vitejs/plugin-react": "~4.3.2", + "@vitest/browser": "~2.1.2", "editorconfig": "~2.0.0", "esbuild": "~0.24.0", - "eslint": "~8.57.0", + "eslint": "~8.57.1", "eslint-plugin-header": "~3.1.1", "eslint-plugin-import": "~2.29.1", "eslint-plugin-unused-imports": "~3.2.0", "http-server": "~14.1.1", "minimatch": "~10.0.1", "playwright": "~1.47.2", - "typescript": "~5.5.4", + "typescript": "~5.6.2", "vite": "~5.4.8", - "vite-node": "~2.1.1", - "vitest": "~2.1.1", - "webdriverio": "~9.1.1" + "vite-node": "~2.1.2", + "vitest": "~2.1.2", + "webdriverio": "~9.1.2" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" }, "scripts": { @@ -57,7 +57,7 @@ "release:prepare": "npm run reset:repo && npm ci && npm run build && npm run lint && npm run test:run", "reset:repo": "git clean -f -X -d", "test": "npm run test:webdriverio", - "test:run": "npm run test:webdriverio", + "test:run": "npm run test:webdriverio:run", "test:webdriverio": "vitest", "test:webdriverio:run": "vitest --run", "test:playwright": "vitest --config vitest.debug.config.ts", diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index e571b8bd9..0590c88b3 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -2,8 +2,9 @@ All notable changes to this npm module are documented in this file. -## [9.0.0-next.1] - 2024-09-xy +## [9.0.0-next.2] - 2024-10-xy +- Support all arguments for monaco-vscode-api `initialize` [#756](https://github.com/TypeFox/monaco-languageclient/pull/756) - Update to monaco-vscode-api 9.0.x [#749](https://github.com/TypeFox/monaco-languageclient/pull/749) - Updated all `@codingame/monaco-vscode` packages to `9.0.3`. - Enhancements to logging diff --git a/packages/client/package.json b/packages/client/package.json index 19c9348a7..38feb40ef 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "monaco-languageclient", - "version": "9.0.0-next.1", + "version": "9.0.0-next.2", "description": "Monaco Language client implementation", "author": { "name": "TypeFox GmbH", @@ -51,7 +51,7 @@ "npm": ">=9.0.0" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" }, "files": [ diff --git a/packages/client/src/vscode/services.ts b/packages/client/src/vscode/services.ts index 43a8a2854..f2491269f 100644 --- a/packages/client/src/vscode/services.ts +++ b/packages/client/src/vscode/services.ts @@ -5,13 +5,15 @@ import * as monaco from 'monaco-editor'; import 'vscode/localExtensionHost'; -import { ILogService, initialize, IWorkbenchConstructionOptions, StandaloneServices, LogLevel } from 'vscode/services'; +import { initialize, IWorkbenchConstructionOptions } from 'vscode/services'; +import { OpenEditor } from '@codingame/monaco-vscode-editor-service-override'; import type { WorkerConfig } from '@codingame/monaco-vscode-extensions-service-override'; import getExtensionServiceOverride from '@codingame/monaco-vscode-extensions-service-override'; import getLanguagesServiceOverride from '@codingame/monaco-vscode-languages-service-override'; import getModelServiceOverride from '@codingame/monaco-vscode-model-service-override'; import getLogServiceOverride from '@codingame/monaco-vscode-log-service-override'; import type { LocalizationOptions } from '@codingame/monaco-vscode-localization-service-override'; +import { EnvironmentOverride } from 'vscode/workbench'; import { Logger } from 'monaco-languageclient/tools'; import { FakeWorker as Worker } from './fakeWorker.js'; @@ -20,13 +22,25 @@ export interface MonacoEnvironmentEnhanced extends monaco.Environment { vscodeApiInitialised?: boolean; } -export interface InitializeServiceConfig { +export interface UserConfiguration { + json?: string; +} + +export interface VscodeApiConfig { userServices?: monaco.editor.IEditorOverrideServices; enableExtHostWorker?: boolean; workspaceConfig?: IWorkbenchConstructionOptions; + userConfiguration?: UserConfiguration; + viewsConfig?: { + viewServiceType: 'EditorService' | 'ViewsService' | 'WorkspaceService'; + openEditorFunc?: OpenEditor; + viewsInitFunc?: () => void; + }, + envOptions?: EnvironmentOverride; } -export interface InitServicesInstructions extends InitializeServiceConfig { +export interface InitVscodeApiInstructions extends VscodeApiConfig { + htmlContainer: HTMLElement; caller?: string; performChecks?: () => boolean; logger?: Logger; @@ -48,6 +62,11 @@ export const initEnhancedMonacoEnvironment = () => { return envEnhanced; }; +export const getMonacoEnvironmentEnhanced = () => { + const monWin = (self as Window); + return monWin.MonacoEnvironment as MonacoEnvironmentEnhanced; +}; + export const supplyRequiredServices = async () => { return { ...getLanguagesServiceOverride(), @@ -68,7 +87,7 @@ export const mergeServices = (services: monaco.editor.IEditorOverrideServices, o } }; -export const initServices = async (instructions: InitServicesInstructions) => { +export const initServices = async (instructions: InitVscodeApiInstructions) => { const envEnhanced = initEnhancedMonacoEnvironment(); if (!(envEnhanced.vscodeInitialising ?? false)) { @@ -79,6 +98,7 @@ export const initServices = async (instructions: InitServicesInstructions) => { instructions.logger?.debug(`Initializing vscode services. Caller: ${instructions.caller ?? 'unknown'}`); await importAllServices(instructions); + instructions.viewsConfig?.viewsInitFunc?.(); instructions.logger?.debug('Initialization of vscode services completed successfully.'); envEnhanced.vscodeApiInitialised = true; @@ -97,7 +117,7 @@ export const initServices = async (instructions: InitServicesInstructions) => { * - languages * - model */ -export const importAllServices = async (instructions: InitServicesInstructions) => { +export const importAllServices = async (instructions: InitVscodeApiInstructions) => { const userServices: monaco.editor.IEditorOverrideServices = instructions.userServices ?? {}; const lcRequiredServices = await supplyRequiredServices(); @@ -108,8 +128,7 @@ export const importAllServices = async (instructions: InitServicesInstructions) reportServiceLoading(userServices, instructions.logger); if (instructions.performChecks === undefined || (typeof instructions.performChecks === 'function' && instructions.performChecks())) { - await initialize(userServices, undefined, instructions.workspaceConfig); - StandaloneServices.get(ILogService).setLevel(instructions.logger?.getLevel() ?? LogLevel.Off); + await initialize(userServices, instructions.htmlContainer, instructions.workspaceConfig, instructions.envOptions); } }; diff --git a/packages/examples/CHANGELOG.md b/packages/examples/CHANGELOG.md index 7b0a3bb49..a67cd3dc2 100644 --- a/packages/examples/CHANGELOG.md +++ b/packages/examples/CHANGELOG.md @@ -2,9 +2,13 @@ All notable changes to this npm module are documented in this file. -## [2024.9.1] - 2024-09-xy +## [2024.10.1] - 20241-10-xy -- Updated to `monaco-languageclient@9.0.0-next.1`, `monaco-editor-wrapper@6.0.0-next.1` and `@typefox/monaco-editor-react@6.0.0-next.1`. Updated all `@codingame/monaco-vscode` packages to `9.0.3`. +- Aligend example config. `htmlContainer` is now a required property of `editorAppConfig` + +## [2024.9.1] - 2024-09-27 + +- Updated to `monaco-languageclient@9.0.0-next.2`, `monaco-editor-wrapper@6.0.0-next.2` and `@typefox/monaco-editor-react@6.0.0-next.2`. Updated all `@codingame/monaco-vscode` packages to `9.0.3`. - Align configuration of all examples to the latest configuration adjustments. - Only use a single function to configure `monaco-editor` that all examples. - `server-commons`: Allow to set `requestMessageHandler` and `responseMessageHandler`. diff --git a/packages/examples/build/downloadResources.mts b/packages/examples/build/downloadResources.mts index 8494dcbb6..bf39f7cc4 100644 --- a/packages/examples/build/downloadResources.mts +++ b/packages/examples/build/downloadResources.mts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import { existsSync, mkdirSync, writeFileSync } from 'fs'; -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; +import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; export const getLocalDirectory = () => { const __filename = fileURLToPath(import.meta.url); diff --git a/packages/examples/package.json b/packages/examples/package.json index 6a91ee4d6..0d917e7f6 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -72,13 +72,13 @@ "@codingame/monaco-vscode-theme-service-override": "~9.0.3", "@codingame/monaco-vscode-typescript-basics-default-extension": "~9.0.3", "@codingame/monaco-vscode-typescript-language-features-default-extension": "~9.0.3", - "@typefox/monaco-editor-react": "~6.0.0-next.1", + "@typefox/monaco-editor-react": "~6.0.0-next.2", "express": "~4.21.0", "langium": "~3.2.0", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-editor-wrapper": "~6.0.0-next.1", - "monaco-languageclient": "~9.0.0-next.1", - "pyright": "~1.1.382", + "monaco-editor-wrapper": "~6.0.0-next.2", + "monaco-languageclient": "~9.0.0-next.2", + "pyright": "~1.1.383", "react": "~18.3.1", "react-dom": "~18.3.1", "request-light": "~0.8.0", @@ -98,7 +98,7 @@ "vscode-languageserver-types": "~3.17.5" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" }, "files": [ diff --git a/packages/examples/src/bare/client.ts b/packages/examples/src/bare/client.ts index 37c2d5c7d..14b02f00f 100644 --- a/packages/examples/src/bare/client.ts +++ b/packages/examples/src/bare/client.ts @@ -22,12 +22,14 @@ import { updateUserConfiguration } from '@codingame/monaco-vscode-configuration- export const runClient = async () => { const logger = new ConsoleLogger(LogLevel.Debug); + const htmlContainer = document.getElementById('monaco-editor-root')!; await initServices({ userServices: { ...getConfigurationServiceOverride(), ...getThemeServiceOverride(), ...getTextmateServiceOverride(), }, + htmlContainer, logger }); @@ -46,7 +48,7 @@ export const runClient = async () => { configureMonacoWorkers(logger); // create monaco editor - monaco.editor.create(document.getElementById('monaco-editor-root')!, { + monaco.editor.create(htmlContainer, { value: `{ "$schema": "http://json.schemastore.org/coffeelint", "line_endings": "unix" diff --git a/packages/examples/src/browser/main.ts b/packages/examples/src/browser/main.ts index 794f16251..66235f365 100644 --- a/packages/examples/src/browser/main.ts +++ b/packages/examples/src/browser/main.ts @@ -19,7 +19,7 @@ export const runBrowserEditor = async () => { const protocolConverter = createProtocolConverter(undefined, true, true); let mainVscodeDocument: vscode.TextDocument | undefined; - const htmlElement = document.getElementById('monaco-editor-root'); + const htmlContainer = document.getElementById('monaco-editor-root')!; const languageId = 'json'; const code = `{ "$schema": "http://json.schemastore.org/coffeelint", @@ -30,9 +30,17 @@ export const runBrowserEditor = async () => { const wrapper = new MonacoEditorLanguageClientWrapper(); const jsonClientUserConfig: WrapperConfig = { logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getKeybindingsServiceOverride(), + }, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'editor.guides.bracketPairsHorizontal': 'active', + 'editor.lightbulb.enabled': 'On', + 'editor.experimental.asyncTokenization': true + }) } }, editorAppConfig: { @@ -44,15 +52,8 @@ export const runBrowserEditor = async () => { } }, useDiffEditor: false, - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'Default Dark Modern', - 'editor.guides.bracketPairsHorizontal': 'active', - 'editor.lightbulb.enabled': 'On', - 'editor.experimental.asyncTokenization': true - }) - }, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer } }; await wrapper.init(jsonClientUserConfig); @@ -155,7 +156,7 @@ export const runBrowserEditor = async () => { diagnosticCollection.clear(); }; - await wrapper.start(htmlElement); + await wrapper.start(); wrapper.getTextModels()?.text?.onDidChangeContent(() => { validate(); diff --git a/packages/examples/src/common/node/server-commons.ts b/packages/examples/src/common/node/server-commons.ts index 88067e0a1..8e0e2f074 100644 --- a/packages/examples/src/common/node/server-commons.ts +++ b/packages/examples/src/common/node/server-commons.ts @@ -8,10 +8,10 @@ import { URL } from 'node:url'; import { Socket } from 'node:net'; import { dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; +import * as cp from 'node:child_process'; import { IWebSocket, WebSocketMessageReader, WebSocketMessageWriter } from 'vscode-ws-jsonrpc'; import { createConnection, createServerProcess, forward } from 'vscode-ws-jsonrpc/server'; import { Message, InitializeRequest, InitializeParams, RequestMessage, ResponseMessage } from 'vscode-languageserver-protocol'; -import * as cp from 'child_process'; export enum LanguageName { /** https://nodejs.org/api/cli.html */ diff --git a/packages/examples/src/eclipse.jdt.ls/client/main.ts b/packages/examples/src/eclipse.jdt.ls/client/main.ts index 46da20fb6..7692df594 100644 --- a/packages/examples/src/eclipse.jdt.ls/client/main.ts +++ b/packages/examples/src/eclipse.jdt.ls/client/main.ts @@ -22,9 +22,17 @@ export const runEclipseJdtLsClient = () => { const userConfig: WrapperConfig = { logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getKeybindingsServiceOverride(), + }, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'editor.guides.bracketPairsHorizontal': 'active', + 'editor.wordBasedSuggestions': 'off', + 'editor.experimental.asyncTokenization': true + }) } }, editorAppConfig: { @@ -36,15 +44,8 @@ export const runEclipseJdtLsClient = () => { } }, useDiffEditor: false, - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'Default Dark Modern', - 'editor.guides.bracketPairsHorizontal': 'active', - 'editor.wordBasedSuggestions': 'off', - 'editor.experimental.asyncTokenization': true - }) - }, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer: document.getElementById('monaco-editor-root')! }, languageClientConfigs: { java: { @@ -68,7 +69,6 @@ export const runEclipseJdtLsClient = () => { }; const wrapper = new MonacoEditorLanguageClientWrapper(); - const htmlElement = document.getElementById('monaco-editor-root'); try { document.querySelector('#button-start')?.addEventListener('click', async () => { @@ -77,7 +77,7 @@ export const runEclipseJdtLsClient = () => { // open files, so the LS can pick it up await vscode.workspace.openTextDocument(helloJavaUri); - await wrapper.start(htmlElement); + await wrapper.start(); }); document.querySelector('#button-dispose')?.addEventListener('click', async () => { await wrapper.dispose(); diff --git a/packages/examples/src/groovy/client/main.ts b/packages/examples/src/groovy/client/main.ts index 7b86068be..4fe052b41 100644 --- a/packages/examples/src/groovy/client/main.ts +++ b/packages/examples/src/groovy/client/main.ts @@ -18,9 +18,17 @@ File file = new File("E:/Example.txt"); const userConfig: WrapperConfig = { logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getKeybindingsServiceOverride(), + }, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'editor.guides.bracketPairsHorizontal': 'active', + 'editor.wordBasedSuggestions': 'off', + 'editor.experimental.asyncTokenization': true + }) } }, editorAppConfig: { @@ -32,15 +40,8 @@ const userConfig: WrapperConfig = { } }, useDiffEditor: false, - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'Default Dark Modern', - 'editor.guides.bracketPairsHorizontal': 'active', - 'editor.wordBasedSuggestions': 'off', - 'editor.experimental.asyncTokenization': true - }) - }, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer: document.getElementById('monaco-editor-root')! }, languageClientConfigs: { groovy: { @@ -57,11 +58,10 @@ const userConfig: WrapperConfig = { export const runGroovyClient = () => { const wrapper = new MonacoEditorLanguageClientWrapper(); - const htmlElement = document.getElementById('monaco-editor-root'); try { document.querySelector('#button-start')?.addEventListener('click', async () => { - await wrapper.initAndStart(userConfig, htmlElement); + await wrapper.initAndStart(userConfig); }); document.querySelector('#button-dispose')?.addEventListener('click', async () => { await wrapper.dispose(); diff --git a/packages/examples/src/json/client/wrapperWs.ts b/packages/examples/src/json/client/wrapperWs.ts index e2cacdcb4..acf365b8a 100644 --- a/packages/examples/src/json/client/wrapperWs.ts +++ b/packages/examples/src/json/client/wrapperWs.ts @@ -17,9 +17,18 @@ const text = `{ export const jsonClientUserConfig: WrapperConfig = { logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getKeybindingsServiceOverride(), + }, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'editor.guides.bracketPairsHorizontal': 'active', + 'editor.lightbulb.enabled': 'On', + 'editor.wordBasedSuggestions': 'off', + 'editor.experimental.asyncTokenization': true + }) } }, editorAppConfig: { @@ -31,16 +40,8 @@ export const jsonClientUserConfig: WrapperConfig = { } }, useDiffEditor: false, - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'Default Dark Modern', - 'editor.guides.bracketPairsHorizontal': 'active', - 'editor.lightbulb.enabled': 'On', - 'editor.wordBasedSuggestions': 'off', - 'editor.experimental.asyncTokenization': true - }) - }, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer: document.getElementById('monaco-editor-root')! }, languageClientConfigs: { json: { @@ -69,11 +70,10 @@ export const jsonClientUserConfig: WrapperConfig = { export const runJsonWrapper = () => { const wrapper = new MonacoEditorLanguageClientWrapper(); - const htmlElement = document.getElementById('monaco-editor-root'); try { document.querySelector('#button-start')?.addEventListener('click', async () => { - await wrapper.initAndStart(jsonClientUserConfig, htmlElement); + await wrapper.initAndStart(jsonClientUserConfig); }); document.querySelector('#button-dispose')?.addEventListener('click', async () => { await wrapper.dispose(); diff --git a/packages/examples/src/json/server/json-server.ts b/packages/examples/src/json/server/json-server.ts index f9fc92c35..0ea13a963 100644 --- a/packages/examples/src/json/server/json-server.ts +++ b/packages/examples/src/json/server/json-server.ts @@ -2,7 +2,7 @@ * Copyright (c) 2024 TypeFox and others. * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import { readFile } from 'fs'; +import { readFile } from 'node:fs'; import requestLight from 'request-light'; import * as URI from 'vscode-uri'; import 'vscode-ws-jsonrpc'; diff --git a/packages/examples/src/langium/langium-dsl/config/classicConfig.ts b/packages/examples/src/langium/langium-dsl/config/classicConfig.ts index 53f16b34c..54ef2d407 100644 --- a/packages/examples/src/langium/langium-dsl/config/classicConfig.ts +++ b/packages/examples/src/langium/langium-dsl/config/classicConfig.ts @@ -19,7 +19,7 @@ export const setupLangiumClientClassic = async (): Promise => { const langiumWorker = loadLangiumWorker(); return { logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getConfigurationServiceOverride(), ...getEditorServiceOverride(useOpenEditorStub), @@ -49,7 +49,8 @@ export const setupLangiumClientClassic = async (): Promise => { useWorkerFactory({ logger }); - } + }, + htmlContainer: document.getElementById('monaco-editor-root')! }, languageClientConfigs: { langium: { diff --git a/packages/examples/src/langium/langium-dsl/config/extendedConfig.ts b/packages/examples/src/langium/langium-dsl/config/extendedConfig.ts index 28c635adb..1f3ace3c3 100644 --- a/packages/examples/src/langium/langium-dsl/config/extendedConfig.ts +++ b/packages/examples/src/langium/langium-dsl/config/extendedConfig.ts @@ -29,10 +29,18 @@ export const setupLangiumClientExtended = async (): Promise => { return { logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getEditorServiceOverride(useOpenEditorStub), ...getKeybindingsServiceOverride() + }, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'GitHub Dark High Contrast', + 'editor.guides.bracketPairsHorizontal': 'active', + 'editor.wordBasedSuggestions': 'off', + 'editor.experimental.asyncTokenization': true + }) } }, editorAppConfig: { @@ -68,15 +76,8 @@ export const setupLangiumClientExtended = async (): Promise => { }, filesOrContents: extensionFilesOrContents }], - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'GitHub Dark High Contrast', - 'editor.guides.bracketPairsHorizontal': 'active', - 'editor.wordBasedSuggestions': 'off', - 'editor.experimental.asyncTokenization': true - }) - }, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer: document.getElementById('monaco-editor-root')! }, languageClientConfigs: { langium: { diff --git a/packages/examples/src/langium/langium-dsl/wrapperLangium.ts b/packages/examples/src/langium/langium-dsl/wrapperLangium.ts index 88f7ecbba..1b2cffba0 100644 --- a/packages/examples/src/langium/langium-dsl/wrapperLangium.ts +++ b/packages/examples/src/langium/langium-dsl/wrapperLangium.ts @@ -11,7 +11,6 @@ import { disableButton } from '../../common/client/utils.js'; let wrapper: MonacoEditorLanguageClientWrapper | undefined; let extended = false; -const htmlElement = document.getElementById('monaco-editor-root'); export const runLangiumDslWrapper = async () => { try { @@ -31,7 +30,7 @@ export const startLangiumClientExtended = async () => { disableButton('button-start-extended', true); const config = await setupLangiumClientExtended(); wrapper = new MonacoEditorLanguageClientWrapper(); - wrapper.initAndStart(config, htmlElement); + wrapper.initAndStart(config); } catch (e) { console.log(e); } @@ -44,7 +43,7 @@ export const startLangiumClientClassic = async () => { disableButton('button-start-extended', true); const config = await setupLangiumClientClassic(); wrapper = new MonacoEditorLanguageClientWrapper(); - await wrapper.initAndStart(config, htmlElement!); + await wrapper.initAndStart(config); } catch (e) { console.log(e); } diff --git a/packages/examples/src/langium/statemachine/config/wrapperStatemachineConfig.ts b/packages/examples/src/langium/statemachine/config/wrapperStatemachineConfig.ts index a9234ef54..ec8f8d3a3 100644 --- a/packages/examples/src/langium/statemachine/config/wrapperStatemachineConfig.ts +++ b/packages/examples/src/langium/statemachine/config/wrapperStatemachineConfig.ts @@ -51,12 +51,20 @@ export const createLangiumGlobalConfig = async (params: { return { logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getKeybindingsServiceOverride(), ...getLifecycleServiceOverride(), ...getLocalizationServiceOverride(createDefaultLocaleConfiguration()), - } + }, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'editor.guides.bracketPairsHorizontal': 'active', + 'editor.wordBasedSuggestions': 'off', + 'editor.experimental.asyncTokenization': true + }) + }, }, editorAppConfig: { $type: 'extended', @@ -88,15 +96,8 @@ export const createLangiumGlobalConfig = async (params: { }, filesOrContents: extensionFilesOrContents }], - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'Default Dark Modern', - 'editor.guides.bracketPairsHorizontal': 'active', - 'editor.wordBasedSuggestions': 'off', - 'editor.experimental.asyncTokenization': true - }) - }, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer: document.getElementById('monaco-editor-root')! }, languageClientConfigs }; diff --git a/packages/examples/src/langium/statemachine/main-react.tsx b/packages/examples/src/langium/statemachine/main-react.tsx index 5a9c1f360..17137d59d 100644 --- a/packages/examples/src/langium/statemachine/main-react.tsx +++ b/packages/examples/src/langium/statemachine/main-react.tsx @@ -11,7 +11,7 @@ import { loadStatemachineWorkerRegular } from './main.js'; import text from './content/example.statemachine?raw'; export const runStatemachineReact = async () => { - const langiumGlobalConfig = await createLangiumGlobalConfig({ + const wrapperConfig = await createLangiumGlobalConfig({ languageServerId: 'react', useLanguageClient: true, text, @@ -20,7 +20,6 @@ export const runStatemachineReact = async () => { try { document.querySelector('#button-start')?.addEventListener('click', async () => { - const htmlElement = document.getElementById('monaco-editor-root'); const App = () => { const [ height, setHeight ] = useState('80vh'); @@ -38,15 +37,15 @@ export const runStatemachineReact = async () => {
+ wrapperConfig={wrapperConfig} />
); }; const strictMode = (document.getElementById('checkbox-strictmode')! as HTMLInputElement).checked; if (strictMode) { - ReactDOM.createRoot(htmlElement!).render(); + ReactDOM.createRoot(wrapperConfig.editorAppConfig.htmlContainer).render(); } else { - ReactDOM.createRoot(htmlElement!).render(); + ReactDOM.createRoot(wrapperConfig.editorAppConfig.htmlContainer).render(); } }); document.querySelector('#button-dispose')?.addEventListener('click', () => { diff --git a/packages/examples/src/langium/statemachine/main.ts b/packages/examples/src/langium/statemachine/main.ts index 317971ba6..c261e7755 100644 --- a/packages/examples/src/langium/statemachine/main.ts +++ b/packages/examples/src/langium/statemachine/main.ts @@ -47,7 +47,7 @@ const startEditor = async () => { messagePort: channel.port1, messageTransports: { reader, writer } }); - await wrapper.initAndStart(langiumGlobalConfig, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(langiumGlobalConfig); // here the modelReference is created manually and given to the updateEditorModels of the wrapper const uri = vscode.Uri.parse('/workspace/statemachine-mod.statemachine'); @@ -63,7 +63,7 @@ const startEditor = async () => { useLanguageClient: false, text: textMod }); - await wrapper2.initAndStart(langiumGlobalConfig2, document.getElementById('monaco-editor-root2')); + await wrapper2.initAndStart(langiumGlobalConfig2); vscode.commands.getCommands().then((x) => { console.log('Currently registered # of vscode commands: ' + x.length); diff --git a/packages/examples/src/multi/twoLanguageClients.ts b/packages/examples/src/multi/twoLanguageClients.ts index 705befed3..fa5837dc0 100644 --- a/packages/examples/src/multi/twoLanguageClients.ts +++ b/packages/examples/src/multi/twoLanguageClients.ts @@ -33,9 +33,16 @@ print("Hello Moon!") const wrapperConfig: WrapperConfig = { id: '42', logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getKeybindingsServiceOverride() + }, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'editor.wordBasedSuggestions': 'off', + 'editor.experimental.asyncTokenization': true + }) } }, editorAppConfig: { @@ -47,14 +54,8 @@ print("Hello Moon!") } }, useDiffEditor: false, - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'Default Dark Modern', - 'editor.wordBasedSuggestions': 'off', - 'editor.experimental.asyncTokenization': true - }) - }, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer: document.getElementById('monaco-editor-root')! }, languageClientConfigs: { json: { @@ -109,7 +110,6 @@ print("Hello Moon!") } }; - const htmlElement = document.getElementById('monaco-editor-root'); const wrapper = new MonacoEditorLanguageClientWrapper(); try { @@ -119,7 +119,7 @@ print("Hello Moon!") (wrapperConfig.editorAppConfig.codeResources.main as CodePlusFileExt).fileExt = currenFileExt; } - await wrapper.initAndStart(wrapperConfig, htmlElement); + await wrapper.initAndStart(wrapperConfig); disableButton('button-flip', false); }); document.querySelector('#button-dispose')?.addEventListener('click', async () => { diff --git a/packages/examples/src/python/client/config.ts b/packages/examples/src/python/client/config.ts index 2dd5ae6ee..300ff323e 100644 --- a/packages/examples/src/python/client/config.ts +++ b/packages/examples/src/python/client/config.ts @@ -64,10 +64,18 @@ export const createUserConfig = (workspaceRoot: string, code: string, codeUri: s } }, logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getEditorServiceOverride(useOpenEditorStub), ...getKeybindingsServiceOverride() + }, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'editor.guides.bracketPairsHorizontal': 'active', + 'editor.wordBasedSuggestions': 'off', + 'editor.experimental.asyncTokenization': true + }) } }, editorAppConfig: { @@ -78,16 +86,9 @@ export const createUserConfig = (workspaceRoot: string, code: string, codeUri: s uri: codeUri } }, - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'Default Dark Modern', - 'editor.guides.bracketPairsHorizontal': 'active', - 'editor.wordBasedSuggestions': 'off', - 'editor.experimental.asyncTokenization': true - }) - }, useDiffEditor: false, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer: document.getElementById('monaco-editor-root')! } }; }; diff --git a/packages/examples/src/python/client/main.ts b/packages/examples/src/python/client/main.ts index 36dbec979..b63897b71 100644 --- a/packages/examples/src/python/client/main.ts +++ b/packages/examples/src/python/client/main.ts @@ -22,7 +22,6 @@ export const runPythonWrapper = async () => { registerFileSystemOverlay(1, fileSystemProvider); const userConfig = createUserConfig('/workspace', helloPyCode, '/workspace/hello.py'); - const htmlElement = document.getElementById('monaco-editor-root'); const wrapper = new MonacoEditorLanguageClientWrapper(); try { @@ -36,7 +35,7 @@ export const runPythonWrapper = async () => { await vscode.workspace.openTextDocument(hello2PyUri); await vscode.workspace.openTextDocument(helloPyUri); - await wrapper.start(htmlElement); + await wrapper.start(); } }); document.querySelector('#button-dispose')?.addEventListener('click', async () => { diff --git a/packages/examples/src/python/client/reactPython.tsx b/packages/examples/src/python/client/reactPython.tsx index 13944ae2f..e7279b113 100644 --- a/packages/examples/src/python/client/reactPython.tsx +++ b/packages/examples/src/python/client/reactPython.tsx @@ -22,8 +22,8 @@ export const runPythonReact = async () => { const onTextChanged = (textChanges: TextChanges) => { console.log(`Dirty? ${textChanges.isDirty}\ntext: ${textChanges.text}\ntextOriginal: ${textChanges.textOriginal}`); }; - const htmlElement = document.getElementById('monaco-editor-root'); - const root = ReactDOM.createRoot(htmlElement!); + const wrapperConfig = createUserConfig('/workspace', badPyCode, '/workspace/bad.py'); + const root = ReactDOM.createRoot(wrapperConfig.editorAppConfig.htmlContainer); try { document.querySelector('#button-start')?.addEventListener('click', async () => { @@ -31,7 +31,7 @@ export const runPythonReact = async () => { return (
{ diff --git a/packages/examples/src/ts/wrapperTs.ts b/packages/examples/src/ts/wrapperTs.ts index 537f472e0..79d2c3161 100644 --- a/packages/examples/src/ts/wrapperTs.ts +++ b/packages/examples/src/ts/wrapperTs.ts @@ -25,11 +25,23 @@ export const runTsWrapper = async () => { const wrapperConfig: WrapperConfig = { logLevel: LogLevel.Debug, - serviceConfig: { + vscodeApiConfig: { userServices: { ...getKeybindingsServiceOverride() }, - enableExtHostWorker: true + enableExtHostWorker: true, + userConfiguration: { + json: JSON.stringify({ + 'workbench.colorTheme': 'Default Dark Modern', + 'typescript.tsserver.web.projectWideIntellisense.enabled': true, + 'typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors': false, + 'diffEditor.renderSideBySide': false, + 'editor.lightbulb.enabled': 'on', + 'editor.glyphMargin': true, + 'editor.guides.bracketPairsHorizontal': true, + 'editor.experimental.asyncTokenization': true + }) + } }, editorAppConfig: { $type: 'extended', @@ -44,28 +56,16 @@ export const runTsWrapper = async () => { } }, useDiffEditor: false, - userConfiguration: { - json: JSON.stringify({ - 'workbench.colorTheme': 'Default Dark Modern', - 'typescript.tsserver.web.projectWideIntellisense.enabled': true, - 'typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors': false, - 'diffEditor.renderSideBySide': false, - 'editor.lightbulb.enabled': 'on', - 'editor.glyphMargin': true, - 'editor.guides.bracketPairsHorizontal': true, - 'editor.experimental.asyncTokenization': true - }) - }, - monacoWorkerFactory: configureMonacoWorkers + monacoWorkerFactory: configureMonacoWorkers, + htmlContainer: document.getElementById('monaco-editor-root')! } }; const wrapper = new MonacoEditorLanguageClientWrapper(); - const htmlElement = document.getElementById('monaco-editor-root'); try { document.querySelector('#button-start')?.addEventListener('click', async () => { - await wrapper.initAndStart(wrapperConfig, htmlElement); + await wrapper.initAndStart(wrapperConfig); vscode.commands.getCommands().then((x) => { console.log(`Found ${x.length} commands`); @@ -106,7 +106,7 @@ export const runTsWrapper = async () => { // ensure it is boolean value and not undefined const useDiffEditor = wrapperConfig.editorAppConfig.useDiffEditor ?? false; wrapperConfig.editorAppConfig.useDiffEditor = !useDiffEditor; - await wrapper.initAndStart(wrapperConfig, htmlElement); + await wrapper.initAndStart(wrapperConfig); }); document.querySelector('#button-dispose')?.addEventListener('click', async () => { await wrapper.dispose(); diff --git a/packages/examples/vite.bundle.config.ts b/packages/examples/vite.bundle.config.ts index b7a44a2a8..e75875cb3 100644 --- a/packages/examples/vite.bundle.config.ts +++ b/packages/examples/vite.bundle.config.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ +import path from 'node:path'; import { defineConfig } from 'vite'; -import path from 'path'; export default defineConfig({ build: { diff --git a/packages/vscode-ws-jsonrpc/package.json b/packages/vscode-ws-jsonrpc/package.json index 9e5f6a51c..68e5780fd 100644 --- a/packages/vscode-ws-jsonrpc/package.json +++ b/packages/vscode-ws-jsonrpc/package.json @@ -51,7 +51,7 @@ "npm": ">=8.0.0" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" }, "files": [ diff --git a/packages/vscode-ws-jsonrpc/src/server/launch.ts b/packages/vscode-ws-jsonrpc/src/server/launch.ts index c622ccd42..ee092133b 100644 --- a/packages/vscode-ws-jsonrpc/src/server/launch.ts +++ b/packages/vscode-ws-jsonrpc/src/server/launch.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import * as net from 'net'; -import * as stream from 'stream'; -import * as cp from 'child_process'; +import * as net from 'node:net'; +import * as stream from 'node:stream'; +import * as cp from 'node:child_process'; import { StreamMessageReader, StreamMessageWriter, SocketMessageReader, SocketMessageWriter } from 'vscode-jsonrpc/node.js'; import { IConnection, createConnection } from './connection.js'; import { IWebSocket, IWebSocketConnection } from '../socket/socket.js'; diff --git a/packages/vscode-ws-jsonrpc/tsconfig.src.json b/packages/vscode-ws-jsonrpc/tsconfig.src.json index b7c5ac54f..235be2749 100644 --- a/packages/vscode-ws-jsonrpc/tsconfig.src.json +++ b/packages/vscode-ws-jsonrpc/tsconfig.src.json @@ -3,7 +3,8 @@ "compilerOptions": { "rootDir": "src", "outDir": "lib", - "declarationDir": "lib" + "declarationDir": "lib", + "skipLibCheck": true }, "include": [ "src/**/*.ts", diff --git a/packages/wrapper-react/CHANGELOG.md b/packages/wrapper-react/CHANGELOG.md index 3f6044c4e..be874528e 100644 --- a/packages/wrapper-react/CHANGELOG.md +++ b/packages/wrapper-react/CHANGELOG.md @@ -2,10 +2,12 @@ All notable changes to npm module [@typefox/monaco-editor-react](https://www.npmjs.com/package/@typefox/monaco-editor-react) are documented in this file. -## [6.0.0-next.1] - 2024-09-xy +## [6.0.0-next.2] - 2024-10-xy +- Support all arguments for monaco-vscode-api `initialize` [#756](https://github.com/TypeFox/monaco-languageclient/pull/756) + - On startup the current containerRef is passed to the interal editor app/monaco-editor - Update to monaco-vscode-api 9.0.x [#749](https://github.com/TypeFox/monaco-languageclient/pull/749) - - Updated to `monaco-editor-wrapper@9.0.0-next.1` and `monaco-languageclient@6.0.0-next.1`. Updated all `@codingame/monaco-vscode` packages to `9.0.3`. + - Updated to `monaco-editor-wrapper@9.0.0-next.2` and `monaco-languageclient@6.0.0-next.2`. Updated all `@codingame/monaco-vscode` packages to `9.0.3`. - Enhancements to logging - monaco-languageclient config improvement, wrapper+languageclientwrapper improvements [#741](https://github.com/TypeFox/monaco-languageclient/pull/741) - Turned react component from class to function [#739](https://github.com/TypeFox/monaco-languageclient/pull/739) diff --git a/packages/wrapper-react/package.json b/packages/wrapper-react/package.json index d41434da3..4240246c4 100644 --- a/packages/wrapper-react/package.json +++ b/packages/wrapper-react/package.json @@ -1,6 +1,6 @@ { "name": "@typefox/monaco-editor-react", - "version": "6.0.0-next.1", + "version": "6.0.0-next.2", "license": "MIT", "description": "React component for Monaco-Editor and Monaco Languageclient", "keywords": [ @@ -38,20 +38,20 @@ "build": "npm run clean && npm run compile" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" }, "dependencies": { "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-editor-wrapper": "~6.0.0-next.1", - "monaco-languageclient": "~9.0.0-next.1", + "monaco-editor-wrapper": "~6.0.0-next.2", + "monaco-languageclient": "~9.0.0-next.2", "react": "~18.3.1", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3" }, "peerDependencies": { "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-editor-wrapper": "~6.0.0-next.1", - "monaco-languageclient": "~9.0.0-next.1", + "monaco-editor-wrapper": "~6.0.0-next.2", + "monaco-languageclient": "~9.0.0-next.2", "react": "~18.3.1", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3" }, diff --git a/packages/wrapper-react/src/index.tsx b/packages/wrapper-react/src/index.tsx index 399806b99..d98b6b64a 100644 --- a/packages/wrapper-react/src/index.tsx +++ b/packages/wrapper-react/src/index.tsx @@ -79,7 +79,8 @@ export const MonacoEditorReactComp: React.FC = (props) => { if (containerRef.current) { containerRef.current.className = className ?? ''; try { - await wrapperRef.current.start(containerRef.current); + wrapperRef.current.getMonacoEditorApp()?.updateHtmlContainer(containerRef.current); + await wrapperRef.current.start(); onLoad?.(wrapperRef.current); handleOnTextChanged(); } catch (e) { @@ -89,6 +90,8 @@ export const MonacoEditorReactComp: React.FC = (props) => { throw e; } } + } else { + throw new Error('No htmlContainer found'); } }, [className, onError, onLoad]); diff --git a/packages/wrapper-react/test/helper.ts b/packages/wrapper-react/test/helper.ts index b399fc065..b41ab878a 100644 --- a/packages/wrapper-react/test/helper.ts +++ b/packages/wrapper-react/test/helper.ts @@ -4,6 +4,14 @@ * ------------------------------------------------------------------------------------------ */ import { EditorAppClassic, EditorAppExtended } from 'monaco-editor-wrapper'; +import { useWorkerFactory } from 'monaco-editor-wrapper/workerFactory'; + +export const createMonacoEditorDiv = () => { + const div = document.createElement('div'); + div.id = 'monaco-editor-root'; + document.body.insertAdjacentElement('beforeend', div); + return div; +}; export const updateExtendedAppPrototyp = async () => { EditorAppExtended.prototype.specifyServices = async () => { @@ -15,3 +23,14 @@ export const updateExtendedAppPrototyp = async () => { return Promise.resolve({}); }; }; + +export const configureMonacoWorkers = () => { + useWorkerFactory({ + workerOverrides: { + ignoreMapping: true, + workerLoaders: { + TextEditorWorker: () => new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url), { type: 'module' }), + } + } + }); +}; diff --git a/packages/wrapper-react/test/index.test.tsx b/packages/wrapper-react/test/index.test.tsx index 5b74750f3..21720283c 100644 --- a/packages/wrapper-react/test/index.test.tsx +++ b/packages/wrapper-react/test/index.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { LogLevel } from 'vscode/services'; import { MonacoEditorLanguageClientWrapper, WrapperConfig } from 'monaco-editor-wrapper'; import { MonacoEditorReactComp, TextChanges } from '@typefox/monaco-editor-react'; -import { updateExtendedAppPrototyp } from './helper.js'; +import { configureMonacoWorkers, createMonacoEditorDiv, updateExtendedAppPrototyp } from './helper.js'; describe('Test MonacoEditorReactComp', () => { test('rerender', async () => { @@ -18,6 +18,8 @@ describe('Test MonacoEditorReactComp', () => { logLevel: LogLevel.Debug, editorAppConfig: { $type: 'extended', + htmlContainer: createMonacoEditorDiv(), + monacoWorkerFactory: configureMonacoWorkers } }; const { rerender } = render(); @@ -50,7 +52,9 @@ describe('Test MonacoEditorReactComp', () => { text: 'hello world', fileExt: 'js' } - } + }, + htmlContainer: createMonacoEditorDiv(), + monacoWorkerFactory: configureMonacoWorkers } }; @@ -88,7 +92,9 @@ describe('Test MonacoEditorReactComp', () => { text: 'hello world', fileExt: 'js' } - } + }, + htmlContainer: createMonacoEditorDiv(), + monacoWorkerFactory: configureMonacoWorkers } }; diff --git a/packages/wrapper/CHANGELOG.md b/packages/wrapper/CHANGELOG.md index 657767553..c36f64f14 100644 --- a/packages/wrapper/CHANGELOG.md +++ b/packages/wrapper/CHANGELOG.md @@ -2,10 +2,12 @@ All notable changes to npm module [monaco-editor-wrapper](https://www.npmjs.com/package/monaco-editor-wrapper) are documented in this file. -## [6.0.0-next.1] - 2024-08-xy +## [6.0.0-next.2] - 2024-10-xy +- Support all arguments for monaco-vscode-api `initialize` [#756](https://github.com/TypeFox/monaco-languageclient/pull/756) + - This also allows to configure editor-, view- or workspace-service. This is a preparation for further enhancements. - Update to monaco-vscode-api 9.0.x [#749](https://github.com/TypeFox/monaco-languageclient/pull/749) - - Updated to `monaco-languageclient@9.0.0-next.1`. Updated all `@codingame/monaco-vscode` packages to `9.0.3`. + - Updated to `monaco-languageclient@9.0.0-next.2`. Updated all `@codingame/monaco-vscode` packages to `9.0.3`. - Enhancements to logging, worker factory and start order. The worker factory only accepts direct worker loading instructions from now on - monaco-languageclient config improvement, wrapper+languageclientwrapper improvements [#741](https://github.com/TypeFox/monaco-languageclient/pull/741) - Allows to configure more than one language client diff --git a/packages/wrapper/build/buildWorker.mts b/packages/wrapper/build/buildWorker.mts index fa18ca1a1..826263e66 100644 --- a/packages/wrapper/build/buildWorker.mts +++ b/packages/wrapper/build/buildWorker.mts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { build, Format } from 'esbuild'; export const getLocalDirectory = () => { diff --git a/packages/wrapper/build/vite.cssWorker.ts b/packages/wrapper/build/vite.cssWorker.ts index c3a681a47..b76b3a2e4 100644 --- a/packages/wrapper/build/vite.cssWorker.ts +++ b/packages/wrapper/build/vite.cssWorker.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import path from 'path'; +import path from 'node:path'; import { defineConfig } from 'vite'; const config = defineConfig({ diff --git a/packages/wrapper/build/vite.editorWorker.ts b/packages/wrapper/build/vite.editorWorker.ts index 755944237..f002e333b 100644 --- a/packages/wrapper/build/vite.editorWorker.ts +++ b/packages/wrapper/build/vite.editorWorker.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import path from 'path'; +import path from 'node:path'; import { defineConfig } from 'vite'; const config = defineConfig({ diff --git a/packages/wrapper/build/vite.htmlWorker.ts b/packages/wrapper/build/vite.htmlWorker.ts index c7bb7ff58..e0452c56b 100644 --- a/packages/wrapper/build/vite.htmlWorker.ts +++ b/packages/wrapper/build/vite.htmlWorker.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import path from 'path'; +import path from 'node:path'; import { defineConfig } from 'vite'; const config = defineConfig({ diff --git a/packages/wrapper/build/vite.jsonWorker.ts b/packages/wrapper/build/vite.jsonWorker.ts index 3d7de36c8..7e9fe4211 100644 --- a/packages/wrapper/build/vite.jsonWorker.ts +++ b/packages/wrapper/build/vite.jsonWorker.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import path from 'path'; +import path from 'node:path'; import { defineConfig } from 'vite'; const config = defineConfig({ diff --git a/packages/wrapper/build/vite.tsWorker.ts b/packages/wrapper/build/vite.tsWorker.ts index 23a68e243..f4b158eeb 100644 --- a/packages/wrapper/build/vite.tsWorker.ts +++ b/packages/wrapper/build/vite.tsWorker.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE in the package root for license information. * ------------------------------------------------------------------------------------------ */ -import path from 'path'; +import path from 'node:path'; import { defineConfig } from 'vite'; const config = defineConfig({ diff --git a/packages/wrapper/package.json b/packages/wrapper/package.json index ad06fc486..8af88fbf3 100644 --- a/packages/wrapper/package.json +++ b/packages/wrapper/package.json @@ -1,6 +1,6 @@ { "name": "monaco-editor-wrapper", - "version": "6.0.0-next.1", + "version": "6.0.0-next.2", "license": "MIT", "description": "Wrapper for monaco-vscode-editor-api and monaco-languageclient", "keywords": [ @@ -81,7 +81,7 @@ "build": "npm run clean && npm run compile && npm run build:workers:esbuild && npm run build:workers:vite" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" }, "dependencies": { @@ -105,6 +105,8 @@ "@codingame/monaco-vscode-textmate-service-override": "~9.0.3", "@codingame/monaco-vscode-theme-defaults-default-extension": "~9.0.3", "@codingame/monaco-vscode-theme-service-override": "~9.0.3", + "@codingame/monaco-vscode-views-service-override": "~9.0.3", + "@codingame/monaco-vscode-workbench-service-override": "~9.0.3", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3", "vscode-languageclient": "~9.0.1", @@ -120,7 +122,7 @@ }, "peerDependencies": { "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-languageclient": "~9.0.0-next.1", + "monaco-languageclient": "~9.0.0-next.2", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3" }, "peerDependenciesMeta": { diff --git a/packages/wrapper/src/editorAppBase.ts b/packages/wrapper/src/editorAppBase.ts index f252f67a6..cd51e2e16 100644 --- a/packages/wrapper/src/editorAppBase.ts +++ b/packages/wrapper/src/editorAppBase.ts @@ -6,7 +6,6 @@ import * as monaco from 'monaco-editor'; import { createModelReference, ITextFileEditorModel } from 'vscode/monaco'; import { IReference } from '@codingame/monaco-vscode-editor-service-override'; -import { getUserConfiguration } from '@codingame/monaco-vscode-configuration-service-override'; import { Logger } from 'monaco-languageclient/tools'; import { getEditorUri, isModelUpdateRequired, ModelUpdateType } from './utils.js'; @@ -32,6 +31,7 @@ export type EditorAppType = 'extended' | 'classic'; export interface EditorAppConfigBase { $type: EditorAppType; + htmlContainer: HTMLElement; codeResources?: CodeResources; useDiffEditor?: boolean; domReadOnly?: boolean; @@ -39,7 +39,7 @@ export interface EditorAppConfigBase { overrideAutomaticLayout?: boolean; editorOptions?: monaco.editor.IStandaloneEditorConstructionOptions; diffEditorOptions?: monaco.editor.IStandaloneDiffEditorConstructionOptions; - monacoWorkerFactory?: (logger: Logger) => void; + monacoWorkerFactory?: (logger?: Logger) => void; } export interface ModelRefs { @@ -83,6 +83,7 @@ export abstract class EditorAppBase { protected buildConfig(userAppConfig: EditorAppConfigBase): EditorAppConfigBase { const config: EditorAppConfigBase = { $type: userAppConfig.$type, + htmlContainer: userAppConfig.htmlContainer, codeResources: userAppConfig.codeResources, useDiffEditor: userAppConfig.useDiffEditor ?? false, readOnly: userAppConfig.readOnly ?? false, @@ -112,11 +113,11 @@ export abstract class EditorAppBase { return this.diffEditor; } - async createEditors(container: HTMLElement): Promise { + async createEditors(): Promise { if (this.getConfig().useDiffEditor ?? false) { - this.diffEditor = monaco.editor.createDiffEditor(container, this.getConfig().diffEditorOptions); + this.diffEditor = monaco.editor.createDiffEditor(this.getConfig().htmlContainer, this.getConfig().diffEditorOptions); } else { - this.editor = monaco.editor.create(container, this.getConfig().editorOptions); + this.editor = monaco.editor.create(this.getConfig().htmlContainer, this.getConfig().editorOptions); } const modelRefs = await this.buildModelRefs(this.getConfig().codeResources); @@ -264,11 +265,7 @@ export abstract class EditorAppBase { this.getEditor()?.updateOptions(options); } - getUserConfiguration(): Promise { - return getUserConfiguration(); - } - - abstract loadUserConfiguration(): Promise; + abstract updateHtmlContainer(htmlContainer: HTMLElement): void; abstract init(): Promise; abstract specifyServices(): Promise; abstract getConfig(): EditorAppConfigBase; diff --git a/packages/wrapper/src/editorAppClassic.ts b/packages/wrapper/src/editorAppClassic.ts index e20b253c3..8c429aa1c 100644 --- a/packages/wrapper/src/editorAppClassic.ts +++ b/packages/wrapper/src/editorAppClassic.ts @@ -7,6 +7,7 @@ import * as monaco from 'monaco-editor'; import { Logger } from 'monaco-languageclient/tools'; import { EditorAppBase, EditorAppConfigBase } from './editorAppBase.js'; import { ModelUpdateType, isEqual, isModelUpdateRequired } from './utils.js'; +import { ConfigurationTarget, IConfigurationService, StandaloneServices } from 'vscode/services'; export interface EditorAppConfigClassic extends EditorAppConfigBase { $type: 'classic'; @@ -37,6 +38,10 @@ export class EditorAppClassic extends EditorAppBase { return this.config; } + updateHtmlContainer(htmlContainer: HTMLElement) { + this.config.htmlContainer = htmlContainer; + } + override async specifyServices(): Promise { const getMonarchServiceOverride = (await import('@codingame/monaco-vscode-monarch-service-override')).default; return { @@ -44,10 +49,6 @@ export class EditorAppClassic extends EditorAppBase { }; } - override async loadUserConfiguration() { - // nothing needed here currently - } - async init() { const languageDef = this.config.languageDef; if (languageDef) { @@ -72,6 +73,12 @@ export class EditorAppClassic extends EditorAppBase { monaco.editor.setTheme(languageDef.theme.name); } } + + if (this.config.editorOptions?.['semanticHighlighting.enabled'] !== undefined) { + StandaloneServices.get(IConfigurationService).updateValue('editor.semanticHighlighting.enabled', + this.config.editorOptions['semanticHighlighting.enabled'], ConfigurationTarget.USER); + } + this.logger?.info('Init of Classic App was completed.'); } diff --git a/packages/wrapper/src/editorAppExtended.ts b/packages/wrapper/src/editorAppExtended.ts index 2c3d34043..6e3c86bb1 100644 --- a/packages/wrapper/src/editorAppExtended.ts +++ b/packages/wrapper/src/editorAppExtended.ts @@ -5,7 +5,6 @@ import type * as vscode from 'vscode'; import * as monaco from 'monaco-editor'; -import { updateUserConfiguration } from '@codingame/monaco-vscode-configuration-service-override'; import { registerExtension, IExtensionManifest, ExtensionHostKind } from 'vscode/extensions'; import { Logger } from 'monaco-languageclient/tools'; import { EditorAppBase, EditorAppConfigBase } from './editorAppBase.js'; @@ -17,15 +16,10 @@ export interface ExtensionConfig { filesOrContents?: Map; } -export interface UserConfiguration { - json?: string; -} - export interface EditorAppConfigExtended extends EditorAppConfigBase { $type: 'extended'; loadThemes?: boolean; extensions?: ExtensionConfig[]; - userConfiguration?: UserConfiguration; } export interface RegisterExtensionResult { @@ -57,7 +51,6 @@ export class EditorAppExtended extends EditorAppBase { this.logger = logger; this.config = this.buildConfig(editorAppConfig) as EditorAppConfigExtended; this.config.extensions = editorAppConfig.extensions ?? undefined; - this.config.userConfiguration = editorAppConfig.userConfiguration ?? undefined; this.config.loadThemes = editorAppConfig.loadThemes ?? true; } @@ -65,6 +58,10 @@ export class EditorAppExtended extends EditorAppBase { return this.config; } + updateHtmlContainer(htmlContainer: HTMLElement) { + this.config.htmlContainer = htmlContainer; + } + getExtensionRegisterResult(extensionName: string) { return this.extensionRegisterResults.get(extensionName); } @@ -78,11 +75,6 @@ export class EditorAppExtended extends EditorAppBase { }; } - override async loadUserConfiguration() { - // buildConfig ensures userConfiguration is available - await updateUserConfiguration(this.config.userConfiguration?.json ?? JSON.stringify({})); - } - override async init() { if (this.config.loadThemes ?? true) { await import('@codingame/monaco-vscode-theme-defaults-default-extension'); diff --git a/packages/wrapper/src/vscode/services.ts b/packages/wrapper/src/vscode/services.ts index 6d3c6d278..85acbdf24 100644 --- a/packages/wrapper/src/vscode/services.ts +++ b/packages/wrapper/src/vscode/services.ts @@ -7,34 +7,59 @@ import * as vscode from 'vscode'; import * as monaco from 'monaco-editor'; import { OpenEditor } from '@codingame/monaco-vscode-editor-service-override'; import { LogLevel } from 'vscode/services'; -import { mergeServices, InitializeServiceConfig } from 'monaco-languageclient/vscode/services'; +import { mergeServices, VscodeApiConfig } from 'monaco-languageclient/vscode/services'; export interface VscodeServicesConfig { - serviceConfig: InitializeServiceConfig; + vscodeApiConfig: VscodeApiConfig; specificServices: monaco.editor.IEditorOverrideServices; logLevel: LogLevel + semanticHighlighting?: boolean; } /** * Child classes are allow to override the services configuration implementation. */ -export const configureServices = async (config: VscodeServicesConfig): Promise => { - const serviceConfig = config.serviceConfig; +export const configureVscodeApi = async (config: VscodeServicesConfig): Promise => { + const vscodeApiConfig = config.vscodeApiConfig; // set empty object if undefined - serviceConfig.userServices = serviceConfig.userServices ?? {}; + vscodeApiConfig.userServices = vscodeApiConfig.userServices ?? {}; // import configuration service if it is not available - if (serviceConfig.userServices.configurationService === undefined) { + if (vscodeApiConfig.userServices.configurationService === undefined) { const getConfigurationServiceOverride = (await import('@codingame/monaco-vscode-configuration-service-override')).default; const mlcDefautServices = { ...getConfigurationServiceOverride() }; - mergeServices(mlcDefautServices, serviceConfig.userServices); + mergeServices(mlcDefautServices, vscodeApiConfig.userServices); } + let extra = {}; + if (vscodeApiConfig.viewsConfig !== undefined) { + if (vscodeApiConfig.viewsConfig.viewServiceType === 'ViewsService') { + const getViewsServiceOverride = (await import('@codingame/monaco-vscode-views-service-override')).default; + extra = { + ...getViewsServiceOverride(vscodeApiConfig.viewsConfig.openEditorFunc ?? useOpenEditorStub) + }; + } else if (vscodeApiConfig.viewsConfig.viewServiceType === 'WorkspaceService') { + const getWorkbenchServiceOverride = (await import('@codingame/monaco-vscode-workbench-service-override')).default; + extra = { + ...getWorkbenchServiceOverride() + }; + } + } + + // if nothing was added above, add the standard + if (Object.keys(extra).length === 0) { + const getEditorServiceOverride = (await import('@codingame/monaco-vscode-editor-service-override')).default; + extra = { + ...getEditorServiceOverride(vscodeApiConfig.viewsConfig?.openEditorFunc ?? useOpenEditorStub) + }; + } + mergeServices(extra, vscodeApiConfig.userServices); + // adding the default workspace config if not provided - if (serviceConfig.workspaceConfig === undefined) { - serviceConfig.workspaceConfig = { + if (vscodeApiConfig.workspaceConfig === undefined) { + vscodeApiConfig.workspaceConfig = { workspaceProvider: { trusted: true, workspace: { @@ -47,24 +72,34 @@ export const configureServices = async (config: VscodeServicesConfig): Promise = { - ...serviceConfig.workspaceConfig.developmentOptions + ...vscodeApiConfig.workspaceConfig.developmentOptions }; devOptions.logLevel = config.logLevel; - (serviceConfig.workspaceConfig.developmentOptions as Record) = Object.assign({}, devOptions); + (vscodeApiConfig.workspaceConfig.developmentOptions as Record) = Object.assign({}, devOptions); } else if (devLogLevel !== config.logLevel) { throw new Error(`You have configured mismatching logLevels: ${config.logLevel} (wrapperConfig) ${devLogLevel} (workspaceConfig.developmentOptions)`); } - return serviceConfig; + // enable semantic highlighting in the default configuration + if (config.semanticHighlighting ?? false) { + const configDefaults: Record = { + ...vscodeApiConfig.workspaceConfig.configurationDefaults + }; + configDefaults['editor.semanticHighlighting.enabled'] = true; + (vscodeApiConfig.workspaceConfig.configurationDefaults as Record) = Object.assign({}, configDefaults); + } + + return vscodeApiConfig; }; export const useOpenEditorStub: OpenEditor = async (modelRef, options, sideBySide) => { diff --git a/packages/wrapper/src/wrapper.ts b/packages/wrapper/src/wrapper.ts index 79ece0810..0c8e1810d 100644 --- a/packages/wrapper/src/wrapper.ts +++ b/packages/wrapper/src/wrapper.ts @@ -6,18 +6,19 @@ import * as monaco from 'monaco-editor'; import { LogLevel } from 'vscode/services'; import { MonacoLanguageClient } from 'monaco-languageclient'; -import { InitializeServiceConfig, initServices } from 'monaco-languageclient/vscode/services'; +import { VscodeApiConfig, initServices } from 'monaco-languageclient/vscode/services'; import { Logger, ConsoleLogger } from 'monaco-languageclient/tools'; -import { checkServiceConsistency, configureServices } from './vscode/services.js'; +import { checkServiceConsistency, configureVscodeApi } from './vscode/services.js'; import { EditorAppConfigExtended, EditorAppExtended } from './editorAppExtended.js'; import { EditorAppClassic, EditorAppConfigClassic } from './editorAppClassic.js'; import { CodeResources, ModelRefs, TextContents, TextModels } from './editorAppBase.js'; import { LanguageClientConfig, LanguageClientWrapper } from './languageClientWrapper.js'; +import { updateUserConfiguration } from '@codingame/monaco-vscode-configuration-service-override'; export interface WrapperConfig { id?: string; logLevel?: LogLevel | number; - serviceConfig?: InitializeServiceConfig; + vscodeApiConfig?: VscodeApiConfig; editorAppConfig: EditorAppConfigExtended | EditorAppConfigClassic; languageClientConfigs?: Record; } @@ -53,6 +54,11 @@ export class MonacoEditorLanguageClientWrapper { throw new Error(`Use diff editor was used without a valid config. code: ${editorAppConfig.codeResources?.main} codeOriginal: ${editorAppConfig.codeResources?.original}`); } + const viewServiceType = wrapperConfig.vscodeApiConfig?.viewsConfig?.viewServiceType ?? 'EditorService'; + if ((viewServiceType === 'ViewsService' || viewServiceType === 'WorkspaceService') && editorAppConfig.$type === 'classic') { + throw new Error(`View Service Type "${viewServiceType}" cannot be used with classic configuration.`); + } + // Always dispose old instances before start this.dispose(false); this.id = wrapperConfig.id ?? Math.floor(Math.random() * 101).toString(); @@ -70,21 +76,26 @@ export class MonacoEditorLanguageClientWrapper { // editorApps init their own service thats why they have to be created first const specificServices = await this.editorApp.specifyServices(); - const serviceConfig = await configureServices({ - serviceConfig: wrapperConfig.serviceConfig ?? {}, + const vscodeApiConfig = await configureVscodeApi({ + vscodeApiConfig: wrapperConfig.vscodeApiConfig ?? {}, specificServices, - logLevel: this.logger.getLevel() + logLevel: this.logger.getLevel(), + // workaround for classic monaco-editor not applying semanticHighlighting + semanticHighlighting: wrapperConfig.editorAppConfig.editorOptions?.['semanticHighlighting.enabled'] === true }); + wrapperConfig.vscodeApiConfig = vscodeApiConfig; await initServices({ - userServices: serviceConfig.userServices, - enableExtHostWorker: serviceConfig.enableExtHostWorker, - workspaceConfig: serviceConfig.workspaceConfig, + userServices: vscodeApiConfig.userServices, + enableExtHostWorker: vscodeApiConfig.enableExtHostWorker, + workspaceConfig: vscodeApiConfig.workspaceConfig, + userConfiguration: vscodeApiConfig.userConfiguration, + htmlContainer: editorAppConfig.htmlContainer, caller: `monaco-editor (${this.id})`, performChecks: checkServiceConsistency, logger: this.logger }); - await this.editorApp.loadUserConfiguration(); + await updateUserConfiguration(vscodeApiConfig.userConfiguration?.json ?? JSON.stringify({})); const lccEntries = Object.entries(wrapperConfig.languageClientConfigs ?? {}); if (lccEntries.length > 0) { @@ -98,31 +109,29 @@ export class MonacoEditorLanguageClientWrapper { } await this.editorApp.init(); - this.initDone = true; + + return wrapperConfig; } /** * Performs a full user configuration and the languageclient wrapper (if used) init and then start the application. */ - async initAndStart(wrapperConfig: WrapperConfig, htmlElement: HTMLElement | null) { + async initAndStart(wrapperConfig: WrapperConfig) { await this.init(wrapperConfig); - await this.start(htmlElement); + await this.start(); } /** * Does not perform any user configuration or other application init and just starts the application. */ - async start(htmlElement: HTMLElement | null) { + async start() { if (!this.initDone) { throw new Error('No init was performed. Please call init() before start()'); } - if (!htmlElement) { - throw new Error('No HTMLElement provided for monaco-editor.'); - } this.logger.info(`Starting monaco-editor (${this.id})`); - await this.editorApp?.createEditors(htmlElement); + await this.editorApp?.createEditors(); for (const lcw of this.languageClientWrappers.values()) { await lcw.start(); diff --git a/packages/wrapper/test/editorAppExtended.test.ts b/packages/wrapper/test/editorAppExtended.test.ts index 17aa89ffb..efa3cf65e 100644 --- a/packages/wrapper/test/editorAppExtended.test.ts +++ b/packages/wrapper/test/editorAppExtended.test.ts @@ -20,15 +20,6 @@ describe('Test EditorAppExtended', () => { expect(verifyUrlOrCreateDataUrl(text)).toBe(`data:text/plain;base64,${btoa(text)}`); }); - test('config userConfiguration', () => { - const appConfig = createWrapperConfigExtendedApp().editorAppConfig as EditorAppConfigExtended; - appConfig.userConfiguration = { - json: '{ "editor.semanticHighlighting.enabled": true }' - }; - const app = new EditorAppExtended('config defaults', appConfig); - expect(app.getConfig().userConfiguration?.json).toEqual('{ "editor.semanticHighlighting.enabled": true }'); - }); - test('isAppConfigDifferent: basic', () => { const orgConfig = createWrapperConfigExtendedApp().editorAppConfig as EditorAppConfigExtended; const config = createWrapperConfigExtendedApp().editorAppConfig as EditorAppConfigExtended; diff --git a/packages/wrapper/test/helper.ts b/packages/wrapper/test/helper.ts index a9081ba08..bc0bc59c4 100644 --- a/packages/wrapper/test/helper.ts +++ b/packages/wrapper/test/helper.ts @@ -4,11 +4,13 @@ * ------------------------------------------------------------------------------------------ */ import { WrapperConfig } from 'monaco-editor-wrapper'; +import { useWorkerFactory } from 'monaco-editor-wrapper/workerFactory'; export const createMonacoEditorDiv = () => { const div = document.createElement('div'); div.id = 'monaco-editor-root'; document.body.insertAdjacentElement('beforeend', div); + return div; }; export const createWrapperConfigExtendedApp = (): WrapperConfig => { @@ -23,6 +25,8 @@ export const createWrapperConfigExtendedApp = (): WrapperConfig => { } }, useDiffEditor: false, + htmlContainer: createMonacoEditorDiv(), + monacoWorkerFactory: configureMonacoWorkers } }; }; @@ -38,6 +42,19 @@ export const createWrapperConfigClassicApp = (): WrapperConfig => { } }, useDiffEditor: false, + htmlContainer: createMonacoEditorDiv(), + monacoWorkerFactory: configureMonacoWorkers } }; }; + +export const configureMonacoWorkers = () => { + useWorkerFactory({ + workerOverrides: { + ignoreMapping: true, + workerLoaders: { + TextEditorWorker: () => new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url), { type: 'module' }), + } + } + }); +}; diff --git a/packages/wrapper/test/vscode/services.test.ts b/packages/wrapper/test/vscode/services.test.ts index 57e75bf9b..526a48e91 100644 --- a/packages/wrapper/test/vscode/services.test.ts +++ b/packages/wrapper/test/vscode/services.test.ts @@ -5,23 +5,23 @@ import { describe, expect, test } from 'vitest'; import { LogLevel } from 'vscode/services'; -import { configureServices } from '../../src/vscode/services.js'; +import { configureVscodeApi } from '../../src/vscode/services.js'; describe('createUrl', () => { test('test configureServices logLevel trace', async () => { - const serviceConfig = await configureServices({ - serviceConfig: {}, + const vscodeApiConfig = await configureVscodeApi({ + vscodeApiConfig: {}, specificServices: {}, logLevel: LogLevel.Trace }); - expect(serviceConfig.workspaceConfig?.developmentOptions?.logLevel).toBe(LogLevel.Trace); + expect(vscodeApiConfig.workspaceConfig?.developmentOptions?.logLevel).toBe(LogLevel.Trace); }); test('test configureServices logLevel and developmenet info', async () => { - const serviceConfig = await configureServices({ - serviceConfig: { + const vscodeApiConfig = await configureVscodeApi({ + vscodeApiConfig: { workspaceConfig: { developmentOptions: { logLevel: LogLevel.Info @@ -32,13 +32,13 @@ describe('createUrl', () => { logLevel: LogLevel.Info }); - expect(serviceConfig.workspaceConfig?.developmentOptions?.logLevel).toBe(LogLevel.Info); + expect(vscodeApiConfig.workspaceConfig?.developmentOptions?.logLevel).toBe(LogLevel.Info); }); test('test configureServices logLevel development mismatch', async () => { - await expect(async () => { - await configureServices({ - serviceConfig: { + expect(async () => { + await configureVscodeApi({ + vscodeApiConfig: { workspaceConfig: { developmentOptions: { logLevel: LogLevel.Info diff --git a/packages/wrapper/test/wrapper.test.ts b/packages/wrapper/test/wrapper.test.ts index a6943ce8b..d80a961cf 100644 --- a/packages/wrapper/test/wrapper.test.ts +++ b/packages/wrapper/test/wrapper.test.ts @@ -6,8 +6,9 @@ import * as vscode from 'vscode'; import { createModelReference } from 'vscode/monaco'; import { describe, expect, test } from 'vitest'; -import { isReInitRequired, EditorAppClassic, EditorAppConfigExtended, MonacoEditorLanguageClientWrapper } from 'monaco-editor-wrapper'; +import { isReInitRequired, EditorAppClassic, EditorAppConfigExtended, MonacoEditorLanguageClientWrapper, EditorAppConfigClassic } from 'monaco-editor-wrapper'; import { createMonacoEditorDiv, createWrapperConfigClassicApp, createWrapperConfigExtendedApp } from './helper.js'; +import { IConfigurationService, StandaloneServices } from 'vscode/services'; describe('Test MonacoEditorLanguageClientWrapper', () => { @@ -25,7 +26,7 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { test('Check default values', async () => { createMonacoEditorDiv(); const wrapper = new MonacoEditorLanguageClientWrapper(); - await wrapper.initAndStart(createWrapperConfigClassicApp(), document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(createWrapperConfigClassicApp()); const app = wrapper.getMonacoEditorApp() as EditorAppClassic; expect(app).toBeDefined(); @@ -34,29 +35,21 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { expect(appConfig.overrideAutomaticLayout).toBeTruthy(); }); - test('No HTML in Userconfig', async () => { - createMonacoEditorDiv(); - const wrapper = new MonacoEditorLanguageClientWrapper(); - await expect(async () => { - await wrapper.initAndStart(createWrapperConfigClassicApp(), null); - }).rejects.toThrowError('No HTMLElement provided for monaco-editor.'); - }); - test('Expected throw: Start without init', async () => { createMonacoEditorDiv(); const wrapper = new MonacoEditorLanguageClientWrapper(); - await expect(async () => { - await wrapper.start(document.getElementById('monaco-editor-root')); + expect(async () => { + await wrapper.start(); }).rejects.toThrowError('No init was performed. Please call init() before start()'); }); test('Expected throw: Call normal start with prior init', async () => { createMonacoEditorDiv(); const wrapper = new MonacoEditorLanguageClientWrapper(); - await expect(async () => { + expect(async () => { const config = createWrapperConfigClassicApp(); await wrapper.init(config); - await wrapper.initAndStart(config, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(config); }).rejects.toThrowError('init was already performed. Please call dispose first if you want to re-start.'); }); @@ -84,7 +77,7 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { createMonacoEditorDiv(); const wrapper = new MonacoEditorLanguageClientWrapper(); const userConfig = createWrapperConfigClassicApp(); - await wrapper.initAndStart(userConfig, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(userConfig); const app = wrapper.getMonacoEditorApp(); const modelRefs = app?.getModelRefs(); @@ -106,7 +99,7 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { text: 'original', fileExt: 'js' }; - await wrapper.initAndStart(wrapperConfig, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(wrapperConfig); const app = wrapper.getMonacoEditorApp(); const modelRefs = app?.getModelRefs(); @@ -127,7 +120,7 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { text: 'original', fileExt: 'js' }; - await wrapper.initAndStart(wrapperConfig, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(wrapperConfig); const app = wrapper.getMonacoEditorApp(); const modelRefs = app?.getModelRefs(); @@ -148,7 +141,7 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { const wrapper = new MonacoEditorLanguageClientWrapper(); const wrapperConfig = createWrapperConfigClassicApp(); wrapperConfig.editorAppConfig.codeResources = {}; - await wrapper.initAndStart(wrapperConfig, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(wrapperConfig); const app = wrapper.getMonacoEditorApp(); const modelRefs = app?.getModelRefs(); @@ -161,7 +154,7 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { const wrapper = new MonacoEditorLanguageClientWrapper(); const wrapperConfig = createWrapperConfigClassicApp(); wrapperConfig.editorAppConfig.codeResources = {}; - await wrapper.initAndStart(wrapperConfig, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(wrapperConfig); const app = wrapper.getMonacoEditorApp(); @@ -207,9 +200,9 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { ['/javascript.tmLanguage.json', '{}'] ]), }]; - await wrapper.initAndStart(wrapperConfig, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(wrapperConfig); await wrapper.dispose(); - await wrapper.initAndStart(wrapperConfig, document.getElementById('monaco-editor-root')); + await wrapper.initAndStart(wrapperConfig); }); test('Early code resources update on wrapper are ok', async () => { @@ -234,7 +227,24 @@ describe('Test MonacoEditorLanguageClientWrapper', () => { expect(modelRefs?.modelRef).toBeDefined(); expect(modelRefs?.modelRefOriginal).toBeUndefined(); - await wrapper.start(document.getElementById('monaco-editor-root')); + await wrapper.start(); }); + test('editorConfig semanticHighlighting.enabled workaround', async () => { + const wrapper = new MonacoEditorLanguageClientWrapper(); + const wrapperConfig = createWrapperConfigClassicApp(); + + (wrapperConfig.editorAppConfig as EditorAppConfigClassic).editorOptions = { + 'semanticHighlighting.enabled': true, + }; + const updatedWrapperConfig = await wrapper.init(wrapperConfig); + expect(updatedWrapperConfig.vscodeApiConfig?.workspaceConfig?.configurationDefaults?.['editor.semanticHighlighting.enabled']).toEqual(true); + + const semHigh = await new Promise(resolve => { + setTimeout(() => { + resolve(StandaloneServices.get(IConfigurationService).getValue('editor.semanticHighlighting.enabled')); + }, 100); + }); + expect(semHigh).toEqual(true); + }); }); diff --git a/verify/angular/custom-webpack.config.js b/verify/angular/custom-webpack.config.js index e192cdcd3..b3f4d4b15 100644 --- a/verify/angular/custom-webpack.config.js +++ b/verify/angular/custom-webpack.config.js @@ -4,8 +4,8 @@ * ------------------------------------------------------------------------------------------ */ // solve: __dirname is not defined in ES module scope -import { fileURLToPath } from 'url'; -import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'node:path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); diff --git a/verify/angular/package.json b/verify/angular/package.json index eb9e81330..c8bd6bb63 100644 --- a/verify/angular/package.json +++ b/verify/angular/package.json @@ -39,7 +39,7 @@ "style-loader": "~4.0.0" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" } } diff --git a/verify/pnpm/package.json b/verify/pnpm/package.json index 0ca1f1856..5964b0be8 100644 --- a/verify/pnpm/package.json +++ b/verify/pnpm/package.json @@ -14,7 +14,7 @@ "vite": "~5.3.3" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "pnpm": "9.9.0" }, "scripts": { diff --git a/verify/vite/package.json b/verify/vite/package.json index 902c68f81..220eb08a8 100644 --- a/verify/vite/package.json +++ b/verify/vite/package.json @@ -14,7 +14,7 @@ "vite": "~5.3.3" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" }, "scripts": { diff --git a/verify/webpack/package.json b/verify/webpack/package.json index 114307a04..cc5b0e9dc 100644 --- a/verify/webpack/package.json +++ b/verify/webpack/package.json @@ -19,7 +19,7 @@ "webpack-cli": "~5.1.4" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "npm": "10.8.3" }, "scripts": { diff --git a/verify/webpack/webpack.config.js b/verify/webpack/webpack.config.js index 9fa3cfe4d..a12f99743 100644 --- a/verify/webpack/webpack.config.js +++ b/verify/webpack/webpack.config.js @@ -4,8 +4,8 @@ * ------------------------------------------------------------------------------------------ */ // solve: __dirname is not defined in ES module scope -import { fileURLToPath } from 'url'; -import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'node:path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); diff --git a/verify/yarn/package.json b/verify/yarn/package.json index a4a6b76f0..11591f8d1 100644 --- a/verify/yarn/package.json +++ b/verify/yarn/package.json @@ -4,9 +4,9 @@ "private": true, "type": "module", "dependencies": { - "@typefox/monaco-editor-react": "~6.0.0-next.1", + "@typefox/monaco-editor-react": "~6.0.0-next.2", "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3", - "monaco-editor-wrapper": "~6.0.0-next.1", + "monaco-editor-wrapper": "~6.0.0-next.2", "monaco-languageclient-examples": "~2024.9.1", "vscode": "npm:@codingame/monaco-vscode-api@~9.0.3", "vscode-ws-jsonrpc": "~3.3.2" @@ -16,7 +16,7 @@ "vite": "~5.3.3" }, "volta": { - "node": "20.17.0", + "node": "20.18.0", "yarn": "1.22.22" }, "scripts": { diff --git a/vite.config.ts b/vite.config.ts index 5f1a1b5ed..126cef79b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,7 +4,7 @@ * ------------------------------------------------------------------------------------------ */ import { defineConfig } from 'vite'; -import * as path from 'path'; +import * as path from 'node:path'; import importMetaUrlPlugin from '@codingame/esbuild-import-meta-url-plugin'; import vsixPlugin from '@codingame/monaco-vscode-rollup-vsix-plugin'; import react from '@vitejs/plugin-react';