├── .npmrc ├── tsup.config.ts ├── .prettierignore ├── src ├── lib │ ├── crypto.ts │ ├── validate.ts │ ├── parse.ts │ ├── validate.test.ts │ └── stringify.ts ├── constants.ts ├── index.ts ├── v4 │ ├── index.ts │ └── index.test.ts ├── v3 │ ├── index.ts │ └── index.test.ts ├── v5 │ ├── index.ts │ └── index.test.ts ├── v1 │ ├── index.test.ts │ └── index.ts ├── v6 │ ├── index.test.ts │ └── index.ts ├── v7 │ ├── index.test.ts │ └── index.ts ├── typings.ts ├── utils.test.ts ├── uuid.test.ts ├── utils.ts └── uuid.ts ├── tsconfig.json ├── .github ├── dependabot.yml └── workflows │ ├── ci.yml │ └── release.yml ├── eslint.config.mjs ├── vitest.config.ts ├── LICENSE ├── package.json ├── .gitignore ├── README.md └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | hoist=true 2 | shamefully-hoist=true 3 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | clean: true, 5 | dts: true, 6 | entry: ['src/index.ts'], 7 | format: ['cjs', 'esm'], 8 | target: 'esnext', 9 | outDir: 'dist', 10 | }); 11 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .changeset 3 | node_modules 4 | build 5 | dist 6 | 7 | .gitignore 8 | .prettierignore 9 | 10 | .env 11 | .env.* 12 | !.env.example 13 | 14 | # Ignore files for PNPM, NPM and YARN 15 | package-lock.json 16 | yarn.lock 17 | pnpm-lock.yaml 18 | -------------------------------------------------------------------------------- /src/lib/crypto.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-require-imports 2 | export const crypto = globalThis.crypto ?? require('node:crypto').webcrypto; 3 | 4 | export async function sha1(data: Uint8Array): Promise { 5 | return await crypto.subtle.digest('SHA-1', data); 6 | } 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@shahrad/tsconfig", 4 | "compilerOptions": { 5 | "noUncheckedIndexedAccess": false, 6 | "paths": { "@/*": ["./src/*"] } 7 | }, 8 | "include": ["**/*.ts"], 9 | "exclude": ["node_modules", "dist"] 10 | } 11 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The nil UUID, consisting of all zeros. 3 | */ 4 | export const NIL = '00000000-0000-0000-0000-000000000000'; 5 | 6 | /** 7 | * Predefined namespace UUIDs for use with v3 and v5 UUIDs. 8 | */ 9 | export const NS = { 10 | DNS: '6ba7b810-9dad-11d1-80b4-00c04fd430c8', 11 | URL: '6ba7b811-9dad-11d1-80b4-00c04fd430c8', 12 | }; 13 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: '/' 5 | schedule: 6 | interval: 'daily' 7 | groups: 8 | all-dependencies: 9 | patterns: 10 | - '*' 11 | update-types: 12 | - 'minor' 13 | - 'patch' 14 | - package-ecosystem: 'github-actions' 15 | directory: '/' 16 | schedule: 17 | interval: 'daily' 18 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from '@shahrad/eslint-config'; 2 | import globals from 'globals'; 3 | 4 | export default defineConfig( 5 | { 6 | ignores: ['dist/**'], 7 | }, 8 | { 9 | languageOptions: { 10 | ecmaVersion: 'latest', 11 | sourceType: 'module', 12 | globals: { 13 | ...globals.node, 14 | ...globals.browser, 15 | }, 16 | }, 17 | rules: { 18 | 'no-console': 'error', 19 | }, 20 | } 21 | ); 22 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { NIL, NS } from './constants'; 2 | export { parse } from '@/lib/parse'; 3 | export { stringify } from '@/lib/stringify'; 4 | export { validate } from '@/lib/validate'; 5 | export { getTimestamp, version } from './utils'; 6 | export { UUID } from './uuid'; 7 | export { v1 } from './v1'; 8 | export { v3 } from './v3'; 9 | export { v4 } from './v4'; 10 | export { v5 } from './v5'; 11 | export { v6 } from './v6'; 12 | export { v7 } from './v7'; 13 | export type * from './typings'; 14 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { playwright } from '@vitest/browser-playwright'; 3 | import { defineConfig } from 'vitest/config'; 4 | 5 | export default defineConfig({ 6 | test: { 7 | browser: { 8 | enabled: true, 9 | provider: playwright(), 10 | instances: [{ browser: 'chromium' }], 11 | }, 12 | environment: 'node', 13 | testTimeout: 10000, 14 | globals: true, 15 | exclude: ['**/node_modules/**', '**/dist/**'], 16 | }, 17 | resolve: { 18 | alias: { 19 | '@': path.resolve(__dirname, './src'), 20 | }, 21 | }, 22 | }); 23 | -------------------------------------------------------------------------------- /src/lib/validate.ts: -------------------------------------------------------------------------------- 1 | const REGEX = 2 | /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; 3 | 4 | /** 5 | * Checks if a string is a valid UUID. 6 | * 7 | * @param uuid The string to validate. 8 | * @returns `true` if the string is a valid UUID, otherwise `false`. 9 | * 10 | * @example 11 | * ```ts 12 | * import { validate, v4 } from '@se-oss/uuid'; 13 | * 14 | * const uuid = v4(); 15 | * validate(uuid); // -> true 16 | * validate('not-a-uuid'); // -> false 17 | * ``` 18 | */ 19 | export function validate(uuid: string) { 20 | return typeof uuid === 'string' && REGEX.test(uuid); 21 | } 22 | -------------------------------------------------------------------------------- /src/v4/index.ts: -------------------------------------------------------------------------------- 1 | import { unsafeStringify } from '@/lib/stringify'; 2 | import { V4Options } from '@/typings'; 3 | import { randomBytes } from '@/utils'; 4 | 5 | /** 6 | * Generates a v4 (random) UUID. 7 | * 8 | * @param options Optional settings for the UUID generation. 9 | * @returns A new v4 UUID string. 10 | * 11 | * @example 12 | * ```ts 13 | * import { v4 } from '@se-oss/uuid'; 14 | * 15 | * const uuid = v4(); // -> '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed' 16 | * ``` 17 | */ 18 | export function v4(options?: V4Options) { 19 | const rnds = options?.random ?? randomBytes(new Uint8Array(16)); 20 | rnds[6] = (rnds[6] & 0x0f) | 0x40; 21 | rnds[8] = (rnds[8] & 0x3f) | 0x80; 22 | return unsafeStringify(rnds); 23 | } 24 | -------------------------------------------------------------------------------- /src/v3/index.ts: -------------------------------------------------------------------------------- 1 | import { md5 } from '@se-oss/md5'; 2 | 3 | import { stringify } from '@/lib/stringify'; 4 | 5 | /** 6 | * Generates a v3 (name-based, MD5) UUID. 7 | * 8 | * @param name The name to base the UUID on. 9 | * @param namespace The namespace UUID. 10 | * @returns A new v3 UUID string. 11 | * 12 | * @example 13 | * ```ts 14 | * import { v3, NS } from '@se-oss/uuid'; 15 | * 16 | * const uuid = await v3('hello.world', NS.DNS); // -> '9f3784ab-23b0-3373-b262-01b3d68a27d3' 17 | * ``` 18 | */ 19 | export async function v3(name: string, namespace: string): Promise { 20 | const textEncoder = new TextEncoder(); 21 | const data = textEncoder.encode(namespace + name); 22 | const hash = md5(data); 23 | const hashBytes = Array.from(hash); 24 | hashBytes[6] = (hashBytes[6] & 0x0f) | 0x30; 25 | hashBytes[8] = (hashBytes[8] & 0x3f) | 0x80; 26 | return stringify(hashBytes); 27 | } 28 | -------------------------------------------------------------------------------- /src/v5/index.ts: -------------------------------------------------------------------------------- 1 | import { sha1 } from '@/lib/crypto'; 2 | import { stringify } from '@/lib/stringify'; 3 | 4 | /** 5 | * Generates a v5 (name-based, SHA-1) UUID. 6 | * 7 | * @param name The name to base the UUID on. 8 | * @param namespace The namespace UUID. 9 | * @returns A new v5 UUID string. 10 | * 11 | * @example 12 | * ```ts 13 | * import { v5, NS } from '@se-oss/uuid'; 14 | * 15 | * const uuid = await v5('hello.world', NS.DNS); // -> '016f2f48-6366-5527-a36c-217e573a0a52' 16 | * ``` 17 | */ 18 | export async function v5(name: string, namespace: string): Promise { 19 | const textEncoder = new TextEncoder(); 20 | const data = textEncoder.encode(namespace + name); 21 | const hash = await sha1(data); 22 | const hashBytes = Array.from(new Uint8Array(hash)); 23 | hashBytes[6] = (hashBytes[6] & 0x0f) | 0x50; 24 | hashBytes[8] = (hashBytes[8] & 0x3f) | 0x80; 25 | return stringify(hashBytes); 26 | } 27 | -------------------------------------------------------------------------------- /src/v4/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { v4 } from '.'; 4 | 5 | describe('v4()', () => { 6 | it('should generate a valid v4 UUID', () => { 7 | const uuid = v4(); 8 | expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/); 9 | }); 10 | 11 | it('should generate a different UUID each time', () => { 12 | const uuid1 = v4(); 13 | const uuid2 = v4(); 14 | expect(uuid1).not.toBe(uuid2); 15 | }); 16 | 17 | it('should generate a UUID with the correct version (4)', () => { 18 | const uuid = v4(); 19 | const version = uuid.split('-')[2][0]; 20 | expect(version).toBe('4'); 21 | }); 22 | 23 | it('should generate a UUID with the correct variant (8, 9, a, or b)', () => { 24 | const uuid = v4(); 25 | const variant = uuid.split('-')[3][0]; 26 | expect(['8', '9', 'a', 'b']).toContain(variant); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /src/v1/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { v1 } from '.'; 4 | 5 | describe('v1()', () => { 6 | it('should generate a valid v1 UUID', () => { 7 | const uuid = v1(); 8 | expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/); 9 | }); 10 | 11 | it('should generate a different UUID each time', () => { 12 | const uuid1 = v1(); 13 | const uuid2 = v1(); 14 | expect(uuid1).not.toBe(uuid2); 15 | }); 16 | 17 | it('should generate a UUID with the correct version (1)', () => { 18 | const uuid = v1(); 19 | const version = uuid.split('-')[2][0]; 20 | expect(version).toBe('1'); 21 | }); 22 | 23 | it('should generate a UUID with the correct variant (8, 9, a, or b)', () => { 24 | const uuid = v1(); 25 | const variant = uuid.split('-')[3][0]; 26 | expect(['8', '9', 'a', 'b']).toContain(variant); 27 | }); 28 | 29 | it('should generate UUIDs in chronological order', () => { 30 | const uuid1 = v1(); 31 | const uuid2 = v1(); 32 | expect(uuid1 < uuid2).toBe(true); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /src/v6/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { v6 } from '.'; 4 | 5 | describe('v6()', () => { 6 | it('should generate a valid v6 UUID', () => { 7 | const uuid = v6(); 8 | expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-6[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/); 9 | }); 10 | 11 | it('should generate a different UUID each time', () => { 12 | const uuid1 = v6(); 13 | const uuid2 = v6(); 14 | expect(uuid1).not.toBe(uuid2); 15 | }); 16 | 17 | it('should generate a UUID with the correct version (6)', () => { 18 | const uuid = v6(); 19 | const version = uuid.split('-')[2][0]; 20 | expect(version).toBe('6'); 21 | }); 22 | 23 | it('should generate a UUID with the correct variant (8, 9, a, or b)', () => { 24 | const uuid = v6(); 25 | const variant = uuid.split('-')[3][0]; 26 | expect(['8', '9', 'a', 'b']).toContain(variant); 27 | }); 28 | 29 | it('should generate UUIDs in chronological order', () => { 30 | const uuid1 = v6(); 31 | const uuid2 = v6(); 32 | expect(uuid1 < uuid2).toBe(true); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Shahrad Elahi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/v7/index.test.ts: -------------------------------------------------------------------------------- 1 | import delay from '@se-oss/delay'; 2 | import { describe, expect, it } from 'vitest'; 3 | 4 | import { v7 } from '.'; 5 | 6 | describe('v7()', () => { 7 | it('should generate a valid v7 UUID', () => { 8 | const uuid = v7(); 9 | expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/); 10 | }); 11 | 12 | it('should generate a different UUID each time', () => { 13 | const uuid1 = v7(); 14 | const uuid2 = v7(); 15 | expect(uuid1).not.toBe(uuid2); 16 | }); 17 | 18 | it('should generate a UUID with the correct version (7)', () => { 19 | const uuid = v7(); 20 | const version = uuid.split('-')[2][0]; 21 | expect(version).toBe('7'); 22 | }); 23 | 24 | it('should generate a UUID with the correct variant (8, 9, a, or b)', () => { 25 | const uuid = v7(); 26 | const variant = uuid.split('-')[3][0]; 27 | expect(['8', '9', 'a', 'b']).toContain(variant); 28 | }); 29 | 30 | it('should generate UUIDs in chronological order', async () => { 31 | const uuid1 = v7(); 32 | await delay(1); 33 | const uuid2 = v7(); 34 | expect(uuid1 < uuid2).toBe(true); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | 8 | jobs: 9 | format: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: pnpm/action-setup@v4 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version: 22 17 | cache: 'pnpm' 18 | 19 | - run: pnpm install --frozen-lockfile 20 | - run: pnpm format:check 21 | 22 | lint: 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v4 26 | - uses: pnpm/action-setup@v4 27 | - uses: actions/setup-node@v4 28 | with: 29 | node-version: 22 30 | cache: 'pnpm' 31 | 32 | - run: pnpm install --frozen-lockfile 33 | - run: pnpm lint 34 | 35 | test: 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: actions/checkout@v4 39 | - uses: pnpm/action-setup@v4 40 | - uses: actions/setup-node@v4 41 | with: 42 | node-version: 22 43 | cache: 'pnpm' 44 | 45 | - run: pnpm install --frozen-lockfile 46 | - run: pnpm exec playwright install --with-deps chromium 47 | - run: pnpm test 48 | -------------------------------------------------------------------------------- /src/v7/index.ts: -------------------------------------------------------------------------------- 1 | import { stringify } from '@/lib/stringify'; 2 | import { randomBytes } from '@/utils'; 3 | 4 | let lastMsecs = 0; 5 | let counter = 0; 6 | 7 | /** 8 | * Generates a v7 (Unix Epoch time-based) UUID. 9 | * 10 | * @returns A new v7 UUID string. 11 | * 12 | * @example 13 | * ```ts 14 | * import { v7 } from '@se-oss/uuid'; 15 | * 16 | * const uuid = v7(); // -> '018f9e2c-0a8c-7b2a-8b0f-9e8e2d2b1c6d' 17 | * ``` 18 | */ 19 | export function v7() { 20 | const bytes = randomBytes(new Uint8Array(16)); 21 | const msecs = Date.now(); 22 | 23 | if (msecs < lastMsecs) { 24 | counter = 0; 25 | } 26 | 27 | if (msecs === lastMsecs) { 28 | counter++; 29 | } else { 30 | counter = 0; 31 | } 32 | 33 | lastMsecs = msecs; 34 | 35 | bytes[0] = (msecs / 0x10000000000) & 0xff; 36 | bytes[1] = (msecs / 0x100000000) & 0xff; 37 | bytes[2] = (msecs / 0x1000000) & 0xff; 38 | bytes[3] = (msecs / 0x10000) & 0xff; 39 | bytes[4] = (msecs / 0x100) & 0xff; 40 | bytes[5] = msecs & 0xff; 41 | 42 | bytes[6] = (bytes[6] & 0x0f) | 0x70; 43 | bytes[6] = (bytes[6] & 0xf0) | ((counter >> 8) & 0x0f); 44 | bytes[7] = counter & 0xff; 45 | 46 | bytes[8] = (bytes[8] & 0x3f) | 0x80; 47 | 48 | return stringify(bytes); 49 | } 50 | -------------------------------------------------------------------------------- /src/v1/index.ts: -------------------------------------------------------------------------------- 1 | import { stringify } from '@/lib/stringify'; 2 | import { V1Options } from '@/typings'; 3 | import { v1setup } from '@/utils'; 4 | 5 | /** 6 | * Generates a v1 (timestamp-based) UUID. 7 | * 8 | * @param options Optional settings for the UUID generation. 9 | * @returns A new v1 UUID string. 10 | * 11 | * @example 12 | * ```ts 13 | * import { v1 } from '@se-oss/uuid'; 14 | * 15 | * const uuid = v1(); // -> 'a9b6f8e4-7b3b-11ef-8f8b-9e8e2d2b1c6d' 16 | * ``` 17 | */ 18 | export function v1(options?: V1Options) { 19 | let i = 0; 20 | const b = new Uint8Array(16); 21 | 22 | const { msecs: msecs, nsecs: nsecs, clockseq: Clockseq, node: Node } = v1setup(options); 23 | 24 | const msecs_ = msecs + 12219292800000; 25 | const tl = ((msecs_ & 0xfffffff) * 10000 + nsecs) % 0x100000000; 26 | b[i++] = (tl >>> 24) & 0xff; 27 | b[i++] = (tl >>> 16) & 0xff; 28 | b[i++] = (tl >>> 8) & 0xff; 29 | b[i++] = tl & 0xff; 30 | const tmh = ((msecs_ / 0x100000000) * 10000) & 0xfffffff; 31 | b[i++] = (tmh >>> 8) & 0xff; 32 | b[i++] = tmh & 0xff; 33 | b[i++] = ((tmh >>> 24) & 0x0f) | 0x10; 34 | b[i++] = (tmh >>> 16) & 0xff; 35 | b[i++] = ((Clockseq >>> 8) & 0x3f) | 0x80; 36 | b[i++] = Clockseq & 0xff; 37 | for (let n = 0; n < 6; ++n) { 38 | b[i + n] = Node[n]; 39 | } 40 | return stringify(b); 41 | } 42 | -------------------------------------------------------------------------------- /src/typings.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Options for generating a v1 UUID. 3 | */ 4 | export interface V1Options { 5 | /** 6 | * A 6-byte array representing the machine's MAC address or a random value. 7 | * If not provided, a random node ID will be generated. 8 | * 9 | * @example [0x01, 0x23, 0x45, 0x67, 0x89, 0xab] 10 | */ 11 | node?: number[]; 12 | /** 13 | * A 14-bit value used to avoid duplicates when the clock is set backward. 14 | * If not provided, a random clock sequence will be generated. 15 | */ 16 | clockseq?: number; 17 | /** 18 | * The timestamp in milliseconds since the Unix epoch. 19 | * Defaults to the current time. 20 | */ 21 | msecs?: number; 22 | /** 23 | * The number of 100-nanosecond intervals since the last millisecond. 24 | * Used to create up to 10,000 unique UUIDs per millisecond. 25 | */ 26 | nsecs?: number; 27 | /** 28 | * A 16-byte array of random values to seed the node ID and clock sequence. 29 | * Used only if `node` or `clockseq` are not provided. 30 | */ 31 | random?: number[] | Uint8Array; 32 | } 33 | 34 | /** 35 | * Options for generating a v4 UUID. 36 | */ 37 | export interface V4Options { 38 | /** 39 | * A 16-byte array of random values to use for the UUID. 40 | * If not provided, cryptographically secure random values will be generated. 41 | */ 42 | random?: number[] | Uint8Array; 43 | } 44 | -------------------------------------------------------------------------------- /src/utils.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { v1 } from '@/v1'; 4 | import { v6 } from '@/v6'; 5 | import { v7 } from '@/v7'; 6 | 7 | import { getTimestamp } from './utils'; 8 | 9 | describe('getTimestamp()', () => { 10 | it('should extract timestamp from a v1 UUID', () => { 11 | const now = new Date(); 12 | const uuid = v1({ 13 | msecs: now.getTime(), 14 | }); 15 | const timestamp = getTimestamp(uuid); 16 | expect(timestamp?.getTime()).toBeCloseTo(now.getTime(), -1); 17 | }); 18 | 19 | it('should extract timestamp from a v6 UUID', () => { 20 | const now = new Date(); 21 | const uuid = v6({ 22 | msecs: now.getTime(), 23 | }); 24 | const timestamp = getTimestamp(uuid); 25 | expect(timestamp?.getTime()).toBeCloseTo(now.getTime(), -1); 26 | }); 27 | 28 | it('should extract timestamp from a v7 UUID', () => { 29 | const now = new Date(); 30 | const uuid = v7(); 31 | const timestamp = getTimestamp(uuid); 32 | expect(timestamp?.getTime()).toBeCloseTo(now.getTime(), -1); 33 | }); 34 | 35 | it('should return null for other UUID versions', () => { 36 | const v4uuid = '1b671a64-40d5-491e-99b0-da01ff1f3341'; 37 | expect(getTimestamp(v4uuid)).toBeNull(); 38 | }); 39 | 40 | it('should throw an error for invalid UUID', () => { 41 | expect(() => getTimestamp('not-a-uuid')).toThrow('Invalid UUID'); 42 | }); 43 | }); 44 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Package 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | create-github-release: 10 | permissions: 11 | contents: write 12 | runs-on: ubuntu-latest 13 | if: startsWith(github.ref, 'refs/tags/v') 14 | steps: 15 | - name: Calculate release name 16 | run: | 17 | GITHUB_REF=${{ github.ref }} 18 | RELEASE_NAME=${GITHUB_REF#"refs/tags/"} 19 | echo "RELEASE_NAME=${RELEASE_NAME}" >> $GITHUB_ENV 20 | 21 | - name: Publish release 22 | uses: actions/create-release@v1 23 | env: 24 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 25 | with: 26 | tag_name: ${{ github.ref }} 27 | release_name: ${{ env.RELEASE_NAME }} 28 | draft: false 29 | prerelease: false 30 | 31 | publish-npm-release: 32 | runs-on: ubuntu-latest 33 | permissions: 34 | contents: read 35 | id-token: write 36 | steps: 37 | - uses: actions/checkout@v4 38 | - uses: pnpm/action-setup@v4 39 | - uses: actions/setup-node@v4 40 | with: 41 | node-version: 22 42 | cache: 'pnpm' 43 | registry-url: 'https://registry.npmjs.org' 44 | 45 | - run: pnpm install --frozen-lockfile 46 | - run: pnpm exec playwright install --with-deps chromium 47 | - run: npm publish --provenance --access public 48 | env: 49 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 50 | -------------------------------------------------------------------------------- /src/v6/index.ts: -------------------------------------------------------------------------------- 1 | import { stringify } from '@/lib/stringify'; 2 | import { V1Options } from '@/typings'; 3 | import { v1setup } from '@/utils'; 4 | 5 | /** 6 | * Generates a v6 (reordered time-based) UUID. 7 | * 8 | * @param options Optional settings for the UUID generation. 9 | * @returns A new v6 UUID string. 10 | * 11 | * @example 12 | * ```ts 13 | * import { v6 } from '@se-oss/uuid'; 14 | * 15 | * const uuid = v6(); // -> '1ef7b3b-a9b6-68e4-8f8b-9e8e2d2b1c6d' 16 | * ``` 17 | */ 18 | export function v6(options?: V1Options) { 19 | let i = 0; 20 | const b = new Uint8Array(16); 21 | 22 | const { msecs: msecs, nsecs: nsecs, clockseq: Clockseq, node: Node } = v1setup(options); 23 | 24 | const timestamp = BigInt(msecs) + 12219292800000n; 25 | const timestampNs = timestamp * 10000n + BigInt(nsecs); 26 | 27 | const timeHigh = (timestampNs >> 12n) & 0xffffffffffffn; 28 | const timeLow = timestampNs & 0xfffn; 29 | 30 | b[i++] = Number((timeHigh >> 40n) & 0xffn); 31 | b[i++] = Number((timeHigh >> 32n) & 0xffn); 32 | b[i++] = Number((timeHigh >> 24n) & 0xffn); 33 | b[i++] = Number((timeHigh >> 16n) & 0xffn); 34 | b[i++] = Number((timeHigh >> 8n) & 0xffn); 35 | b[i++] = Number(timeHigh & 0xffn); 36 | 37 | b[i++] = Number(((timeLow >> 8n) & 0x0fn) | 0x60n); 38 | b[i++] = Number(timeLow & 0xffn); 39 | 40 | b[i++] = ((Clockseq >>> 8) & 0x3f) | 0x80; 41 | b[i++] = Clockseq & 0xff; 42 | for (let n = 0; n < 6; ++n) { 43 | b[i + n] = Node[n]; 44 | } 45 | return stringify(b); 46 | } 47 | -------------------------------------------------------------------------------- /src/lib/parse.ts: -------------------------------------------------------------------------------- 1 | import { validate } from './validate'; 2 | 3 | const hexToByte: { [key: string]: number } = {}; 4 | for (let i = 0; i < 256; ++i) { 5 | hexToByte[(i + 256).toString(16).slice(1)] = i; 6 | } 7 | 8 | /** 9 | * Converts a UUID string to a `Uint8Array` (byte array). 10 | * 11 | * @param uuid The UUID string to parse. 12 | * @returns The UUID as a `Uint8Array`. 13 | * @throws {TypeError} If the UUID is invalid. 14 | * 15 | * @example 16 | * ```ts 17 | * import { parse } from '@se-oss/uuid'; 18 | * 19 | * const bytes = parse('a9b6f8e4-7b3b-4c8f-8f8b-9e8e2d2b1c6d'); 20 | * // -> Uint8Array(16) [ 169, 182, 248, 228, 123, 59, 76, 143, 143, 139, 158, 142, 45, 43, 28, 109 ] 21 | * ``` 22 | */ 23 | export function parse(uuid: string) { 24 | if (!validate(uuid)) { 25 | throw new TypeError('Invalid UUID'); 26 | } 27 | let v; 28 | const arr = new Uint8Array(16); 29 | arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; 30 | arr[1] = (v >>> 16) & 0xff; 31 | arr[2] = (v >>> 8) & 0xff; 32 | arr[3] = v & 0xff; 33 | arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; 34 | arr[5] = v & 0xff; 35 | arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; 36 | arr[7] = v & 0xff; 37 | arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; 38 | arr[9] = v & 0xff; 39 | arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000; 40 | arr[11] = (v / 0x100000000) & 0xff; 41 | arr[12] = (v >>> 24) & 0xff; 42 | arr[13] = (v >>> 16) & 0xff; 43 | arr[14] = (v >>> 8) & 0xff; 44 | arr[15] = v & 0xff; 45 | return arr; 46 | } 47 | -------------------------------------------------------------------------------- /src/v3/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { NS } from '@/constants'; 4 | 5 | import { v3 } from '.'; 6 | 7 | describe('v3()', () => { 8 | const namespace = NS.DNS; 9 | 10 | it('should generate a valid v3 UUID', async () => { 11 | const uuid = await v3('hello', namespace); 12 | expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/); 13 | }); 14 | 15 | it('should generate the same UUID for the same name and namespace', async () => { 16 | const uuid1 = await v3('hello', namespace); 17 | const uuid2 = await v3('hello', namespace); 18 | expect(uuid1).toBe(uuid2); 19 | }); 20 | 21 | it('should generate a different UUID for a different name', async () => { 22 | const uuid1 = await v3('hello', namespace); 23 | const uuid2 = await v3('world', namespace); 24 | expect(uuid1).not.toBe(uuid2); 25 | }); 26 | 27 | it('should generate a different UUID for a different namespace', async () => { 28 | const uuid1 = await v3('hello', namespace); 29 | const uuid2 = await v3('hello', NS.URL); 30 | expect(uuid1).not.toBe(uuid2); 31 | }); 32 | 33 | it('should generate a UUID with the correct version (3)', async () => { 34 | const uuid = await v3('hello', namespace); 35 | const version = uuid.split('-')[2][0]; 36 | expect(version).toBe('3'); 37 | }); 38 | 39 | it('should generate a UUID with the correct variant (8, 9, a, or b)', async () => { 40 | const uuid = await v3('hello', namespace); 41 | const variant = uuid.split('-')[3][0]; 42 | expect(['8', '9', 'a', 'b']).toContain(variant); 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /src/v5/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { NS } from '@/constants'; 4 | 5 | import { v5 } from '.'; 6 | 7 | describe('v5()', () => { 8 | const namespace = NS.DNS; 9 | 10 | it('should generate a valid v5 UUID', async () => { 11 | const uuid = await v5('hello', namespace); 12 | expect(uuid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/); 13 | }); 14 | 15 | it('should generate the same UUID for the same name and namespace', async () => { 16 | const uuid1 = await v5('hello', namespace); 17 | const uuid2 = await v5('hello', namespace); 18 | expect(uuid1).toBe(uuid2); 19 | }); 20 | 21 | it('should generate a different UUID for a different name', async () => { 22 | const uuid1 = await v5('hello', namespace); 23 | const uuid2 = await v5('world', namespace); 24 | expect(uuid1).not.toBe(uuid2); 25 | }); 26 | 27 | it('should generate a different UUID for a different namespace', async () => { 28 | const uuid1 = await v5('hello', namespace); 29 | const uuid2 = await v5('hello', NS.URL); 30 | expect(uuid1).not.toBe(uuid2); 31 | }); 32 | 33 | it('should generate a UUID with the correct version (5)', async () => { 34 | const uuid = await v5('hello', namespace); 35 | const version = uuid.split('-')[2][0]; 36 | expect(version).toBe('5'); 37 | }); 38 | 39 | it('should generate a UUID with the correct variant (8, 9, a, or b)', async () => { 40 | const uuid = await v5('hello', namespace); 41 | const variant = uuid.split('-')[3][0]; 42 | expect(['8', '9', 'a', 'b']).toContain(variant); 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /src/lib/validate.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { v1 } from '@/v1'; 4 | import { v3 } from '@/v3'; 5 | import { v4 } from '@/v4'; 6 | import { v5 } from '@/v5'; 7 | import { v6 } from '@/v6'; 8 | import { v7 } from '@/v7'; 9 | 10 | import { validate } from './validate'; 11 | 12 | describe('validate()', () => { 13 | it('should return true for a valid v1 UUID', () => { 14 | const uuid = v1(); 15 | expect(validate(uuid)).toBe(true); 16 | }); 17 | 18 | it('should return true for a valid v3 UUID', async () => { 19 | const uuid = await v3('hello', '1b671a64-40d5-491e-99b0-da01ff1f3341'); 20 | expect(validate(uuid)).toBe(true); 21 | }); 22 | 23 | it('should return true for a valid v4 UUID', () => { 24 | const uuid = v4(); 25 | expect(validate(uuid)).toBe(true); 26 | }); 27 | 28 | it('should return true for a valid v5 UUID', async () => { 29 | const uuid = await v5('hello', '1b671a64-40d5-491e-99b0-da01ff1f3341'); 30 | expect(validate(uuid)).toBe(true); 31 | }); 32 | 33 | it('should return true for a valid v6 UUID', () => { 34 | const uuid = v6(); 35 | expect(validate(uuid)).toBe(true); 36 | }); 37 | 38 | it('should return true for a valid v7 UUID', () => { 39 | const uuid = v7(); 40 | expect(validate(uuid)).toBe(true); 41 | }); 42 | 43 | it('should return false for an invalid UUID', () => { 44 | expect(validate('not-a-uuid')).toBe(false); 45 | }); 46 | 47 | it('should return false for a UUID with incorrect version', () => { 48 | const uuid = 'ffffffff-ffff-9fff-ffff-ffffffffffff'; 49 | expect(validate(uuid)).toBe(false); 50 | }); 51 | 52 | it('should return false for a UUID with incorrect variant', () => { 53 | const uuid = 'ffffffff-ffff-4fff-cfff-ffffffffffff'; 54 | expect(validate(uuid)).toBe(false); 55 | }); 56 | 57 | it('should return true for the nil UUID', () => { 58 | expect(validate('00000000-0000-0000-0000-000000000000')).toBe(true); 59 | }); 60 | }); 61 | -------------------------------------------------------------------------------- /src/lib/stringify.ts: -------------------------------------------------------------------------------- 1 | import { validate } from './validate'; 2 | 3 | const byteToHex: string[] = []; 4 | for (let i = 0; i < 256; ++i) { 5 | byteToHex.push((i + 256).toString(16).slice(1)); 6 | } 7 | 8 | /** 9 | * Converts a byte array to a UUID string without any validation. 10 | * 11 | * @internal 12 | * @param arr The byte array to convert. 13 | * @param offset The offset to start from in the byte array. 14 | * @returns The UUID string. 15 | */ 16 | export function unsafeStringify(arr: number[] | Uint8Array, offset = 0) { 17 | return ( 18 | byteToHex[arr[offset + 0]] + 19 | byteToHex[arr[offset + 1]] + 20 | byteToHex[arr[offset + 2]] + 21 | byteToHex[arr[offset + 3]] + 22 | '-' + 23 | byteToHex[arr[offset + 4]] + 24 | byteToHex[arr[offset + 5]] + 25 | '-' + 26 | byteToHex[arr[offset + 6]] + 27 | byteToHex[arr[offset + 7]] + 28 | '-' + 29 | byteToHex[arr[offset + 8]] + 30 | byteToHex[arr[offset + 9]] + 31 | '-' + 32 | byteToHex[arr[offset + 10]] + 33 | byteToHex[arr[offset + 11]] + 34 | byteToHex[arr[offset + 12]] + 35 | byteToHex[arr[offset + 13]] + 36 | byteToHex[arr[offset + 14]] + 37 | byteToHex[arr[offset + 15]] 38 | ).toLowerCase(); 39 | } 40 | 41 | /** 42 | * Converts a `Uint8Array` (byte array) to a UUID string. 43 | * 44 | * @param arr The byte array to convert. 45 | * @param offset The offset to start from in the byte array. 46 | * @returns The UUID as a string. 47 | * @throws {TypeError} If the resulting UUID is invalid. 48 | * 49 | * @example 50 | * ```ts 51 | * import { stringify } from '@se-oss/uuid'; 52 | * 53 | * const bytes = new Uint8Array([ 169, 182, 248, 228, 123, 59, 76, 143, 143, 139, 158, 142, 45, 43, 28, 109 ]); 54 | * const uuid = stringify(bytes); 55 | * // -> 'a9b6f8e4-7b3b-4c8f-8f8b-9e8e2d2b1c6d' 56 | * ``` 57 | */ 58 | export function stringify(arr: number[] | Uint8Array, offset = 0) { 59 | const uuid = unsafeStringify(arr, offset); 60 | if (!validate(uuid)) { 61 | throw new TypeError('Stringified UUID is invalid'); 62 | } 63 | return uuid; 64 | } 65 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@se-oss/uuid", 3 | "version": "1.0.0", 4 | "description": "A TypeScript library for generating and validating all modern UUID versions (1, 3, 4, 5, 6, and 7).", 5 | "keywords": [ 6 | "uuid", 7 | "guid", 8 | "rfc4122", 9 | "rfc9562", 10 | "v1", 11 | "v3", 12 | "v4", 13 | "v5", 14 | "v6", 15 | "v7", 16 | "typescript" 17 | ], 18 | "homepage": "https://github.com/shahradelahi/ts-uuid", 19 | "repository": "github:shahradelahi/ts-uuid", 20 | "license": "MIT", 21 | "author": "Shahrad Elahi (https://github.com/shahradelahi)", 22 | "type": "module", 23 | "exports": { 24 | ".": { 25 | "import": "./dist/index.js", 26 | "default": "./dist/index.cjs" 27 | } 28 | }, 29 | "main": "dist/index.js", 30 | "browser": "./dist/index.cjs", 31 | "types": "dist/index.d.ts", 32 | "files": [ 33 | "dist/**", 34 | "!**/*.d.cts" 35 | ], 36 | "scripts": { 37 | "bench": "vitest bench --run", 38 | "build": "pnpm typecheck && tsup", 39 | "clean": "git clean -dfx node_modules dist .tsbuildinfo", 40 | "dev": "tsup --watch", 41 | "format": "prettier --write .", 42 | "format:check": "prettier --check .", 43 | "lint": "pnpm typecheck && eslint .", 44 | "lint:fix": "eslint --fix .", 45 | "prepublishOnly": "pnpm build && pnpm lint && pnpm format:check && pnpm test", 46 | "test": "vitest --run", 47 | "typecheck": "tsc --noEmit" 48 | }, 49 | "prettier": "@shahrad/prettier-config", 50 | "dependencies": { 51 | "@se-oss/md5": "^1.0.0" 52 | }, 53 | "devDependencies": { 54 | "@se-oss/delay": "^1.0.0", 55 | "@shahrad/eslint-config": "^1.0.1", 56 | "@shahrad/prettier-config": "^1.2.2", 57 | "@shahrad/tsconfig": "^1.2.0", 58 | "@types/node": "^24.10.1", 59 | "@vitest/browser-playwright": "^4.0.15", 60 | "eslint": "^9.39.1", 61 | "globals": "^16.5.0", 62 | "prettier": "^3.7.4", 63 | "tsup": "^8.5.1", 64 | "typescript": "^5.9.3", 65 | "vitest": "^4.0.15" 66 | }, 67 | "packageManager": "pnpm@10.24.0+sha512.01ff8ae71b4419903b65c60fb2dc9d34cf8bb6e06d03bde112ef38f7a34d6904c424ba66bea5cdcf12890230bf39f9580473140ed9c946fef328b6e5238a345a" 68 | } 69 | -------------------------------------------------------------------------------- /src/uuid.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { v4, v7 } from './'; 4 | import { NIL } from './constants'; 5 | import { parse } from './lib/parse'; 6 | import { UUID } from './uuid'; 7 | 8 | describe('UUID class', () => { 9 | it('should construct from a valid UUID string', () => { 10 | const uuidStr = v4(); 11 | const uuid = new UUID(uuidStr); 12 | expect(uuid.toString()).toBe(uuidStr); 13 | }); 14 | 15 | it('should throw when constructing from an invalid UUID string', () => { 16 | expect(() => new UUID('not-a-uuid')).toThrow('Invalid UUID'); 17 | }); 18 | 19 | it('should construct from a valid byte array', () => { 20 | const uuidStr = v4(); 21 | const bytes = parse(uuidStr); 22 | const uuid = new UUID(bytes); 23 | expect(uuid.toString()).toBe(uuidStr); 24 | }); 25 | 26 | it('should throw when constructing from a byte array with invalid length', () => { 27 | const invalidBytes = new Uint8Array(15); 28 | expect(() => new UUID(invalidBytes)).toThrow('UUID byte array must be 16 bytes long'); 29 | }); 30 | 31 | it('should throw when constructing from a byte array that produces an invalid UUID', () => { 32 | const bytes = new Uint8Array(16).fill(0xff); // This will fail validation 33 | expect(() => new UUID(bytes)).toThrow('Stringified UUID is invalid'); 34 | }); 35 | 36 | it('should get the correct version', () => { 37 | const uuidStr = v4(); 38 | const uuid = new UUID(uuidStr); 39 | expect(uuid.getVersion()).toBe(4); 40 | }); 41 | 42 | it('should handle NIL uuid', () => { 43 | const uuid = new UUID(NIL); 44 | expect(uuid.getVersion()).toBe(0); 45 | }); 46 | 47 | it('should get the timestamp for time-based UUIDs', () => { 48 | const uuidStr = v7(); 49 | const uuid = new UUID(uuidStr); 50 | const timestamp = uuid.getTimestamp(); 51 | expect(timestamp).toBeInstanceOf(Date); 52 | expect(timestamp!.getTime()).toBeCloseTo(Date.now(), -2); 53 | }); 54 | 55 | it('should return null timestamp for non-time-based UUIDs', () => { 56 | const uuidStr = v4(); 57 | const uuid = new UUID(uuidStr); 58 | expect(uuid.getTimestamp()).toBeNull(); 59 | }); 60 | 61 | it('should return bytes', () => { 62 | const uuidStr = v4(); 63 | const bytes = parse(uuidStr); 64 | const uuid = new UUID(uuidStr); 65 | expect(uuid.toBytes()).toEqual(bytes); 66 | expect(uuid.toBytes()).not.toBe(uuid.toBytes()); 67 | }); 68 | 69 | it('should compare UUIDs for equality', () => { 70 | const uuidStr = v4(); 71 | const uuid1 = new UUID(uuidStr); 72 | const uuid2 = new UUID(uuidStr); 73 | const uuid3 = new UUID(v4()); 74 | 75 | expect(uuid1.equals(uuid2)).toBe(true); 76 | expect(uuid1.equals(uuidStr)).toBe(true); 77 | expect(uuid1.equals(uuid3)).toBe(false); 78 | expect(uuid1.equals('not-a-uuid')).toBe(false); 79 | }); 80 | }); 81 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # Snowpack dependency directory (https://snowpack.dev/) 45 | web_modules/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Optional stylelint cache 57 | .stylelintcache 58 | 59 | # Optional REPL history 60 | .node_repl_history 61 | 62 | # Output of 'npm pack' 63 | *.tgz 64 | 65 | # Yarn Integrity file 66 | .yarn-integrity 67 | 68 | # dotenv environment variable files 69 | .env 70 | .env.* 71 | !.env.example 72 | 73 | # parcel-bundler cache (https://parceljs.org/) 74 | .cache 75 | .parcel-cache 76 | 77 | # Next.js build output 78 | .next 79 | out 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and not Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # vuepress v2.x temp and cache directory 95 | .temp 96 | .cache 97 | 98 | # Sveltekit cache directory 99 | .svelte-kit/ 100 | 101 | # vitepress build output 102 | **/.vitepress/dist 103 | 104 | # vitepress cache directory 105 | **/.vitepress/cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # Firebase cache directory 120 | .firebase/ 121 | 122 | # TernJS port file 123 | .tern-port 124 | 125 | # Stores VSCode versions used for testing VSCode extensions 126 | .vscode-test 127 | 128 | # yarn v3 129 | .pnp.* 130 | .yarn/* 131 | !.yarn/patches 132 | !.yarn/plugins 133 | !.yarn/releases 134 | !.yarn/sdks 135 | !.yarn/versions 136 | 137 | # Vite logs files 138 | vite.config.js.timestamp-* 139 | vite.config.ts.timestamp-* 140 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { crypto } from '@/lib/crypto'; 2 | import { parse } from '@/lib/parse'; 3 | import { validate } from '@/lib/validate'; 4 | 5 | import type { V1Options } from './typings'; 6 | 7 | export const randomBytes = crypto.getRandomValues.bind(crypto); 8 | 9 | let lastMSecs = 0; 10 | let lastNSecs = 0; 11 | 12 | export function bytesToTimestamp(bytes: Uint8Array): bigint { 13 | return ( 14 | (BigInt(bytes[0]) << 40n) | 15 | (BigInt(bytes[1]) << 32n) | 16 | (BigInt(bytes[2]) << 24n) | 17 | (BigInt(bytes[3]) << 16n) | 18 | (BigInt(bytes[4]) << 8n) | 19 | BigInt(bytes[5]) 20 | ); 21 | } 22 | 23 | export function v1setup(options?: V1Options): { 24 | msecs: number; 25 | nsecs: number; 26 | clockseq: number; 27 | node: number[]; 28 | } { 29 | let { node: Node, clockseq: Clockseq } = options ?? {}; 30 | 31 | if (Node == null || Clockseq == null) { 32 | const seedBytes = options?.random ?? randomBytes(new Uint8Array(16)); 33 | if (Node == null) { 34 | Node = [ 35 | seedBytes[0] | 0x01, 36 | seedBytes[1], 37 | seedBytes[2], 38 | seedBytes[3], 39 | seedBytes[4], 40 | seedBytes[5], 41 | ]; 42 | } 43 | 44 | if (Clockseq == null) { 45 | Clockseq = ((seedBytes[6] << 8) | seedBytes[7]) & 0x3fff; 46 | } 47 | } 48 | 49 | const { msecs = Date.now() } = options ?? {}; 50 | let { nsecs = lastNSecs + 1 } = options ?? {}; 51 | const dt = msecs - lastMSecs + (nsecs - lastNSecs) / 10000; 52 | if (dt < 0 && options?.clockseq == null) { 53 | Clockseq = (Clockseq + 1) & 0x3fff; 54 | } 55 | if ((dt < 0 || msecs > lastMSecs) && options?.nsecs == null) { 56 | nsecs = 0; 57 | } 58 | if (nsecs >= 10000) { 59 | throw new Error("Can't create more than 10M uuids/sec"); 60 | } 61 | lastMSecs = msecs; 62 | lastNSecs = nsecs; 63 | 64 | return { msecs, nsecs, clockseq: Clockseq, node: Node }; 65 | } 66 | 67 | /** 68 | * Extracts the timestamp from a v1, v6, or v7 UUID. 69 | * 70 | * @param uuid The UUID string. 71 | * @returns A `Date` object representing the timestamp, or `null` if the UUID is not time-based. 72 | * @throws {Error} If the UUID is invalid. 73 | * 74 | * @example 75 | * ```ts 76 | * import { getTimestamp, v7 } from '@se-oss/uuid'; 77 | * 78 | * const uuid = v7(); 79 | * const timestamp = getTimestamp(uuid); // -> Date object 80 | * ``` 81 | */ 82 | export function getTimestamp(uuid: string): Date | null { 83 | if (!validate(uuid)) { 84 | throw new Error('Invalid UUID'); 85 | } 86 | 87 | const bytes = parse(uuid); 88 | const version = bytes[6] >> 4; 89 | 90 | let timestamp: bigint; 91 | 92 | if (version === 1) { 93 | const timeLow = 94 | (BigInt(bytes[0]) << 24n) | 95 | (BigInt(bytes[1]) << 16n) | 96 | (BigInt(bytes[2]) << 8n) | 97 | BigInt(bytes[3]); 98 | const timeMid = (BigInt(bytes[4]) << 8n) | BigInt(bytes[5]); 99 | const timeHi = (BigInt(bytes[6] & 0x0f) << 8n) | BigInt(bytes[7]); 100 | timestamp = (timeHi << 48n) | (timeMid << 32n) | timeLow; 101 | } else if (version === 6) { 102 | const timeHigh = bytesToTimestamp(bytes); 103 | const timeMid = (BigInt(bytes[6] & 0x0f) << 8n) | BigInt(bytes[7]); 104 | timestamp = (timeHigh << 12n) | timeMid; 105 | } else if (version === 7) { 106 | const unixTsMs = bytesToTimestamp(bytes); 107 | return new Date(Number(unixTsMs)); 108 | } else { 109 | return null; 110 | } 111 | 112 | const msecs = (timestamp - 122192928000000000n) / 10000n; 113 | return new Date(Number(msecs)); 114 | } 115 | 116 | /** 117 | * Detects the version of a UUID. 118 | * 119 | * @param uuid The UUID string. 120 | * @returns The version number of the UUID. 121 | * @throws {Error} If the UUID is invalid. 122 | * 123 | * @example 124 | * ```ts 125 | * import { version, v4 } from '@se-oss/uuid'; 126 | * 127 | * const uuid = v4(); 128 | * const ver = version(uuid); // -> 4 129 | * ``` 130 | */ 131 | export function version(uuid: string): number { 132 | if (!validate(uuid)) { 133 | throw new Error('Invalid UUID'); 134 | } 135 | return parse(uuid)[6] >> 4; 136 | } 137 | -------------------------------------------------------------------------------- /src/uuid.ts: -------------------------------------------------------------------------------- 1 | import { parse } from '@/lib/parse'; 2 | import { stringify } from '@/lib/stringify'; 3 | 4 | import { getTimestamp as getTimestampUtil, version as versionUtil } from './utils'; 5 | 6 | /** 7 | * Represents a UUID (Universally Unique Identifier) object, providing methods for validation, 8 | * version detection, timestamp extraction, and conversion to/from byte arrays. 9 | * 10 | * The `UUID` class offers an object-oriented way to interact with UUIDs, 11 | * complementing the functional API of the library. 12 | * 13 | * @example 14 | * ```ts 15 | * import { UUID, v4, v7 } from '@se-oss/uuid'; 16 | * 17 | * // Create a UUID from a string 18 | * const uuidV4 = new UUID(v4()); 19 | * console.log(uuidV4.toString()); // -> 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' 20 | * 21 | * // Create a UUID from a byte array 22 | * const bytes = new Uint8Array([ ... ]); // 16 bytes 23 | * const uuidFromBytes = new UUID(bytes); 24 | * 25 | * // Get UUID version 26 | * console.log(uuidV4.getVersion()); // -> 4 27 | * 28 | * // Get timestamp for time-based UUIDs 29 | * const uuidV7 = new UUID(v7()); 30 | * console.log(uuidV7.getTimestamp()); // -> Date object 31 | * 32 | * // Convert to bytes 33 | * const uuidBytes = uuidV4.toBytes(); // -> Uint8Array(16) 34 | * 35 | * // Compare UUIDs 36 | * const anotherUuidV4 = new UUID(v4()); 37 | * console.log(uuidV4.equals(anotherUuidV4)); // -> false 38 | * console.log(uuidV4.equals(uuidV4.toString())); // -> true 39 | * ``` 40 | */ 41 | export class UUID { 42 | readonly #bytes: Uint8Array; 43 | 44 | /** 45 | * Creates an instance of UUID from a string or a Uint8Array. 46 | * 47 | * @param uuid The UUID string or a 16-byte Uint8Array. 48 | * @throws {TypeError} If the UUID string is invalid, the byte array length is not 16, 49 | * or the byte array represents an invalid UUID. 50 | */ 51 | constructor(uuid: string | Uint8Array) { 52 | if (typeof uuid === 'string') { 53 | this.#bytes = parse(uuid); 54 | } else if (uuid instanceof Uint8Array) { 55 | if (uuid.length !== 16) { 56 | throw new TypeError('UUID byte array must be 16 bytes long'); 57 | } 58 | // Validate the byte array by attempting to stringify it 59 | stringify(uuid); 60 | this.#bytes = new Uint8Array(uuid); 61 | } else { 62 | throw new TypeError('Invalid UUID format. Must be a string or Uint8Array.'); 63 | } 64 | } 65 | 66 | /** 67 | * Returns the version number of the UUID. 68 | * 69 | * @returns The UUID version (e.g., 1, 3, 4, 5, 6, 7, or 0 for NIL). 70 | */ 71 | getVersion(): number { 72 | return versionUtil(this.toString()); 73 | } 74 | 75 | /** 76 | * Extracts the timestamp from time-based UUIDs (v1, v6, v7). 77 | * 78 | * @returns A `Date` object if the UUID is time-based, otherwise `null`. 79 | */ 80 | getTimestamp(): Date | null { 81 | return getTimestampUtil(this.toString()); 82 | } 83 | 84 | /** 85 | * Returns the 16-byte representation of the UUID. 86 | * 87 | * @returns A new `Uint8Array` containing the UUID bytes. 88 | */ 89 | toBytes(): Uint8Array { 90 | return new Uint8Array(this.#bytes); 91 | } 92 | 93 | /** 94 | * Converts the UUID to its canonical string representation. 95 | * 96 | * @returns The UUID as a string (e.g., 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'). 97 | */ 98 | toString(): string { 99 | return stringify(this.#bytes); 100 | } 101 | 102 | /** 103 | * Compares this UUID with another UUID object or string for equality. 104 | * 105 | * @param other The UUID object or string to compare against. 106 | * @returns `true` if the UUIDs are equal, `false` otherwise. 107 | * @example 108 | * ```ts 109 | * const uuid1 = new UUID('a9b6f8e4-7b3b-4c8f-8f8b-9e8e2d2b1c6d'); 110 | * const uuid2 = new UUID('a9b6f8e4-7b3b-4c8f-8f8b-9e8e2d2b1c6d'); 111 | * const uuid3 = new UUID('00000000-0000-0000-0000-000000000000'); 112 | * 113 | * console.log(uuid1.equals(uuid2)); // -> true 114 | * console.log(uuid1.equals('a9b6f8e4-7b3b-4c8f-8f8b-9e8e2d2b1c6d')); // -> true 115 | * console.log(uuid1.equals(uuid3)); // -> false 116 | * console.log(uuid1.equals('not-a-uuid')); // -> false 117 | * ``` 118 | */ 119 | equals(other: UUID | string): boolean { 120 | try { 121 | const otherBytes = other instanceof UUID ? other.#bytes : parse(String(other)); 122 | if (this.#bytes.length !== otherBytes.length) { 123 | return false; 124 | } 125 | for (let i = 0; i < this.#bytes.length; i++) { 126 | if (this.#bytes[i] !== otherBytes[i]) { 127 | return false; 128 | } 129 | } 130 | return true; 131 | } catch (e) { 132 | // If parsing the other string fails, they cannot be equal 133 | return false; 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @se-oss/uuid 2 | 3 | [![CI](https://github.com/shahradelahi/ts-uuid/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/shahradelahi/ts-uuid/actions/workflows/ci.yml) 4 | [![NPM Version](https://img.shields.io/npm/v/@se-oss/uuid.svg)](https://www.npmjs.com/package/@se-oss/uuid) 5 | [![MIT License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat)](/LICENSE) 6 | ![npm bundle size](https://img.shields.io/bundlephobia/minzip/@se-oss/uuid) 7 | [![Install Size](https://packagephobia.com/badge?p=@se-oss/uuid)](https://packagephobia.com/result?p=@se-oss/uuid) 8 | 9 | _@se-oss/uuid_ is a TypeScript library for generating and working with all modern UUID versions (1, 3, 4, 5, 6, and 7). It is designed to be lightweight, fast, and tree-shakable, making it suitable for any project. 10 | 11 | --- 12 | 13 | - [Installation](#-installation) 14 | - [Usage](#-usage) 15 | - [Documentation](#-documentation) 16 | - [Contributing](#-contributing) 17 | - [License](#license) 18 | 19 | ## 📦 Installation 20 | 21 | ```bash 22 | pnpm install @se-oss/uuid 23 | ``` 24 | 25 |
26 | Install using your favorite package manager 27 | 28 | **npm** 29 | 30 | ```bash 31 | npm install @se-oss/uuid 32 | ``` 33 | 34 | **yarn** 35 | 36 | ```bash 37 | yarn add @se-oss/uuid 38 | ``` 39 | 40 |
41 | 42 | ## 📖 Usage 43 | 44 | ### Quick Start: General-Purpose UUIDs (v4 & v7) 45 | 46 | For most use cases, you'll want either a completely random UUID (v4) or a time-sortable one (v7). 47 | 48 | ```typescript 49 | import { v4, v7 } from '@se-oss/uuid'; 50 | 51 | // Generate a random v4 UUID 52 | // Ideal for unique identifiers where order doesn't matter. 53 | const randomId = v4(); 54 | console.log('v4:', randomId); 55 | // -> e.g., '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed' 56 | 57 | // Generate a time-sortable v7 UUID 58 | // Perfect for database keys that need to be roughly sequential. 59 | const sortableId = v7(); 60 | console.log('v7:', sortableId); 61 | // -> e.g., '018f9e2c-0a8c-7b2a-8b0f-9e8e2d2b1c6d' 62 | ``` 63 | 64 | ### Time-Based UUIDs (v1, v6, v7) 65 | 66 | These UUIDs embed a timestamp, making them useful for tracking creation order. 67 | 68 | ```typescript 69 | import { getTimestamp, v1, v6, v7 } from '@se-oss/uuid'; 70 | 71 | // v1: Timestamp + MAC address (or random node) 72 | const v1Id = v1(); 73 | console.log('v1 Timestamp:', getTimestamp(v1Id)); // -> Date object 74 | 75 | // v6: Reordered timestamp for better database indexing 76 | const v6Id = v6(); 77 | console.log('v6 Timestamp:', getTimestamp(v6Id)); // -> Date object 78 | 79 | // v7: Unix Epoch timestamp (more modern and sortable) 80 | const v7Id = v7(); 81 | console.log('v7 Timestamp:', getTimestamp(v7Id)); // -> Date object 82 | ``` 83 | 84 | ### Name-Based UUIDs (v3 & v5) 85 | 86 | These generate a deterministic UUID based on a name and a namespace. The same inputs will always produce the same output. 87 | 88 | ```typescript 89 | import { NS, v3, v5 } from '@se-oss/uuid'; 90 | 91 | // Predefined namespaces are available for DNS, URL, etc. 92 | const namespace = NS.DNS; 93 | const name = 'hello.world'; 94 | 95 | // Generate a v3 (MD5) UUID 96 | const v3Id = await v3(name, namespace); 97 | console.log('v3:', v3Id); 98 | // -> '9f3784ab-23b0-3373-b262-01b3d68a27d3' 99 | 100 | // Generate a v5 (SHA-1) UUID 101 | const v5Id = await v5(name, namespace); 102 | console.log('v5:', v5Id); 103 | // -> '016f2f48-6366-5527-a36c-217e573a0a52' 104 | ``` 105 | 106 | ### Validation and Utilities 107 | 108 | The library includes helpers for working with UUIDs. 109 | 110 | ```typescript 111 | import { parse, stringify, validate, version } from '@se-oss/uuid'; 112 | 113 | const uuid = 'a9b6f8e4-7b3b-4c8f-8f8b-9e8e2d2b1c6d'; 114 | 115 | // Check if a string is a valid UUID 116 | console.log('Is valid?', validate(uuid)); // -> true 117 | console.log('Is valid?', validate('not-a-uuid')); // -> false 118 | 119 | // Get the version of a UUID 120 | console.log('Version:', version(uuid)); // -> 4 121 | 122 | // Parse a UUID string into a byte array (Uint8Array) 123 | const bytes = parse(uuid); 124 | console.log('Bytes:', bytes); 125 | // -> Uint8Array(16) [ 169, 182, 248, 228, ... ] 126 | 127 | // Convert a byte array back to a string 128 | const backToString = stringify(bytes); 129 | console.log('Stringified:', backToString); 130 | // -> 'a9b6f8e4-7b3b-4c8f-8f8b-9e8e2d2b1c6d' 131 | 132 | console.log('Are they equal?', uuid === backToString); // -> true 133 | ``` 134 | 135 | ### Object-Oriented Usage with the `UUID` Class 136 | 137 | For an object-oriented approach, you can use the `UUID` class. 138 | 139 | ```typescript 140 | import { UUID, v4, v7 } from '@se-oss/uuid'; 141 | 142 | // Create a UUID instance from a string 143 | const uuidV4 = new UUID(v4()); 144 | 145 | // Get version and bytes 146 | console.log('Version:', uuidV4.getVersion()); // -> 4 147 | console.log('Bytes:', uuidV4.toBytes()); // -> Uint8Array(16) 148 | 149 | // For time-based UUIDs, you can get the timestamp 150 | const uuidV7 = new UUID(v7()); 151 | console.log('Timestamp:', uuidV7.getTimestamp()); // -> Date object 152 | 153 | // Compare UUIDs for equality 154 | const anotherUuid = new UUID(uuidV4.toString()); 155 | console.log('Are they equal?', uuidV4.equals(anotherUuid)); // -> true 156 | ``` 157 | 158 | ## 📚 Documentation 159 | 160 | For all configuration options, please see [the API docs](https://www.jsdocs.io/package/@se-oss/uuid). 161 | 162 | ## 🤝 Contributing 163 | 164 | Want to contribute? Awesome! To show your support is to star the project, or to raise issues on [GitHub](https://github.com/shahradelahi/ts-uuid). 165 | 166 | Thanks again for your support, it is much appreciated! 🙏 167 | 168 | ## License 169 | 170 | [MIT](/LICENSE) © [Shahrad Elahi](https://github.com/shahradelahi) and [contributors](https://github.com/shahradelahi/ts-uuid/graphs/contributors). 171 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@se-oss/md5': 12 | specifier: ^1.0.0 13 | version: 1.0.0 14 | devDependencies: 15 | '@se-oss/delay': 16 | specifier: ^1.0.0 17 | version: 1.0.0 18 | '@shahrad/eslint-config': 19 | specifier: ^1.0.1 20 | version: 1.0.1(jiti@2.5.1)(typescript@5.9.3) 21 | '@shahrad/prettier-config': 22 | specifier: ^1.2.2 23 | version: 1.2.2(@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.7.4))(prettier-plugin-packagejson@2.5.18(prettier@3.7.4))(prettier-plugin-sh@0.15.0(prettier@3.7.4))(prettier@3.7.4) 24 | '@shahrad/tsconfig': 25 | specifier: ^1.2.0 26 | version: 1.2.0 27 | '@types/node': 28 | specifier: ^24.10.1 29 | version: 24.10.1 30 | '@vitest/browser-playwright': 31 | specifier: ^4.0.15 32 | version: 4.0.15(playwright@1.54.2)(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6))(vitest@4.0.15) 33 | eslint: 34 | specifier: ^9.39.1 35 | version: 9.39.1(jiti@2.5.1) 36 | globals: 37 | specifier: ^16.5.0 38 | version: 16.5.0 39 | prettier: 40 | specifier: ^3.7.4 41 | version: 3.7.4 42 | tsup: 43 | specifier: ^8.5.1 44 | version: 8.5.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3) 45 | typescript: 46 | specifier: ^5.9.3 47 | version: 5.9.3 48 | vitest: 49 | specifier: ^4.0.15 50 | version: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.5.1)(jsdom@27.1.0)(tsx@4.20.6) 51 | 52 | packages: 53 | 54 | '@acemir/cssom@0.9.26': 55 | resolution: {integrity: sha512-UMFbL3EnWH/eTvl21dz9s7Td4wYDMtxz/56zD8sL9IZGYyi48RxmdgPMiyT7R6Vn3rjMTwYZ42bqKa7ex74GEQ==} 56 | 57 | '@asamuzakjp/css-color@4.1.0': 58 | resolution: {integrity: sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==} 59 | 60 | '@asamuzakjp/dom-selector@6.7.6': 61 | resolution: {integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==} 62 | 63 | '@asamuzakjp/nwsapi@2.3.9': 64 | resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} 65 | 66 | '@babel/code-frame@7.27.1': 67 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 68 | engines: {node: '>=6.9.0'} 69 | 70 | '@babel/generator@7.28.5': 71 | resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 72 | engines: {node: '>=6.9.0'} 73 | 74 | '@babel/helper-globals@7.28.0': 75 | resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 76 | engines: {node: '>=6.9.0'} 77 | 78 | '@babel/helper-string-parser@7.27.1': 79 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 80 | engines: {node: '>=6.9.0'} 81 | 82 | '@babel/helper-validator-identifier@7.28.5': 83 | resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 84 | engines: {node: '>=6.9.0'} 85 | 86 | '@babel/parser@7.28.5': 87 | resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 88 | engines: {node: '>=6.0.0'} 89 | hasBin: true 90 | 91 | '@babel/template@7.27.2': 92 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 93 | engines: {node: '>=6.9.0'} 94 | 95 | '@babel/traverse@7.28.5': 96 | resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 97 | engines: {node: '>=6.9.0'} 98 | 99 | '@babel/types@7.28.5': 100 | resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 101 | engines: {node: '>=6.9.0'} 102 | 103 | '@csstools/color-helpers@5.1.0': 104 | resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} 105 | engines: {node: '>=18'} 106 | 107 | '@csstools/css-calc@2.1.4': 108 | resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} 109 | engines: {node: '>=18'} 110 | peerDependencies: 111 | '@csstools/css-parser-algorithms': ^3.0.5 112 | '@csstools/css-tokenizer': ^3.0.4 113 | 114 | '@csstools/css-color-parser@3.1.0': 115 | resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} 116 | engines: {node: '>=18'} 117 | peerDependencies: 118 | '@csstools/css-parser-algorithms': ^3.0.5 119 | '@csstools/css-tokenizer': ^3.0.4 120 | 121 | '@csstools/css-parser-algorithms@3.0.5': 122 | resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} 123 | engines: {node: '>=18'} 124 | peerDependencies: 125 | '@csstools/css-tokenizer': ^3.0.4 126 | 127 | '@csstools/css-syntax-patches-for-csstree@1.0.20': 128 | resolution: {integrity: sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==} 129 | engines: {node: '>=18'} 130 | 131 | '@csstools/css-tokenizer@3.0.4': 132 | resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} 133 | engines: {node: '>=18'} 134 | 135 | '@esbuild/aix-ppc64@0.25.12': 136 | resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 137 | engines: {node: '>=18'} 138 | cpu: [ppc64] 139 | os: [aix] 140 | 141 | '@esbuild/aix-ppc64@0.27.0': 142 | resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} 143 | engines: {node: '>=18'} 144 | cpu: [ppc64] 145 | os: [aix] 146 | 147 | '@esbuild/android-arm64@0.25.12': 148 | resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 149 | engines: {node: '>=18'} 150 | cpu: [arm64] 151 | os: [android] 152 | 153 | '@esbuild/android-arm64@0.27.0': 154 | resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} 155 | engines: {node: '>=18'} 156 | cpu: [arm64] 157 | os: [android] 158 | 159 | '@esbuild/android-arm@0.25.12': 160 | resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 161 | engines: {node: '>=18'} 162 | cpu: [arm] 163 | os: [android] 164 | 165 | '@esbuild/android-arm@0.27.0': 166 | resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} 167 | engines: {node: '>=18'} 168 | cpu: [arm] 169 | os: [android] 170 | 171 | '@esbuild/android-x64@0.25.12': 172 | resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 173 | engines: {node: '>=18'} 174 | cpu: [x64] 175 | os: [android] 176 | 177 | '@esbuild/android-x64@0.27.0': 178 | resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} 179 | engines: {node: '>=18'} 180 | cpu: [x64] 181 | os: [android] 182 | 183 | '@esbuild/darwin-arm64@0.25.12': 184 | resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 185 | engines: {node: '>=18'} 186 | cpu: [arm64] 187 | os: [darwin] 188 | 189 | '@esbuild/darwin-arm64@0.27.0': 190 | resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} 191 | engines: {node: '>=18'} 192 | cpu: [arm64] 193 | os: [darwin] 194 | 195 | '@esbuild/darwin-x64@0.25.12': 196 | resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 197 | engines: {node: '>=18'} 198 | cpu: [x64] 199 | os: [darwin] 200 | 201 | '@esbuild/darwin-x64@0.27.0': 202 | resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} 203 | engines: {node: '>=18'} 204 | cpu: [x64] 205 | os: [darwin] 206 | 207 | '@esbuild/freebsd-arm64@0.25.12': 208 | resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 209 | engines: {node: '>=18'} 210 | cpu: [arm64] 211 | os: [freebsd] 212 | 213 | '@esbuild/freebsd-arm64@0.27.0': 214 | resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} 215 | engines: {node: '>=18'} 216 | cpu: [arm64] 217 | os: [freebsd] 218 | 219 | '@esbuild/freebsd-x64@0.25.12': 220 | resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 221 | engines: {node: '>=18'} 222 | cpu: [x64] 223 | os: [freebsd] 224 | 225 | '@esbuild/freebsd-x64@0.27.0': 226 | resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} 227 | engines: {node: '>=18'} 228 | cpu: [x64] 229 | os: [freebsd] 230 | 231 | '@esbuild/linux-arm64@0.25.12': 232 | resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 233 | engines: {node: '>=18'} 234 | cpu: [arm64] 235 | os: [linux] 236 | 237 | '@esbuild/linux-arm64@0.27.0': 238 | resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} 239 | engines: {node: '>=18'} 240 | cpu: [arm64] 241 | os: [linux] 242 | 243 | '@esbuild/linux-arm@0.25.12': 244 | resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 245 | engines: {node: '>=18'} 246 | cpu: [arm] 247 | os: [linux] 248 | 249 | '@esbuild/linux-arm@0.27.0': 250 | resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} 251 | engines: {node: '>=18'} 252 | cpu: [arm] 253 | os: [linux] 254 | 255 | '@esbuild/linux-ia32@0.25.12': 256 | resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 257 | engines: {node: '>=18'} 258 | cpu: [ia32] 259 | os: [linux] 260 | 261 | '@esbuild/linux-ia32@0.27.0': 262 | resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} 263 | engines: {node: '>=18'} 264 | cpu: [ia32] 265 | os: [linux] 266 | 267 | '@esbuild/linux-loong64@0.25.12': 268 | resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 269 | engines: {node: '>=18'} 270 | cpu: [loong64] 271 | os: [linux] 272 | 273 | '@esbuild/linux-loong64@0.27.0': 274 | resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} 275 | engines: {node: '>=18'} 276 | cpu: [loong64] 277 | os: [linux] 278 | 279 | '@esbuild/linux-mips64el@0.25.12': 280 | resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 281 | engines: {node: '>=18'} 282 | cpu: [mips64el] 283 | os: [linux] 284 | 285 | '@esbuild/linux-mips64el@0.27.0': 286 | resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} 287 | engines: {node: '>=18'} 288 | cpu: [mips64el] 289 | os: [linux] 290 | 291 | '@esbuild/linux-ppc64@0.25.12': 292 | resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 293 | engines: {node: '>=18'} 294 | cpu: [ppc64] 295 | os: [linux] 296 | 297 | '@esbuild/linux-ppc64@0.27.0': 298 | resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} 299 | engines: {node: '>=18'} 300 | cpu: [ppc64] 301 | os: [linux] 302 | 303 | '@esbuild/linux-riscv64@0.25.12': 304 | resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 305 | engines: {node: '>=18'} 306 | cpu: [riscv64] 307 | os: [linux] 308 | 309 | '@esbuild/linux-riscv64@0.27.0': 310 | resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} 311 | engines: {node: '>=18'} 312 | cpu: [riscv64] 313 | os: [linux] 314 | 315 | '@esbuild/linux-s390x@0.25.12': 316 | resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 317 | engines: {node: '>=18'} 318 | cpu: [s390x] 319 | os: [linux] 320 | 321 | '@esbuild/linux-s390x@0.27.0': 322 | resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} 323 | engines: {node: '>=18'} 324 | cpu: [s390x] 325 | os: [linux] 326 | 327 | '@esbuild/linux-x64@0.25.12': 328 | resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 329 | engines: {node: '>=18'} 330 | cpu: [x64] 331 | os: [linux] 332 | 333 | '@esbuild/linux-x64@0.27.0': 334 | resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} 335 | engines: {node: '>=18'} 336 | cpu: [x64] 337 | os: [linux] 338 | 339 | '@esbuild/netbsd-arm64@0.25.12': 340 | resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 341 | engines: {node: '>=18'} 342 | cpu: [arm64] 343 | os: [netbsd] 344 | 345 | '@esbuild/netbsd-arm64@0.27.0': 346 | resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} 347 | engines: {node: '>=18'} 348 | cpu: [arm64] 349 | os: [netbsd] 350 | 351 | '@esbuild/netbsd-x64@0.25.12': 352 | resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 353 | engines: {node: '>=18'} 354 | cpu: [x64] 355 | os: [netbsd] 356 | 357 | '@esbuild/netbsd-x64@0.27.0': 358 | resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} 359 | engines: {node: '>=18'} 360 | cpu: [x64] 361 | os: [netbsd] 362 | 363 | '@esbuild/openbsd-arm64@0.25.12': 364 | resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 365 | engines: {node: '>=18'} 366 | cpu: [arm64] 367 | os: [openbsd] 368 | 369 | '@esbuild/openbsd-arm64@0.27.0': 370 | resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} 371 | engines: {node: '>=18'} 372 | cpu: [arm64] 373 | os: [openbsd] 374 | 375 | '@esbuild/openbsd-x64@0.25.12': 376 | resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 377 | engines: {node: '>=18'} 378 | cpu: [x64] 379 | os: [openbsd] 380 | 381 | '@esbuild/openbsd-x64@0.27.0': 382 | resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} 383 | engines: {node: '>=18'} 384 | cpu: [x64] 385 | os: [openbsd] 386 | 387 | '@esbuild/openharmony-arm64@0.25.12': 388 | resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 389 | engines: {node: '>=18'} 390 | cpu: [arm64] 391 | os: [openharmony] 392 | 393 | '@esbuild/openharmony-arm64@0.27.0': 394 | resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} 395 | engines: {node: '>=18'} 396 | cpu: [arm64] 397 | os: [openharmony] 398 | 399 | '@esbuild/sunos-x64@0.25.12': 400 | resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 401 | engines: {node: '>=18'} 402 | cpu: [x64] 403 | os: [sunos] 404 | 405 | '@esbuild/sunos-x64@0.27.0': 406 | resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} 407 | engines: {node: '>=18'} 408 | cpu: [x64] 409 | os: [sunos] 410 | 411 | '@esbuild/win32-arm64@0.25.12': 412 | resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 413 | engines: {node: '>=18'} 414 | cpu: [arm64] 415 | os: [win32] 416 | 417 | '@esbuild/win32-arm64@0.27.0': 418 | resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} 419 | engines: {node: '>=18'} 420 | cpu: [arm64] 421 | os: [win32] 422 | 423 | '@esbuild/win32-ia32@0.25.12': 424 | resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 425 | engines: {node: '>=18'} 426 | cpu: [ia32] 427 | os: [win32] 428 | 429 | '@esbuild/win32-ia32@0.27.0': 430 | resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} 431 | engines: {node: '>=18'} 432 | cpu: [ia32] 433 | os: [win32] 434 | 435 | '@esbuild/win32-x64@0.25.12': 436 | resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 437 | engines: {node: '>=18'} 438 | cpu: [x64] 439 | os: [win32] 440 | 441 | '@esbuild/win32-x64@0.27.0': 442 | resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} 443 | engines: {node: '>=18'} 444 | cpu: [x64] 445 | os: [win32] 446 | 447 | '@eslint-community/eslint-utils@4.9.0': 448 | resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 449 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 450 | peerDependencies: 451 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 452 | 453 | '@eslint-community/regexpp@4.12.2': 454 | resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 455 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 456 | 457 | '@eslint/config-array@0.21.1': 458 | resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 459 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 460 | 461 | '@eslint/config-helpers@0.4.2': 462 | resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 463 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 464 | 465 | '@eslint/core@0.17.0': 466 | resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 467 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 468 | 469 | '@eslint/eslintrc@3.3.1': 470 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 471 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 472 | 473 | '@eslint/js@9.39.1': 474 | resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} 475 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 476 | 477 | '@eslint/object-schema@2.1.7': 478 | resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 479 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 480 | 481 | '@eslint/plugin-kit@0.4.1': 482 | resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 483 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 484 | 485 | '@humanfs/core@0.19.1': 486 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 487 | engines: {node: '>=18.18.0'} 488 | 489 | '@humanfs/node@0.16.7': 490 | resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 491 | engines: {node: '>=18.18.0'} 492 | 493 | '@humanwhocodes/module-importer@1.0.1': 494 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 495 | engines: {node: '>=12.22'} 496 | 497 | '@humanwhocodes/retry@0.4.3': 498 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 499 | engines: {node: '>=18.18'} 500 | 501 | '@ianvs/prettier-plugin-sort-imports@4.5.1': 502 | resolution: {integrity: sha512-vOQwIyQHnHz0ikvHEQDzwUkNfX74o/7qNEpm9LiPtyBvCg/AU/DOkhwe1o92chPS1QzS6G7HeiO+OwIt8a358A==} 503 | peerDependencies: 504 | '@prettier/plugin-oxc': ^0.0.4 505 | '@vue/compiler-sfc': 2.7.x || 3.x 506 | prettier: 2 || 3 || ^4.0.0-0 507 | peerDependenciesMeta: 508 | '@prettier/plugin-oxc': 509 | optional: true 510 | '@vue/compiler-sfc': 511 | optional: true 512 | 513 | '@isaacs/cliui@8.0.2': 514 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 515 | engines: {node: '>=12'} 516 | 517 | '@jridgewell/gen-mapping@0.3.13': 518 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 519 | 520 | '@jridgewell/resolve-uri@3.1.2': 521 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 522 | engines: {node: '>=6.0.0'} 523 | 524 | '@jridgewell/sourcemap-codec@1.5.5': 525 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 526 | 527 | '@jridgewell/trace-mapping@0.3.31': 528 | resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 529 | 530 | '@nodelib/fs.scandir@2.1.5': 531 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 532 | engines: {node: '>= 8'} 533 | 534 | '@nodelib/fs.stat@2.0.5': 535 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 536 | engines: {node: '>= 8'} 537 | 538 | '@nodelib/fs.walk@1.2.8': 539 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 540 | engines: {node: '>= 8'} 541 | 542 | '@pkgjs/parseargs@0.11.0': 543 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 544 | engines: {node: '>=14'} 545 | 546 | '@pkgr/core@0.2.9': 547 | resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} 548 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 549 | 550 | '@polka/url@1.0.0-next.29': 551 | resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 552 | 553 | '@rollup/rollup-android-arm-eabi@4.52.5': 554 | resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} 555 | cpu: [arm] 556 | os: [android] 557 | 558 | '@rollup/rollup-android-arm64@4.52.5': 559 | resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} 560 | cpu: [arm64] 561 | os: [android] 562 | 563 | '@rollup/rollup-darwin-arm64@4.52.5': 564 | resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} 565 | cpu: [arm64] 566 | os: [darwin] 567 | 568 | '@rollup/rollup-darwin-x64@4.52.5': 569 | resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} 570 | cpu: [x64] 571 | os: [darwin] 572 | 573 | '@rollup/rollup-freebsd-arm64@4.52.5': 574 | resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} 575 | cpu: [arm64] 576 | os: [freebsd] 577 | 578 | '@rollup/rollup-freebsd-x64@4.52.5': 579 | resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} 580 | cpu: [x64] 581 | os: [freebsd] 582 | 583 | '@rollup/rollup-linux-arm-gnueabihf@4.52.5': 584 | resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} 585 | cpu: [arm] 586 | os: [linux] 587 | 588 | '@rollup/rollup-linux-arm-musleabihf@4.52.5': 589 | resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} 590 | cpu: [arm] 591 | os: [linux] 592 | 593 | '@rollup/rollup-linux-arm64-gnu@4.52.5': 594 | resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} 595 | cpu: [arm64] 596 | os: [linux] 597 | 598 | '@rollup/rollup-linux-arm64-musl@4.52.5': 599 | resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} 600 | cpu: [arm64] 601 | os: [linux] 602 | 603 | '@rollup/rollup-linux-loong64-gnu@4.52.5': 604 | resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} 605 | cpu: [loong64] 606 | os: [linux] 607 | 608 | '@rollup/rollup-linux-ppc64-gnu@4.52.5': 609 | resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} 610 | cpu: [ppc64] 611 | os: [linux] 612 | 613 | '@rollup/rollup-linux-riscv64-gnu@4.52.5': 614 | resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} 615 | cpu: [riscv64] 616 | os: [linux] 617 | 618 | '@rollup/rollup-linux-riscv64-musl@4.52.5': 619 | resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} 620 | cpu: [riscv64] 621 | os: [linux] 622 | 623 | '@rollup/rollup-linux-s390x-gnu@4.52.5': 624 | resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} 625 | cpu: [s390x] 626 | os: [linux] 627 | 628 | '@rollup/rollup-linux-x64-gnu@4.52.5': 629 | resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} 630 | cpu: [x64] 631 | os: [linux] 632 | 633 | '@rollup/rollup-linux-x64-musl@4.52.5': 634 | resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} 635 | cpu: [x64] 636 | os: [linux] 637 | 638 | '@rollup/rollup-openharmony-arm64@4.52.5': 639 | resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} 640 | cpu: [arm64] 641 | os: [openharmony] 642 | 643 | '@rollup/rollup-win32-arm64-msvc@4.52.5': 644 | resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} 645 | cpu: [arm64] 646 | os: [win32] 647 | 648 | '@rollup/rollup-win32-ia32-msvc@4.52.5': 649 | resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} 650 | cpu: [ia32] 651 | os: [win32] 652 | 653 | '@rollup/rollup-win32-x64-gnu@4.52.5': 654 | resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} 655 | cpu: [x64] 656 | os: [win32] 657 | 658 | '@rollup/rollup-win32-x64-msvc@4.52.5': 659 | resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} 660 | cpu: [x64] 661 | os: [win32] 662 | 663 | '@se-oss/delay@1.0.0': 664 | resolution: {integrity: sha512-T92MXFaMCGf7OzeYYtl3Mmjr3mTUziirg5z+aTPTxMnENEBdtFhXP700rvvCca5g734rClAm4AkxypzND2Dd5A==} 665 | 666 | '@se-oss/md5@1.0.0': 667 | resolution: {integrity: sha512-17TRv9Sy/WbZWhKUmNzB/KTyVK6C1zA2L1hcu5n9smfx+w4d/tidZ0adeLXOOrTkyj471oiRo3hyIRSqLAflcQ==} 668 | 669 | '@se-oss/rand@1.1.0': 670 | resolution: {integrity: sha512-rg12tp2MwKzPkdhdP6hM1LdyWdvkm/LmQJaS01Y1zvAxQ4TuVxy1y3Zobh3eSHpDe3fngiMk+S6Q3MR8feybxA==} 671 | 672 | '@se-oss/timeout@1.0.0': 673 | resolution: {integrity: sha512-6BzRNln0bUcnINgxM3vuOPMJAQBmD95pN+cL6mBez5ILlpIjjWpteSLS3Z66g7oLcNE4v7lLHJe596u22+U8Mw==} 674 | 675 | '@shahrad/eslint-config@1.0.1': 676 | resolution: {integrity: sha512-Gfjh8cdcptBjL14dWACJZ0tZy8KJdcVsOVWmyKa82v5PoLPZ4avMrT1hJyEWg0APhS1054M/udaBrlCAuHJ9XQ==} 677 | 678 | '@shahrad/prettier-config@1.2.2': 679 | resolution: {integrity: sha512-D6yRqGjD9mhdC5cWQkdoatybNmp6eZJZQ1IerFaANQL1pgtNyEasE2yFy3JdDxJRbHcL2GeaI/03tEPchU+Ddw==} 680 | peerDependencies: 681 | '@ianvs/prettier-plugin-sort-imports': ^4.4 682 | prettier: '>=3.0.0' 683 | prettier-plugin-packagejson: ^2.5 684 | prettier-plugin-sh: ^0.15 685 | 686 | '@shahrad/tsconfig@1.2.0': 687 | resolution: {integrity: sha512-5NM7tPrvUGF+VPqNgsjgWJ5aLJBcNiM/7aAsXw3PEZVek4Mfxq4vd7BLbjUsYd9HizgaNeCmfK5kIsxtCXp7/Q==} 688 | engines: {node: '>=18'} 689 | 690 | '@standard-schema/spec@1.0.0': 691 | resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} 692 | 693 | '@types/chai@5.2.3': 694 | resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} 695 | 696 | '@types/deep-eql@4.0.2': 697 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 698 | 699 | '@types/estree@1.0.8': 700 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 701 | 702 | '@types/json-schema@7.0.15': 703 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 704 | 705 | '@types/node@24.10.1': 706 | resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} 707 | 708 | '@typescript-eslint/eslint-plugin@8.46.2': 709 | resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} 710 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 711 | peerDependencies: 712 | '@typescript-eslint/parser': ^8.46.2 713 | eslint: ^8.57.0 || ^9.0.0 714 | typescript: '>=4.8.4 <6.0.0' 715 | 716 | '@typescript-eslint/parser@8.46.2': 717 | resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} 718 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 719 | peerDependencies: 720 | eslint: ^8.57.0 || ^9.0.0 721 | typescript: '>=4.8.4 <6.0.0' 722 | 723 | '@typescript-eslint/project-service@8.46.2': 724 | resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} 725 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 726 | peerDependencies: 727 | typescript: '>=4.8.4 <6.0.0' 728 | 729 | '@typescript-eslint/scope-manager@8.46.2': 730 | resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} 731 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 732 | 733 | '@typescript-eslint/tsconfig-utils@8.46.2': 734 | resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} 735 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 736 | peerDependencies: 737 | typescript: '>=4.8.4 <6.0.0' 738 | 739 | '@typescript-eslint/type-utils@8.46.2': 740 | resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} 741 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 742 | peerDependencies: 743 | eslint: ^8.57.0 || ^9.0.0 744 | typescript: '>=4.8.4 <6.0.0' 745 | 746 | '@typescript-eslint/types@8.46.2': 747 | resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} 748 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 749 | 750 | '@typescript-eslint/typescript-estree@8.46.2': 751 | resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} 752 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 753 | peerDependencies: 754 | typescript: '>=4.8.4 <6.0.0' 755 | 756 | '@typescript-eslint/utils@8.46.2': 757 | resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} 758 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 759 | peerDependencies: 760 | eslint: ^8.57.0 || ^9.0.0 761 | typescript: '>=4.8.4 <6.0.0' 762 | 763 | '@typescript-eslint/visitor-keys@8.46.2': 764 | resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} 765 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 766 | 767 | '@vitest/browser-playwright@4.0.15': 768 | resolution: {integrity: sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==} 769 | peerDependencies: 770 | playwright: '*' 771 | vitest: 4.0.15 772 | 773 | '@vitest/browser@4.0.15': 774 | resolution: {integrity: sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==} 775 | peerDependencies: 776 | vitest: 4.0.15 777 | 778 | '@vitest/expect@4.0.15': 779 | resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} 780 | 781 | '@vitest/mocker@4.0.15': 782 | resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} 783 | peerDependencies: 784 | msw: ^2.4.9 785 | vite: ^6.0.0 || ^7.0.0-0 786 | peerDependenciesMeta: 787 | msw: 788 | optional: true 789 | vite: 790 | optional: true 791 | 792 | '@vitest/pretty-format@4.0.15': 793 | resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} 794 | 795 | '@vitest/runner@4.0.15': 796 | resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} 797 | 798 | '@vitest/snapshot@4.0.15': 799 | resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} 800 | 801 | '@vitest/spy@4.0.15': 802 | resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} 803 | 804 | '@vitest/utils@4.0.15': 805 | resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} 806 | 807 | acorn-jsx@5.3.2: 808 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 809 | peerDependencies: 810 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 811 | 812 | acorn@8.15.0: 813 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 814 | engines: {node: '>=0.4.0'} 815 | hasBin: true 816 | 817 | agent-base@7.1.4: 818 | resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} 819 | engines: {node: '>= 14'} 820 | 821 | ajv@6.12.6: 822 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 823 | 824 | ansi-regex@5.0.1: 825 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 826 | engines: {node: '>=8'} 827 | 828 | ansi-regex@6.2.2: 829 | resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} 830 | engines: {node: '>=12'} 831 | 832 | ansi-styles@4.3.0: 833 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 834 | engines: {node: '>=8'} 835 | 836 | ansi-styles@6.2.3: 837 | resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} 838 | engines: {node: '>=12'} 839 | 840 | any-promise@1.3.0: 841 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 842 | 843 | argparse@2.0.1: 844 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 845 | 846 | assertion-error@2.0.1: 847 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 848 | engines: {node: '>=12'} 849 | 850 | balanced-match@1.0.2: 851 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 852 | 853 | bidi-js@1.0.3: 854 | resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} 855 | 856 | brace-expansion@1.1.12: 857 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 858 | 859 | brace-expansion@2.0.2: 860 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 861 | 862 | braces@3.0.3: 863 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 864 | engines: {node: '>=8'} 865 | 866 | bundle-require@5.1.0: 867 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 868 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 869 | peerDependencies: 870 | esbuild: '>=0.18' 871 | 872 | cac@6.7.14: 873 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 874 | engines: {node: '>=8'} 875 | 876 | callsites@3.1.0: 877 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 878 | engines: {node: '>=6'} 879 | 880 | chai@6.2.1: 881 | resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} 882 | engines: {node: '>=18'} 883 | 884 | chalk@4.1.2: 885 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 886 | engines: {node: '>=10'} 887 | 888 | chokidar@4.0.3: 889 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 890 | engines: {node: '>= 14.16.0'} 891 | 892 | color-convert@2.0.1: 893 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 894 | engines: {node: '>=7.0.0'} 895 | 896 | color-name@1.1.4: 897 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 898 | 899 | commander@4.1.1: 900 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 901 | engines: {node: '>= 6'} 902 | 903 | concat-map@0.0.1: 904 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 905 | 906 | confbox@0.1.8: 907 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 908 | 909 | consola@3.4.2: 910 | resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 911 | engines: {node: ^14.18.0 || >=16.10.0} 912 | 913 | cross-spawn@7.0.6: 914 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 915 | engines: {node: '>= 8'} 916 | 917 | css-tree@3.1.0: 918 | resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} 919 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 920 | 921 | cssstyle@5.3.2: 922 | resolution: {integrity: sha512-zDMqXh8Vs1CdRYZQ2M633m/SFgcjlu8RB8b/1h82i+6vpArF507NSYIWJHGlJaTWoS+imcnctmEz43txhbVkOw==} 923 | engines: {node: '>=20'} 924 | 925 | data-urls@6.0.0: 926 | resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} 927 | engines: {node: '>=20'} 928 | 929 | debug@4.4.3: 930 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 931 | engines: {node: '>=6.0'} 932 | peerDependencies: 933 | supports-color: '*' 934 | peerDependenciesMeta: 935 | supports-color: 936 | optional: true 937 | 938 | decimal.js@10.6.0: 939 | resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} 940 | 941 | deep-is@0.1.4: 942 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 943 | 944 | detect-indent@7.0.2: 945 | resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} 946 | engines: {node: '>=12.20'} 947 | 948 | detect-newline@4.0.1: 949 | resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} 950 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 951 | 952 | eastasianwidth@0.2.0: 953 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 954 | 955 | emoji-regex@8.0.0: 956 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 957 | 958 | emoji-regex@9.2.2: 959 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 960 | 961 | entities@6.0.1: 962 | resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 963 | engines: {node: '>=0.12'} 964 | 965 | es-module-lexer@1.7.0: 966 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 967 | 968 | esbuild@0.25.12: 969 | resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 970 | engines: {node: '>=18'} 971 | hasBin: true 972 | 973 | esbuild@0.27.0: 974 | resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} 975 | engines: {node: '>=18'} 976 | hasBin: true 977 | 978 | escape-string-regexp@4.0.0: 979 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 980 | engines: {node: '>=10'} 981 | 982 | eslint-scope@8.4.0: 983 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 984 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 985 | 986 | eslint-visitor-keys@3.4.3: 987 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 988 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 989 | 990 | eslint-visitor-keys@4.2.1: 991 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 992 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 993 | 994 | eslint@9.39.1: 995 | resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} 996 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 997 | hasBin: true 998 | peerDependencies: 999 | jiti: '*' 1000 | peerDependenciesMeta: 1001 | jiti: 1002 | optional: true 1003 | 1004 | espree@10.4.0: 1005 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 1006 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1007 | 1008 | esquery@1.6.0: 1009 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 1010 | engines: {node: '>=0.10'} 1011 | 1012 | esrecurse@4.3.0: 1013 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1014 | engines: {node: '>=4.0'} 1015 | 1016 | estraverse@5.3.0: 1017 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1018 | engines: {node: '>=4.0'} 1019 | 1020 | estree-walker@3.0.3: 1021 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1022 | 1023 | esutils@2.0.3: 1024 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1025 | engines: {node: '>=0.10.0'} 1026 | 1027 | expect-type@1.2.2: 1028 | resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 1029 | engines: {node: '>=12.0.0'} 1030 | 1031 | fast-deep-equal@3.1.3: 1032 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1033 | 1034 | fast-glob@3.3.3: 1035 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 1036 | engines: {node: '>=8.6.0'} 1037 | 1038 | fast-json-stable-stringify@2.1.0: 1039 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1040 | 1041 | fast-levenshtein@2.0.6: 1042 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1043 | 1044 | fastq@1.19.1: 1045 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 1046 | 1047 | fdir@6.5.0: 1048 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 1049 | engines: {node: '>=12.0.0'} 1050 | peerDependencies: 1051 | picomatch: ^3 || ^4 1052 | peerDependenciesMeta: 1053 | picomatch: 1054 | optional: true 1055 | 1056 | file-entry-cache@8.0.0: 1057 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1058 | engines: {node: '>=16.0.0'} 1059 | 1060 | fill-range@7.1.1: 1061 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1062 | engines: {node: '>=8'} 1063 | 1064 | find-up@5.0.0: 1065 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1066 | engines: {node: '>=10'} 1067 | 1068 | fix-dts-default-cjs-exports@1.0.1: 1069 | resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} 1070 | 1071 | flat-cache@4.0.1: 1072 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1073 | engines: {node: '>=16'} 1074 | 1075 | flatted@3.3.3: 1076 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 1077 | 1078 | foreground-child@3.3.1: 1079 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 1080 | engines: {node: '>=14'} 1081 | 1082 | fsevents@2.3.2: 1083 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1084 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1085 | os: [darwin] 1086 | 1087 | fsevents@2.3.3: 1088 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1089 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1090 | os: [darwin] 1091 | 1092 | get-tsconfig@4.13.0: 1093 | resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 1094 | 1095 | git-hooks-list@4.1.1: 1096 | resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} 1097 | 1098 | glob-parent@5.1.2: 1099 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1100 | engines: {node: '>= 6'} 1101 | 1102 | glob-parent@6.0.2: 1103 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1104 | engines: {node: '>=10.13.0'} 1105 | 1106 | glob@10.4.5: 1107 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 1108 | hasBin: true 1109 | 1110 | globals@14.0.0: 1111 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1112 | engines: {node: '>=18'} 1113 | 1114 | globals@16.5.0: 1115 | resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} 1116 | engines: {node: '>=18'} 1117 | 1118 | graphemer@1.4.0: 1119 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1120 | 1121 | has-flag@4.0.0: 1122 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1123 | engines: {node: '>=8'} 1124 | 1125 | html-encoding-sniffer@4.0.0: 1126 | resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} 1127 | engines: {node: '>=18'} 1128 | 1129 | http-proxy-agent@7.0.2: 1130 | resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} 1131 | engines: {node: '>= 14'} 1132 | 1133 | https-proxy-agent@7.0.6: 1134 | resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} 1135 | engines: {node: '>= 14'} 1136 | 1137 | iconv-lite@0.6.3: 1138 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1139 | engines: {node: '>=0.10.0'} 1140 | 1141 | ignore@5.3.2: 1142 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1143 | engines: {node: '>= 4'} 1144 | 1145 | ignore@7.0.5: 1146 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 1147 | engines: {node: '>= 4'} 1148 | 1149 | import-fresh@3.3.1: 1150 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1151 | engines: {node: '>=6'} 1152 | 1153 | imurmurhash@0.1.4: 1154 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1155 | engines: {node: '>=0.8.19'} 1156 | 1157 | is-extglob@2.1.1: 1158 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1159 | engines: {node: '>=0.10.0'} 1160 | 1161 | is-fullwidth-code-point@3.0.0: 1162 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1163 | engines: {node: '>=8'} 1164 | 1165 | is-glob@4.0.3: 1166 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1167 | engines: {node: '>=0.10.0'} 1168 | 1169 | is-number@7.0.0: 1170 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1171 | engines: {node: '>=0.12.0'} 1172 | 1173 | is-plain-obj@4.1.0: 1174 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 1175 | engines: {node: '>=12'} 1176 | 1177 | is-potential-custom-element-name@1.0.1: 1178 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 1179 | 1180 | isexe@2.0.0: 1181 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1182 | 1183 | jackspeak@3.4.3: 1184 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1185 | 1186 | jiti@2.5.1: 1187 | resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} 1188 | hasBin: true 1189 | 1190 | joycon@3.1.1: 1191 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1192 | engines: {node: '>=10'} 1193 | 1194 | js-tokens@4.0.0: 1195 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1196 | 1197 | js-yaml@4.1.0: 1198 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1199 | hasBin: true 1200 | 1201 | jsdom@27.1.0: 1202 | resolution: {integrity: sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==} 1203 | engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} 1204 | peerDependencies: 1205 | canvas: ^3.0.0 1206 | peerDependenciesMeta: 1207 | canvas: 1208 | optional: true 1209 | 1210 | jsesc@3.1.0: 1211 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1212 | engines: {node: '>=6'} 1213 | hasBin: true 1214 | 1215 | json-buffer@3.0.1: 1216 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1217 | 1218 | json-schema-traverse@0.4.1: 1219 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1220 | 1221 | json-stable-stringify-without-jsonify@1.0.1: 1222 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1223 | 1224 | keyv@4.5.4: 1225 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1226 | 1227 | levn@0.4.1: 1228 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1229 | engines: {node: '>= 0.8.0'} 1230 | 1231 | lilconfig@3.1.3: 1232 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 1233 | engines: {node: '>=14'} 1234 | 1235 | lines-and-columns@1.2.4: 1236 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1237 | 1238 | load-tsconfig@0.2.5: 1239 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1240 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1241 | 1242 | locate-path@6.0.0: 1243 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1244 | engines: {node: '>=10'} 1245 | 1246 | lodash.merge@4.6.2: 1247 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1248 | 1249 | lru-cache@10.4.3: 1250 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1251 | 1252 | lru-cache@11.2.4: 1253 | resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} 1254 | engines: {node: 20 || >=22} 1255 | 1256 | magic-string@0.30.21: 1257 | resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1258 | 1259 | mdn-data@2.12.2: 1260 | resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} 1261 | 1262 | merge2@1.4.1: 1263 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1264 | engines: {node: '>= 8'} 1265 | 1266 | micromatch@4.0.8: 1267 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1268 | engines: {node: '>=8.6'} 1269 | 1270 | minimatch@3.1.2: 1271 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1272 | 1273 | minimatch@9.0.5: 1274 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1275 | engines: {node: '>=16 || 14 >=14.17'} 1276 | 1277 | minipass@7.1.2: 1278 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1279 | engines: {node: '>=16 || 14 >=14.17'} 1280 | 1281 | mlly@1.8.0: 1282 | resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 1283 | 1284 | mrmime@2.0.1: 1285 | resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1286 | engines: {node: '>=10'} 1287 | 1288 | ms@2.1.3: 1289 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1290 | 1291 | mvdan-sh@0.10.1: 1292 | resolution: {integrity: sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==} 1293 | deprecated: See https://github.com/mvdan/sh/issues/1145 1294 | 1295 | mz@2.7.0: 1296 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1297 | 1298 | nanoid@3.3.11: 1299 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1300 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1301 | hasBin: true 1302 | 1303 | natural-compare@1.4.0: 1304 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1305 | 1306 | object-assign@4.1.1: 1307 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1308 | engines: {node: '>=0.10.0'} 1309 | 1310 | obug@2.1.1: 1311 | resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} 1312 | 1313 | optionator@0.9.4: 1314 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1315 | engines: {node: '>= 0.8.0'} 1316 | 1317 | p-limit@3.1.0: 1318 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1319 | engines: {node: '>=10'} 1320 | 1321 | p-locate@5.0.0: 1322 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1323 | engines: {node: '>=10'} 1324 | 1325 | package-json-from-dist@1.0.1: 1326 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1327 | 1328 | parent-module@1.0.1: 1329 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1330 | engines: {node: '>=6'} 1331 | 1332 | parse5@8.0.0: 1333 | resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} 1334 | 1335 | path-exists@4.0.0: 1336 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1337 | engines: {node: '>=8'} 1338 | 1339 | path-key@3.1.1: 1340 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1341 | engines: {node: '>=8'} 1342 | 1343 | path-scurry@1.11.1: 1344 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1345 | engines: {node: '>=16 || 14 >=14.18'} 1346 | 1347 | pathe@2.0.3: 1348 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1349 | 1350 | picocolors@1.1.1: 1351 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1352 | 1353 | picomatch@2.3.1: 1354 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1355 | engines: {node: '>=8.6'} 1356 | 1357 | picomatch@4.0.3: 1358 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1359 | engines: {node: '>=12'} 1360 | 1361 | pirates@4.0.7: 1362 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 1363 | engines: {node: '>= 6'} 1364 | 1365 | pixelmatch@7.1.0: 1366 | resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} 1367 | hasBin: true 1368 | 1369 | pkg-types@1.3.1: 1370 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1371 | 1372 | playwright-core@1.54.2: 1373 | resolution: {integrity: sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==} 1374 | engines: {node: '>=18'} 1375 | hasBin: true 1376 | 1377 | playwright@1.54.2: 1378 | resolution: {integrity: sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==} 1379 | engines: {node: '>=18'} 1380 | hasBin: true 1381 | 1382 | pngjs@7.0.0: 1383 | resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} 1384 | engines: {node: '>=14.19.0'} 1385 | 1386 | postcss-load-config@6.0.1: 1387 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1388 | engines: {node: '>= 18'} 1389 | peerDependencies: 1390 | jiti: '>=1.21.0' 1391 | postcss: '>=8.0.9' 1392 | tsx: ^4.8.1 1393 | yaml: ^2.4.2 1394 | peerDependenciesMeta: 1395 | jiti: 1396 | optional: true 1397 | postcss: 1398 | optional: true 1399 | tsx: 1400 | optional: true 1401 | yaml: 1402 | optional: true 1403 | 1404 | postcss@8.5.6: 1405 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1406 | engines: {node: ^10 || ^12 || >=14} 1407 | 1408 | prelude-ls@1.2.1: 1409 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1410 | engines: {node: '>= 0.8.0'} 1411 | 1412 | prettier-plugin-packagejson@2.5.18: 1413 | resolution: {integrity: sha512-NKznPGcGrcj4NPGxnh+w78JXPyfB6I4RQSCM0v+CAXwpDG7OEpJQ5zMyfC5NBgKH1k7Skwcj5ak5by2mrHvC5g==} 1414 | peerDependencies: 1415 | prettier: '>= 1.16.0' 1416 | peerDependenciesMeta: 1417 | prettier: 1418 | optional: true 1419 | 1420 | prettier-plugin-sh@0.15.0: 1421 | resolution: {integrity: sha512-U0PikJr/yr2bzzARl43qI0mApBj0C1xdAfA04AZa6LnvIKawXHhuy2fFo6LNA7weRzGlAiNbaEFfKMFo0nZr/A==} 1422 | engines: {node: '>=16.0.0'} 1423 | peerDependencies: 1424 | prettier: ^3.0.3 1425 | 1426 | prettier@3.7.4: 1427 | resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} 1428 | engines: {node: '>=14'} 1429 | hasBin: true 1430 | 1431 | punycode@2.3.1: 1432 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1433 | engines: {node: '>=6'} 1434 | 1435 | queue-microtask@1.2.3: 1436 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1437 | 1438 | readdirp@4.1.2: 1439 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1440 | engines: {node: '>= 14.18.0'} 1441 | 1442 | require-from-string@2.0.2: 1443 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1444 | engines: {node: '>=0.10.0'} 1445 | 1446 | resolve-from@4.0.0: 1447 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1448 | engines: {node: '>=4'} 1449 | 1450 | resolve-from@5.0.0: 1451 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1452 | engines: {node: '>=8'} 1453 | 1454 | resolve-pkg-maps@1.0.0: 1455 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1456 | 1457 | reusify@1.1.0: 1458 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1459 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1460 | 1461 | rollup@4.52.5: 1462 | resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} 1463 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1464 | hasBin: true 1465 | 1466 | run-parallel@1.2.0: 1467 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1468 | 1469 | safer-buffer@2.1.2: 1470 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1471 | 1472 | saxes@6.0.0: 1473 | resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} 1474 | engines: {node: '>=v12.22.7'} 1475 | 1476 | semver@7.7.3: 1477 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1478 | engines: {node: '>=10'} 1479 | hasBin: true 1480 | 1481 | sh-syntax@0.4.2: 1482 | resolution: {integrity: sha512-/l2UZ5fhGZLVZa16XQM9/Vq/hezGGbdHeVEA01uWjOL1+7Ek/gt6FquW0iKKws4a9AYPYvlz6RyVvjh3JxOteg==} 1483 | engines: {node: '>=16.0.0'} 1484 | 1485 | shebang-command@2.0.0: 1486 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1487 | engines: {node: '>=8'} 1488 | 1489 | shebang-regex@3.0.0: 1490 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1491 | engines: {node: '>=8'} 1492 | 1493 | siginfo@2.0.0: 1494 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1495 | 1496 | signal-exit@4.1.0: 1497 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1498 | engines: {node: '>=14'} 1499 | 1500 | sirv@3.0.2: 1501 | resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} 1502 | engines: {node: '>=18'} 1503 | 1504 | sort-object-keys@1.1.3: 1505 | resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} 1506 | 1507 | sort-package-json@3.4.0: 1508 | resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==} 1509 | engines: {node: '>=20'} 1510 | hasBin: true 1511 | 1512 | source-map-js@1.2.1: 1513 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1514 | engines: {node: '>=0.10.0'} 1515 | 1516 | source-map@0.7.6: 1517 | resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} 1518 | engines: {node: '>= 12'} 1519 | 1520 | stackback@0.0.2: 1521 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1522 | 1523 | std-env@3.10.0: 1524 | resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} 1525 | 1526 | string-width@4.2.3: 1527 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1528 | engines: {node: '>=8'} 1529 | 1530 | string-width@5.1.2: 1531 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1532 | engines: {node: '>=12'} 1533 | 1534 | strip-ansi@6.0.1: 1535 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1536 | engines: {node: '>=8'} 1537 | 1538 | strip-ansi@7.1.2: 1539 | resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} 1540 | engines: {node: '>=12'} 1541 | 1542 | strip-json-comments@3.1.1: 1543 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1544 | engines: {node: '>=8'} 1545 | 1546 | sucrase@3.35.0: 1547 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1548 | engines: {node: '>=16 || 14 >=14.17'} 1549 | hasBin: true 1550 | 1551 | supports-color@7.2.0: 1552 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1553 | engines: {node: '>=8'} 1554 | 1555 | symbol-tree@3.2.4: 1556 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 1557 | 1558 | synckit@0.11.8: 1559 | resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 1560 | engines: {node: ^14.18.0 || >=16.0.0} 1561 | 1562 | thenify-all@1.6.0: 1563 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1564 | engines: {node: '>=0.8'} 1565 | 1566 | thenify@3.3.1: 1567 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1568 | 1569 | tinybench@2.9.0: 1570 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1571 | 1572 | tinyexec@0.3.2: 1573 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1574 | 1575 | tinyexec@1.0.2: 1576 | resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} 1577 | engines: {node: '>=18'} 1578 | 1579 | tinyglobby@0.2.15: 1580 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1581 | engines: {node: '>=12.0.0'} 1582 | 1583 | tinyrainbow@3.0.3: 1584 | resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} 1585 | engines: {node: '>=14.0.0'} 1586 | 1587 | tldts-core@7.0.8: 1588 | resolution: {integrity: sha512-Ze39mm8EtocSXPbH6cv5rDeBBhehp8OLxWJKZXLEyv2dKMlblJsoAw2gmA0ZaU6iOwNlCZ4LrmaTW1reUQEmJw==} 1589 | 1590 | tldts@7.0.8: 1591 | resolution: {integrity: sha512-TlGAxavO97fYecdBgnLPoTJtY8MOgpowI/qwIz9HhLjETMQOUjQr6BRQE6WazumppjsgGg4eaVZuMNv4vY5nwQ==} 1592 | hasBin: true 1593 | 1594 | to-regex-range@5.0.1: 1595 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1596 | engines: {node: '>=8.0'} 1597 | 1598 | totalist@3.0.1: 1599 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1600 | engines: {node: '>=6'} 1601 | 1602 | tough-cookie@6.0.0: 1603 | resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} 1604 | engines: {node: '>=16'} 1605 | 1606 | tr46@6.0.0: 1607 | resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} 1608 | engines: {node: '>=20'} 1609 | 1610 | tree-kill@1.2.2: 1611 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1612 | hasBin: true 1613 | 1614 | ts-api-utils@2.1.0: 1615 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1616 | engines: {node: '>=18.12'} 1617 | peerDependencies: 1618 | typescript: '>=4.8.4' 1619 | 1620 | ts-interface-checker@0.1.13: 1621 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1622 | 1623 | tslib@2.8.1: 1624 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1625 | 1626 | tsup@8.5.1: 1627 | resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} 1628 | engines: {node: '>=18'} 1629 | hasBin: true 1630 | peerDependencies: 1631 | '@microsoft/api-extractor': ^7.36.0 1632 | '@swc/core': ^1 1633 | postcss: ^8.4.12 1634 | typescript: '>=4.5.0' 1635 | peerDependenciesMeta: 1636 | '@microsoft/api-extractor': 1637 | optional: true 1638 | '@swc/core': 1639 | optional: true 1640 | postcss: 1641 | optional: true 1642 | typescript: 1643 | optional: true 1644 | 1645 | tsx@4.20.6: 1646 | resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} 1647 | engines: {node: '>=18.0.0'} 1648 | hasBin: true 1649 | 1650 | type-check@0.4.0: 1651 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1652 | engines: {node: '>= 0.8.0'} 1653 | 1654 | typescript-eslint@8.46.2: 1655 | resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} 1656 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1657 | peerDependencies: 1658 | eslint: ^8.57.0 || ^9.0.0 1659 | typescript: '>=4.8.4 <6.0.0' 1660 | 1661 | typescript@5.9.3: 1662 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1663 | engines: {node: '>=14.17'} 1664 | hasBin: true 1665 | 1666 | ufo@1.6.1: 1667 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1668 | 1669 | undici-types@7.16.0: 1670 | resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 1671 | 1672 | uri-js@4.4.1: 1673 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1674 | 1675 | vite@7.1.12: 1676 | resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} 1677 | engines: {node: ^20.19.0 || >=22.12.0} 1678 | hasBin: true 1679 | peerDependencies: 1680 | '@types/node': ^20.19.0 || >=22.12.0 1681 | jiti: '>=1.21.0' 1682 | less: ^4.0.0 1683 | lightningcss: ^1.21.0 1684 | sass: ^1.70.0 1685 | sass-embedded: ^1.70.0 1686 | stylus: '>=0.54.8' 1687 | sugarss: ^5.0.0 1688 | terser: ^5.16.0 1689 | tsx: ^4.8.1 1690 | yaml: ^2.4.2 1691 | peerDependenciesMeta: 1692 | '@types/node': 1693 | optional: true 1694 | jiti: 1695 | optional: true 1696 | less: 1697 | optional: true 1698 | lightningcss: 1699 | optional: true 1700 | sass: 1701 | optional: true 1702 | sass-embedded: 1703 | optional: true 1704 | stylus: 1705 | optional: true 1706 | sugarss: 1707 | optional: true 1708 | terser: 1709 | optional: true 1710 | tsx: 1711 | optional: true 1712 | yaml: 1713 | optional: true 1714 | 1715 | vitest@4.0.15: 1716 | resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} 1717 | engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} 1718 | hasBin: true 1719 | peerDependencies: 1720 | '@edge-runtime/vm': '*' 1721 | '@opentelemetry/api': ^1.9.0 1722 | '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 1723 | '@vitest/browser-playwright': 4.0.15 1724 | '@vitest/browser-preview': 4.0.15 1725 | '@vitest/browser-webdriverio': 4.0.15 1726 | '@vitest/ui': 4.0.15 1727 | happy-dom: '*' 1728 | jsdom: '*' 1729 | peerDependenciesMeta: 1730 | '@edge-runtime/vm': 1731 | optional: true 1732 | '@opentelemetry/api': 1733 | optional: true 1734 | '@types/node': 1735 | optional: true 1736 | '@vitest/browser-playwright': 1737 | optional: true 1738 | '@vitest/browser-preview': 1739 | optional: true 1740 | '@vitest/browser-webdriverio': 1741 | optional: true 1742 | '@vitest/ui': 1743 | optional: true 1744 | happy-dom: 1745 | optional: true 1746 | jsdom: 1747 | optional: true 1748 | 1749 | w3c-xmlserializer@5.0.0: 1750 | resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} 1751 | engines: {node: '>=18'} 1752 | 1753 | webidl-conversions@8.0.0: 1754 | resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} 1755 | engines: {node: '>=20'} 1756 | 1757 | whatwg-encoding@3.1.1: 1758 | resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} 1759 | engines: {node: '>=18'} 1760 | 1761 | whatwg-mimetype@4.0.0: 1762 | resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} 1763 | engines: {node: '>=18'} 1764 | 1765 | whatwg-url@15.1.0: 1766 | resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} 1767 | engines: {node: '>=20'} 1768 | 1769 | which@2.0.2: 1770 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1771 | engines: {node: '>= 8'} 1772 | hasBin: true 1773 | 1774 | why-is-node-running@2.3.0: 1775 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1776 | engines: {node: '>=8'} 1777 | hasBin: true 1778 | 1779 | word-wrap@1.2.5: 1780 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1781 | engines: {node: '>=0.10.0'} 1782 | 1783 | wrap-ansi@7.0.0: 1784 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1785 | engines: {node: '>=10'} 1786 | 1787 | wrap-ansi@8.1.0: 1788 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1789 | engines: {node: '>=12'} 1790 | 1791 | ws@8.18.3: 1792 | resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} 1793 | engines: {node: '>=10.0.0'} 1794 | peerDependencies: 1795 | bufferutil: ^4.0.1 1796 | utf-8-validate: '>=5.0.2' 1797 | peerDependenciesMeta: 1798 | bufferutil: 1799 | optional: true 1800 | utf-8-validate: 1801 | optional: true 1802 | 1803 | xml-name-validator@5.0.0: 1804 | resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} 1805 | engines: {node: '>=18'} 1806 | 1807 | xmlchars@2.2.0: 1808 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 1809 | 1810 | yocto-queue@0.1.0: 1811 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1812 | engines: {node: '>=10'} 1813 | 1814 | snapshots: 1815 | 1816 | '@acemir/cssom@0.9.26': 1817 | optional: true 1818 | 1819 | '@asamuzakjp/css-color@4.1.0': 1820 | dependencies: 1821 | '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) 1822 | '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) 1823 | '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) 1824 | '@csstools/css-tokenizer': 3.0.4 1825 | lru-cache: 11.2.4 1826 | optional: true 1827 | 1828 | '@asamuzakjp/dom-selector@6.7.6': 1829 | dependencies: 1830 | '@asamuzakjp/nwsapi': 2.3.9 1831 | bidi-js: 1.0.3 1832 | css-tree: 3.1.0 1833 | is-potential-custom-element-name: 1.0.1 1834 | lru-cache: 11.2.4 1835 | optional: true 1836 | 1837 | '@asamuzakjp/nwsapi@2.3.9': 1838 | optional: true 1839 | 1840 | '@babel/code-frame@7.27.1': 1841 | dependencies: 1842 | '@babel/helper-validator-identifier': 7.28.5 1843 | js-tokens: 4.0.0 1844 | picocolors: 1.1.1 1845 | 1846 | '@babel/generator@7.28.5': 1847 | dependencies: 1848 | '@babel/parser': 7.28.5 1849 | '@babel/types': 7.28.5 1850 | '@jridgewell/gen-mapping': 0.3.13 1851 | '@jridgewell/trace-mapping': 0.3.31 1852 | jsesc: 3.1.0 1853 | 1854 | '@babel/helper-globals@7.28.0': {} 1855 | 1856 | '@babel/helper-string-parser@7.27.1': {} 1857 | 1858 | '@babel/helper-validator-identifier@7.28.5': {} 1859 | 1860 | '@babel/parser@7.28.5': 1861 | dependencies: 1862 | '@babel/types': 7.28.5 1863 | 1864 | '@babel/template@7.27.2': 1865 | dependencies: 1866 | '@babel/code-frame': 7.27.1 1867 | '@babel/parser': 7.28.5 1868 | '@babel/types': 7.28.5 1869 | 1870 | '@babel/traverse@7.28.5': 1871 | dependencies: 1872 | '@babel/code-frame': 7.27.1 1873 | '@babel/generator': 7.28.5 1874 | '@babel/helper-globals': 7.28.0 1875 | '@babel/parser': 7.28.5 1876 | '@babel/template': 7.27.2 1877 | '@babel/types': 7.28.5 1878 | debug: 4.4.3 1879 | transitivePeerDependencies: 1880 | - supports-color 1881 | 1882 | '@babel/types@7.28.5': 1883 | dependencies: 1884 | '@babel/helper-string-parser': 7.27.1 1885 | '@babel/helper-validator-identifier': 7.28.5 1886 | 1887 | '@csstools/color-helpers@5.1.0': 1888 | optional: true 1889 | 1890 | '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': 1891 | dependencies: 1892 | '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) 1893 | '@csstools/css-tokenizer': 3.0.4 1894 | optional: true 1895 | 1896 | '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': 1897 | dependencies: 1898 | '@csstools/color-helpers': 5.1.0 1899 | '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) 1900 | '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) 1901 | '@csstools/css-tokenizer': 3.0.4 1902 | optional: true 1903 | 1904 | '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': 1905 | dependencies: 1906 | '@csstools/css-tokenizer': 3.0.4 1907 | optional: true 1908 | 1909 | '@csstools/css-syntax-patches-for-csstree@1.0.20': 1910 | optional: true 1911 | 1912 | '@csstools/css-tokenizer@3.0.4': 1913 | optional: true 1914 | 1915 | '@esbuild/aix-ppc64@0.25.12': 1916 | optional: true 1917 | 1918 | '@esbuild/aix-ppc64@0.27.0': 1919 | optional: true 1920 | 1921 | '@esbuild/android-arm64@0.25.12': 1922 | optional: true 1923 | 1924 | '@esbuild/android-arm64@0.27.0': 1925 | optional: true 1926 | 1927 | '@esbuild/android-arm@0.25.12': 1928 | optional: true 1929 | 1930 | '@esbuild/android-arm@0.27.0': 1931 | optional: true 1932 | 1933 | '@esbuild/android-x64@0.25.12': 1934 | optional: true 1935 | 1936 | '@esbuild/android-x64@0.27.0': 1937 | optional: true 1938 | 1939 | '@esbuild/darwin-arm64@0.25.12': 1940 | optional: true 1941 | 1942 | '@esbuild/darwin-arm64@0.27.0': 1943 | optional: true 1944 | 1945 | '@esbuild/darwin-x64@0.25.12': 1946 | optional: true 1947 | 1948 | '@esbuild/darwin-x64@0.27.0': 1949 | optional: true 1950 | 1951 | '@esbuild/freebsd-arm64@0.25.12': 1952 | optional: true 1953 | 1954 | '@esbuild/freebsd-arm64@0.27.0': 1955 | optional: true 1956 | 1957 | '@esbuild/freebsd-x64@0.25.12': 1958 | optional: true 1959 | 1960 | '@esbuild/freebsd-x64@0.27.0': 1961 | optional: true 1962 | 1963 | '@esbuild/linux-arm64@0.25.12': 1964 | optional: true 1965 | 1966 | '@esbuild/linux-arm64@0.27.0': 1967 | optional: true 1968 | 1969 | '@esbuild/linux-arm@0.25.12': 1970 | optional: true 1971 | 1972 | '@esbuild/linux-arm@0.27.0': 1973 | optional: true 1974 | 1975 | '@esbuild/linux-ia32@0.25.12': 1976 | optional: true 1977 | 1978 | '@esbuild/linux-ia32@0.27.0': 1979 | optional: true 1980 | 1981 | '@esbuild/linux-loong64@0.25.12': 1982 | optional: true 1983 | 1984 | '@esbuild/linux-loong64@0.27.0': 1985 | optional: true 1986 | 1987 | '@esbuild/linux-mips64el@0.25.12': 1988 | optional: true 1989 | 1990 | '@esbuild/linux-mips64el@0.27.0': 1991 | optional: true 1992 | 1993 | '@esbuild/linux-ppc64@0.25.12': 1994 | optional: true 1995 | 1996 | '@esbuild/linux-ppc64@0.27.0': 1997 | optional: true 1998 | 1999 | '@esbuild/linux-riscv64@0.25.12': 2000 | optional: true 2001 | 2002 | '@esbuild/linux-riscv64@0.27.0': 2003 | optional: true 2004 | 2005 | '@esbuild/linux-s390x@0.25.12': 2006 | optional: true 2007 | 2008 | '@esbuild/linux-s390x@0.27.0': 2009 | optional: true 2010 | 2011 | '@esbuild/linux-x64@0.25.12': 2012 | optional: true 2013 | 2014 | '@esbuild/linux-x64@0.27.0': 2015 | optional: true 2016 | 2017 | '@esbuild/netbsd-arm64@0.25.12': 2018 | optional: true 2019 | 2020 | '@esbuild/netbsd-arm64@0.27.0': 2021 | optional: true 2022 | 2023 | '@esbuild/netbsd-x64@0.25.12': 2024 | optional: true 2025 | 2026 | '@esbuild/netbsd-x64@0.27.0': 2027 | optional: true 2028 | 2029 | '@esbuild/openbsd-arm64@0.25.12': 2030 | optional: true 2031 | 2032 | '@esbuild/openbsd-arm64@0.27.0': 2033 | optional: true 2034 | 2035 | '@esbuild/openbsd-x64@0.25.12': 2036 | optional: true 2037 | 2038 | '@esbuild/openbsd-x64@0.27.0': 2039 | optional: true 2040 | 2041 | '@esbuild/openharmony-arm64@0.25.12': 2042 | optional: true 2043 | 2044 | '@esbuild/openharmony-arm64@0.27.0': 2045 | optional: true 2046 | 2047 | '@esbuild/sunos-x64@0.25.12': 2048 | optional: true 2049 | 2050 | '@esbuild/sunos-x64@0.27.0': 2051 | optional: true 2052 | 2053 | '@esbuild/win32-arm64@0.25.12': 2054 | optional: true 2055 | 2056 | '@esbuild/win32-arm64@0.27.0': 2057 | optional: true 2058 | 2059 | '@esbuild/win32-ia32@0.25.12': 2060 | optional: true 2061 | 2062 | '@esbuild/win32-ia32@0.27.0': 2063 | optional: true 2064 | 2065 | '@esbuild/win32-x64@0.25.12': 2066 | optional: true 2067 | 2068 | '@esbuild/win32-x64@0.27.0': 2069 | optional: true 2070 | 2071 | '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.5.1))': 2072 | dependencies: 2073 | eslint: 9.39.1(jiti@2.5.1) 2074 | eslint-visitor-keys: 3.4.3 2075 | 2076 | '@eslint-community/regexpp@4.12.2': {} 2077 | 2078 | '@eslint/config-array@0.21.1': 2079 | dependencies: 2080 | '@eslint/object-schema': 2.1.7 2081 | debug: 4.4.3 2082 | minimatch: 3.1.2 2083 | transitivePeerDependencies: 2084 | - supports-color 2085 | 2086 | '@eslint/config-helpers@0.4.2': 2087 | dependencies: 2088 | '@eslint/core': 0.17.0 2089 | 2090 | '@eslint/core@0.17.0': 2091 | dependencies: 2092 | '@types/json-schema': 7.0.15 2093 | 2094 | '@eslint/eslintrc@3.3.1': 2095 | dependencies: 2096 | ajv: 6.12.6 2097 | debug: 4.4.3 2098 | espree: 10.4.0 2099 | globals: 14.0.0 2100 | ignore: 5.3.2 2101 | import-fresh: 3.3.1 2102 | js-yaml: 4.1.0 2103 | minimatch: 3.1.2 2104 | strip-json-comments: 3.1.1 2105 | transitivePeerDependencies: 2106 | - supports-color 2107 | 2108 | '@eslint/js@9.39.1': {} 2109 | 2110 | '@eslint/object-schema@2.1.7': {} 2111 | 2112 | '@eslint/plugin-kit@0.4.1': 2113 | dependencies: 2114 | '@eslint/core': 0.17.0 2115 | levn: 0.4.1 2116 | 2117 | '@humanfs/core@0.19.1': {} 2118 | 2119 | '@humanfs/node@0.16.7': 2120 | dependencies: 2121 | '@humanfs/core': 0.19.1 2122 | '@humanwhocodes/retry': 0.4.3 2123 | 2124 | '@humanwhocodes/module-importer@1.0.1': {} 2125 | 2126 | '@humanwhocodes/retry@0.4.3': {} 2127 | 2128 | '@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.7.4)': 2129 | dependencies: 2130 | '@babel/generator': 7.28.5 2131 | '@babel/parser': 7.28.5 2132 | '@babel/traverse': 7.28.5 2133 | '@babel/types': 7.28.5 2134 | prettier: 3.7.4 2135 | semver: 7.7.3 2136 | transitivePeerDependencies: 2137 | - supports-color 2138 | 2139 | '@isaacs/cliui@8.0.2': 2140 | dependencies: 2141 | string-width: 5.1.2 2142 | string-width-cjs: string-width@4.2.3 2143 | strip-ansi: 7.1.2 2144 | strip-ansi-cjs: strip-ansi@6.0.1 2145 | wrap-ansi: 8.1.0 2146 | wrap-ansi-cjs: wrap-ansi@7.0.0 2147 | 2148 | '@jridgewell/gen-mapping@0.3.13': 2149 | dependencies: 2150 | '@jridgewell/sourcemap-codec': 1.5.5 2151 | '@jridgewell/trace-mapping': 0.3.31 2152 | 2153 | '@jridgewell/resolve-uri@3.1.2': {} 2154 | 2155 | '@jridgewell/sourcemap-codec@1.5.5': {} 2156 | 2157 | '@jridgewell/trace-mapping@0.3.31': 2158 | dependencies: 2159 | '@jridgewell/resolve-uri': 3.1.2 2160 | '@jridgewell/sourcemap-codec': 1.5.5 2161 | 2162 | '@nodelib/fs.scandir@2.1.5': 2163 | dependencies: 2164 | '@nodelib/fs.stat': 2.0.5 2165 | run-parallel: 1.2.0 2166 | 2167 | '@nodelib/fs.stat@2.0.5': {} 2168 | 2169 | '@nodelib/fs.walk@1.2.8': 2170 | dependencies: 2171 | '@nodelib/fs.scandir': 2.1.5 2172 | fastq: 1.19.1 2173 | 2174 | '@pkgjs/parseargs@0.11.0': 2175 | optional: true 2176 | 2177 | '@pkgr/core@0.2.9': {} 2178 | 2179 | '@polka/url@1.0.0-next.29': {} 2180 | 2181 | '@rollup/rollup-android-arm-eabi@4.52.5': 2182 | optional: true 2183 | 2184 | '@rollup/rollup-android-arm64@4.52.5': 2185 | optional: true 2186 | 2187 | '@rollup/rollup-darwin-arm64@4.52.5': 2188 | optional: true 2189 | 2190 | '@rollup/rollup-darwin-x64@4.52.5': 2191 | optional: true 2192 | 2193 | '@rollup/rollup-freebsd-arm64@4.52.5': 2194 | optional: true 2195 | 2196 | '@rollup/rollup-freebsd-x64@4.52.5': 2197 | optional: true 2198 | 2199 | '@rollup/rollup-linux-arm-gnueabihf@4.52.5': 2200 | optional: true 2201 | 2202 | '@rollup/rollup-linux-arm-musleabihf@4.52.5': 2203 | optional: true 2204 | 2205 | '@rollup/rollup-linux-arm64-gnu@4.52.5': 2206 | optional: true 2207 | 2208 | '@rollup/rollup-linux-arm64-musl@4.52.5': 2209 | optional: true 2210 | 2211 | '@rollup/rollup-linux-loong64-gnu@4.52.5': 2212 | optional: true 2213 | 2214 | '@rollup/rollup-linux-ppc64-gnu@4.52.5': 2215 | optional: true 2216 | 2217 | '@rollup/rollup-linux-riscv64-gnu@4.52.5': 2218 | optional: true 2219 | 2220 | '@rollup/rollup-linux-riscv64-musl@4.52.5': 2221 | optional: true 2222 | 2223 | '@rollup/rollup-linux-s390x-gnu@4.52.5': 2224 | optional: true 2225 | 2226 | '@rollup/rollup-linux-x64-gnu@4.52.5': 2227 | optional: true 2228 | 2229 | '@rollup/rollup-linux-x64-musl@4.52.5': 2230 | optional: true 2231 | 2232 | '@rollup/rollup-openharmony-arm64@4.52.5': 2233 | optional: true 2234 | 2235 | '@rollup/rollup-win32-arm64-msvc@4.52.5': 2236 | optional: true 2237 | 2238 | '@rollup/rollup-win32-ia32-msvc@4.52.5': 2239 | optional: true 2240 | 2241 | '@rollup/rollup-win32-x64-gnu@4.52.5': 2242 | optional: true 2243 | 2244 | '@rollup/rollup-win32-x64-msvc@4.52.5': 2245 | optional: true 2246 | 2247 | '@se-oss/delay@1.0.0': 2248 | dependencies: 2249 | '@se-oss/rand': 1.1.0 2250 | '@se-oss/timeout': 1.0.0 2251 | 2252 | '@se-oss/md5@1.0.0': {} 2253 | 2254 | '@se-oss/rand@1.1.0': {} 2255 | 2256 | '@se-oss/timeout@1.0.0': {} 2257 | 2258 | '@shahrad/eslint-config@1.0.1(jiti@2.5.1)(typescript@5.9.3)': 2259 | dependencies: 2260 | '@eslint/js': 9.39.1 2261 | eslint: 9.39.1(jiti@2.5.1) 2262 | typescript-eslint: 8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3) 2263 | transitivePeerDependencies: 2264 | - jiti 2265 | - supports-color 2266 | - typescript 2267 | 2268 | '@shahrad/prettier-config@1.2.2(@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.7.4))(prettier-plugin-packagejson@2.5.18(prettier@3.7.4))(prettier-plugin-sh@0.15.0(prettier@3.7.4))(prettier@3.7.4)': 2269 | dependencies: 2270 | '@ianvs/prettier-plugin-sort-imports': 4.5.1(prettier@3.7.4) 2271 | prettier: 3.7.4 2272 | prettier-plugin-packagejson: 2.5.18(prettier@3.7.4) 2273 | prettier-plugin-sh: 0.15.0(prettier@3.7.4) 2274 | 2275 | '@shahrad/tsconfig@1.2.0': {} 2276 | 2277 | '@standard-schema/spec@1.0.0': {} 2278 | 2279 | '@types/chai@5.2.3': 2280 | dependencies: 2281 | '@types/deep-eql': 4.0.2 2282 | assertion-error: 2.0.1 2283 | 2284 | '@types/deep-eql@4.0.2': {} 2285 | 2286 | '@types/estree@1.0.8': {} 2287 | 2288 | '@types/json-schema@7.0.15': {} 2289 | 2290 | '@types/node@24.10.1': 2291 | dependencies: 2292 | undici-types: 7.16.0 2293 | 2294 | '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3)': 2295 | dependencies: 2296 | '@eslint-community/regexpp': 4.12.2 2297 | '@typescript-eslint/parser': 8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3) 2298 | '@typescript-eslint/scope-manager': 8.46.2 2299 | '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3) 2300 | '@typescript-eslint/utils': 8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3) 2301 | '@typescript-eslint/visitor-keys': 8.46.2 2302 | eslint: 9.39.1(jiti@2.5.1) 2303 | graphemer: 1.4.0 2304 | ignore: 7.0.5 2305 | natural-compare: 1.4.0 2306 | ts-api-utils: 2.1.0(typescript@5.9.3) 2307 | typescript: 5.9.3 2308 | transitivePeerDependencies: 2309 | - supports-color 2310 | 2311 | '@typescript-eslint/parser@8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3)': 2312 | dependencies: 2313 | '@typescript-eslint/scope-manager': 8.46.2 2314 | '@typescript-eslint/types': 8.46.2 2315 | '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) 2316 | '@typescript-eslint/visitor-keys': 8.46.2 2317 | debug: 4.4.3 2318 | eslint: 9.39.1(jiti@2.5.1) 2319 | typescript: 5.9.3 2320 | transitivePeerDependencies: 2321 | - supports-color 2322 | 2323 | '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': 2324 | dependencies: 2325 | '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) 2326 | '@typescript-eslint/types': 8.46.2 2327 | debug: 4.4.3 2328 | typescript: 5.9.3 2329 | transitivePeerDependencies: 2330 | - supports-color 2331 | 2332 | '@typescript-eslint/scope-manager@8.46.2': 2333 | dependencies: 2334 | '@typescript-eslint/types': 8.46.2 2335 | '@typescript-eslint/visitor-keys': 8.46.2 2336 | 2337 | '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': 2338 | dependencies: 2339 | typescript: 5.9.3 2340 | 2341 | '@typescript-eslint/type-utils@8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3)': 2342 | dependencies: 2343 | '@typescript-eslint/types': 8.46.2 2344 | '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) 2345 | '@typescript-eslint/utils': 8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3) 2346 | debug: 4.4.3 2347 | eslint: 9.39.1(jiti@2.5.1) 2348 | ts-api-utils: 2.1.0(typescript@5.9.3) 2349 | typescript: 5.9.3 2350 | transitivePeerDependencies: 2351 | - supports-color 2352 | 2353 | '@typescript-eslint/types@8.46.2': {} 2354 | 2355 | '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': 2356 | dependencies: 2357 | '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) 2358 | '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) 2359 | '@typescript-eslint/types': 8.46.2 2360 | '@typescript-eslint/visitor-keys': 8.46.2 2361 | debug: 4.4.3 2362 | fast-glob: 3.3.3 2363 | is-glob: 4.0.3 2364 | minimatch: 9.0.5 2365 | semver: 7.7.3 2366 | ts-api-utils: 2.1.0(typescript@5.9.3) 2367 | typescript: 5.9.3 2368 | transitivePeerDependencies: 2369 | - supports-color 2370 | 2371 | '@typescript-eslint/utils@8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3)': 2372 | dependencies: 2373 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) 2374 | '@typescript-eslint/scope-manager': 8.46.2 2375 | '@typescript-eslint/types': 8.46.2 2376 | '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) 2377 | eslint: 9.39.1(jiti@2.5.1) 2378 | typescript: 5.9.3 2379 | transitivePeerDependencies: 2380 | - supports-color 2381 | 2382 | '@typescript-eslint/visitor-keys@8.46.2': 2383 | dependencies: 2384 | '@typescript-eslint/types': 8.46.2 2385 | eslint-visitor-keys: 4.2.1 2386 | 2387 | '@vitest/browser-playwright@4.0.15(playwright@1.54.2)(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6))(vitest@4.0.15)': 2388 | dependencies: 2389 | '@vitest/browser': 4.0.15(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6))(vitest@4.0.15) 2390 | '@vitest/mocker': 4.0.15(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6)) 2391 | playwright: 1.54.2 2392 | tinyrainbow: 3.0.3 2393 | vitest: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.5.1)(jsdom@27.1.0)(tsx@4.20.6) 2394 | transitivePeerDependencies: 2395 | - bufferutil 2396 | - msw 2397 | - utf-8-validate 2398 | - vite 2399 | 2400 | '@vitest/browser@4.0.15(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6))(vitest@4.0.15)': 2401 | dependencies: 2402 | '@vitest/mocker': 4.0.15(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6)) 2403 | '@vitest/utils': 4.0.15 2404 | magic-string: 0.30.21 2405 | pixelmatch: 7.1.0 2406 | pngjs: 7.0.0 2407 | sirv: 3.0.2 2408 | tinyrainbow: 3.0.3 2409 | vitest: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.5.1)(jsdom@27.1.0)(tsx@4.20.6) 2410 | ws: 8.18.3 2411 | transitivePeerDependencies: 2412 | - bufferutil 2413 | - msw 2414 | - utf-8-validate 2415 | - vite 2416 | 2417 | '@vitest/expect@4.0.15': 2418 | dependencies: 2419 | '@standard-schema/spec': 1.0.0 2420 | '@types/chai': 5.2.3 2421 | '@vitest/spy': 4.0.15 2422 | '@vitest/utils': 4.0.15 2423 | chai: 6.2.1 2424 | tinyrainbow: 3.0.3 2425 | 2426 | '@vitest/mocker@4.0.15(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6))': 2427 | dependencies: 2428 | '@vitest/spy': 4.0.15 2429 | estree-walker: 3.0.3 2430 | magic-string: 0.30.21 2431 | optionalDependencies: 2432 | vite: 7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6) 2433 | 2434 | '@vitest/pretty-format@4.0.15': 2435 | dependencies: 2436 | tinyrainbow: 3.0.3 2437 | 2438 | '@vitest/runner@4.0.15': 2439 | dependencies: 2440 | '@vitest/utils': 4.0.15 2441 | pathe: 2.0.3 2442 | 2443 | '@vitest/snapshot@4.0.15': 2444 | dependencies: 2445 | '@vitest/pretty-format': 4.0.15 2446 | magic-string: 0.30.21 2447 | pathe: 2.0.3 2448 | 2449 | '@vitest/spy@4.0.15': {} 2450 | 2451 | '@vitest/utils@4.0.15': 2452 | dependencies: 2453 | '@vitest/pretty-format': 4.0.15 2454 | tinyrainbow: 3.0.3 2455 | 2456 | acorn-jsx@5.3.2(acorn@8.15.0): 2457 | dependencies: 2458 | acorn: 8.15.0 2459 | 2460 | acorn@8.15.0: {} 2461 | 2462 | agent-base@7.1.4: 2463 | optional: true 2464 | 2465 | ajv@6.12.6: 2466 | dependencies: 2467 | fast-deep-equal: 3.1.3 2468 | fast-json-stable-stringify: 2.1.0 2469 | json-schema-traverse: 0.4.1 2470 | uri-js: 4.4.1 2471 | 2472 | ansi-regex@5.0.1: {} 2473 | 2474 | ansi-regex@6.2.2: {} 2475 | 2476 | ansi-styles@4.3.0: 2477 | dependencies: 2478 | color-convert: 2.0.1 2479 | 2480 | ansi-styles@6.2.3: {} 2481 | 2482 | any-promise@1.3.0: {} 2483 | 2484 | argparse@2.0.1: {} 2485 | 2486 | assertion-error@2.0.1: {} 2487 | 2488 | balanced-match@1.0.2: {} 2489 | 2490 | bidi-js@1.0.3: 2491 | dependencies: 2492 | require-from-string: 2.0.2 2493 | optional: true 2494 | 2495 | brace-expansion@1.1.12: 2496 | dependencies: 2497 | balanced-match: 1.0.2 2498 | concat-map: 0.0.1 2499 | 2500 | brace-expansion@2.0.2: 2501 | dependencies: 2502 | balanced-match: 1.0.2 2503 | 2504 | braces@3.0.3: 2505 | dependencies: 2506 | fill-range: 7.1.1 2507 | 2508 | bundle-require@5.1.0(esbuild@0.27.0): 2509 | dependencies: 2510 | esbuild: 0.27.0 2511 | load-tsconfig: 0.2.5 2512 | 2513 | cac@6.7.14: {} 2514 | 2515 | callsites@3.1.0: {} 2516 | 2517 | chai@6.2.1: {} 2518 | 2519 | chalk@4.1.2: 2520 | dependencies: 2521 | ansi-styles: 4.3.0 2522 | supports-color: 7.2.0 2523 | 2524 | chokidar@4.0.3: 2525 | dependencies: 2526 | readdirp: 4.1.2 2527 | 2528 | color-convert@2.0.1: 2529 | dependencies: 2530 | color-name: 1.1.4 2531 | 2532 | color-name@1.1.4: {} 2533 | 2534 | commander@4.1.1: {} 2535 | 2536 | concat-map@0.0.1: {} 2537 | 2538 | confbox@0.1.8: {} 2539 | 2540 | consola@3.4.2: {} 2541 | 2542 | cross-spawn@7.0.6: 2543 | dependencies: 2544 | path-key: 3.1.1 2545 | shebang-command: 2.0.0 2546 | which: 2.0.2 2547 | 2548 | css-tree@3.1.0: 2549 | dependencies: 2550 | mdn-data: 2.12.2 2551 | source-map-js: 1.2.1 2552 | optional: true 2553 | 2554 | cssstyle@5.3.2: 2555 | dependencies: 2556 | '@asamuzakjp/css-color': 4.1.0 2557 | '@csstools/css-syntax-patches-for-csstree': 1.0.20 2558 | css-tree: 3.1.0 2559 | optional: true 2560 | 2561 | data-urls@6.0.0: 2562 | dependencies: 2563 | whatwg-mimetype: 4.0.0 2564 | whatwg-url: 15.1.0 2565 | optional: true 2566 | 2567 | debug@4.4.3: 2568 | dependencies: 2569 | ms: 2.1.3 2570 | 2571 | decimal.js@10.6.0: 2572 | optional: true 2573 | 2574 | deep-is@0.1.4: {} 2575 | 2576 | detect-indent@7.0.2: {} 2577 | 2578 | detect-newline@4.0.1: {} 2579 | 2580 | eastasianwidth@0.2.0: {} 2581 | 2582 | emoji-regex@8.0.0: {} 2583 | 2584 | emoji-regex@9.2.2: {} 2585 | 2586 | entities@6.0.1: 2587 | optional: true 2588 | 2589 | es-module-lexer@1.7.0: {} 2590 | 2591 | esbuild@0.25.12: 2592 | optionalDependencies: 2593 | '@esbuild/aix-ppc64': 0.25.12 2594 | '@esbuild/android-arm': 0.25.12 2595 | '@esbuild/android-arm64': 0.25.12 2596 | '@esbuild/android-x64': 0.25.12 2597 | '@esbuild/darwin-arm64': 0.25.12 2598 | '@esbuild/darwin-x64': 0.25.12 2599 | '@esbuild/freebsd-arm64': 0.25.12 2600 | '@esbuild/freebsd-x64': 0.25.12 2601 | '@esbuild/linux-arm': 0.25.12 2602 | '@esbuild/linux-arm64': 0.25.12 2603 | '@esbuild/linux-ia32': 0.25.12 2604 | '@esbuild/linux-loong64': 0.25.12 2605 | '@esbuild/linux-mips64el': 0.25.12 2606 | '@esbuild/linux-ppc64': 0.25.12 2607 | '@esbuild/linux-riscv64': 0.25.12 2608 | '@esbuild/linux-s390x': 0.25.12 2609 | '@esbuild/linux-x64': 0.25.12 2610 | '@esbuild/netbsd-arm64': 0.25.12 2611 | '@esbuild/netbsd-x64': 0.25.12 2612 | '@esbuild/openbsd-arm64': 0.25.12 2613 | '@esbuild/openbsd-x64': 0.25.12 2614 | '@esbuild/openharmony-arm64': 0.25.12 2615 | '@esbuild/sunos-x64': 0.25.12 2616 | '@esbuild/win32-arm64': 0.25.12 2617 | '@esbuild/win32-ia32': 0.25.12 2618 | '@esbuild/win32-x64': 0.25.12 2619 | 2620 | esbuild@0.27.0: 2621 | optionalDependencies: 2622 | '@esbuild/aix-ppc64': 0.27.0 2623 | '@esbuild/android-arm': 0.27.0 2624 | '@esbuild/android-arm64': 0.27.0 2625 | '@esbuild/android-x64': 0.27.0 2626 | '@esbuild/darwin-arm64': 0.27.0 2627 | '@esbuild/darwin-x64': 0.27.0 2628 | '@esbuild/freebsd-arm64': 0.27.0 2629 | '@esbuild/freebsd-x64': 0.27.0 2630 | '@esbuild/linux-arm': 0.27.0 2631 | '@esbuild/linux-arm64': 0.27.0 2632 | '@esbuild/linux-ia32': 0.27.0 2633 | '@esbuild/linux-loong64': 0.27.0 2634 | '@esbuild/linux-mips64el': 0.27.0 2635 | '@esbuild/linux-ppc64': 0.27.0 2636 | '@esbuild/linux-riscv64': 0.27.0 2637 | '@esbuild/linux-s390x': 0.27.0 2638 | '@esbuild/linux-x64': 0.27.0 2639 | '@esbuild/netbsd-arm64': 0.27.0 2640 | '@esbuild/netbsd-x64': 0.27.0 2641 | '@esbuild/openbsd-arm64': 0.27.0 2642 | '@esbuild/openbsd-x64': 0.27.0 2643 | '@esbuild/openharmony-arm64': 0.27.0 2644 | '@esbuild/sunos-x64': 0.27.0 2645 | '@esbuild/win32-arm64': 0.27.0 2646 | '@esbuild/win32-ia32': 0.27.0 2647 | '@esbuild/win32-x64': 0.27.0 2648 | 2649 | escape-string-regexp@4.0.0: {} 2650 | 2651 | eslint-scope@8.4.0: 2652 | dependencies: 2653 | esrecurse: 4.3.0 2654 | estraverse: 5.3.0 2655 | 2656 | eslint-visitor-keys@3.4.3: {} 2657 | 2658 | eslint-visitor-keys@4.2.1: {} 2659 | 2660 | eslint@9.39.1(jiti@2.5.1): 2661 | dependencies: 2662 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) 2663 | '@eslint-community/regexpp': 4.12.2 2664 | '@eslint/config-array': 0.21.1 2665 | '@eslint/config-helpers': 0.4.2 2666 | '@eslint/core': 0.17.0 2667 | '@eslint/eslintrc': 3.3.1 2668 | '@eslint/js': 9.39.1 2669 | '@eslint/plugin-kit': 0.4.1 2670 | '@humanfs/node': 0.16.7 2671 | '@humanwhocodes/module-importer': 1.0.1 2672 | '@humanwhocodes/retry': 0.4.3 2673 | '@types/estree': 1.0.8 2674 | ajv: 6.12.6 2675 | chalk: 4.1.2 2676 | cross-spawn: 7.0.6 2677 | debug: 4.4.3 2678 | escape-string-regexp: 4.0.0 2679 | eslint-scope: 8.4.0 2680 | eslint-visitor-keys: 4.2.1 2681 | espree: 10.4.0 2682 | esquery: 1.6.0 2683 | esutils: 2.0.3 2684 | fast-deep-equal: 3.1.3 2685 | file-entry-cache: 8.0.0 2686 | find-up: 5.0.0 2687 | glob-parent: 6.0.2 2688 | ignore: 5.3.2 2689 | imurmurhash: 0.1.4 2690 | is-glob: 4.0.3 2691 | json-stable-stringify-without-jsonify: 1.0.1 2692 | lodash.merge: 4.6.2 2693 | minimatch: 3.1.2 2694 | natural-compare: 1.4.0 2695 | optionator: 0.9.4 2696 | optionalDependencies: 2697 | jiti: 2.5.1 2698 | transitivePeerDependencies: 2699 | - supports-color 2700 | 2701 | espree@10.4.0: 2702 | dependencies: 2703 | acorn: 8.15.0 2704 | acorn-jsx: 5.3.2(acorn@8.15.0) 2705 | eslint-visitor-keys: 4.2.1 2706 | 2707 | esquery@1.6.0: 2708 | dependencies: 2709 | estraverse: 5.3.0 2710 | 2711 | esrecurse@4.3.0: 2712 | dependencies: 2713 | estraverse: 5.3.0 2714 | 2715 | estraverse@5.3.0: {} 2716 | 2717 | estree-walker@3.0.3: 2718 | dependencies: 2719 | '@types/estree': 1.0.8 2720 | 2721 | esutils@2.0.3: {} 2722 | 2723 | expect-type@1.2.2: {} 2724 | 2725 | fast-deep-equal@3.1.3: {} 2726 | 2727 | fast-glob@3.3.3: 2728 | dependencies: 2729 | '@nodelib/fs.stat': 2.0.5 2730 | '@nodelib/fs.walk': 1.2.8 2731 | glob-parent: 5.1.2 2732 | merge2: 1.4.1 2733 | micromatch: 4.0.8 2734 | 2735 | fast-json-stable-stringify@2.1.0: {} 2736 | 2737 | fast-levenshtein@2.0.6: {} 2738 | 2739 | fastq@1.19.1: 2740 | dependencies: 2741 | reusify: 1.1.0 2742 | 2743 | fdir@6.5.0(picomatch@4.0.3): 2744 | optionalDependencies: 2745 | picomatch: 4.0.3 2746 | 2747 | file-entry-cache@8.0.0: 2748 | dependencies: 2749 | flat-cache: 4.0.1 2750 | 2751 | fill-range@7.1.1: 2752 | dependencies: 2753 | to-regex-range: 5.0.1 2754 | 2755 | find-up@5.0.0: 2756 | dependencies: 2757 | locate-path: 6.0.0 2758 | path-exists: 4.0.0 2759 | 2760 | fix-dts-default-cjs-exports@1.0.1: 2761 | dependencies: 2762 | magic-string: 0.30.21 2763 | mlly: 1.8.0 2764 | rollup: 4.52.5 2765 | 2766 | flat-cache@4.0.1: 2767 | dependencies: 2768 | flatted: 3.3.3 2769 | keyv: 4.5.4 2770 | 2771 | flatted@3.3.3: {} 2772 | 2773 | foreground-child@3.3.1: 2774 | dependencies: 2775 | cross-spawn: 7.0.6 2776 | signal-exit: 4.1.0 2777 | 2778 | fsevents@2.3.2: 2779 | optional: true 2780 | 2781 | fsevents@2.3.3: 2782 | optional: true 2783 | 2784 | get-tsconfig@4.13.0: 2785 | dependencies: 2786 | resolve-pkg-maps: 1.0.0 2787 | optional: true 2788 | 2789 | git-hooks-list@4.1.1: {} 2790 | 2791 | glob-parent@5.1.2: 2792 | dependencies: 2793 | is-glob: 4.0.3 2794 | 2795 | glob-parent@6.0.2: 2796 | dependencies: 2797 | is-glob: 4.0.3 2798 | 2799 | glob@10.4.5: 2800 | dependencies: 2801 | foreground-child: 3.3.1 2802 | jackspeak: 3.4.3 2803 | minimatch: 9.0.5 2804 | minipass: 7.1.2 2805 | package-json-from-dist: 1.0.1 2806 | path-scurry: 1.11.1 2807 | 2808 | globals@14.0.0: {} 2809 | 2810 | globals@16.5.0: {} 2811 | 2812 | graphemer@1.4.0: {} 2813 | 2814 | has-flag@4.0.0: {} 2815 | 2816 | html-encoding-sniffer@4.0.0: 2817 | dependencies: 2818 | whatwg-encoding: 3.1.1 2819 | optional: true 2820 | 2821 | http-proxy-agent@7.0.2: 2822 | dependencies: 2823 | agent-base: 7.1.4 2824 | debug: 4.4.3 2825 | transitivePeerDependencies: 2826 | - supports-color 2827 | optional: true 2828 | 2829 | https-proxy-agent@7.0.6: 2830 | dependencies: 2831 | agent-base: 7.1.4 2832 | debug: 4.4.3 2833 | transitivePeerDependencies: 2834 | - supports-color 2835 | optional: true 2836 | 2837 | iconv-lite@0.6.3: 2838 | dependencies: 2839 | safer-buffer: 2.1.2 2840 | optional: true 2841 | 2842 | ignore@5.3.2: {} 2843 | 2844 | ignore@7.0.5: {} 2845 | 2846 | import-fresh@3.3.1: 2847 | dependencies: 2848 | parent-module: 1.0.1 2849 | resolve-from: 4.0.0 2850 | 2851 | imurmurhash@0.1.4: {} 2852 | 2853 | is-extglob@2.1.1: {} 2854 | 2855 | is-fullwidth-code-point@3.0.0: {} 2856 | 2857 | is-glob@4.0.3: 2858 | dependencies: 2859 | is-extglob: 2.1.1 2860 | 2861 | is-number@7.0.0: {} 2862 | 2863 | is-plain-obj@4.1.0: {} 2864 | 2865 | is-potential-custom-element-name@1.0.1: 2866 | optional: true 2867 | 2868 | isexe@2.0.0: {} 2869 | 2870 | jackspeak@3.4.3: 2871 | dependencies: 2872 | '@isaacs/cliui': 8.0.2 2873 | optionalDependencies: 2874 | '@pkgjs/parseargs': 0.11.0 2875 | 2876 | jiti@2.5.1: 2877 | optional: true 2878 | 2879 | joycon@3.1.1: {} 2880 | 2881 | js-tokens@4.0.0: {} 2882 | 2883 | js-yaml@4.1.0: 2884 | dependencies: 2885 | argparse: 2.0.1 2886 | 2887 | jsdom@27.1.0: 2888 | dependencies: 2889 | '@acemir/cssom': 0.9.26 2890 | '@asamuzakjp/dom-selector': 6.7.6 2891 | cssstyle: 5.3.2 2892 | data-urls: 6.0.0 2893 | decimal.js: 10.6.0 2894 | html-encoding-sniffer: 4.0.0 2895 | http-proxy-agent: 7.0.2 2896 | https-proxy-agent: 7.0.6 2897 | is-potential-custom-element-name: 1.0.1 2898 | parse5: 8.0.0 2899 | saxes: 6.0.0 2900 | symbol-tree: 3.2.4 2901 | tough-cookie: 6.0.0 2902 | w3c-xmlserializer: 5.0.0 2903 | webidl-conversions: 8.0.0 2904 | whatwg-encoding: 3.1.1 2905 | whatwg-mimetype: 4.0.0 2906 | whatwg-url: 15.1.0 2907 | ws: 8.18.3 2908 | xml-name-validator: 5.0.0 2909 | transitivePeerDependencies: 2910 | - bufferutil 2911 | - supports-color 2912 | - utf-8-validate 2913 | optional: true 2914 | 2915 | jsesc@3.1.0: {} 2916 | 2917 | json-buffer@3.0.1: {} 2918 | 2919 | json-schema-traverse@0.4.1: {} 2920 | 2921 | json-stable-stringify-without-jsonify@1.0.1: {} 2922 | 2923 | keyv@4.5.4: 2924 | dependencies: 2925 | json-buffer: 3.0.1 2926 | 2927 | levn@0.4.1: 2928 | dependencies: 2929 | prelude-ls: 1.2.1 2930 | type-check: 0.4.0 2931 | 2932 | lilconfig@3.1.3: {} 2933 | 2934 | lines-and-columns@1.2.4: {} 2935 | 2936 | load-tsconfig@0.2.5: {} 2937 | 2938 | locate-path@6.0.0: 2939 | dependencies: 2940 | p-locate: 5.0.0 2941 | 2942 | lodash.merge@4.6.2: {} 2943 | 2944 | lru-cache@10.4.3: {} 2945 | 2946 | lru-cache@11.2.4: 2947 | optional: true 2948 | 2949 | magic-string@0.30.21: 2950 | dependencies: 2951 | '@jridgewell/sourcemap-codec': 1.5.5 2952 | 2953 | mdn-data@2.12.2: 2954 | optional: true 2955 | 2956 | merge2@1.4.1: {} 2957 | 2958 | micromatch@4.0.8: 2959 | dependencies: 2960 | braces: 3.0.3 2961 | picomatch: 2.3.1 2962 | 2963 | minimatch@3.1.2: 2964 | dependencies: 2965 | brace-expansion: 1.1.12 2966 | 2967 | minimatch@9.0.5: 2968 | dependencies: 2969 | brace-expansion: 2.0.2 2970 | 2971 | minipass@7.1.2: {} 2972 | 2973 | mlly@1.8.0: 2974 | dependencies: 2975 | acorn: 8.15.0 2976 | pathe: 2.0.3 2977 | pkg-types: 1.3.1 2978 | ufo: 1.6.1 2979 | 2980 | mrmime@2.0.1: {} 2981 | 2982 | ms@2.1.3: {} 2983 | 2984 | mvdan-sh@0.10.1: {} 2985 | 2986 | mz@2.7.0: 2987 | dependencies: 2988 | any-promise: 1.3.0 2989 | object-assign: 4.1.1 2990 | thenify-all: 1.6.0 2991 | 2992 | nanoid@3.3.11: {} 2993 | 2994 | natural-compare@1.4.0: {} 2995 | 2996 | object-assign@4.1.1: {} 2997 | 2998 | obug@2.1.1: {} 2999 | 3000 | optionator@0.9.4: 3001 | dependencies: 3002 | deep-is: 0.1.4 3003 | fast-levenshtein: 2.0.6 3004 | levn: 0.4.1 3005 | prelude-ls: 1.2.1 3006 | type-check: 0.4.0 3007 | word-wrap: 1.2.5 3008 | 3009 | p-limit@3.1.0: 3010 | dependencies: 3011 | yocto-queue: 0.1.0 3012 | 3013 | p-locate@5.0.0: 3014 | dependencies: 3015 | p-limit: 3.1.0 3016 | 3017 | package-json-from-dist@1.0.1: {} 3018 | 3019 | parent-module@1.0.1: 3020 | dependencies: 3021 | callsites: 3.1.0 3022 | 3023 | parse5@8.0.0: 3024 | dependencies: 3025 | entities: 6.0.1 3026 | optional: true 3027 | 3028 | path-exists@4.0.0: {} 3029 | 3030 | path-key@3.1.1: {} 3031 | 3032 | path-scurry@1.11.1: 3033 | dependencies: 3034 | lru-cache: 10.4.3 3035 | minipass: 7.1.2 3036 | 3037 | pathe@2.0.3: {} 3038 | 3039 | picocolors@1.1.1: {} 3040 | 3041 | picomatch@2.3.1: {} 3042 | 3043 | picomatch@4.0.3: {} 3044 | 3045 | pirates@4.0.7: {} 3046 | 3047 | pixelmatch@7.1.0: 3048 | dependencies: 3049 | pngjs: 7.0.0 3050 | 3051 | pkg-types@1.3.1: 3052 | dependencies: 3053 | confbox: 0.1.8 3054 | mlly: 1.8.0 3055 | pathe: 2.0.3 3056 | 3057 | playwright-core@1.54.2: {} 3058 | 3059 | playwright@1.54.2: 3060 | dependencies: 3061 | playwright-core: 1.54.2 3062 | optionalDependencies: 3063 | fsevents: 2.3.2 3064 | 3065 | pngjs@7.0.0: {} 3066 | 3067 | postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6): 3068 | dependencies: 3069 | lilconfig: 3.1.3 3070 | optionalDependencies: 3071 | jiti: 2.5.1 3072 | postcss: 8.5.6 3073 | tsx: 4.20.6 3074 | 3075 | postcss@8.5.6: 3076 | dependencies: 3077 | nanoid: 3.3.11 3078 | picocolors: 1.1.1 3079 | source-map-js: 1.2.1 3080 | 3081 | prelude-ls@1.2.1: {} 3082 | 3083 | prettier-plugin-packagejson@2.5.18(prettier@3.7.4): 3084 | dependencies: 3085 | sort-package-json: 3.4.0 3086 | synckit: 0.11.8 3087 | optionalDependencies: 3088 | prettier: 3.7.4 3089 | 3090 | prettier-plugin-sh@0.15.0(prettier@3.7.4): 3091 | dependencies: 3092 | mvdan-sh: 0.10.1 3093 | prettier: 3.7.4 3094 | sh-syntax: 0.4.2 3095 | 3096 | prettier@3.7.4: {} 3097 | 3098 | punycode@2.3.1: {} 3099 | 3100 | queue-microtask@1.2.3: {} 3101 | 3102 | readdirp@4.1.2: {} 3103 | 3104 | require-from-string@2.0.2: 3105 | optional: true 3106 | 3107 | resolve-from@4.0.0: {} 3108 | 3109 | resolve-from@5.0.0: {} 3110 | 3111 | resolve-pkg-maps@1.0.0: 3112 | optional: true 3113 | 3114 | reusify@1.1.0: {} 3115 | 3116 | rollup@4.52.5: 3117 | dependencies: 3118 | '@types/estree': 1.0.8 3119 | optionalDependencies: 3120 | '@rollup/rollup-android-arm-eabi': 4.52.5 3121 | '@rollup/rollup-android-arm64': 4.52.5 3122 | '@rollup/rollup-darwin-arm64': 4.52.5 3123 | '@rollup/rollup-darwin-x64': 4.52.5 3124 | '@rollup/rollup-freebsd-arm64': 4.52.5 3125 | '@rollup/rollup-freebsd-x64': 4.52.5 3126 | '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 3127 | '@rollup/rollup-linux-arm-musleabihf': 4.52.5 3128 | '@rollup/rollup-linux-arm64-gnu': 4.52.5 3129 | '@rollup/rollup-linux-arm64-musl': 4.52.5 3130 | '@rollup/rollup-linux-loong64-gnu': 4.52.5 3131 | '@rollup/rollup-linux-ppc64-gnu': 4.52.5 3132 | '@rollup/rollup-linux-riscv64-gnu': 4.52.5 3133 | '@rollup/rollup-linux-riscv64-musl': 4.52.5 3134 | '@rollup/rollup-linux-s390x-gnu': 4.52.5 3135 | '@rollup/rollup-linux-x64-gnu': 4.52.5 3136 | '@rollup/rollup-linux-x64-musl': 4.52.5 3137 | '@rollup/rollup-openharmony-arm64': 4.52.5 3138 | '@rollup/rollup-win32-arm64-msvc': 4.52.5 3139 | '@rollup/rollup-win32-ia32-msvc': 4.52.5 3140 | '@rollup/rollup-win32-x64-gnu': 4.52.5 3141 | '@rollup/rollup-win32-x64-msvc': 4.52.5 3142 | fsevents: 2.3.3 3143 | 3144 | run-parallel@1.2.0: 3145 | dependencies: 3146 | queue-microtask: 1.2.3 3147 | 3148 | safer-buffer@2.1.2: 3149 | optional: true 3150 | 3151 | saxes@6.0.0: 3152 | dependencies: 3153 | xmlchars: 2.2.0 3154 | optional: true 3155 | 3156 | semver@7.7.3: {} 3157 | 3158 | sh-syntax@0.4.2: 3159 | dependencies: 3160 | tslib: 2.8.1 3161 | 3162 | shebang-command@2.0.0: 3163 | dependencies: 3164 | shebang-regex: 3.0.0 3165 | 3166 | shebang-regex@3.0.0: {} 3167 | 3168 | siginfo@2.0.0: {} 3169 | 3170 | signal-exit@4.1.0: {} 3171 | 3172 | sirv@3.0.2: 3173 | dependencies: 3174 | '@polka/url': 1.0.0-next.29 3175 | mrmime: 2.0.1 3176 | totalist: 3.0.1 3177 | 3178 | sort-object-keys@1.1.3: {} 3179 | 3180 | sort-package-json@3.4.0: 3181 | dependencies: 3182 | detect-indent: 7.0.2 3183 | detect-newline: 4.0.1 3184 | git-hooks-list: 4.1.1 3185 | is-plain-obj: 4.1.0 3186 | semver: 7.7.3 3187 | sort-object-keys: 1.1.3 3188 | tinyglobby: 0.2.15 3189 | 3190 | source-map-js@1.2.1: {} 3191 | 3192 | source-map@0.7.6: {} 3193 | 3194 | stackback@0.0.2: {} 3195 | 3196 | std-env@3.10.0: {} 3197 | 3198 | string-width@4.2.3: 3199 | dependencies: 3200 | emoji-regex: 8.0.0 3201 | is-fullwidth-code-point: 3.0.0 3202 | strip-ansi: 6.0.1 3203 | 3204 | string-width@5.1.2: 3205 | dependencies: 3206 | eastasianwidth: 0.2.0 3207 | emoji-regex: 9.2.2 3208 | strip-ansi: 7.1.2 3209 | 3210 | strip-ansi@6.0.1: 3211 | dependencies: 3212 | ansi-regex: 5.0.1 3213 | 3214 | strip-ansi@7.1.2: 3215 | dependencies: 3216 | ansi-regex: 6.2.2 3217 | 3218 | strip-json-comments@3.1.1: {} 3219 | 3220 | sucrase@3.35.0: 3221 | dependencies: 3222 | '@jridgewell/gen-mapping': 0.3.13 3223 | commander: 4.1.1 3224 | glob: 10.4.5 3225 | lines-and-columns: 1.2.4 3226 | mz: 2.7.0 3227 | pirates: 4.0.7 3228 | ts-interface-checker: 0.1.13 3229 | 3230 | supports-color@7.2.0: 3231 | dependencies: 3232 | has-flag: 4.0.0 3233 | 3234 | symbol-tree@3.2.4: 3235 | optional: true 3236 | 3237 | synckit@0.11.8: 3238 | dependencies: 3239 | '@pkgr/core': 0.2.9 3240 | 3241 | thenify-all@1.6.0: 3242 | dependencies: 3243 | thenify: 3.3.1 3244 | 3245 | thenify@3.3.1: 3246 | dependencies: 3247 | any-promise: 1.3.0 3248 | 3249 | tinybench@2.9.0: {} 3250 | 3251 | tinyexec@0.3.2: {} 3252 | 3253 | tinyexec@1.0.2: {} 3254 | 3255 | tinyglobby@0.2.15: 3256 | dependencies: 3257 | fdir: 6.5.0(picomatch@4.0.3) 3258 | picomatch: 4.0.3 3259 | 3260 | tinyrainbow@3.0.3: {} 3261 | 3262 | tldts-core@7.0.8: 3263 | optional: true 3264 | 3265 | tldts@7.0.8: 3266 | dependencies: 3267 | tldts-core: 7.0.8 3268 | optional: true 3269 | 3270 | to-regex-range@5.0.1: 3271 | dependencies: 3272 | is-number: 7.0.0 3273 | 3274 | totalist@3.0.1: {} 3275 | 3276 | tough-cookie@6.0.0: 3277 | dependencies: 3278 | tldts: 7.0.8 3279 | optional: true 3280 | 3281 | tr46@6.0.0: 3282 | dependencies: 3283 | punycode: 2.3.1 3284 | optional: true 3285 | 3286 | tree-kill@1.2.2: {} 3287 | 3288 | ts-api-utils@2.1.0(typescript@5.9.3): 3289 | dependencies: 3290 | typescript: 5.9.3 3291 | 3292 | ts-interface-checker@0.1.13: {} 3293 | 3294 | tslib@2.8.1: {} 3295 | 3296 | tsup@8.5.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3): 3297 | dependencies: 3298 | bundle-require: 5.1.0(esbuild@0.27.0) 3299 | cac: 6.7.14 3300 | chokidar: 4.0.3 3301 | consola: 3.4.2 3302 | debug: 4.4.3 3303 | esbuild: 0.27.0 3304 | fix-dts-default-cjs-exports: 1.0.1 3305 | joycon: 3.1.1 3306 | picocolors: 1.1.1 3307 | postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6) 3308 | resolve-from: 5.0.0 3309 | rollup: 4.52.5 3310 | source-map: 0.7.6 3311 | sucrase: 3.35.0 3312 | tinyexec: 0.3.2 3313 | tinyglobby: 0.2.15 3314 | tree-kill: 1.2.2 3315 | optionalDependencies: 3316 | postcss: 8.5.6 3317 | typescript: 5.9.3 3318 | transitivePeerDependencies: 3319 | - jiti 3320 | - supports-color 3321 | - tsx 3322 | - yaml 3323 | 3324 | tsx@4.20.6: 3325 | dependencies: 3326 | esbuild: 0.25.12 3327 | get-tsconfig: 4.13.0 3328 | optionalDependencies: 3329 | fsevents: 2.3.3 3330 | optional: true 3331 | 3332 | type-check@0.4.0: 3333 | dependencies: 3334 | prelude-ls: 1.2.1 3335 | 3336 | typescript-eslint@8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3): 3337 | dependencies: 3338 | '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3) 3339 | '@typescript-eslint/parser': 8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3) 3340 | '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) 3341 | '@typescript-eslint/utils': 8.46.2(eslint@9.39.1(jiti@2.5.1))(typescript@5.9.3) 3342 | eslint: 9.39.1(jiti@2.5.1) 3343 | typescript: 5.9.3 3344 | transitivePeerDependencies: 3345 | - supports-color 3346 | 3347 | typescript@5.9.3: {} 3348 | 3349 | ufo@1.6.1: {} 3350 | 3351 | undici-types@7.16.0: {} 3352 | 3353 | uri-js@4.4.1: 3354 | dependencies: 3355 | punycode: 2.3.1 3356 | 3357 | vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6): 3358 | dependencies: 3359 | esbuild: 0.25.12 3360 | fdir: 6.5.0(picomatch@4.0.3) 3361 | picomatch: 4.0.3 3362 | postcss: 8.5.6 3363 | rollup: 4.52.5 3364 | tinyglobby: 0.2.15 3365 | optionalDependencies: 3366 | '@types/node': 24.10.1 3367 | fsevents: 2.3.3 3368 | jiti: 2.5.1 3369 | tsx: 4.20.6 3370 | 3371 | vitest@4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.5.1)(jsdom@27.1.0)(tsx@4.20.6): 3372 | dependencies: 3373 | '@vitest/expect': 4.0.15 3374 | '@vitest/mocker': 4.0.15(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6)) 3375 | '@vitest/pretty-format': 4.0.15 3376 | '@vitest/runner': 4.0.15 3377 | '@vitest/snapshot': 4.0.15 3378 | '@vitest/spy': 4.0.15 3379 | '@vitest/utils': 4.0.15 3380 | es-module-lexer: 1.7.0 3381 | expect-type: 1.2.2 3382 | magic-string: 0.30.21 3383 | obug: 2.1.1 3384 | pathe: 2.0.3 3385 | picomatch: 4.0.3 3386 | std-env: 3.10.0 3387 | tinybench: 2.9.0 3388 | tinyexec: 1.0.2 3389 | tinyglobby: 0.2.15 3390 | tinyrainbow: 3.0.3 3391 | vite: 7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6) 3392 | why-is-node-running: 2.3.0 3393 | optionalDependencies: 3394 | '@types/node': 24.10.1 3395 | '@vitest/browser-playwright': 4.0.15(playwright@1.54.2)(vite@7.1.12(@types/node@24.10.1)(jiti@2.5.1)(tsx@4.20.6))(vitest@4.0.15) 3396 | jsdom: 27.1.0 3397 | transitivePeerDependencies: 3398 | - jiti 3399 | - less 3400 | - lightningcss 3401 | - msw 3402 | - sass 3403 | - sass-embedded 3404 | - stylus 3405 | - sugarss 3406 | - terser 3407 | - tsx 3408 | - yaml 3409 | 3410 | w3c-xmlserializer@5.0.0: 3411 | dependencies: 3412 | xml-name-validator: 5.0.0 3413 | optional: true 3414 | 3415 | webidl-conversions@8.0.0: 3416 | optional: true 3417 | 3418 | whatwg-encoding@3.1.1: 3419 | dependencies: 3420 | iconv-lite: 0.6.3 3421 | optional: true 3422 | 3423 | whatwg-mimetype@4.0.0: 3424 | optional: true 3425 | 3426 | whatwg-url@15.1.0: 3427 | dependencies: 3428 | tr46: 6.0.0 3429 | webidl-conversions: 8.0.0 3430 | optional: true 3431 | 3432 | which@2.0.2: 3433 | dependencies: 3434 | isexe: 2.0.0 3435 | 3436 | why-is-node-running@2.3.0: 3437 | dependencies: 3438 | siginfo: 2.0.0 3439 | stackback: 0.0.2 3440 | 3441 | word-wrap@1.2.5: {} 3442 | 3443 | wrap-ansi@7.0.0: 3444 | dependencies: 3445 | ansi-styles: 4.3.0 3446 | string-width: 4.2.3 3447 | strip-ansi: 6.0.1 3448 | 3449 | wrap-ansi@8.1.0: 3450 | dependencies: 3451 | ansi-styles: 6.2.3 3452 | string-width: 5.1.2 3453 | strip-ansi: 7.1.2 3454 | 3455 | ws@8.18.3: {} 3456 | 3457 | xml-name-validator@5.0.0: 3458 | optional: true 3459 | 3460 | xmlchars@2.2.0: 3461 | optional: true 3462 | 3463 | yocto-queue@0.1.0: {} 3464 | --------------------------------------------------------------------------------