diff --git a/.changeset/brave-spiders-marry.md b/.changeset/brave-spiders-marry.md new file mode 100644 index 00000000..bf8c6f50 --- /dev/null +++ b/.changeset/brave-spiders-marry.md @@ -0,0 +1,10 @@ +--- +'@astrojs/language-server': minor +'@astrojs/check': minor +'@astrojs/ts-plugin': minor +'astro-vscode': minor +--- + +Upgrade to Volar 2.0. No regressions are currently expected, however as this is a fairly consequential backend change, please report any issues you encounter. + +For reference, Volar is the underlying framework that powers the Astro language server, you can think of it as Vite for editor tooling. diff --git a/packages/astro-check/src/index.ts b/packages/astro-check/src/index.ts index 26f26f7c..2a1cd7b1 100644 --- a/packages/astro-check/src/index.ts +++ b/packages/astro-check/src/index.ts @@ -25,11 +25,7 @@ export async function check(flags: Partial): Promise; export async function check(flags: Partial): Promise { const workspaceRoot = path.resolve(flags.root ?? process.cwd()); const require = createRequire(import.meta.url); - const checker = new AstroCheck( - workspaceRoot, - require.resolve('typescript/lib/tsserverlibrary.js'), - flags.tsconfig - ); + const checker = new AstroCheck(workspaceRoot, require.resolve('typescript'), flags.tsconfig); let req = 0; @@ -44,20 +40,20 @@ export async function check(flags: Partial): Promise { // Dynamically get the list of extensions to watch from the files already included in the project const checkedExtensions = Array.from( new Set( - checker.project.languageHost.getScriptFileNames().map((fileName) => path.extname(fileName)) + checker.linter.languageHost.getScriptFileNames().map((fileName) => path.extname(fileName)) ) ); createWatcher(workspaceRoot, checkedExtensions) .on('add', (fileName) => { - checker.project.fileCreated(fileName); + checker.linter.fileCreated(fileName); update(); }) .on('unlink', (fileName) => { - checker.project.fileDeleted(fileName); + checker.linter.fileDeleted(fileName); update(); }) .on('change', (fileName) => { - checker.project.fileUpdated(fileName); + checker.linter.fileUpdated(fileName); update(); }); } diff --git a/packages/language-server/package.json b/packages/language-server/package.json index c7f85ec9..89e200b9 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -28,21 +28,19 @@ "dependencies": { "@astrojs/compiler": "^2.4.0", "@jridgewell/sourcemap-codec": "^1.4.15", - "@volar/kit": "~1.11.1", - "@volar/language-core": "~1.11.1", - "@volar/language-server": "~1.11.1", - "@volar/language-service": "~1.11.1", - "@volar/source-map": "~1.11.1", - "@volar/typescript": "~1.11.1", + "@volar/kit": "~2.0.2", + "@volar/language-core": "~2.0.2", + "@volar/language-server": "~2.0.2", + "@volar/language-service": "~2.0.2", + "@volar/typescript": "~2.0.2", "fast-glob": "^3.2.12", - "muggle-string": "^0.3.1", - "volar-service-css": "0.0.17", - "volar-service-emmet": "0.0.17", - "volar-service-html": "0.0.17", - "volar-service-prettier": "0.0.17", - "volar-service-typescript": "0.0.17", - "volar-service-typescript-twoslash-queries": "0.0.17", - "vscode-html-languageservice": "^5.1.0", + "volar-service-css": "0.0.28", + "volar-service-emmet": "0.0.28", + "volar-service-html": "0.0.28", + "volar-service-prettier": "0.0.28", + "volar-service-typescript": "0.0.28", + "volar-service-typescript-twoslash-queries": "0.0.28", + "vscode-html-languageservice": "^5.1.1", "vscode-uri": "^3.0.8" }, "devDependencies": { @@ -51,6 +49,7 @@ "@types/chai": "^4.3.5", "@types/mocha": "^10.0.1", "@types/node": "^18.17.8", + "@volar/test-utils": "~2.0.2", "astro": "^4.1.0", "chai": "^4.3.7", "mocha": "^10.2.0", diff --git a/packages/language-server/src/check.ts b/packages/language-server/src/check.ts index be191d27..349c04c0 100644 --- a/packages/language-server/src/check.ts +++ b/packages/language-server/src/check.ts @@ -29,9 +29,8 @@ export interface CheckResult { } export class AstroCheck { - private ts!: typeof import('typescript/lib/tsserverlibrary.js'); - public project!: ReturnType; - private linter!: ReturnType; + private ts!: typeof import('typescript'); + public linter!: ReturnType<(typeof kit)['createTypeScriptChecker']>; constructor( private readonly workspacePath: string, @@ -60,8 +59,7 @@ export class AstroCheck { } | undefined; }): Promise { - let files = - fileNames !== undefined ? fileNames : this.project.languageHost.getScriptFileNames(); + let files = fileNames !== undefined ? fileNames : this.linter.languageHost.getScriptFileNames(); const result: CheckResult = { status: undefined, @@ -98,7 +96,7 @@ export class AstroCheck { console.info(errorText); } - const fileSnapshot = this.project.languageHost.getScriptSnapshot(file); + const fileSnapshot = this.linter.languageHost.getScriptSnapshot(file); const fileContent = fileSnapshot?.getText(0, fileSnapshot.getLength()); result.fileResult.push({ @@ -131,29 +129,17 @@ export class AstroCheck { const tsconfigPath = this.getTsconfig(); const astroInstall = getAstroInstall([this.workspacePath]); - const config: kit.Config = { - languages: { - astro: getLanguageModule( - typeof astroInstall === 'string' ? undefined : astroInstall, - this.ts - ), - svelte: getSvelteLanguageModule(), - vue: getVueLanguageModule(), - }, - services: { - typescript: createTypeScriptService(), - astro: createAstroService(), - }, - }; + const languages = [ + getLanguageModule(typeof astroInstall === 'string' ? undefined : astroInstall, this.ts), + getSvelteLanguageModule(), + getVueLanguageModule(), + ]; + const services = [createTypeScriptService(this.ts), createAstroService(this.ts)]; if (tsconfigPath) { - this.project = kit.createProject(tsconfigPath, [ - { extension: 'astro', isMixedContent: true, scriptKind: 7 }, - { extension: 'vue', isMixedContent: true, scriptKind: 7 }, - { extension: 'svelte', isMixedContent: true, scriptKind: 7 }, - ]); + this.linter = kit.createTypeScriptChecker(languages, services, tsconfigPath); } else { - this.project = kit.createInferredProject(this.workspacePath, () => { + this.linter = kit.createTypeScriptInferredChecker(languages, services, () => { return fg.sync('**/*.astro', { cwd: this.workspacePath, ignore: ['node_modules'], @@ -161,8 +147,6 @@ export class AstroCheck { }); }); } - - this.linter = kit.createLinter(config, this.project.languageHost); } private getTsconfig() { diff --git a/packages/language-server/src/core/astro2tsx.ts b/packages/language-server/src/core/astro2tsx.ts index 48e0991f..5dff9853 100644 --- a/packages/language-server/src/core/astro2tsx.ts +++ b/packages/language-server/src/core/astro2tsx.ts @@ -1,7 +1,7 @@ import { convertToTSX } from '@astrojs/compiler/sync'; -import type { ConvertToTSXOptions, DiagnosticMessage, TSXResult } from '@astrojs/compiler/types'; +import type { ConvertToTSXOptions, TSXResult } from '@astrojs/compiler/types'; import { decode } from '@jridgewell/sourcemap-codec'; -import { FileKind, FileRangeCapabilities, VirtualFile } from '@volar/language-core'; +import type { CodeInformation, CodeMapping, VirtualCode } from '@volar/language-core'; import { Range } from '@volar/language-server'; import { HTMLDocument, TextDocument } from 'vscode-html-languageservice'; import { patchTSX } from './utils.js'; @@ -11,12 +11,6 @@ export interface LSPTSXRanges { body: Range; } -interface Astro2TSXResult { - virtualFile: VirtualFile; - diagnostics: DiagnosticMessage[]; - ranges: LSPTSXRanges; -} - export function safeConvertToTSX(content: string, options: ConvertToTSXOptions) { try { const tsx = convertToTSX(content, { filename: options.filename }); @@ -73,34 +67,27 @@ export function getTSXRangesAsLSPRanges(tsx: TSXResult): LSPTSXRanges { }; } -export function astro2tsx( - input: string, - fileName: string, - ts: typeof import('typescript/lib/tsserverlibrary.js'), - htmlDocument: HTMLDocument -): Astro2TSXResult { +export function astro2tsx(input: string, fileName: string, htmlDocument: HTMLDocument) { const tsx = safeConvertToTSX(input, { filename: fileName }); return { - virtualFile: getVirtualFileTSX(input, tsx, fileName, ts, htmlDocument), + virtualCode: getVirtualCodeTSX(input, tsx, fileName, htmlDocument), diagnostics: tsx.diagnostics, ranges: getTSXRangesAsLSPRanges(tsx), }; } -function getVirtualFileTSX( +function getVirtualCodeTSX( input: string, tsx: TSXResult, fileName: string, - ts: typeof import('typescript/lib/tsserverlibrary.js'), htmlDocument: HTMLDocument -): VirtualFile { +): VirtualCode { tsx.code = patchTSX(tsx.code, fileName); const v3Mappings = decode(tsx.map.mappings); - const sourcedDoc = TextDocument.create(fileName, 'astro', 0, input); - const genDoc = TextDocument.create(fileName + '.tsx', 'typescriptreact', 0, tsx.code); - - const mappings: VirtualFile['mappings'] = []; + const sourcedDoc = TextDocument.create('', 'astro', 0, input); + const genDoc = TextDocument.create('', 'typescriptreact', 0, tsx.code); + const mappings: CodeMapping[] = []; let current: | { @@ -131,33 +118,37 @@ function getVirtualFileTSX( const lastMapping = mappings.length ? mappings[mappings.length - 1] : undefined; if ( lastMapping && - lastMapping.generatedRange[1] === current.genOffset && - lastMapping.sourceRange[1] === current.sourceOffset + lastMapping.generatedOffsets[0] + lastMapping.lengths[0] === current.genOffset && + lastMapping.sourceOffsets[0] + lastMapping.lengths[0] === current.sourceOffset ) { - lastMapping.generatedRange[1] = current.genOffset + length; - lastMapping.sourceRange[1] = current.sourceOffset + length; + lastMapping.lengths[0] += length; } else { // Disable features inside script tags. This is a bit annoying to do, I wonder if maybe leaving script tags // unmapped would be better. const node = htmlDocument.findNodeAt(current.sourceOffset); - const rangeCapabilities: FileRangeCapabilities = + const rangeCapabilities: CodeInformation = node.tag !== 'script' - ? FileRangeCapabilities.full + ? { + verification: true, + completion: true, + semantic: true, + navigation: true, + structure: true, + format: false, + } : { + verification: false, completion: false, - definition: false, - diagnostic: false, - displayWithLink: false, - hover: false, - references: false, - referencesCodeLens: false, - rename: false, - semanticTokens: false, + semantic: false, + navigation: false, + structure: false, + format: false, }; mappings.push({ - sourceRange: [current.sourceOffset, current.sourceOffset + length], - generatedRange: [current.genOffset, current.genOffset + length], + sourceOffsets: [current.sourceOffset], + generatedOffsets: [current.genOffset], + lengths: [length], data: rangeCapabilities, }); } @@ -174,33 +165,15 @@ function getVirtualFileTSX( } } - const ast = ts.createSourceFile('/a.tsx', tsx.code, ts.ScriptTarget.ESNext); - if (ast.statements[0]) { - mappings.push({ - sourceRange: [0, input.length], - generatedRange: [ast.statements[0].getStart(ast), tsx.code.length], - data: {}, - }); - } - return { - fileName: fileName + '.tsx', - kind: FileKind.TypeScriptHostFile, - capabilities: { - codeAction: true, - documentFormatting: false, - diagnostic: true, - documentSymbol: true, - inlayHint: true, - foldingRange: true, - }, - codegenStacks: [], + id: 'tsx', + languageId: 'typescriptreact', snapshot: { getText: (start, end) => tsx.code.substring(start, end), getLength: () => tsx.code.length, getChangeRange: () => undefined, }, mappings: mappings, - embeddedFiles: [], + embeddedCodes: [], }; } diff --git a/packages/language-server/src/core/index.ts b/packages/language-server/src/core/index.ts index 56cc9691..8ef28a4b 100644 --- a/packages/language-server/src/core/index.ts +++ b/packages/language-server/src/core/index.ts @@ -1,13 +1,13 @@ import type { DiagnosticMessage } from '@astrojs/compiler/types'; import { - FileCapabilities, - FileKind, - FileRangeCapabilities, - type Language, - type VirtualFile, + forEachEmbeddedCode, + type CodeMapping, + type ExtraServiceScript, + type LanguagePlugin, + type VirtualCode, } from '@volar/language-core'; import * as path from 'node:path'; -import type ts from 'typescript/lib/tsserverlibrary'; +import type ts from 'typescript'; import type { HTMLDocument } from 'vscode-html-languageservice'; import { getLanguageServerTypesDir, type AstroInstall } from '../utils.js'; import { astro2tsx } from './astro2tsx'; @@ -18,111 +18,126 @@ import { extractScriptTags } from './parseJS.js'; export function getLanguageModule( astroInstall: AstroInstall | undefined, - ts: typeof import('typescript/lib/tsserverlibrary.js') -): Language { + ts: typeof import('typescript') +): LanguagePlugin { return { - createVirtualFile(fileName, snapshot) { - if (fileName.endsWith('.astro')) { - return new AstroFile(fileName, snapshot, ts); + createVirtualCode(fileId, languageId, snapshot) { + if (languageId === 'astro') { + const fileName = fileId.includes('://') ? fileId.split('://')[1] : fileId; + return new AstroVirtualCode(fileName, snapshot); } }, - updateVirtualFile(astroFile, snapshot) { - astroFile.update(snapshot); + updateVirtualCode(_fileId, astroCode, snapshot) { + astroCode.update(snapshot); + return astroCode; }, - resolveHost(host) { - return { - ...host, - resolveModuleName(moduleName, impliedNodeFormat) { - if ( - impliedNodeFormat === ts.ModuleKind.ESNext && - (moduleName.endsWith('.astro') || - moduleName.endsWith('.vue') || - moduleName.endsWith('.svelte')) - ) { - return `${moduleName}.js`; + typescript: { + extraFileExtensions: [{ extension: 'astro', isMixedContent: true, scriptKind: 7 }], + getScript(astroCode) { + for (const code of forEachEmbeddedCode(astroCode)) { + if (code.id === 'tsx') { + return { + code, + extension: '.tsx', + scriptKind: 4 satisfies ts.ScriptKind.TSX, + }; } - return host.resolveModuleName?.(moduleName, impliedNodeFormat) ?? moduleName; - }, - getScriptFileNames() { - const languageServerTypesDirectory = getLanguageServerTypesDir(ts); - const fileNames = host.getScriptFileNames(); - const addedFileNames = []; - - if (astroInstall) { - addedFileNames.push( - ...['./env.d.ts', './astro-jsx.d.ts'].map((filePath) => - ts.sys.resolvePath(path.resolve(astroInstall.path, filePath)) - ) - ); - - // If Astro version is < 4.0.8, add jsx-runtime-augment.d.ts to the files to fake `JSX` being available from "astro/jsx-runtime". - // TODO: Remove this once a majority of users are on Astro 4.0.8+, erika - 2023-12-28 - if ( - astroInstall.version.major < 4 || - (astroInstall.version.major === 4 && - astroInstall.version.minor === 0 && - astroInstall.version.patch < 8) - ) { + } + return undefined; + }, + getExtraScripts(fileName, astroCode) { + const result: ExtraServiceScript[] = []; + for (const code of forEachEmbeddedCode(astroCode)) { + if (code.id.endsWith('.mjs') || code.id.endsWith('.mts')) { + result.push({ + fileName: fileName + '.' + code.id, + code, + extension: '.mjs', + scriptKind: 1 satisfies ts.ScriptKind.JS, + }); + } + } + return result; + }, + resolveLanguageServiceHost(host) { + return { + ...host, + getScriptFileNames() { + const languageServerTypesDirectory = getLanguageServerTypesDir(ts); + const fileNames = host.getScriptFileNames(); + const addedFileNames = []; + + if (astroInstall) { addedFileNames.push( - ...['./jsx-runtime-augment.d.ts'].map((filePath) => - ts.sys.resolvePath(path.resolve(languageServerTypesDirectory, filePath)) + ...['./env.d.ts', './astro-jsx.d.ts'].map((filePath) => + ts.sys.resolvePath(path.resolve(astroInstall.path, filePath)) + ) + ); + + // If Astro version is < 4.0.8, add jsx-runtime-augment.d.ts to the files to fake `JSX` being available from "astro/jsx-runtime". + // TODO: Remove this once a majority of users are on Astro 4.0.8+, erika - 2023-12-28 + if ( + astroInstall.version.major < 4 || + (astroInstall.version.major === 4 && + astroInstall.version.minor === 0 && + astroInstall.version.patch < 8) + ) { + addedFileNames.push( + ...['./jsx-runtime-augment.d.ts'].map((filePath) => + ts.sys.resolvePath(path.resolve(languageServerTypesDirectory, filePath)) + ) + ); + } + } else { + // If we don't have an Astro installation, add the fallback types from the language server. + // See the README in packages/language-server/types for more information. + addedFileNames.push( + ...['./env.d.ts', './astro-jsx.d.ts', './jsx-runtime-fallback.d.ts'].map((f) => + ts.sys.resolvePath(path.resolve(languageServerTypesDirectory, f)) ) ); - console.log(addedFileNames); } - } else { - // If we don't have an Astro installation, add the fallback types from the language server. - // See the README in packages/language-server/types for more information. - addedFileNames.push( - ...['./env.d.ts', './astro-jsx.d.ts', './jsx-runtime-fallback.d.ts'].map((f) => - ts.sys.resolvePath(path.resolve(languageServerTypesDirectory, f)) - ) - ); - } - return [...fileNames, ...addedFileNames]; - }, - getCompilationSettings() { - const baseCompilationSettings = host.getCompilationSettings(); - return { - ...baseCompilationSettings, - module: ts.ModuleKind.ESNext ?? 99, - target: ts.ScriptTarget.ESNext ?? 99, - jsx: ts.JsxEmit.Preserve ?? 1, - resolveJsonModule: true, - allowJs: true, // Needed for inline scripts, which are virtual .js files - isolatedModules: true, - moduleResolution: - baseCompilationSettings.moduleResolution === ts.ModuleResolutionKind.Classic || - !baseCompilationSettings.moduleResolution - ? ts.ModuleResolutionKind.Node10 - : baseCompilationSettings.moduleResolution, - }; - }, - }; + return [...fileNames, ...addedFileNames]; + }, + getCompilationSettings() { + const baseCompilationSettings = host.getCompilationSettings(); + return { + ...baseCompilationSettings, + module: ts.ModuleKind.ESNext ?? 99, + target: ts.ScriptTarget.ESNext ?? 99, + jsx: ts.JsxEmit.Preserve ?? 1, + resolveJsonModule: true, + allowJs: true, // Needed for inline scripts, which are virtual .js files + isolatedModules: true, + moduleResolution: + baseCompilationSettings.moduleResolution === ts.ModuleResolutionKind.Classic || + !baseCompilationSettings.moduleResolution + ? ts.ModuleResolutionKind.Node10 + : baseCompilationSettings.moduleResolution, + }; + }, + }; + }, }, }; } -export class AstroFile implements VirtualFile { - kind = FileKind.TextFile; - capabilities = FileCapabilities.full; - - fileName: string; - mappings!: VirtualFile['mappings']; - embeddedFiles!: VirtualFile['embeddedFiles']; +export class AstroVirtualCode implements VirtualCode { + id = 'root'; + languageId = 'astro'; + mappings!: CodeMapping[]; + embeddedCodes!: VirtualCode[]; astroMeta!: AstroMetadata; compilerDiagnostics!: DiagnosticMessage[]; htmlDocument!: HTMLDocument; - scriptFiles!: string[]; + scriptCodeIds!: string[]; codegenStacks = []; constructor( - public sourceFileName: string, - public snapshot: ts.IScriptSnapshot, - private readonly ts: typeof import('typescript/lib/tsserverlibrary.js') + public fileName: string, + public snapshot: ts.IScriptSnapshot ) { - this.fileName = sourceFileName; this.onSnapshotUpdated(); } @@ -138,9 +153,17 @@ export class AstroFile implements VirtualFile { onSnapshotUpdated() { this.mappings = [ { - sourceRange: [0, this.snapshot.getLength()], - generatedRange: [0, this.snapshot.getLength()], - data: FileRangeCapabilities.full, + sourceOffsets: [0], + generatedOffsets: [0], + lengths: [this.snapshot.getLength()], + data: { + verification: true, + completion: true, + semantic: true, + navigation: true, + structure: true, + format: true, + }, }, ]; this.compilerDiagnostics = []; @@ -154,8 +177,7 @@ export class AstroFile implements VirtualFile { this.compilerDiagnostics.push(...astroMetadata.diagnostics); } - const { htmlDocument, virtualFile: htmlVirtualFile } = parseHTML( - this.fileName, + const { htmlDocument, virtualCode: htmlVirtualCode } = parseHTML( this.snapshot, astroMetadata.frontmatter.status === 'closed' ? astroMetadata.frontmatter.position.end.offset @@ -163,32 +185,26 @@ export class AstroFile implements VirtualFile { ); this.htmlDocument = htmlDocument; - const scriptTags = extractScriptTags( - this.fileName, - this.snapshot, - htmlDocument, - astroMetadata.ast - ); + const scriptTags = extractScriptTags(this.snapshot, htmlDocument, astroMetadata.ast); - this.scriptFiles = scriptTags.map((scriptTag) => scriptTag.fileName); + this.scriptCodeIds = scriptTags.map((scriptTag) => scriptTag.id); - htmlVirtualFile.embeddedFiles.push( - ...extractStylesheets(this.fileName, this.snapshot, htmlDocument, astroMetadata.ast), + htmlVirtualCode.embeddedCodes.push( + ...extractStylesheets(this.snapshot, htmlDocument, astroMetadata.ast), ...scriptTags ); - this.embeddedFiles = []; - this.embeddedFiles.push(htmlVirtualFile); + this.embeddedCodes = []; + this.embeddedCodes.push(htmlVirtualCode); const tsx = astro2tsx( this.snapshot.getText(0, this.snapshot.getLength()), this.fileName, - this.ts, htmlDocument ); this.astroMeta = { ...astroMetadata, tsxRanges: tsx.ranges }; this.compilerDiagnostics.push(...tsx.diagnostics); - this.embeddedFiles.push(tsx.virtualFile); + this.embeddedCodes.push(tsx.virtualCode); } } diff --git a/packages/language-server/src/core/parseAstro.ts b/packages/language-server/src/core/parseAstro.ts index c9792324..04a2b4cf 100644 --- a/packages/language-server/src/core/parseAstro.ts +++ b/packages/language-server/src/core/parseAstro.ts @@ -37,7 +37,12 @@ function safeParseAst(fileName: string, input: string, parseOptions: ParseOption diagnostics: [ { code: 1000, - location: { file: fileName, line: 1, column: 1, length: input.length }, + location: { + file: fileName, + line: 1, + column: 1, + length: input.length, + }, severity: 1, text: `The Astro compiler encountered an unknown error while parsing this file's AST. Please create an issue with your code and the error shown in the server's logs: https://github.com/withastro/language-tools/issues`, }, diff --git a/packages/language-server/src/core/parseCSS.ts b/packages/language-server/src/core/parseCSS.ts index d68e2d27..1e775f54 100644 --- a/packages/language-server/src/core/parseCSS.ts +++ b/packages/language-server/src/core/parseCSS.ts @@ -1,69 +1,69 @@ import type { ParentNode, ParseResult } from '@astrojs/compiler/types'; import { is } from '@astrojs/compiler/utils'; -import { FileKind, FileRangeCapabilities, VirtualFile } from '@volar/language-core'; -import * as SourceMap from '@volar/source-map'; -import * as muggle from 'muggle-string'; -import type ts from 'typescript/lib/tsserverlibrary'; +import { + Segment, + buildMappings, + toString, + type CodeInformation, + type VirtualCode, +} from '@volar/language-core'; +import type ts from 'typescript'; import type { HTMLDocument, Node } from 'vscode-html-languageservice'; import type { AttributeNodeWithPosition } from './compilerUtils.js'; export function extractStylesheets( - fileName: string, snapshot: ts.IScriptSnapshot, htmlDocument: HTMLDocument, ast: ParseResult['ast'] -): VirtualFile[] { - const embeddedCSSFiles: VirtualFile[] = findEmbeddedStyles( - fileName, - snapshot, - htmlDocument.roots - ); +): VirtualCode[] { + const embeddedCSSCodes: VirtualCode[] = findEmbeddedStyles(snapshot, htmlDocument.roots); const inlineStyles = findInlineStyles(ast); if (inlineStyles.length > 0) { - const codes: muggle.Segment[] = []; + const codes: Segment[] = []; for (const inlineStyle of inlineStyles) { codes.push('x { '); codes.push([ inlineStyle.value, undefined, inlineStyle.position.start.offset + 'style="'.length, - FileRangeCapabilities.full, + { + completion: true, + verification: false, + semantic: true, + navigation: true, + structure: true, + format: false, + }, ]); codes.push(' }\n'); } - const mappings = SourceMap.buildMappings(codes); - const text = muggle.toString(codes); + const mappings = buildMappings(codes); + const text = toString(codes); - embeddedCSSFiles.push({ - fileName: fileName + '.inline.css', - codegenStacks: [], + embeddedCSSCodes.push({ + id: 'inline.css', + languageId: 'css', snapshot: { getText: (start, end) => text.substring(start, end), getLength: () => text.length, getChangeRange: () => undefined, }, - capabilities: { documentSymbol: true }, - embeddedFiles: [], - kind: FileKind.TextFile, + embeddedCodes: [], mappings, }); } - return embeddedCSSFiles; + return embeddedCSSCodes; } /** * Find all embedded styles in a document. * Embedded styles are styles that are defined in ``); - const completions = await languageServer.helpers.requestCompletion( - document, + const document = await languageServer.openFakeDocument(``, 'astro'); + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, Position.create(0, 18) ); - expect(completions.items).to.not.be.empty; - expect(completions.items[0].data.serviceId).to.equal('css'); + expect(completions!.items).to.not.be.empty; }); it('Can provide completions for CSS values', async () => { - const document = await languageServer.helpers.openFakeDocument( - `` + const document = await languageServer.openFakeDocument( + ``, + 'astro' ); - const completions = await languageServer.helpers.requestCompletion( - document, + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, Position.create(0, 21) ); - expect(completions.items).to.not.be.empty; - expect(completions.items[0].data.serviceId).to.equal('css'); + expect(completions!.items).to.not.be.empty; + }); + + it('Can provide completions inside inline styles', async () => { + const document = await languageServer.openFakeDocument(`
`, 'astro'); + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, + Position.create(0, 18) + ); + + expect(completions!.items).to.not.be.empty; + expect(completions?.items.map((i) => i.label)).to.include('aliceblue'); }); }); diff --git a/packages/language-server/test/css/hover.test.ts b/packages/language-server/test/css/hover.test.ts index e69de29b..b8d6a3dd 100644 --- a/packages/language-server/test/css/hover.test.ts +++ b/packages/language-server/test/css/hover.test.ts @@ -0,0 +1,22 @@ +import { Position } from '@volar/language-server'; +import { expect } from 'chai'; +import { describe } from 'mocha'; +import { LanguageServer, getLanguageServer } from '../server.js'; + +describe('CSS - Hover', () => { + let languageServer: LanguageServer; + + before(async () => { + languageServer = await getLanguageServer(); + }); + + it('Can get hover in style tags', async () => { + const document = await languageServer.openFakeDocument( + '', + 'astro' + ); + const hover = await languageServer.handle.sendHoverRequest(document.uri, Position.create(2, 7)); + + expect(hover?.contents).to.not.be.empty; + }); +}); diff --git a/packages/language-server/test/html/completions.test.ts b/packages/language-server/test/html/completions.test.ts index cec46b5c..18fc6908 100644 --- a/packages/language-server/test/html/completions.test.ts +++ b/packages/language-server/test/html/completions.test.ts @@ -1,36 +1,32 @@ import { Position } from '@volar/language-server'; import { expect } from 'chai'; import { describe } from 'mocha'; -import { LanguageServer, getLanguageServer } from '../server.js'; +import { getLanguageServer, type LanguageServer } from '../server.js'; describe('HTML - Completions', () => { let languageServer: LanguageServer; - before(async () => { - languageServer = await getLanguageServer(); - }); + before(async () => (languageServer = await getLanguageServer())); it('Can provide completions for HTML tags', async () => { - const document = await languageServer.helpers.openFakeDocument(` { - const document = await languageServer.helpers.openFakeDocument(`
{ let languageServer: LanguageServer; - before(async () => { - languageServer = await getLanguageServer(); - }); + before(async () => (languageServer = await getLanguageServer())); it('Can provide hover for HTML tags', async () => { - const document = await languageServer.helpers.openFakeDocument(` { - const document = await languageServer.helpers.openFakeDocument(`
{ let languageServer: LanguageServer; - before(async () => { - languageServer = await getLanguageServer(); - }); + before(async () => (languageServer = await getLanguageServer())); it('Can format document', async () => { - const document = await languageServer.helpers.openFakeDocument(`---\n\n\n---`); - const formatEdits = await languageServer.helpers.requestFormatting(document, { + const document = await languageServer.openFakeDocument(`---\n\n\n---`, 'astro'); + const formatEdits = await languageServer.handle.sendDocumentFormattingRequest(document.uri, { tabSize: 2, insertSpaces: true, }); diff --git a/packages/language-server/test/misc/init.test.ts b/packages/language-server/test/misc/init.test.ts index 5cc42bb0..64190104 100644 --- a/packages/language-server/test/misc/init.test.ts +++ b/packages/language-server/test/misc/init.test.ts @@ -1,19 +1,19 @@ -import type { ServerCapabilities } from '@volar/language-server'; +import type { InitializeResult, ServerCapabilities } from '@volar/language-server'; import { expect } from 'chai'; import { before, describe, it } from 'mocha'; -import { LanguageServer, getLanguageServer } from '../server.js'; +import { getLanguageServer } from '../server.js'; describe('Initialize', async () => { - let languageServer: LanguageServer; + let initializeResult: InitializeResult; before(async function () { // First init can sometimes be slow in CI, even though the rest of the tests will be fast. this.timeout(50000); - languageServer = await getLanguageServer(); + initializeResult = (await getLanguageServer()).initializeResult; }); it('Can start server', async () => { - expect(languageServer.initResult).not.be.null; + expect(initializeResult).not.be.null; }); it('Has proper capabilities', async () => { @@ -39,16 +39,16 @@ describe('Initialize', async () => { documentSymbolProvider: true, documentFormattingProvider: true, documentRangeFormattingProvider: true, + documentOnTypeFormattingProvider: { + firstTriggerCharacter: ';', + moreTriggerCharacter: ['}', '\n'], + }, referencesProvider: true, implementationProvider: true, definitionProvider: true, typeDefinitionProvider: true, callHierarchyProvider: true, hoverProvider: true, - diagnosticProvider: { - interFileDependencies: true, - workspaceDiagnostics: false, - }, renameProvider: { prepareProvider: true }, signatureHelpProvider: { triggerCharacters: ['(', ',', '<'], retriggerCharacters: [')'] }, completionProvider: { @@ -143,6 +143,6 @@ describe('Initialize', async () => { workspaceSymbolProvider: true, }; - expect(languageServer.initResult.capabilities).to.deep.equal(capabilities); + expect(initializeResult.capabilities).to.deep.equal(capabilities); }); }); diff --git a/packages/language-server/test/server.ts b/packages/language-server/test/server.ts index adfb2bf4..646acf45 100644 --- a/packages/language-server/test/server.ts +++ b/packages/language-server/test/server.ts @@ -1,167 +1,62 @@ /* eslint-disable no-console */ -import { createHash } from 'crypto'; -import cp from 'node:child_process'; -import fs from 'node:fs'; +import { LanguageServerHandle, startLanguageServer } from '@volar/test-utils'; +import { createHash } from 'node:crypto'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import * as protocol from 'vscode-languageserver-protocol/node'; -import { TextDocument } from 'vscode-languageserver-textdocument'; +import type { TextDocument } from 'vscode-languageserver-textdocument'; import { URI } from 'vscode-uri'; -export interface LanguageServer { - process: cp.ChildProcess; - connection: protocol.ProtocolConnection; - initResult: protocol.InitializeResult; - helpers: { - /** - * Open a real file path (relative to `./fixture`) and return the associated TextDocument - */ - openRealDocument: (filePath: string, languageId?: string) => Promise; - /** - * Create a fake document from content and return the associated TextDocument - */ - openFakeDocument: (content: string, languageId?: string) => Promise; - requestCompletion: ( - document: TextDocument, - position: protocol.Position - ) => Promise; - requestDiagnostics: (document: TextDocument) => Promise; - requestHover: (document: TextDocument, position: protocol.Position) => Promise; - requestFormatting( - document: TextDocument, - options?: protocol.FormattingOptions - ): Promise; - }; -} - -let languageServer: LanguageServer | undefined; - -export async function getLanguageServer() { - if (!languageServer) { - await initLanguageServer(); +let serverHandle: LanguageServerHandle | undefined; +let initializeResult: protocol.InitializeResult | undefined; + +export type LanguageServer = { + handle: LanguageServerHandle; + initializeResult: protocol.InitializeResult; + openFakeDocument: (content: string, languageId: string) => Promise; +}; + +export async function getLanguageServer(): Promise { + if (!serverHandle) { + serverHandle = startLanguageServer( + path.resolve('./bin/nodeServer.js'), + fileURLToPath(new URL('./fixture', import.meta.url)) + ); + + initializeResult = await serverHandle.initialize( + URI.file(fileURLToPath(new URL('./fixture', import.meta.url))).toString(), + { + typescript: { + tsdk: path.join( + path.dirname(fileURLToPath(import.meta.url)), + '../', + 'node_modules', + 'typescript', + 'lib' + ), + }, + } + ); + // Ensure that our first test does not suffer from a TypeScript overhead + await serverHandle.sendCompletionRequest( + 'file://doesnt-exists', + protocol.Position.create(0, 0) + ); } - return languageServer!; -} - -async function initLanguageServer() { - if (languageServer) return; - const dir = fileURLToPath(new URL('./fixture', import.meta.url)); - const serverModule = path.resolve('./bin/nodeServer.js'); - const childProcess = cp.fork( - serverModule, - ['--node-ipc', `--clientProcessId=${process.pid.toString()}`], - { - execArgv: ['--nolazy'], - env: process.env, - cwd: dir, - } - ); - const connection = protocol.createProtocolConnection( - new protocol.IPCMessageReader(childProcess), - new protocol.IPCMessageWriter(childProcess) - ); - connection.listen(); - - connection.onClose((e) => console.log(e)); - connection.onDispose((e) => console.log(e)); - connection.onUnhandledNotification((e) => console.log(e)); - connection.onError((e) => console.log(e)); + if (!initializeResult || !serverHandle) { + throw new Error('Server not initialized'); + } - const initRequest = await connection.sendRequest('initialize', { - rootPath: './fixture', - capabilities: {}, - initializationOptions: { - diagnosticModel: 2, // DiagnosticModel.Pull - typescript: { - tsdk: path.join( - path.dirname(fileURLToPath(import.meta.url)), - '../', - 'node_modules', - 'typescript', - 'lib' - ), - }, - }, - }); - await connection.sendNotification('initialized'); + return { + handle: serverHandle, + initializeResult: initializeResult, + openFakeDocument: async (content: string, languageId: string) => { + const hash = createHash('sha256').update(content).digest('base64url'); + const uri = URI.file(`does-not-exists-${hash}-.astro`).toString(); + const textDocument = await serverHandle!.openInMemoryDocument(uri, languageId, content); - languageServer = { - process: childProcess, - connection: connection, - get initResult() { - return initRequest; - }, - helpers: { - async openRealDocument(filePath, languageId = 'astro') { - const fileName = path.resolve(dir, filePath); - const uri = URI.file(fileName).toString(); - const item = protocol.TextDocumentItem.create( - uri, - languageId, - 0, - fs.readFileSync(fileName, 'utf-8') - ); - await connection.sendNotification(protocol.DidOpenTextDocumentNotification.type, { - textDocument: item, - }); - return TextDocument.create(uri, languageId, 0, item.text); - }, - async openFakeDocument(content, languageId = 'astro') { - const hash = createHash('sha256').update(content).digest('base64url'); - const uri = URI.file(`does-not-exists-${hash}-.astro`).toString(); - const item = protocol.TextDocumentItem.create(uri, languageId, 0, content); - await connection.sendNotification(protocol.DidOpenTextDocumentNotification.type, { - textDocument: item, - }); - return TextDocument.create(uri, languageId, 0, item.text); - }, - async requestCompletion(document, position) { - return await connection.sendRequest( - protocol.CompletionRequest.method, - { - textDocument: { - uri: document.uri, - }, - position: position, - } - ); - }, - async requestDiagnostics(document) { - return await connection.sendRequest( - protocol.DocumentDiagnosticRequest.method, - { - textDocument: { - uri: document.uri, - }, - } - ); - }, - async requestHover(document, position) { - return await connection.sendRequest(protocol.HoverRequest.method, { - textDocument: { - uri: document.uri, - }, - position: position, - }); - }, - async requestFormatting(document, options) { - return await connection.sendRequest( - protocol.DocumentFormattingRequest.method, - { - textDocument: { - uri: document.uri, - }, - options: options, - } - ); - }, + return textDocument; }, }; - - // Ensure that our first test does not suffer from a TypeScript overhead - await languageServer.helpers.requestCompletion( - TextDocument.create('file://doesnt-exists', 'astro', 0, ''), - protocol.Position.create(0, 0) - ); } diff --git a/packages/language-server/test/takedown.ts b/packages/language-server/test/takedown.ts index 9f2aa39e..e0722d59 100644 --- a/packages/language-server/test/takedown.ts +++ b/packages/language-server/test/takedown.ts @@ -1,5 +1,5 @@ import { getLanguageServer } from './server.js'; export async function mochaGlobalTeardown() { const languageServer = await getLanguageServer(); - languageServer.process.kill(); + languageServer.handle.connection.dispose(); } diff --git a/packages/language-server/test/typescript-addons/completions.test.ts b/packages/language-server/test/typescript-addons/completions.test.ts index c356f3d2..a18f3a06 100644 --- a/packages/language-server/test/typescript-addons/completions.test.ts +++ b/packages/language-server/test/typescript-addons/completions.test.ts @@ -1,21 +1,21 @@ import { Position } from '@volar/language-server'; import { expect } from 'chai'; import { before, describe, it } from 'mocha'; -import { LanguageServer, getLanguageServer } from '../server.js'; +import { getLanguageServer, type LanguageServer } from '../server.js'; describe('TypeScript Addons - Completions', async () => { let languageServer: LanguageServer; before(async () => (languageServer = await getLanguageServer())); + it('Can provide neat snippets', async () => { - const document = await languageServer.helpers.openFakeDocument('---\nprerender\n---'); - const completions = await languageServer.helpers.requestCompletion( - document, + const document = await languageServer.openFakeDocument('---\nprerender\n---', 'astro'); + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, Position.create(1, 10) ); - const prerenderCompletions = completions.items.filter((item) => item.label === 'prerender'); + const prerenderCompletions = completions?.items.filter((item) => item.label === 'prerender'); expect(prerenderCompletions).to.not.be.empty; - expect(prerenderCompletions[0].data.serviceId).to.equal('typescriptaddons'); }); }); diff --git a/packages/language-server/test/typescript/completions.test.ts b/packages/language-server/test/typescript/completions.test.ts index de1b9c8e..09423860 100644 --- a/packages/language-server/test/typescript/completions.test.ts +++ b/packages/language-server/test/typescript/completions.test.ts @@ -1,7 +1,7 @@ import { Position } from '@volar/language-server'; import { expect } from 'chai'; import { before, describe, it } from 'mocha'; -import { LanguageServer, getLanguageServer } from '../server.js'; +import { getLanguageServer, type LanguageServer } from '../server.js'; describe('TypeScript - Completions', async () => { let languageServer: LanguageServer; @@ -9,36 +9,56 @@ describe('TypeScript - Completions', async () => { before(async () => (languageServer = await getLanguageServer())); it('Can get completions in the frontmatter', async () => { - const document = await languageServer.helpers.openFakeDocument('---\nc\n---'); - const completions = await languageServer.helpers.requestCompletion( - document, + const document = await languageServer.openFakeDocument('---\nc\n---', 'astro'); + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, Position.create(1, 1) ); - expect(completions.items).to.not.be.empty; + expect(completions?.items).to.not.be.empty; }); it('Can get completions in the template', async () => { - const document = await languageServer.helpers.openFakeDocument('{c}'); - const completions = await languageServer.helpers.requestCompletion( - document, + const document = await languageServer.openFakeDocument('{c}', 'astro'); + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, Position.create(0, 1) ); - expect(completions.items).to.not.be.empty; + expect(completions?.items).to.not.be.empty; }); it('sort completions starting with `astro:` higher than other imports', async () => { - const document = await languageServer.helpers.openFakeDocument(' item.labelDetails?.description === 'astro:assets' ); expect(imageCompletion?.sortText).to.equal('\x00ï¿¿16'); }); + + it('Can get completions in all kinds of script tags', async () => { + const documents = [ + '', + '', + '', + ]; + + for (const doc of documents) { + const document = await languageServer.openFakeDocument(doc, 'astro'); + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, + Position.create(1, 8) + ); + + const allLabels = completions?.items.map((item) => item.label); + expect(completions?.items).to.not.be.empty; + expect(allLabels).to.include('log'); + } + }); }); diff --git a/packages/language-server/test/typescript/diagnostics.test.ts b/packages/language-server/test/typescript/diagnostics.test.ts index 892a93b1..2150275a 100644 --- a/packages/language-server/test/typescript/diagnostics.test.ts +++ b/packages/language-server/test/typescript/diagnostics.test.ts @@ -1,7 +1,13 @@ -import { DiagnosticSeverity, Range, type Diagnostic } from '@volar/language-server'; +import { + DiagnosticSeverity, + FullDocumentDiagnosticReport, + Range, + type Diagnostic, +} from '@volar/language-server'; import { expect } from 'chai'; import { before, describe, it } from 'mocha'; -import { LanguageServer, getLanguageServer } from '../server.js'; +import { getLanguageServer, type LanguageServer } from '../server.js'; +import * as path from 'path'; describe('TypeScript - Diagnostics', async () => { let languageServer: LanguageServer; @@ -9,8 +15,10 @@ describe('TypeScript - Diagnostics', async () => { before(async () => (languageServer = await getLanguageServer())); it('Can get diagnostics in the frontmatter', async () => { - const document = await languageServer.helpers.openFakeDocument('---\nNotAThing\n---', 'astro'); - const diagnostics = await languageServer.helpers.requestDiagnostics(document); + const document = await languageServer.openFakeDocument('---\nNotAThing\n---', 'astro'); + const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( + document.uri + )) as FullDocumentDiagnosticReport; // We should only have one error here. expect(diagnostics.items).length(1); @@ -29,8 +37,10 @@ describe('TypeScript - Diagnostics', async () => { }); it('Can get diagnostics in the template', async () => { - const document = await languageServer.helpers.openFakeDocument('---\n\n---\n{nope}', 'astro'); - const diagnostics = await languageServer.helpers.requestDiagnostics(document); + const document = await languageServer.openFakeDocument('---\n\n---\n{nope}', 'astro'); + const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( + document.uri + )) as FullDocumentDiagnosticReport; expect(diagnostics.items).length(1); const diagnostic: Diagnostic = { ...diagnostics.items[0], data: {} }; @@ -45,8 +55,13 @@ describe('TypeScript - Diagnostics', async () => { }); it('shows enhanced diagnostics', async () => { - const document = await languageServer.helpers.openRealDocument('./enhancedDiagnostics.astro'); - const diagnostics = await languageServer.helpers.requestDiagnostics(document); + const document = await languageServer.handle.openTextDocument( + path.resolve(__dirname, '..', 'fixture', 'enhancedDiagnostics.astro'), + 'astro' + ); + const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( + document.uri + )) as FullDocumentDiagnosticReport; expect(diagnostics.items).length(2); diagnostics.items = diagnostics.items.map((diag) => ({ ...diag, data: {} })); diff --git a/packages/language-server/test/units/parseCSS.test.ts b/packages/language-server/test/units/parseCSS.test.ts index 2ab20591..cb973080 100644 --- a/packages/language-server/test/units/parseCSS.test.ts +++ b/packages/language-server/test/units/parseCSS.test.ts @@ -8,15 +8,10 @@ describe('parseCSS - Can find all the styles in an Astro file', () => { it('Can find all the styles in an Astro file, including nested tags', () => { const input = `
`; const snapshot = ts.ScriptSnapshot.fromString(input); - const html = parseHTML('something/style/hello.astro', snapshot, 0); + const html = parseHTML(snapshot, 0); const astroAst = getAstroMetadata('file.astro', input).ast; - const styleTags = extractStylesheets( - 'something/style/hello.astro', - snapshot, - html.htmlDocument, - astroAst - ); + const styleTags = extractStylesheets(snapshot, html.htmlDocument, astroAst); expect(styleTags.length).to.equal(2); }); diff --git a/packages/language-server/test/units/parseJS.test.ts b/packages/language-server/test/units/parseJS.test.ts index 001dcbb1..557e3577 100644 --- a/packages/language-server/test/units/parseJS.test.ts +++ b/packages/language-server/test/units/parseJS.test.ts @@ -8,15 +8,10 @@ describe('parseJS - Can find all the scripts in an Astro file', () => { it('Can find all the scripts in an Astro file, including nested tags', () => { const input = `
`; const snapshot = ts.ScriptSnapshot.fromString(input); - const html = parseHTML('something/something/hello.astro', snapshot, 0); + const html = parseHTML(snapshot, 0); const astroAst = getAstroMetadata('file.astro', input).ast; - const scriptTags = extractScriptTags( - 'something/something/hello.astro', - snapshot, - html.htmlDocument, - astroAst - ); + const scriptTags = extractScriptTags(snapshot, html.htmlDocument, astroAst); expect(scriptTags.length).to.equal(2); }); @@ -24,15 +19,10 @@ describe('parseJS - Can find all the scripts in an Astro file', () => { it('Ignore JSON scripts', () => { const input = ``; const snapshot = ts.ScriptSnapshot.fromString(input); - const html = parseHTML('something/something/hello.astro', snapshot, 0); + const html = parseHTML(snapshot, 0); const astroAst = getAstroMetadata('file.astro', input).ast; - const scriptTags = extractScriptTags( - 'something/something/hello.astro', - snapshot, - html.htmlDocument, - astroAst - ); + const scriptTags = extractScriptTags(snapshot, html.htmlDocument, astroAst); expect(scriptTags.length).to.equal(0); }); @@ -40,23 +30,20 @@ describe('parseJS - Can find all the scripts in an Astro file', () => { it('returns the proper capabilities for inline script tags', () => { const input = ``; const snapshot = ts.ScriptSnapshot.fromString(input); - const html = parseHTML('something/something/hello.astro', snapshot, 0); + const html = parseHTML(snapshot, 0); const astroAst = getAstroMetadata('file.astro', input).ast; - const scriptTags = extractScriptTags( - 'something/something/hello.astro', - snapshot, - html.htmlDocument, - astroAst - ); - - expect(scriptTags[0].capabilities).to.deep.equal({ - diagnostic: true, - foldingRange: true, - documentFormatting: false, - documentSymbol: true, - codeAction: true, - inlayHint: true, + const scriptTags = extractScriptTags(snapshot, html.htmlDocument, astroAst); + + scriptTags[0].mappings.forEach((mapping) => { + expect(mapping.data).to.deep.equal({ + verification: true, + completion: true, + semantic: true, + navigation: true, + structure: true, + format: false, + }); }); }); }); diff --git a/packages/ts-plugin/package.json b/packages/ts-plugin/package.json index a8529458..e1b49159 100644 --- a/packages/ts-plugin/package.json +++ b/packages/ts-plugin/package.json @@ -27,8 +27,8 @@ "author": "withastro", "license": "MIT", "dependencies": { - "@volar/language-core": "~1.10.9", - "@volar/typescript": "~1.10.9", + "@volar/language-core": "~2.0.2", + "@volar/typescript": "~2.0.2", "@astrojs/compiler": "^2.4.0", "@jridgewell/sourcemap-codec": "^1.4.15", "semver": "^7.3.8", diff --git a/packages/ts-plugin/src/astro2tsx.ts b/packages/ts-plugin/src/astro2tsx.ts index 3d24ae08..c1407322 100644 --- a/packages/ts-plugin/src/astro2tsx.ts +++ b/packages/ts-plugin/src/astro2tsx.ts @@ -1,7 +1,7 @@ import { convertToTSX } from '@astrojs/compiler/sync'; import type { ConvertToTSXOptions, TSXResult } from '@astrojs/compiler/types'; import { decode } from '@jridgewell/sourcemap-codec'; -import { FileKind, FileRangeCapabilities, VirtualFile } from '@volar/language-core'; +import type { CodeMapping, VirtualCode } from '@volar/language-core'; import path from 'node:path'; import { TextDocument } from 'vscode-languageserver-textdocument'; @@ -46,11 +46,7 @@ function safeConvertToTSX(content: string, options: ConvertToTSXOptions) { } } -export function astro2tsx( - input: string, - fileName: string, - ts: typeof import('typescript/lib/tsserverlibrary.js') -) { +export function astro2tsx(input: string, fileName: string, ts: typeof import('typescript')) { const tsx = safeConvertToTSX(input, { filename: fileName }); return { @@ -63,14 +59,13 @@ function getVirtualFileTSX( input: string, tsx: TSXResult, fileName: string, - ts: typeof import('typescript/lib/tsserverlibrary.js') -): VirtualFile { + ts: typeof import('typescript') +): VirtualCode { tsx.code = patchTSX(tsx.code, fileName); const v3Mappings = decode(tsx.map.mappings); const sourcedDoc = TextDocument.create(fileName, 'astro', 0, input); const genDoc = TextDocument.create(fileName + '.tsx', 'typescriptreact', 0, tsx.code); - - const mappings: VirtualFile['mappings'] = []; + const mappings: CodeMapping[] = []; let current: | { @@ -101,16 +96,23 @@ function getVirtualFileTSX( const lastMapping = mappings.length ? mappings[mappings.length - 1] : undefined; if ( lastMapping && - lastMapping.generatedRange[1] === current.genOffset && - lastMapping.sourceRange[1] === current.sourceOffset + lastMapping.generatedOffsets[0] + lastMapping.lengths[0] === current.genOffset && + lastMapping.sourceOffsets[0] + lastMapping.lengths[0] === current.sourceOffset ) { - lastMapping.generatedRange[1] = current.genOffset + length; - lastMapping.sourceRange[1] = current.sourceOffset + length; + lastMapping.lengths[0] += length; } else { mappings.push({ - sourceRange: [current.sourceOffset, current.sourceOffset + length], - generatedRange: [current.genOffset, current.genOffset + length], - data: FileRangeCapabilities.full, + sourceOffsets: [current.sourceOffset], + generatedOffsets: [current.genOffset], + lengths: [length], + data: { + verification: true, + completion: true, + semantic: true, + navigation: true, + structure: true, + format: false, + }, }); } } @@ -126,34 +128,16 @@ function getVirtualFileTSX( } } - const ast = ts.createSourceFile('/a.tsx', tsx.code, ts.ScriptTarget.ESNext); - if (ast.statements[0]) { - mappings.push({ - sourceRange: [0, input.length], - generatedRange: [ast.statements[0].getStart(ast), tsx.code.length], - data: {}, - }); - } - return { - fileName: fileName + '.tsx', - kind: FileKind.TypeScriptHostFile, - capabilities: { - codeAction: true, - documentFormatting: false, - diagnostic: true, - documentSymbol: true, - inlayHint: true, - foldingRange: true, - }, - codegenStacks: [], + id: 'tsx', + languageId: 'typescriptreact', snapshot: { getText: (start, end) => tsx.code.substring(start, end), getLength: () => tsx.code.length, getChangeRange: () => undefined, }, mappings: mappings, - embeddedFiles: [], + embeddedCodes: [], }; } diff --git a/packages/ts-plugin/src/index.ts b/packages/ts-plugin/src/index.ts index 7dd27ab0..f06b7b24 100644 --- a/packages/ts-plugin/src/index.ts +++ b/packages/ts-plugin/src/index.ts @@ -1,73 +1,4 @@ -import { createVirtualFiles } from '@volar/language-core'; -import { - decorateLanguageService, - decorateLanguageServiceHost, - searchExternalFiles, -} from '@volar/typescript'; -import * as semver from 'semver'; -import type ts from 'typescript/lib/tsserverlibrary'; +import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin.js'; import { getLanguageModule } from './language.js'; -const externalFiles = new WeakMap(); - -const init: ts.server.PluginModuleFactory = (modules) => { - const { typescript: ts } = modules; - const pluginModule: ts.server.PluginModule = { - create(info) { - const virtualFiles = createVirtualFiles([getLanguageModule(ts)]); - - decorateLanguageService(virtualFiles, info.languageService, true); - decorateLanguageServiceHost(virtualFiles, info.languageServiceHost, ts, ['.astro']); - - if (semver.lt(ts.version, '5.3.0')) { - // HACK: AutoImportProviderProject's script kind does not match the one of the language service host here - // this causes TypeScript to throw and crash. So, we'll fake being a TS file here for now until they fix it - // Fixed by https://github.com/microsoft/TypeScript/pull/55716 - const getScriptKind = info.languageServiceHost.getScriptKind?.bind( - info.languageServiceHost.getScriptKind - ); - if (getScriptKind) { - info.languageServiceHost.getScriptKind = (fileName) => { - if (fileName.endsWith('.astro')) { - return ts.ScriptKind.TS; - } - return getScriptKind(fileName); - }; - } - } - - return info.languageService; - }, - getExternalFiles(project, updateLevel = 0) { - if ( - // @ts-expect-error wait for TS 5.3 - updateLevel >= (1 satisfies ts.ProgramUpdateLevel.RootNamesAndUpdate) || - !externalFiles.has(project) - ) { - const oldFiles = externalFiles.get(project); - const newFiles = searchExternalFiles(ts, project, ['.astro']); - externalFiles.set(project, newFiles); - if (oldFiles && !arrayItemsEqual(oldFiles, newFiles)) { - project.refreshDiagnostics(); - } - } - return externalFiles.get(project)!; - }, - }; - return pluginModule; -}; - -function arrayItemsEqual(a: string[], b: string[]) { - if (a.length !== b.length) { - return false; - } - const set = new Set(a); - for (const file of b) { - if (!set.has(file)) { - return false; - } - } - return true; -} - -export = init; +export = createLanguageServicePlugin((ts) => [getLanguageModule(ts)]); diff --git a/packages/ts-plugin/src/language.ts b/packages/ts-plugin/src/language.ts index daab83f1..71101fb4 100644 --- a/packages/ts-plugin/src/language.ts +++ b/packages/ts-plugin/src/language.ts @@ -1,43 +1,55 @@ import { - FileCapabilities, - FileKind, - FileRangeCapabilities, - type Language, - type VirtualFile, + forEachEmbeddedCode, + type CodeMapping, + type LanguagePlugin, + type VirtualCode, } from '@volar/language-core'; -import type ts from 'typescript/lib/tsserverlibrary.js'; +import type ts from 'typescript'; import { astro2tsx } from './astro2tsx.js'; export function getLanguageModule( - ts: typeof import('typescript/lib/tsserverlibrary.js') -): Language { + ts: typeof import('typescript') +): LanguagePlugin { return { - createVirtualFile(fileName, snapshot) { - if (fileName.endsWith('.astro')) { - return new AstroFile(fileName, snapshot, ts); + createVirtualCode(fileId, languageId, snapshot) { + if (languageId === 'astro') { + const fileName = fileId.includes('://') ? fileId.split('://')[1] : fileId; + return new AstroVirtualCode(fileName, snapshot, ts); } }, - updateVirtualFile(astroFile, snapshot) { + updateVirtualCode(_fileId, astroFile, snapshot) { astroFile.update(snapshot); + return astroFile; + }, + typescript: { + extraFileExtensions: [{ extension: 'astro', isMixedContent: true, scriptKind: 7 }], + getScript(astroCode) { + for (const code of forEachEmbeddedCode(astroCode)) { + if (code.id === 'tsx') { + return { + code, + extension: '.tsx', + scriptKind: 4 satisfies ts.ScriptKind.TSX, + }; + } + } + }, }, }; } -export class AstroFile implements VirtualFile { - kind = FileKind.TextFile; - capabilities = FileCapabilities.full; - - fileName: string; - mappings!: VirtualFile['mappings']; - embeddedFiles!: VirtualFile['embeddedFiles']; +export class AstroVirtualCode implements VirtualCode { + id = 'root'; + languageId = 'astro'; + mappings!: CodeMapping[]; + embeddedCodes!: VirtualCode[]; codegenStacks = []; constructor( - public sourceFileName: string, + public fileName: string, public snapshot: ts.IScriptSnapshot, - private readonly ts: typeof import('typescript/lib/tsserverlibrary.js') + private readonly ts: typeof import('typescript') ) { - this.fileName = sourceFileName; this.onSnapshotUpdated(); } @@ -49,13 +61,21 @@ export class AstroFile implements VirtualFile { onSnapshotUpdated() { this.mappings = [ { - sourceRange: [0, this.snapshot.getLength()], - generatedRange: [0, this.snapshot.getLength()], - data: FileRangeCapabilities.full, + sourceOffsets: [0], + generatedOffsets: [0], + lengths: [this.snapshot.getLength()], + data: { + verification: true, + completion: true, + semantic: true, + navigation: true, + structure: true, + format: false, + }, }, ]; - this.embeddedFiles = []; + this.embeddedCodes = []; const tsx = astro2tsx( this.snapshot.getText(0, this.snapshot.getLength()), @@ -63,6 +83,6 @@ export class AstroFile implements VirtualFile { this.ts ); - this.embeddedFiles.push(tsx.virtualFile); + this.embeddedCodes.push(tsx.virtualFile); } } diff --git a/packages/vscode/package.json b/packages/vscode/package.json index fe99f5cb..eab0f16d 100644 --- a/packages/vscode/package.json +++ b/packages/vscode/package.json @@ -224,8 +224,8 @@ "@types/mocha": "^10.0.1", "@types/node": "^18.17.8", "@types/vscode": "^1.82.0", - "@volar/language-server": "~1.11.1", - "@volar/vscode": "~1.11.1", + "@volar/language-server": "~2.0.2", + "@volar/vscode": "~2.0.2", "@vscode/test-electron": "^2.3.2", "@vscode/vsce": "latest", "esbuild": "^0.17.19", diff --git a/packages/vscode/src/client.ts b/packages/vscode/src/client.ts index 0c5ad87a..575a6229 100644 --- a/packages/vscode/src/client.ts +++ b/packages/vscode/src/client.ts @@ -1,4 +1,4 @@ -import { DiagnosticModel, InitializationOptions } from '@volar/language-server'; +import { DiagnosticModel, type InitializationOptions } from '@volar/language-server'; import * as protocol from '@volar/language-server/protocol'; import { activateAutoInsertion, @@ -6,9 +6,9 @@ import { activateReloadProjects, activateTsConfigStatusItem, activateTsVersionStatusItem, + createLabsInfo, getTsdk, - supportLabsVersion, - type ExportsInfoForLabs, + type LabsInfo, } from '@volar/vscode'; import * as path from 'node:path'; import * as vscode from 'vscode'; @@ -16,7 +16,7 @@ import * as lsp from 'vscode-languageclient/node'; let client: lsp.BaseLanguageClient; -export async function activate(context: vscode.ExtensionContext): Promise { +export async function activate(context: vscode.ExtensionContext): Promise { const runtimeConfig = vscode.workspace.getConfiguration('astro.language-server'); const { workspaceFolders } = vscode.workspace; @@ -70,26 +70,22 @@ export async function activate(context: vscode.ExtensionContext): Promise document.languageId === 'astro'); + activateAutoInsertion('astro', client); activateFindFileReferences('astro.findFileReferences', client); - activateReloadProjects('astro.reloadProjects', [client]); - activateTsConfigStatusItem('astro.openTsConfig', client, () => false); + activateReloadProjects('astro.reloadProjects', client); + activateTsConfigStatusItem('astro', 'astro.openTsConfig', client); activateTsVersionStatusItem( + 'astro', 'astro.selectTypescriptVersion', context, client, - (document) => document.languageId === 'astro', - (text) => text, - true + (text) => text ); - return { - volarLabs: { - version: supportLabsVersion, - languageClients: [client], - languageServerProtocol: protocol, - }, - }; + const volarLabs = createLabsInfo(protocol); + volarLabs.addLanguageClient(client); + + return volarLabs.extensionExports; } export function deactivate(): Thenable | undefined { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bad83a4f..46b3ba4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,65 +83,59 @@ importers: dependencies: '@astrojs/compiler': specifier: ^2.4.0 - version: 2.4.0 + version: 2.5.2 '@jridgewell/sourcemap-codec': specifier: ^1.4.15 version: 1.4.15 '@volar/kit': - specifier: ~1.11.1 - version: 1.11.1(typescript@5.2.2) + specifier: ~2.0.2 + version: 2.0.2(typescript@5.2.2) '@volar/language-core': - specifier: ~1.11.1 - version: 1.11.1 + specifier: ~2.0.2 + version: 2.0.2 '@volar/language-server': - specifier: ~1.11.1 - version: 1.11.1 + specifier: ~2.0.2 + version: 2.0.2 '@volar/language-service': - specifier: ~1.11.1 - version: 1.11.1 - '@volar/source-map': - specifier: ~1.11.1 - version: 1.11.1 + specifier: ~2.0.2 + version: 2.0.2 '@volar/typescript': - specifier: ~1.11.1 - version: 1.11.1 + specifier: ~2.0.2 + version: 2.0.2 fast-glob: specifier: ^3.2.12 version: 3.2.12 - muggle-string: - specifier: ^0.3.1 - version: 0.3.1 volar-service-css: - specifier: 0.0.17 - version: 0.0.17(@volar/language-service@1.11.1) + specifier: 0.0.28 + version: 0.0.28(@volar/language-service@2.0.2) volar-service-emmet: - specifier: 0.0.17 - version: 0.0.17(@volar/language-service@1.11.1) + specifier: 0.0.28 + version: 0.0.28(@volar/language-service@2.0.2) volar-service-html: - specifier: 0.0.17 - version: 0.0.17(@volar/language-service@1.11.1) + specifier: 0.0.28 + version: 0.0.28(@volar/language-service@2.0.2) volar-service-prettier: - specifier: 0.0.17 - version: 0.0.17(@volar/language-service@1.11.1)(prettier@3.0.0) + specifier: 0.0.28 + version: 0.0.28(@volar/language-service@2.0.2)(prettier@3.0.0) volar-service-typescript: - specifier: 0.0.17 - version: 0.0.17(@volar/language-service@1.11.1)(@volar/typescript@1.11.1) + specifier: 0.0.28 + version: 0.0.28(@volar/language-service@2.0.2)(@volar/typescript@2.0.2) volar-service-typescript-twoslash-queries: - specifier: 0.0.17 - version: 0.0.17(@volar/language-service@1.11.1) + specifier: 0.0.28 + version: 0.0.28(@volar/language-service@2.0.2) vscode-html-languageservice: - specifier: ^5.1.0 - version: 5.1.0 + specifier: ^5.1.1 + version: 5.1.1 vscode-uri: specifier: ^3.0.8 version: 3.0.8 devDependencies: '@astrojs/svelte': specifier: ^4.0.3 - version: 4.0.3(astro@4.1.0)(typescript@5.2.2) + version: 4.0.3(astro@4.3.2)(typescript@5.2.2) '@astrojs/vue': specifier: ^3.0.1 - version: 3.0.1(astro@4.1.0) + version: 3.0.1(astro@4.3.2) '@types/chai': specifier: ^4.3.5 version: 4.3.5 @@ -151,9 +145,12 @@ importers: '@types/node': specifier: ^18.17.8 version: 18.17.8 + '@volar/test-utils': + specifier: ~2.0.2 + version: 2.0.2 astro: specifier: ^4.1.0 - version: 4.1.0(@types/node@18.17.8)(typescript@5.2.2) + version: 4.3.2(@types/node@18.17.8)(typescript@5.2.2) chai: specifier: ^4.3.7 version: 4.3.7 @@ -177,22 +174,22 @@ importers: devDependencies: astro: specifier: ^4.1.0 - version: 4.1.0(@types/node@18.17.8)(typescript@5.2.2) + version: 4.3.2(@types/node@18.17.8)(typescript@5.2.2) packages/ts-plugin: dependencies: '@astrojs/compiler': specifier: ^2.4.0 - version: 2.4.0 + version: 2.5.2 '@jridgewell/sourcemap-codec': specifier: ^1.4.15 version: 1.4.15 '@volar/language-core': - specifier: ~1.10.9 - version: 1.10.9 + specifier: ~2.0.2 + version: 2.0.2 '@volar/typescript': - specifier: ~1.10.9 - version: 1.10.9 + specifier: ~2.0.2 + version: 2.0.2 semver: specifier: ^7.3.8 version: 7.5.4 @@ -226,7 +223,7 @@ importers: dependencies: '@astrojs/compiler': specifier: ^2.4.0 - version: 2.4.0 + version: 2.5.2 prettier: specifier: ^3.0.0 version: 3.0.0 @@ -253,11 +250,11 @@ importers: specifier: ^1.82.0 version: 1.83.0 '@volar/language-server': - specifier: ~1.11.1 - version: 1.11.1 + specifier: ~2.0.2 + version: 2.0.2 '@volar/vscode': - specifier: ~1.11.1 - version: 1.11.1 + specifier: ~2.0.2 + version: 2.0.2 '@vscode/test-electron': specifier: ^2.3.2 version: 2.3.2 @@ -303,15 +300,15 @@ packages: resolution: {integrity: sha512-dFU7GAMbpTUGPkRoCoMQrGFlTe3qIiQMSOxIXp/nB1Do4My9uogjEmBHdR5Cwr4i6rc5/1R3Od9v8kU/pkHXGQ==} dev: false - /@astrojs/compiler@2.4.0: - resolution: {integrity: sha512-LUN/iG8KcStfChHwTvCg/t91IQFQxguF3CkDLW3tdY2vBKZmOJy9MgtRl20ZGgPtgrykGCtnr4AellEm0bPuFg==} + /@astrojs/compiler@2.5.2: + resolution: {integrity: sha512-fm9HNYu1tVnJjZYHE+SdDM5k6fZKNPXS9PwT43Mf6l4HVGx8d1jQwhGQqCvLkYJJBwQ9OysiexFMt7wtNuXhmQ==} /@astrojs/internal-helpers@0.2.1: resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==} dev: true - /@astrojs/markdown-remark@4.0.1: - resolution: {integrity: sha512-RU4ESnqvyLpj8WZs0n5elS6idaDdtIIm7mIpMaRNPCebpxMjfcfdwcmBwz83ktAj5d2eO5bC3z92TcGdli+lRw==} + /@astrojs/markdown-remark@4.2.1: + resolution: {integrity: sha512-2RQBIwrq+2qPYtp99bH+eL5hfbK0BoxXla85lHsRpIX/IsGqFrPX6pXI2cbWPihBwGbKCdxS6uZNX2QerZWwpQ==} dependencies: '@astrojs/prism': 3.0.0 github-slugger: 2.0.0 @@ -321,9 +318,9 @@ packages: rehype-stringify: 10.0.0 remark-gfm: 4.0.0 remark-parse: 11.0.0 - remark-rehype: 11.0.0 + remark-rehype: 11.1.0 remark-smartypants: 2.0.0 - shikiji: 0.6.13 + shikiji: 0.9.19 unified: 11.0.4 unist-util-visit: 5.0.0 vfile: 6.0.1 @@ -338,7 +335,7 @@ packages: prismjs: 1.29.0 dev: true - /@astrojs/svelte@4.0.3(astro@4.1.0)(typescript@5.2.2): + /@astrojs/svelte@4.0.3(astro@4.3.2)(typescript@5.2.2): resolution: {integrity: sha512-3toH/mkNFqMdmnMXh4XcksZfuOAwWVXdRrISyoRgNn1HalG6WBACFT+RwxAwpH7eXW/zUfrpfyZdcxYnVucHTg==} engines: {node: '>=18.14.1'} peerDependencies: @@ -349,7 +346,7 @@ packages: optional: true dependencies: '@sveltejs/vite-plugin-svelte': 2.4.6 - astro: 4.1.0(@types/node@18.17.8)(typescript@5.2.2) + astro: 4.3.2(@types/node@18.17.8)(typescript@5.2.2) svelte2tsx: 0.6.23(typescript@5.2.2) transitivePeerDependencies: - supports-color @@ -372,7 +369,7 @@ packages: - supports-color dev: true - /@astrojs/vue@3.0.1(astro@4.1.0): + /@astrojs/vue@3.0.1(astro@4.3.2): resolution: {integrity: sha512-qXn99sQ60zUPoHsMXGt43IySMKN5VXZz5VJlTKqkXG+CFV9DOWw0+syj/5iYKZSouH3nyNNb5a9uAkdz+X6Cew==} engines: {node: '>=18.14.1'} peerDependencies: @@ -386,7 +383,7 @@ packages: '@vitejs/plugin-vue-jsx': 3.0.2 '@vue/babel-plugin-jsx': 1.1.5 '@vue/compiler-sfc': 3.3.4 - astro: 4.1.0(@types/node@18.17.8)(typescript@5.2.2) + astro: 4.3.2(@types/node@18.17.8)(typescript@5.2.2) transitivePeerDependencies: - '@babel/core' - supports-color @@ -449,20 +446,20 @@ packages: - supports-color dev: true - /@babel/core@7.23.7: - resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helpers': 7.23.7 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -486,7 +483,7 @@ packages: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 @@ -516,7 +513,7 @@ packages: dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 + browserslist: 4.22.3 lru-cache: 5.1.1 semver: 6.3.1 dev: true @@ -593,7 +590,7 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -602,7 +599,7 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -699,13 +696,13 @@ packages: - supports-color dev: true - /@babel/helpers@7.23.7: - resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color dev: true @@ -745,12 +742,12 @@ packages: '@babel/types': 7.23.0 dev: true - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): @@ -766,7 +763,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.7): + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -775,7 +772,7 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -792,7 +789,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.7): + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.9): resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -801,12 +798,12 @@ packages: '@babel/core': optional: true dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.7) - '@babel/types': 7.23.6 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.9) + '@babel/types': 7.23.9 dev: true /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2): @@ -841,6 +838,15 @@ packages: '@babel/types': 7.23.0 dev: true + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + /@babel/traverse@7.23.2: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} @@ -859,8 +865,8 @@ packages: - supports-color dev: true - /@babel/traverse@7.23.7: - resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 @@ -869,8 +875,8 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: @@ -886,8 +892,8 @@ packages: to-fast-properties: 2.0.0 dev: true - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 @@ -1095,14 +1101,6 @@ packages: resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} dev: false - /@emnapi/runtime@0.44.0: - resolution: {integrity: sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==} - requiresBuild: true - dependencies: - tslib: 2.4.0 - dev: true - optional: true - /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: @@ -1124,8 +1122,8 @@ packages: get-tsconfig: 4.6.0 dev: true - /@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -1142,8 +1140,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1160,8 +1158,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1178,8 +1176,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1196,8 +1194,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1214,8 +1212,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1232,8 +1230,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1250,8 +1248,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1268,8 +1266,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1286,8 +1284,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1304,8 +1302,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1322,8 +1320,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1340,8 +1338,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1358,8 +1356,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1376,8 +1374,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1394,8 +1392,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1412,8 +1410,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1430,8 +1428,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1448,8 +1446,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1466,8 +1464,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1484,8 +1482,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1502,8 +1500,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1520,8 +1518,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1586,194 +1584,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@img/sharp-darwin-arm64@0.33.1: - resolution: {integrity: sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.0 - dev: true - optional: true - - /@img/sharp-darwin-x64@0.33.1: - resolution: {integrity: sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.0 - dev: true - optional: true - - /@img/sharp-libvips-darwin-arm64@1.0.0: - resolution: {integrity: sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==} - engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-libvips-darwin-x64@1.0.0: - resolution: {integrity: sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==} - engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-libvips-linux-arm64@1.0.0: - resolution: {integrity: sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-libvips-linux-arm@1.0.0: - resolution: {integrity: sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-libvips-linux-s390x@1.0.0: - resolution: {integrity: sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-libvips-linux-x64@1.0.0: - resolution: {integrity: sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-libvips-linuxmusl-arm64@1.0.0: - resolution: {integrity: sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-libvips-linuxmusl-x64@1.0.0: - resolution: {integrity: sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-linux-arm64@0.33.1: - resolution: {integrity: sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.0 - dev: true - optional: true - - /@img/sharp-linux-arm@0.33.1: - resolution: {integrity: sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.0 - dev: true - optional: true - - /@img/sharp-linux-s390x@0.33.1: - resolution: {integrity: sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [s390x] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.0 - dev: true - optional: true - - /@img/sharp-linux-x64@0.33.1: - resolution: {integrity: sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.0 - dev: true - optional: true - - /@img/sharp-linuxmusl-arm64@0.33.1: - resolution: {integrity: sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.0 - dev: true - optional: true - - /@img/sharp-linuxmusl-x64@0.33.1: - resolution: {integrity: sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.0 - dev: true - optional: true - - /@img/sharp-wasm32@0.33.1: - resolution: {integrity: sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [wasm32] - requiresBuild: true - dependencies: - '@emnapi/runtime': 0.44.0 - dev: true - optional: true - - /@img/sharp-win32-ia32@0.33.1: - resolution: {integrity: sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@img/sharp-win32-x64@0.33.1: - resolution: {integrity: sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} @@ -1853,104 +1663,104 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 - /@rollup/rollup-android-arm-eabi@4.9.2: - resolution: {integrity: sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==} + /@rollup/rollup-android-arm-eabi@4.9.6: + resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.9.2: - resolution: {integrity: sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==} + /@rollup/rollup-android-arm64@4.9.6: + resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.9.2: - resolution: {integrity: sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==} + /@rollup/rollup-darwin-arm64@4.9.6: + resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.9.2: - resolution: {integrity: sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==} + /@rollup/rollup-darwin-x64@4.9.6: + resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.2: - resolution: {integrity: sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.9.6: + resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.2: - resolution: {integrity: sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==} + /@rollup/rollup-linux-arm64-gnu@4.9.6: + resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.9.2: - resolution: {integrity: sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==} + /@rollup/rollup-linux-arm64-musl@4.9.6: + resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.2: - resolution: {integrity: sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==} + /@rollup/rollup-linux-riscv64-gnu@4.9.6: + resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.9.2: - resolution: {integrity: sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==} + /@rollup/rollup-linux-x64-gnu@4.9.6: + resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.9.2: - resolution: {integrity: sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==} + /@rollup/rollup-linux-x64-musl@4.9.6: + resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.2: - resolution: {integrity: sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==} + /@rollup/rollup-win32-arm64-msvc@4.9.6: + resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.2: - resolution: {integrity: sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==} + /@rollup/rollup-win32-ia32-msvc@4.9.6: + resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.9.2: - resolution: {integrity: sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==} + /@rollup/rollup-win32-x64-msvc@4.9.6: + resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==} cpu: [x64] os: [win32] requiresBuild: true @@ -2007,7 +1817,7 @@ packages: /@ts-morph/common@0.16.0: resolution: {integrity: sha512-SgJpzkTgZKLKqQniCjLaE3c2L2sdL7UShvmTmPBejAKd2OKV/yfMpQ2IWpAuA+VY5wy7PkSUaEObIqEK6afFuw==} dependencies: - fast-glob: 3.3.2 + fast-glob: 3.3.1 minimatch: 5.1.0 mkdirp: 1.0.4 path-browserify: 1.0.1 @@ -2016,8 +1826,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.1 @@ -2026,20 +1836,20 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 dev: true /@types/babel__traverse@7.18.1: resolution: {integrity: sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@types/chai@4.3.5: @@ -2056,6 +1866,10 @@ packages: resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} dev: true + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: @@ -2323,35 +2137,31 @@ packages: optional: true dev: true - /@volar/kit@1.11.1(typescript@5.2.2): - resolution: {integrity: sha512-nqO+Hl9f1ygOK/3M7Hpnw0lhKvuMFhh823nilStpkTmm5WfrUnE+4WaQkb3dC6LM3TZq74j2m88yxRC+Z3sZZw==} + /@volar/kit@2.0.2(typescript@5.2.2): + resolution: {integrity: sha512-RgufgQCgsRBrbDmTKhnpsNixFdHAfCnLzKF8Kj4n5HDfWqSGj7WrhnS+qNTbHN7IjbSiSYcSeaO+ZZmXCTT24Q==} peerDependencies: typescript: '*' dependencies: - '@volar/language-service': 1.11.1 + '@volar/language-service': 2.0.2 + '@volar/typescript': 2.0.2 typesafe-path: 0.2.2 typescript: 5.2.2 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /@volar/language-core@1.10.9: - resolution: {integrity: sha512-QXHMX7CeXLqXwvC7nbr6iZ3zrqgKdJ9f6g1B211eZBnvaBki2ds0+Kz8cprUiulVuMQEPJNhDfuh8Vym1gxHRQ==} - dependencies: - '@volar/source-map': 1.10.9 - dev: false - - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + /@volar/language-core@2.0.2: + resolution: {integrity: sha512-sFtXrTDu59wNrUodrOzf62XpVpLAj47vT9P5dbcLxv3YfmbbW8Ssk9aLdqTksKDMhIe+hJVKrQm4UqBJ8iXaig==} dependencies: - '@volar/source-map': 1.11.1 + '@volar/source-map': 2.0.2 - /@volar/language-server@1.11.1: - resolution: {integrity: sha512-XYG4HcML2qimQV9UouQ7c1GuuqQw1NXoNDxAOAcfyYlz43P+HgzGQx4QEou+QMGHJeYIN86foDvkTN3fcopw9A==} + /@volar/language-server@2.0.2: + resolution: {integrity: sha512-NbM0v92ppABbZVKSNNPqt2vdBjLQ9O4Oi+iWu4xpCdMZw5GfrTfmhF5nfQQeJ+42XJmlV2pybUOJajLh320D1Q==} dependencies: - '@volar/language-core': 1.11.1 - '@volar/language-service': 1.11.1 - '@volar/typescript': 1.11.1 + '@volar/language-core': 2.0.2 + '@volar/language-service': 2.0.2 + '@volar/snapshot-document': 2.0.2 + '@volar/typescript': 2.0.2 '@vscode/l10n': 0.0.16 path-browserify: 1.0.1 request-light: 0.7.0 @@ -2360,43 +2170,44 @@ packages: vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - /@volar/language-service@1.11.1: - resolution: {integrity: sha512-dKo8z1UzQRPHnlXxwfONGrasS1wEWXMoLQiohZ8KgWqZALbekZCwdGImLZD4DeFGNjk3HTTdfeCzo3KjwohjEQ==} + /@volar/language-service@2.0.2: + resolution: {integrity: sha512-Ytc3UHWweAxYQSSwmJSl0rNpTVCSzHEu3RJzAkbf/LkSGGJgZ4cxkzuQM0AU1IKsHJl3XCoW0zvArWvtr30JJw==} dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 + '@volar/language-core': 2.0.2 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - /@volar/source-map@1.10.9: - resolution: {integrity: sha512-ul8yGO9nCxy6UedVuo0VsfKMLZzr39N1rgbtnYTGP5C554EDcUix6K/HDurhVdPHEDIw1yhXltLZZQKi3NrTvA==} + /@volar/snapshot-document@2.0.2: + resolution: {integrity: sha512-Wxk64/wWUgYZczCwa9miUeZtKb0V3ZjtrrInmGzY75rXVu0MHxVii5FKYleBWFnpGlu35uqWOB8e+rIH4O96Yw==} dependencies: - muggle-string: 0.3.1 - dev: false + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + /@volar/source-map@2.0.2: + resolution: {integrity: sha512-jzEQwaAXIq7YJUCU6kvJ0aCfesu/cXT0YrSLxdGa+zxeMa8Q0DtWJE4RlIrvaEtowf9MpcNV7wBXKu4i3R9oTw==} dependencies: - muggle-string: 0.3.1 + muggle-string: 0.4.0 - /@volar/typescript@1.10.9: - resolution: {integrity: sha512-5jLB46mCQLJqLII/qDLgfyHSq1cesjwuJQIa2GNWd7LPLSpX5vzo3jfQLWc/gyo3up2fQFrlRJK2kgY5REtwuQ==} + /@volar/test-utils@2.0.2: + resolution: {integrity: sha512-KscNqKeFSv0DYTNIzUivYXm0w/kR9s0eMoVXsRgGHo/l69AMj/+zy18pWPf8+d78d+bTR6Nvn6EoirGNA6MaSA==} dependencies: - '@volar/language-core': 1.10.9 - path-browserify: 1.0.1 - dev: false + '@volar/language-core': 2.0.2 + '@volar/language-server': 2.0.2 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: true - /@volar/typescript@1.11.1: - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + /@volar/typescript@2.0.2: + resolution: {integrity: sha512-lcCrYdg1ZgKZVm0mnk7pOxBGrojZk/YaeFJdxLH0gd/Kd13Go7uNvfotlYSGQshwHKcbJ0zaqY0et9w9oW1yyA==} dependencies: - '@volar/language-core': 1.11.1 + '@volar/language-core': 2.0.2 path-browserify: 1.0.1 - /@volar/vscode@1.11.1: - resolution: {integrity: sha512-5NC6wuy6uZtEwrIYREOVIIkmdBkTuZAS2GaDGhfz2JlL2bD48zdQloeQiiSDNEKLRjoghO2yLXKgepIBsWyfcA==} + /@volar/vscode@2.0.2: + resolution: {integrity: sha512-rZYBkbKH55v7qNK59pcRtLrQDgF1W4xhvyx2czgd8C94UK8QTG+piItx2drZSTHBpkQXAZZ54ZlG8g7GnF75PQ==} dependencies: - '@volar/language-server': 1.11.1 + '@volar/language-server': 2.0.2 path-browserify: 1.0.1 vscode-languageclient: 9.0.1 vscode-nls: 5.2.0 @@ -2470,7 +2281,7 @@ packages: optional: true dependencies: '@babel/helper-module-imports': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.9) '@babel/template': 7.22.15 '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 @@ -2688,21 +2499,21 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true - /astro@4.1.0(@types/node@18.17.8)(typescript@5.2.2): - resolution: {integrity: sha512-xbLWqvMn2JFyv7FpzHiXFn17bRS0P/b4cdEPXMMZOpBI9V8ZC33o6Xs+c59/pYSZpYiNd1HTg778XT5MhcpyKw==} + /astro@4.3.2(@types/node@18.17.8)(typescript@5.2.2): + resolution: {integrity: sha512-SJotHzKG/I32ruYWItMRJjtmNQh14mVS7kahu3XfYyxvo6nx08PGJBTSPbqPrW1sjeQPHwcpVDFx3yMMK2kaxQ==} engines: {node: '>=18.14.1', npm: '>=6.14.0'} hasBin: true dependencies: - '@astrojs/compiler': 2.4.0 + '@astrojs/compiler': 2.5.2 '@astrojs/internal-helpers': 0.2.1 - '@astrojs/markdown-remark': 4.0.1 + '@astrojs/markdown-remark': 4.2.1 '@astrojs/telemetry': 3.0.4 - '@babel/core': 7.23.7 + '@babel/core': 7.23.9 '@babel/generator': 7.23.6 - '@babel/parser': 7.23.6 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.7) - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.9) + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 '@types/babel__core': 7.20.5 acorn: 8.11.3 aria-query: 5.3.0 @@ -2713,6 +2524,7 @@ packages: clsx: 2.0.0 common-ancestor-path: 1.0.1 cookie: 0.6.0 + cssesc: 3.0.0 debug: 4.3.4(supports-color@8.1.1) deterministic-object-hash: 2.0.2 devalue: 4.3.2 @@ -2720,7 +2532,7 @@ packages: dlv: 1.1.3 dset: 3.1.3 es-module-lexer: 1.4.1 - esbuild: 0.19.11 + esbuild: 0.19.12 estree-walker: 3.0.3 execa: 8.0.1 fast-glob: 3.3.2 @@ -2745,19 +2557,19 @@ packages: resolve: 1.22.8 semver: 7.5.4 server-destroy: 1.0.1 - shikiji: 0.6.13 - string-width: 7.0.0 + shikiji: 0.9.19 + string-width: 7.1.0 strip-ansi: 7.1.0 tsconfck: 3.0.1(typescript@5.2.2) unist-util-visit: 5.0.0 vfile: 6.0.1 - vite: 5.0.10(@types/node@18.17.8) - vitefu: 0.2.5(vite@5.0.10) + vite: 5.0.12(@types/node@18.17.8) + vitefu: 0.2.5(vite@5.0.12) which-pm: 2.1.1 yargs-parser: 21.1.1 zod: 3.22.4 optionalDependencies: - sharp: 0.33.1 + sharp: 0.32.6 transitivePeerDependencies: - '@types/node' - less @@ -2783,6 +2595,12 @@ packages: typed-rest-client: 1.8.9 dev: true + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + requiresBuild: true + dev: true + optional: true + /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: true @@ -2886,15 +2704,15 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + /browserslist@4.22.3: + resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001574 - electron-to-chromium: 1.4.622 + caniuse-lite: 1.0.30001583 + electron-to-chromium: 1.4.656 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) + update-browserslist-db: 1.0.13(browserslist@4.22.3) dev: true /buffer-crc32@0.2.13: @@ -2961,8 +2779,8 @@ packages: resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} dev: true - /caniuse-lite@1.0.30001574: - resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} + /caniuse-lite@1.0.30001583: + resolution: {integrity: sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==} dev: true /ccount@2.0.1: @@ -3155,6 +2973,7 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + requiresBuild: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} @@ -3246,6 +3065,12 @@ packages: engines: {node: '>= 6'} dev: true + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + /csv-generate@3.4.3: resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} dev: true @@ -3494,8 +3319,8 @@ packages: resolution: {integrity: sha512-qMPzA5TEuOAbLFmbpNvO4qkBRe2B5dAxl6H4KxqRNy9cvBeHT2EyzecX0bumBfRhHN8cQJrx6NPd0AAoCCPKQw==} dev: true - /electron-to-chromium@1.4.622: - resolution: {integrity: sha512-GZ47DEy0Gm2Z8RVG092CkFvX7SdotG57c4YZOe8W8qD4rOmk3plgeNmiLVRHP/Liqj1wRiY3uUUod9vb9hnxZA==} + /electron-to-chromium@1.4.656: + resolution: {integrity: sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==} dev: true /emmet@2.4.4: @@ -3505,6 +3330,10 @@ packages: '@emmetio/css-abbreviation': 2.1.8 dev: false + /emoji-regex@10.2.1: + resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} + dev: true + /emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} dev: true @@ -3636,35 +3465,35 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: true - /esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.19.11 - '@esbuild/android-arm': 0.19.11 - '@esbuild/android-arm64': 0.19.11 - '@esbuild/android-x64': 0.19.11 - '@esbuild/darwin-arm64': 0.19.11 - '@esbuild/darwin-x64': 0.19.11 - '@esbuild/freebsd-arm64': 0.19.11 - '@esbuild/freebsd-x64': 0.19.11 - '@esbuild/linux-arm': 0.19.11 - '@esbuild/linux-arm64': 0.19.11 - '@esbuild/linux-ia32': 0.19.11 - '@esbuild/linux-loong64': 0.19.11 - '@esbuild/linux-mips64el': 0.19.11 - '@esbuild/linux-ppc64': 0.19.11 - '@esbuild/linux-riscv64': 0.19.11 - '@esbuild/linux-s390x': 0.19.11 - '@esbuild/linux-x64': 0.19.11 - '@esbuild/netbsd-x64': 0.19.11 - '@esbuild/openbsd-x64': 0.19.11 - '@esbuild/sunos-x64': 0.19.11 - '@esbuild/win32-arm64': 0.19.11 - '@esbuild/win32-ia32': 0.19.11 - '@esbuild/win32-x64': 0.19.11 + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 dev: true /escalade@3.1.1: @@ -3893,6 +3722,12 @@ packages: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + requiresBuild: true + dev: true + optional: true + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -3913,7 +3748,6 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: false /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} @@ -4190,7 +4024,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.1 ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 @@ -5057,8 +4891,8 @@ packages: - supports-color dev: true - /mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} dependencies: '@types/mdast': 4.0.1 unist-util-is: 6.0.0 @@ -5083,7 +4917,7 @@ packages: '@types/mdast': 4.0.1 '@types/unist': 3.0.0 longest-streak: 3.0.1 - mdast-util-phrasing: 4.0.0 + mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 @@ -5505,8 +5339,8 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + /muggle-string@0.4.0: + resolution: {integrity: sha512-ymN6exGtXrNnDb0ae4VP34y5bSKmBm6+TMGHmKoFDE5saXxtszv1EHs4Tt3glo61rCA/Zum4AwM19pCOGAjjRQ==} /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -5588,6 +5422,12 @@ packages: dev: true optional: true + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + requiresBuild: true + dev: true + optional: true + /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true @@ -6041,6 +5881,12 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + requiresBuild: true + dev: true + optional: true + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -6205,8 +6051,8 @@ packages: - supports-color dev: true - /remark-rehype@11.0.0: - resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} dependencies: '@types/hast': 3.0.1 '@types/mdast': 4.0.1 @@ -6329,24 +6175,26 @@ packages: glob: 7.2.3 dev: true - /rollup@4.9.2: - resolution: {integrity: sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==} + /rollup@4.9.6: + resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + dependencies: + '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.2 - '@rollup/rollup-android-arm64': 4.9.2 - '@rollup/rollup-darwin-arm64': 4.9.2 - '@rollup/rollup-darwin-x64': 4.9.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.2 - '@rollup/rollup-linux-arm64-gnu': 4.9.2 - '@rollup/rollup-linux-arm64-musl': 4.9.2 - '@rollup/rollup-linux-riscv64-gnu': 4.9.2 - '@rollup/rollup-linux-x64-gnu': 4.9.2 - '@rollup/rollup-linux-x64-musl': 4.9.2 - '@rollup/rollup-win32-arm64-msvc': 4.9.2 - '@rollup/rollup-win32-ia32-msvc': 4.9.2 - '@rollup/rollup-win32-x64-msvc': 4.9.2 + '@rollup/rollup-android-arm-eabi': 4.9.6 + '@rollup/rollup-android-arm64': 4.9.6 + '@rollup/rollup-darwin-arm64': 4.9.6 + '@rollup/rollup-darwin-x64': 4.9.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.6 + '@rollup/rollup-linux-arm64-gnu': 4.9.6 + '@rollup/rollup-linux-arm64-musl': 4.9.6 + '@rollup/rollup-linux-riscv64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-gnu': 4.9.6 + '@rollup/rollup-linux-x64-musl': 4.9.6 + '@rollup/rollup-win32-arm64-msvc': 4.9.6 + '@rollup/rollup-win32-ia32-msvc': 4.9.6 + '@rollup/rollup-win32-x64-msvc': 4.9.6 fsevents: 2.3.3 dev: true @@ -6424,34 +6272,19 @@ packages: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: true - /sharp@0.33.1: - resolution: {integrity: sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==} - engines: {libvips: '>=8.15.0', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + /sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} requiresBuild: true dependencies: color: 4.2.3 detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 semver: 7.5.4 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.1 - '@img/sharp-darwin-x64': 0.33.1 - '@img/sharp-libvips-darwin-arm64': 1.0.0 - '@img/sharp-libvips-darwin-x64': 1.0.0 - '@img/sharp-libvips-linux-arm': 1.0.0 - '@img/sharp-libvips-linux-arm64': 1.0.0 - '@img/sharp-libvips-linux-s390x': 1.0.0 - '@img/sharp-libvips-linux-x64': 1.0.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.0 - '@img/sharp-libvips-linuxmusl-x64': 1.0.0 - '@img/sharp-linux-arm': 0.33.1 - '@img/sharp-linux-arm64': 0.33.1 - '@img/sharp-linux-s390x': 0.33.1 - '@img/sharp-linux-x64': 0.33.1 - '@img/sharp-linuxmusl-arm64': 0.33.1 - '@img/sharp-linuxmusl-x64': 0.33.1 - '@img/sharp-wasm32': 0.33.1 - '@img/sharp-win32-ia32': 0.33.1 - '@img/sharp-win32-x64': 0.33.1 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 dev: true optional: true @@ -6479,10 +6312,14 @@ packages: engines: {node: '>=8'} dev: true - /shikiji@0.6.13: - resolution: {integrity: sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==} + /shikiji-core@0.9.19: + resolution: {integrity: sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==} + dev: true + + /shikiji@0.9.19: + resolution: {integrity: sha512-Kw2NHWktdcdypCj1GkKpXH4o6Vxz8B8TykPlPuLHOGSV8VkhoCLcFOH4k19K4LXAQYRQmxg+0X/eM+m2sLhAkg==} dependencies: - hast-util-to-html: 9.0.0 + shikiji-core: 0.9.19 dev: true /side-channel@1.0.4: @@ -6627,6 +6464,15 @@ packages: mixme: 0.5.4 dev: true + /streamx@2.15.1: + resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} + requiresBuild: true + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: true + optional: true + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -6649,12 +6495,12 @@ packages: engines: {node: '>=16'} dependencies: eastasianwidth: 0.2.0 - emoji-regex: 10.3.0 + emoji-regex: 10.2.1 strip-ansi: 7.1.0 dev: true - /string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} dependencies: emoji-regex: 10.3.0 @@ -6686,6 +6532,7 @@ packages: /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + requiresBuild: true dependencies: safe-buffer: 5.2.1 dev: true @@ -6813,6 +6660,16 @@ packages: dev: true optional: true + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + requiresBuild: true + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: true + optional: true + /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -6826,6 +6683,16 @@ packages: dev: true optional: true + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + requiresBuild: true + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.1 + dev: true + optional: true + /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -7068,8 +6935,8 @@ packages: resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} dev: false - /typescript-auto-import-cache@0.3.0: - resolution: {integrity: sha512-Rq6/q4O9iyqUdjvOoyas7x/Qf9nWUMeqpP3YeTaLA+uECgfy5wOhfOS+SW/+fZ/uI/ZcKaf+2/ZhFzXh8xfofQ==} + /typescript-auto-import-cache@0.3.2: + resolution: {integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==} dependencies: semver: 7.5.4 dev: false @@ -7213,13 +7080,13 @@ packages: picocolors: 1.0.0 dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.2): + /update-browserslist-db@1.0.13(browserslist@4.22.3): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.2 + browserslist: 4.22.3 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -7283,8 +7150,8 @@ packages: vfile-message: 4.0.2 dev: true - /vite@5.0.10(@types/node@18.17.8): - resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} + /vite@5.0.12(@types/node@18.17.8): + resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -7312,9 +7179,9 @@ packages: optional: true dependencies: '@types/node': 18.17.8 - esbuild: 0.19.11 + esbuild: 0.19.12 postcss: 8.4.33 - rollup: 4.9.2 + rollup: 4.9.6 optionalDependencies: fsevents: 2.3.3 dev: true @@ -7328,7 +7195,7 @@ packages: optional: true dev: true - /vitefu@0.2.5(vite@5.0.10): + /vitefu@0.2.5(vite@5.0.12): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -7336,52 +7203,52 @@ packages: vite: optional: true dependencies: - vite: 5.0.10(@types/node@18.17.8) + vite: 5.0.12(@types/node@18.17.8) dev: true - /volar-service-css@0.0.17(@volar/language-service@1.11.1): - resolution: {integrity: sha512-bEDJykygMzn2+a9ud6KwZZLli9eqarxApAXZuf2CqJJh6Trw1elmbBCo9SlPfqMrIhpFnwV0Sa+Xoc9x5WPeGw==} + /volar-service-css@0.0.28(@volar/language-service@2.0.2): + resolution: {integrity: sha512-qgTe7em0HdutJHfAiG4V2xsFYfS+MRC8hGUvPM5ciD39r8IqD1MjxBDWP++9C6q1GK5z2eIedeQZqzlM7b1afQ==} peerDependencies: - '@volar/language-service': ~1.11.0 + '@volar/language-service': ~2.0.1 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.11.1 + '@volar/language-service': 2.0.2 vscode-css-languageservice: 6.2.10 vscode-uri: 3.0.8 dev: false - /volar-service-emmet@0.0.17(@volar/language-service@1.11.1): - resolution: {integrity: sha512-C6hVnuQL52MqaydkrblYUbzIo5ZmIGo1hR8wmpcCjs5uNcjqn8aPqZRfznhLiUSaPHpFC+zQxJwFcZI9/u2iKQ==} + /volar-service-emmet@0.0.28(@volar/language-service@2.0.2): + resolution: {integrity: sha512-CKbroAvQyYVZ4WqCRw7KIytEwx/Kz1Ccb9nWRQZ9kAisNcU3hjYycDacMSILmSfUfgPhr2tbtNLJ9LAQReQJqw==} peerDependencies: - '@volar/language-service': ~1.11.0 + '@volar/language-service': ~2.0.1 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.11.1 + '@volar/language-service': 2.0.2 '@vscode/emmet-helper': 2.9.2 - volar-service-html: 0.0.17(@volar/language-service@1.11.1) + volar-service-html: 0.0.28(@volar/language-service@2.0.2) dev: false - /volar-service-html@0.0.17(@volar/language-service@1.11.1): - resolution: {integrity: sha512-OGkP+ZTo13j/+enafGe+esXvda/W4eU78YNLbbHxtV3rnX4odVrewenLJmXiECg6wdQz/PG8rLijZqQnDUYkfw==} + /volar-service-html@0.0.28(@volar/language-service@2.0.2): + resolution: {integrity: sha512-yIeffFkQESLZ8weP6izRM59oQxnREn3Ep8tesltzMPEbazjRrnJCVF1ZeU0qRJi/HEQNbYqxxc3jJ5J0rR7xcg==} peerDependencies: - '@volar/language-service': ~1.11.0 + '@volar/language-service': ~2.0.1 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.11.1 - vscode-html-languageservice: 5.1.0 + '@volar/language-service': 2.0.2 + vscode-html-languageservice: 5.1.1 vscode-uri: 3.0.8 dev: false - /volar-service-prettier@0.0.17(@volar/language-service@1.11.1)(prettier@3.0.0): - resolution: {integrity: sha512-YYnzZ+OT0M3Bx+xKuoAfs/uVuxk7ofz4dkZDQqjwa9iC63Ay4YGqONtmHd+xsO3lufkEBXlAQCbofDeZbSz3YQ==} + /volar-service-prettier@0.0.28(@volar/language-service@2.0.2)(prettier@3.0.0): + resolution: {integrity: sha512-wfHTMhZKxv2JqgJW7kljEb1nd/tZVjiWcygeBQnIGNp+qJ8nGWE9Fi9DOgLzJ7qlzKrnvIZN3nT0lW+NP71rYA==} peerDependencies: - '@volar/language-service': ~1.11.0 + '@volar/language-service': ~2.0.1 prettier: ^2.2 || ^3.0 peerDependenciesMeta: '@volar/language-service': @@ -7389,35 +7256,36 @@ packages: prettier: optional: true dependencies: - '@volar/language-service': 1.11.1 + '@volar/language-service': 2.0.2 prettier: 3.0.0 + vscode-uri: 3.0.8 dev: false - /volar-service-typescript-twoslash-queries@0.0.17(@volar/language-service@1.11.1): - resolution: {integrity: sha512-6FHXK5AWeFzCL6uGmEcbkZmQsaQ0m9IjbeLdgOIQ4KGvauqT2aA1BhdfDJu6vRAFIfXe7xjEJ85keIlHl72tSA==} + /volar-service-typescript-twoslash-queries@0.0.28(@volar/language-service@2.0.2): + resolution: {integrity: sha512-vJD0ezCzYHFYoUZ6kqMYRVuRShMxlKMDjxdT7vcCc+O+VLqOHR7BD4nqd20CxdUtfTPQHHDLnqTF3trkJ0LAvA==} peerDependencies: - '@volar/language-service': ~1.11.0 + '@volar/language-service': ~2.0.1 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.11.1 + '@volar/language-service': 2.0.2 dev: false - /volar-service-typescript@0.0.17(@volar/language-service@1.11.1)(@volar/typescript@1.11.1): - resolution: {integrity: sha512-Krs8pOIo2yoBVoJ91hKT1czhWt9ek7EbuK3MxxgvDYdd4HYHOtHi1eOlb7bFnZMNgFcwsL48yQI9vbPm160s9A==} + /volar-service-typescript@0.0.28(@volar/language-service@2.0.2)(@volar/typescript@2.0.2): + resolution: {integrity: sha512-9Z0URkvTCKL6cXBeQ/wsBRSeI/ng9l/cRjQF2WSblldo54ndx2nf8D9XrniTqYJp6xqJDg55gnu6g5Vy1hIB+Q==} peerDependencies: - '@volar/language-service': ~1.11.0 - '@volar/typescript': ~1.11.0 + '@volar/language-service': ~2.0.1 + '@volar/typescript': ~2.0.1 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.11.1 - '@volar/typescript': 1.11.1 + '@volar/language-service': 2.0.2 + '@volar/typescript': 2.0.2 path-browserify: 1.0.1 semver: 7.5.4 - typescript-auto-import-cache: 0.3.0 + typescript-auto-import-cache: 0.3.2 vscode-languageserver-textdocument: 1.0.11 vscode-nls: 5.2.0 vscode-uri: 3.0.8 @@ -7432,12 +7300,12 @@ packages: vscode-uri: 3.0.8 dev: false - /vscode-html-languageservice@5.1.0: - resolution: {integrity: sha512-cGOu5+lrz+2dDXSGS15y24lDtPaML1T8K/SfqgFbLmCZ1btYOxceFieR+ybTS2es/A67kRc62m2cKFLUQPWG5g==} + /vscode-html-languageservice@5.1.1: + resolution: {integrity: sha512-JenrspIIG/Q+93R6G3L6HdK96itSisMynE0glURqHpQbL3dKAKzdm8L40lAHNkwJeBg+BBPpAshZKv/38onrTQ==} dependencies: '@vscode/l10n': 0.0.16 vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.3 + vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 dev: false @@ -7463,10 +7331,6 @@ packages: /vscode-languageserver-textdocument@1.0.11: resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - /vscode-languageserver-types@3.17.3: - resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} - dev: false - /vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}