From cd68e562102e04263602ca07a45e2cbfa4015003 Mon Sep 17 00:00:00 2001 From: jycouet Date: Wed, 25 Jun 2025 09:00:23 +0200 Subject: [PATCH 1/4] types to kind --- .../src/sveltekit/generateFiles/index.ts | 22 +++---- .../generateFiles/templates/error.ts | 20 +++---- .../generateFiles/templates/layout-load.ts | 22 +++---- .../generateFiles/templates/layout-server.ts | 21 ++++--- .../generateFiles/templates/layout.ts | 47 +++++++++++---- .../generateFiles/templates/page-load.ts | 21 ++++--- .../generateFiles/templates/page-server.ts | 21 ++++--- .../sveltekit/generateFiles/templates/page.ts | 59 +++++++++++++------ .../generateFiles/templates/server.ts | 20 +++---- .../src/sveltekit/generateFiles/types.ts | 23 ++------ packages/svelte-vscode/src/sveltekit/utils.ts | 53 +++++++++-------- 11 files changed, 184 insertions(+), 145 deletions(-) diff --git a/packages/svelte-vscode/src/sveltekit/generateFiles/index.ts b/packages/svelte-vscode/src/sveltekit/generateFiles/index.ts index 10184a85b..6e0a3b23c 100644 --- a/packages/svelte-vscode/src/sveltekit/generateFiles/index.ts +++ b/packages/svelte-vscode/src/sveltekit/generateFiles/index.ts @@ -3,8 +3,8 @@ import { commands, ExtensionContext, ProgressLocation, Uri, window, workspace } import { addResourceCommandMap } from './commands'; import { generateResources } from './generate'; import { resourcesMap } from './resources'; -import { FileType, ResourceType, GenerateConfig, CommandType, ProjectType } from './types'; -import { checkProjectType } from '../utils'; +import { FileType, ResourceType, GenerateConfig, CommandType } from './types'; +import { checkProjectKind } from '../utils'; class GenerateError extends Error {} @@ -38,7 +38,7 @@ async function handleSingle(uri: Uri | undefined, resourceType: ResourceType) { } const resources = [resource]; - const { type, rootPath, scriptExtension } = await getCommonConfig(uri); + const { kind, rootPath, scriptExtension } = await getCommonConfig(uri); const itemPath = await promptResourcePath(); @@ -48,7 +48,7 @@ async function handleSingle(uri: Uri | undefined, resourceType: ResourceType) { await generate({ path: path.join(rootPath, itemPath), - type, + kind, pageExtension: 'svelte', scriptExtension, resources @@ -56,7 +56,7 @@ async function handleSingle(uri: Uri | undefined, resourceType: ResourceType) { } async function handleMultiple(uri: Uri | undefined) { - const { type, rootPath, scriptExtension } = await getCommonConfig(uri); + const { kind, rootPath, scriptExtension } = await getCommonConfig(uri); const itemPath = await promptResourcePath(); if (!itemPath) { @@ -92,7 +92,7 @@ async function handleMultiple(uri: Uri | undefined) { await generate({ path: path.join(rootPath, itemPath), - type, + kind, pageExtension: 'svelte', scriptExtension, resources: result.map((res) => res.value) @@ -125,17 +125,17 @@ async function getCommonConfig(uri: Uri | undefined) { ); } - const type = await checkProjectType(rootPath); - const scriptExtension = getScriptExtension(type); + const kind = await checkProjectKind(rootPath); + const scriptExtension = getScriptExtension(kind); return { - type, + kind, scriptExtension, rootPath } as const; } -function getScriptExtension(type: ProjectType) { - return type === ProjectType.JS || type === ProjectType.JS_SV5 ? 'js' : 'ts'; +function getScriptExtension(kind: GenerateConfig['kind']) { + return kind.withTs ? 'ts' : 'js'; } function getRootPath(uri: Uri | undefined) { diff --git a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/error.ts b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/error.ts index 5727bd010..1a6407cc6 100644 --- a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/error.ts +++ b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/error.ts @@ -1,4 +1,4 @@ -import { GenerateConfig, ProjectType, Resource } from '../types'; +import { GenerateConfig, Resource } from '../types'; const defaultScriptTemplate = ` + +{@render children()} +`; + const tsScriptTemplate = ` + +{@render children()} +`; export default async function (config: GenerateConfig): ReturnType { - return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim(); + const { withRunes, withTs, withProps } = config.kind; + let template = defaultScriptTemplate; + + if (withRunes && withTs && withProps) { + template = tsSv5ScriptTemplateProps; + } else if (withRunes && withTs && !withProps) { + template = tsSv5ScriptTemplate; + } else if (withRunes && !withTs && withProps) { + template = jsSv5ScriptTemplateProps; + } else if (withRunes && !withTs && !withProps) { + template = jsSv5ScriptTemplate; + } else if (!withRunes && withTs) { + template = tsScriptTemplate; + } else if (!withRunes && !withTs) { + template = defaultScriptTemplate; + } + + return template.trim(); } diff --git a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page-load.ts b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page-load.ts index 95049f786..28615c4bf 100644 --- a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page-load.ts +++ b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page-load.ts @@ -1,4 +1,4 @@ -import { GenerateConfig, ProjectType, Resource } from '../types'; +import { GenerateConfig, Resource } from '../types'; const defaultScriptTemplate = ` /** @type {import('./$types').PageLoad} */ @@ -23,15 +23,14 @@ export const load = (async () => { }) satisfies PageLoad; `; -const scriptTemplate: ReadonlyMap = new Map([ - [ProjectType.TS_SV5, tsScriptTemplate], - [ProjectType.TS_SATISFIES_SV5, tsSatisfiesScriptTemplate], - [ProjectType.JS_SV5, defaultScriptTemplate], - [ProjectType.TS, tsScriptTemplate], - [ProjectType.TS_SATISFIES, tsSatisfiesScriptTemplate], - [ProjectType.JS, defaultScriptTemplate] -]); - export default async function (config: GenerateConfig): ReturnType { - return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim(); + const { withTs, withSatisfies } = config.kind; + let template = defaultScriptTemplate; + + if (withTs && withSatisfies) { + template = tsSatisfiesScriptTemplate; + } else if (withTs && !withSatisfies) { + template = tsScriptTemplate; + } + return template.trim(); } diff --git a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page-server.ts b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page-server.ts index 56394222c..cd55d8ccf 100644 --- a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page-server.ts +++ b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page-server.ts @@ -1,4 +1,4 @@ -import { GenerateConfig, ProjectType, Resource } from '../types'; +import { GenerateConfig, Resource } from '../types'; const defaultScriptTemplate = ` /** @type {import('./$types').PageServerLoad} */ @@ -23,15 +23,14 @@ export const load = (async () => { }) satisfies PageServerLoad; `; -const scriptTemplate: ReadonlyMap = new Map([ - [ProjectType.TS_SV5, tsScriptTemplate], - [ProjectType.TS_SATISFIES_SV5, tsSatisfiesScriptTemplate], - [ProjectType.JS_SV5, defaultScriptTemplate], - [ProjectType.TS, tsScriptTemplate], - [ProjectType.TS_SATISFIES, tsSatisfiesScriptTemplate], - [ProjectType.JS, defaultScriptTemplate] -]); - export default async function (config: GenerateConfig): ReturnType { - return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim(); + const { withTs, withSatisfies } = config.kind; + let template = defaultScriptTemplate; + + if (withTs && withSatisfies) { + template = tsSatisfiesScriptTemplate; + } else if (withTs && !withSatisfies) { + template = tsScriptTemplate; + } + return template.trim(); } diff --git a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page.ts b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page.ts index ecbbfa57f..55375a255 100644 --- a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page.ts +++ b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/page.ts @@ -1,4 +1,4 @@ -import { GenerateConfig, ProjectType, Resource } from '../types'; +import { GenerateConfig, Resource } from '../types'; const defaultScriptTemplate = ` `; -const tsSv5ScriptTemplate = ` - +`; - let { data }: { data: PageData } = $props(); +const jsSv5ScriptTemplateProps = ` + `; @@ -23,22 +29,39 @@ const tsScriptTemplate = ` `; -const jsSv5ScriptTemplate = ` - `; -const scriptTemplate: ReadonlyMap = new Map([ - [ProjectType.TS_SV5, tsSv5ScriptTemplate], - [ProjectType.TS_SATISFIES_SV5, tsSv5ScriptTemplate], - [ProjectType.JS_SV5, jsSv5ScriptTemplate], - [ProjectType.TS, tsScriptTemplate], - [ProjectType.TS_SATISFIES, tsScriptTemplate], - [ProjectType.JS, defaultScriptTemplate] -]); +const tsSv5ScriptTemplateProps = ` + +`; export default async function (config: GenerateConfig): ReturnType { - return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim(); + const { withProps, withRunes, withTs } = config.kind; + let template = defaultScriptTemplate; + + if (withRunes && withTs && withProps) { + template = tsSv5ScriptTemplateProps; + } else if (withRunes && withTs && !withProps) { + template = tsSv5ScriptTemplate; + } else if (withRunes && !withTs && withProps) { + template = jsSv5ScriptTemplateProps; + } else if (withRunes && !withTs && !withProps) { + template = jsSv5ScriptTemplate; + } else if (!withRunes && withTs) { + template = tsScriptTemplate; + } else if (!withRunes && !withTs) { + template = defaultScriptTemplate; + } + + return template.trim(); } diff --git a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/server.ts b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/server.ts index 6ea832b97..778ef43f9 100644 --- a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/server.ts +++ b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/server.ts @@ -1,4 +1,4 @@ -import { GenerateConfig, ProjectType, Resource } from '../types'; +import { GenerateConfig, Resource } from '../types'; const defaultScriptTemplate = ` /** @type {import('./$types').RequestHandler} */ @@ -15,15 +15,13 @@ export const GET: RequestHandler = async () => { }; `; -const scriptTemplate: ReadonlyMap = new Map([ - [ProjectType.TS_SV5, tsScriptTemplate], - [ProjectType.TS_SATISFIES_SV5, tsScriptTemplate], - [ProjectType.JS_SV5, defaultScriptTemplate], - [ProjectType.TS, tsScriptTemplate], - [ProjectType.TS_SATISFIES, tsScriptTemplate], - [ProjectType.JS, defaultScriptTemplate] -]); - export default async function (config: GenerateConfig): ReturnType { - return (scriptTemplate.get(config.type) ?? defaultScriptTemplate).trim(); + const { withTs } = config.kind; + let template = defaultScriptTemplate; + + if (withTs) { + template = tsScriptTemplate; + } + + return template.trim(); } diff --git a/packages/svelte-vscode/src/sveltekit/generateFiles/types.ts b/packages/svelte-vscode/src/sveltekit/generateFiles/types.ts index 4f6fc2ce3..978e4dc2c 100644 --- a/packages/svelte-vscode/src/sveltekit/generateFiles/types.ts +++ b/packages/svelte-vscode/src/sveltekit/generateFiles/types.ts @@ -32,25 +32,14 @@ export type Resource = { generate: (config: GenerateConfig) => Promise; }; -export enum ProjectType { - TS_SV5 = 'ts-sv5', - JS_SV5 = 'js-sv5', - TS_SATISFIES_SV5 = 'ts-satisfies-sv5', - TS = 'ts', - JS = 'js', - TS_SATISFIES = 'ts-satisfies' -} - -export type IsSvelte5Plus = boolean; - -export const IsSvelte5Plus: Record = { - yes: true, - no: false -}; - export interface GenerateConfig { path: string; - type: ProjectType; + kind: { + withTs: boolean; + withSatisfies: boolean; + withRunes: boolean; + withProps: boolean; + }; pageExtension: string; scriptExtension: string; resources: Resource[]; diff --git a/packages/svelte-vscode/src/sveltekit/utils.ts b/packages/svelte-vscode/src/sveltekit/utils.ts index 5a68d6733..2e9eebfa1 100644 --- a/packages/svelte-vscode/src/sveltekit/utils.ts +++ b/packages/svelte-vscode/src/sveltekit/utils.ts @@ -1,7 +1,7 @@ import { TextDecoder } from 'util'; import * as path from 'path'; import { Uri, workspace } from 'vscode'; -import { IsSvelte5Plus, ProjectType } from './generateFiles/types'; +import type { GenerateConfig } from './generateFiles/types'; export async function fileExists(file: string) { try { @@ -26,39 +26,45 @@ export async function findFile(searchPath: string, fileName: string) { } } -export async function checkProjectType(path: string): Promise { +export async function checkProjectKind(path: string): Promise { const tsconfig = await findFile(path, 'tsconfig.json'); const jsconfig = await findFile(path, 'jsconfig.json'); - const svelteVersion = await getSvelteVersionFromPackageJson(); - const isSv5Plus = isSvelte5Plus(svelteVersion); - const isTs = !!tsconfig && (!jsconfig || tsconfig.length >= jsconfig.length); - if (isTs) { + + const svelteVersion = await getVersionFromPackageJson('svelte'); + const withRunes = versionAtLeast(svelteVersion ?? '0.0', 5); + + const svelteKitVersion = await getVersionFromPackageJson('@sveltejs/kit'); + let withProps = versionAtLeast(svelteKitVersion ?? '0.0', 2, 16); + + const withTs = !!tsconfig && (!jsconfig || tsconfig.length >= jsconfig.length); + let withSatisfies = false; + if (withTs) { try { const packageJSONPath = require.resolve('typescript/package.json', { paths: [tsconfig] }); const { version } = require(packageJSONPath); - const [major, minor] = version.split('.'); - if ((Number(major) === 4 && Number(minor) >= 9) || Number(major) > 4) { - return isSv5Plus ? ProjectType.TS_SATISFIES_SV5 : ProjectType.TS_SATISFIES; - } else { - return isSv5Plus ? ProjectType.TS_SV5 : ProjectType.TS; - } - } catch (e) { - return isSv5Plus ? ProjectType.TS_SV5 : ProjectType.TS; - } - } else { - return isSv5Plus ? ProjectType.JS_SV5 : ProjectType.JS; + withSatisfies = versionAtLeast(version, 4, 9); + } catch (e) {} } -} -export function isSvelte5Plus(version: string | undefined): IsSvelte5Plus { - if (!version) return IsSvelte5Plus.no; + return { + withTs, + withSatisfies, + withRunes, + withProps + }; +} - return version.split('.')[0] >= '5'; +function versionAtLeast(version: string, major: number, minor?: number): boolean { + const [majorVersion, minorVersion] = version.split('.'); + return ( + (Number(majorVersion) === major && Number(minorVersion) >= (minor ?? 0)) || + Number(majorVersion) > major + ); } -export async function getSvelteVersionFromPackageJson(): Promise { +export async function getVersionFromPackageJson(packageName: string): Promise { const packageJsonList = await workspace.findFiles('**/package.json', '**/node_modules/**'); if (packageJsonList.length === 0) { @@ -69,7 +75,8 @@ export async function getSvelteVersionFromPackageJson(): Promise Date: Wed, 16 Jul 2025 00:22:22 +0200 Subject: [PATCH 2/4] init tests --- packages/svelte-vscode/package.json | 4 +- packages/svelte-vscode/src/sveltekit/utils.ts | 10 +- .../test/sveltekit/utils.spec.ts | 81 ++ pnpm-lock.yaml | 908 +++++++++++++++++- 4 files changed, 995 insertions(+), 8 deletions(-) create mode 100644 packages/svelte-vscode/test/sveltekit/utils.spec.ts diff --git a/packages/svelte-vscode/package.json b/packages/svelte-vscode/package.json index 6ad7151b1..0ed3de615 100644 --- a/packages/svelte-vscode/package.json +++ b/packages/svelte-vscode/package.json @@ -9,7 +9,8 @@ "build": "npm run build:ts && npm run build:grammar", "vscode:prepublish": "npm install && npm run build && npm prune --production", "watch": "npm run build:grammar && tsc -w -p ./", - "test": "npm run build:grammar && node test/grammar/test.js" + "test": "npm run build:grammar && node test/grammar/test.js", + "test:2": "vitest" }, "repository": { "type": "git", @@ -745,6 +746,7 @@ "js-yaml": "^3.14.0", "tslib": "^2.4.0", "typescript": "^5.8.2", + "vitest": "^3.2.4", "vscode-tmgrammar-test": "^0.0.11" }, "dependencies": { diff --git a/packages/svelte-vscode/src/sveltekit/utils.ts b/packages/svelte-vscode/src/sveltekit/utils.ts index 2e9eebfa1..6ca33f796 100644 --- a/packages/svelte-vscode/src/sveltekit/utils.ts +++ b/packages/svelte-vscode/src/sveltekit/utils.ts @@ -31,10 +31,10 @@ export async function checkProjectKind(path: string): Promise= jsconfig.length); let withSatisfies = false; @@ -44,8 +44,10 @@ export async function checkProjectKind(path: string): Promise ({ + Uri: { file: vi.fn((path) => ({ path })) }, + workspace: { + fs: { + stat: vi.fn().mockImplementation((uri) => { + const path = uri.path || uri.toString(); + + // Mock config file existence based on configuration + if (path.endsWith('tsconfig.json') && tsconfig) { + return Promise.resolve({ type: 1 }); // File exists + } + if (path.endsWith('jsconfig.json') && jsconfig) { + return Promise.resolve({ type: 1 }); // File exists + } + return Promise.reject(new Error('File not found')); + }), + readFile: vi + .fn() + .mockResolvedValue(new TextEncoder().encode(JSON.stringify(defaultPackageJson))) + }, + findFiles: vi.fn().mockReturnValue([{ path: '/fake/package.json' }]) + } + })); +} + +describe('checkProjectKind', () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.resetModules(); + }); + + const combinations: [string, MockConfig, keyof GenerateConfig['kind'], boolean][] = [ + // by default + ['default to js', {}, 'withTs', false], + ['default to runes', {}, 'withRunes', true], + ['default to not satisfies', {}, 'withSatisfies', false], + ['default to withProps', {}, 'withProps', true], + + ['js', { jsconfig: true }, 'withTs', false], + + ['ts', { tsconfig: true }, 'withTs', true], + ['ts', { tsconfig: true }, 'withSatisfies', true], + ['ts', { tsconfig: true, tsVersion: '3.0' }, 'withSatisfies', false] + + // ['ts with jsconfig', { has_ts_config: true, has_js_config: true }, 'withTs', true], + // ['ts with jsconfig', { has_ts_config: true, has_js_config: true }, 'withTs', true] + ]; + + for (const [name, config, ex, toBe] of combinations) { + it(name, async () => { + setupMocks(config); + + const utils = await import('../../src/sveltekit/utils'); + const result = await utils.checkProjectKind('/test/path'); + + expect(result[ex]).toBe(toBe); + }); + } +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e3f793a7..29ea244d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 2.0.2 fdir: specifier: ^6.2.0 - version: 6.2.0 + version: 6.2.0(picomatch@4.0.3) globrex: specifier: ^0.1.2 version: 0.1.2 @@ -123,7 +123,7 @@ importers: version: 4.0.1 fdir: specifier: ^6.2.0 - version: 6.2.0 + version: 6.2.0(picomatch@4.0.3) picocolors: specifier: ^1.0.0 version: 1.0.0 @@ -219,6 +219,9 @@ importers: typescript: specifier: ^5.8.2 version: 5.8.2 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@18.19.46) vscode-tmgrammar-test: specifier: ^0.0.11 version: 0.0.11 @@ -340,6 +343,162 @@ packages: '@emmetio/scanner@1.0.4': resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -434,6 +593,106 @@ packages: rollup: optional: true + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + cpu: [x64] + os: [win32] + '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} @@ -467,12 +726,21 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@0.0.42': resolution: {integrity: sha512-K1DPVvnBCPxzD+G51/cxVIoc2X8uUVl1zpJeE6iKcgHMj4+tbat5Xu4TjV7v2QSDbIeAfLi2hIk+u2+s0MlpUQ==} '@types/estree@1.0.1': resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/fs-extra@8.1.2': resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} @@ -522,6 +790,35 @@ packages: '@ungap/promise-all-settled@1.1.2': resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vscode/emmet-helper@2.8.4': resolution: {integrity: sha512-lUki5QLS47bz/U8IlG9VQ+1lfxMtxMZENmU5nu4Z71eOD5j9FK0SmYGL5NiVJg9WBWeAU0VxRADMY2Qpq7BfVg==} @@ -582,6 +879,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -613,10 +914,18 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -625,6 +934,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -693,6 +1006,15 @@ packages: supports-color: optional: true + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} @@ -700,6 +1022,10 @@ packages: dedent-js@1.0.1: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -734,6 +1060,14 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.25.6: + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -760,6 +1094,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -775,6 +1113,14 @@ packages: picomatch: optional: true + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -937,6 +1283,9 @@ packages: resolution: {integrity: sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==} engines: {node: ^10.14.2 || >=12.0.0} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -971,6 +1320,9 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -988,6 +1340,9 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -1033,6 +1388,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nise@5.1.4: resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} @@ -1083,6 +1443,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + perf-regexes@1.0.1: resolution: {integrity: sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==} engines: {node: '>=6.14'} @@ -1096,10 +1463,21 @@ packages: picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + prettier-plugin-svelte@3.4.0: resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} peerDependencies: @@ -1163,6 +1541,11 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1189,6 +1572,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + sinon@11.1.2: resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} @@ -1204,6 +1590,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -1218,6 +1608,12 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1230,6 +1626,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -1253,6 +1652,28 @@ packages: tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1302,6 +1723,79 @@ packages: vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.0.4: + resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vscode-css-languageservice@6.3.5: resolution: {integrity: sha512-ehEIMXYPYEz/5Svi2raL9OKLpBt5dSAdoCFoLpo0TVFKrVpDemyuQwS3c3D552z/qQCg3pMp8oOLMObY6M3ajQ==} @@ -1367,6 +1861,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + workerpool@6.2.0: resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} @@ -1425,6 +1924,84 @@ snapshots: '@emmetio/scanner@1.0.4': {} + '@esbuild/aix-ppc64@0.25.6': + optional: true + + '@esbuild/android-arm64@0.25.6': + optional: true + + '@esbuild/android-arm@0.25.6': + optional: true + + '@esbuild/android-x64@0.25.6': + optional: true + + '@esbuild/darwin-arm64@0.25.6': + optional: true + + '@esbuild/darwin-x64@0.25.6': + optional: true + + '@esbuild/freebsd-arm64@0.25.6': + optional: true + + '@esbuild/freebsd-x64@0.25.6': + optional: true + + '@esbuild/linux-arm64@0.25.6': + optional: true + + '@esbuild/linux-arm@0.25.6': + optional: true + + '@esbuild/linux-ia32@0.25.6': + optional: true + + '@esbuild/linux-loong64@0.25.6': + optional: true + + '@esbuild/linux-mips64el@0.25.6': + optional: true + + '@esbuild/linux-ppc64@0.25.6': + optional: true + + '@esbuild/linux-riscv64@0.25.6': + optional: true + + '@esbuild/linux-s390x@0.25.6': + optional: true + + '@esbuild/linux-x64@0.25.6': + optional: true + + '@esbuild/netbsd-arm64@0.25.6': + optional: true + + '@esbuild/netbsd-x64@0.25.6': + optional: true + + '@esbuild/openbsd-arm64@0.25.6': + optional: true + + '@esbuild/openbsd-x64@0.25.6': + optional: true + + '@esbuild/openharmony-arm64@0.25.6': + optional: true + + '@esbuild/sunos-x64@0.25.6': + optional: true + + '@esbuild/win32-arm64@0.25.6': + optional: true + + '@esbuild/win32-ia32@0.25.6': + optional: true + + '@esbuild/win32-x64@0.25.6': + optional: true + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -1513,6 +2090,66 @@ snapshots: optionalDependencies: rollup: 3.7.5 + '@rollup/rollup-android-arm-eabi@4.45.1': + optional: true + + '@rollup/rollup-android-arm64@4.45.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.45.1': + optional: true + + '@rollup/rollup-darwin-x64@4.45.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.45.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.45.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.45.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.45.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.45.1': + optional: true + '@sinonjs/commons@1.8.6': dependencies: type-detect: 4.0.8 @@ -1549,10 +2186,18 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + '@types/estree@0.0.42': {} '@types/estree@1.0.1': {} + '@types/estree@1.0.8': {} + '@types/fs-extra@8.1.2': dependencies: '@types/node': 18.19.46 @@ -1600,6 +2245,48 @@ snapshots: '@ungap/promise-all-settled@1.1.2': {} + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@7.0.4(@types/node@18.19.46))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 7.0.4(@types/node@18.19.46) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + '@vscode/emmet-helper@2.8.4': dependencies: emmet: 2.4.4 @@ -1653,6 +2340,8 @@ snapshots: array-union@2.1.0: {} + assertion-error@2.0.1: {} + axobject-query@4.1.0: {} balanced-match@1.0.2: {} @@ -1678,8 +2367,18 @@ snapshots: builtin-modules@3.3.0: {} + cac@6.7.14: {} + camelcase@6.3.0: {} + chai@5.2.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.4 + pathval: 2.0.1 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -1691,6 +2390,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + check-error@2.1.1: {} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 @@ -1766,10 +2467,16 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + debug@4.4.1: + dependencies: + ms: 2.1.3 + decamelize@4.0.0: {} dedent-js@1.0.1: {} + deep-eql@5.0.2: {} + deepmerge@4.3.1: {} del@5.1.0: @@ -1802,6 +2509,37 @@ snapshots: emoji-regex@8.0.0: {} + es-module-lexer@1.7.0: {} + + esbuild@0.25.6: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 + escalade@3.1.1: {} escape-string-regexp@1.0.5: {} @@ -1818,6 +2556,8 @@ snapshots: dependencies: '@types/estree': 1.0.1 + expect-type@1.2.2: {} + fast-glob@3.2.12: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1830,7 +2570,13 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.2.0: {} + fdir@6.2.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 fill-range@7.0.1: dependencies: @@ -1991,6 +2737,8 @@ snapshots: perf-regexes: 1.0.1 skip-regex: 1.0.2 + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -2023,6 +2771,8 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + loupe@3.1.4: {} + lower-case@2.0.2: dependencies: tslib: 2.5.2 @@ -2043,6 +2793,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + make-error@1.3.6: {} mdn-data@2.0.30: {} @@ -2101,6 +2855,8 @@ snapshots: nanoid@3.3.1: {} + nanoid@3.3.11: {} + nise@5.1.4: dependencies: '@sinonjs/commons': 2.0.0 @@ -2151,6 +2907,10 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + + pathval@2.0.1: {} + perf-regexes@1.0.1: {} periscopic@2.0.3: @@ -2166,8 +2926,18 @@ snapshots: picocolors@1.0.0: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} + picomatch@4.0.3: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prettier-plugin-svelte@3.4.0(prettier@3.3.3)(svelte@4.2.19): dependencies: prettier: 3.3.3 @@ -2227,6 +2997,32 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + rollup@4.45.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.45.1 + '@rollup/rollup-android-arm64': 4.45.1 + '@rollup/rollup-darwin-arm64': 4.45.1 + '@rollup/rollup-darwin-x64': 4.45.1 + '@rollup/rollup-freebsd-arm64': 4.45.1 + '@rollup/rollup-freebsd-x64': 4.45.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1 + '@rollup/rollup-linux-arm64-gnu': 4.45.1 + '@rollup/rollup-linux-arm64-musl': 4.45.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-musl': 4.45.1 + '@rollup/rollup-linux-s390x-gnu': 4.45.1 + '@rollup/rollup-linux-x64-gnu': 4.45.1 + '@rollup/rollup-linux-x64-musl': 4.45.1 + '@rollup/rollup-win32-arm64-msvc': 4.45.1 + '@rollup/rollup-win32-ia32-msvc': 4.45.1 + '@rollup/rollup-win32-x64-msvc': 4.45.1 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -2251,6 +3047,8 @@ snapshots: shebang-regex@3.0.0: {} + siginfo@2.0.0: {} + sinon@11.1.2: dependencies: '@sinonjs/commons': 1.8.6 @@ -2266,6 +3064,8 @@ snapshots: source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -2277,6 +3077,10 @@ snapshots: sprintf-js@1.0.3: {} + stackback@0.0.2: {} + + std-env@3.9.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -2289,6 +3093,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -2325,6 +3133,21 @@ snapshots: globalyzer: 0.1.0 globrex: 0.1.2 + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -2372,6 +3195,80 @@ snapshots: '@types/unist': 2.0.6 unist-util-stringify-position: 3.0.3 + vite-node@3.2.4(@types/node@18.19.46): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.0.4(@types/node@18.19.46) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.0.4(@types/node@18.19.46): + dependencies: + esbuild: 0.25.6 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.45.1 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 18.19.46 + fsevents: 2.3.3 + + vitest@3.2.4(@types/node@18.19.46): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@18.19.46)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.0.4(@types/node@18.19.46) + vite-node: 3.2.4(@types/node@18.19.46) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.46 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vscode-css-languageservice@6.3.5: dependencies: '@vscode/l10n': 0.0.18 @@ -2443,6 +3340,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + workerpool@6.2.0: {} wrap-ansi@7.0.0: From aefe3a5b3a244e9438f163b40ad895ce7affc05e Mon Sep 17 00:00:00 2001 From: jycouet Date: Wed, 16 Jul 2025 00:39:33 +0200 Subject: [PATCH 3/4] adding some matrix tests --- packages/svelte-vscode/package.json | 3 +- .../generateFiles/templates/layout-server.ts | 1 + .../generateFiles/templates/page-load.ts | 1 + .../generateFiles/templates/page-server.ts | 1 + .../test/sveltekit/utils.spec.ts | 53 ++++++++++++++++--- 5 files changed, 51 insertions(+), 8 deletions(-) diff --git a/packages/svelte-vscode/package.json b/packages/svelte-vscode/package.json index 0ed3de615..574715f96 100644 --- a/packages/svelte-vscode/package.json +++ b/packages/svelte-vscode/package.json @@ -9,8 +9,7 @@ "build": "npm run build:ts && npm run build:grammar", "vscode:prepublish": "npm install && npm run build && npm prune --production", "watch": "npm run build:grammar && tsc -w -p ./", - "test": "npm run build:grammar && node test/grammar/test.js", - "test:2": "vitest" + "test": "npm run build:grammar && node test/grammar/test.js && vitest --run" }, "repository": { "type": "git", diff --git a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/layout-server.ts b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/layout-server.ts index d2bb9da3b..20011c153 100644 --- a/packages/svelte-vscode/src/sveltekit/generateFiles/templates/layout-server.ts +++ b/packages/svelte-vscode/src/sveltekit/generateFiles/templates/layout-server.ts @@ -32,5 +32,6 @@ export default async function (config: GenerateConfig): ReturnType ({ Uri: { file: vi.fn((path) => ({ path })) }, workspace: { @@ -61,11 +91,22 @@ describe('checkProjectKind', () => { ['js', { jsconfig: true }, 'withTs', false], ['ts', { tsconfig: true }, 'withTs', true], - ['ts', { tsconfig: true }, 'withSatisfies', true], - ['ts', { tsconfig: true, tsVersion: '3.0' }, 'withSatisfies', false] + ['ts satisfies (default)', { tsconfig: true }, 'withSatisfies', true], + ['ts not satisfies', { tsconfig: true, tsVersion: '3.0' }, 'withSatisfies', false], + ['ts satisfies', { tsconfig: true, tsVersion: '4.9' }, 'withSatisfies', true], + ['ts not satisfies major', { tsconfig: true, tsVersion: '4' }, 'withSatisfies', false], + ['ts not satisfies minor', { tsconfig: true, tsVersion: '4.8' }, 'withSatisfies', false], + + ['no runes 1', { svelteVersion: '1' }, 'withRunes', false], + ['no runes 4', { svelteVersion: '4.99' }, 'withRunes', false], + ['runes 12', { svelteVersion: '12' }, 'withRunes', true], + ['runes 12', { svelteVersion: '5.0' }, 'withRunes', true], - // ['ts with jsconfig', { has_ts_config: true, has_js_config: true }, 'withTs', true], - // ['ts with jsconfig', { has_ts_config: true, has_js_config: true }, 'withTs', true] + ['no sveltekit', { svelteKitVersion: '1' }, 'withProps', false], + ['no sveltekit', { svelteKitVersion: '2' }, 'withProps', false], + ['sveltekit', { svelteKitVersion: '2.15' }, 'withProps', false], + ['sveltekit', { svelteKitVersion: '2.16' }, 'withProps', true], + ['sveltekit', { svelteKitVersion: '3' }, 'withProps', true] ]; for (const [name, config, ex, toBe] of combinations) { From 7625a130739ed851e7bd20849285a1faef33e3a0 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 17 Jul 2025 08:48:32 +0200 Subject: [PATCH 4/4] lint --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4e16cd35c..49f42a3b1 100644 --- a/README.md +++ b/README.md @@ -25,14 +25,14 @@ A `.svelte` file would look something like this: let count = $state(1); let doubled = $derived(count * 2); - let quadrupled = $derived(doubled * 2); + let quadrupled = $derived(doubled * 2); function handleClick() { count += 1; } - +

{count} * 2 = {doubled}

{doubled} * 2 = {quadrupled}