diff --git a/.changeset/proud-chicken-sin.md b/.changeset/proud-chicken-sin.md new file mode 100644 index 000000000..1dfe4322c --- /dev/null +++ b/.changeset/proud-chicken-sin.md @@ -0,0 +1,13 @@ +--- +'astro': patch +--- + +Adds the `astro check` command + +This adds a new command, `astro check` which runs diagnostics on a project. The same diagnostics run within the Astro VSCode plugin! Just run: + +```shell +astro check +``` + +Which works a lot like `tsc` and will give you error messages, if any were found. We recommend adding this to your CI setup to prevent errors from being merged. \ No newline at end of file diff --git a/docs/src/pages/reference/cli-reference.md b/docs/src/pages/reference/cli-reference.md index 3c66b2368..26b165f48 100644 --- a/docs/src/pages/reference/cli-reference.md +++ b/docs/src/pages/reference/cli-reference.md @@ -25,6 +25,12 @@ Start a local static file server to serve your built `dist/` directory. Useful f This command is meant for local testing only, and is not designed to be run in production. For help with production hosting, check out our guide on [Deploying an Astro Website](/guides/deploy). +### `astro check` + +Runs diagnostics (such as type-checking) against your project and reports errors to the console. If any errors are found the process will exit with a code of __1__. + +This command is intended to be used in CI workflows. + ## Global Flags ### `--config path` diff --git a/packages/astro/package.json b/packages/astro/package.json index 73ee7c7cf..8aba975f6 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -44,6 +44,7 @@ "test": "uvu test -i fixtures -i benchmark -i test-utils.js" }, "dependencies": { + "@astrojs/language-server": "^0.7.16", "@astrojs/markdown-support": "0.3.1", "@astrojs/parser": "0.20.2", "@astrojs/prism": "0.2.2", diff --git a/packages/astro/src/check.ts b/packages/astro/src/check.ts new file mode 100644 index 000000000..22bccd4f9 --- /dev/null +++ b/packages/astro/src/check.ts @@ -0,0 +1,116 @@ +/* eslint-disable no-console */ +import { AstroCheck, DiagnosticSeverity } from '@astrojs/language-server'; +import type { AstroConfig } from './@types/astro'; +import { bold, blue, black, bgWhite, red, cyan, yellow } from 'kleur/colors'; +import glob from 'fast-glob'; +import * as path from 'path'; +import { pathToFileURL } from 'url'; +import * as fs from 'fs'; + +async function openAllDocuments( + workspaceUri: URL, + filePathsToIgnore: string[], + checker: AstroCheck +) { + const files = await glob('**/*.astro', { + cwd: workspaceUri.pathname, + ignore: ['node_modules/**'].concat(filePathsToIgnore.map((ignore) => `${ignore}/**`)) + }); + const absFilePaths = files.map((f) => path.resolve(workspaceUri.pathname, f)); + + for (const absFilePath of absFilePaths) { + const text = fs.readFileSync(absFilePath, 'utf-8'); + checker.upsertDocument( + { + uri: pathToFileURL(absFilePath).toString(), + text + } + ); + } +} + +interface Result { + errors: number; + warnings: number; +} + +function offsetAt({ line, character }: { line: number, character: number; }, text: string) { + let i = 0; + let l = 0; + let c = 0; + while(i < text.length) { + if(l === line && c === character) { + break; + } + + let char = text[i]; + switch(char) { + case '\n': { + l++; + c = 0; + break; + } + default: { + c++; + break; + } + } + + i++; + } + + return i; +} + +function pad(str: string, len: number) { + return Array.from({ length: len }, () => str).join(''); +} + +export async function run() { + +} + +export async function check(astroConfig: AstroConfig) { + const root = astroConfig.projectRoot; + let checker = new AstroCheck(root.toString()); + await openAllDocuments(root, [], checker); + + let diagnostics = await checker.getDiagnostics(); + + let result: Result = { + errors: 0, + warnings: 0 + }; + + diagnostics.forEach(diag => { + diag.diagnostics.forEach(d => { + switch(d.severity) { + case DiagnosticSeverity.Error: { + console.error(`${bold(cyan(path.relative(root.pathname, diag.filePath)))}:${bold(yellow(d.range.start.line))}:${bold(yellow(d.range.start.character))} - ${d.message}`); + let startOffset = offsetAt({ line: d.range.start.line, character: 0 }, diag.text); + let endOffset = offsetAt({ line: d.range.start.line + 1, character: 0 }, diag.text); + let str = diag.text.substring(startOffset, endOffset - 1); + const lineNumStr = (d.range.start.line).toString(); + const lineNumLen = lineNumStr.length; + console.error(`${bgWhite(black(lineNumStr))} ${str}`); + let tildes = pad('~', d.range.end.character - d.range.start.character); + let spaces = pad(' ', d.range.start.character + lineNumLen - 1); + console.error(` ${spaces}${bold(red(tildes))}\n`); + result.errors++; + break; + } + case DiagnosticSeverity.Warning: { + result.warnings++; + break; + } + } + }); + }); + + if(result.errors) { + console.error(`Found ${result.errors} errors.`) + } + + const exitCode = result.errors ? 1 : 0; + return exitCode; +} \ No newline at end of file diff --git a/packages/astro/src/cli.ts b/packages/astro/src/cli.ts index 348828a26..d49381520 100644 --- a/packages/astro/src/cli.ts +++ b/packages/astro/src/cli.ts @@ -9,6 +9,7 @@ import { formatConfigError, loadConfig } from './config.js'; import devServer from './dev.js'; import { preview } from './preview.js'; import { reload } from './reload.js'; +import { check } from './check.js'; const { readFile } = fsPromises; const buildAndExit = async (astroConfig: AstroConfig) => { @@ -19,9 +20,13 @@ const reloadAndExit = async () => { const ret = await reload(); process.exit(ret); }; +const checkAndExit = async (astroConfig: AstroConfig) => { + const ret = await check(astroConfig); + process.exit(ret); +}; type Arguments = yargs.Arguments; -type cliCommand = 'help' | 'version' | 'dev' | 'build' | 'preview' | 'reload'; +type cliCommand = 'help' | 'version' | 'dev' | 'build' | 'preview' | 'reload' | 'check'; interface CLIState { cmd: cliCommand; options: { @@ -59,6 +64,8 @@ function resolveArgs(flags: Arguments): CLIState { return { cmd: 'build', options }; case 'preview': return { cmd: 'preview', options }; + case 'check': + return { cmd: 'check', options }; default: if (flags.reload) { return { cmd: 'reload', options }; @@ -76,6 +83,7 @@ function printHelp() { astro dev Run Astro in development mode. astro build Build a pre-compiled production version of your site. astro preview Preview your build locally before deploying. + astro check Check your project for errors. ${colors.bold('Flags:')} --config Specify the path to the Astro config file. @@ -111,11 +119,11 @@ async function runCommand(rawRoot: string, cmd: (a: AstroConfig, opts: any) => P mergeCLIFlags(astroConfig, options); return cmd(astroConfig, options); - } catch (err) { + } catch (err: any) { if (err instanceof z.ZodError) { console.log(formatConfigError(err)); } else { - console.error(colors.red(err.toString() || err)); + console.error(colors.red(err.toString())); } process.exit(1); } @@ -126,6 +134,7 @@ const cmdMap = new Map Promise>([ ['dev', devServer], ['preview', preview], ['reload', reloadAndExit], + ['check', checkAndExit] ]); /** The primary CLI action */ @@ -149,7 +158,8 @@ export async function cli(args: string[]) { } case 'build': case 'preview': - case 'dev': { + case 'dev': + case 'check': { if (flags.reload) { await reload(); } diff --git a/yarn.lock b/yarn.lock index 8101a8d97..e73c8e58a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -106,6 +106,22 @@ "@algolia/logger-common" "4.10.5" "@algolia/requester-common" "4.10.5" +"@astrojs/language-server@^0.7.16": + version "0.7.16" + resolved "https://registry.yarnpkg.com/@astrojs/language-server/-/language-server-0.7.16.tgz#54ac89c70ec7a6ab2712d4f15357017e795db34a" + integrity sha512-LjWk9Ia8TrKGf4homDCFpL6r9gfB3cPqrEx1COuy5ukzy/cvGGersobwodtwsbOKqOWk7NwJbYbf51IIub7prQ== + dependencies: + lodash "^4.17.21" + source-map "^0.7.3" + ts-morph "^12.0.0" + typescript "^4.3.1-rc" + vscode-css-languageservice "^5.1.1" + vscode-emmet-helper "2.1.2" + vscode-html-languageservice "^3.0.3" + vscode-languageserver "6.1.1" + vscode-languageserver-protocol "^3.16.0" + vscode-languageserver-textdocument "^1.0.1" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -548,6 +564,25 @@ "@francoischalifour/autocomplete-preset-algolia" "^1.0.0-alpha.28" algoliasearch "^4.0.0" +"@emmetio/abbreviation@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@emmetio/abbreviation/-/abbreviation-2.2.2.tgz#746762fd9e7a8c2ea604f580c62e3cfe250e6989" + integrity sha512-TtE/dBnkTCct8+LntkqVrwqQao6EnPAs1YN3cUgxOxTaBlesBCY37ROUAVZrRlG64GNnVShdl/b70RfAI3w5lw== + dependencies: + "@emmetio/scanner" "^1.0.0" + +"@emmetio/css-abbreviation@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@emmetio/css-abbreviation/-/css-abbreviation-2.1.4.tgz#90362e8a1122ce3b76f6c3157907d30182f53f54" + integrity sha512-qk9L60Y+uRtM5CPbB0y+QNl/1XKE09mSO+AhhSauIfr2YOx/ta3NJw2d8RtCFxgzHeRqFRr8jgyzThbu+MZ4Uw== + dependencies: + "@emmetio/scanner" "^1.0.0" + +"@emmetio/scanner@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emmetio/scanner/-/scanner-1.0.0.tgz#065b2af6233fe7474d44823e3deb89724af42b5f" + integrity sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA== + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -1809,6 +1844,16 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@ts-morph/common@~0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.11.0.tgz#df94af35f42d01d9d389bfdefc8bcc3f6a59a192" + integrity sha512-Ti2tpROSVHlBoNiJKVUYPNk/yCPb1Bcly4RsSwC2F9a8PMMYfEYovRcghTu6N5o66Jq0yvPXN3uNaO4a3zskTA== + dependencies: + fast-glob "^3.2.7" + minimatch "^3.0.4" + mkdirp "^1.0.4" + path-browserify "^1.0.1" + "@types/acorn@^4.0.0": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" @@ -3248,6 +3293,11 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +code-block-writer@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-10.1.1.tgz#ad5684ed4bfb2b0783c8b131281ae84ee640a42f" + integrity sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw== + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -3999,6 +4049,14 @@ electron-to-chromium@^1.3.811: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.818.tgz#32ed024fa8316e5d469c96eecbea7d2463d80085" integrity sha512-c/Z9gIr+jDZAR9q+mn40hEc1NharBT+8ejkarjbCDnBNFviI6hvcC5j2ezkAXru//bTnQp5n6iPi0JA83Tla1Q== +emmet@^2.1.5: + version "2.3.4" + resolved "https://registry.yarnpkg.com/emmet/-/emmet-2.3.4.tgz#5ba0d7a5569a68c7697dfa890c772e4f3179d123" + integrity sha512-3IqSwmO+N2ZGeuhDyhV/TIOJFUbkChi53bcasSNRE7Yd+4eorbbYz4e53TpMECt38NtYkZNupQCZRlwdAYA42A== + dependencies: + "@emmetio/abbreviation" "^2.2.2" + "@emmetio/css-abbreviation" "^2.1.4" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -6054,6 +6112,11 @@ json5@^2.1.2, json5@^2.2.0: dependencies: minimist "^1.2.5" +jsonc-parser@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz#59549150b133f2efacca48fe9ce1ec0659af2342" + integrity sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -8142,6 +8205,11 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -10248,6 +10316,14 @@ tryer@^1.0.0: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-morph@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-12.0.0.tgz#a601c3538703755cbfa2d42b62c52df73e9dbbd7" + integrity sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA== + dependencies: + "@ts-morph/common" "~0.11.0" + code-block-writer "^10.1.1" + tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -10366,6 +10442,11 @@ typescript@^4.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typescript@^4.3.1-rc: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== + uglify-js@^3.1.4: version "3.14.1" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.1.tgz#e2cb9fe34db9cb4cf7e35d1d26dfea28e09a7d06" @@ -10762,11 +10843,93 @@ vm2@^3.9.2: resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.3.tgz#29917f6cc081cc43a3f580c26c5b553fd3c91f40" integrity sha512-smLS+18RjXYMl9joyJxMNI9l4w7biW8ilSDaVRvFBDwOH8P0BK1ognFQTpg0wyQ6wIKLTblHJvROW692L/E53Q== +vscode-css-languageservice@^5.1.1: + version "5.1.5" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.5.tgz#400b2f63a4f73c60f5b0afc48c478c1b326b27c6" + integrity sha512-c1hhsbnZ7bBvj10vMDLmkOk/n9r0rXQYDj4kbBi59bZaaEZ3e81zURx76/618NZM5NytlZmGfvmxQtB7mb03Ow== + dependencies: + vscode-languageserver-textdocument "^1.0.1" + vscode-languageserver-types "^3.16.0" + vscode-nls "^5.0.0" + vscode-uri "^3.0.2" + +vscode-emmet-helper@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-2.1.2.tgz#2978060ebb736a7e0f6e6f1d649bd026880528c3" + integrity sha512-Fy6UNawSgxE3Kuqi54vSXohf03iOIrp1A74ReAgzvGP9Yt7fUAvkqF6No2WAc34/w0oWAHAeqoBNqmKKWh6U5w== + dependencies: + emmet "^2.1.5" + jsonc-parser "^2.3.0" + vscode-languageserver-textdocument "^1.0.1" + vscode-languageserver-types "^3.15.1" + vscode-nls "^5.0.0" + vscode-uri "^2.1.2" + +vscode-html-languageservice@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-3.2.0.tgz#e92269a04097d87bd23431e3a4e491a27b5447b9" + integrity sha512-aLWIoWkvb5HYTVE0kI9/u3P0ZAJGrYOSAAE6L0wqB9radKRtbJNrF9+BjSUFyCgBdNBE/GFExo35LoknQDJrfw== + dependencies: + vscode-languageserver-textdocument "^1.0.1" + vscode-languageserver-types "3.16.0-next.2" + vscode-nls "^5.0.0" + vscode-uri "^2.1.2" + +vscode-jsonrpc@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" + integrity sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg== + +vscode-languageserver-protocol@^3.15.3, vscode-languageserver-protocol@^3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz#34135b61a9091db972188a07d337406a3cdbe821" + integrity sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A== + dependencies: + vscode-jsonrpc "6.0.0" + vscode-languageserver-types "3.16.0" + +vscode-languageserver-textdocument@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f" + integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA== + +vscode-languageserver-types@3.16.0, vscode-languageserver-types@^3.15.1, vscode-languageserver-types@^3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" + integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== + +vscode-languageserver-types@3.16.0-next.2: + version "3.16.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083" + integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q== + +vscode-languageserver@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz#d76afc68172c27d4327ee74332b468fbc740d762" + integrity sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ== + dependencies: + vscode-languageserver-protocol "^3.15.3" + +vscode-nls@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" + integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA== + vscode-textmate@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== +vscode-uri@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" + integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== + +vscode-uri@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0" + integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA== + vue@^3.2.0: version "3.2.6" resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.6.tgz#c71445078751f458648fd8fb3a2da975507d03d2"