diff --git a/.changeset/slow-times-sink.md b/.changeset/slow-times-sink.md new file mode 100644 index 00000000..9186f70e --- /dev/null +++ b/.changeset/slow-times-sink.md @@ -0,0 +1,5 @@ +--- +'dotenv-diff': patch +--- + +regex to catch svelte v3 env variables diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 34edfb5b..d491ff3e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -26,12 +26,12 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Initialize CodeQL - uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 + uses: github/codeql-action/init@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0 with: languages: javascript-typescript build-mode: none - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 + uses: github/codeql-action/analyze@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0 with: category: '/language:javascript-typescript' diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index ba7fdc4b..ab30e467 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -45,6 +45,6 @@ jobs: retention-days: 5 - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 + uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0 with: sarif_file: results.sarif diff --git a/docs/capabilities.md b/docs/capabilities.md index 7dffa0bf..d3e84474 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -43,6 +43,16 @@ const { MY_KEY } = privateEnv import { MY_KEY } from '$env/static/private'; import { MY_KEY } from '$env/static/public'; MY_KEY + +// SvelteKit 3 – named imports from $app/env +import { MY_KEY } from '$app/env/private'; +import { MY_KEY, OTHER_KEY as alias } from '$app/env/public'; + +// SvelteKit 3 – declarations in src/env.ts (top-level keys count as used) +export const variables = defineEnvVars({ + MY_KEY: {}, + OTHER_KEY: { public: true }, +}); ``` Docker Compose files are also scanned for shell-style interpolation, so diff --git a/docs/frameworks/sveltekit_warnings.md b/docs/frameworks/sveltekit_warnings.md index b6993588..f702847b 100644 --- a/docs/frameworks/sveltekit_warnings.md +++ b/docs/frameworks/sveltekit_warnings.md @@ -105,7 +105,23 @@ Warning: `$env/static/public variables must start with "PUBLIC_"` -## 9 Sensitive-looking `PUBLIC_` / `VITE_` names trigger exposure warnings +## 9 `$app/env/private` cannot be used in client-side code + +SvelteKit 3 replaces the `$env/*` modules with `$app/env/private` and `$app/env/public`. + +```svelte + +``` + +Warning: + +`$app/env/private cannot be used in client-side code` + +**Note:** `$app/env/public` has no `PUBLIC_` prefix rule. In SvelteKit 3 a variable is exposed to the browser via `public: true` in `defineEnvVars`, not via its name. + +## 10 Sensitive-looking `PUBLIC_` / `VITE_` names trigger exposure warnings If a client-exposed name contains `SECRET`, `PRIVATE`, or `PASSWORD`, a warning is produced. @@ -128,6 +144,7 @@ Warning: - `$env/dynamic/public` → must use `PUBLIC_*` - `$env/static/private` → server-only, never `PUBLIC_*` - `$env/static/public` → must use `PUBLIC_*` +- `$app/env/private` → server-only - Sensitive client-exposed names (`PUBLIC_*`/`VITE_*`) → warning ## Best practices diff --git a/package.json b/package.json index cf757241..5dda9c2c 100644 --- a/package.json +++ b/package.json @@ -32,18 +32,18 @@ "@repo/eslint-config": "workspace:*", "@repo/tsconfig": "workspace:*", "@repo/vitest": "workspace:*", - "@types/node": "^26.6.4", + "@types/node": "^26.6.5", "@types/prompts": "^2.4.9", - "@typescript-eslint/eslint-plugin": "^8.71.0", - "@typescript-eslint/parser": "^8.71.0", + "@typescript-eslint/eslint-plugin": "^8.71.2", + "@typescript-eslint/parser": "^8.71.2", "@vitest/coverage-v8": "5.0.3", - "eslint": "^10.12.0", + "eslint": "^10.13.0", "husky": "^9.1.7", "lint-staged": "^17.6.0", - "prettier": "^3.9.9", - "turbo": "^2.11.7", + "prettier": "^3.9.10", + "turbo": "^2.11.9", "typescript": "^6.0.3", - "vitest": "^5.0.3" + "vitest": "^5.0.5" }, "packageManager": "pnpm@11.24.0" } diff --git a/packages/@repo/eslint-config/package.json b/packages/@repo/eslint-config/package.json index c1f0a264..9d50782a 100644 --- a/packages/@repo/eslint-config/package.json +++ b/packages/@repo/eslint-config/package.json @@ -12,8 +12,8 @@ "format": "prettier --write \"**/*.{ts,js,json,md,yml}\"" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^8.71.0", - "@typescript-eslint/parser": "^8.71.0", - "eslint": "^10.12.0" + "@typescript-eslint/eslint-plugin": "^8.71.2", + "@typescript-eslint/parser": "^8.71.2", + "eslint": "^10.13.0" } } diff --git a/packages/cli/src/commands/compare.ts b/packages/cli/src/commands/compare.ts index 4af94500..c2def83e 100644 --- a/packages/cli/src/commands/compare.ts +++ b/packages/cli/src/commands/compare.ts @@ -374,11 +374,11 @@ function findDuplicates( function isAllOk(filtered: Filtered): boolean { return ( filtered.missing.length === 0 && - (filtered.extra?.length ?? 0) === 0 && - (filtered.empty?.length ?? 0) === 0 && + !filtered.extra?.length && + !filtered.empty?.length && filtered.duplicatesEnv.length === 0 && filtered.duplicatesEx.length === 0 && - (filtered.mismatches?.length ?? 0) === 0 && + !filtered.mismatches?.length && !filtered.gitignoreIssue ); } diff --git a/packages/cli/src/core/frameworks/sveltekitRules.ts b/packages/cli/src/core/frameworks/sveltekitRules.ts index cc92dd54..75abebc4 100644 --- a/packages/cli/src/core/frameworks/sveltekitRules.ts +++ b/packages/cli/src/core/frameworks/sveltekitRules.ts @@ -158,6 +158,22 @@ export function applySvelteKitRules( return; } + // $app/env/private (SvelteKit 3) + if ( + u.pattern === 'sveltekit' && + u.imports?.includes('$app/env/private') && + (isSvelteFile || isClientFile) + ) { + warnings.push({ + variable: u.variable, + reason: '$app/env/private cannot be used in client-side code', + file: normalizedFile, + line: u.line, + framework: 'sveltekit', + }); + return; + } + // Warn if PUBLIC_ or VITE_ contains sensitive keywords if ( (u.variable.startsWith('PUBLIC_') || u.variable.startsWith('VITE_')) && diff --git a/packages/cli/src/core/scan/patterns.ts b/packages/cli/src/core/scan/patterns.ts index 2e409666..351ee6df 100644 --- a/packages/cli/src/core/scan/patterns.ts +++ b/packages/cli/src/core/scan/patterns.ts @@ -19,12 +19,14 @@ type Pattern = { const ENV_VAR_NAME_PATTERN = /^[A-Z_][A-Z0-9_]*$/; /** - * Matches SvelteKit $env imports to collect import sources per file. + * Matches SvelteKit env imports to collect import sources per file. + * Covers the legacy `$env/*` modules and the SvelteKit 3 `$app/env/*` modules. * Example: import { env } from '$env/dynamic/private' * Example: import { PUBLIC_URL } from '$env/static/public' + * Example: import { API_KEY } from '$app/env/private' */ export const SVELTEKIT_IMPORT_REGEX = - /import\s+(?:\{[^}]*\}|\w+)\s+from\s+['"](?\$env\/(?:static|dynamic)\/(?:private|public))['"]/g; + /import\s+(?:\{[^}]*\}|\w+)\s+from\s+['"](?\$env\/(?:static|dynamic)\/(?:private|public)|\$app\/env\/(?:private|public))['"]/g; /** * Matches aliased SvelteKit env imports. @@ -71,6 +73,92 @@ export function buildSveltekitAliasPatterns( ]; } +/** + * Extracts the imported names from a named import list, ignoring local aliases. + * Example: "A, B as b, type C" → ["A", "B", "C"] + */ +function parseNamedImports(content: string | undefined): string[] { + if (!content) return []; + return content + .split(',') + .map((part) => part.trim().replace(/^type\s+/, '')) + .map((part) => part.split(/\s+as\s+/)[0]!.trim()) + .filter((key) => ENV_VAR_NAME_PATTERN.test(key)); +} + +/** + * Extracts the top-level keys of the object literal passed to + * `defineEnvVars({ ... })` (SvelteKit 3 `src/env.ts`). Nested config objects + * (`{ public: true, schema: ... }`), strings and comments are skipped. + * @param source - The full file content. + * @param start - Offset of the opening `{` of the object literal. + */ +function parseDefineEnvVarsKeys(source: string, start: number): string[] { + const keys: string[] = []; + let depth = 0; + // True when the next token at depth 1 is in key position. + let expectKey = false; + + for (let i = start; i < source.length; i++) { + const ch = source[i]!; + + // Skip comments + if (ch === '/' && source[i + 1] === '/') { + const end = source.indexOf('\n', i); + i = end === -1 ? source.length : end; + continue; + } + if (ch === '/' && source[i + 1] === '*') { + const end = source.indexOf('*/', i + 2); + i = end === -1 ? source.length : end + 1; + continue; + } + + // Strings (quoted keys at depth 1 are captured, everything else skipped) + if (ch === '"' || ch === "'" || ch === '`') { + let j = i + 1; + while (j < source.length && source[j] !== ch) { + if (source[j] === '\\') j++; + j++; + } + if (depth === 1 && expectKey) { + const key = source.slice(i + 1, j); + if (ENV_VAR_NAME_PATTERN.test(key)) keys.push(key); + expectKey = false; + } + i = j; + continue; + } + + if (ch === '{' || ch === '[' || ch === '(') { + depth++; + if (depth === 1) expectKey = true; + continue; + } + if (ch === '}' || ch === ']' || ch === ')') { + depth--; + if (depth === 0) break; + continue; + } + + if (depth !== 1) continue; + + if (ch === ',') { + expectKey = true; + continue; + } + + if (expectKey && /[A-Za-z_$]/.test(ch)) { + const ident = /^[A-Za-z_$][\w$]*/.exec(source.slice(i))![0]; + if (ENV_VAR_NAME_PATTERN.test(ident)) keys.push(ident); + expectKey = false; + i += ident.length - 1; + } + } + + return keys; +} + /** * Framework-specific regex patterns for detecting environment variable usage * across different runtimes and frameworks. @@ -156,6 +244,31 @@ export const ENV_PATTERNS: Pattern[] = [ /import\s*\{\s*([A-Z_][A-Z0-9_]*)\s*\}\s*from\s*['"]\$env\/static\/(?:private|public)['"]/g, }, + // SvelteKit 3 named imports (single, multiple, aliased, multiline) + // import { PUBLIC_SENTRY_DSN } from '$app/env/public'; + // import { API_KEY, OTHER_KEY as other } from '$app/env/private'; + { + name: 'sveltekit' as const, + regex: /import\s*\{([^}]*)\}\s*from\s*['"]\$app\/env\/private['"]/g, + sourceModule: '$app/env/private', + processor: (match) => parseNamedImports(match[1]), + }, + { + name: 'sveltekit' as const, + regex: /import\s*\{([^}]*)\}\s*from\s*['"]\$app\/env\/public['"]/g, + sourceModule: '$app/env/public', + processor: (match) => parseNamedImports(match[1]), + }, + + // SvelteKit 3 env declarations in src/env.ts + // export const variables = defineEnvVars({ API_KEY: {}, PUBLIC_URL: { public: true } }); + { + name: 'sveltekit' as const, + regex: /\bdefineEnvVars\s*\(\s*(?=\{)/g, + processor: (match) => + parseDefineEnvVarsKeys(match.input, match.index + match[0].length), + }, + // Bare env object accessor (framework resolved from file context at scan time) // env.SECRET — SvelteKit `$env/dynamic/*` or Vite `loadEnv(...)` result { diff --git a/packages/cli/test/unit/core/frameworks/sveltekitRules.test.ts b/packages/cli/test/unit/core/frameworks/sveltekitRules.test.ts index f9f96a6b..5eb08a68 100644 --- a/packages/cli/test/unit/core/frameworks/sveltekitRules.test.ts +++ b/packages/cli/test/unit/core/frameworks/sveltekitRules.test.ts @@ -27,6 +27,46 @@ describe('applySvelteKitRules', () => { vi.clearAllMocks(); }); + // $app/env/private (SvelteKit 3) + it('warns when $app/env/private is used in client code', () => { + applySvelteKitRules( + { + ...baseUsage, + pattern: 'sveltekit', + variable: 'API_KEY', + file: 'src/routes/+page.svelte', + imports: ['$app/env/private'], + }, + warnings, + ); + expect(warnings).toHaveLength(1); + expect(warnings[0]!.reason).toContain('$app/env/private'); + }); + + it('allows $app/env/private in server files and $app/env/public anywhere', () => { + applySvelteKitRules( + { + ...baseUsage, + pattern: 'sveltekit', + variable: 'API_KEY', + file: 'src/routes/+page.server.ts', + imports: ['$app/env/private'], + }, + warnings, + ); + applySvelteKitRules( + { + ...baseUsage, + pattern: 'sveltekit', + variable: 'SENTRY_DSN', + file: 'src/routes/+page.svelte', + imports: ['$app/env/public'], + }, + warnings, + ); + expect(warnings).toHaveLength(0); + }); + it('ignores node_modules', () => { applySvelteKitRules( { ...baseUsage, file: 'src/node_modules/pkg/index.js' }, diff --git a/packages/cli/test/unit/core/scan/computeExitDecision.test.ts b/packages/cli/test/unit/core/scan/computeExitDecision.test.ts index 80c6e84b..3c78fc12 100644 --- a/packages/cli/test/unit/core/scan/computeExitDecision.test.ts +++ b/packages/cli/test/unit/core/scan/computeExitDecision.test.ts @@ -175,6 +175,17 @@ describe('computeExitDecision', () => { }); } + it('passes under --strict when secrets and logged are undefined', () => { + const result = computeExitDecision( + scan({ + secrets: undefined, + logged: undefined, + } as unknown as Partial), + { strict: true }, + ); + expect(result.exitWithError).toBe(false); + }); + it('does not fail on expire warnings beyond the strict threshold', () => { const result = computeExitDecision( scan({ diff --git a/packages/cli/test/unit/core/scan/patterns.test.ts b/packages/cli/test/unit/core/scan/patterns.test.ts index 9fb00059..e87c4309 100644 --- a/packages/cli/test/unit/core/scan/patterns.test.ts +++ b/packages/cli/test/unit/core/scan/patterns.test.ts @@ -428,6 +428,99 @@ describe('scanFile - Pattern Detection', () => { }); }); + describe('SvelteKit 3 $app/env imports', () => { + it('detects import from $app/env/public', () => { + const code = `import * as Sentry from '@sentry/sveltekit'; +import { PUBLIC_SENTRY_DSN } from '$app/env/public'; + +Sentry.init({ dsn: PUBLIC_SENTRY_DSN });`; + const result = scanFile('test.ts', code, baseOpts); + + expect(result).toHaveLength(1); + expect(result[0]).toMatchObject({ + variable: 'PUBLIC_SENTRY_DSN', + pattern: 'sveltekit', + imports: ['$app/env/public'], + }); + }); + + it('detects import from $app/env/private', () => { + const code = "import { ADRESSEVAELGER_TOKEN } from '$app/env/private';"; + const result = scanFile('test.ts', code, baseOpts); + + expect(result).toHaveLength(1); + expect(result[0]).toMatchObject({ + variable: 'ADRESSEVAELGER_TOKEN', + imports: ['$app/env/private'], + }); + }); + + it('detects multiple, aliased and multiline imports', () => { + const code = `import { + API_KEY, + DB_URL as dbUrl, +} from "$app/env/private";`; + const result = scanFile('test.ts', code, baseOpts); + + expect(result.map((u) => u.variable)).toEqual(['API_KEY', 'DB_URL']); + }); + + it('does not match $app/env (non-variable module)', () => { + const code = "import { building } from '$app/env';"; + const result = scanFile('test.ts', code, baseOpts); + + expect(result).toHaveLength(0); + }); + }); + + describe('SvelteKit 3 defineEnvVars', () => { + it('detects top-level keys declared in src/env.ts', () => { + const code = `import { defineEnvVars } from '@sveltejs/kit/env'; +import * as v from 'valibot'; + +export const variables = defineEnvVars({ + // Sentry + PUBLIC_SENTRY_DSN: { public: true, schema: v.pipe(v.string(), v.url()) }, + 'ADRESSEVAELGER_TOKEN': {}, + NESTED: { description: 'not { a: KEY }', schema: (value) => ({ OTHER: value }) }, + /* COMMENTED_OUT: {}, */ +});`; + const result = scanFile('src/env.ts', code, baseOpts); + + expect(result.map((u) => u.variable)).toEqual([ + 'PUBLIC_SENTRY_DSN', + 'ADRESSEVAELGER_TOKEN', + 'NESTED', + ]); + expect(result[0]).toMatchObject({ pattern: 'sveltekit', line: 4 }); + }); + + it('ignores non env-var keys, escaped quotes and lowercase string keys', () => { + const code = `defineEnvVars({ + lowerCase: {}, + 'not-valid': {}, + API_KEY: { description: 'it\\'s { tricky }' }, +});`; + const result = scanFile('src/env.ts', code, baseOpts); + + expect(result.map((u) => u.variable)).toEqual(['API_KEY']); + }); + + it('handles a trailing line comment without a newline', () => { + const code = 'defineEnvVars({ API_KEY: {} // trailing'; + const result = scanFile('src/env.ts', code, baseOpts); + + expect(result.map((u) => u.variable)).toEqual(['API_KEY']); + }); + + it('handles an unterminated block comment', () => { + const code = 'defineEnvVars({ API_KEY: {}, /* OTHER_KEY: {}'; + const result = scanFile('src/env.ts', code, baseOpts); + + expect(result.map((u) => u.variable)).toEqual(['API_KEY']); + }); + }); + describe('SvelteKit Invalid Dynamic Named Imports', () => { it('detects invalid named import from $env/dynamic/private', () => { const code = "import { SECRET_KEY } from '$env/dynamic/private';"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2346bc5f..ec9a8f69 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,23 +27,23 @@ importers: specifier: workspace:* version: link:packages/@repo/vitest '@types/node': - specifier: ^26.6.4 - version: 26.6.4 + specifier: ^26.6.5 + version: 26.6.5 '@types/prompts': specifier: ^2.4.9 version: 2.4.9 '@typescript-eslint/eslint-plugin': - specifier: ^8.71.0 - version: 8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + specifier: ^8.71.2 + version: 8.71.2(@typescript-eslint/parser@8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.71.0 - version: 8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + specifier: ^8.71.2 + version: 8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@vitest/coverage-v8': specifier: 5.0.3 - version: 5.0.3(vitest@5.0.3) + version: 5.0.3(vitest@5.0.5) eslint: - specifier: ^10.12.0 - version: 10.12.0(supports-color@7.2.0) + specifier: ^10.13.0 + version: 10.13.0(supports-color@7.2.0) husky: specifier: ^9.1.7 version: 9.1.7 @@ -51,29 +51,29 @@ importers: specifier: ^17.6.0 version: 17.6.0 prettier: - specifier: ^3.9.9 - version: 3.9.9 + specifier: ^3.9.10 + version: 3.9.10 turbo: - specifier: ^2.11.7 - version: 2.11.7 + specifier: ^2.11.9 + version: 2.11.9 typescript: specifier: ^6.0.3 version: 6.0.3 vitest: - specifier: ^5.0.3 - version: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(vite@7.3.6(@types/node@26.6.4)(yaml@2.9.1)) + specifier: ^5.0.5 + version: 5.0.5(@types/node@26.6.5)(@vitest/coverage-v8@5.0.3)(vite@7.3.6(@types/node@26.6.5)(yaml@2.9.1)) packages/@repo/eslint-config: devDependencies: '@typescript-eslint/eslint-plugin': - specifier: ^8.71.0 - version: 8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + specifier: ^8.71.2 + version: 8.71.2(@typescript-eslint/parser@8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.71.0 - version: 8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + specifier: ^8.71.2 + version: 8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) eslint: - specifier: ^10.12.0 - version: 10.12.0(supports-color@7.2.0) + specifier: ^10.13.0 + version: 10.13.0(supports-color@7.2.0) packages/@repo/tsconfig: {} @@ -572,33 +572,33 @@ packages: cpu: [x64] os: [win32] - '@turbo/darwin-64@2.11.7': - resolution: {integrity: sha512-Z2LFOxwbiJueD1miByXJS/BrW21vv6YaQXZustty5jEX4vQYw6zyh101Sz1QO7WG0mqBzKagZ/DoAeeujI0/Sw==} + '@turbo/darwin-64@2.11.9': + resolution: {integrity: sha512-OkW+EESJjo248CThWe9DfuUqzGcRwHe1DXKWRw9DSZ0lMkocKbbwNMjWVCiO+WNBcARDM0ibu0c9SbuIe4mw6w==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.11.7': - resolution: {integrity: sha512-Vhv8ybgIflosNDSSRD9fNXHlCFA60dsGyTqQmc7l28SEX5jOaweCCD4BBYNd8/p0WGkw3e7tZbfA9w6FsujGvw==} + '@turbo/darwin-arm64@2.11.9': + resolution: {integrity: sha512-NIbFEogMaIyOi2egLH7XtuW0DXmPOpydnanyB3rw/WXCPYl1OAFRPHPGixIaakGnfNLey8LMmKemgNtqtFKdcg==} cpu: [arm64] os: [darwin] - '@turbo/linux-64@2.11.7': - resolution: {integrity: sha512-rAqRp3blQKk1+ylMGlZHAW0eJjVNuuGUm4ZrC6RU1Im8tLryvaO4a2zLQ/FQi1TRlmKqKV9YXBki2YeytlLbXA==} + '@turbo/linux-64@2.11.9': + resolution: {integrity: sha512-RkD/Atqqek2WNnYJlmPogZpXjAW+cSsPXDn7E0mufSNN86ClXCSKme/BBYMeIvPoFZ4egPJLF+JpYkuuNkMYhg==} cpu: [x64] os: [android, linux] - '@turbo/linux-arm64@2.11.7': - resolution: {integrity: sha512-thVYGov7S+llXAxrl3kBb/efalav0xhrjl5NHCR6AfKx14JkbqaetvbVwyss4FvZ9rt+Pv3xsTb+8SIYix8DTg==} + '@turbo/linux-arm64@2.11.9': + resolution: {integrity: sha512-iW/0YGS9D9YlgD4ad2IEEolD9PuNJGdkEI650AELLln8YaGsloiH8QyTUnajjxPufMuY/eWRWxO+PMBYsGvVlA==} cpu: [arm64] os: [android, linux] - '@turbo/windows-64@2.11.7': - resolution: {integrity: sha512-ZIoKT7J7KutgYl4bGxmmgeUQjG+7E0nY8BF9dxUOiMH2vdTsM4JQ2uSwTYFkTR2Llbg6ghGjSmuZ8LQtkLEYjg==} + '@turbo/windows-64@2.11.9': + resolution: {integrity: sha512-rg/kuQmSm9m/z8W5HYHLMSnTbLDXBs/9liVZh9YnfkGYm0DlFj2SV9/0fQy/EpJTq81O36kMb7p8Fmt9f67ocA==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.11.7': - resolution: {integrity: sha512-88Xv2f7SLGVJ68lRRx8o375dKmnZYNdDtvlKcPA0kZpcF93eAQd8l96BKQ0/AMHG0bMJA0Z5QqoqtetxzNsC+g==} + '@turbo/windows-arm64@2.11.9': + resolution: {integrity: sha512-PgjBpLPW/WDsKzeBmNuw2QHtPxT/PtcloN3rHFTqVyMsqkLlyHVJbSusuhYoYFdi08lZ9Stryw66UOuPg/yW0w==} cpu: [arm64] os: [win32] @@ -617,69 +617,69 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@26.6.4': - resolution: {integrity: sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==} + '@types/node@26.6.5': + resolution: {integrity: sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==} '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} - '@typescript-eslint/eslint-plugin@8.71.0': - resolution: {integrity: sha512-pqcS9c1HxZTHt7End4nXqd0s5lJrrFzrgCkKFJrsbUnaL6M3+6oBFZaslg6Gjsl3argl2DDRFROnXARaZ2e4Nw==} + '@typescript-eslint/eslint-plugin@8.71.2': + resolution: {integrity: sha512-K72/pvT7qpm8q3k8G5u93NCSN1RcLxX5h7Gw0bQpbMXviBHeY6Nx1WEwmk9wP+eKTSQ8ecxvcgt/ZX/rB938xQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.71.0 + '@typescript-eslint/parser': ^8.71.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.71.0': - resolution: {integrity: sha512-CG4nPk1f2zc8yw4pALqHsFYH2hdo+h1T9daSp21+Hnxi9LOE3GT9hAfTKJCBXVNM2GmYs1eMEP615wPoeOgk3A==} + '@typescript-eslint/parser@8.71.2': + resolution: {integrity: sha512-aTtmZjp/x3gsGHkDs04/1I8kNogBJkpQaeGaN0PfiG43NzDEmW2n+OP5im9wfsvyX0yP1UZWBrAGtDBfH9jEVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.71.0': - resolution: {integrity: sha512-aABjw5rjBacYONVPaPiWOCjJu0vEF4a25iQuodlmQYL1trtLZ0X/y+2Vzl3BKI1odM4LnwLE1oUDXYp1wzx1TQ==} + '@typescript-eslint/project-service@8.71.2': + resolution: {integrity: sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.71.0': - resolution: {integrity: sha512-gWF0BhUcnjZxSpLE8ngS/59n2SB0J3YqRxvX1+2aoRJk9hNtHSLOV+TcarFiOr5ipXm3yc1QrI4c9YZc8zyCxw==} + '@typescript-eslint/scope-manager@8.71.2': + resolution: {integrity: sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.71.0': - resolution: {integrity: sha512-Z1UlWHADEK2Mlb9NpWfDeSjqoZ5EyrOv4R3eQpbkzqn/EwaIdOpXXupEA1+0ZIOSJSZZDBHG0BrQyN8zUG6Pwg==} + '@typescript-eslint/tsconfig-utils@8.71.2': + resolution: {integrity: sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.71.0': - resolution: {integrity: sha512-i8uO1qbdxeKgRnS5sCRt6On3/nfo2d2DwQe3Yvjx543zLy7r8ySqRuPPiIIXAhS03U0v5NfAFx+rUgxFzKKwNw==} + '@typescript-eslint/type-utils@8.71.2': + resolution: {integrity: sha512-cC8UaalCViJkb3rH/xLIvidEwoFRtMZMUqDjjJMGEKaTFwYRHYBcoczlEGHuvkHEO8svRDrgZ0yQgOArFmwang==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.71.0': - resolution: {integrity: sha512-cJ4OoxPGWvFnBTnSZyaU+qJzGTqPTGJY+gDchj6cRyLRdmIdt4rcsE4twj+zPfrNiWuVi38wijHzShL++Z9atQ==} + '@typescript-eslint/types@8.71.2': + resolution: {integrity: sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.71.0': - resolution: {integrity: sha512-PEEF4G5sLLWAS5BpPrUvms4ySZkiBQQZM4z+3ReI46axK5Vqr/vXBQatJQIZZOYdGyPUAKTtsrWzpqKuU+3DEw==} + '@typescript-eslint/typescript-estree@8.71.2': + resolution: {integrity: sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.71.0': - resolution: {integrity: sha512-pKR/tEMVrXZG23UFKUn5BQf3zfmfk7KQceI2cGzywZ5nxM5Eu3hEJU1utjWzydtzBbcJAQhHN8iPCxobHpPcZQ==} + '@typescript-eslint/utils@8.71.2': + resolution: {integrity: sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.71.0': - resolution: {integrity: sha512-8eQ9R218XORK+KLosnf4bu/QsUXvUyVwTbArg7/0NMB1Pu87OJKvj4nhFblkYE8gQV73mW1dx1ptlPCkwRGa7A==} + '@typescript-eslint/visitor-keys@8.71.2': + resolution: {integrity: sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@5.0.3': @@ -699,10 +699,10 @@ packages: resolution: {integrity: sha512-gUsfXZJbzPamoIY5TvHFiMMoXESBrUMo+xqaj+rYrWI69+EnvRlYBlP96ZnHPY4vX8kyUpgAnFUCg5wZG/HkDQ==} engines: {node: '>=22'} - '@vitest/mocker@5.0.3': - resolution: {integrity: sha512-T8sWAIbkSyAjkwTcaEc3Iu0o9A27X1/kdXrizhZkGuSKScRQtRzclfAMpOTcGdXCsqxeWlpGy3XjqaW8CpLORg==} + '@vitest/mocker@5.0.5': + resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} peerDependencies: - msw: ^2.4.9 + msw: ^2.4.9 || ^3.0.0 vite: ^7.3.6 peerDependenciesMeta: msw: @@ -710,8 +710,8 @@ packages: vite: optional: true - '@vitest/spy@5.0.3': - resolution: {integrity: sha512-XhFysQTB8AZ+P4gMi+Lpo99vg2AZi0qKpaB9yXQl37+CaMEAPO3iH/wGVnSyL5MPERiLezpqTVtrR6UZH5GCXg==} + '@vitest/spy@5.0.5': + resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -741,8 +741,8 @@ packages: resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} - cac@7.0.0: - resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + cac@7.1.0: + resolution: {integrity: sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==} engines: {node: '>=20.19.0'} cacheable@2.5.0: @@ -800,8 +800,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.12.0: - resolution: {integrity: sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA==} + eslint@10.13.0: + resolution: {integrity: sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -961,8 +961,8 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - launch-editor@2.14.1: - resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + launch-editor@2.14.2: + resolution: {integrity: sha512-NHJEb30MGBCkmZXLZwz25t37QR4aY03ZzPYUJXOJaOa92uWwExI9SBQUuIznBYc1xkD7cJNGX7oc3Nl3sq2kQQ==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -1002,6 +1002,10 @@ packages: resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} engines: {node: '>=12.20.0'} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1040,8 +1044,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.9.9: - resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} + prettier@3.9.10: + resolution: {integrity: sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==} engines: {node: '>=14'} hasBin: true @@ -1100,8 +1104,8 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - tinybench@6.2.0: - resolution: {integrity: sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==} + tinybench@6.2.2: + resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==} engines: {node: '>=20.0.0'} tinyexec@1.3.1: @@ -1122,8 +1126,8 @@ packages: peerDependencies: typescript: '>=4.8.4' - turbo@2.11.7: - resolution: {integrity: sha512-RhXHbqfvY6o3xt/zSHCwSNwLrZlXiqHzewi4eAj9PtZ1T1CqgMJ2yIDb7SKPTG9IikTm925mfzL6hldQVdyNWw==} + turbo@2.11.9: + resolution: {integrity: sha512-k2ev5dv9OgP2pJwaPuydkZdid+haX2U5TDGcPtpAz0gb0nbRR3eXY/cpfrlvHih52YRTxWIcRVKc0ri3C2Scrg==} hasBin: true type-check@0.4.0: @@ -1181,20 +1185,20 @@ packages: yaml: optional: true - vitest@5.0.3: - resolution: {integrity: sha512-xMw97S3rjdtj5dkVat7jCsqWBpvchs3RlpQctUqwJD0KkERk40vz2fJ77lDwW/Vzh/pk18eItYAzkodhSes3jQ==} + vitest@5.0.5: + resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.3 - '@vitest/browser-preview': 5.0.3 + '@vitest/browser-playwright': 5.0.5 + '@vitest/browser-preview': 5.0.5 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.3 - '@vitest/coverage-v8': 5.0.3 - '@vitest/ui': 5.0.3 + '@vitest/coverage-istanbul': 5.0.5 + '@vitest/coverage-v8': 5.0.5 + '@vitest/ui': 5.0.5 happy-dom: '*' jsdom: '*' vite: ^7.3.6 @@ -1314,9 +1318,9 @@ snapshots: '@clack/prompts': 1.8.1 '@manypkg/get-packages': 3.1.0 '@pnpm/deps.graph-sequencer': 1100.0.1 - cac: 7.0.0 + cac: 7.1.0 import-meta-resolve: 4.2.0 - launch-editor: 2.14.1 + launch-editor: 2.14.2 package-manager-detector: 1.9.0 semver: 7.8.5 tinyexec: 1.3.1 @@ -1468,9 +1472,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.12.0(supports-color@7.2.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.13.0(supports-color@7.2.0))': dependencies: - eslint: 10.12.0(supports-color@7.2.0) + eslint: 10.13.0(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -1623,22 +1627,22 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true - '@turbo/darwin-64@2.11.7': + '@turbo/darwin-64@2.11.9': optional: true - '@turbo/darwin-arm64@2.11.7': + '@turbo/darwin-arm64@2.11.9': optional: true - '@turbo/linux-64@2.11.7': + '@turbo/linux-64@2.11.9': optional: true - '@turbo/linux-arm64@2.11.7': + '@turbo/linux-arm64@2.11.9': optional: true - '@turbo/windows-64@2.11.7': + '@turbo/windows-64@2.11.9': optional: true - '@turbo/windows-arm64@2.11.7': + '@turbo/windows-arm64@2.11.9': optional: true '@types/chai@5.2.3': @@ -1654,24 +1658,24 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@26.6.4': + '@types/node@26.6.5': dependencies: undici-types: 8.9.0 '@types/prompts@2.4.9': dependencies: - '@types/node': 26.6.4 + '@types/node': 26.6.5 kleur: 3.0.3 - '@typescript-eslint/eslint-plugin@8.71.0(@typescript-eslint/parser@8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.71.2(@typescript-eslint/parser@8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.71.0 - '@typescript-eslint/type-utils': 8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.71.0 - eslint: 10.12.0(supports-color@7.2.0) + '@typescript-eslint/parser': 8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.71.2 + '@typescript-eslint/type-utils': 8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.71.2 + eslint: 10.13.0(supports-color@7.2.0) ignore: 7.0.12 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -1679,56 +1683,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.71.0 - '@typescript-eslint/types': 8.71.0 - '@typescript-eslint/typescript-estree': 8.71.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.71.0 + '@typescript-eslint/scope-manager': 8.71.2 + '@typescript-eslint/types': 8.71.2 + '@typescript-eslint/typescript-estree': 8.71.2(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.71.2 debug: 4.4.3(supports-color@7.2.0) - eslint: 10.12.0(supports-color@7.2.0) + eslint: 10.13.0(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.71.0(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/project-service@8.71.2(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.71.0(typescript@6.0.3) - '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/tsconfig-utils': 8.71.2(typescript@6.0.3) + '@typescript-eslint/types': 8.71.2 debug: 4.4.3(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.71.0': + '@typescript-eslint/scope-manager@8.71.2': dependencies: - '@typescript-eslint/types': 8.71.0 - '@typescript-eslint/visitor-keys': 8.71.0 + '@typescript-eslint/types': 8.71.2 + '@typescript-eslint/visitor-keys': 8.71.2 - '@typescript-eslint/tsconfig-utils@8.71.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.71.2(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.71.0 - '@typescript-eslint/typescript-estree': 8.71.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/types': 8.71.2 + '@typescript-eslint/typescript-estree': 8.71.2(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) debug: 4.4.3(supports-color@7.2.0) - eslint: 10.12.0(supports-color@7.2.0) + eslint: 10.13.0(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.71.0': {} + '@typescript-eslint/types@8.71.2': {} - '@typescript-eslint/typescript-estree@8.71.0(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.71.2(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.71.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.71.0(typescript@6.0.3) - '@typescript-eslint/types': 8.71.0 - '@typescript-eslint/visitor-keys': 8.71.0 + '@typescript-eslint/project-service': 8.71.2(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.71.2(typescript@6.0.3) + '@typescript-eslint/types': 8.71.2 + '@typescript-eslint/visitor-keys': 8.71.2 debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.6 semver: 7.8.5 @@ -1738,23 +1742,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.71.0(eslint@10.12.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.71.2(eslint@10.13.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(supports-color@7.2.0)) - '@typescript-eslint/scope-manager': 8.71.0 - '@typescript-eslint/types': 8.71.0 - '@typescript-eslint/typescript-estree': 8.71.0(supports-color@7.2.0)(typescript@6.0.3) - eslint: 10.12.0(supports-color@7.2.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.71.2 + '@typescript-eslint/types': 8.71.2 + '@typescript-eslint/typescript-estree': 8.71.2(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.13.0(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.71.0': + '@typescript-eslint/visitor-keys@8.71.2': dependencies: - '@typescript-eslint/types': 8.71.0 + '@typescript-eslint/types': 8.71.2 eslint-visitor-keys: 5.0.1 - '@vitest/coverage-v8@5.0.3(vitest@5.0.3)': + '@vitest/coverage-v8@5.0.3(vitest@5.0.5)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/istanbul-lib-coverage': 1.0.2 @@ -1764,7 +1768,7 @@ snapshots: obug: 2.2.1 std-env: 4.3.0 tinyrainbow: 3.2.0 - vitest: 5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(vite@7.3.6(@types/node@26.6.4)(yaml@2.9.1)) + vitest: 5.0.5(@types/node@26.6.5)(@vitest/coverage-v8@5.0.3)(vite@7.3.6(@types/node@26.6.5)(yaml@2.9.1)) '@vitest/istanbul-lib-coverage@1.0.2': {} @@ -1772,16 +1776,16 @@ snapshots: dependencies: '@vitest/istanbul-lib-coverage': 1.0.2 - '@vitest/mocker@5.0.3(vite@7.3.6(@types/node@26.6.4)(yaml@2.9.1))': + '@vitest/mocker@5.0.5(vite@7.3.6(@types/node@26.6.5)(yaml@2.9.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.3 + '@vitest/spy': 5.0.5 estree-walker: 3.0.3 magic-string: 1.4.3 optionalDependencies: - vite: 7.3.6(@types/node@26.6.4)(yaml@2.9.1) + vite: 7.3.6(@types/node@26.6.5)(yaml@2.9.1) - '@vitest/spy@5.0.3': {} + '@vitest/spy@5.0.5': {} acorn-jsx@5.3.2(acorn@8.19.0): dependencies: @@ -1810,7 +1814,7 @@ snapshots: dependencies: balanced-match: 4.0.4 - cac@7.0.0: {} + cac@7.1.0: {} cacheable@2.5.0: dependencies: @@ -1884,9 +1888,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.12.0(supports-color@7.2.0): + eslint@10.13.0(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@7.2.0) '@eslint/config-helpers': 0.7.0 @@ -2038,7 +2042,7 @@ snapshots: kleur@3.0.3: {} - launch-editor@2.14.1: + launch-editor@2.14.2: dependencies: picocolors: 1.1.1 shell-quote: 1.12.0 @@ -2082,6 +2086,8 @@ snapshots: obug@2.2.1: {} + obug@3.0.0: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -2117,7 +2123,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.9.9: {} + prettier@3.9.10: {} prompts@2.4.2: dependencies: @@ -2186,7 +2192,7 @@ snapshots: has-flag: 4.0.0 optional: true - tinybench@6.2.0: {} + tinybench@6.2.2: {} tinyexec@1.3.1: {} @@ -2201,14 +2207,14 @@ snapshots: dependencies: typescript: 6.0.3 - turbo@2.11.7: + turbo@2.11.9: optionalDependencies: - '@turbo/darwin-64': 2.11.7 - '@turbo/darwin-arm64': 2.11.7 - '@turbo/linux-64': 2.11.7 - '@turbo/linux-arm64': 2.11.7 - '@turbo/windows-64': 2.11.7 - '@turbo/windows-arm64': 2.11.7 + '@turbo/darwin-64': 2.11.9 + '@turbo/darwin-arm64': 2.11.9 + '@turbo/linux-64': 2.11.9 + '@turbo/linux-arm64': 2.11.9 + '@turbo/windows-64': 2.11.9 + '@turbo/windows-arm64': 2.11.9 type-check@0.4.0: dependencies: @@ -2222,7 +2228,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@7.3.6(@types/node@26.6.4)(yaml@2.9.1): + vite@7.3.6(@types/node@26.6.5)(yaml@2.9.1): dependencies: esbuild: 0.28.1 fdir: 6.5.0(picomatch@4.0.7) @@ -2231,29 +2237,29 @@ snapshots: rollup: 4.62.2 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.6.4 + '@types/node': 26.6.5 fsevents: 2.3.3 yaml: 2.9.1 - vitest@5.0.3(@types/node@26.6.4)(@vitest/coverage-v8@5.0.3)(vite@7.3.6(@types/node@26.6.4)(yaml@2.9.1)): + vitest@5.0.5(@types/node@26.6.5)(@vitest/coverage-v8@5.0.3)(vite@7.3.6(@types/node@26.6.5)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.3(vite@7.3.6(@types/node@26.6.4)(yaml@2.9.1)) + '@vitest/mocker': 5.0.5(vite@7.3.6(@types/node@26.6.5)(yaml@2.9.1)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 magic-string: 1.4.3 - obug: 2.2.1 + obug: 3.0.0 picomatch: 4.0.7 std-env: 4.3.0 - tinybench: 6.2.0 + tinybench: 6.2.2 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 7.3.6(@types/node@26.6.4)(yaml@2.9.1) + vite: 7.3.6(@types/node@26.6.5)(yaml@2.9.1) why-is-node-running: 3.2.1 optionalDependencies: - '@types/node': 26.6.4 - '@vitest/coverage-v8': 5.0.3(vitest@5.0.3) + '@types/node': 26.6.5 + '@vitest/coverage-v8': 5.0.3(vitest@5.0.5) transitivePeerDependencies: - msw