├── .gitignore ├── tsup.config.ts ├── src ├── index.ts ├── prefix.ts ├── parse_uuid.ts ├── unboxed │ ├── error.ts │ ├── README.md │ └── typeid.ts ├── typeid.ts └── base32.ts ├── .github └── pull_request_template.md ├── devbox.json ├── jest.config.ts ├── test ├── base32.test.ts ├── valid.ts ├── invalid.ts ├── typeid_unboxed.test.ts └── typeid.test.ts ├── tsconfig.json ├── CONTRIBUTING.md ├── package.json ├── devbox.lock ├── README.md ├── CODE_OF_CONDUCT.md ├── LICENSE └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | node_modules 4 | .pnp.* 5 | 6 | .turbo 7 | build/** 8 | dist/** 9 | .next/** 10 | coverage/** 11 | .devbox 12 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["./src/index.ts"], 5 | sourcemap: true, 6 | }); 7 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { typeid, TypeID } from "./typeid"; 2 | export { 3 | type TypeId, 4 | typeidUnboxed, 5 | fromString, 6 | parseTypeId, 7 | getType, 8 | getSuffix, 9 | toUUIDBytes, 10 | toUUID, 11 | fromUUIDBytes, 12 | fromUUID, 13 | } from "./unboxed/typeid"; 14 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | # ⚠️ Submit PRs in our opensource monorepo instead ⚠️ 2 | 3 | This repository is automatically published from our opensource monorepo: 4 | https://github.com/jetify-com/opensource 5 | 6 | If you want to contribute code changes to this project, please submit your 7 | PR via the monorepo. 8 | -------------------------------------------------------------------------------- /devbox.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.10.4/.schema/devbox.schema.json", 3 | "packages": [ 4 | "nodejs@latest" 5 | ], 6 | "env": { 7 | "DEVBOX_COREPACK_ENABLED": "true" 8 | }, 9 | "shell": { 10 | "init_hook": [ 11 | "pnpm install" 12 | ], 13 | "scripts": { 14 | "build": "pnpm run build", 15 | "test": "pnpm run test" 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | import type { JestConfigWithTsJest } from "ts-jest"; 2 | 3 | const config: JestConfigWithTsJest = { 4 | roots: ["/test"], 5 | transform: { 6 | "\\.[jt]s?$": [ 7 | "ts-jest", 8 | { 9 | tsconfig: "./tsconfig.json", 10 | }, 11 | ], 12 | }, 13 | transformIgnorePatterns: ["node_modules/(?!(.pnpm|uuid))"], 14 | verbose: true, 15 | }; 16 | 17 | export default config; 18 | -------------------------------------------------------------------------------- /src/prefix.ts: -------------------------------------------------------------------------------- 1 | export function isValidPrefix(str: string): boolean { 2 | if (str.length > 63) { 3 | return false; 4 | } 5 | 6 | let code; 7 | let i; 8 | let len; 9 | 10 | for (i = 0, len = str.length; i < len; i += 1) { 11 | code = str.charCodeAt(i); 12 | const isLowerAtoZ = code > 96 && code < 123; 13 | const isUnderscore = code === 95; 14 | 15 | // first and last char of prefix can only be [a-z] 16 | if ((i === 0 || i === len - 1) && !isLowerAtoZ) { 17 | return false; 18 | } 19 | 20 | if (!(isLowerAtoZ || isUnderscore)) { 21 | return false; 22 | } 23 | } 24 | return true; 25 | } 26 | -------------------------------------------------------------------------------- /test/base32.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "@jest/globals"; 2 | 3 | import { encode, decode } from "../src/base32"; 4 | 5 | describe("Base32", () => { 6 | test("Encode and decode should be inverses", () => { 7 | const originalData = new Uint8Array([ 8 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 9 | ]); 10 | 11 | const encodedData = encode(originalData); 12 | expect(typeof encodedData).toBe("string"); 13 | expect(encodedData).toEqual("00041061050r3gg28a1c60t3gf"); 14 | 15 | const decodedData = decode(encodedData); 16 | expect(decodedData).toEqual(originalData); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "include": ["src/**/*.ts"], 4 | "exclude": ["dist", "build", "node_modules"], 5 | "compilerOptions": { 6 | "lib": ["ES2019"], 7 | "composite": false, 8 | "declaration": true, 9 | "declarationMap": true, 10 | "esModuleInterop": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "inlineSources": false, 13 | "isolatedModules": true, 14 | "module": "ESNext", 15 | "moduleResolution": "node", 16 | "noUnusedLocals": false, 17 | "noUnusedParameters": false, 18 | "preserveWatchOutput": true, 19 | "skipLibCheck": true, 20 | "strict": true, 21 | "target": "ES6", 22 | "allowJs": true 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | When contributing to this repository, please describe the change you wish to 4 | make via a related issue, or a pull request. 5 | 6 | Please note we have a [code of conduct](CODE_OF_CONDUCT.md), please follow it in 7 | all your interactions with the project. 8 | 9 | ## Opening a Pull Request 10 | 11 | This project is published as a standalone repo from our 12 | [opensource monorepo](https://github.com/jetify-com/opensource). Pull requests 13 | should be sent to the monorepo instead, and they will automatically be published 14 | to this repo when merged. 15 | 16 | Contributions made to this project must be made under the terms of the 17 | [Apache 2 License](https://www.apache.org/licenses/LICENSE-2.0). 18 | By contributing to this project you agree to the terms stated in the 19 | [Community Contribution License](https://github.com/jetify-com/opensource/blob/main/CONTRIBUTING.md#community-contribution-license). 20 | -------------------------------------------------------------------------------- /src/parse_uuid.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-bitwise */ 2 | export function parseUUID(uuid: string) { 3 | let v; 4 | const arr = new Uint8Array(16); 5 | 6 | // Block 1 7 | arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; 8 | arr[1] = (v >>> 16) & 0xff; 9 | arr[2] = (v >>> 8) & 0xff; 10 | arr[3] = v & 0xff; 11 | 12 | // Block 2 13 | arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; 14 | arr[5] = v & 0xff; 15 | 16 | // Block 3 17 | arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; 18 | arr[7] = v & 0xff; 19 | 20 | // Block 4 21 | arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; 22 | arr[9] = v & 0xff; 23 | 24 | // Block 5 25 | arr[10] = ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff; 26 | arr[11] = (v / 0x100000000) & 0xff; 27 | arr[12] = (v >>> 24) & 0xff; 28 | arr[13] = (v >>> 16) & 0xff; 29 | arr[14] = (v >>> 8) & 0xff; 30 | arr[15] = v & 0xff; 31 | 32 | return arr; 33 | } 34 | -------------------------------------------------------------------------------- /src/unboxed/error.ts: -------------------------------------------------------------------------------- 1 | export class InvalidPrefixError extends Error { 2 | constructor(prefix: string) { 3 | super(`Invalid prefix "${prefix}". Must be at most 63 ASCII letters [a-z_]`); 4 | this.name = "InvalidPrefixError"; 5 | } 6 | } 7 | 8 | export class PrefixMismatchError extends Error { 9 | constructor(expected: string, actual: string) { 10 | super(`Invalid TypeId. Prefix mismatch. Expected ${expected}, got ${actual}`); 11 | this.name = "PrefixMismatchError"; 12 | } 13 | } 14 | 15 | export class EmptyPrefixError extends Error { 16 | constructor(typeId: string) { 17 | super(`Invalid TypeId. Prefix cannot be empty when there's a separator: ${typeId}`); 18 | this.name = "EmptyPrefixError"; 19 | } 20 | } 21 | 22 | export class InvalidSuffixLengthError extends Error { 23 | constructor(length: number) { 24 | super(`Invalid length. Suffix should have 26 characters, got ${length}`); 25 | this.name = "InvalidSuffixLengthError"; 26 | } 27 | } 28 | 29 | export class InvalidSuffixCharacterError extends Error { 30 | constructor(firstChar: string) { 31 | super(`Invalid suffix. First character "${firstChar}" must be in the range [0-7]`); 32 | this.name = "InvalidSuffixCharacterError"; 33 | } 34 | } 35 | 36 | export class TypeIDConversionError extends Error { 37 | constructor(actualPrefix: string, expectedPrefix: string) { 38 | super(`Cannot convert TypeID of type ${actualPrefix} to type ${expectedPrefix}`); 39 | this.name = "TypeIDConversionError"; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typeid-js", 3 | "version": "1.2.0", 4 | "description": "Official implementation of the TypeID specification in TypeScript. TypeIDs are type-safe, K-sortable, and globally unique identifiers inspired by Stripe IDs", 5 | "keywords": [ 6 | "typeid", 7 | "uuid", 8 | "uuidv7", 9 | "guid" 10 | ], 11 | "homepage": "https://github.com/jetify-com/typeid-js", 12 | "bugs": "https://github.com/jetify-com/typeid-js/issues", 13 | "license": "Apache-2.0", 14 | "author": { 15 | "name": "jetify", 16 | "email": "opensource@jetify.com" 17 | }, 18 | "repository": "github:jetify-com/typeid-js", 19 | "sideEffects": false, 20 | "main": "./dist/index.js", 21 | "module": "./dist/index.mjs", 22 | "types": "./dist/index.d.ts", 23 | "exports": { 24 | ".": { 25 | "require": "./dist/index.js", 26 | "import": "./dist/index.mjs", 27 | "types": "./dist/index.d.ts" 28 | } 29 | }, 30 | "files": [ 31 | "dist/**" 32 | ], 33 | "scripts": { 34 | "build": "tsup --format esm,cjs --dts", 35 | "clean": "rm -rf node_modules && rm -rf dist", 36 | "dev": "tsup --format esm,cjs --watch --dts", 37 | "fmt": "pnpm lint --fix", 38 | "lint": "prettier '(src|test)/**/*.ts' --write", 39 | "test": "jest" 40 | }, 41 | "devDependencies": { 42 | "@jest/globals": "^29.7.0", 43 | "@tsconfig/strictest": "^2.0.8", 44 | "@types/node": "^20.19.25", 45 | "@types/uuid": "^10.0.0", 46 | "jest": "^29.7.0", 47 | "ts-jest": "^29.4.6", 48 | "ts-node": "^10.9.2", 49 | "tsup": "^8.5.1", 50 | "typescript": "^5.9.3" 51 | }, 52 | "dependencies": { 53 | "uuid": "^10.0.0" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /test/valid.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Each example contains: 3 | * - The TypeID in its canonical string representation. 4 | * - The prefix 5 | * - The decoded UUID as a hex string 6 | * 7 | * Data copied over from the typeid valid.yml spec file 8 | * 9 | * Last updated: 2024-04-17 (for version 0.3.0 of the spec) 10 | */ 11 | export default [ 12 | { 13 | name: "nil", 14 | typeid: "00000000000000000000000000", 15 | prefix: "", 16 | uuid: "00000000-0000-0000-0000-000000000000", 17 | }, 18 | { 19 | name: "one", 20 | typeid: "0000000000e008000000000001", 21 | prefix: "", 22 | uuid: "00000000-0000-7000-8000-000000000001", 23 | }, 24 | { 25 | name: "ten", 26 | typeid: "0000000000e00900000000000a", 27 | prefix: "", 28 | uuid: "00000000-0000-7000-9000-00000000000a", 29 | }, 30 | { 31 | name: "sixteen", 32 | typeid: "0000000000e00a00000000000g", 33 | prefix: "", 34 | uuid: "00000000-0000-7000-a000-000000000010", 35 | }, 36 | { 37 | name: "thirty-two", 38 | typeid: "0000000000e00b000000000010", 39 | prefix: "", 40 | uuid: "00000000-0000-7000-b000-000000000020", 41 | }, 42 | { 43 | name: "max-valid", 44 | typeid: "7zzzzzzzzzzzzzzzzzzzzzzzzz", 45 | prefix: "", 46 | uuid: "ffffffff-ffff-ffff-ffff-ffffffffffff", 47 | }, 48 | { 49 | name: "valid-alphabet-like", 50 | typeid: "prefix_0123456789abcbefghjkmnpqrs", 51 | prefix: "prefix", 52 | uuid: "0110c853-1d09-52d8-b73e-1194e95b5f19", 53 | }, 54 | { 55 | name: "valid-uuidv7", 56 | typeid: "prefix_01h455vb4pex5vsknk084sn02q", 57 | prefix: "prefix", 58 | uuid: "01890a5d-ac96-774b-bcce-b302099a8057", 59 | }, 60 | { 61 | // Tests below were added in v0.3.0 when we started allowing '_' within the type prefix. 62 | name: "prefix-underscore", 63 | typeid: "pre_fix_00000000000000000000000000", 64 | prefix: "pre_fix", 65 | uuid: "00000000-0000-0000-0000-000000000000", 66 | }, 67 | ]; 68 | -------------------------------------------------------------------------------- /src/typeid.ts: -------------------------------------------------------------------------------- 1 | import { stringify } from "uuid"; 2 | import { parseUUID } from "./parse_uuid"; 3 | import { encode, decode } from "./base32"; 4 | import { 5 | typeidUnboxed, 6 | getSuffix, 7 | getType, 8 | fromString, 9 | } from "./unboxed/typeid"; 10 | import { TypeIDConversionError } from "./unboxed/error"; 11 | 12 | export class TypeID { 13 | constructor(private prefix: T, private suffix: string = "") { 14 | const typeIdRaw = typeidUnboxed(prefix, suffix); 15 | 16 | this.prefix = getType(typeIdRaw); 17 | this.suffix = getSuffix(typeIdRaw); 18 | } 19 | 20 | public getType(): T { 21 | return this.prefix; 22 | } 23 | 24 | public getSuffix(): string { 25 | return this.suffix; 26 | } 27 | 28 | public asType(prefix: U): TypeID { 29 | const self = this as unknown as TypeID; 30 | if (self.prefix !== prefix) { 31 | throw new TypeIDConversionError(self.prefix, prefix); 32 | } 33 | return self; 34 | } 35 | 36 | public toUUIDBytes(): Uint8Array { 37 | return decode(this.suffix); 38 | } 39 | 40 | public toUUID(): string { 41 | return stringify(this.toUUIDBytes()); 42 | } 43 | 44 | public toString(): T extends "" ? string : `${T}_${string}` { 45 | if (this.prefix === "") { 46 | return this.suffix as T extends "" ? string : `${T}_${string}`; 47 | } 48 | return `${this.prefix}_${this.suffix}` as T extends "" ? string : `${T}_${string}`; 49 | } 50 | 51 | static fromString( 52 | str: string, 53 | prefix?: T 54 | ): TypeID { 55 | const typeIdRaw = fromString(str, prefix); 56 | 57 | return new TypeID(getType(typeIdRaw) as T, getSuffix(typeIdRaw)); 58 | } 59 | 60 | static fromUUIDBytes( 61 | prefix: T, 62 | bytes: Uint8Array 63 | ): TypeID { 64 | const suffix = encode(bytes); 65 | return new TypeID(prefix, suffix); 66 | } 67 | 68 | static fromUUID(prefix: T, uuid: string): TypeID { 69 | const suffix = encode(parseUUID(uuid)); 70 | return new TypeID(prefix, suffix); 71 | } 72 | } 73 | 74 | export function typeid(): TypeID<"">; 75 | export function typeid(prefix: T): TypeID; 76 | export function typeid(prefix: T, suffix: string): TypeID; 77 | export function typeid( 78 | prefix: T = "" as T, 79 | suffix: string = "" 80 | ): TypeID { 81 | return new TypeID(prefix, suffix); 82 | } 83 | -------------------------------------------------------------------------------- /devbox.lock: -------------------------------------------------------------------------------- 1 | { 2 | "lockfile_version": "1", 3 | "packages": { 4 | "github:NixOS/nixpkgs/nixpkgs-unstable": { 5 | "resolved": "github:NixOS/nixpkgs/02032da4af073d0f6110540c8677f16d4be0117f?lastModified=1741037377&narHash=sha256-SvtvVKHaUX4Owb%2BPasySwZsoc5VUeTf1px34BByiOxw%3D" 6 | }, 7 | "nodejs@latest": { 8 | "last_modified": "2025-02-28T17:02:31Z", 9 | "plugin_version": "0.0.2", 10 | "resolved": "github:NixOS/nixpkgs/5954d3359cc7178623da6c7fd23dc7f7504d7187#nodejs_23", 11 | "source": "devbox-search", 12 | "version": "23.9.0", 13 | "systems": { 14 | "aarch64-darwin": { 15 | "outputs": [ 16 | { 17 | "name": "out", 18 | "path": "/nix/store/pmigpxrhv9qhnsdsj3v8znpj4ia6zwf3-nodejs-23.9.0", 19 | "default": true 20 | }, 21 | { 22 | "name": "libv8", 23 | "path": "/nix/store/3jggmmyapw5rqygv51i5s7sh9jx94igz-nodejs-23.9.0-libv8" 24 | } 25 | ], 26 | "store_path": "/nix/store/pmigpxrhv9qhnsdsj3v8znpj4ia6zwf3-nodejs-23.9.0" 27 | }, 28 | "aarch64-linux": { 29 | "outputs": [ 30 | { 31 | "name": "out", 32 | "path": "/nix/store/aq8rqs7z0x2viccjf1l9xwzzvds1ia17-nodejs-23.9.0", 33 | "default": true 34 | }, 35 | { 36 | "name": "libv8", 37 | "path": "/nix/store/ac0nb2z39hy72n44y7i6q81dhqxgb238-nodejs-23.9.0-libv8" 38 | } 39 | ], 40 | "store_path": "/nix/store/aq8rqs7z0x2viccjf1l9xwzzvds1ia17-nodejs-23.9.0" 41 | }, 42 | "x86_64-darwin": { 43 | "outputs": [ 44 | { 45 | "name": "out", 46 | "path": "/nix/store/r783ard7h67rabd2k64ibrc3ah1gipx1-nodejs-23.9.0", 47 | "default": true 48 | }, 49 | { 50 | "name": "libv8", 51 | "path": "/nix/store/hf6qgw9lfskf9r54g6cfpr3x4rry8b00-nodejs-23.9.0-libv8" 52 | } 53 | ], 54 | "store_path": "/nix/store/r783ard7h67rabd2k64ibrc3ah1gipx1-nodejs-23.9.0" 55 | }, 56 | "x86_64-linux": { 57 | "outputs": [ 58 | { 59 | "name": "out", 60 | "path": "/nix/store/26sdnhgk7jw7aidxx9qr3j5yv9hyfz8v-nodejs-23.9.0", 61 | "default": true 62 | }, 63 | { 64 | "name": "libv8", 65 | "path": "/nix/store/kp2d8m1ph83z0w8y2rzx718ykf7my8yr-nodejs-23.9.0-libv8" 66 | } 67 | ], 68 | "store_path": "/nix/store/26sdnhgk7jw7aidxx9qr3j5yv9hyfz8v-nodejs-23.9.0" 69 | } 70 | } 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/unboxed/README.md: -------------------------------------------------------------------------------- 1 | # typeid-unboxed 2 | 3 | ### An unboxed TypeScript implementation of [TypeIDs](https://github.com/jetify-com/typeid), using strings for runtime representation. 4 | 5 | In addition to the class implementation of TypeID (which uses class instances at runtime), we incorporated [typeid-unboxed](https://github.com/ozanmakes/typeid-unboxed) source code that utilizes strings in runtime while achieving type safety through branded types. This implementation offers a lightweight and flexible approach that does not require serialization and de-serialization steps. 6 | 7 | The `TypeID` class uses unboxed `TypeId` under the hood. If you wish to use a string-based representation of TypeID, we recommend you importing the underlying unboxed functions directly. Note that the `TypeID` class is different from the `TypeId` unboxed type, and it is preferred to stick to one versus the other throughout your application. 8 | 9 | # Installation 10 | 11 | Using npm: 12 | 13 | ```bash 14 | npm install typeid-js 15 | ``` 16 | 17 | Using yarn: 18 | 19 | ```bash 20 | yarn add typeid-js 21 | ``` 22 | 23 | Using pnpm: 24 | 25 | ```bash 26 | pnpm add typeid-js 27 | ``` 28 | 29 | # Usage 30 | 31 | To create a random TypeId of a given type, use the `typeidUnboxed()` function: 32 | 33 | ```typescript 34 | import { typeidUnboxed } from 'typeid-js'; 35 | const tid = typeidUnboxed('prefix'); 36 | ``` 37 | 38 | The prefix is optional, so if you need to create an id without a type prefix, you 39 | can do that too: 40 | 41 | ```typescript 42 | import { typeidUnboxed } from 'typeid-js'; 43 | const tid = typeidUnboxed(); 44 | ``` 45 | 46 | The return type of `typeidUnboxed("prefix")` is `TypeId<"prefix">`, which lets you use 47 | TypeScript's type checking to ensure you are passing the correct type prefix to 48 | functions that expect it. 49 | 50 | For example, you can create a function that only accepts TypeIds of type `user`: 51 | 52 | ```typescript 53 | import { typeidUnboxed, TypeId } from 'typeid-js'; 54 | 55 | function doSomethingWithUserID(id: TypeId<'user'>) { 56 | // ... 57 | } 58 | ``` 59 | 60 | In addition to the `typeidUnboxed()` function, `TypeId` has additional methods 61 | to encode/decode from other formats. 62 | 63 | For example, to parse an existing typeid from a string: 64 | 65 | ```typescript 66 | import { fromString } from 'typeid-js'; 67 | 68 | // The second argument is optional, but it converts to type TypeID<"prefix"> instead 69 | // of TypeID 70 | const tid = fromString('prefix_00041061050r3gg28a1c60t3gf', 'prefix'); 71 | ``` 72 | 73 | To encode an existing UUID as a TypeId: 74 | 75 | ```typescript 76 | import { fromUUID } from 'typeid-js'; 77 | 78 | // In this case TypeID<"prefix"> is inferred from the second argument 79 | const tid = fromUUID('00000000-0000-0000-0000-000000000000', 'prefix'); 80 | ``` 81 | 82 | The full list of exported functions includes: 83 | 84 | - `typeidUnboxed(prefix?, suffix?)`: Creates a TypeId with an optional prefix and suffix. 85 | - `fromString(typeId, prefix?)`: Parses a TypeId from a string, optionally validating against a provided prefix. 86 | - `parseTypeId(typeId)`: Parses a TypeId string into its prefix and suffix components. 87 | - `getType(typeId)`: Retrieves the prefix from a TypeId. 88 | - `getSuffix(typeId)`: Retrieves the suffix from a TypeId. 89 | - `toUUID(typeId)`: Decodes the TypeId into a UUID string in hex format. The type prefix is ignored. 90 | - `toUUIDBytes(typeId)`: Decodes the TypeId into a UUID byte array. The type prefix is ignored. 91 | - `fromUUID(uuid, prefix?)`: Creates a TypeId from a UUID in hex format, with an optional prefix. 92 | - `fromUUIDBytes(prefix, bytes)`: Creates a TypeId from a prefix and a UUID in byte array format. 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Official TypeID-JS Package 2 | ![License: Apache 2.0](https://img.shields.io/github/license/jetify-com/typeid) [![Built with Devbox](https://www.jetify.com/img/devbox/shield_galaxy.svg)](https://www.jetify.com/devbox) 3 | 4 | ### JavaScript implementation of [TypeIDs](https://github.com/jetify-com/typeid) using TypeScript. 5 | 6 | TypeIDs are a modern, **type-safe**, globally unique identifier based on the upcoming 7 | UUIDv7 standard. They provide a ton of nice properties that make them a great choice 8 | as the primary identifiers for your data in a database, APIs, and distributed systems. 9 | Read more about TypeIDs in their [spec](https://github.com/jetify-com/typeid). 10 | 11 | This is the official JavaScript / TypeScript implementation of TypeID by the 12 | [jetify](https://www.jetify.com) team. It provides an [npm package](https://www.npmjs.com/package/typeid-js) that can be used by 13 | any JavaScript or TypeScript project. 14 | 15 | #### **_ If you wish to use a string-based representation of typeid (instead of class-based), please follow the instructions [here](src/unboxed/README.md). _** 16 | 17 | # Installation 18 | 19 | Using npm: 20 | 21 | ```bash 22 | npm install typeid-js 23 | ``` 24 | 25 | Using yarn: 26 | 27 | ```bash 28 | yarn add typeid-js 29 | ``` 30 | 31 | Using pnpm: 32 | 33 | ```bash 34 | pnpm add typeid-js 35 | ``` 36 | 37 | Note: this package requires Typescript > 5.0.0 38 | 39 | # Usage 40 | 41 | To create a random TypeID of a given type, use the `typeid()` function: 42 | 43 | ```typescript 44 | import { typeid } from 'typeid-js'; 45 | const tid = typeid('prefix'); 46 | ``` 47 | 48 | The prefix is optional, so if you need to create an id without a type prefix, you 49 | can do that too: 50 | 51 | ```typescript 52 | import { typeid } from 'typeid-js'; 53 | const tid = typeid(); 54 | ``` 55 | 56 | The return type of `typeid("prefix")` is `TypeID<"prefix">`, which lets you use 57 | TypeScript's type checking to ensure you are passing the correct type prefix to 58 | functions that expect it. 59 | 60 | For example, you can create a function that only accepts TypeIDs of type `user`: 61 | 62 | ```typescript 63 | import { typeid, TypeID } from 'typeid-js'; 64 | 65 | function doSomethingWithUserID(id: TypeID<'user'>) { 66 | // ... 67 | } 68 | ``` 69 | 70 | In addition to the `typeid()` function, the `TypeID` class has additional methods 71 | to encode/decode from other formats. 72 | 73 | For example, to parse an existing typeid from a string: 74 | 75 | ```typescript 76 | import { TypeID } from 'typeid-js'; 77 | 78 | // The prefix is optional, but it enforces the prefix and returns a 79 | // TypeID<"prefix"> instead of TypeID 80 | const tid = TypeID.fromString('prefix_00041061050r3gg28a1c60t3gf', 'prefix'); 81 | ``` 82 | 83 | To encode an existing UUID as a TypeID: 84 | 85 | ```typescript 86 | import { TypeID } from 'typeid-js'; 87 | 88 | // In this case TypeID<"prefix"> is inferred from the first argument 89 | const tid = TypeID.fromUUID('prefix', '00000000-0000-0000-0000-000000000000'); 90 | ``` 91 | 92 | The full list of methods includes: 93 | 94 | - `getType()`: Returns the type of the type prefix 95 | - `getSuffix()`: Returns uuid suffix in its base32 representation 96 | - `toString()`: Encodes the object as a string, using the canonical format 97 | - `toUUID()`: Decodes the TypeID into a UUID string in hex format. The type prefix is ignored 98 | - `toUUIDBytes()`: Decodes the TypeID into a UUID byte array. The type prefix is ignored 99 | - `fromString(str, prefix?)`: Parses a TypeID from a string, optionally checking the prefix 100 | - `fromUUID(prefix, uuid)`: Creates a TypeID from a prefix and a UUID in hex format 101 | - `fromUUIDBytes(prefix, bytes)`: Creates a TypeID from a prefix and a UUID in byte array format 102 | -------------------------------------------------------------------------------- /test/invalid.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file contains test data that should be treated as *invalid* TypeIDs by 3 | * conforming implementations. 4 | * 5 | * Each example contains an invalid TypeID string. Implementations are expected 6 | * to throw an error when attempting to parse/validate these strings. 7 | * 8 | * Data copied over from the invalid.yml spec file 9 | * 10 | * Last updated: 2024-04-17 (for version 0.3.0 of the spec) 11 | */ 12 | export default [ 13 | { 14 | name: "prefix-uppercase", 15 | typeid: "PREFIX_00000000000000000000000000", 16 | description: "The prefix should be lowercase with no uppercase letters", 17 | }, 18 | { 19 | name: "prefix-numeric", 20 | typeid: "12345_00000000000000000000000000", 21 | description: "The prefix can't have numbers, it needs to be alphabetic", 22 | }, 23 | { 24 | name: "prefix-period", 25 | typeid: "pre.fix_00000000000000000000000000", 26 | description: "The prefix can't have symbols, it needs to be alphabetic", 27 | }, 28 | // Test removed in v0.3.0 – we now allow underscores in the prefix 29 | // { 30 | // name: "prefix-underscore", 31 | // typeid: "pre_fix_00000000000000000000000000", 32 | // description: "The prefix can't have symbols, it needs to be alphabetic", 33 | // }, 34 | { 35 | name: "prefix-non-ascii", 36 | typeid: "préfix_00000000000000000000000000", 37 | description: "The prefix can only have ascii letters", 38 | }, 39 | { 40 | name: "prefix-spaces", 41 | typeid: " prefix_00000000000000000000000000", 42 | description: "The prefix can't have any spaces", 43 | }, 44 | { 45 | name: "prefix-64-chars", 46 | typeid: 47 | "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl_00000000000000000000000000", 48 | description: 49 | "The prefix can't be 64 characters, it needs to be 63 characters or less", 50 | }, 51 | { 52 | name: "separator-empty-prefix", 53 | typeid: "_00000000000000000000000000", 54 | description: "If the prefix is empty, the separator should not be there", 55 | }, 56 | { 57 | name: "separator-empty", 58 | typeid: "_", 59 | description: 60 | "A separator by itself should not be treated as the empty string", 61 | }, 62 | { 63 | name: "suffix-short", 64 | typeid: "prefix_1234567890123456789012345", 65 | description: 66 | "The suffix can't be 25 characters, it needs to be exactly 26 characters", 67 | }, 68 | { 69 | name: "suffix-long", 70 | typeid: "prefix_123456789012345678901234567", 71 | description: 72 | "The suffix can't be 27 characters, it needs to be exactly 26 characters", 73 | }, 74 | { 75 | name: "suffix-spaces", 76 | typeid: "prefix_1234567890123456789012345 ", 77 | description: "The suffix can't have any spaces", 78 | }, 79 | { 80 | name: "suffix-uppercase", 81 | typeid: "prefix_0123456789ABCDEFGHJKMNPQRS", 82 | description: "The suffix should be lowercase with no uppercase letters", 83 | }, 84 | { 85 | name: "suffix-hyphens", 86 | typeid: "prefix_123456789-123456789-123456", 87 | description: "The suffix should be lowercase with no uppercase letters", 88 | }, 89 | { 90 | name: "suffix-wrong-alphabet", 91 | typeid: "prefix_ooooooiiiiiiuuuuuuulllllll", 92 | description: "The suffix should only have letters from the spec's alphabet", 93 | }, 94 | { 95 | name: "suffix-ambiguous-crockford", 96 | typeid: "prefix_i23456789ol23456789oi23456", 97 | description: 98 | "The suffix should not have any ambiguous characters from the crockford encoding", 99 | }, 100 | { 101 | name: "suffix-hyphens-crockford", 102 | typeid: "prefix_123456789-0123456789-0123456", 103 | description: "The suffix can't ignore hyphens as in the crockford encoding", 104 | }, 105 | { 106 | name: "suffix-overflow", 107 | typeid: "prefix_8zzzzzzzzzzzzzzzzzzzzzzzzz", 108 | description: "The suffix should encode at most 128-bits", 109 | }, 110 | // Tests below were added in v0.3.0 when we started allowing '_' within the type prefix. 111 | { 112 | name: "prefix-underscore-start", 113 | typeid: "_prefix_00000000000000000000000000", 114 | description: "The prefix can't start with an underscore", 115 | }, 116 | { 117 | name: "prefix-underscore-end", 118 | typeid: "prefix__00000000000000000000000000", 119 | description: "The prefix can't end with an underscore", 120 | }, 121 | ]; 122 | -------------------------------------------------------------------------------- /src/unboxed/typeid.ts: -------------------------------------------------------------------------------- 1 | import { stringify, v7 } from "uuid"; 2 | import { parseUUID } from "../parse_uuid"; 3 | import { encode, decode } from "../base32"; 4 | import { isValidPrefix } from "../prefix"; 5 | import { 6 | EmptyPrefixError, 7 | InvalidPrefixError, 8 | InvalidSuffixCharacterError, 9 | InvalidSuffixLengthError, 10 | PrefixMismatchError, 11 | } from "./error"; 12 | 13 | export type TypeId = string & { __type: T }; 14 | 15 | export function typeidUnboxed( 16 | prefix: T = "" as T, 17 | suffix: string = "" 18 | ): TypeId { 19 | if (!isValidPrefix(prefix)) { 20 | throw new InvalidPrefixError(prefix); 21 | } 22 | 23 | let finalSuffix: string; 24 | if (suffix) { 25 | finalSuffix = suffix; 26 | } else { 27 | const buffer = new Uint8Array(16); 28 | v7(undefined, buffer); 29 | finalSuffix = encode(buffer); 30 | } 31 | 32 | if (finalSuffix.length !== 26) { 33 | throw new InvalidSuffixLengthError(finalSuffix.length); 34 | } 35 | 36 | if (finalSuffix[0] > "7") { 37 | throw new InvalidSuffixCharacterError(finalSuffix[0]); 38 | } 39 | 40 | // Validate the suffix by decoding it. If it's invalid, an error will be thrown. 41 | decode(finalSuffix); 42 | 43 | if (prefix === "") { 44 | return finalSuffix as TypeId; 45 | } else { 46 | return `${prefix}_${finalSuffix}` as TypeId; 47 | } 48 | } 49 | 50 | /** 51 | * Constructs a TypeId from a string representation, optionally validating against a provided prefix. 52 | * This function splits the input `typeId` string by an underscore `_` to separate the prefix and suffix. 53 | * If the `typeId` contains no underscore, it is assumed to be a suffix with an empty prefix. 54 | * If a `prefix` is provided, it must match the prefix part of the `typeId`, or an error is thrown. 55 | * 56 | * @param {string} typeId - The string representation of the TypeId to be parsed. 57 | * @param {T} [prefix] - An optional prefix to validate against the prefix in the `typeId`. 58 | * @returns {TypeId} A new TypeId instance constructed from the parsed `typeId`. 59 | * @throws {Error} If the `typeId` format is invalid, the prefix is empty when there's a separator, 60 | * or there's a prefix mismatch when a `prefix` is provided. 61 | * @template T - A string literal type that extends string. 62 | */ 63 | export function fromString( 64 | typeId: string, 65 | prefix?: T 66 | ): TypeId { 67 | let p; 68 | let s; 69 | 70 | const underscoreIndex = typeId.lastIndexOf("_"); 71 | if (underscoreIndex === -1) { 72 | p = "" as T; 73 | s = typeId; 74 | } else { 75 | p = typeId.substring(0, underscoreIndex) as T; 76 | s = typeId.substring(underscoreIndex + 1); 77 | 78 | if (!p) { 79 | throw new EmptyPrefixError(typeId); 80 | } 81 | } 82 | 83 | if (!s) { 84 | throw new InvalidSuffixLengthError(0); 85 | } 86 | 87 | if (prefix && p !== prefix) { 88 | throw new PrefixMismatchError(prefix, p); 89 | } 90 | 91 | return typeidUnboxed(p, s); 92 | } 93 | 94 | /** 95 | * Parses a TypeId string into its prefix and suffix components. 96 | * 97 | * @param {TypeId} typeId - The TypeId string to parse. 98 | * @returns {{ prefix: T; suffix: string }} An object containing the prefix and suffix of the TypeId. 99 | * @throws {Error} If the TypeId format is invalid (not exactly two parts separated by an underscore). 100 | * 101 | * @example 102 | * // For a valid TypeId 'example_00041061050r3gg28a1c60t3gf' 103 | * const { prefix, suffix } = parseTypeId('example_00041061050r3gg28a1c60t3gf'); 104 | * console.log(prefix); // 'example' 105 | * console.log(suffix); // '00041061050r3gg28a1c60t3gf' 106 | * 107 | * @example 108 | * // Throws an error for invalid TypeId format 109 | * try { 110 | * parseTypeId('invalidTypeId'); 111 | * } catch (error) { 112 | * console.error(error.message); // 'Invalid TypeId format: invalidTypeId' 113 | * } 114 | */ 115 | export function parseTypeId( 116 | typeId: TypeId 117 | ): { prefix: T; suffix: string } { 118 | return { prefix: getType(typeId), suffix: getSuffix(typeId) }; 119 | } 120 | 121 | /** 122 | * Retrieves the prefix from a TypeId. 123 | * 124 | * @param {TypeId} typeId - The TypeId from which to extract the prefix. 125 | * @returns {T} The prefix of the TypeId. 126 | */ 127 | export function getType(typeId: TypeId): T { 128 | const underscoreIndex = typeId.lastIndexOf("_"); 129 | if (underscoreIndex === -1) { 130 | return "" as T; 131 | } 132 | return typeId.substring(0, underscoreIndex) as T; 133 | } 134 | 135 | /** 136 | * Retrieves the suffix from a TypeId. 137 | * 138 | * @param {TypeId} typeId - The TypeId from which to extract the suffix. 139 | * @returns {string} The suffix of the TypeId. 140 | */ 141 | export function getSuffix(typeId: TypeId): string { 142 | const underscoreIndex = typeId.lastIndexOf("_"); 143 | if (underscoreIndex === -1) { 144 | return typeId; 145 | } 146 | return typeId.substring(underscoreIndex + 1); 147 | } 148 | 149 | export function toUUIDBytes(typeId: TypeId): Uint8Array { 150 | return decode(getSuffix(typeId)); 151 | } 152 | 153 | export function toUUID(typeId: TypeId) { 154 | return stringify(toUUIDBytes(typeId)); 155 | } 156 | 157 | export function fromUUIDBytes( 158 | prefix: string, 159 | bytes: Uint8Array 160 | ): TypeId { 161 | const suffix = encode(bytes); 162 | return prefix 163 | ? (`${prefix}_${suffix}` as TypeId) 164 | : (suffix as TypeId); 165 | } 166 | 167 | export function fromUUID( 168 | uuid: string, 169 | prefix?: T 170 | ): TypeId { 171 | const suffix = encode(parseUUID(uuid)); 172 | return prefix ? (`${prefix}_${suffix}` as TypeId) : (suffix as TypeId); 173 | } 174 | -------------------------------------------------------------------------------- /test/typeid_unboxed.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from "@jest/globals"; 2 | 3 | import { 4 | typeidUnboxed, 5 | parseTypeId, 6 | toUUID, 7 | fromUUID, 8 | fromString, 9 | getType, 10 | fromUUIDBytes, 11 | getSuffix, 12 | } from "../src/unboxed/typeid"; 13 | import validJson from "./valid"; 14 | import invalidJson from "./invalid"; 15 | import { 16 | InvalidPrefixError, 17 | InvalidSuffixCharacterError, 18 | InvalidSuffixLengthError, 19 | } from "../src/unboxed/error"; 20 | 21 | describe("TypeId Functions", () => { 22 | describe("typeidUnboxed", () => { 23 | it("should create a TypeId string", () => { 24 | const prefix = "test"; 25 | const suffix = "00041061050r3gg28a1c60t3gf"; 26 | 27 | const id = typeidUnboxed(prefix, suffix); 28 | expect(typeof id).toBe("string"); 29 | const { prefix: idPrefix, suffix: idSuffix } = parseTypeId(id); 30 | expect(idPrefix).toEqual(prefix); 31 | expect(idSuffix).toEqual(suffix); 32 | }); 33 | 34 | it("should generate a suffix when none is provided", () => { 35 | const prefix = "test"; 36 | 37 | const id = typeidUnboxed(prefix); 38 | expect(typeof id).toBe("string"); 39 | const { suffix: idSuffix } = parseTypeId(id); 40 | expect(idSuffix).toHaveLength(26); 41 | }); 42 | 43 | it("should throw an error if prefix is not lowercase", () => { 44 | expect(() => { 45 | typeidUnboxed("TEST", "00041061050r3gg28a1c60t3gf"); 46 | }).toThrowError(new InvalidPrefixError("TEST")); 47 | 48 | expect(() => { 49 | typeidUnboxed(" ", "00041061050r3gg28a1c60t3gf"); 50 | }).toThrowError(new InvalidPrefixError(" ")); 51 | }); 52 | 53 | it("should throw an error if suffix length is not 26", () => { 54 | expect(() => { 55 | typeidUnboxed("test", "abc"); 56 | }).toThrowError( 57 | "Invalid length. Suffix should have 26 characters, got 3" 58 | ); 59 | }); 60 | }); 61 | 62 | describe("parseTypeId", () => { 63 | it("should parse TypeId from a string without prefix", () => { 64 | const str = "00041061050r3gg28a1c60t3gf"; 65 | const { prefix, suffix } = parseTypeId(fromString(str)); 66 | 67 | expect(suffix).toBe(str); 68 | expect(prefix).toBe(""); 69 | }); 70 | 71 | it("should parse TypeId from a string with prefix", () => { 72 | const str = "prefix_00041061050r3gg28a1c60t3gf"; 73 | const { prefix, suffix } = parseTypeId(fromString(str)); 74 | 75 | expect(suffix).toBe("00041061050r3gg28a1c60t3gf"); 76 | expect(prefix).toBe("prefix"); 77 | }); 78 | 79 | it("should throw an error for invalid TypeId string", () => { 80 | const invalidStr = "invalid_string_with_underscore0000000000000000"; 81 | 82 | expect(() => { 83 | fromString(invalidStr); 84 | }).toThrowError(new InvalidSuffixCharacterError("u")); 85 | }); 86 | 87 | it("should throw an error for empty TypeId string", () => { 88 | const invalidStr = ""; 89 | 90 | expect(() => { 91 | fromString(invalidStr); 92 | }).toThrowError(new InvalidSuffixLengthError(0)); 93 | }); 94 | 95 | it("should throw an error for TypeId string with empty suffix", () => { 96 | const invalidStr = "prefix_"; 97 | 98 | expect(() => { 99 | fromString(invalidStr); 100 | }).toThrowError(new InvalidSuffixLengthError(0)); 101 | }); 102 | }); 103 | 104 | describe("fromUUIDBytes", () => { 105 | it("should construct TypeId from a UUID bytes without prefix", () => { 106 | const bytes = new Uint8Array([ 107 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 108 | ]); 109 | const tid = fromUUIDBytes("", bytes); 110 | 111 | expect(getSuffix(tid)).toBe("00041061050r3gg28a1c60t3gf"); 112 | expect(getType(tid)).toBe(""); 113 | }); 114 | 115 | it("should construct TypeID from a UUID bytes with prefix", () => { 116 | const bytes = new Uint8Array([ 117 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 118 | ]); 119 | const tid = fromUUIDBytes("prefix", bytes); 120 | 121 | expect(getSuffix(tid)).toBe("00041061050r3gg28a1c60t3gf"); 122 | expect(getType(tid)).toBe("prefix"); 123 | }); 124 | }); 125 | 126 | describe("fromUUID", () => { 127 | it("should construct TypeId from a UUID string without prefix", () => { 128 | const uuid = "01889c89-df6b-7f1c-a388-91396ec314bc"; 129 | const id = fromUUID(uuid); 130 | expect(typeof id).toBe("string"); 131 | expect(toUUID(id)).toBe(uuid); 132 | }); 133 | 134 | it("should construct TypeId from a UUID string with prefix", () => { 135 | const uuid = "01889c89-df6b-7f1c-a388-91396ec314bc"; 136 | const id = fromUUID(uuid, "prefix"); 137 | expect(typeof id).toBe("string"); 138 | expect(getType(id)).toBe("prefix"); 139 | expect(toUUID(id)).toBe(uuid); 140 | }); 141 | }); 142 | 143 | describe("spec", () => { 144 | validJson.forEach((testcase) => { 145 | it(`parses string from valid case: ${testcase.name}`, () => { 146 | const tid = fromString(testcase.typeid, testcase.prefix); 147 | expect(getType(tid)).toBe(testcase.prefix); 148 | expect(tid.toString()).toBe(testcase.typeid); 149 | expect(toUUID(tid)).toBe(testcase.uuid); 150 | }); 151 | 152 | it(`encodes uuid from valid case: ${testcase.name}`, () => { 153 | const tid = fromUUID(testcase.uuid, testcase.prefix); 154 | expect(getType(tid)).toBe(testcase.prefix); 155 | expect(tid.toString()).toBe(testcase.typeid); 156 | expect(toUUID(tid)).toBe(testcase.uuid); 157 | }); 158 | }); 159 | 160 | invalidJson.forEach((testcase: { name: string; typeid: string }) => { 161 | it(`errors on invalid case: ${testcase.name}`, () => { 162 | expect(() => { 163 | fromString(testcase.typeid); 164 | }).toThrowError(); 165 | }); 166 | }); 167 | }); 168 | }); 169 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, caste, color, religion, or sexual 10 | identity and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | - Demonstrating empathy and kindness toward other people 21 | - Being respectful of differing opinions, viewpoints, and experiences 22 | - Giving and gracefully accepting constructive feedback 23 | - Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | - Focusing on what is best not just for us as individuals, but for the overall 26 | community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | - The use of sexualized language or imagery, and sexual attention or advances of 31 | any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others' private information, such as a physical or email address, 35 | without their explicit permission 36 | - Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement. Use the 63 | "Report to repository admins" functionality on GitHub to report. 64 | 65 | All complaints will be reviewed and investigated promptly and fairly. 66 | 67 | All community leaders are obligated to respect the privacy and security of the 68 | reporter of any incident. 69 | 70 | ## Enforcement Guidelines 71 | 72 | Community leaders will follow these Community Impact Guidelines in determining 73 | the consequences for any action they deem in violation of this Code of Conduct: 74 | 75 | ### 1. Correction 76 | 77 | **Community Impact**: Use of inappropriate language or other behavior deemed 78 | unprofessional or unwelcome in the community. 79 | 80 | **Consequence**: A private, written warning from community leaders, providing 81 | clarity around the nature of the violation and an explanation of why the 82 | behavior was inappropriate. A public apology may be requested. 83 | 84 | ### 2. Warning 85 | 86 | **Community Impact**: A violation through a single incident or series of 87 | actions. 88 | 89 | **Consequence**: A warning with consequences for continued behavior. No 90 | interaction with the people involved, including unsolicited interaction with 91 | those enforcing the Code of Conduct, for a specified period of time. This 92 | includes avoiding interactions in community spaces as well as external channels 93 | like social media. Violating these terms may lead to a temporary or permanent 94 | ban. 95 | 96 | ### 3. Temporary Ban 97 | 98 | **Community Impact**: A serious violation of community standards, including 99 | sustained inappropriate behavior. 100 | 101 | **Consequence**: A temporary ban from any sort of interaction or public 102 | communication with the community for a specified period of time. No public or 103 | private interaction with the people involved, including unsolicited interaction 104 | with those enforcing the Code of Conduct, is allowed during this period. 105 | Violating these terms may lead to a permanent ban. 106 | 107 | ### 4. Permanent Ban 108 | 109 | **Community Impact**: Demonstrating a pattern of violation of community 110 | standards, including sustained inappropriate behavior, harassment of an 111 | individual, or aggression toward or disparagement of classes of individuals. 112 | 113 | **Consequence**: A permanent ban from any sort of public interaction within the 114 | community. 115 | 116 | ## Attribution 117 | 118 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 119 | version 2.1, available at 120 | [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. 121 | 122 | Community Impact Guidelines were inspired by 123 | [Mozilla's code of conduct enforcement ladder][mozilla coc]. 124 | 125 | For answers to common questions about this code of conduct, see the FAQ at 126 | [https://www.contributor-covenant.org/faq][faq]. Translations are available at 127 | [https://www.contributor-covenant.org/translations][translations]. 128 | 129 | [homepage]: https://www.contributor-covenant.org 130 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html 131 | [mozilla coc]: https://github.com/mozilla/diversity 132 | [faq]: https://www.contributor-covenant.org/faq 133 | [translations]: https://www.contributor-covenant.org/translations 134 | -------------------------------------------------------------------------------- /src/base32.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-bitwise */ 2 | const alphabet: string = "0123456789abcdefghjkmnpqrstvwxyz"; 3 | 4 | // Decoding table 5 | const dec: Uint8Array = new Uint8Array([ 6 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 7 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 8 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 9 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 10 | 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 11 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 12 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 13 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 14 | 0x11, 0xff, 0x12, 0x13, 0xff, 0x14, 0x15, 0xff, 0x16, 0x17, 0x18, 0x19, 0x1a, 15 | 0xff, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 16 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 17 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 18 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 19 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 20 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 21 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 22 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 23 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 24 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 25 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 26 | ]); 27 | 28 | export function encode(src: Uint8Array): string { 29 | const dst: string[] = new Array(26).fill(""); 30 | 31 | if (src.length !== 16) { 32 | throw new Error( 33 | `Invalid length. Expected 16 bytes, got ${src.length}. Input: ${src}` 34 | ); 35 | } 36 | 37 | // 10 byte timestamp 38 | dst[0] = alphabet[(src[0] & 224) >> 5]; 39 | dst[1] = alphabet[src[0] & 31]; 40 | dst[2] = alphabet[(src[1] & 248) >> 3]; 41 | dst[3] = alphabet[((src[1] & 7) << 2) | ((src[2] & 192) >> 6)]; 42 | dst[4] = alphabet[(src[2] & 62) >> 1]; 43 | dst[5] = alphabet[((src[2] & 1) << 4) | ((src[3] & 240) >> 4)]; 44 | dst[6] = alphabet[((src[3] & 15) << 1) | ((src[4] & 128) >> 7)]; 45 | dst[7] = alphabet[(src[4] & 124) >> 2]; 46 | dst[8] = alphabet[((src[4] & 3) << 3) | ((src[5] & 224) >> 5)]; 47 | dst[9] = alphabet[src[5] & 31]; 48 | 49 | // 16 bytes of randomness 50 | dst[10] = alphabet[(src[6] & 248) >> 3]; 51 | dst[11] = alphabet[((src[6] & 7) << 2) | ((src[7] & 192) >> 6)]; 52 | dst[12] = alphabet[(src[7] & 62) >> 1]; 53 | dst[13] = alphabet[((src[7] & 1) << 4) | ((src[8] & 240) >> 4)]; 54 | dst[14] = alphabet[((src[8] & 15) << 1) | ((src[9] & 128) >> 7)]; 55 | dst[15] = alphabet[(src[9] & 124) >> 2]; 56 | dst[16] = alphabet[((src[9] & 3) << 3) | ((src[10] & 224) >> 5)]; 57 | dst[17] = alphabet[src[10] & 31]; 58 | dst[18] = alphabet[(src[11] & 248) >> 3]; 59 | dst[19] = alphabet[((src[11] & 7) << 2) | ((src[12] & 192) >> 6)]; 60 | dst[20] = alphabet[(src[12] & 62) >> 1]; 61 | dst[21] = alphabet[((src[12] & 1) << 4) | ((src[13] & 240) >> 4)]; 62 | dst[22] = alphabet[((src[13] & 15) << 1) | ((src[14] & 128) >> 7)]; 63 | dst[23] = alphabet[(src[14] & 124) >> 2]; 64 | dst[24] = alphabet[((src[14] & 3) << 3) | ((src[15] & 224) >> 5)]; 65 | dst[25] = alphabet[src[15] & 31]; 66 | 67 | return dst.join(""); 68 | } 69 | 70 | export function decode(s: string): Uint8Array { 71 | if (s.length !== 26) { 72 | throw new Error( 73 | `Invalid length. Expected 26 bytes, got ${s.length}. Input: ${s}` 74 | ); 75 | } 76 | 77 | const encoder = new TextEncoder(); 78 | const v: Uint8Array = encoder.encode(s); 79 | 80 | // Check if all the characters are part of the expected base32 character set. 81 | if ( 82 | dec[v[0]] === 0xff || 83 | dec[v[1]] === 0xff || 84 | dec[v[2]] === 0xff || 85 | dec[v[3]] === 0xff || 86 | dec[v[4]] === 0xff || 87 | dec[v[5]] === 0xff || 88 | dec[v[6]] === 0xff || 89 | dec[v[7]] === 0xff || 90 | dec[v[8]] === 0xff || 91 | dec[v[9]] === 0xff || 92 | dec[v[10]] === 0xff || 93 | dec[v[11]] === 0xff || 94 | dec[v[12]] === 0xff || 95 | dec[v[13]] === 0xff || 96 | dec[v[14]] === 0xff || 97 | dec[v[15]] === 0xff || 98 | dec[v[16]] === 0xff || 99 | dec[v[17]] === 0xff || 100 | dec[v[18]] === 0xff || 101 | dec[v[19]] === 0xff || 102 | dec[v[20]] === 0xff || 103 | dec[v[21]] === 0xff || 104 | dec[v[22]] === 0xff || 105 | dec[v[23]] === 0xff || 106 | dec[v[24]] === 0xff || 107 | dec[v[25]] === 0xff 108 | ) { 109 | throw new Error("Invalid base32 character"); 110 | } 111 | 112 | const id = new Uint8Array(16); 113 | 114 | // 6 bytes timestamp (48 bits) 115 | id[0] = (dec[v[0]] << 5) | dec[v[1]]; 116 | id[1] = (dec[v[2]] << 3) | (dec[v[3]] >> 2); 117 | id[2] = ((dec[v[3]] & 3) << 6) | (dec[v[4]] << 1) | (dec[v[5]] >> 4); 118 | id[3] = ((dec[v[5]] & 15) << 4) | (dec[v[6]] >> 1); 119 | id[4] = ((dec[v[6]] & 1) << 7) | (dec[v[7]] << 2) | (dec[v[8]] >> 3); 120 | id[5] = ((dec[v[8]] & 7) << 5) | dec[v[9]]; 121 | 122 | // 10 bytes of entropy (80 bits) 123 | id[6] = (dec[v[10]] << 3) | (dec[v[11]] >> 2); 124 | id[7] = ((dec[v[11]] & 3) << 6) | (dec[v[12]] << 1) | (dec[v[13]] >> 4); 125 | id[8] = ((dec[v[13]] & 15) << 4) | (dec[v[14]] >> 1); 126 | id[9] = ((dec[v[14]] & 1) << 7) | (dec[v[15]] << 2) | (dec[v[16]] >> 3); 127 | id[10] = ((dec[v[16]] & 7) << 5) | dec[v[17]]; 128 | id[11] = (dec[v[18]] << 3) | (dec[v[19]] >> 2); 129 | id[12] = ((dec[v[19]] & 3) << 6) | (dec[v[20]] << 1) | (dec[v[21]] >> 4); 130 | id[13] = ((dec[v[21]] & 15) << 4) | (dec[v[22]] >> 1); 131 | id[14] = ((dec[v[22]] & 1) << 7) | (dec[v[23]] << 2) | (dec[v[24]] >> 3); 132 | id[15] = ((dec[v[24]] & 7) << 5) | dec[v[25]]; 133 | 134 | return id; 135 | } 136 | -------------------------------------------------------------------------------- /test/typeid.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from "@jest/globals"; 2 | 3 | import { typeid, TypeID } from "../src/typeid"; 4 | import validJson from "./valid"; 5 | import invalidJson from "./invalid"; 6 | import { 7 | InvalidPrefixError, 8 | InvalidSuffixCharacterError, 9 | InvalidSuffixLengthError, 10 | PrefixMismatchError, 11 | } from "../src/unboxed/error"; 12 | 13 | describe("TypeID", () => { 14 | describe("constructor", () => { 15 | it("should create a TypeID object", () => { 16 | const prefix = "test"; 17 | const suffix = "00041061050r3gg28a1c60t3gf"; 18 | 19 | const id = typeid(prefix, suffix); 20 | expect(id).toBeInstanceOf(TypeID); 21 | expect(id.getType()).toEqual(prefix); 22 | expect(id.getSuffix()).toEqual(suffix); 23 | }); 24 | 25 | it("should generate a suffix when none is provided", () => { 26 | const prefix = "test"; 27 | 28 | const id = typeid(prefix); 29 | expect(id).toBeInstanceOf(TypeID); 30 | expect(id.getType()).toEqual(prefix); 31 | expect(id.getSuffix()).toHaveLength(26); 32 | }); 33 | 34 | it("should throw an error if prefix is not lowercase", () => { 35 | expect(() => { 36 | typeid("TEST", "00041061050r3gg28a1c60t3gf"); 37 | }).toThrowError(new InvalidPrefixError("TEST")); 38 | 39 | expect(() => { 40 | typeid(" ", "00041061050r3gg28a1c60t3gf"); 41 | }).toThrowError(new InvalidPrefixError(" ")); 42 | }); 43 | 44 | it("should throw an error if suffix length is not 26", () => { 45 | expect(() => { 46 | typeid("test", "abc"); 47 | }).toThrowError( 48 | "Invalid length. Suffix should have 26 characters, got 3" 49 | ); 50 | }); 51 | }); 52 | 53 | describe("asType", () => { 54 | it("should return the type specified by the given prefix", () => { 55 | const prefix = "prefix"; 56 | const tid = typeid(prefix); 57 | const narrowed = tid.asType(prefix); 58 | expect(tid).toEqual(narrowed); 59 | }); 60 | 61 | it("should throw an error on prefix mismatch", () => { 62 | const tid = typeid("foo"); 63 | expect(() => tid.asType("bar")).toThrow( 64 | "Cannot convert TypeID of type foo to type bar" 65 | ); 66 | }); 67 | }); 68 | 69 | describe("toString", () => { 70 | it("should return a string representation", () => { 71 | const prefix = "test"; 72 | const suffix = "00041061050r3gg28a1c60t3gf"; 73 | 74 | const id = typeid(prefix, suffix); 75 | expect(id.toString()).toEqual("test_00041061050r3gg28a1c60t3gf"); 76 | }); 77 | 78 | it("should return a string representation even without prefix", () => { 79 | const suffix = "00041061050r3gg28a1c60t3gf"; 80 | 81 | const id = typeid("", suffix); 82 | expect(id.toString()).toEqual(suffix); 83 | }); 84 | }); 85 | 86 | describe("fromString", () => { 87 | it("should construct TypeID from a string without prefix", () => { 88 | const str = "00041061050r3gg28a1c60t3gf"; 89 | const tid = TypeID.fromString(str); 90 | 91 | expect(tid.getSuffix()).toBe(str); 92 | expect(tid.getType()).toBe(""); 93 | }); 94 | 95 | it("should construct TypeID from a string with prefix", () => { 96 | const str = "prefix_00041061050r3gg28a1c60t3gf"; 97 | const tid = TypeID.fromString(str); 98 | 99 | expect(tid.getSuffix()).toBe("00041061050r3gg28a1c60t3gf"); 100 | expect(tid.getType()).toBe("prefix"); 101 | }); 102 | 103 | it("should construct TypeID from a string with prefix and specified prefix", () => { 104 | const str = "prefix_00041061050r3gg28a1c60t3gf"; 105 | const tid = TypeID.fromString(str, "prefix"); 106 | 107 | expect(tid.getSuffix()).toBe("00041061050r3gg28a1c60t3gf"); 108 | expect(tid.getType()).toBe("prefix"); 109 | }); 110 | 111 | it("should throw an error for invalid TypeID string", () => { 112 | const invalidStr = "invalid_string_with_underscore0000000000000000"; 113 | 114 | expect(() => { 115 | TypeID.fromString(invalidStr); 116 | }).toThrowError(new InvalidSuffixCharacterError("u")); 117 | }); 118 | it("should throw an error with wrong prefix", () => { 119 | const str = "prefix_00041061050r3gg28a1c60t3gf"; 120 | expect(() => { 121 | TypeID.fromString(str, "wrong"); 122 | }).toThrowError(new PrefixMismatchError("wrong", "prefix")); 123 | }); 124 | it("should throw an error for empty TypeId string", () => { 125 | const invalidStr = ""; 126 | expect(() => { 127 | TypeID.fromString(invalidStr); 128 | }).toThrowError(new InvalidSuffixLengthError(0)); 129 | }); 130 | it("should throw an error for TypeId string with empty suffix", () => { 131 | const invalidStr = "prefix_"; 132 | expect(() => { 133 | TypeID.fromString(invalidStr); 134 | }).toThrowError(new InvalidSuffixLengthError(0)); 135 | }); 136 | }); 137 | 138 | describe("fromUUIDBytes", () => { 139 | it("should construct TypeID from a UUID bytes without prefix", () => { 140 | const bytes = new Uint8Array([ 141 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 142 | ]); 143 | const tid = TypeID.fromUUIDBytes("", bytes); 144 | 145 | expect(tid.getSuffix()).toBe("00041061050r3gg28a1c60t3gf"); 146 | expect(tid.getType()).toBe(""); 147 | }); 148 | 149 | it("should construct TypeID from a UUID bytes with prefix", () => { 150 | const bytes = new Uint8Array([ 151 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 152 | ]); 153 | const tid = TypeID.fromUUIDBytes("prefix", bytes); 154 | 155 | expect(tid.getSuffix()).toBe("00041061050r3gg28a1c60t3gf"); 156 | expect(tid.getType()).toBe("prefix"); 157 | }); 158 | }); 159 | 160 | describe("fromUUID", () => { 161 | it("should construct TypeID from a UUID string without prefix", () => { 162 | const uuid = "01889c89-df6b-7f1c-a388-91396ec314bc"; 163 | const tid = TypeID.fromUUID("", uuid); 164 | 165 | expect(tid.getSuffix()).toBe("01h2e8kqvbfwea724h75qc655w"); 166 | expect(tid.getType()).toBe(""); 167 | }); 168 | 169 | it("should construct TypeID from a UUID string with prefix", () => { 170 | const uuid = "01889c89-df6b-7f1c-a388-91396ec314bc"; 171 | const tid = TypeID.fromUUID("prefix", uuid); 172 | 173 | expect(tid.getSuffix()).toBe("01h2e8kqvbfwea724h75qc655w"); 174 | expect(tid.getType()).toBe("prefix"); 175 | }); 176 | }); 177 | 178 | describe("encode <-> decode", () => { 179 | it("should be invariant on random ids with a prefix", () => { 180 | for (let i = 0; i < 1000; i += 1) { 181 | const prefix = "test"; 182 | const tid = typeid(prefix); 183 | const decoded = TypeID.fromString(tid.toString()); 184 | 185 | expect(decoded).toEqual(tid); 186 | } 187 | }); 188 | 189 | it("should be invariant on random ids without a prefix", () => { 190 | for (let i = 0; i < 1000; i += 1) { 191 | const tid = typeid(); 192 | const decoded = TypeID.fromString(tid.toString()); 193 | 194 | expect(decoded).toEqual(tid); 195 | } 196 | }); 197 | }); 198 | 199 | describe("spec", () => { 200 | validJson.forEach( 201 | (testcase: { 202 | name: string; 203 | prefix: string; 204 | typeid: string; 205 | uuid: string; 206 | }) => { 207 | it(`parses string from valid case: ${testcase.name}`, () => { 208 | const tid = TypeID.fromString(testcase.typeid); 209 | expect(tid.getType()).toBe(testcase.prefix); 210 | expect(tid.toString()).toBe(testcase.typeid); 211 | expect(tid.toUUID()).toBe(testcase.uuid); 212 | }); 213 | 214 | it(`encodes uuid from valid case: ${testcase.name}`, () => { 215 | const tid = TypeID.fromUUID(testcase.prefix, testcase.uuid); 216 | expect(tid.getType()).toBe(testcase.prefix); 217 | expect(tid.toString()).toBe(testcase.typeid); 218 | expect(tid.toUUID()).toBe(testcase.uuid); 219 | }); 220 | } 221 | ); 222 | 223 | invalidJson.forEach((testcase: { name: string; typeid: string }) => { 224 | it(`errors on invalid case: ${testcase.name}`, () => { 225 | expect(() => { 226 | TypeID.fromString(testcase.typeid); 227 | }).toThrowError(); 228 | }); 229 | }); 230 | }); 231 | }); 232 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | uuid: 12 | specifier: ^10.0.0 13 | version: 10.0.0 14 | devDependencies: 15 | '@jest/globals': 16 | specifier: ^29.7.0 17 | version: 29.7.0 18 | '@tsconfig/strictest': 19 | specifier: ^2.0.8 20 | version: 2.0.8 21 | '@types/node': 22 | specifier: ^20.19.25 23 | version: 20.19.25 24 | '@types/uuid': 25 | specifier: ^10.0.0 26 | version: 10.0.0 27 | jest: 28 | specifier: ^29.7.0 29 | version: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 30 | ts-jest: 31 | specifier: ^29.4.6 32 | version: 29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(esbuild@0.27.0)(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)))(typescript@5.9.3) 33 | ts-node: 34 | specifier: ^10.9.2 35 | version: 10.9.2(@types/node@20.19.25)(typescript@5.9.3) 36 | tsup: 37 | specifier: ^8.5.1 38 | version: 8.5.1(typescript@5.9.3) 39 | typescript: 40 | specifier: ^5.9.3 41 | version: 5.9.3 42 | 43 | packages: 44 | 45 | '@babel/code-frame@7.27.1': 46 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 47 | engines: {node: '>=6.9.0'} 48 | 49 | '@babel/compat-data@7.28.5': 50 | resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} 51 | engines: {node: '>=6.9.0'} 52 | 53 | '@babel/core@7.28.5': 54 | resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} 55 | engines: {node: '>=6.9.0'} 56 | 57 | '@babel/generator@7.28.5': 58 | resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 59 | engines: {node: '>=6.9.0'} 60 | 61 | '@babel/helper-compilation-targets@7.27.2': 62 | resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 63 | engines: {node: '>=6.9.0'} 64 | 65 | '@babel/helper-globals@7.28.0': 66 | resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 67 | engines: {node: '>=6.9.0'} 68 | 69 | '@babel/helper-module-imports@7.27.1': 70 | resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 71 | engines: {node: '>=6.9.0'} 72 | 73 | '@babel/helper-module-transforms@7.28.3': 74 | resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 75 | engines: {node: '>=6.9.0'} 76 | peerDependencies: 77 | '@babel/core': ^7.0.0 78 | 79 | '@babel/helper-plugin-utils@7.27.1': 80 | resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 81 | engines: {node: '>=6.9.0'} 82 | 83 | '@babel/helper-string-parser@7.27.1': 84 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 85 | engines: {node: '>=6.9.0'} 86 | 87 | '@babel/helper-validator-identifier@7.28.5': 88 | resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 89 | engines: {node: '>=6.9.0'} 90 | 91 | '@babel/helper-validator-option@7.27.1': 92 | resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 93 | engines: {node: '>=6.9.0'} 94 | 95 | '@babel/helpers@7.28.4': 96 | resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} 97 | engines: {node: '>=6.9.0'} 98 | 99 | '@babel/parser@7.28.5': 100 | resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 101 | engines: {node: '>=6.0.0'} 102 | hasBin: true 103 | 104 | '@babel/plugin-syntax-async-generators@7.8.4': 105 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 106 | peerDependencies: 107 | '@babel/core': ^7.0.0-0 108 | 109 | '@babel/plugin-syntax-bigint@7.8.3': 110 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 111 | peerDependencies: 112 | '@babel/core': ^7.0.0-0 113 | 114 | '@babel/plugin-syntax-class-properties@7.12.13': 115 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 116 | peerDependencies: 117 | '@babel/core': ^7.0.0-0 118 | 119 | '@babel/plugin-syntax-class-static-block@7.14.5': 120 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 121 | engines: {node: '>=6.9.0'} 122 | peerDependencies: 123 | '@babel/core': ^7.0.0-0 124 | 125 | '@babel/plugin-syntax-import-attributes@7.27.1': 126 | resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} 127 | engines: {node: '>=6.9.0'} 128 | peerDependencies: 129 | '@babel/core': ^7.0.0-0 130 | 131 | '@babel/plugin-syntax-import-meta@7.10.4': 132 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 133 | peerDependencies: 134 | '@babel/core': ^7.0.0-0 135 | 136 | '@babel/plugin-syntax-json-strings@7.8.3': 137 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 138 | peerDependencies: 139 | '@babel/core': ^7.0.0-0 140 | 141 | '@babel/plugin-syntax-jsx@7.27.1': 142 | resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} 143 | engines: {node: '>=6.9.0'} 144 | peerDependencies: 145 | '@babel/core': ^7.0.0-0 146 | 147 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 148 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 149 | peerDependencies: 150 | '@babel/core': ^7.0.0-0 151 | 152 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 153 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 154 | peerDependencies: 155 | '@babel/core': ^7.0.0-0 156 | 157 | '@babel/plugin-syntax-numeric-separator@7.10.4': 158 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 159 | peerDependencies: 160 | '@babel/core': ^7.0.0-0 161 | 162 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 163 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 164 | peerDependencies: 165 | '@babel/core': ^7.0.0-0 166 | 167 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 168 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 169 | peerDependencies: 170 | '@babel/core': ^7.0.0-0 171 | 172 | '@babel/plugin-syntax-optional-chaining@7.8.3': 173 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 174 | peerDependencies: 175 | '@babel/core': ^7.0.0-0 176 | 177 | '@babel/plugin-syntax-private-property-in-object@7.14.5': 178 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 179 | engines: {node: '>=6.9.0'} 180 | peerDependencies: 181 | '@babel/core': ^7.0.0-0 182 | 183 | '@babel/plugin-syntax-top-level-await@7.14.5': 184 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 185 | engines: {node: '>=6.9.0'} 186 | peerDependencies: 187 | '@babel/core': ^7.0.0-0 188 | 189 | '@babel/plugin-syntax-typescript@7.27.1': 190 | resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} 191 | engines: {node: '>=6.9.0'} 192 | peerDependencies: 193 | '@babel/core': ^7.0.0-0 194 | 195 | '@babel/template@7.27.2': 196 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 197 | engines: {node: '>=6.9.0'} 198 | 199 | '@babel/traverse@7.28.5': 200 | resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 201 | engines: {node: '>=6.9.0'} 202 | 203 | '@babel/types@7.28.5': 204 | resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 205 | engines: {node: '>=6.9.0'} 206 | 207 | '@bcoe/v8-coverage@0.2.3': 208 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 209 | 210 | '@cspotcode/source-map-support@0.8.1': 211 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 212 | engines: {node: '>=12'} 213 | 214 | '@esbuild/aix-ppc64@0.27.0': 215 | resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} 216 | engines: {node: '>=18'} 217 | cpu: [ppc64] 218 | os: [aix] 219 | 220 | '@esbuild/android-arm64@0.27.0': 221 | resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} 222 | engines: {node: '>=18'} 223 | cpu: [arm64] 224 | os: [android] 225 | 226 | '@esbuild/android-arm@0.27.0': 227 | resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} 228 | engines: {node: '>=18'} 229 | cpu: [arm] 230 | os: [android] 231 | 232 | '@esbuild/android-x64@0.27.0': 233 | resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} 234 | engines: {node: '>=18'} 235 | cpu: [x64] 236 | os: [android] 237 | 238 | '@esbuild/darwin-arm64@0.27.0': 239 | resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} 240 | engines: {node: '>=18'} 241 | cpu: [arm64] 242 | os: [darwin] 243 | 244 | '@esbuild/darwin-x64@0.27.0': 245 | resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} 246 | engines: {node: '>=18'} 247 | cpu: [x64] 248 | os: [darwin] 249 | 250 | '@esbuild/freebsd-arm64@0.27.0': 251 | resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} 252 | engines: {node: '>=18'} 253 | cpu: [arm64] 254 | os: [freebsd] 255 | 256 | '@esbuild/freebsd-x64@0.27.0': 257 | resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} 258 | engines: {node: '>=18'} 259 | cpu: [x64] 260 | os: [freebsd] 261 | 262 | '@esbuild/linux-arm64@0.27.0': 263 | resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} 264 | engines: {node: '>=18'} 265 | cpu: [arm64] 266 | os: [linux] 267 | 268 | '@esbuild/linux-arm@0.27.0': 269 | resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} 270 | engines: {node: '>=18'} 271 | cpu: [arm] 272 | os: [linux] 273 | 274 | '@esbuild/linux-ia32@0.27.0': 275 | resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} 276 | engines: {node: '>=18'} 277 | cpu: [ia32] 278 | os: [linux] 279 | 280 | '@esbuild/linux-loong64@0.27.0': 281 | resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} 282 | engines: {node: '>=18'} 283 | cpu: [loong64] 284 | os: [linux] 285 | 286 | '@esbuild/linux-mips64el@0.27.0': 287 | resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} 288 | engines: {node: '>=18'} 289 | cpu: [mips64el] 290 | os: [linux] 291 | 292 | '@esbuild/linux-ppc64@0.27.0': 293 | resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} 294 | engines: {node: '>=18'} 295 | cpu: [ppc64] 296 | os: [linux] 297 | 298 | '@esbuild/linux-riscv64@0.27.0': 299 | resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} 300 | engines: {node: '>=18'} 301 | cpu: [riscv64] 302 | os: [linux] 303 | 304 | '@esbuild/linux-s390x@0.27.0': 305 | resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} 306 | engines: {node: '>=18'} 307 | cpu: [s390x] 308 | os: [linux] 309 | 310 | '@esbuild/linux-x64@0.27.0': 311 | resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} 312 | engines: {node: '>=18'} 313 | cpu: [x64] 314 | os: [linux] 315 | 316 | '@esbuild/netbsd-arm64@0.27.0': 317 | resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} 318 | engines: {node: '>=18'} 319 | cpu: [arm64] 320 | os: [netbsd] 321 | 322 | '@esbuild/netbsd-x64@0.27.0': 323 | resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} 324 | engines: {node: '>=18'} 325 | cpu: [x64] 326 | os: [netbsd] 327 | 328 | '@esbuild/openbsd-arm64@0.27.0': 329 | resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} 330 | engines: {node: '>=18'} 331 | cpu: [arm64] 332 | os: [openbsd] 333 | 334 | '@esbuild/openbsd-x64@0.27.0': 335 | resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} 336 | engines: {node: '>=18'} 337 | cpu: [x64] 338 | os: [openbsd] 339 | 340 | '@esbuild/openharmony-arm64@0.27.0': 341 | resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} 342 | engines: {node: '>=18'} 343 | cpu: [arm64] 344 | os: [openharmony] 345 | 346 | '@esbuild/sunos-x64@0.27.0': 347 | resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} 348 | engines: {node: '>=18'} 349 | cpu: [x64] 350 | os: [sunos] 351 | 352 | '@esbuild/win32-arm64@0.27.0': 353 | resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} 354 | engines: {node: '>=18'} 355 | cpu: [arm64] 356 | os: [win32] 357 | 358 | '@esbuild/win32-ia32@0.27.0': 359 | resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} 360 | engines: {node: '>=18'} 361 | cpu: [ia32] 362 | os: [win32] 363 | 364 | '@esbuild/win32-x64@0.27.0': 365 | resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} 366 | engines: {node: '>=18'} 367 | cpu: [x64] 368 | os: [win32] 369 | 370 | '@istanbuljs/load-nyc-config@1.1.0': 371 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 372 | engines: {node: '>=8'} 373 | 374 | '@istanbuljs/schema@0.1.3': 375 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 376 | engines: {node: '>=8'} 377 | 378 | '@jest/console@29.7.0': 379 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 380 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 381 | 382 | '@jest/core@29.7.0': 383 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 384 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 385 | peerDependencies: 386 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 387 | peerDependenciesMeta: 388 | node-notifier: 389 | optional: true 390 | 391 | '@jest/environment@29.7.0': 392 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 393 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 394 | 395 | '@jest/expect-utils@29.7.0': 396 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 397 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 398 | 399 | '@jest/expect@29.7.0': 400 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 401 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 402 | 403 | '@jest/fake-timers@29.7.0': 404 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 405 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 406 | 407 | '@jest/globals@29.7.0': 408 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 409 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 410 | 411 | '@jest/reporters@29.7.0': 412 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 413 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 414 | peerDependencies: 415 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 416 | peerDependenciesMeta: 417 | node-notifier: 418 | optional: true 419 | 420 | '@jest/schemas@29.6.3': 421 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 422 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 423 | 424 | '@jest/source-map@29.6.3': 425 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 426 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 427 | 428 | '@jest/test-result@29.7.0': 429 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 430 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 431 | 432 | '@jest/test-sequencer@29.7.0': 433 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 434 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 435 | 436 | '@jest/transform@29.7.0': 437 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 438 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 439 | 440 | '@jest/types@29.6.3': 441 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 442 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 443 | 444 | '@jridgewell/gen-mapping@0.3.13': 445 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 446 | 447 | '@jridgewell/remapping@2.3.5': 448 | resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 449 | 450 | '@jridgewell/resolve-uri@3.1.2': 451 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 452 | engines: {node: '>=6.0.0'} 453 | 454 | '@jridgewell/sourcemap-codec@1.5.5': 455 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 456 | 457 | '@jridgewell/trace-mapping@0.3.31': 458 | resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 459 | 460 | '@jridgewell/trace-mapping@0.3.9': 461 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 462 | 463 | '@rollup/rollup-android-arm-eabi@4.53.3': 464 | resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} 465 | cpu: [arm] 466 | os: [android] 467 | 468 | '@rollup/rollup-android-arm64@4.53.3': 469 | resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} 470 | cpu: [arm64] 471 | os: [android] 472 | 473 | '@rollup/rollup-darwin-arm64@4.53.3': 474 | resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} 475 | cpu: [arm64] 476 | os: [darwin] 477 | 478 | '@rollup/rollup-darwin-x64@4.53.3': 479 | resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} 480 | cpu: [x64] 481 | os: [darwin] 482 | 483 | '@rollup/rollup-freebsd-arm64@4.53.3': 484 | resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} 485 | cpu: [arm64] 486 | os: [freebsd] 487 | 488 | '@rollup/rollup-freebsd-x64@4.53.3': 489 | resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} 490 | cpu: [x64] 491 | os: [freebsd] 492 | 493 | '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 494 | resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} 495 | cpu: [arm] 496 | os: [linux] 497 | 498 | '@rollup/rollup-linux-arm-musleabihf@4.53.3': 499 | resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} 500 | cpu: [arm] 501 | os: [linux] 502 | 503 | '@rollup/rollup-linux-arm64-gnu@4.53.3': 504 | resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} 505 | cpu: [arm64] 506 | os: [linux] 507 | 508 | '@rollup/rollup-linux-arm64-musl@4.53.3': 509 | resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} 510 | cpu: [arm64] 511 | os: [linux] 512 | 513 | '@rollup/rollup-linux-loong64-gnu@4.53.3': 514 | resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} 515 | cpu: [loong64] 516 | os: [linux] 517 | 518 | '@rollup/rollup-linux-ppc64-gnu@4.53.3': 519 | resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} 520 | cpu: [ppc64] 521 | os: [linux] 522 | 523 | '@rollup/rollup-linux-riscv64-gnu@4.53.3': 524 | resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} 525 | cpu: [riscv64] 526 | os: [linux] 527 | 528 | '@rollup/rollup-linux-riscv64-musl@4.53.3': 529 | resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} 530 | cpu: [riscv64] 531 | os: [linux] 532 | 533 | '@rollup/rollup-linux-s390x-gnu@4.53.3': 534 | resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} 535 | cpu: [s390x] 536 | os: [linux] 537 | 538 | '@rollup/rollup-linux-x64-gnu@4.53.3': 539 | resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} 540 | cpu: [x64] 541 | os: [linux] 542 | 543 | '@rollup/rollup-linux-x64-musl@4.53.3': 544 | resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} 545 | cpu: [x64] 546 | os: [linux] 547 | 548 | '@rollup/rollup-openharmony-arm64@4.53.3': 549 | resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} 550 | cpu: [arm64] 551 | os: [openharmony] 552 | 553 | '@rollup/rollup-win32-arm64-msvc@4.53.3': 554 | resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} 555 | cpu: [arm64] 556 | os: [win32] 557 | 558 | '@rollup/rollup-win32-ia32-msvc@4.53.3': 559 | resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} 560 | cpu: [ia32] 561 | os: [win32] 562 | 563 | '@rollup/rollup-win32-x64-gnu@4.53.3': 564 | resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} 565 | cpu: [x64] 566 | os: [win32] 567 | 568 | '@rollup/rollup-win32-x64-msvc@4.53.3': 569 | resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} 570 | cpu: [x64] 571 | os: [win32] 572 | 573 | '@sinclair/typebox@0.27.8': 574 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 575 | 576 | '@sinonjs/commons@3.0.1': 577 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 578 | 579 | '@sinonjs/fake-timers@10.3.0': 580 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 581 | 582 | '@tsconfig/node10@1.0.12': 583 | resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} 584 | 585 | '@tsconfig/node12@1.0.11': 586 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 587 | 588 | '@tsconfig/node14@1.0.3': 589 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 590 | 591 | '@tsconfig/node16@1.0.4': 592 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 593 | 594 | '@tsconfig/strictest@2.0.8': 595 | resolution: {integrity: sha512-XnQ7vNz5HRN0r88GYf1J9JJjqtZPiHt2woGJOo2dYqyHGGcd6OLGqSlBB6p1j9mpzja6Oe5BoPqWmeDx6X9rLw==} 596 | 597 | '@types/babel__core@7.20.5': 598 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 599 | 600 | '@types/babel__generator@7.27.0': 601 | resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 602 | 603 | '@types/babel__template@7.4.4': 604 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 605 | 606 | '@types/babel__traverse@7.28.0': 607 | resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 608 | 609 | '@types/estree@1.0.8': 610 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 611 | 612 | '@types/graceful-fs@4.1.9': 613 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 614 | 615 | '@types/istanbul-lib-coverage@2.0.6': 616 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 617 | 618 | '@types/istanbul-lib-report@3.0.3': 619 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 620 | 621 | '@types/istanbul-reports@3.0.4': 622 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 623 | 624 | '@types/node@20.19.25': 625 | resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} 626 | 627 | '@types/stack-utils@2.0.3': 628 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 629 | 630 | '@types/uuid@10.0.0': 631 | resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} 632 | 633 | '@types/yargs-parser@21.0.3': 634 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 635 | 636 | '@types/yargs@17.0.35': 637 | resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} 638 | 639 | acorn-walk@8.3.4: 640 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 641 | engines: {node: '>=0.4.0'} 642 | 643 | acorn@8.15.0: 644 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 645 | engines: {node: '>=0.4.0'} 646 | hasBin: true 647 | 648 | ansi-escapes@4.3.2: 649 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 650 | engines: {node: '>=8'} 651 | 652 | ansi-regex@5.0.1: 653 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 654 | engines: {node: '>=8'} 655 | 656 | ansi-styles@4.3.0: 657 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 658 | engines: {node: '>=8'} 659 | 660 | ansi-styles@5.2.0: 661 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 662 | engines: {node: '>=10'} 663 | 664 | any-promise@1.3.0: 665 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 666 | 667 | anymatch@3.1.3: 668 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 669 | engines: {node: '>= 8'} 670 | 671 | arg@4.1.3: 672 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 673 | 674 | argparse@1.0.10: 675 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 676 | 677 | babel-jest@29.7.0: 678 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 679 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 680 | peerDependencies: 681 | '@babel/core': ^7.8.0 682 | 683 | babel-plugin-istanbul@6.1.1: 684 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 685 | engines: {node: '>=8'} 686 | 687 | babel-plugin-jest-hoist@29.6.3: 688 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 689 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 690 | 691 | babel-preset-current-node-syntax@1.2.0: 692 | resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} 693 | peerDependencies: 694 | '@babel/core': ^7.0.0 || ^8.0.0-0 695 | 696 | babel-preset-jest@29.6.3: 697 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 698 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 699 | peerDependencies: 700 | '@babel/core': ^7.0.0 701 | 702 | balanced-match@1.0.2: 703 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 704 | 705 | baseline-browser-mapping@2.8.32: 706 | resolution: {integrity: sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==} 707 | hasBin: true 708 | 709 | brace-expansion@1.1.12: 710 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 711 | 712 | braces@3.0.3: 713 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 714 | engines: {node: '>=8'} 715 | 716 | browserslist@4.28.0: 717 | resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} 718 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 719 | hasBin: true 720 | 721 | bs-logger@0.2.6: 722 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 723 | engines: {node: '>= 6'} 724 | 725 | bser@2.1.1: 726 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 727 | 728 | buffer-from@1.1.2: 729 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 730 | 731 | bundle-require@5.1.0: 732 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 733 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 734 | peerDependencies: 735 | esbuild: '>=0.18' 736 | 737 | cac@6.7.14: 738 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 739 | engines: {node: '>=8'} 740 | 741 | callsites@3.1.0: 742 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 743 | engines: {node: '>=6'} 744 | 745 | camelcase@5.3.1: 746 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 747 | engines: {node: '>=6'} 748 | 749 | camelcase@6.3.0: 750 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 751 | engines: {node: '>=10'} 752 | 753 | caniuse-lite@1.0.30001757: 754 | resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} 755 | 756 | chalk@4.1.2: 757 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 758 | engines: {node: '>=10'} 759 | 760 | char-regex@1.0.2: 761 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 762 | engines: {node: '>=10'} 763 | 764 | chokidar@4.0.3: 765 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 766 | engines: {node: '>= 14.16.0'} 767 | 768 | ci-info@3.9.0: 769 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 770 | engines: {node: '>=8'} 771 | 772 | cjs-module-lexer@1.4.3: 773 | resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} 774 | 775 | cliui@8.0.1: 776 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 777 | engines: {node: '>=12'} 778 | 779 | co@4.6.0: 780 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 781 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 782 | 783 | collect-v8-coverage@1.0.3: 784 | resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} 785 | 786 | color-convert@2.0.1: 787 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 788 | engines: {node: '>=7.0.0'} 789 | 790 | color-name@1.1.4: 791 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 792 | 793 | commander@4.1.1: 794 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 795 | engines: {node: '>= 6'} 796 | 797 | concat-map@0.0.1: 798 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 799 | 800 | confbox@0.1.8: 801 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 802 | 803 | consola@3.4.2: 804 | resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 805 | engines: {node: ^14.18.0 || >=16.10.0} 806 | 807 | convert-source-map@2.0.0: 808 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 809 | 810 | create-jest@29.7.0: 811 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 812 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 813 | hasBin: true 814 | 815 | create-require@1.1.1: 816 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 817 | 818 | cross-spawn@7.0.6: 819 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 820 | engines: {node: '>= 8'} 821 | 822 | debug@4.4.3: 823 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 824 | engines: {node: '>=6.0'} 825 | peerDependencies: 826 | supports-color: '*' 827 | peerDependenciesMeta: 828 | supports-color: 829 | optional: true 830 | 831 | dedent@1.7.0: 832 | resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} 833 | peerDependencies: 834 | babel-plugin-macros: ^3.1.0 835 | peerDependenciesMeta: 836 | babel-plugin-macros: 837 | optional: true 838 | 839 | deepmerge@4.3.1: 840 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 841 | engines: {node: '>=0.10.0'} 842 | 843 | detect-newline@3.1.0: 844 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 845 | engines: {node: '>=8'} 846 | 847 | diff-sequences@29.6.3: 848 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 849 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 850 | 851 | diff@4.0.2: 852 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 853 | engines: {node: '>=0.3.1'} 854 | 855 | electron-to-chromium@1.5.262: 856 | resolution: {integrity: sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==} 857 | 858 | emittery@0.13.1: 859 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 860 | engines: {node: '>=12'} 861 | 862 | emoji-regex@8.0.0: 863 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 864 | 865 | error-ex@1.3.4: 866 | resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} 867 | 868 | esbuild@0.27.0: 869 | resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} 870 | engines: {node: '>=18'} 871 | hasBin: true 872 | 873 | escalade@3.2.0: 874 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 875 | engines: {node: '>=6'} 876 | 877 | escape-string-regexp@2.0.0: 878 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 879 | engines: {node: '>=8'} 880 | 881 | esprima@4.0.1: 882 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 883 | engines: {node: '>=4'} 884 | hasBin: true 885 | 886 | execa@5.1.1: 887 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 888 | engines: {node: '>=10'} 889 | 890 | exit@0.1.2: 891 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 892 | engines: {node: '>= 0.8.0'} 893 | 894 | expect@29.7.0: 895 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 896 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 897 | 898 | fast-json-stable-stringify@2.1.0: 899 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 900 | 901 | fb-watchman@2.0.2: 902 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 903 | 904 | fdir@6.5.0: 905 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 906 | engines: {node: '>=12.0.0'} 907 | peerDependencies: 908 | picomatch: ^3 || ^4 909 | peerDependenciesMeta: 910 | picomatch: 911 | optional: true 912 | 913 | fill-range@7.1.1: 914 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 915 | engines: {node: '>=8'} 916 | 917 | find-up@4.1.0: 918 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 919 | engines: {node: '>=8'} 920 | 921 | fix-dts-default-cjs-exports@1.0.1: 922 | resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} 923 | 924 | fs.realpath@1.0.0: 925 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 926 | 927 | fsevents@2.3.3: 928 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 929 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 930 | os: [darwin] 931 | 932 | function-bind@1.1.2: 933 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 934 | 935 | gensync@1.0.0-beta.2: 936 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 937 | engines: {node: '>=6.9.0'} 938 | 939 | get-caller-file@2.0.5: 940 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 941 | engines: {node: 6.* || 8.* || >= 10.*} 942 | 943 | get-package-type@0.1.0: 944 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 945 | engines: {node: '>=8.0.0'} 946 | 947 | get-stream@6.0.1: 948 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 949 | engines: {node: '>=10'} 950 | 951 | glob@7.2.3: 952 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 953 | deprecated: Glob versions prior to v9 are no longer supported 954 | 955 | graceful-fs@4.2.11: 956 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 957 | 958 | handlebars@4.7.8: 959 | resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} 960 | engines: {node: '>=0.4.7'} 961 | hasBin: true 962 | 963 | has-flag@4.0.0: 964 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 965 | engines: {node: '>=8'} 966 | 967 | hasown@2.0.2: 968 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 969 | engines: {node: '>= 0.4'} 970 | 971 | html-escaper@2.0.2: 972 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 973 | 974 | human-signals@2.1.0: 975 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 976 | engines: {node: '>=10.17.0'} 977 | 978 | import-local@3.2.0: 979 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 980 | engines: {node: '>=8'} 981 | hasBin: true 982 | 983 | imurmurhash@0.1.4: 984 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 985 | engines: {node: '>=0.8.19'} 986 | 987 | inflight@1.0.6: 988 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 989 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 990 | 991 | inherits@2.0.4: 992 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 993 | 994 | is-arrayish@0.2.1: 995 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 996 | 997 | is-core-module@2.16.1: 998 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 999 | engines: {node: '>= 0.4'} 1000 | 1001 | is-fullwidth-code-point@3.0.0: 1002 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1003 | engines: {node: '>=8'} 1004 | 1005 | is-generator-fn@2.1.0: 1006 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 1007 | engines: {node: '>=6'} 1008 | 1009 | is-number@7.0.0: 1010 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1011 | engines: {node: '>=0.12.0'} 1012 | 1013 | is-stream@2.0.1: 1014 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1015 | engines: {node: '>=8'} 1016 | 1017 | isexe@2.0.0: 1018 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1019 | 1020 | istanbul-lib-coverage@3.2.2: 1021 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1022 | engines: {node: '>=8'} 1023 | 1024 | istanbul-lib-instrument@5.2.1: 1025 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 1026 | engines: {node: '>=8'} 1027 | 1028 | istanbul-lib-instrument@6.0.3: 1029 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 1030 | engines: {node: '>=10'} 1031 | 1032 | istanbul-lib-report@3.0.1: 1033 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1034 | engines: {node: '>=10'} 1035 | 1036 | istanbul-lib-source-maps@4.0.1: 1037 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1038 | engines: {node: '>=10'} 1039 | 1040 | istanbul-reports@3.2.0: 1041 | resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} 1042 | engines: {node: '>=8'} 1043 | 1044 | jest-changed-files@29.7.0: 1045 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 1046 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1047 | 1048 | jest-circus@29.7.0: 1049 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 1050 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1051 | 1052 | jest-cli@29.7.0: 1053 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 1054 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1055 | hasBin: true 1056 | peerDependencies: 1057 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1058 | peerDependenciesMeta: 1059 | node-notifier: 1060 | optional: true 1061 | 1062 | jest-config@29.7.0: 1063 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 1064 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1065 | peerDependencies: 1066 | '@types/node': '*' 1067 | ts-node: '>=9.0.0' 1068 | peerDependenciesMeta: 1069 | '@types/node': 1070 | optional: true 1071 | ts-node: 1072 | optional: true 1073 | 1074 | jest-diff@29.7.0: 1075 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 1076 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1077 | 1078 | jest-docblock@29.7.0: 1079 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 1080 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1081 | 1082 | jest-each@29.7.0: 1083 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 1084 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1085 | 1086 | jest-environment-node@29.7.0: 1087 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 1088 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1089 | 1090 | jest-get-type@29.6.3: 1091 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 1092 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1093 | 1094 | jest-haste-map@29.7.0: 1095 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 1096 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1097 | 1098 | jest-leak-detector@29.7.0: 1099 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 1100 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1101 | 1102 | jest-matcher-utils@29.7.0: 1103 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 1104 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1105 | 1106 | jest-message-util@29.7.0: 1107 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 1108 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1109 | 1110 | jest-mock@29.7.0: 1111 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 1112 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1113 | 1114 | jest-pnp-resolver@1.2.3: 1115 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 1116 | engines: {node: '>=6'} 1117 | peerDependencies: 1118 | jest-resolve: '*' 1119 | peerDependenciesMeta: 1120 | jest-resolve: 1121 | optional: true 1122 | 1123 | jest-regex-util@29.6.3: 1124 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 1125 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1126 | 1127 | jest-resolve-dependencies@29.7.0: 1128 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 1129 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1130 | 1131 | jest-resolve@29.7.0: 1132 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 1133 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1134 | 1135 | jest-runner@29.7.0: 1136 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 1137 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1138 | 1139 | jest-runtime@29.7.0: 1140 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 1141 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1142 | 1143 | jest-snapshot@29.7.0: 1144 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 1145 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1146 | 1147 | jest-util@29.7.0: 1148 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 1149 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1150 | 1151 | jest-validate@29.7.0: 1152 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 1153 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1154 | 1155 | jest-watcher@29.7.0: 1156 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 1157 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1158 | 1159 | jest-worker@29.7.0: 1160 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 1161 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1162 | 1163 | jest@29.7.0: 1164 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 1165 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1166 | hasBin: true 1167 | peerDependencies: 1168 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1169 | peerDependenciesMeta: 1170 | node-notifier: 1171 | optional: true 1172 | 1173 | joycon@3.1.1: 1174 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1175 | engines: {node: '>=10'} 1176 | 1177 | js-tokens@4.0.0: 1178 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1179 | 1180 | js-yaml@3.14.2: 1181 | resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} 1182 | hasBin: true 1183 | 1184 | jsesc@3.1.0: 1185 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1186 | engines: {node: '>=6'} 1187 | hasBin: true 1188 | 1189 | json-parse-even-better-errors@2.3.1: 1190 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1191 | 1192 | json5@2.2.3: 1193 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1194 | engines: {node: '>=6'} 1195 | hasBin: true 1196 | 1197 | kleur@3.0.3: 1198 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1199 | engines: {node: '>=6'} 1200 | 1201 | leven@3.1.0: 1202 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 1203 | engines: {node: '>=6'} 1204 | 1205 | lilconfig@3.1.3: 1206 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 1207 | engines: {node: '>=14'} 1208 | 1209 | lines-and-columns@1.2.4: 1210 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1211 | 1212 | load-tsconfig@0.2.5: 1213 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1214 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1215 | 1216 | locate-path@5.0.0: 1217 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1218 | engines: {node: '>=8'} 1219 | 1220 | lodash.memoize@4.1.2: 1221 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 1222 | 1223 | lru-cache@5.1.1: 1224 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1225 | 1226 | magic-string@0.30.21: 1227 | resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1228 | 1229 | make-dir@4.0.0: 1230 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1231 | engines: {node: '>=10'} 1232 | 1233 | make-error@1.3.6: 1234 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1235 | 1236 | makeerror@1.0.12: 1237 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 1238 | 1239 | merge-stream@2.0.0: 1240 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1241 | 1242 | micromatch@4.0.8: 1243 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1244 | engines: {node: '>=8.6'} 1245 | 1246 | mimic-fn@2.1.0: 1247 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1248 | engines: {node: '>=6'} 1249 | 1250 | minimatch@3.1.2: 1251 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1252 | 1253 | minimist@1.2.8: 1254 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1255 | 1256 | mlly@1.8.0: 1257 | resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 1258 | 1259 | ms@2.1.3: 1260 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1261 | 1262 | mz@2.7.0: 1263 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1264 | 1265 | natural-compare@1.4.0: 1266 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1267 | 1268 | neo-async@2.6.2: 1269 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1270 | 1271 | node-int64@0.4.0: 1272 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 1273 | 1274 | node-releases@2.0.27: 1275 | resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 1276 | 1277 | normalize-path@3.0.0: 1278 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1279 | engines: {node: '>=0.10.0'} 1280 | 1281 | npm-run-path@4.0.1: 1282 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1283 | engines: {node: '>=8'} 1284 | 1285 | object-assign@4.1.1: 1286 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1287 | engines: {node: '>=0.10.0'} 1288 | 1289 | once@1.4.0: 1290 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1291 | 1292 | onetime@5.1.2: 1293 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1294 | engines: {node: '>=6'} 1295 | 1296 | p-limit@2.3.0: 1297 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1298 | engines: {node: '>=6'} 1299 | 1300 | p-limit@3.1.0: 1301 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1302 | engines: {node: '>=10'} 1303 | 1304 | p-locate@4.1.0: 1305 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1306 | engines: {node: '>=8'} 1307 | 1308 | p-try@2.2.0: 1309 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1310 | engines: {node: '>=6'} 1311 | 1312 | parse-json@5.2.0: 1313 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1314 | engines: {node: '>=8'} 1315 | 1316 | path-exists@4.0.0: 1317 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1318 | engines: {node: '>=8'} 1319 | 1320 | path-is-absolute@1.0.1: 1321 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1322 | engines: {node: '>=0.10.0'} 1323 | 1324 | path-key@3.1.1: 1325 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1326 | engines: {node: '>=8'} 1327 | 1328 | path-parse@1.0.7: 1329 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1330 | 1331 | pathe@2.0.3: 1332 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1333 | 1334 | picocolors@1.1.1: 1335 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1336 | 1337 | picomatch@2.3.1: 1338 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1339 | engines: {node: '>=8.6'} 1340 | 1341 | picomatch@4.0.3: 1342 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1343 | engines: {node: '>=12'} 1344 | 1345 | pirates@4.0.7: 1346 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 1347 | engines: {node: '>= 6'} 1348 | 1349 | pkg-dir@4.2.0: 1350 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1351 | engines: {node: '>=8'} 1352 | 1353 | pkg-types@1.3.1: 1354 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1355 | 1356 | postcss-load-config@6.0.1: 1357 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1358 | engines: {node: '>= 18'} 1359 | peerDependencies: 1360 | jiti: '>=1.21.0' 1361 | postcss: '>=8.0.9' 1362 | tsx: ^4.8.1 1363 | yaml: ^2.4.2 1364 | peerDependenciesMeta: 1365 | jiti: 1366 | optional: true 1367 | postcss: 1368 | optional: true 1369 | tsx: 1370 | optional: true 1371 | yaml: 1372 | optional: true 1373 | 1374 | pretty-format@29.7.0: 1375 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 1376 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1377 | 1378 | prompts@2.4.2: 1379 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1380 | engines: {node: '>= 6'} 1381 | 1382 | pure-rand@6.1.0: 1383 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 1384 | 1385 | react-is@18.3.1: 1386 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 1387 | 1388 | readdirp@4.1.2: 1389 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1390 | engines: {node: '>= 14.18.0'} 1391 | 1392 | require-directory@2.1.1: 1393 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1394 | engines: {node: '>=0.10.0'} 1395 | 1396 | resolve-cwd@3.0.0: 1397 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1398 | engines: {node: '>=8'} 1399 | 1400 | resolve-from@5.0.0: 1401 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1402 | engines: {node: '>=8'} 1403 | 1404 | resolve.exports@2.0.3: 1405 | resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} 1406 | engines: {node: '>=10'} 1407 | 1408 | resolve@1.22.11: 1409 | resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} 1410 | engines: {node: '>= 0.4'} 1411 | hasBin: true 1412 | 1413 | rollup@4.53.3: 1414 | resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} 1415 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1416 | hasBin: true 1417 | 1418 | semver@6.3.1: 1419 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1420 | hasBin: true 1421 | 1422 | semver@7.7.3: 1423 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1424 | engines: {node: '>=10'} 1425 | hasBin: true 1426 | 1427 | shebang-command@2.0.0: 1428 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1429 | engines: {node: '>=8'} 1430 | 1431 | shebang-regex@3.0.0: 1432 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1433 | engines: {node: '>=8'} 1434 | 1435 | signal-exit@3.0.7: 1436 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1437 | 1438 | sisteransi@1.0.5: 1439 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1440 | 1441 | slash@3.0.0: 1442 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1443 | engines: {node: '>=8'} 1444 | 1445 | source-map-support@0.5.13: 1446 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 1447 | 1448 | source-map@0.6.1: 1449 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1450 | engines: {node: '>=0.10.0'} 1451 | 1452 | source-map@0.7.6: 1453 | resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} 1454 | engines: {node: '>= 12'} 1455 | 1456 | sprintf-js@1.0.3: 1457 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1458 | 1459 | stack-utils@2.0.6: 1460 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1461 | engines: {node: '>=10'} 1462 | 1463 | string-length@4.0.2: 1464 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1465 | engines: {node: '>=10'} 1466 | 1467 | string-width@4.2.3: 1468 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1469 | engines: {node: '>=8'} 1470 | 1471 | strip-ansi@6.0.1: 1472 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1473 | engines: {node: '>=8'} 1474 | 1475 | strip-bom@4.0.0: 1476 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1477 | engines: {node: '>=8'} 1478 | 1479 | strip-final-newline@2.0.0: 1480 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1481 | engines: {node: '>=6'} 1482 | 1483 | strip-json-comments@3.1.1: 1484 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1485 | engines: {node: '>=8'} 1486 | 1487 | sucrase@3.35.1: 1488 | resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} 1489 | engines: {node: '>=16 || 14 >=14.17'} 1490 | hasBin: true 1491 | 1492 | supports-color@7.2.0: 1493 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1494 | engines: {node: '>=8'} 1495 | 1496 | supports-color@8.1.1: 1497 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1498 | engines: {node: '>=10'} 1499 | 1500 | supports-preserve-symlinks-flag@1.0.0: 1501 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1502 | engines: {node: '>= 0.4'} 1503 | 1504 | test-exclude@6.0.0: 1505 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1506 | engines: {node: '>=8'} 1507 | 1508 | thenify-all@1.6.0: 1509 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1510 | engines: {node: '>=0.8'} 1511 | 1512 | thenify@3.3.1: 1513 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1514 | 1515 | tinyexec@0.3.2: 1516 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1517 | 1518 | tinyglobby@0.2.15: 1519 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1520 | engines: {node: '>=12.0.0'} 1521 | 1522 | tmpl@1.0.5: 1523 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1524 | 1525 | to-regex-range@5.0.1: 1526 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1527 | engines: {node: '>=8.0'} 1528 | 1529 | tree-kill@1.2.2: 1530 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1531 | hasBin: true 1532 | 1533 | ts-interface-checker@0.1.13: 1534 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1535 | 1536 | ts-jest@29.4.6: 1537 | resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} 1538 | engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} 1539 | hasBin: true 1540 | peerDependencies: 1541 | '@babel/core': '>=7.0.0-beta.0 <8' 1542 | '@jest/transform': ^29.0.0 || ^30.0.0 1543 | '@jest/types': ^29.0.0 || ^30.0.0 1544 | babel-jest: ^29.0.0 || ^30.0.0 1545 | esbuild: '*' 1546 | jest: ^29.0.0 || ^30.0.0 1547 | jest-util: ^29.0.0 || ^30.0.0 1548 | typescript: '>=4.3 <6' 1549 | peerDependenciesMeta: 1550 | '@babel/core': 1551 | optional: true 1552 | '@jest/transform': 1553 | optional: true 1554 | '@jest/types': 1555 | optional: true 1556 | babel-jest: 1557 | optional: true 1558 | esbuild: 1559 | optional: true 1560 | jest-util: 1561 | optional: true 1562 | 1563 | ts-node@10.9.2: 1564 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 1565 | hasBin: true 1566 | peerDependencies: 1567 | '@swc/core': '>=1.2.50' 1568 | '@swc/wasm': '>=1.2.50' 1569 | '@types/node': '*' 1570 | typescript: '>=2.7' 1571 | peerDependenciesMeta: 1572 | '@swc/core': 1573 | optional: true 1574 | '@swc/wasm': 1575 | optional: true 1576 | 1577 | tsup@8.5.1: 1578 | resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} 1579 | engines: {node: '>=18'} 1580 | hasBin: true 1581 | peerDependencies: 1582 | '@microsoft/api-extractor': ^7.36.0 1583 | '@swc/core': ^1 1584 | postcss: ^8.4.12 1585 | typescript: '>=4.5.0' 1586 | peerDependenciesMeta: 1587 | '@microsoft/api-extractor': 1588 | optional: true 1589 | '@swc/core': 1590 | optional: true 1591 | postcss: 1592 | optional: true 1593 | typescript: 1594 | optional: true 1595 | 1596 | type-detect@4.0.8: 1597 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1598 | engines: {node: '>=4'} 1599 | 1600 | type-fest@0.21.3: 1601 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1602 | engines: {node: '>=10'} 1603 | 1604 | type-fest@4.41.0: 1605 | resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 1606 | engines: {node: '>=16'} 1607 | 1608 | typescript@5.9.3: 1609 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1610 | engines: {node: '>=14.17'} 1611 | hasBin: true 1612 | 1613 | ufo@1.6.1: 1614 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1615 | 1616 | uglify-js@3.19.3: 1617 | resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} 1618 | engines: {node: '>=0.8.0'} 1619 | hasBin: true 1620 | 1621 | undici-types@6.21.0: 1622 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1623 | 1624 | update-browserslist-db@1.1.4: 1625 | resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} 1626 | hasBin: true 1627 | peerDependencies: 1628 | browserslist: '>= 4.21.0' 1629 | 1630 | uuid@10.0.0: 1631 | resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} 1632 | hasBin: true 1633 | 1634 | v8-compile-cache-lib@3.0.1: 1635 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1636 | 1637 | v8-to-istanbul@9.3.0: 1638 | resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} 1639 | engines: {node: '>=10.12.0'} 1640 | 1641 | walker@1.0.8: 1642 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1643 | 1644 | which@2.0.2: 1645 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1646 | engines: {node: '>= 8'} 1647 | hasBin: true 1648 | 1649 | wordwrap@1.0.0: 1650 | resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} 1651 | 1652 | wrap-ansi@7.0.0: 1653 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1654 | engines: {node: '>=10'} 1655 | 1656 | wrappy@1.0.2: 1657 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1658 | 1659 | write-file-atomic@4.0.2: 1660 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 1661 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1662 | 1663 | y18n@5.0.8: 1664 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1665 | engines: {node: '>=10'} 1666 | 1667 | yallist@3.1.1: 1668 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1669 | 1670 | yargs-parser@21.1.1: 1671 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1672 | engines: {node: '>=12'} 1673 | 1674 | yargs@17.7.2: 1675 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1676 | engines: {node: '>=12'} 1677 | 1678 | yn@3.1.1: 1679 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1680 | engines: {node: '>=6'} 1681 | 1682 | yocto-queue@0.1.0: 1683 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1684 | engines: {node: '>=10'} 1685 | 1686 | snapshots: 1687 | 1688 | '@babel/code-frame@7.27.1': 1689 | dependencies: 1690 | '@babel/helper-validator-identifier': 7.28.5 1691 | js-tokens: 4.0.0 1692 | picocolors: 1.1.1 1693 | 1694 | '@babel/compat-data@7.28.5': {} 1695 | 1696 | '@babel/core@7.28.5': 1697 | dependencies: 1698 | '@babel/code-frame': 7.27.1 1699 | '@babel/generator': 7.28.5 1700 | '@babel/helper-compilation-targets': 7.27.2 1701 | '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) 1702 | '@babel/helpers': 7.28.4 1703 | '@babel/parser': 7.28.5 1704 | '@babel/template': 7.27.2 1705 | '@babel/traverse': 7.28.5 1706 | '@babel/types': 7.28.5 1707 | '@jridgewell/remapping': 2.3.5 1708 | convert-source-map: 2.0.0 1709 | debug: 4.4.3 1710 | gensync: 1.0.0-beta.2 1711 | json5: 2.2.3 1712 | semver: 6.3.1 1713 | transitivePeerDependencies: 1714 | - supports-color 1715 | 1716 | '@babel/generator@7.28.5': 1717 | dependencies: 1718 | '@babel/parser': 7.28.5 1719 | '@babel/types': 7.28.5 1720 | '@jridgewell/gen-mapping': 0.3.13 1721 | '@jridgewell/trace-mapping': 0.3.31 1722 | jsesc: 3.1.0 1723 | 1724 | '@babel/helper-compilation-targets@7.27.2': 1725 | dependencies: 1726 | '@babel/compat-data': 7.28.5 1727 | '@babel/helper-validator-option': 7.27.1 1728 | browserslist: 4.28.0 1729 | lru-cache: 5.1.1 1730 | semver: 6.3.1 1731 | 1732 | '@babel/helper-globals@7.28.0': {} 1733 | 1734 | '@babel/helper-module-imports@7.27.1': 1735 | dependencies: 1736 | '@babel/traverse': 7.28.5 1737 | '@babel/types': 7.28.5 1738 | transitivePeerDependencies: 1739 | - supports-color 1740 | 1741 | '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': 1742 | dependencies: 1743 | '@babel/core': 7.28.5 1744 | '@babel/helper-module-imports': 7.27.1 1745 | '@babel/helper-validator-identifier': 7.28.5 1746 | '@babel/traverse': 7.28.5 1747 | transitivePeerDependencies: 1748 | - supports-color 1749 | 1750 | '@babel/helper-plugin-utils@7.27.1': {} 1751 | 1752 | '@babel/helper-string-parser@7.27.1': {} 1753 | 1754 | '@babel/helper-validator-identifier@7.28.5': {} 1755 | 1756 | '@babel/helper-validator-option@7.27.1': {} 1757 | 1758 | '@babel/helpers@7.28.4': 1759 | dependencies: 1760 | '@babel/template': 7.27.2 1761 | '@babel/types': 7.28.5 1762 | 1763 | '@babel/parser@7.28.5': 1764 | dependencies: 1765 | '@babel/types': 7.28.5 1766 | 1767 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)': 1768 | dependencies: 1769 | '@babel/core': 7.28.5 1770 | '@babel/helper-plugin-utils': 7.27.1 1771 | 1772 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5)': 1773 | dependencies: 1774 | '@babel/core': 7.28.5 1775 | '@babel/helper-plugin-utils': 7.27.1 1776 | 1777 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)': 1778 | dependencies: 1779 | '@babel/core': 7.28.5 1780 | '@babel/helper-plugin-utils': 7.27.1 1781 | 1782 | '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)': 1783 | dependencies: 1784 | '@babel/core': 7.28.5 1785 | '@babel/helper-plugin-utils': 7.27.1 1786 | 1787 | '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': 1788 | dependencies: 1789 | '@babel/core': 7.28.5 1790 | '@babel/helper-plugin-utils': 7.27.1 1791 | 1792 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': 1793 | dependencies: 1794 | '@babel/core': 7.28.5 1795 | '@babel/helper-plugin-utils': 7.27.1 1796 | 1797 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)': 1798 | dependencies: 1799 | '@babel/core': 7.28.5 1800 | '@babel/helper-plugin-utils': 7.27.1 1801 | 1802 | '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': 1803 | dependencies: 1804 | '@babel/core': 7.28.5 1805 | '@babel/helper-plugin-utils': 7.27.1 1806 | 1807 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)': 1808 | dependencies: 1809 | '@babel/core': 7.28.5 1810 | '@babel/helper-plugin-utils': 7.27.1 1811 | 1812 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)': 1813 | dependencies: 1814 | '@babel/core': 7.28.5 1815 | '@babel/helper-plugin-utils': 7.27.1 1816 | 1817 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)': 1818 | dependencies: 1819 | '@babel/core': 7.28.5 1820 | '@babel/helper-plugin-utils': 7.27.1 1821 | 1822 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)': 1823 | dependencies: 1824 | '@babel/core': 7.28.5 1825 | '@babel/helper-plugin-utils': 7.27.1 1826 | 1827 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)': 1828 | dependencies: 1829 | '@babel/core': 7.28.5 1830 | '@babel/helper-plugin-utils': 7.27.1 1831 | 1832 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)': 1833 | dependencies: 1834 | '@babel/core': 7.28.5 1835 | '@babel/helper-plugin-utils': 7.27.1 1836 | 1837 | '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)': 1838 | dependencies: 1839 | '@babel/core': 7.28.5 1840 | '@babel/helper-plugin-utils': 7.27.1 1841 | 1842 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)': 1843 | dependencies: 1844 | '@babel/core': 7.28.5 1845 | '@babel/helper-plugin-utils': 7.27.1 1846 | 1847 | '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': 1848 | dependencies: 1849 | '@babel/core': 7.28.5 1850 | '@babel/helper-plugin-utils': 7.27.1 1851 | 1852 | '@babel/template@7.27.2': 1853 | dependencies: 1854 | '@babel/code-frame': 7.27.1 1855 | '@babel/parser': 7.28.5 1856 | '@babel/types': 7.28.5 1857 | 1858 | '@babel/traverse@7.28.5': 1859 | dependencies: 1860 | '@babel/code-frame': 7.27.1 1861 | '@babel/generator': 7.28.5 1862 | '@babel/helper-globals': 7.28.0 1863 | '@babel/parser': 7.28.5 1864 | '@babel/template': 7.27.2 1865 | '@babel/types': 7.28.5 1866 | debug: 4.4.3 1867 | transitivePeerDependencies: 1868 | - supports-color 1869 | 1870 | '@babel/types@7.28.5': 1871 | dependencies: 1872 | '@babel/helper-string-parser': 7.27.1 1873 | '@babel/helper-validator-identifier': 7.28.5 1874 | 1875 | '@bcoe/v8-coverage@0.2.3': {} 1876 | 1877 | '@cspotcode/source-map-support@0.8.1': 1878 | dependencies: 1879 | '@jridgewell/trace-mapping': 0.3.9 1880 | 1881 | '@esbuild/aix-ppc64@0.27.0': 1882 | optional: true 1883 | 1884 | '@esbuild/android-arm64@0.27.0': 1885 | optional: true 1886 | 1887 | '@esbuild/android-arm@0.27.0': 1888 | optional: true 1889 | 1890 | '@esbuild/android-x64@0.27.0': 1891 | optional: true 1892 | 1893 | '@esbuild/darwin-arm64@0.27.0': 1894 | optional: true 1895 | 1896 | '@esbuild/darwin-x64@0.27.0': 1897 | optional: true 1898 | 1899 | '@esbuild/freebsd-arm64@0.27.0': 1900 | optional: true 1901 | 1902 | '@esbuild/freebsd-x64@0.27.0': 1903 | optional: true 1904 | 1905 | '@esbuild/linux-arm64@0.27.0': 1906 | optional: true 1907 | 1908 | '@esbuild/linux-arm@0.27.0': 1909 | optional: true 1910 | 1911 | '@esbuild/linux-ia32@0.27.0': 1912 | optional: true 1913 | 1914 | '@esbuild/linux-loong64@0.27.0': 1915 | optional: true 1916 | 1917 | '@esbuild/linux-mips64el@0.27.0': 1918 | optional: true 1919 | 1920 | '@esbuild/linux-ppc64@0.27.0': 1921 | optional: true 1922 | 1923 | '@esbuild/linux-riscv64@0.27.0': 1924 | optional: true 1925 | 1926 | '@esbuild/linux-s390x@0.27.0': 1927 | optional: true 1928 | 1929 | '@esbuild/linux-x64@0.27.0': 1930 | optional: true 1931 | 1932 | '@esbuild/netbsd-arm64@0.27.0': 1933 | optional: true 1934 | 1935 | '@esbuild/netbsd-x64@0.27.0': 1936 | optional: true 1937 | 1938 | '@esbuild/openbsd-arm64@0.27.0': 1939 | optional: true 1940 | 1941 | '@esbuild/openbsd-x64@0.27.0': 1942 | optional: true 1943 | 1944 | '@esbuild/openharmony-arm64@0.27.0': 1945 | optional: true 1946 | 1947 | '@esbuild/sunos-x64@0.27.0': 1948 | optional: true 1949 | 1950 | '@esbuild/win32-arm64@0.27.0': 1951 | optional: true 1952 | 1953 | '@esbuild/win32-ia32@0.27.0': 1954 | optional: true 1955 | 1956 | '@esbuild/win32-x64@0.27.0': 1957 | optional: true 1958 | 1959 | '@istanbuljs/load-nyc-config@1.1.0': 1960 | dependencies: 1961 | camelcase: 5.3.1 1962 | find-up: 4.1.0 1963 | get-package-type: 0.1.0 1964 | js-yaml: 3.14.2 1965 | resolve-from: 5.0.0 1966 | 1967 | '@istanbuljs/schema@0.1.3': {} 1968 | 1969 | '@jest/console@29.7.0': 1970 | dependencies: 1971 | '@jest/types': 29.6.3 1972 | '@types/node': 20.19.25 1973 | chalk: 4.1.2 1974 | jest-message-util: 29.7.0 1975 | jest-util: 29.7.0 1976 | slash: 3.0.0 1977 | 1978 | '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3))': 1979 | dependencies: 1980 | '@jest/console': 29.7.0 1981 | '@jest/reporters': 29.7.0 1982 | '@jest/test-result': 29.7.0 1983 | '@jest/transform': 29.7.0 1984 | '@jest/types': 29.6.3 1985 | '@types/node': 20.19.25 1986 | ansi-escapes: 4.3.2 1987 | chalk: 4.1.2 1988 | ci-info: 3.9.0 1989 | exit: 0.1.2 1990 | graceful-fs: 4.2.11 1991 | jest-changed-files: 29.7.0 1992 | jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 1993 | jest-haste-map: 29.7.0 1994 | jest-message-util: 29.7.0 1995 | jest-regex-util: 29.6.3 1996 | jest-resolve: 29.7.0 1997 | jest-resolve-dependencies: 29.7.0 1998 | jest-runner: 29.7.0 1999 | jest-runtime: 29.7.0 2000 | jest-snapshot: 29.7.0 2001 | jest-util: 29.7.0 2002 | jest-validate: 29.7.0 2003 | jest-watcher: 29.7.0 2004 | micromatch: 4.0.8 2005 | pretty-format: 29.7.0 2006 | slash: 3.0.0 2007 | strip-ansi: 6.0.1 2008 | transitivePeerDependencies: 2009 | - babel-plugin-macros 2010 | - supports-color 2011 | - ts-node 2012 | 2013 | '@jest/environment@29.7.0': 2014 | dependencies: 2015 | '@jest/fake-timers': 29.7.0 2016 | '@jest/types': 29.6.3 2017 | '@types/node': 20.19.25 2018 | jest-mock: 29.7.0 2019 | 2020 | '@jest/expect-utils@29.7.0': 2021 | dependencies: 2022 | jest-get-type: 29.6.3 2023 | 2024 | '@jest/expect@29.7.0': 2025 | dependencies: 2026 | expect: 29.7.0 2027 | jest-snapshot: 29.7.0 2028 | transitivePeerDependencies: 2029 | - supports-color 2030 | 2031 | '@jest/fake-timers@29.7.0': 2032 | dependencies: 2033 | '@jest/types': 29.6.3 2034 | '@sinonjs/fake-timers': 10.3.0 2035 | '@types/node': 20.19.25 2036 | jest-message-util: 29.7.0 2037 | jest-mock: 29.7.0 2038 | jest-util: 29.7.0 2039 | 2040 | '@jest/globals@29.7.0': 2041 | dependencies: 2042 | '@jest/environment': 29.7.0 2043 | '@jest/expect': 29.7.0 2044 | '@jest/types': 29.6.3 2045 | jest-mock: 29.7.0 2046 | transitivePeerDependencies: 2047 | - supports-color 2048 | 2049 | '@jest/reporters@29.7.0': 2050 | dependencies: 2051 | '@bcoe/v8-coverage': 0.2.3 2052 | '@jest/console': 29.7.0 2053 | '@jest/test-result': 29.7.0 2054 | '@jest/transform': 29.7.0 2055 | '@jest/types': 29.6.3 2056 | '@jridgewell/trace-mapping': 0.3.31 2057 | '@types/node': 20.19.25 2058 | chalk: 4.1.2 2059 | collect-v8-coverage: 1.0.3 2060 | exit: 0.1.2 2061 | glob: 7.2.3 2062 | graceful-fs: 4.2.11 2063 | istanbul-lib-coverage: 3.2.2 2064 | istanbul-lib-instrument: 6.0.3 2065 | istanbul-lib-report: 3.0.1 2066 | istanbul-lib-source-maps: 4.0.1 2067 | istanbul-reports: 3.2.0 2068 | jest-message-util: 29.7.0 2069 | jest-util: 29.7.0 2070 | jest-worker: 29.7.0 2071 | slash: 3.0.0 2072 | string-length: 4.0.2 2073 | strip-ansi: 6.0.1 2074 | v8-to-istanbul: 9.3.0 2075 | transitivePeerDependencies: 2076 | - supports-color 2077 | 2078 | '@jest/schemas@29.6.3': 2079 | dependencies: 2080 | '@sinclair/typebox': 0.27.8 2081 | 2082 | '@jest/source-map@29.6.3': 2083 | dependencies: 2084 | '@jridgewell/trace-mapping': 0.3.31 2085 | callsites: 3.1.0 2086 | graceful-fs: 4.2.11 2087 | 2088 | '@jest/test-result@29.7.0': 2089 | dependencies: 2090 | '@jest/console': 29.7.0 2091 | '@jest/types': 29.6.3 2092 | '@types/istanbul-lib-coverage': 2.0.6 2093 | collect-v8-coverage: 1.0.3 2094 | 2095 | '@jest/test-sequencer@29.7.0': 2096 | dependencies: 2097 | '@jest/test-result': 29.7.0 2098 | graceful-fs: 4.2.11 2099 | jest-haste-map: 29.7.0 2100 | slash: 3.0.0 2101 | 2102 | '@jest/transform@29.7.0': 2103 | dependencies: 2104 | '@babel/core': 7.28.5 2105 | '@jest/types': 29.6.3 2106 | '@jridgewell/trace-mapping': 0.3.31 2107 | babel-plugin-istanbul: 6.1.1 2108 | chalk: 4.1.2 2109 | convert-source-map: 2.0.0 2110 | fast-json-stable-stringify: 2.1.0 2111 | graceful-fs: 4.2.11 2112 | jest-haste-map: 29.7.0 2113 | jest-regex-util: 29.6.3 2114 | jest-util: 29.7.0 2115 | micromatch: 4.0.8 2116 | pirates: 4.0.7 2117 | slash: 3.0.0 2118 | write-file-atomic: 4.0.2 2119 | transitivePeerDependencies: 2120 | - supports-color 2121 | 2122 | '@jest/types@29.6.3': 2123 | dependencies: 2124 | '@jest/schemas': 29.6.3 2125 | '@types/istanbul-lib-coverage': 2.0.6 2126 | '@types/istanbul-reports': 3.0.4 2127 | '@types/node': 20.19.25 2128 | '@types/yargs': 17.0.35 2129 | chalk: 4.1.2 2130 | 2131 | '@jridgewell/gen-mapping@0.3.13': 2132 | dependencies: 2133 | '@jridgewell/sourcemap-codec': 1.5.5 2134 | '@jridgewell/trace-mapping': 0.3.31 2135 | 2136 | '@jridgewell/remapping@2.3.5': 2137 | dependencies: 2138 | '@jridgewell/gen-mapping': 0.3.13 2139 | '@jridgewell/trace-mapping': 0.3.31 2140 | 2141 | '@jridgewell/resolve-uri@3.1.2': {} 2142 | 2143 | '@jridgewell/sourcemap-codec@1.5.5': {} 2144 | 2145 | '@jridgewell/trace-mapping@0.3.31': 2146 | dependencies: 2147 | '@jridgewell/resolve-uri': 3.1.2 2148 | '@jridgewell/sourcemap-codec': 1.5.5 2149 | 2150 | '@jridgewell/trace-mapping@0.3.9': 2151 | dependencies: 2152 | '@jridgewell/resolve-uri': 3.1.2 2153 | '@jridgewell/sourcemap-codec': 1.5.5 2154 | 2155 | '@rollup/rollup-android-arm-eabi@4.53.3': 2156 | optional: true 2157 | 2158 | '@rollup/rollup-android-arm64@4.53.3': 2159 | optional: true 2160 | 2161 | '@rollup/rollup-darwin-arm64@4.53.3': 2162 | optional: true 2163 | 2164 | '@rollup/rollup-darwin-x64@4.53.3': 2165 | optional: true 2166 | 2167 | '@rollup/rollup-freebsd-arm64@4.53.3': 2168 | optional: true 2169 | 2170 | '@rollup/rollup-freebsd-x64@4.53.3': 2171 | optional: true 2172 | 2173 | '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 2174 | optional: true 2175 | 2176 | '@rollup/rollup-linux-arm-musleabihf@4.53.3': 2177 | optional: true 2178 | 2179 | '@rollup/rollup-linux-arm64-gnu@4.53.3': 2180 | optional: true 2181 | 2182 | '@rollup/rollup-linux-arm64-musl@4.53.3': 2183 | optional: true 2184 | 2185 | '@rollup/rollup-linux-loong64-gnu@4.53.3': 2186 | optional: true 2187 | 2188 | '@rollup/rollup-linux-ppc64-gnu@4.53.3': 2189 | optional: true 2190 | 2191 | '@rollup/rollup-linux-riscv64-gnu@4.53.3': 2192 | optional: true 2193 | 2194 | '@rollup/rollup-linux-riscv64-musl@4.53.3': 2195 | optional: true 2196 | 2197 | '@rollup/rollup-linux-s390x-gnu@4.53.3': 2198 | optional: true 2199 | 2200 | '@rollup/rollup-linux-x64-gnu@4.53.3': 2201 | optional: true 2202 | 2203 | '@rollup/rollup-linux-x64-musl@4.53.3': 2204 | optional: true 2205 | 2206 | '@rollup/rollup-openharmony-arm64@4.53.3': 2207 | optional: true 2208 | 2209 | '@rollup/rollup-win32-arm64-msvc@4.53.3': 2210 | optional: true 2211 | 2212 | '@rollup/rollup-win32-ia32-msvc@4.53.3': 2213 | optional: true 2214 | 2215 | '@rollup/rollup-win32-x64-gnu@4.53.3': 2216 | optional: true 2217 | 2218 | '@rollup/rollup-win32-x64-msvc@4.53.3': 2219 | optional: true 2220 | 2221 | '@sinclair/typebox@0.27.8': {} 2222 | 2223 | '@sinonjs/commons@3.0.1': 2224 | dependencies: 2225 | type-detect: 4.0.8 2226 | 2227 | '@sinonjs/fake-timers@10.3.0': 2228 | dependencies: 2229 | '@sinonjs/commons': 3.0.1 2230 | 2231 | '@tsconfig/node10@1.0.12': {} 2232 | 2233 | '@tsconfig/node12@1.0.11': {} 2234 | 2235 | '@tsconfig/node14@1.0.3': {} 2236 | 2237 | '@tsconfig/node16@1.0.4': {} 2238 | 2239 | '@tsconfig/strictest@2.0.8': {} 2240 | 2241 | '@types/babel__core@7.20.5': 2242 | dependencies: 2243 | '@babel/parser': 7.28.5 2244 | '@babel/types': 7.28.5 2245 | '@types/babel__generator': 7.27.0 2246 | '@types/babel__template': 7.4.4 2247 | '@types/babel__traverse': 7.28.0 2248 | 2249 | '@types/babel__generator@7.27.0': 2250 | dependencies: 2251 | '@babel/types': 7.28.5 2252 | 2253 | '@types/babel__template@7.4.4': 2254 | dependencies: 2255 | '@babel/parser': 7.28.5 2256 | '@babel/types': 7.28.5 2257 | 2258 | '@types/babel__traverse@7.28.0': 2259 | dependencies: 2260 | '@babel/types': 7.28.5 2261 | 2262 | '@types/estree@1.0.8': {} 2263 | 2264 | '@types/graceful-fs@4.1.9': 2265 | dependencies: 2266 | '@types/node': 20.19.25 2267 | 2268 | '@types/istanbul-lib-coverage@2.0.6': {} 2269 | 2270 | '@types/istanbul-lib-report@3.0.3': 2271 | dependencies: 2272 | '@types/istanbul-lib-coverage': 2.0.6 2273 | 2274 | '@types/istanbul-reports@3.0.4': 2275 | dependencies: 2276 | '@types/istanbul-lib-report': 3.0.3 2277 | 2278 | '@types/node@20.19.25': 2279 | dependencies: 2280 | undici-types: 6.21.0 2281 | 2282 | '@types/stack-utils@2.0.3': {} 2283 | 2284 | '@types/uuid@10.0.0': {} 2285 | 2286 | '@types/yargs-parser@21.0.3': {} 2287 | 2288 | '@types/yargs@17.0.35': 2289 | dependencies: 2290 | '@types/yargs-parser': 21.0.3 2291 | 2292 | acorn-walk@8.3.4: 2293 | dependencies: 2294 | acorn: 8.15.0 2295 | 2296 | acorn@8.15.0: {} 2297 | 2298 | ansi-escapes@4.3.2: 2299 | dependencies: 2300 | type-fest: 0.21.3 2301 | 2302 | ansi-regex@5.0.1: {} 2303 | 2304 | ansi-styles@4.3.0: 2305 | dependencies: 2306 | color-convert: 2.0.1 2307 | 2308 | ansi-styles@5.2.0: {} 2309 | 2310 | any-promise@1.3.0: {} 2311 | 2312 | anymatch@3.1.3: 2313 | dependencies: 2314 | normalize-path: 3.0.0 2315 | picomatch: 2.3.1 2316 | 2317 | arg@4.1.3: {} 2318 | 2319 | argparse@1.0.10: 2320 | dependencies: 2321 | sprintf-js: 1.0.3 2322 | 2323 | babel-jest@29.7.0(@babel/core@7.28.5): 2324 | dependencies: 2325 | '@babel/core': 7.28.5 2326 | '@jest/transform': 29.7.0 2327 | '@types/babel__core': 7.20.5 2328 | babel-plugin-istanbul: 6.1.1 2329 | babel-preset-jest: 29.6.3(@babel/core@7.28.5) 2330 | chalk: 4.1.2 2331 | graceful-fs: 4.2.11 2332 | slash: 3.0.0 2333 | transitivePeerDependencies: 2334 | - supports-color 2335 | 2336 | babel-plugin-istanbul@6.1.1: 2337 | dependencies: 2338 | '@babel/helper-plugin-utils': 7.27.1 2339 | '@istanbuljs/load-nyc-config': 1.1.0 2340 | '@istanbuljs/schema': 0.1.3 2341 | istanbul-lib-instrument: 5.2.1 2342 | test-exclude: 6.0.0 2343 | transitivePeerDependencies: 2344 | - supports-color 2345 | 2346 | babel-plugin-jest-hoist@29.6.3: 2347 | dependencies: 2348 | '@babel/template': 7.27.2 2349 | '@babel/types': 7.28.5 2350 | '@types/babel__core': 7.20.5 2351 | '@types/babel__traverse': 7.28.0 2352 | 2353 | babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): 2354 | dependencies: 2355 | '@babel/core': 7.28.5 2356 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) 2357 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) 2358 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) 2359 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) 2360 | '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) 2361 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) 2362 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) 2363 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) 2364 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) 2365 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) 2366 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) 2367 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) 2368 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) 2369 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) 2370 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) 2371 | 2372 | babel-preset-jest@29.6.3(@babel/core@7.28.5): 2373 | dependencies: 2374 | '@babel/core': 7.28.5 2375 | babel-plugin-jest-hoist: 29.6.3 2376 | babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) 2377 | 2378 | balanced-match@1.0.2: {} 2379 | 2380 | baseline-browser-mapping@2.8.32: {} 2381 | 2382 | brace-expansion@1.1.12: 2383 | dependencies: 2384 | balanced-match: 1.0.2 2385 | concat-map: 0.0.1 2386 | 2387 | braces@3.0.3: 2388 | dependencies: 2389 | fill-range: 7.1.1 2390 | 2391 | browserslist@4.28.0: 2392 | dependencies: 2393 | baseline-browser-mapping: 2.8.32 2394 | caniuse-lite: 1.0.30001757 2395 | electron-to-chromium: 1.5.262 2396 | node-releases: 2.0.27 2397 | update-browserslist-db: 1.1.4(browserslist@4.28.0) 2398 | 2399 | bs-logger@0.2.6: 2400 | dependencies: 2401 | fast-json-stable-stringify: 2.1.0 2402 | 2403 | bser@2.1.1: 2404 | dependencies: 2405 | node-int64: 0.4.0 2406 | 2407 | buffer-from@1.1.2: {} 2408 | 2409 | bundle-require@5.1.0(esbuild@0.27.0): 2410 | dependencies: 2411 | esbuild: 0.27.0 2412 | load-tsconfig: 0.2.5 2413 | 2414 | cac@6.7.14: {} 2415 | 2416 | callsites@3.1.0: {} 2417 | 2418 | camelcase@5.3.1: {} 2419 | 2420 | camelcase@6.3.0: {} 2421 | 2422 | caniuse-lite@1.0.30001757: {} 2423 | 2424 | chalk@4.1.2: 2425 | dependencies: 2426 | ansi-styles: 4.3.0 2427 | supports-color: 7.2.0 2428 | 2429 | char-regex@1.0.2: {} 2430 | 2431 | chokidar@4.0.3: 2432 | dependencies: 2433 | readdirp: 4.1.2 2434 | 2435 | ci-info@3.9.0: {} 2436 | 2437 | cjs-module-lexer@1.4.3: {} 2438 | 2439 | cliui@8.0.1: 2440 | dependencies: 2441 | string-width: 4.2.3 2442 | strip-ansi: 6.0.1 2443 | wrap-ansi: 7.0.0 2444 | 2445 | co@4.6.0: {} 2446 | 2447 | collect-v8-coverage@1.0.3: {} 2448 | 2449 | color-convert@2.0.1: 2450 | dependencies: 2451 | color-name: 1.1.4 2452 | 2453 | color-name@1.1.4: {} 2454 | 2455 | commander@4.1.1: {} 2456 | 2457 | concat-map@0.0.1: {} 2458 | 2459 | confbox@0.1.8: {} 2460 | 2461 | consola@3.4.2: {} 2462 | 2463 | convert-source-map@2.0.0: {} 2464 | 2465 | create-jest@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)): 2466 | dependencies: 2467 | '@jest/types': 29.6.3 2468 | chalk: 4.1.2 2469 | exit: 0.1.2 2470 | graceful-fs: 4.2.11 2471 | jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 2472 | jest-util: 29.7.0 2473 | prompts: 2.4.2 2474 | transitivePeerDependencies: 2475 | - '@types/node' 2476 | - babel-plugin-macros 2477 | - supports-color 2478 | - ts-node 2479 | 2480 | create-require@1.1.1: {} 2481 | 2482 | cross-spawn@7.0.6: 2483 | dependencies: 2484 | path-key: 3.1.1 2485 | shebang-command: 2.0.0 2486 | which: 2.0.2 2487 | 2488 | debug@4.4.3: 2489 | dependencies: 2490 | ms: 2.1.3 2491 | 2492 | dedent@1.7.0: {} 2493 | 2494 | deepmerge@4.3.1: {} 2495 | 2496 | detect-newline@3.1.0: {} 2497 | 2498 | diff-sequences@29.6.3: {} 2499 | 2500 | diff@4.0.2: {} 2501 | 2502 | electron-to-chromium@1.5.262: {} 2503 | 2504 | emittery@0.13.1: {} 2505 | 2506 | emoji-regex@8.0.0: {} 2507 | 2508 | error-ex@1.3.4: 2509 | dependencies: 2510 | is-arrayish: 0.2.1 2511 | 2512 | esbuild@0.27.0: 2513 | optionalDependencies: 2514 | '@esbuild/aix-ppc64': 0.27.0 2515 | '@esbuild/android-arm': 0.27.0 2516 | '@esbuild/android-arm64': 0.27.0 2517 | '@esbuild/android-x64': 0.27.0 2518 | '@esbuild/darwin-arm64': 0.27.0 2519 | '@esbuild/darwin-x64': 0.27.0 2520 | '@esbuild/freebsd-arm64': 0.27.0 2521 | '@esbuild/freebsd-x64': 0.27.0 2522 | '@esbuild/linux-arm': 0.27.0 2523 | '@esbuild/linux-arm64': 0.27.0 2524 | '@esbuild/linux-ia32': 0.27.0 2525 | '@esbuild/linux-loong64': 0.27.0 2526 | '@esbuild/linux-mips64el': 0.27.0 2527 | '@esbuild/linux-ppc64': 0.27.0 2528 | '@esbuild/linux-riscv64': 0.27.0 2529 | '@esbuild/linux-s390x': 0.27.0 2530 | '@esbuild/linux-x64': 0.27.0 2531 | '@esbuild/netbsd-arm64': 0.27.0 2532 | '@esbuild/netbsd-x64': 0.27.0 2533 | '@esbuild/openbsd-arm64': 0.27.0 2534 | '@esbuild/openbsd-x64': 0.27.0 2535 | '@esbuild/openharmony-arm64': 0.27.0 2536 | '@esbuild/sunos-x64': 0.27.0 2537 | '@esbuild/win32-arm64': 0.27.0 2538 | '@esbuild/win32-ia32': 0.27.0 2539 | '@esbuild/win32-x64': 0.27.0 2540 | 2541 | escalade@3.2.0: {} 2542 | 2543 | escape-string-regexp@2.0.0: {} 2544 | 2545 | esprima@4.0.1: {} 2546 | 2547 | execa@5.1.1: 2548 | dependencies: 2549 | cross-spawn: 7.0.6 2550 | get-stream: 6.0.1 2551 | human-signals: 2.1.0 2552 | is-stream: 2.0.1 2553 | merge-stream: 2.0.0 2554 | npm-run-path: 4.0.1 2555 | onetime: 5.1.2 2556 | signal-exit: 3.0.7 2557 | strip-final-newline: 2.0.0 2558 | 2559 | exit@0.1.2: {} 2560 | 2561 | expect@29.7.0: 2562 | dependencies: 2563 | '@jest/expect-utils': 29.7.0 2564 | jest-get-type: 29.6.3 2565 | jest-matcher-utils: 29.7.0 2566 | jest-message-util: 29.7.0 2567 | jest-util: 29.7.0 2568 | 2569 | fast-json-stable-stringify@2.1.0: {} 2570 | 2571 | fb-watchman@2.0.2: 2572 | dependencies: 2573 | bser: 2.1.1 2574 | 2575 | fdir@6.5.0(picomatch@4.0.3): 2576 | optionalDependencies: 2577 | picomatch: 4.0.3 2578 | 2579 | fill-range@7.1.1: 2580 | dependencies: 2581 | to-regex-range: 5.0.1 2582 | 2583 | find-up@4.1.0: 2584 | dependencies: 2585 | locate-path: 5.0.0 2586 | path-exists: 4.0.0 2587 | 2588 | fix-dts-default-cjs-exports@1.0.1: 2589 | dependencies: 2590 | magic-string: 0.30.21 2591 | mlly: 1.8.0 2592 | rollup: 4.53.3 2593 | 2594 | fs.realpath@1.0.0: {} 2595 | 2596 | fsevents@2.3.3: 2597 | optional: true 2598 | 2599 | function-bind@1.1.2: {} 2600 | 2601 | gensync@1.0.0-beta.2: {} 2602 | 2603 | get-caller-file@2.0.5: {} 2604 | 2605 | get-package-type@0.1.0: {} 2606 | 2607 | get-stream@6.0.1: {} 2608 | 2609 | glob@7.2.3: 2610 | dependencies: 2611 | fs.realpath: 1.0.0 2612 | inflight: 1.0.6 2613 | inherits: 2.0.4 2614 | minimatch: 3.1.2 2615 | once: 1.4.0 2616 | path-is-absolute: 1.0.1 2617 | 2618 | graceful-fs@4.2.11: {} 2619 | 2620 | handlebars@4.7.8: 2621 | dependencies: 2622 | minimist: 1.2.8 2623 | neo-async: 2.6.2 2624 | source-map: 0.6.1 2625 | wordwrap: 1.0.0 2626 | optionalDependencies: 2627 | uglify-js: 3.19.3 2628 | 2629 | has-flag@4.0.0: {} 2630 | 2631 | hasown@2.0.2: 2632 | dependencies: 2633 | function-bind: 1.1.2 2634 | 2635 | html-escaper@2.0.2: {} 2636 | 2637 | human-signals@2.1.0: {} 2638 | 2639 | import-local@3.2.0: 2640 | dependencies: 2641 | pkg-dir: 4.2.0 2642 | resolve-cwd: 3.0.0 2643 | 2644 | imurmurhash@0.1.4: {} 2645 | 2646 | inflight@1.0.6: 2647 | dependencies: 2648 | once: 1.4.0 2649 | wrappy: 1.0.2 2650 | 2651 | inherits@2.0.4: {} 2652 | 2653 | is-arrayish@0.2.1: {} 2654 | 2655 | is-core-module@2.16.1: 2656 | dependencies: 2657 | hasown: 2.0.2 2658 | 2659 | is-fullwidth-code-point@3.0.0: {} 2660 | 2661 | is-generator-fn@2.1.0: {} 2662 | 2663 | is-number@7.0.0: {} 2664 | 2665 | is-stream@2.0.1: {} 2666 | 2667 | isexe@2.0.0: {} 2668 | 2669 | istanbul-lib-coverage@3.2.2: {} 2670 | 2671 | istanbul-lib-instrument@5.2.1: 2672 | dependencies: 2673 | '@babel/core': 7.28.5 2674 | '@babel/parser': 7.28.5 2675 | '@istanbuljs/schema': 0.1.3 2676 | istanbul-lib-coverage: 3.2.2 2677 | semver: 6.3.1 2678 | transitivePeerDependencies: 2679 | - supports-color 2680 | 2681 | istanbul-lib-instrument@6.0.3: 2682 | dependencies: 2683 | '@babel/core': 7.28.5 2684 | '@babel/parser': 7.28.5 2685 | '@istanbuljs/schema': 0.1.3 2686 | istanbul-lib-coverage: 3.2.2 2687 | semver: 7.7.3 2688 | transitivePeerDependencies: 2689 | - supports-color 2690 | 2691 | istanbul-lib-report@3.0.1: 2692 | dependencies: 2693 | istanbul-lib-coverage: 3.2.2 2694 | make-dir: 4.0.0 2695 | supports-color: 7.2.0 2696 | 2697 | istanbul-lib-source-maps@4.0.1: 2698 | dependencies: 2699 | debug: 4.4.3 2700 | istanbul-lib-coverage: 3.2.2 2701 | source-map: 0.6.1 2702 | transitivePeerDependencies: 2703 | - supports-color 2704 | 2705 | istanbul-reports@3.2.0: 2706 | dependencies: 2707 | html-escaper: 2.0.2 2708 | istanbul-lib-report: 3.0.1 2709 | 2710 | jest-changed-files@29.7.0: 2711 | dependencies: 2712 | execa: 5.1.1 2713 | jest-util: 29.7.0 2714 | p-limit: 3.1.0 2715 | 2716 | jest-circus@29.7.0: 2717 | dependencies: 2718 | '@jest/environment': 29.7.0 2719 | '@jest/expect': 29.7.0 2720 | '@jest/test-result': 29.7.0 2721 | '@jest/types': 29.6.3 2722 | '@types/node': 20.19.25 2723 | chalk: 4.1.2 2724 | co: 4.6.0 2725 | dedent: 1.7.0 2726 | is-generator-fn: 2.1.0 2727 | jest-each: 29.7.0 2728 | jest-matcher-utils: 29.7.0 2729 | jest-message-util: 29.7.0 2730 | jest-runtime: 29.7.0 2731 | jest-snapshot: 29.7.0 2732 | jest-util: 29.7.0 2733 | p-limit: 3.1.0 2734 | pretty-format: 29.7.0 2735 | pure-rand: 6.1.0 2736 | slash: 3.0.0 2737 | stack-utils: 2.0.6 2738 | transitivePeerDependencies: 2739 | - babel-plugin-macros 2740 | - supports-color 2741 | 2742 | jest-cli@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)): 2743 | dependencies: 2744 | '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 2745 | '@jest/test-result': 29.7.0 2746 | '@jest/types': 29.6.3 2747 | chalk: 4.1.2 2748 | create-jest: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 2749 | exit: 0.1.2 2750 | import-local: 3.2.0 2751 | jest-config: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 2752 | jest-util: 29.7.0 2753 | jest-validate: 29.7.0 2754 | yargs: 17.7.2 2755 | transitivePeerDependencies: 2756 | - '@types/node' 2757 | - babel-plugin-macros 2758 | - supports-color 2759 | - ts-node 2760 | 2761 | jest-config@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)): 2762 | dependencies: 2763 | '@babel/core': 7.28.5 2764 | '@jest/test-sequencer': 29.7.0 2765 | '@jest/types': 29.6.3 2766 | babel-jest: 29.7.0(@babel/core@7.28.5) 2767 | chalk: 4.1.2 2768 | ci-info: 3.9.0 2769 | deepmerge: 4.3.1 2770 | glob: 7.2.3 2771 | graceful-fs: 4.2.11 2772 | jest-circus: 29.7.0 2773 | jest-environment-node: 29.7.0 2774 | jest-get-type: 29.6.3 2775 | jest-regex-util: 29.6.3 2776 | jest-resolve: 29.7.0 2777 | jest-runner: 29.7.0 2778 | jest-util: 29.7.0 2779 | jest-validate: 29.7.0 2780 | micromatch: 4.0.8 2781 | parse-json: 5.2.0 2782 | pretty-format: 29.7.0 2783 | slash: 3.0.0 2784 | strip-json-comments: 3.1.1 2785 | optionalDependencies: 2786 | '@types/node': 20.19.25 2787 | ts-node: 10.9.2(@types/node@20.19.25)(typescript@5.9.3) 2788 | transitivePeerDependencies: 2789 | - babel-plugin-macros 2790 | - supports-color 2791 | 2792 | jest-diff@29.7.0: 2793 | dependencies: 2794 | chalk: 4.1.2 2795 | diff-sequences: 29.6.3 2796 | jest-get-type: 29.6.3 2797 | pretty-format: 29.7.0 2798 | 2799 | jest-docblock@29.7.0: 2800 | dependencies: 2801 | detect-newline: 3.1.0 2802 | 2803 | jest-each@29.7.0: 2804 | dependencies: 2805 | '@jest/types': 29.6.3 2806 | chalk: 4.1.2 2807 | jest-get-type: 29.6.3 2808 | jest-util: 29.7.0 2809 | pretty-format: 29.7.0 2810 | 2811 | jest-environment-node@29.7.0: 2812 | dependencies: 2813 | '@jest/environment': 29.7.0 2814 | '@jest/fake-timers': 29.7.0 2815 | '@jest/types': 29.6.3 2816 | '@types/node': 20.19.25 2817 | jest-mock: 29.7.0 2818 | jest-util: 29.7.0 2819 | 2820 | jest-get-type@29.6.3: {} 2821 | 2822 | jest-haste-map@29.7.0: 2823 | dependencies: 2824 | '@jest/types': 29.6.3 2825 | '@types/graceful-fs': 4.1.9 2826 | '@types/node': 20.19.25 2827 | anymatch: 3.1.3 2828 | fb-watchman: 2.0.2 2829 | graceful-fs: 4.2.11 2830 | jest-regex-util: 29.6.3 2831 | jest-util: 29.7.0 2832 | jest-worker: 29.7.0 2833 | micromatch: 4.0.8 2834 | walker: 1.0.8 2835 | optionalDependencies: 2836 | fsevents: 2.3.3 2837 | 2838 | jest-leak-detector@29.7.0: 2839 | dependencies: 2840 | jest-get-type: 29.6.3 2841 | pretty-format: 29.7.0 2842 | 2843 | jest-matcher-utils@29.7.0: 2844 | dependencies: 2845 | chalk: 4.1.2 2846 | jest-diff: 29.7.0 2847 | jest-get-type: 29.6.3 2848 | pretty-format: 29.7.0 2849 | 2850 | jest-message-util@29.7.0: 2851 | dependencies: 2852 | '@babel/code-frame': 7.27.1 2853 | '@jest/types': 29.6.3 2854 | '@types/stack-utils': 2.0.3 2855 | chalk: 4.1.2 2856 | graceful-fs: 4.2.11 2857 | micromatch: 4.0.8 2858 | pretty-format: 29.7.0 2859 | slash: 3.0.0 2860 | stack-utils: 2.0.6 2861 | 2862 | jest-mock@29.7.0: 2863 | dependencies: 2864 | '@jest/types': 29.6.3 2865 | '@types/node': 20.19.25 2866 | jest-util: 29.7.0 2867 | 2868 | jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 2869 | optionalDependencies: 2870 | jest-resolve: 29.7.0 2871 | 2872 | jest-regex-util@29.6.3: {} 2873 | 2874 | jest-resolve-dependencies@29.7.0: 2875 | dependencies: 2876 | jest-regex-util: 29.6.3 2877 | jest-snapshot: 29.7.0 2878 | transitivePeerDependencies: 2879 | - supports-color 2880 | 2881 | jest-resolve@29.7.0: 2882 | dependencies: 2883 | chalk: 4.1.2 2884 | graceful-fs: 4.2.11 2885 | jest-haste-map: 29.7.0 2886 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 2887 | jest-util: 29.7.0 2888 | jest-validate: 29.7.0 2889 | resolve: 1.22.11 2890 | resolve.exports: 2.0.3 2891 | slash: 3.0.0 2892 | 2893 | jest-runner@29.7.0: 2894 | dependencies: 2895 | '@jest/console': 29.7.0 2896 | '@jest/environment': 29.7.0 2897 | '@jest/test-result': 29.7.0 2898 | '@jest/transform': 29.7.0 2899 | '@jest/types': 29.6.3 2900 | '@types/node': 20.19.25 2901 | chalk: 4.1.2 2902 | emittery: 0.13.1 2903 | graceful-fs: 4.2.11 2904 | jest-docblock: 29.7.0 2905 | jest-environment-node: 29.7.0 2906 | jest-haste-map: 29.7.0 2907 | jest-leak-detector: 29.7.0 2908 | jest-message-util: 29.7.0 2909 | jest-resolve: 29.7.0 2910 | jest-runtime: 29.7.0 2911 | jest-util: 29.7.0 2912 | jest-watcher: 29.7.0 2913 | jest-worker: 29.7.0 2914 | p-limit: 3.1.0 2915 | source-map-support: 0.5.13 2916 | transitivePeerDependencies: 2917 | - supports-color 2918 | 2919 | jest-runtime@29.7.0: 2920 | dependencies: 2921 | '@jest/environment': 29.7.0 2922 | '@jest/fake-timers': 29.7.0 2923 | '@jest/globals': 29.7.0 2924 | '@jest/source-map': 29.6.3 2925 | '@jest/test-result': 29.7.0 2926 | '@jest/transform': 29.7.0 2927 | '@jest/types': 29.6.3 2928 | '@types/node': 20.19.25 2929 | chalk: 4.1.2 2930 | cjs-module-lexer: 1.4.3 2931 | collect-v8-coverage: 1.0.3 2932 | glob: 7.2.3 2933 | graceful-fs: 4.2.11 2934 | jest-haste-map: 29.7.0 2935 | jest-message-util: 29.7.0 2936 | jest-mock: 29.7.0 2937 | jest-regex-util: 29.6.3 2938 | jest-resolve: 29.7.0 2939 | jest-snapshot: 29.7.0 2940 | jest-util: 29.7.0 2941 | slash: 3.0.0 2942 | strip-bom: 4.0.0 2943 | transitivePeerDependencies: 2944 | - supports-color 2945 | 2946 | jest-snapshot@29.7.0: 2947 | dependencies: 2948 | '@babel/core': 7.28.5 2949 | '@babel/generator': 7.28.5 2950 | '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) 2951 | '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) 2952 | '@babel/types': 7.28.5 2953 | '@jest/expect-utils': 29.7.0 2954 | '@jest/transform': 29.7.0 2955 | '@jest/types': 29.6.3 2956 | babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) 2957 | chalk: 4.1.2 2958 | expect: 29.7.0 2959 | graceful-fs: 4.2.11 2960 | jest-diff: 29.7.0 2961 | jest-get-type: 29.6.3 2962 | jest-matcher-utils: 29.7.0 2963 | jest-message-util: 29.7.0 2964 | jest-util: 29.7.0 2965 | natural-compare: 1.4.0 2966 | pretty-format: 29.7.0 2967 | semver: 7.7.3 2968 | transitivePeerDependencies: 2969 | - supports-color 2970 | 2971 | jest-util@29.7.0: 2972 | dependencies: 2973 | '@jest/types': 29.6.3 2974 | '@types/node': 20.19.25 2975 | chalk: 4.1.2 2976 | ci-info: 3.9.0 2977 | graceful-fs: 4.2.11 2978 | picomatch: 2.3.1 2979 | 2980 | jest-validate@29.7.0: 2981 | dependencies: 2982 | '@jest/types': 29.6.3 2983 | camelcase: 6.3.0 2984 | chalk: 4.1.2 2985 | jest-get-type: 29.6.3 2986 | leven: 3.1.0 2987 | pretty-format: 29.7.0 2988 | 2989 | jest-watcher@29.7.0: 2990 | dependencies: 2991 | '@jest/test-result': 29.7.0 2992 | '@jest/types': 29.6.3 2993 | '@types/node': 20.19.25 2994 | ansi-escapes: 4.3.2 2995 | chalk: 4.1.2 2996 | emittery: 0.13.1 2997 | jest-util: 29.7.0 2998 | string-length: 4.0.2 2999 | 3000 | jest-worker@29.7.0: 3001 | dependencies: 3002 | '@types/node': 20.19.25 3003 | jest-util: 29.7.0 3004 | merge-stream: 2.0.0 3005 | supports-color: 8.1.1 3006 | 3007 | jest@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)): 3008 | dependencies: 3009 | '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 3010 | '@jest/types': 29.6.3 3011 | import-local: 3.2.0 3012 | jest-cli: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 3013 | transitivePeerDependencies: 3014 | - '@types/node' 3015 | - babel-plugin-macros 3016 | - supports-color 3017 | - ts-node 3018 | 3019 | joycon@3.1.1: {} 3020 | 3021 | js-tokens@4.0.0: {} 3022 | 3023 | js-yaml@3.14.2: 3024 | dependencies: 3025 | argparse: 1.0.10 3026 | esprima: 4.0.1 3027 | 3028 | jsesc@3.1.0: {} 3029 | 3030 | json-parse-even-better-errors@2.3.1: {} 3031 | 3032 | json5@2.2.3: {} 3033 | 3034 | kleur@3.0.3: {} 3035 | 3036 | leven@3.1.0: {} 3037 | 3038 | lilconfig@3.1.3: {} 3039 | 3040 | lines-and-columns@1.2.4: {} 3041 | 3042 | load-tsconfig@0.2.5: {} 3043 | 3044 | locate-path@5.0.0: 3045 | dependencies: 3046 | p-locate: 4.1.0 3047 | 3048 | lodash.memoize@4.1.2: {} 3049 | 3050 | lru-cache@5.1.1: 3051 | dependencies: 3052 | yallist: 3.1.1 3053 | 3054 | magic-string@0.30.21: 3055 | dependencies: 3056 | '@jridgewell/sourcemap-codec': 1.5.5 3057 | 3058 | make-dir@4.0.0: 3059 | dependencies: 3060 | semver: 7.7.3 3061 | 3062 | make-error@1.3.6: {} 3063 | 3064 | makeerror@1.0.12: 3065 | dependencies: 3066 | tmpl: 1.0.5 3067 | 3068 | merge-stream@2.0.0: {} 3069 | 3070 | micromatch@4.0.8: 3071 | dependencies: 3072 | braces: 3.0.3 3073 | picomatch: 2.3.1 3074 | 3075 | mimic-fn@2.1.0: {} 3076 | 3077 | minimatch@3.1.2: 3078 | dependencies: 3079 | brace-expansion: 1.1.12 3080 | 3081 | minimist@1.2.8: {} 3082 | 3083 | mlly@1.8.0: 3084 | dependencies: 3085 | acorn: 8.15.0 3086 | pathe: 2.0.3 3087 | pkg-types: 1.3.1 3088 | ufo: 1.6.1 3089 | 3090 | ms@2.1.3: {} 3091 | 3092 | mz@2.7.0: 3093 | dependencies: 3094 | any-promise: 1.3.0 3095 | object-assign: 4.1.1 3096 | thenify-all: 1.6.0 3097 | 3098 | natural-compare@1.4.0: {} 3099 | 3100 | neo-async@2.6.2: {} 3101 | 3102 | node-int64@0.4.0: {} 3103 | 3104 | node-releases@2.0.27: {} 3105 | 3106 | normalize-path@3.0.0: {} 3107 | 3108 | npm-run-path@4.0.1: 3109 | dependencies: 3110 | path-key: 3.1.1 3111 | 3112 | object-assign@4.1.1: {} 3113 | 3114 | once@1.4.0: 3115 | dependencies: 3116 | wrappy: 1.0.2 3117 | 3118 | onetime@5.1.2: 3119 | dependencies: 3120 | mimic-fn: 2.1.0 3121 | 3122 | p-limit@2.3.0: 3123 | dependencies: 3124 | p-try: 2.2.0 3125 | 3126 | p-limit@3.1.0: 3127 | dependencies: 3128 | yocto-queue: 0.1.0 3129 | 3130 | p-locate@4.1.0: 3131 | dependencies: 3132 | p-limit: 2.3.0 3133 | 3134 | p-try@2.2.0: {} 3135 | 3136 | parse-json@5.2.0: 3137 | dependencies: 3138 | '@babel/code-frame': 7.27.1 3139 | error-ex: 1.3.4 3140 | json-parse-even-better-errors: 2.3.1 3141 | lines-and-columns: 1.2.4 3142 | 3143 | path-exists@4.0.0: {} 3144 | 3145 | path-is-absolute@1.0.1: {} 3146 | 3147 | path-key@3.1.1: {} 3148 | 3149 | path-parse@1.0.7: {} 3150 | 3151 | pathe@2.0.3: {} 3152 | 3153 | picocolors@1.1.1: {} 3154 | 3155 | picomatch@2.3.1: {} 3156 | 3157 | picomatch@4.0.3: {} 3158 | 3159 | pirates@4.0.7: {} 3160 | 3161 | pkg-dir@4.2.0: 3162 | dependencies: 3163 | find-up: 4.1.0 3164 | 3165 | pkg-types@1.3.1: 3166 | dependencies: 3167 | confbox: 0.1.8 3168 | mlly: 1.8.0 3169 | pathe: 2.0.3 3170 | 3171 | postcss-load-config@6.0.1: 3172 | dependencies: 3173 | lilconfig: 3.1.3 3174 | 3175 | pretty-format@29.7.0: 3176 | dependencies: 3177 | '@jest/schemas': 29.6.3 3178 | ansi-styles: 5.2.0 3179 | react-is: 18.3.1 3180 | 3181 | prompts@2.4.2: 3182 | dependencies: 3183 | kleur: 3.0.3 3184 | sisteransi: 1.0.5 3185 | 3186 | pure-rand@6.1.0: {} 3187 | 3188 | react-is@18.3.1: {} 3189 | 3190 | readdirp@4.1.2: {} 3191 | 3192 | require-directory@2.1.1: {} 3193 | 3194 | resolve-cwd@3.0.0: 3195 | dependencies: 3196 | resolve-from: 5.0.0 3197 | 3198 | resolve-from@5.0.0: {} 3199 | 3200 | resolve.exports@2.0.3: {} 3201 | 3202 | resolve@1.22.11: 3203 | dependencies: 3204 | is-core-module: 2.16.1 3205 | path-parse: 1.0.7 3206 | supports-preserve-symlinks-flag: 1.0.0 3207 | 3208 | rollup@4.53.3: 3209 | dependencies: 3210 | '@types/estree': 1.0.8 3211 | optionalDependencies: 3212 | '@rollup/rollup-android-arm-eabi': 4.53.3 3213 | '@rollup/rollup-android-arm64': 4.53.3 3214 | '@rollup/rollup-darwin-arm64': 4.53.3 3215 | '@rollup/rollup-darwin-x64': 4.53.3 3216 | '@rollup/rollup-freebsd-arm64': 4.53.3 3217 | '@rollup/rollup-freebsd-x64': 4.53.3 3218 | '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 3219 | '@rollup/rollup-linux-arm-musleabihf': 4.53.3 3220 | '@rollup/rollup-linux-arm64-gnu': 4.53.3 3221 | '@rollup/rollup-linux-arm64-musl': 4.53.3 3222 | '@rollup/rollup-linux-loong64-gnu': 4.53.3 3223 | '@rollup/rollup-linux-ppc64-gnu': 4.53.3 3224 | '@rollup/rollup-linux-riscv64-gnu': 4.53.3 3225 | '@rollup/rollup-linux-riscv64-musl': 4.53.3 3226 | '@rollup/rollup-linux-s390x-gnu': 4.53.3 3227 | '@rollup/rollup-linux-x64-gnu': 4.53.3 3228 | '@rollup/rollup-linux-x64-musl': 4.53.3 3229 | '@rollup/rollup-openharmony-arm64': 4.53.3 3230 | '@rollup/rollup-win32-arm64-msvc': 4.53.3 3231 | '@rollup/rollup-win32-ia32-msvc': 4.53.3 3232 | '@rollup/rollup-win32-x64-gnu': 4.53.3 3233 | '@rollup/rollup-win32-x64-msvc': 4.53.3 3234 | fsevents: 2.3.3 3235 | 3236 | semver@6.3.1: {} 3237 | 3238 | semver@7.7.3: {} 3239 | 3240 | shebang-command@2.0.0: 3241 | dependencies: 3242 | shebang-regex: 3.0.0 3243 | 3244 | shebang-regex@3.0.0: {} 3245 | 3246 | signal-exit@3.0.7: {} 3247 | 3248 | sisteransi@1.0.5: {} 3249 | 3250 | slash@3.0.0: {} 3251 | 3252 | source-map-support@0.5.13: 3253 | dependencies: 3254 | buffer-from: 1.1.2 3255 | source-map: 0.6.1 3256 | 3257 | source-map@0.6.1: {} 3258 | 3259 | source-map@0.7.6: {} 3260 | 3261 | sprintf-js@1.0.3: {} 3262 | 3263 | stack-utils@2.0.6: 3264 | dependencies: 3265 | escape-string-regexp: 2.0.0 3266 | 3267 | string-length@4.0.2: 3268 | dependencies: 3269 | char-regex: 1.0.2 3270 | strip-ansi: 6.0.1 3271 | 3272 | string-width@4.2.3: 3273 | dependencies: 3274 | emoji-regex: 8.0.0 3275 | is-fullwidth-code-point: 3.0.0 3276 | strip-ansi: 6.0.1 3277 | 3278 | strip-ansi@6.0.1: 3279 | dependencies: 3280 | ansi-regex: 5.0.1 3281 | 3282 | strip-bom@4.0.0: {} 3283 | 3284 | strip-final-newline@2.0.0: {} 3285 | 3286 | strip-json-comments@3.1.1: {} 3287 | 3288 | sucrase@3.35.1: 3289 | dependencies: 3290 | '@jridgewell/gen-mapping': 0.3.13 3291 | commander: 4.1.1 3292 | lines-and-columns: 1.2.4 3293 | mz: 2.7.0 3294 | pirates: 4.0.7 3295 | tinyglobby: 0.2.15 3296 | ts-interface-checker: 0.1.13 3297 | 3298 | supports-color@7.2.0: 3299 | dependencies: 3300 | has-flag: 4.0.0 3301 | 3302 | supports-color@8.1.1: 3303 | dependencies: 3304 | has-flag: 4.0.0 3305 | 3306 | supports-preserve-symlinks-flag@1.0.0: {} 3307 | 3308 | test-exclude@6.0.0: 3309 | dependencies: 3310 | '@istanbuljs/schema': 0.1.3 3311 | glob: 7.2.3 3312 | minimatch: 3.1.2 3313 | 3314 | thenify-all@1.6.0: 3315 | dependencies: 3316 | thenify: 3.3.1 3317 | 3318 | thenify@3.3.1: 3319 | dependencies: 3320 | any-promise: 1.3.0 3321 | 3322 | tinyexec@0.3.2: {} 3323 | 3324 | tinyglobby@0.2.15: 3325 | dependencies: 3326 | fdir: 6.5.0(picomatch@4.0.3) 3327 | picomatch: 4.0.3 3328 | 3329 | tmpl@1.0.5: {} 3330 | 3331 | to-regex-range@5.0.1: 3332 | dependencies: 3333 | is-number: 7.0.0 3334 | 3335 | tree-kill@1.2.2: {} 3336 | 3337 | ts-interface-checker@0.1.13: {} 3338 | 3339 | ts-jest@29.4.6(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(esbuild@0.27.0)(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)))(typescript@5.9.3): 3340 | dependencies: 3341 | bs-logger: 0.2.6 3342 | fast-json-stable-stringify: 2.1.0 3343 | handlebars: 4.7.8 3344 | jest: 29.7.0(@types/node@20.19.25)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) 3345 | json5: 2.2.3 3346 | lodash.memoize: 4.1.2 3347 | make-error: 1.3.6 3348 | semver: 7.7.3 3349 | type-fest: 4.41.0 3350 | typescript: 5.9.3 3351 | yargs-parser: 21.1.1 3352 | optionalDependencies: 3353 | '@babel/core': 7.28.5 3354 | '@jest/transform': 29.7.0 3355 | '@jest/types': 29.6.3 3356 | babel-jest: 29.7.0(@babel/core@7.28.5) 3357 | esbuild: 0.27.0 3358 | jest-util: 29.7.0 3359 | 3360 | ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3): 3361 | dependencies: 3362 | '@cspotcode/source-map-support': 0.8.1 3363 | '@tsconfig/node10': 1.0.12 3364 | '@tsconfig/node12': 1.0.11 3365 | '@tsconfig/node14': 1.0.3 3366 | '@tsconfig/node16': 1.0.4 3367 | '@types/node': 20.19.25 3368 | acorn: 8.15.0 3369 | acorn-walk: 8.3.4 3370 | arg: 4.1.3 3371 | create-require: 1.1.1 3372 | diff: 4.0.2 3373 | make-error: 1.3.6 3374 | typescript: 5.9.3 3375 | v8-compile-cache-lib: 3.0.1 3376 | yn: 3.1.1 3377 | 3378 | tsup@8.5.1(typescript@5.9.3): 3379 | dependencies: 3380 | bundle-require: 5.1.0(esbuild@0.27.0) 3381 | cac: 6.7.14 3382 | chokidar: 4.0.3 3383 | consola: 3.4.2 3384 | debug: 4.4.3 3385 | esbuild: 0.27.0 3386 | fix-dts-default-cjs-exports: 1.0.1 3387 | joycon: 3.1.1 3388 | picocolors: 1.1.1 3389 | postcss-load-config: 6.0.1 3390 | resolve-from: 5.0.0 3391 | rollup: 4.53.3 3392 | source-map: 0.7.6 3393 | sucrase: 3.35.1 3394 | tinyexec: 0.3.2 3395 | tinyglobby: 0.2.15 3396 | tree-kill: 1.2.2 3397 | optionalDependencies: 3398 | typescript: 5.9.3 3399 | transitivePeerDependencies: 3400 | - jiti 3401 | - supports-color 3402 | - tsx 3403 | - yaml 3404 | 3405 | type-detect@4.0.8: {} 3406 | 3407 | type-fest@0.21.3: {} 3408 | 3409 | type-fest@4.41.0: {} 3410 | 3411 | typescript@5.9.3: {} 3412 | 3413 | ufo@1.6.1: {} 3414 | 3415 | uglify-js@3.19.3: 3416 | optional: true 3417 | 3418 | undici-types@6.21.0: {} 3419 | 3420 | update-browserslist-db@1.1.4(browserslist@4.28.0): 3421 | dependencies: 3422 | browserslist: 4.28.0 3423 | escalade: 3.2.0 3424 | picocolors: 1.1.1 3425 | 3426 | uuid@10.0.0: {} 3427 | 3428 | v8-compile-cache-lib@3.0.1: {} 3429 | 3430 | v8-to-istanbul@9.3.0: 3431 | dependencies: 3432 | '@jridgewell/trace-mapping': 0.3.31 3433 | '@types/istanbul-lib-coverage': 2.0.6 3434 | convert-source-map: 2.0.0 3435 | 3436 | walker@1.0.8: 3437 | dependencies: 3438 | makeerror: 1.0.12 3439 | 3440 | which@2.0.2: 3441 | dependencies: 3442 | isexe: 2.0.0 3443 | 3444 | wordwrap@1.0.0: {} 3445 | 3446 | wrap-ansi@7.0.0: 3447 | dependencies: 3448 | ansi-styles: 4.3.0 3449 | string-width: 4.2.3 3450 | strip-ansi: 6.0.1 3451 | 3452 | wrappy@1.0.2: {} 3453 | 3454 | write-file-atomic@4.0.2: 3455 | dependencies: 3456 | imurmurhash: 0.1.4 3457 | signal-exit: 3.0.7 3458 | 3459 | y18n@5.0.8: {} 3460 | 3461 | yallist@3.1.1: {} 3462 | 3463 | yargs-parser@21.1.1: {} 3464 | 3465 | yargs@17.7.2: 3466 | dependencies: 3467 | cliui: 8.0.1 3468 | escalade: 3.2.0 3469 | get-caller-file: 2.0.5 3470 | require-directory: 2.1.1 3471 | string-width: 4.2.3 3472 | y18n: 5.0.8 3473 | yargs-parser: 21.1.1 3474 | 3475 | yn@3.1.1: {} 3476 | 3477 | yocto-queue@0.1.0: {} 3478 | --------------------------------------------------------------------------------