From 29c6a8a49534477f17dd60bd872cc7920a141524 Mon Sep 17 00:00:00 2001 From: ArnaudTa <33383276+ArnaudTA@users.noreply.github.com> Date: Thu, 26 Sep 2024 17:38:38 +0200 Subject: [PATCH] test: :white_check_mark: add tests on hooks and small refactor --- packages/hooks/package.json | 10 +- packages/hooks/src/hooks/hook.spec.ts | 177 ++++++++++++++ packages/hooks/src/hooks/hook.ts | 35 ++- packages/hooks/src/index.ts | 14 +- packages/hooks/src/utils/utils.spec.ts | 76 ++++++ packages/hooks/vitest.config.ts | 16 ++ pnpm-lock.yaml | 321 ++++++++++++++++++++++--- 7 files changed, 592 insertions(+), 57 deletions(-) create mode 100644 packages/hooks/src/hooks/hook.spec.ts create mode 100644 packages/hooks/src/utils/utils.spec.ts create mode 100644 packages/hooks/vitest.config.ts diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 2b4a71dab..1510be6e2 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -18,7 +18,10 @@ "format": "eslint ./ --fix", "kube:e2e-ci": "echo 'check cache'", "lint": "eslint ./", - "test:e2e-ci": "echo 'check cache'" + "test": "vitest run", + "test:cov": "vitest run --coverage", + "test:e2e-ci": "echo 'check cache'", + "test:watch": "vitest" }, "dependencies": { "@cpn-console/shared": "workspace:^", @@ -31,12 +34,13 @@ "@cpn-console/ts-config": "workspace:^", "@types/json-schema": "^7.0.15", "@types/node": "^20.14.9", - "@vitest/coverage-v8": "^1.6.0", + "@vitest/coverage-v8": "^2.1.1", "nodemon": "^3.1.4", "rimraf": "^5.0.7", "ts-algebra": "^2.0.0", "typescript": "^5.5.2", - "undici-types": "^6.19.2" + "undici-types": "^6.19.2", + "vitest": "^2.1.1" }, "publishConfig": { "registry": "https://registry.npmjs.org/", diff --git a/packages/hooks/src/hooks/hook.spec.ts b/packages/hooks/src/hooks/hook.spec.ts new file mode 100644 index 000000000..0bad486b6 --- /dev/null +++ b/packages/hooks/src/hooks/hook.spec.ts @@ -0,0 +1,177 @@ +import { describe, expect, it } from 'vitest' +import { PluginApi } from '../utils/utils.ts' +import { createHook, executeStep } from './hook.ts' + +const okStatus = { status: { result: 'OK' } } as const +const koStatus = { status: { result: 'KO', message: 'Failed' } } as const + +async function simpleOkHookCall() { + return okStatus +} +async function simpleFailedHookCall() { + return koStatus +} + +describe('test executeStep mechanism', () => { + it('test payload results, everything ok', async () => { + const results = await executeStep({ + plugin1: simpleOkHookCall, + plugin2: simpleOkHookCall, + }, { apis: {}, args: {}, config: {}, failed: false, results: {} }, 'main') + + expect(results.apis).toEqual({}) + expect(results.args).toEqual({}) + expect(results.config).toEqual({}) + expect(results.failed).toBe(false) + expect(results.results).toEqual({ + plugin1: { ...okStatus, executionTime: { main: expect.any(Number) } }, + plugin2: { ...okStatus, executionTime: { main: expect.any(Number) } }, + }) + }) + + it('test payload results, everything ko', async () => { + const results = await executeStep({ + plugin1: simpleFailedHookCall, + plugin2: simpleFailedHookCall, + }, { apis: {}, args: {}, config: {}, failed: false, results: {} }, 'main') + + expect(results.apis).toEqual({}) + expect(results.args).toEqual({}) + expect(results.config).toEqual({}) + expect(results.failed).contain('plugin1') + expect(results.failed).contain('plugin2') + expect(results.results).toEqual({ + plugin1: { ...koStatus, executionTime: { main: expect.any(Number) } }, + plugin2: { ...koStatus, executionTime: { main: expect.any(Number) } }, + }) + }) + + it('test payload results, partial ko', async () => { + const results = await executeStep({ + plugin1: simpleOkHookCall, + plugin2: simpleFailedHookCall, + }, { apis: {}, args: {}, config: {}, failed: false, results: {} }, 'main') + + expect(results.apis).toEqual({}) + expect(results.args).toEqual({}) + expect(results.config).toEqual({}) + expect(results.failed).not.contain('plugin1') + expect(results.failed).contain('plugin2') + expect(results.results).toEqual({ + plugin1: { ...okStatus, executionTime: { main: expect.any(Number) } }, + plugin2: { ...koStatus, executionTime: { main: expect.any(Number) } }, + }) + }) +}) + +describe('createHook', () => { + it('test empty hookStructure', async () => { + const hook = createHook(false) + expect(hook).toEqual({ + apis: {}, + steps: { + check: {}, + pre: {}, + main: {}, + post: {}, + revert: {}, + }, + execute: expect.any(Function), + validate: expect.any(Function), + }) + + const hookUnique = createHook(true) + expect(hookUnique.uniquePlugin).toBe('') + }) + + it('test hook execution, simple ok', async () => { + const hook = createHook(false) + hook.steps.main.plugin1 = simpleOkHookCall + + const hookResult = await hook.execute({}, {}) + + expect(hookResult.args).toEqual({}) + expect(hookResult.args).toEqual({}) + expect(hookResult.config).toEqual({}) + expect(hookResult.totalExecutionTime).toEqual(expect.any(Number)) + expect(hookResult.failed).toEqual(false) + expect(hookResult.results).toEqual({ + plugin1: { ...okStatus, executionTime: { main: expect.any(Number) } }, + }) + }) + + it('test payload results, multistep ok', async () => { + const hook = createHook(false) + hook.steps.pre.plugin1 = simpleOkHookCall + hook.steps.main.plugin1 = simpleOkHookCall + hook.steps.post.plugin1 = simpleOkHookCall + + const hookResult = await hook.execute({}, {}) + + expect(hookResult.args).toEqual({}) + expect(hookResult.config).toEqual({}) + expect(hookResult.totalExecutionTime).toEqual(expect.any(Number)) + expect(hookResult.failed).toEqual(false) + expect(hookResult.results).toEqual({ plugin1: { ...okStatus, executionTime: { + pre: expect.any(Number), + main: expect.any(Number), + post: expect.any(Number), + } } }) + }) + + it('test payload results, main fails', async () => { + const hook = createHook(false) + hook.apis.plugin1 = () => new PluginApi() // à tester ailleurs + hook.steps.pre.plugin1 = simpleOkHookCall + hook.steps.main.plugin1 = simpleFailedHookCall + hook.steps.post.plugin1 = simpleOkHookCall + + const hookResult = await hook.execute({}, {}) + expect(hookResult.args).toEqual({}) + expect(hookResult.config).toEqual({}) + expect(hookResult.totalExecutionTime).toEqual(expect.any(Number)) + expect(hookResult.failed).toEqual(['plugin1']) + expect(hookResult.results).toEqual({ + plugin1: { + ...koStatus, + executionTime: { + pre: expect.any(Number), + main: expect.any(Number), + }, + }, + }) + }) + + it('test hook validate, simple ok', async () => { + const hook = createHook(false) + hook.steps.check.plugin1 = simpleOkHookCall + hook.apis.plugin1 = () => new PluginApi() // à tester ailleurs + + const hookResult = await hook.validate({}, {}) + + expect(hookResult.args).toEqual({}) + expect(hookResult.args).toEqual({}) + expect(hookResult.config).toEqual({}) + expect(hookResult.totalExecutionTime).toEqual(expect.any(Number)) + expect(hookResult.failed).toEqual(false) + expect(hookResult.results).toEqual({ + plugin1: { ...okStatus, executionTime: { validate: expect.any(Number) } }, + }) + }) + + it('test hook validate, fail', async () => { + const hook = createHook(false) + hook.steps.check.plugin1 = simpleFailedHookCall + + const hookResult = await hook.validate({}, {}) + + expect(hookResult.args).toEqual({}) + expect(hookResult.args).toEqual({}) + expect(hookResult.config).toEqual({}) + expect(hookResult.totalExecutionTime).toEqual(expect.any(Number)) + expect(hookResult.failed).toEqual(['plugin1']) + expect(hookResult.results).toEqual({ + plugin1: { ...koStatus, executionTime: { validate: expect.any(Number) } }, + }) + }) +}) diff --git a/packages/hooks/src/hooks/hook.ts b/packages/hooks/src/hooks/hook.ts index 8a798bff5..1290546dd 100644 --- a/packages/hooks/src/hooks/hook.ts +++ b/packages/hooks/src/hooks/hook.ts @@ -35,15 +35,16 @@ export type HookResult = Omit, 'apis export type StepCall = (payload: HookPayload) => Promise type HookStep = Record> export type HookStepsNames = 'check' | 'pre' | 'main' | 'post' | 'revert' -export type Hook = { +export interface Hook { uniquePlugin?: string // if plugin register on it no other one can register on it execute: (args: E, store: Config) => Promise> validate: (args: V, store: Config) => Promise> apis: Record PluginApi> -} & Record + steps: Record +} export type HookList = Record> -async function executeStep(step: HookStep, payload: HookPayload, stepName: string) { +export async function executeStep(step: HookStep, payload: HookPayload, stepName: string) { const names = Object.keys(step) const fns = names.map(async (name) => { if (payload.results[name]?.executionTime) { @@ -71,11 +72,13 @@ async function executeStep(step: HookStep, payload: Ho } export function createHook(unique = false) { - const check: HookStep = {} - const pre: HookStep = {} - const main: HookStep = {} - const post: HookStep = {} - const revert: HookStep = {} + const steps: Record = { + check: {}, + pre: {}, + main: {}, + post: {}, + revert: {}, + } const apis: Record PluginApi> = { } const execute = async (args: E, config: Config): Promise> => { @@ -92,11 +95,11 @@ export function createHook(unique config, } - const steps = [pre, main, post] - for (const [key, step] of Object.entries(steps)) { - payload = await executeStep(step, payload, key) + const executeSteps = ['pre', 'main', 'post'] as const + for (const step of executeSteps) { + payload = await executeStep(steps[step], payload, step) if (payload.failed) { - payload = await executeStep(revert, payload, 'revert') + payload = await executeStep(steps.revert, payload, 'revert') break } } @@ -123,7 +126,7 @@ export function createHook(unique config, } - const result = await executeStep(check, payload, 'validate') + const result = await executeStep(steps.check, payload, 'validate') return { args: result.args, results: result.results, @@ -134,11 +137,7 @@ export function createHook(unique } const hook: Hook = { apis, - check, - pre, - main, - post, - revert, + steps, execute, validate, } diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts index d17a15f58..9b7026d8e 100644 --- a/packages/hooks/src/index.ts +++ b/packages/hooks/src/index.ts @@ -79,7 +79,6 @@ function pluginManager(options: PluginManagerOptions): PluginManager { continue } if (functions?.api) { - // @ts-ignore hooks[hook].apis[name] = functions.api } for (const [step, fn] of objectEntries(functions?.steps ?? {})) { @@ -97,7 +96,7 @@ function pluginManager(options: PluginManagerOptions): PluginManager { continue } // @ts-ignore - hooks[hook][step][name] = fn + hooks[hook].steps[step][name] = fn message.push(`${hook}:${step}`) } } @@ -111,11 +110,12 @@ function pluginManager(options: PluginManagerOptions): PluginManager { delete servicesInfos[name] Object.values(hooks).forEach((hook) => { - delete hook.check[name] - delete hook.pre[name] - delete hook.main[name] - delete hook.post[name] - delete hook.revert[name] + delete hook.steps.check[name] + delete hook.steps.pre[name] + delete hook.steps.main[name] + delete hook.steps.post[name] + delete hook.steps.revert[name] + delete hook.apis[name] }) } diff --git a/packages/hooks/src/utils/utils.spec.ts b/packages/hooks/src/utils/utils.spec.ts new file mode 100644 index 000000000..a0ecc046b --- /dev/null +++ b/packages/hooks/src/utils/utils.spec.ts @@ -0,0 +1,76 @@ +import { describe, expect, it } from 'vitest' +import { defaultOrNullish, disabledOrDefault, enabledOrDefaultOrNullish, objectEntries, objectKeys, objectValues, specificallyDisabled, specificallyEnabled } from './utils.ts' + +const object = { test1: 1, test2: 2, 3: 'test3' } + +it('should return object keys', () => { + const keys = objectKeys(object) + console.log(typeof keys[2]) + + // cannot gaurantee order in keys + expect(keys[0]).contain('3') + expect(keys[1]).contain('test1') + expect(keys[2]).contain('test2') +}) + +it('should return object entries', () => { + const keys = objectEntries(object) + + expect(keys[0]).toEqual(['3', 'test3']) + expect(keys[1]).toEqual(['test1', 1]) + expect(keys[2]).toEqual(['test2', 2]) +}) + +it('should return object values', () => { + const keys = objectValues(object) + + // cannot gaurantee order in values + expect(keys).contain('test3') + expect(keys).contain(1) + expect(keys).contain(2) +}) + +const values = [ + '', + 'nimp', + 'enabled', + 'default', + 'disabled', +] as const +describe('test config parsing', () => { + it('enabledOrDefaultOrNullish', () => { + expect(enabledOrDefaultOrNullish(values[0])).toBeTruthy() + expect(enabledOrDefaultOrNullish(values[1])).toBeFalsy() + expect(enabledOrDefaultOrNullish(values[2])).toBeTruthy() + expect(enabledOrDefaultOrNullish(values[3])).toBeTruthy() + expect(enabledOrDefaultOrNullish(values[4])).toBeFalsy() + }) + it('specificallyDisabled', () => { + expect(specificallyDisabled(values[0])).toBeFalsy() + expect(specificallyDisabled(values[1])).toBeFalsy() + expect(specificallyDisabled(values[2])).toBeFalsy() + expect(specificallyDisabled(values[3])).toBeFalsy() + expect(specificallyDisabled(values[4])).toBeTruthy() + }) + it('specificallyEnabled', () => { + expect(specificallyEnabled(values[0])).toBeFalsy() + expect(specificallyEnabled(values[1])).toBeFalsy() + expect(specificallyEnabled(values[2])).toBeTruthy() + expect(specificallyEnabled(values[3])).toBeFalsy() + expect(specificallyEnabled(values[4])).toBeFalsy() + }) + it('defaultOrNullish', () => { + expect(defaultOrNullish(values[0])).toBeTruthy() + expect(defaultOrNullish(values[1])).toBeFalsy() + expect(defaultOrNullish(values[2])).toBeFalsy() + expect(defaultOrNullish(values[3])).toBeTruthy() + expect(defaultOrNullish(values[4])).toBeFalsy() + }) + it('disabledOrDefault', () => { + expect(disabledOrDefault(values[0])).toBeFalsy() + expect(disabledOrDefault(values[1])).toBeFalsy() + expect(disabledOrDefault(values[2])).toBeFalsy() + expect(disabledOrDefault(values[3])).toBeTruthy() + expect(disabledOrDefault(values[4])).toBeTruthy() + }) +}) diff --git a/packages/hooks/vitest.config.ts b/packages/hooks/vitest.config.ts new file mode 100644 index 000000000..58225abfa --- /dev/null +++ b/packages/hooks/vitest.config.ts @@ -0,0 +1,16 @@ +import { configDefaults, defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + environment: 'node', + testTimeout: 2000, + coverage: { + provider: 'v8', + reporter: ['text', 'lcov'], + include: ['src/**'], + exclude: ['**/types', '**/mocks', '**/*.spec.ts', '**/*.d.ts'], + }, + include: ['src/**/*.spec.{ts,js}'], + exclude: [...configDefaults.exclude], + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3f4a23e3..4e9dadcba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^2.26.0 - version: 2.27.3(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(@vue/compiler-sfc@3.5.6)(eslint@9.7.0)(typescript@5.5.3)(vitest@1.6.0(@types/node@20.14.10)(jsdom@24.1.3)) + version: 2.27.3(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(@vue/compiler-sfc@3.5.6)(eslint@9.7.0)(typescript@5.5.3)(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3)) '@commitlint/cli': specifier: ^19.3.0 version: 19.3.0(@types/node@20.14.10)(typescript@5.5.3) @@ -342,7 +342,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^2.27.3 - version: 2.27.3(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(@vue/compiler-sfc@3.5.6)(eslint@9.7.0)(typescript@5.5.3)(vitest@1.6.0(@types/node@20.14.10)(jsdom@24.1.3)) + version: 2.27.3(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(@vue/compiler-sfc@3.5.6)(eslint@9.7.0)(typescript@5.5.3)(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3)) packages/hooks: dependencies: @@ -354,7 +354,7 @@ importers: version: 0.4.0 vitest-mock-extended: specifier: ^1.3.1 - version: 1.3.1(typescript@5.5.3)(vitest@1.6.0(@types/node@20.14.10)(jsdom@24.1.3)) + version: 1.3.1(typescript@5.5.3)(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3)) zod: specifier: ^3.23.8 version: 3.23.8 @@ -372,8 +372,8 @@ importers: specifier: ^20.14.9 version: 20.14.10 '@vitest/coverage-v8': - specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.14.10)(jsdom@24.1.3)) + specifier: ^2.1.1 + version: 2.1.1(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3)) nodemon: specifier: ^3.1.4 version: 3.1.4 @@ -389,6 +389,9 @@ importers: undici-types: specifier: ^6.19.2 version: 6.19.2 + vitest: + specifier: ^2.1.1 + version: 2.1.1(@types/node@20.14.10)(jsdom@24.1.3) packages/shared: dependencies: @@ -2520,6 +2523,15 @@ packages: peerDependencies: vitest: 1.6.0 + '@vitest/coverage-v8@2.1.1': + resolution: {integrity: sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==} + peerDependencies: + '@vitest/browser': 2.1.1 + vitest: 2.1.1 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/eslint-plugin@1.0.5': resolution: {integrity: sha512-F4zlKv5S/aG3kiFyJHbkbInKfGuIs3muDnpNfr62g8tV0ALbP/MYjLKWN92olLCtWUb2cKl0pew0gKkkoHEUqw==} peerDependencies: @@ -2538,18 +2550,48 @@ packages: '@vitest/expect@1.6.0': resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} + + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + peerDependencies: + '@vitest/spy': 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + '@vitest/runner@1.6.0': resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + '@vitest/snapshot@1.6.0': resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + '@vitest/spy@1.6.0': resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + '@vitest/utils@1.6.0': resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + '@volar/language-core@2.4.0-alpha.15': resolution: {integrity: sha512-mt8z4Fm2WxfQYoQHPcKVjLQV6PgPqyKLbkCVY2cr5RSaamqCHjhKEpsFX66aL4D/7oYguuaUw9Bx03Vt0TpIIA==} @@ -2772,6 +2814,10 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + assign-deep@1.0.1: resolution: {integrity: sha512-CSXAX79mibneEYfqLT5FEmkqR5WXF+xDRjgQQuVf6wSCXCYU8/vHttPidNar7wJ5BFmKAo8Wei0rCtzb+M/yeA==} engines: {node: '>=6'} @@ -2966,6 +3012,10 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2994,6 +3044,10 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + check-more-types@2.24.0: resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} engines: {node: '>= 0.8.0'} @@ -3320,6 +3374,10 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -4798,6 +4856,9 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -5265,6 +5326,10 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -6115,6 +6180,10 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -6137,6 +6206,9 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.0: resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} @@ -6144,10 +6216,22 @@ packages: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -6482,6 +6566,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite@5.3.3: resolution: {integrity: sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6541,6 +6630,31 @@ packages: jsdom: optional: true + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} @@ -6794,7 +6908,7 @@ snapshots: ts-deepmerge: 6.2.1 zod: 3.23.8 - '@antfu/eslint-config@2.27.3(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(@vue/compiler-sfc@3.5.6)(eslint@9.7.0)(typescript@5.5.3)(vitest@1.6.0(@types/node@20.14.10)(jsdom@24.1.3))': + '@antfu/eslint-config@2.27.3(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(@vue/compiler-sfc@3.5.6)(eslint@9.7.0)(typescript@5.5.3)(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3))': dependencies: '@antfu/install-pkg': 0.4.1 '@clack/prompts': 0.7.0 @@ -6802,7 +6916,7 @@ snapshots: '@stylistic/eslint-plugin': 2.6.4(eslint@9.7.0)(typescript@5.5.3) '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3) '@typescript-eslint/parser': 8.3.0(eslint@9.7.0)(typescript@5.5.3) - '@vitest/eslint-plugin': 1.0.5(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@1.6.0(@types/node@20.14.10)(jsdom@24.1.3)) + '@vitest/eslint-plugin': 1.0.5(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3)) eslint: 9.7.0 eslint-config-flat-gitignore: 0.1.8 eslint-flat-config-utils: 0.3.1 @@ -8705,7 +8819,7 @@ snapshots: '@typescript-eslint/types': 7.16.0 '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) '@typescript-eslint/visitor-keys': 7.16.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) eslint: 9.7.0 optionalDependencies: typescript: 5.5.3 @@ -8718,7 +8832,7 @@ snapshots: '@typescript-eslint/types': 8.3.0 '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.3) '@typescript-eslint/visitor-keys': 8.3.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) eslint: 9.7.0 optionalDependencies: typescript: 5.5.3 @@ -8739,7 +8853,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) eslint: 9.7.0 ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: @@ -8751,7 +8865,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.3) '@typescript-eslint/utils': 8.3.0(eslint@9.7.0)(typescript@5.5.3) - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: typescript: 5.5.3 @@ -8769,7 +8883,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.16.0 '@typescript-eslint/visitor-keys': 7.16.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -8784,7 +8898,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.3.0 '@typescript-eslint/visitor-keys': 8.3.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -8996,7 +9110,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -9011,13 +9125,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.0.5(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@1.6.0(@types/node@20.14.10)(jsdom@24.1.3))': + '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.11 + magicast: 0.3.4 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.1(@types/node@20.14.10)(jsdom@24.1.3) + transitivePeerDependencies: + - supports-color + + '@vitest/eslint-plugin@1.0.5(@typescript-eslint/utils@8.3.0(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3))': dependencies: eslint: 9.7.0 optionalDependencies: '@typescript-eslint/utils': 8.3.0(eslint@9.7.0)(typescript@5.5.3) typescript: 5.5.3 - vitest: 1.6.0(@types/node@20.14.10)(jsdom@24.1.3) + vitest: 2.1.1(@types/node@20.14.10)(jsdom@24.1.3) '@vitest/expect@1.6.0': dependencies: @@ -9025,22 +9157,56 @@ snapshots: '@vitest/utils': 1.6.0 chai: 4.4.1 + '@vitest/expect@2.1.1': + dependencies: + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.3.3(@types/node@20.14.10))': + dependencies: + '@vitest/spy': 2.1.1 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.3.3(@types/node@20.14.10) + + '@vitest/pretty-format@2.1.1': + dependencies: + tinyrainbow: 1.2.0 + '@vitest/runner@1.6.0': dependencies: '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 + '@vitest/runner@2.1.1': + dependencies: + '@vitest/utils': 2.1.1 + pathe: 1.1.2 + '@vitest/snapshot@1.6.0': dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 + '@vitest/snapshot@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + magic-string: 0.30.11 + pathe: 1.1.2 + '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 + '@vitest/spy@2.1.1': + dependencies: + tinyspy: 3.0.2 + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 @@ -9048,6 +9214,12 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 + '@vitest/utils@2.1.1': + dependencies: + '@vitest/pretty-format': 2.1.1 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + '@volar/language-core@2.4.0-alpha.15': dependencies: '@volar/source-map': 2.4.0-alpha.15 @@ -9305,6 +9477,8 @@ snapshots: assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + assign-deep@1.0.1: dependencies: assign-symbols: 2.0.2 @@ -9539,6 +9713,14 @@ snapshots: pathval: 1.1.1 type-detect: 4.0.8 + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -9564,6 +9746,8 @@ snapshots: dependencies: get-func-name: 2.0.2 + check-error@2.1.1: {} + check-more-types@2.24.0: optional: true @@ -9793,7 +9977,7 @@ snapshots: cypress-vite@1.5.0(vite@5.3.3(@types/node@20.14.10)): dependencies: chokidar: 3.6.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) vite: 5.3.3(@types/node@20.14.10) transitivePeerDependencies: - supports-color @@ -9908,6 +10092,7 @@ snapshots: ms: 2.1.2 optionalDependencies: supports-color: 8.1.1 + optional: true debug@4.3.6: dependencies: @@ -9921,6 +10106,8 @@ snapshots: dependencies: type-detect: 4.0.8 + deep-eql@5.0.2: {} + deep-is@0.1.4: {} define-data-property@1.1.4: @@ -10282,7 +10469,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.3) '@typescript-eslint/utils': 8.3.0(eslint@9.7.0)(typescript@5.5.3) - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) doctrine: 3.0.0 eslint: 9.7.0 eslint-import-resolver-node: 0.3.9 @@ -10371,7 +10558,7 @@ snapshots: eslint-plugin-toml@0.11.1(eslint@9.7.0): dependencies: - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) eslint: 9.7.0 eslint-compat-utils: 0.5.1(eslint@9.7.0) lodash: 4.17.21 @@ -10421,7 +10608,7 @@ snapshots: eslint-plugin-yml@1.14.0(eslint@9.7.0): dependencies: - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) eslint: 9.7.0 eslint-compat-utils: 0.5.1(eslint@9.7.0) lodash: 4.17.21 @@ -11341,7 +11528,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -11433,7 +11620,7 @@ snapshots: json-schema-resolver@2.0.0: dependencies: - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) rfdc: 1.4.1 uri-js: 4.4.1 transitivePeerDependencies: @@ -11567,7 +11754,7 @@ snapshots: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) execa: 8.0.1 lilconfig: 3.1.2 listr2: 8.2.3 @@ -11691,6 +11878,10 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -11748,7 +11939,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -12161,6 +12352,8 @@ snapshots: pathval@1.1.1: {} + pathval@2.0.0: {} + pend@1.2.0: optional: true @@ -13037,7 +13230,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.5.3) css-functions-list: 3.2.2 css-tree: 2.3.1 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 file-entry-cache: 9.0.0 @@ -13165,6 +13358,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + text-extensions@2.4.0: {} text-table@0.2.0: {} @@ -13182,12 +13381,20 @@ snapshots: tinybench@2.8.0: {} + tinybench@2.9.0: {} + tinyexec@0.3.0: {} tinypool@0.8.4: {} + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + tinyspy@2.2.1: {} + tinyspy@3.0.2: {} + tmp@0.2.3: optional: true @@ -13455,7 +13662,7 @@ snapshots: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.18.1) chokidar: 3.6.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -13526,7 +13733,7 @@ snapshots: vite-node@1.6.0(@types/node@20.14.10): dependencies: cac: 6.7.14 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) pathe: 1.1.2 picocolors: 1.0.1 vite: 5.3.3(@types/node@20.14.10) @@ -13540,6 +13747,22 @@ snapshots: - supports-color - terser + vite-node@2.1.1(@types/node@20.14.10): + dependencies: + cac: 6.7.14 + debug: 4.3.6 + pathe: 1.1.2 + vite: 5.3.3(@types/node@20.14.10) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + vite@5.3.3(@types/node@20.14.10): dependencies: esbuild: 0.21.5 @@ -13555,6 +13778,12 @@ snapshots: typescript: 5.5.3 vitest: 1.6.0(@types/node@20.14.10)(jsdom@24.1.3) + vitest-mock-extended@1.3.1(typescript@5.5.3)(vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3)): + dependencies: + ts-essentials: 9.4.2(typescript@5.5.3) + typescript: 5.5.3 + vitest: 2.1.1(@types/node@20.14.10)(jsdom@24.1.3) + vitest@1.6.0(@types/node@20.14.10)(jsdom@24.1.3): dependencies: '@vitest/expect': 1.6.0 @@ -13564,7 +13793,7 @@ snapshots: '@vitest/utils': 1.6.0 acorn-walk: 8.3.3 chai: 4.4.1 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -13589,6 +13818,40 @@ snapshots: - supports-color - terser + vitest@2.1.1(@types/node@20.14.10)(jsdom@24.1.3): + dependencies: + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.3.3(@types/node@20.14.10)) + '@vitest/pretty-format': 2.1.1 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 + chai: 5.1.1 + debug: 4.3.6 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.3.3(@types/node@20.14.10) + vite-node: 2.1.1(@types/node@20.14.10) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.14.10 + jsdom: 24.1.3 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - stylus + - sugarss + - supports-color + - terser + vscode-uri@3.0.8: {} vue-demi@0.14.8(vue@3.5.6(typescript@5.5.3)): @@ -13597,7 +13860,7 @@ snapshots: vue-eslint-parser@9.4.3(eslint@9.7.0): dependencies: - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.5(supports-color@5.5.0) eslint: 9.7.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3