├── .husky └── pre-commit ├── .vscode ├── extensions.json └── settings.json ├── .gitignore ├── src ├── index.ts ├── option.test.ts ├── option.doctest.ts └── option.ts ├── vitest.config.mjs ├── package.json ├── .github └── workflows │ ├── ci.yaml │ └── cd.yaml ├── tsconfig.json ├── biome.json ├── Makefile ├── README.md ├── example.test.ts └── pnpm-lock.yaml /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | CI=true make fix type test 2 | git add . 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["biomejs.biome"] 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /coverage 2 | /dist 3 | /node_modules 4 | /.pnpm-store 5 | *.log 6 | **/*.doctest.ts 7 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Option } from "./option.js"; 2 | 3 | export { Option }; 4 | 5 | export const Some = Option.Some; 6 | export const None = Option.None; 7 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "biomejs.biome", 3 | "editor.codeActionsOnSave": { 4 | "source.organizeImports.biome": "explicit" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /vitest.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vitest/config"; 2 | 3 | export default defineConfig({ 4 | test: { 5 | watch: !process.env.CI, 6 | include: ["**/*.{test,doctest}.ts"], 7 | globals: true, 8 | alias: { 9 | "rusty-option": ".", 10 | }, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rusty-option", 3 | "version": "0.0.1", 4 | "repository": "https://github.com/shqld/rusty-option", 5 | "author": "Sho Miyamoto ", 6 | "license": "MIT", 7 | "files": ["src", "dist"], 8 | "type": "module", 9 | "exports": { 10 | ".": { 11 | "import": "./dist/index.js", 12 | "types": "./dist/types/index.d.ts" 13 | } 14 | }, 15 | "devDependencies": { 16 | "@biomejs/biome": "1.8.2", 17 | "@types/node": "latest", 18 | "@vitest/coverage-v8": "^1.6.0", 19 | "esbuild": "^0.21.5", 20 | "husky": "9", 21 | "tsdoc-testify": "^0.0.3", 22 | "typescript": "latest", 23 | "vitest": "^1.6.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | types: [opened, synchronize, reopened] 9 | 10 | jobs: 11 | check-build: 12 | name: check, build 13 | runs-on: ubuntu-latest 14 | timeout-minutes: 15 15 | permissions: 16 | contents: 'read' 17 | id-token: 'write' 18 | 19 | steps: 20 | - uses: actions/checkout@v4 21 | - uses: pnpm/action-setup@v4 22 | with: 23 | version: 9 24 | - uses: actions/setup-node@v4 25 | with: 26 | node-version: '22' 27 | cache: 'pnpm' 28 | - run: make install 29 | - run: make check 30 | - run: make build 31 | -------------------------------------------------------------------------------- /.github/workflows/cd.yaml: -------------------------------------------------------------------------------- 1 | name: CD 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*" 7 | 8 | jobs: 9 | build-publish: 10 | name: check, build 11 | runs-on: ubuntu-latest 12 | timeout-minutes: 15 13 | permissions: 14 | contents: 'read' 15 | id-token: 'write' 16 | 17 | steps: 18 | - uses: actions/checkout@v4 19 | - uses: pnpm/action-setup@v4 20 | with: 21 | version: 9 22 | - uses: actions/setup-node@v4 23 | with: 24 | node-version: '22' 25 | cache: 'pnpm' 26 | registry-url: 'https://registry.npmjs.org' 27 | - run: make install 28 | - run: make build 29 | - run: pnpm publish --provenance --access public --no-git-checks 30 | env: 31 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 32 | 33 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "noErrorTruncation": true, 4 | "noFallthroughCasesInSwitch": true, 5 | "noImplicitAny": true, 6 | "noImplicitOverride": true, 7 | "noImplicitReturns": true, 8 | "noImplicitThis": true, 9 | "noUncheckedIndexedAccess": true, 10 | "noUnusedLocals": false, 11 | "noUnusedParameters": false, 12 | 13 | "strict": true, 14 | "strictBindCallApply": true, 15 | "strictFunctionTypes": true, 16 | "strictNullChecks": true, 17 | "strictPropertyInitialization": true, 18 | 19 | "useUnknownInCatchVariables": true, 20 | 21 | "lib": ["ESNext"], 22 | "target": "ESNext", 23 | 24 | "module": "NodeNext", 25 | "moduleResolution": "NodeNext", 26 | 27 | "declaration": true, 28 | "declarationMap": true, 29 | "sourceMap": true 30 | }, 31 | "exclude": ["dist/**", "**/*.doctest.ts", "**/*.test.ts"] 32 | } 33 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.8.2/schema.json", 3 | "files": { 4 | "ignore": ["**/*.js", "**/*.doctest.ts", "./dist", "./.pnpm-store"] 5 | }, 6 | "organizeImports": { 7 | "enabled": true 8 | }, 9 | "linter": { 10 | "enabled": true, 11 | "rules": { 12 | "recommended": true, 13 | "correctness": { 14 | "all": true, 15 | "noNodejsModules": "off", 16 | "noUnusedVariables": "warn" 17 | }, 18 | "complexity": { 19 | "noUselessConstructor": "off", 20 | "noForEach": "off" 21 | }, 22 | "nursery": { 23 | "all": true, 24 | "useImportRestrictions": "error", 25 | "useImportExtensions": "off" 26 | }, 27 | "suspicious": { 28 | "noShadowRestrictedNames": "off" 29 | }, 30 | "style": { 31 | "all": false 32 | } 33 | } 34 | }, 35 | "formatter": { 36 | "enabled": true 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SHELL := /bin/bash 2 | NODE_MODULES := node_modules 3 | OUT := dist 4 | 5 | .PHONY: setup 6 | setup: install 7 | @$(NODE_MODULES)/.bin/husky 8 | 9 | # --- 10 | 11 | .PHONY: install 12 | install: 13 | @make $(NODE_MODULES) 14 | 15 | .PHONY: build 16 | build: 17 | @make $(OUT) 18 | 19 | $(NODE_MODULES): package.json pnpm-lock.yaml 20 | @pnpm install 21 | 22 | $(OUT): src/** tsconfig.json package.json 23 | @$(NODE_MODULES)/.bin/tsc --outDir $(OUT) 24 | @touch $(OUT) 25 | 26 | # --- 27 | 28 | .PHONY: check 29 | check: lint type test 30 | 31 | .PHONY: lint 32 | lint: 33 | @$(NODE_MODULES)/.bin/biome check . 34 | 35 | .PHONY: fix 36 | fix: 37 | @$(NODE_MODULES)/.bin/biome check . --apply 38 | 39 | .PHONY: type 40 | type: 41 | @$(NODE_MODULES)/.bin/tsc --noEmit 42 | 43 | .PHONY: test 44 | test: ./src/option.doctest.ts 45 | @$(NODE_MODULES)/.bin/vitest 46 | 47 | .PHONY: coverage 48 | coverage: 49 | @$(NODE_MODULES)/.bin/vitest run --coverage --coverage.reporter html 50 | @open coverage/index.html 51 | 52 | .PHONY: clean 53 | clean: 54 | @rm -rf $(OUT) 55 | 56 | # --- 57 | 58 | ./src/option.doctest.ts: ./src/option.ts 59 | @$(NODE_MODULES)/.bin/tsdoc-testify --filepath $< 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rusty-option 2 | 3 | A rusty Option for TypeScript. 4 | 5 | > [!WARNING] 6 | > This is a **Proof of Concept (PoC)**. 7 | > It’s not meant for production: each method is **intentionally verbose** to show how this PoC works. 8 | > Use it to experiment and maybe get inspired to build something even better! 9 | 10 | ## 🚀 Why rusty-option? 11 | 12 | Here’s what makes **rusty-option** worth exploring: 13 | 14 | 1. **if-let in TypeScript** 15 | 16 | Rust’s `if-let` is adapted to TypeScript using `for-of`. This approach enables concise and readable handling of optional values. 17 | 18 | 2. **Minimal Core** 19 | 20 | The core implementation of `Some` and `None` is simple yet functional. Check out the code: 21 | - **Some**: https://github.com/shqld/rusty-option/blob/b331678ecb06da8a40a0bb7e1ae6735974268ac9/src/option.ts#L408-L410 22 | - **None**: https://github.com/shqld/rusty-option/blob/b331678ecb06da8a40a0bb7e1ae6735974268ac9/src/option.ts#L414-L416 23 | 24 | ## 📖 Example 25 | 26 | ```ts 27 | import { Option, Some, None } from "rusty-option"; 28 | 29 | let debug = Option.from(process.env.DEBUG); 30 | 31 | for (let v of debug) { 32 | console.log(`debug on: ${v}`); 33 | } 34 | 35 | let text = process.env.TEXT; 36 | let result = Option.from(text.match(/rusty_(.+)/)); 37 | 38 | for (let [_, somethingRusty] of result) { 39 | console.log(`rusty: ${somethingRusty}`); 40 | } 41 | 42 | let n = Math.random() > 0.5 ? Some("foo") : None; 43 | 44 | n.map((n) => n.length).mapOr(42, (v) => v * 14); // 42; 45 | ``` 46 | 47 | See also: 48 | 49 | - https://github.com/shqld/rusty-option/blob/main/example.test.ts 50 | - https://github.com/shqld/rusty-option/blob/main/src/option.ts 51 | 52 | ### 🔧 Installation 53 | 54 | ```console 55 | $ npm i rusty-option 56 | ``` 57 | -------------------------------------------------------------------------------- /src/option.test.ts: -------------------------------------------------------------------------------- 1 | import { afterEach, describe, expect, test } from "vitest"; 2 | import { None, Option, Some } from "."; 3 | 4 | describe("Option", () => { 5 | test("Some", () => { 6 | expect(Some).toBe(Option.Some); 7 | }); 8 | 9 | test("None", () => { 10 | expect(None).toBe(Option.None); 11 | }); 12 | }); 13 | 14 | describe("for-of", () => { 15 | let called = false; 16 | 17 | afterEach(() => { 18 | called = false; 19 | }); 20 | 21 | test("Some", () => { 22 | for (const v of Some("Some")) { 23 | called = true; 24 | expect(v).toBe("Some"); 25 | } 26 | 27 | expect(called).toBe(true); 28 | }); 29 | 30 | test("None", () => { 31 | for (const v of None) { 32 | called = true; 33 | expect(v).toBe("Some"); 34 | } 35 | 36 | expect(called).toBe(false); 37 | }); 38 | }); 39 | 40 | describe("from", () => { 41 | test("Some", () => { 42 | const option = Option.from("Some"); 43 | expect(option.isSome()).toBe(true); 44 | expect(option.unwrap()).toBe("Some"); 45 | }); 46 | 47 | test("None", () => { 48 | const option = Option.from(null); 49 | expect(option.isNone()).toBe(true); 50 | expect(() => option.unwrap()).toThrow(); 51 | }); 52 | }); 53 | 54 | describe("name", () => { 55 | test("Some", () => { 56 | expect(Some("Some").constructor.name).toBe("Some"); 57 | }); 58 | 59 | test("None", () => { 60 | expect(None.constructor.name).toBe("None"); 61 | }); 62 | }); 63 | 64 | describe("instanceof", () => { 65 | test("Some", () => { 66 | expect(Some("Some") instanceof Option).toBe(true); 67 | 68 | // NOTE: We should use 'for .. of' to check the variant 69 | // of an Option rather than 'if .. instanceof'. 70 | const option = Some("Some"); 71 | expect(option instanceof Some).toBe(false); 72 | }); 73 | 74 | test("None", () => { 75 | expect(None instanceof Option).toBe(true); 76 | 77 | // NOTE: We should not rely on 'if .. instanceof' because 78 | // using None in a non-TypeScript environment by mistake 79 | // will result in a runtime error. 80 | const option = None; 81 | // @ts-expect-error: ts(2359) 82 | expect(option instanceof None).toBe(false); 83 | }); 84 | }); 85 | -------------------------------------------------------------------------------- /example.test.ts: -------------------------------------------------------------------------------- 1 | import * as fs from "node:fs"; 2 | import { afterEach, describe, expect, test, vi } from "vitest"; 3 | import { None, Option, Some } from "./src"; 4 | 5 | let called: boolean = false; 6 | 7 | afterEach(() => { 8 | called = false; 9 | }); 10 | 11 | describe("process.env", () => { 12 | process.env.RUSTY_OPTION = "true"; 13 | 14 | test("Some", () => { 15 | for (let m of Option.from(process.env.RUSTY_OPTION)) { 16 | called = true; 17 | expect(m).toBe("true"); 18 | } 19 | expect(called).toBe(true); 20 | }); 21 | 22 | test("None", () => { 23 | for (let [m] of Option.from(process.env.NON_EXISTENT_VAR)) { 24 | called = true; 25 | expect(m).toBe("true"); 26 | } 27 | expect(called).toBe(false); 28 | }); 29 | }); 30 | 31 | describe("Regexp:exec", () => { 32 | // biome-ignore lint/nursery/useTopLevelRegex: ignore 33 | const RE = /hello/; 34 | 35 | test("Some", () => { 36 | for (let [m] of Option.from(RE.exec("hello"))) { 37 | called = true; 38 | expect(m).toBe("hello"); 39 | } 40 | expect(called).toBe(true); 41 | }); 42 | 43 | test("None", () => { 44 | for (let [m] of Option.from(RE.exec("world"))) { 45 | called = true; 46 | expect(m).toBe("hello"); 47 | } 48 | expect(called).toBe(false); 49 | }); 50 | }); 51 | 52 | describe("readFile", () => { 53 | function readFileSync(path: "./a" | "./b"): Option { 54 | try { 55 | return Some(fs.readFileSync(path, "utf8")); 56 | } catch { 57 | return None; 58 | } 59 | } 60 | 61 | test("readFileSync: Some", () => { 62 | for (let file of readFileSync("./a")) { 63 | called = true; 64 | expect(file).toBe("file content"); 65 | } 66 | expect(called).toBe(true); 67 | }); 68 | 69 | test("readFileSync: None", () => { 70 | for (let file of readFileSync("./b")) { 71 | called = true; 72 | expect(file).toBe("file content"); 73 | } 74 | expect(called).toBe(false); 75 | }); 76 | 77 | async function readFile(path: "./a" | "./b"): Promise> { 78 | try { 79 | return Some(await fs.promises.readFile(path, "utf8")); 80 | } catch { 81 | return None; 82 | } 83 | } 84 | 85 | test("readFile: Some", async () => { 86 | for (let file of await readFile("./a")) { 87 | called = true; 88 | expect(file).toBe("file content"); 89 | } 90 | expect(called).toBe(true); 91 | }); 92 | 93 | test("readFile: Some", async () => { 94 | for (let file of await readFile("./b")) { 95 | called = true; 96 | expect(file).toBe("file content"); 97 | } 98 | expect(called).toBe(false); 99 | }); 100 | 101 | vi.mock("node:fs", () => ({ 102 | readFileSync: vi.fn().mockImplementation((path) => { 103 | if (path === "./a") { 104 | return "file content"; 105 | } else { 106 | throw new Error("file not found"); 107 | } 108 | }), 109 | promises: { 110 | readFile: vi.fn().mockImplementation(async (path) => { 111 | if (path === "./a") { 112 | return "file content"; 113 | } else { 114 | throw new Error("file not found"); 115 | } 116 | }), 117 | }, 118 | })); 119 | }); 120 | -------------------------------------------------------------------------------- /src/option.doctest.ts: -------------------------------------------------------------------------------- 1 | // Code generated by "tsdoc-testify"; DO NOT EDIT. 2 | 3 | import { Some, None, Option } from "rusty-option"; 4 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_0", () => { 5 | let x = Some(2); 6 | assert.equal(x.isSome(), true); 7 | let y = None; 8 | assert.equal(y.isSome(), false); 9 | }); 10 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_1", () => { 11 | let x = Some(2); 12 | assert.equal( 13 | x.isSomeAnd(x => x > 1), 14 | true 15 | ); 16 | let y = Some(0); 17 | assert.equal( 18 | y.isSomeAnd(x => x > 1), 19 | false 20 | ); 21 | let z = None; 22 | assert.equal( 23 | z.isSomeAnd(x => x > 1), 24 | false 25 | ); 26 | }); 27 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_2", () => { 28 | let x = Some(2); 29 | assert.equal(x.isNone(), false); 30 | let y = None; 31 | assert.equal(y.isNone(), true); 32 | }); 33 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_3", () => { 34 | let x = Some("value"); 35 | assert.equal(x.expect("fruits are healthy"), "value"); 36 | let y = None; 37 | assert.throws(() => y.expect("fruits are healthy"), "fruits are healthy"); 38 | }); 39 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_4", () => { 40 | let x = Some("air"); 41 | assert.equal(x.unwrap(), "air"); 42 | let y = None; 43 | assert.throws(() => y.unwrap()); 44 | }); 45 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_5", () => { 46 | assert.equal(Some("car").unwrapOr("bike"), "car"); 47 | assert.equal(None.unwrapOr("bike"), "bike"); 48 | }); 49 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_6", () => { 50 | let k = 10; 51 | assert.equal( 52 | Some(4).unwrapOrElse(() => 2 * k), 53 | 4 54 | ); 55 | assert.equal( 56 | None.unwrapOrElse(() => 2 * k), 57 | 20 58 | ); 59 | }); 60 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_7", () => { 61 | let maybe_some_string = Some("Hello, World!"); 62 | let maybe_some_len = maybe_some_string.map(s => s.length); 63 | assert.deepEqual(maybe_some_len, Some(13)); 64 | let x = None; 65 | assert.equal( 66 | x.map(s => s.length), 67 | None 68 | ); 69 | }); 70 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_8", () => { 71 | let list = [1, 2, 3]; 72 | let x = Option.from(list.at(1)) 73 | .inspect(x => console.log(`got: ${x}`)) 74 | .expect("list should be long enough"); 75 | Option.from(list.at(5)).inspect(x => console.log(`got: ${x}`)); 76 | }); 77 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_9", () => { 78 | let x = Some("foo"); 79 | assert.equal( 80 | x.mapOr(42, v => v.length), 81 | 3 82 | ); 83 | let y = None; 84 | assert.equal( 85 | y.mapOr(42, v => v.length), 86 | 42 87 | ); 88 | }); 89 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_10", () => { 90 | let k = 21; 91 | let x = Some("foo"); 92 | assert.equal( 93 | x.mapOrElse( 94 | () => 2 * k, 95 | v => v.length 96 | ), 97 | 3 98 | ); 99 | let y = None; 100 | assert.equal( 101 | y.mapOrElse( 102 | () => 2 * k, 103 | v => v.length 104 | ), 105 | 42 106 | ); 107 | }); 108 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_11", () => { 109 | { 110 | let x = Some(2); 111 | let y = None; 112 | assert.deepEqual(x.and(y), None); 113 | } 114 | { 115 | let x = None; 116 | let y = Some("foo"); 117 | assert.deepEqual(x.and(y), None); 118 | } 119 | { 120 | let x = Some(2); 121 | let y = Some("foo"); 122 | assert.deepEqual(x.and(y), Some("foo")); 123 | } 124 | { 125 | let x = None; 126 | let y = None; 127 | assert.deepEqual(x.and(y), None); 128 | } 129 | }); 130 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_12", () => { 131 | let arr_2d = [ 132 | ["A0", "A1"], 133 | ["B0", "B1"] 134 | ]; 135 | let item_0_1 = Option.from(arr_2d.at(0)).andThen(row => 136 | Option.from(row.at(1)) 137 | ); 138 | assert.deepEqual(item_0_1, Some("A1")); 139 | let item_2_0 = Option.from(arr_2d.at(2)).andThen(row => 140 | Option.from(row.at(0)) 141 | ); 142 | assert.deepEqual(item_2_0, None); 143 | }); 144 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_13", () => { 145 | function is_even(n: number): boolean { 146 | return n % 2 === 0; 147 | } 148 | assert.deepEqual(None.filter(is_even), None); 149 | assert.deepEqual(Some(3).filter(is_even), None); 150 | assert.deepEqual(Some(4).filter(is_even), Some(4)); 151 | }); 152 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_14", () => { 153 | { 154 | let x = Some(2); 155 | let y = None; 156 | assert.deepEqual(x.or(y), Some(2)); 157 | } 158 | { 159 | let x = None; 160 | let y = Some(100); 161 | assert.deepEqual(x.or(y), Some(100)); 162 | } 163 | { 164 | let x = Some(2); 165 | let y = Some(100); 166 | assert.deepEqual(x.or(y), Some(2)); 167 | } 168 | { 169 | let x = None; 170 | let y = None; 171 | assert.deepEqual(x.or(y), None); 172 | } 173 | }); 174 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_15", () => { 175 | const nobody = () => None; 176 | const vikings = () => Some("vikings"); 177 | assert.deepEqual(Some("barbarians").orElse(vikings), Some("barbarians")); 178 | assert.deepEqual(None.orElse(vikings), Some("vikings")); 179 | assert.deepEqual(None.orElse(nobody), None); 180 | }); 181 | test("/Users/sho/ghq/github.com/shqld/option-result/src/option.ts_16", () => { 182 | { 183 | let x = Some(2); 184 | let y = None; 185 | assert.deepEqual(x.xor(y), Some(2)); 186 | } 187 | { 188 | let x = None; 189 | let y = Some(2); 190 | assert.deepEqual(x.xor(y), Some(2)); 191 | } 192 | { 193 | let x = Some(2); 194 | let y = Some(2); 195 | assert.deepEqual(x.xor(y), None); 196 | } 197 | { 198 | let x = None; 199 | let y = None; 200 | assert.deepEqual(x.xor(y), None); 201 | } 202 | }); 203 | -------------------------------------------------------------------------------- /src/option.ts: -------------------------------------------------------------------------------- 1 | type Nullable = T | null | undefined; 2 | 3 | export abstract class Option implements Iterable { 4 | static Some: (value: T) => Option; 5 | static None: Option; 6 | 7 | static from(value: Nullable): Option { 8 | if (value === null || value === undefined) { 9 | return Option.None; 10 | } 11 | return Option.Some(value); 12 | } 13 | 14 | abstract [Symbol.iterator](): Generator; 15 | 16 | /** 17 | * @example 18 | * ```ts 19 | * import { Some, None } from "rusty-option"; 20 | * 21 | * let x = Some(2); 22 | * assert.equal(x.isSome(), true); 23 | * 24 | * let y = None; 25 | * assert.equal(y.isSome(), false); 26 | * ``` 27 | */ 28 | isSome(): boolean { 29 | for (const _ of this) { 30 | return true; 31 | } 32 | return false; 33 | } 34 | 35 | /** 36 | * @example 37 | * ```ts 38 | * import { Some, None } from "rusty-option"; 39 | * 40 | * let x = Some(2); 41 | * assert.equal(x.isSomeAnd(x => x > 1), true); 42 | * 43 | * let y = Some(0); 44 | * assert.equal(y.isSomeAnd(x => x > 1), false); 45 | * 46 | * let z = None; 47 | * assert.equal(z.isSomeAnd(x => x > 1), false); 48 | * ``` 49 | */ 50 | isSomeAnd(f: (arg: T) => boolean): boolean { 51 | for (const inner of this) { 52 | return f(inner); 53 | } 54 | return false; 55 | } 56 | 57 | /** 58 | * @example 59 | * ```ts 60 | * import { Some, None } from "rusty-option"; 61 | * 62 | * let x = Some(2); 63 | * assert.equal(x.isNone(), false); 64 | * 65 | * let y = None; 66 | * assert.equal(y.isNone(), true); 67 | * ``` 68 | */ 69 | isNone(): boolean { 70 | for (const _ of this) { 71 | return false; 72 | } 73 | return true; 74 | } 75 | 76 | /** 77 | * @example 78 | * ```ts 79 | * import { Some, None } from "rusty-option"; 80 | * 81 | * let x = Some("value"); 82 | * assert.equal(x.expect("fruits are healthy"), "value"); 83 | * 84 | * let y = None; 85 | * assert.throws(() => y.expect("fruits are healthy"), "fruits are healthy"); 86 | * ``` 87 | */ 88 | expect(message: string): T { 89 | for (const inner of this) { 90 | return inner; 91 | } 92 | throw new Error(message); 93 | } 94 | 95 | /** 96 | * @example 97 | * ```ts 98 | * import { Some, None } from "rusty-option"; 99 | * 100 | * let x = Some("air"); 101 | * assert.equal(x.unwrap(), "air"); 102 | * 103 | * let y = None; 104 | * assert.throws(() => y.unwrap()); 105 | * ``` 106 | */ 107 | unwrap(): T { 108 | for (const inner of this) { 109 | return inner; 110 | } 111 | throw new Error("Cannot unwrap None"); 112 | } 113 | 114 | /** 115 | * @example 116 | * ```ts 117 | * import { Some, None } from "rusty-option"; 118 | * 119 | * assert.equal(Some("car").unwrapOr("bike"), "car"); 120 | * assert.equal(None.unwrapOr("bike"), "bike"); 121 | * ``` 122 | */ 123 | unwrapOr(d: T): T { 124 | for (const inner of this) { 125 | return inner; 126 | } 127 | return d; 128 | } 129 | 130 | /** 131 | * @example 132 | * ```ts 133 | * import { Some, None } from "rusty-option"; 134 | * 135 | * let k = 10; 136 | * assert.equal(Some(4).unwrapOrElse(() => 2 * k), 4); 137 | * assert.equal(None.unwrapOrElse(() => 2 * k), 20); 138 | * ``` 139 | */ 140 | unwrapOrElse(f: () => T): T { 141 | for (const inner of this) { 142 | return inner; 143 | } 144 | return f(); 145 | } 146 | 147 | /** 148 | * @example 149 | * ```ts 150 | * import { Some, None } from "rusty-option"; 151 | * 152 | * let maybe_some_string = Some("Hello, World!"); 153 | * let maybe_some_len = maybe_some_string.map(s => s.length); 154 | * assert.deepEqual(maybe_some_len, Some(13)); 155 | * 156 | * let x = None; 157 | * assert.equal(x.map(s => s.length), None); 158 | * ``` 159 | */ 160 | map(f: (arg: T) => U): Option { 161 | for (const inner of this) { 162 | return Option.Some(f(inner)); 163 | } 164 | return Option.None; 165 | } 166 | 167 | /** 168 | * @example 169 | * ```ts 170 | * import { Some, None, Option } from "rusty-option"; 171 | * 172 | * let list = [1, 2, 3]; 173 | * 174 | * // prints "got: 2" 175 | * let x = Option.from(list.at(1)) 176 | * .inspect(x => console.log(`got: ${x}`)) 177 | * .expect("list should be long enough"); 178 | * 179 | * // prints nothing 180 | * Option.from(list.at(5)).inspect(x => console.log(`got: ${x}`)); 181 | * ``` 182 | */ 183 | inspect(f: (arg: T) => void): Option { 184 | for (const inner of this) { 185 | f(inner); 186 | } 187 | return this; 188 | } 189 | 190 | /** 191 | * @example 192 | * ```ts 193 | * import { Some, None } from "rusty-option"; 194 | * 195 | * let x = Some("foo"); 196 | * assert.equal(x.mapOr(42, v => v.length), 3); 197 | * 198 | * let y = None; 199 | * assert.equal(y.mapOr(42, v => v.length), 42); 200 | * ``` 201 | */ 202 | mapOr(d: U, f: (arg: T) => U): U { 203 | for (const inner of this) { 204 | return f(inner); 205 | } 206 | return d; 207 | } 208 | 209 | /** 210 | * @example 211 | * ```ts 212 | * import { Some, None } from "rusty-option"; 213 | * 214 | * let k = 21; 215 | * 216 | * let x = Some("foo"); 217 | * assert.equal(x.mapOrElse(() => 2 * k, v => v.length), 3); 218 | * 219 | * let y = None; 220 | * assert.equal(y.mapOrElse(() => 2 * k, v => v.length), 42); 221 | * ``` 222 | */ 223 | mapOrElse(d: () => U, f: (arg: T) => U): U { 224 | for (const inner of this) { 225 | return f(inner); 226 | } 227 | return d(); 228 | } 229 | 230 | /** 231 | * @example 232 | * ```ts 233 | * import { Some, None } from "rusty-option"; 234 | * 235 | * { 236 | * let x = Some(2); 237 | * let y = None; 238 | * assert.deepEqual(x.and(y), None); 239 | * } 240 | * { 241 | * let x = None; 242 | * let y = Some("foo"); 243 | * assert.deepEqual(x.and(y), None); 244 | * } 245 | * { 246 | * let x = Some(2); 247 | * let y = Some("foo"); 248 | * assert.deepEqual(x.and(y), Some("foo")); 249 | * } 250 | * { 251 | * let x = None; 252 | * let y = None; 253 | * assert.deepEqual(x.and(y), None); 254 | * } 255 | * ``` 256 | */ 257 | and(optb: Option): Option { 258 | for (const _ of this) { 259 | return optb; 260 | } 261 | return Option.None; 262 | } 263 | 264 | /** 265 | * @example 266 | * ```ts 267 | * import { Some, None } from "rusty-option"; 268 | * 269 | * let arr_2d = [["A0", "A1"], ["B0", "B1"]]; 270 | * 271 | * let item_0_1 = Option.from(arr_2d.at(0)).andThen(row => Option.from(row.at(1))); 272 | * assert.deepEqual(item_0_1, Some("A1")); 273 | * 274 | * let item_2_0 = Option.from(arr_2d.at(2)).andThen(row => Option.from(row.at(0))); 275 | * assert.deepEqual(item_2_0, None); 276 | * ``` 277 | */ 278 | andThen(f: (arg: T) => Option): Option { 279 | for (const inner of this) { 280 | return f(inner); 281 | } 282 | return Option.None; 283 | } 284 | 285 | /** 286 | * @example 287 | * ```ts 288 | * import { Some, None } from "rusty-option"; 289 | * 290 | * function is_even(n: number): boolean { 291 | * return n % 2 === 0 292 | * } 293 | * 294 | * assert.deepEqual(None.filter(is_even), None); 295 | * assert.deepEqual(Some(3).filter(is_even), None); 296 | * assert.deepEqual(Some(4).filter(is_even), Some(4)); 297 | * ``` 298 | */ 299 | filter(predicate: (arg: T) => boolean): Option { 300 | for (const inner of this) { 301 | if (predicate(inner)) { 302 | return Option.Some(inner); 303 | } 304 | } 305 | return Option.None; 306 | } 307 | 308 | /** 309 | * @example 310 | * ```ts 311 | * import { Some, None } from "rusty-option"; 312 | * 313 | * { 314 | * let x = Some(2); 315 | * let y = None; 316 | * assert.deepEqual(x.or(y), Some(2)); 317 | * } 318 | * { 319 | * let x = None; 320 | * let y = Some(100); 321 | * assert.deepEqual(x.or(y), Some(100)); 322 | * } 323 | * { 324 | * let x = Some(2); 325 | * let y = Some(100); 326 | * assert.deepEqual(x.or(y), Some(2)); 327 | * } 328 | * { 329 | * let x = None; 330 | * let y = None; 331 | * assert.deepEqual(x.or(y), None); 332 | * } 333 | * ``` 334 | */ 335 | or(optb: Option): Option { 336 | for (const _ of this) { 337 | return this; 338 | } 339 | return optb; 340 | } 341 | 342 | /** 343 | * @example 344 | * ```ts 345 | * import { Some, None } from "rusty-option"; 346 | * 347 | * const nobody = () => None 348 | * const vikings = () => Some("vikings") 349 | * 350 | * assert.deepEqual(Some("barbarians").orElse(vikings), Some("barbarians")); 351 | * assert.deepEqual(None.orElse(vikings), Some("vikings")); 352 | * assert.deepEqual(None.orElse(nobody), None); 353 | * ``` 354 | */ 355 | orElse(f: () => Option): Option { 356 | for (const _ of this) { 357 | return this; 358 | } 359 | return f(); 360 | } 361 | 362 | /** 363 | * @example 364 | * ```ts 365 | * import { Some, None } from "rusty-option"; 366 | * 367 | * { 368 | * let x = Some(2); 369 | * let y = None; 370 | * assert.deepEqual(x.xor(y), Some(2)); 371 | * } 372 | * { 373 | * let x = None; 374 | * let y = Some(2); 375 | * assert.deepEqual(x.xor(y), Some(2)); 376 | * } 377 | * { 378 | * let x = Some(2); 379 | * let y = Some(2); 380 | * assert.deepEqual(x.xor(y), None); 381 | * } 382 | * { 383 | * let x = None; 384 | * let y = None; 385 | * assert.deepEqual(x.xor(y), None); 386 | * } 387 | * ``` 388 | */ 389 | xor(optb: Option): Option { 390 | for (const _ of this) { 391 | for (const _ of optb) { 392 | return Option.None; 393 | } 394 | return this; 395 | } 396 | return optb; 397 | } 398 | } 399 | 400 | class Some extends Option { 401 | private inner: T; 402 | 403 | constructor(inner: T) { 404 | super(); 405 | this.inner = inner; 406 | } 407 | 408 | *[Symbol.iterator](): Generator { 409 | yield this.inner; 410 | } 411 | } 412 | 413 | class None extends Option { 414 | *[Symbol.iterator](): Generator { 415 | // 416 | } 417 | } 418 | 419 | Option.Some = (value) => new Some(value); 420 | // NOTE: Prevent `Some(1) instanceof Some` from returning `true` 421 | Option.Some.prototype = {}; 422 | 423 | // NOTE: Prevents runtime errors when mistakenly used as 424 | // the right-hand side of an `instanceof` check and 425 | // prevent `None instanceof None` from returning `true` 426 | // @ts-expect-error: ts(2332) 427 | Option.None = () => {}; 428 | // @ts-expect-error: ts(2339) 429 | Option.None.prototype = {}; 430 | Object.setPrototypeOf(Option.None, None.prototype); 431 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@biomejs/biome': 12 | specifier: 1.8.2 13 | version: 1.8.2 14 | '@types/node': 15 | specifier: latest 16 | version: 22.10.2 17 | '@vitest/coverage-v8': 18 | specifier: ^1.6.0 19 | version: 1.6.0(vitest@1.6.0(@types/node@22.10.2)(terser@5.36.0)) 20 | esbuild: 21 | specifier: ^0.21.5 22 | version: 0.21.5 23 | husky: 24 | specifier: '9' 25 | version: 9.0.11 26 | tsdoc-testify: 27 | specifier: ^0.0.3 28 | version: 0.0.3 29 | typescript: 30 | specifier: latest 31 | version: 5.7.2 32 | vitest: 33 | specifier: ^1.6.0 34 | version: 1.6.0(@types/node@22.10.2)(terser@5.36.0) 35 | 36 | pkgs/optn: {} 37 | 38 | pkgs/rslt: 39 | dependencies: 40 | optn: 41 | specifier: workspace:* 42 | version: link:../optn 43 | 44 | packages: 45 | 46 | '@ampproject/remapping@2.3.0': 47 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 48 | engines: {node: '>=6.0.0'} 49 | 50 | '@babel/helper-string-parser@7.24.7': 51 | resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} 52 | engines: {node: '>=6.9.0'} 53 | 54 | '@babel/helper-validator-identifier@7.24.7': 55 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 56 | engines: {node: '>=6.9.0'} 57 | 58 | '@babel/parser@7.24.7': 59 | resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} 60 | engines: {node: '>=6.0.0'} 61 | hasBin: true 62 | 63 | '@babel/types@7.24.7': 64 | resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} 65 | engines: {node: '>=6.9.0'} 66 | 67 | '@bcoe/v8-coverage@0.2.3': 68 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 69 | 70 | '@biomejs/biome@1.8.2': 71 | resolution: {integrity: sha512-XafCzLgs0xbH0bCjYKxQ63ig2V86fZQMq1jiy5pyLToWk9aHxA8GAUxyBtklPHtPYZPGEPOYglQHj4jyfUp+Iw==} 72 | engines: {node: '>=14.21.3'} 73 | hasBin: true 74 | 75 | '@biomejs/cli-darwin-arm64@1.8.2': 76 | resolution: {integrity: sha512-l9msLsTcSIAPqMsPIhodQmb50sEfaXPLQ0YW4cdj6INmd8iaOh/V9NceQb2366vACTJgcWDQ2RzlvURek1T68g==} 77 | engines: {node: '>=14.21.3'} 78 | cpu: [arm64] 79 | os: [darwin] 80 | 81 | '@biomejs/cli-darwin-x64@1.8.2': 82 | resolution: {integrity: sha512-Fc4y/FuIxRSiB3TJ+y27vFDE/HJt4QgBuymktsIKEcBZvnKfsRjxvzVDunccRn4xbKgepnp+fn6BoS+ZIg/I3Q==} 83 | engines: {node: '>=14.21.3'} 84 | cpu: [x64] 85 | os: [darwin] 86 | 87 | '@biomejs/cli-linux-arm64-musl@1.8.2': 88 | resolution: {integrity: sha512-WpT41QJJvkZa1eZq0WmD513zkC6AYaMI39HJKmKeiUeX2NZirG+bxv1YRDhqkns1NbBqo3+qrJqBkPmOW+xAVA==} 89 | engines: {node: '>=14.21.3'} 90 | cpu: [arm64] 91 | os: [linux] 92 | 93 | '@biomejs/cli-linux-arm64@1.8.2': 94 | resolution: {integrity: sha512-Q99qwP0qibkZxm2kfnt37OxeIlliDYf5ogi3zX9ij2DULzc+KtPA9Uj0wCljcJofOBsBYaHc7597Q+Bf/251ww==} 95 | engines: {node: '>=14.21.3'} 96 | cpu: [arm64] 97 | os: [linux] 98 | 99 | '@biomejs/cli-linux-x64-musl@1.8.2': 100 | resolution: {integrity: sha512-rk1Wj4d3LIlAlIAS1m2jlyfOjkNbuY1lfwKvWIAeZC51yDMzwhRD7cReE5PE+jqLDtq60PX38hDPeKd7nA1S6A==} 101 | engines: {node: '>=14.21.3'} 102 | cpu: [x64] 103 | os: [linux] 104 | 105 | '@biomejs/cli-linux-x64@1.8.2': 106 | resolution: {integrity: sha512-bjhhUVFchFid2gOjrvBe4fg8BShcpyFQTHuB/QQnfGxs1ddrGP30yq3fHfc6S6MoCcz9Tjd3Zzq1EfWfyy5iHA==} 107 | engines: {node: '>=14.21.3'} 108 | cpu: [x64] 109 | os: [linux] 110 | 111 | '@biomejs/cli-win32-arm64@1.8.2': 112 | resolution: {integrity: sha512-EUbqmCmNWT5xhnxHrCAEBzJB1AnLqxTYoRjlxiCMzGvsy5jQzhCanJ8CT9kNsApW3pfPWBWkoTa7qrwWmwnEGA==} 113 | engines: {node: '>=14.21.3'} 114 | cpu: [arm64] 115 | os: [win32] 116 | 117 | '@biomejs/cli-win32-x64@1.8.2': 118 | resolution: {integrity: sha512-n9H5oRUCk1uNezMgyJh9+hZdtfD8PXLLeq8DUzTycIhl0I1BulIoZ/uxWgRVDFDwAR1JHu1AykISCRFNGnc4iA==} 119 | engines: {node: '>=14.21.3'} 120 | cpu: [x64] 121 | os: [win32] 122 | 123 | '@esbuild/aix-ppc64@0.21.5': 124 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 125 | engines: {node: '>=12'} 126 | cpu: [ppc64] 127 | os: [aix] 128 | 129 | '@esbuild/android-arm64@0.21.5': 130 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 131 | engines: {node: '>=12'} 132 | cpu: [arm64] 133 | os: [android] 134 | 135 | '@esbuild/android-arm@0.21.5': 136 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 137 | engines: {node: '>=12'} 138 | cpu: [arm] 139 | os: [android] 140 | 141 | '@esbuild/android-x64@0.21.5': 142 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 143 | engines: {node: '>=12'} 144 | cpu: [x64] 145 | os: [android] 146 | 147 | '@esbuild/darwin-arm64@0.21.5': 148 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 149 | engines: {node: '>=12'} 150 | cpu: [arm64] 151 | os: [darwin] 152 | 153 | '@esbuild/darwin-x64@0.21.5': 154 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 155 | engines: {node: '>=12'} 156 | cpu: [x64] 157 | os: [darwin] 158 | 159 | '@esbuild/freebsd-arm64@0.21.5': 160 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 161 | engines: {node: '>=12'} 162 | cpu: [arm64] 163 | os: [freebsd] 164 | 165 | '@esbuild/freebsd-x64@0.21.5': 166 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 167 | engines: {node: '>=12'} 168 | cpu: [x64] 169 | os: [freebsd] 170 | 171 | '@esbuild/linux-arm64@0.21.5': 172 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 173 | engines: {node: '>=12'} 174 | cpu: [arm64] 175 | os: [linux] 176 | 177 | '@esbuild/linux-arm@0.21.5': 178 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 179 | engines: {node: '>=12'} 180 | cpu: [arm] 181 | os: [linux] 182 | 183 | '@esbuild/linux-ia32@0.21.5': 184 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 185 | engines: {node: '>=12'} 186 | cpu: [ia32] 187 | os: [linux] 188 | 189 | '@esbuild/linux-loong64@0.21.5': 190 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 191 | engines: {node: '>=12'} 192 | cpu: [loong64] 193 | os: [linux] 194 | 195 | '@esbuild/linux-mips64el@0.21.5': 196 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 197 | engines: {node: '>=12'} 198 | cpu: [mips64el] 199 | os: [linux] 200 | 201 | '@esbuild/linux-ppc64@0.21.5': 202 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 203 | engines: {node: '>=12'} 204 | cpu: [ppc64] 205 | os: [linux] 206 | 207 | '@esbuild/linux-riscv64@0.21.5': 208 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 209 | engines: {node: '>=12'} 210 | cpu: [riscv64] 211 | os: [linux] 212 | 213 | '@esbuild/linux-s390x@0.21.5': 214 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 215 | engines: {node: '>=12'} 216 | cpu: [s390x] 217 | os: [linux] 218 | 219 | '@esbuild/linux-x64@0.21.5': 220 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 221 | engines: {node: '>=12'} 222 | cpu: [x64] 223 | os: [linux] 224 | 225 | '@esbuild/netbsd-x64@0.21.5': 226 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 227 | engines: {node: '>=12'} 228 | cpu: [x64] 229 | os: [netbsd] 230 | 231 | '@esbuild/openbsd-x64@0.21.5': 232 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 233 | engines: {node: '>=12'} 234 | cpu: [x64] 235 | os: [openbsd] 236 | 237 | '@esbuild/sunos-x64@0.21.5': 238 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 239 | engines: {node: '>=12'} 240 | cpu: [x64] 241 | os: [sunos] 242 | 243 | '@esbuild/win32-arm64@0.21.5': 244 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 245 | engines: {node: '>=12'} 246 | cpu: [arm64] 247 | os: [win32] 248 | 249 | '@esbuild/win32-ia32@0.21.5': 250 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 251 | engines: {node: '>=12'} 252 | cpu: [ia32] 253 | os: [win32] 254 | 255 | '@esbuild/win32-x64@0.21.5': 256 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 257 | engines: {node: '>=12'} 258 | cpu: [x64] 259 | os: [win32] 260 | 261 | '@istanbuljs/schema@0.1.3': 262 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 263 | engines: {node: '>=8'} 264 | 265 | '@jest/schemas@29.6.3': 266 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 267 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 268 | 269 | '@jridgewell/gen-mapping@0.3.5': 270 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 271 | engines: {node: '>=6.0.0'} 272 | 273 | '@jridgewell/resolve-uri@3.1.2': 274 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 275 | engines: {node: '>=6.0.0'} 276 | 277 | '@jridgewell/set-array@1.2.1': 278 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 279 | engines: {node: '>=6.0.0'} 280 | 281 | '@jridgewell/source-map@0.3.6': 282 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 283 | 284 | '@jridgewell/sourcemap-codec@1.4.15': 285 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 286 | 287 | '@jridgewell/trace-mapping@0.3.25': 288 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 289 | 290 | '@microsoft/tsdoc@0.12.24': 291 | resolution: {integrity: sha512-Mfmij13RUTmHEMi9vRUhMXD7rnGR2VvxeNYtaGtaJ4redwwjT4UXYJ+nzmVJF7hhd4pn/Fx5sncDKxMVFJSWPg==} 292 | 293 | '@rollup/rollup-android-arm-eabi@4.28.0': 294 | resolution: {integrity: sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==} 295 | cpu: [arm] 296 | os: [android] 297 | 298 | '@rollup/rollup-android-arm64@4.28.0': 299 | resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} 300 | cpu: [arm64] 301 | os: [android] 302 | 303 | '@rollup/rollup-darwin-arm64@4.28.0': 304 | resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} 305 | cpu: [arm64] 306 | os: [darwin] 307 | 308 | '@rollup/rollup-darwin-x64@4.28.0': 309 | resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} 310 | cpu: [x64] 311 | os: [darwin] 312 | 313 | '@rollup/rollup-freebsd-arm64@4.28.0': 314 | resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} 315 | cpu: [arm64] 316 | os: [freebsd] 317 | 318 | '@rollup/rollup-freebsd-x64@4.28.0': 319 | resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} 320 | cpu: [x64] 321 | os: [freebsd] 322 | 323 | '@rollup/rollup-linux-arm-gnueabihf@4.28.0': 324 | resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} 325 | cpu: [arm] 326 | os: [linux] 327 | 328 | '@rollup/rollup-linux-arm-musleabihf@4.28.0': 329 | resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} 330 | cpu: [arm] 331 | os: [linux] 332 | 333 | '@rollup/rollup-linux-arm64-gnu@4.28.0': 334 | resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} 335 | cpu: [arm64] 336 | os: [linux] 337 | 338 | '@rollup/rollup-linux-arm64-musl@4.28.0': 339 | resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} 340 | cpu: [arm64] 341 | os: [linux] 342 | 343 | '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': 344 | resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} 345 | cpu: [ppc64] 346 | os: [linux] 347 | 348 | '@rollup/rollup-linux-riscv64-gnu@4.28.0': 349 | resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} 350 | cpu: [riscv64] 351 | os: [linux] 352 | 353 | '@rollup/rollup-linux-s390x-gnu@4.28.0': 354 | resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} 355 | cpu: [s390x] 356 | os: [linux] 357 | 358 | '@rollup/rollup-linux-x64-gnu@4.28.0': 359 | resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} 360 | cpu: [x64] 361 | os: [linux] 362 | 363 | '@rollup/rollup-linux-x64-musl@4.28.0': 364 | resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} 365 | cpu: [x64] 366 | os: [linux] 367 | 368 | '@rollup/rollup-win32-arm64-msvc@4.28.0': 369 | resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} 370 | cpu: [arm64] 371 | os: [win32] 372 | 373 | '@rollup/rollup-win32-ia32-msvc@4.28.0': 374 | resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} 375 | cpu: [ia32] 376 | os: [win32] 377 | 378 | '@rollup/rollup-win32-x64-msvc@4.28.0': 379 | resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} 380 | cpu: [x64] 381 | os: [win32] 382 | 383 | '@sinclair/typebox@0.27.8': 384 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 385 | 386 | '@types/estree@1.0.6': 387 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 388 | 389 | '@types/node@22.10.2': 390 | resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} 391 | 392 | '@vitest/coverage-v8@1.6.0': 393 | resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} 394 | peerDependencies: 395 | vitest: 1.6.0 396 | 397 | '@vitest/expect@1.6.0': 398 | resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} 399 | 400 | '@vitest/runner@1.6.0': 401 | resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} 402 | 403 | '@vitest/snapshot@1.6.0': 404 | resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} 405 | 406 | '@vitest/spy@1.6.0': 407 | resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} 408 | 409 | '@vitest/utils@1.6.0': 410 | resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} 411 | 412 | acorn-walk@8.3.3: 413 | resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} 414 | engines: {node: '>=0.4.0'} 415 | 416 | acorn@8.12.0: 417 | resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} 418 | engines: {node: '>=0.4.0'} 419 | hasBin: true 420 | 421 | ansi-styles@5.2.0: 422 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 423 | engines: {node: '>=10'} 424 | 425 | assertion-error@1.1.0: 426 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 427 | 428 | balanced-match@1.0.2: 429 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 430 | 431 | brace-expansion@1.1.11: 432 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 433 | 434 | buffer-from@1.1.2: 435 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 436 | 437 | cac@6.7.14: 438 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 439 | engines: {node: '>=8'} 440 | 441 | catacli@0.1.3: 442 | resolution: {integrity: sha512-AJh+asPYMAc56tWtGOjOPXOgo4jwggpzSo58c5xCz3+fJzaznYpJW4eqmjySpP1e7Bn3/NQiA5/5VLkyxjKPmA==} 443 | 444 | chai@4.4.1: 445 | resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} 446 | engines: {node: '>=4'} 447 | 448 | check-error@1.0.3: 449 | resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} 450 | 451 | commander@2.20.3: 452 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 453 | 454 | concat-map@0.0.1: 455 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 456 | 457 | confbox@0.1.7: 458 | resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} 459 | 460 | cross-spawn@7.0.6: 461 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 462 | engines: {node: '>= 8'} 463 | 464 | debug@4.3.5: 465 | resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} 466 | engines: {node: '>=6.0'} 467 | peerDependencies: 468 | supports-color: '*' 469 | peerDependenciesMeta: 470 | supports-color: 471 | optional: true 472 | 473 | deep-eql@4.1.4: 474 | resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} 475 | engines: {node: '>=6'} 476 | 477 | diff-sequences@29.6.3: 478 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 479 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 480 | 481 | esbuild@0.21.5: 482 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 483 | engines: {node: '>=12'} 484 | hasBin: true 485 | 486 | estree-walker@3.0.3: 487 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 488 | 489 | execa@8.0.1: 490 | resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 491 | engines: {node: '>=16.17'} 492 | 493 | fs.realpath@1.0.0: 494 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 495 | 496 | fsevents@2.3.3: 497 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 498 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 499 | os: [darwin] 500 | 501 | get-func-name@2.0.2: 502 | resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 503 | 504 | get-stream@8.0.1: 505 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 506 | engines: {node: '>=16'} 507 | 508 | glob@7.2.3: 509 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 510 | deprecated: Glob versions prior to v9 are no longer supported 511 | 512 | has-flag@4.0.0: 513 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 514 | engines: {node: '>=8'} 515 | 516 | html-escaper@2.0.2: 517 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 518 | 519 | human-signals@5.0.0: 520 | resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 521 | engines: {node: '>=16.17.0'} 522 | 523 | husky@9.0.11: 524 | resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} 525 | engines: {node: '>=18'} 526 | hasBin: true 527 | 528 | inflight@1.0.6: 529 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 530 | 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. 531 | 532 | inherits@2.0.4: 533 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 534 | 535 | is-stream@3.0.0: 536 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 537 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 538 | 539 | isexe@2.0.0: 540 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 541 | 542 | istanbul-lib-coverage@3.2.2: 543 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 544 | engines: {node: '>=8'} 545 | 546 | istanbul-lib-report@3.0.1: 547 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 548 | engines: {node: '>=10'} 549 | 550 | istanbul-lib-source-maps@5.0.4: 551 | resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} 552 | engines: {node: '>=10'} 553 | 554 | istanbul-reports@3.1.7: 555 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 556 | engines: {node: '>=8'} 557 | 558 | js-tokens@9.0.0: 559 | resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} 560 | 561 | local-pkg@0.5.0: 562 | resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} 563 | engines: {node: '>=14'} 564 | 565 | loupe@2.3.7: 566 | resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} 567 | 568 | magic-string@0.30.10: 569 | resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} 570 | 571 | magicast@0.3.4: 572 | resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} 573 | 574 | make-dir@4.0.0: 575 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 576 | engines: {node: '>=10'} 577 | 578 | merge-stream@2.0.0: 579 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 580 | 581 | mimic-fn@4.0.0: 582 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 583 | engines: {node: '>=12'} 584 | 585 | minimatch@3.1.2: 586 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 587 | 588 | mlly@1.7.1: 589 | resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} 590 | 591 | ms@2.1.2: 592 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 593 | 594 | nanoid@3.3.8: 595 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 596 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 597 | hasBin: true 598 | 599 | npm-run-path@5.3.0: 600 | resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 601 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 602 | 603 | once@1.4.0: 604 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 605 | 606 | onetime@6.0.0: 607 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 608 | engines: {node: '>=12'} 609 | 610 | p-limit@5.0.0: 611 | resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} 612 | engines: {node: '>=18'} 613 | 614 | path-is-absolute@1.0.1: 615 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 616 | engines: {node: '>=0.10.0'} 617 | 618 | path-key@3.1.1: 619 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 620 | engines: {node: '>=8'} 621 | 622 | path-key@4.0.0: 623 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 624 | engines: {node: '>=12'} 625 | 626 | pathe@1.1.2: 627 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 628 | 629 | pathval@1.1.1: 630 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 631 | 632 | picocolors@1.0.1: 633 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 634 | 635 | picocolors@1.1.1: 636 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 637 | 638 | pkg-types@1.1.1: 639 | resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} 640 | 641 | postcss@8.4.49: 642 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 643 | engines: {node: ^10 || ^12 || >=14} 644 | 645 | prettier@1.19.1: 646 | resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} 647 | engines: {node: '>=4'} 648 | hasBin: true 649 | 650 | pretty-format@29.7.0: 651 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 652 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 653 | 654 | react-is@18.3.1: 655 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 656 | 657 | rollup@4.28.0: 658 | resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} 659 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 660 | hasBin: true 661 | 662 | semver@7.6.2: 663 | resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} 664 | engines: {node: '>=10'} 665 | hasBin: true 666 | 667 | shebang-command@2.0.0: 668 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 669 | engines: {node: '>=8'} 670 | 671 | shebang-regex@3.0.0: 672 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 673 | engines: {node: '>=8'} 674 | 675 | siginfo@2.0.0: 676 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 677 | 678 | signal-exit@4.1.0: 679 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 680 | engines: {node: '>=14'} 681 | 682 | source-map-js@1.2.0: 683 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 684 | engines: {node: '>=0.10.0'} 685 | 686 | source-map-js@1.2.1: 687 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 688 | engines: {node: '>=0.10.0'} 689 | 690 | source-map-support@0.5.21: 691 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 692 | 693 | source-map@0.6.1: 694 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 695 | engines: {node: '>=0.10.0'} 696 | 697 | stackback@0.0.2: 698 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 699 | 700 | std-env@3.7.0: 701 | resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} 702 | 703 | strip-final-newline@3.0.0: 704 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 705 | engines: {node: '>=12'} 706 | 707 | strip-literal@2.1.0: 708 | resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} 709 | 710 | supports-color@7.2.0: 711 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 712 | engines: {node: '>=8'} 713 | 714 | terser@5.36.0: 715 | resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} 716 | engines: {node: '>=10'} 717 | hasBin: true 718 | 719 | test-exclude@6.0.0: 720 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 721 | engines: {node: '>=8'} 722 | 723 | tinybench@2.8.0: 724 | resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} 725 | 726 | tinypool@0.8.4: 727 | resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} 728 | engines: {node: '>=14.0.0'} 729 | 730 | tinyspy@2.2.1: 731 | resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} 732 | engines: {node: '>=14.0.0'} 733 | 734 | to-fast-properties@2.0.0: 735 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 736 | engines: {node: '>=4'} 737 | 738 | tsdoc-testify@0.0.3: 739 | resolution: {integrity: sha512-rkdgxo/njl1+sgTwXc+MmfhQNSS5GmJv8RL0U21zB56yJTFgsm/Uv6k8eCtrdmxzdMDJfuJejPZS92mlVQLhXw==} 740 | hasBin: true 741 | 742 | tslib@1.14.1: 743 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 744 | 745 | tsutils@3.21.0: 746 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 747 | engines: {node: '>= 6'} 748 | peerDependencies: 749 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 750 | 751 | type-detect@4.0.8: 752 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 753 | engines: {node: '>=4'} 754 | 755 | typescript@3.9.10: 756 | resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} 757 | engines: {node: '>=4.2.0'} 758 | hasBin: true 759 | 760 | typescript@5.7.2: 761 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 762 | engines: {node: '>=14.17'} 763 | hasBin: true 764 | 765 | ufo@1.5.3: 766 | resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} 767 | 768 | undici-types@6.20.0: 769 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 770 | 771 | vite-node@1.6.0: 772 | resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} 773 | engines: {node: ^18.0.0 || >=20.0.0} 774 | hasBin: true 775 | 776 | vite@5.4.11: 777 | resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} 778 | engines: {node: ^18.0.0 || >=20.0.0} 779 | hasBin: true 780 | peerDependencies: 781 | '@types/node': ^18.0.0 || >=20.0.0 782 | less: '*' 783 | lightningcss: ^1.21.0 784 | sass: '*' 785 | sass-embedded: '*' 786 | stylus: '*' 787 | sugarss: '*' 788 | terser: ^5.4.0 789 | peerDependenciesMeta: 790 | '@types/node': 791 | optional: true 792 | less: 793 | optional: true 794 | lightningcss: 795 | optional: true 796 | sass: 797 | optional: true 798 | sass-embedded: 799 | optional: true 800 | stylus: 801 | optional: true 802 | sugarss: 803 | optional: true 804 | terser: 805 | optional: true 806 | 807 | vitest@1.6.0: 808 | resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} 809 | engines: {node: ^18.0.0 || >=20.0.0} 810 | hasBin: true 811 | peerDependencies: 812 | '@edge-runtime/vm': '*' 813 | '@types/node': ^18.0.0 || >=20.0.0 814 | '@vitest/browser': 1.6.0 815 | '@vitest/ui': 1.6.0 816 | happy-dom: '*' 817 | jsdom: '*' 818 | peerDependenciesMeta: 819 | '@edge-runtime/vm': 820 | optional: true 821 | '@types/node': 822 | optional: true 823 | '@vitest/browser': 824 | optional: true 825 | '@vitest/ui': 826 | optional: true 827 | happy-dom: 828 | optional: true 829 | jsdom: 830 | optional: true 831 | 832 | which@2.0.2: 833 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 834 | engines: {node: '>= 8'} 835 | hasBin: true 836 | 837 | why-is-node-running@2.2.2: 838 | resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} 839 | engines: {node: '>=8'} 840 | hasBin: true 841 | 842 | wrappy@1.0.2: 843 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 844 | 845 | yocto-queue@1.0.0: 846 | resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 847 | engines: {node: '>=12.20'} 848 | 849 | snapshots: 850 | 851 | '@ampproject/remapping@2.3.0': 852 | dependencies: 853 | '@jridgewell/gen-mapping': 0.3.5 854 | '@jridgewell/trace-mapping': 0.3.25 855 | 856 | '@babel/helper-string-parser@7.24.7': {} 857 | 858 | '@babel/helper-validator-identifier@7.24.7': {} 859 | 860 | '@babel/parser@7.24.7': 861 | dependencies: 862 | '@babel/types': 7.24.7 863 | 864 | '@babel/types@7.24.7': 865 | dependencies: 866 | '@babel/helper-string-parser': 7.24.7 867 | '@babel/helper-validator-identifier': 7.24.7 868 | to-fast-properties: 2.0.0 869 | 870 | '@bcoe/v8-coverage@0.2.3': {} 871 | 872 | '@biomejs/biome@1.8.2': 873 | optionalDependencies: 874 | '@biomejs/cli-darwin-arm64': 1.8.2 875 | '@biomejs/cli-darwin-x64': 1.8.2 876 | '@biomejs/cli-linux-arm64': 1.8.2 877 | '@biomejs/cli-linux-arm64-musl': 1.8.2 878 | '@biomejs/cli-linux-x64': 1.8.2 879 | '@biomejs/cli-linux-x64-musl': 1.8.2 880 | '@biomejs/cli-win32-arm64': 1.8.2 881 | '@biomejs/cli-win32-x64': 1.8.2 882 | 883 | '@biomejs/cli-darwin-arm64@1.8.2': 884 | optional: true 885 | 886 | '@biomejs/cli-darwin-x64@1.8.2': 887 | optional: true 888 | 889 | '@biomejs/cli-linux-arm64-musl@1.8.2': 890 | optional: true 891 | 892 | '@biomejs/cli-linux-arm64@1.8.2': 893 | optional: true 894 | 895 | '@biomejs/cli-linux-x64-musl@1.8.2': 896 | optional: true 897 | 898 | '@biomejs/cli-linux-x64@1.8.2': 899 | optional: true 900 | 901 | '@biomejs/cli-win32-arm64@1.8.2': 902 | optional: true 903 | 904 | '@biomejs/cli-win32-x64@1.8.2': 905 | optional: true 906 | 907 | '@esbuild/aix-ppc64@0.21.5': 908 | optional: true 909 | 910 | '@esbuild/android-arm64@0.21.5': 911 | optional: true 912 | 913 | '@esbuild/android-arm@0.21.5': 914 | optional: true 915 | 916 | '@esbuild/android-x64@0.21.5': 917 | optional: true 918 | 919 | '@esbuild/darwin-arm64@0.21.5': 920 | optional: true 921 | 922 | '@esbuild/darwin-x64@0.21.5': 923 | optional: true 924 | 925 | '@esbuild/freebsd-arm64@0.21.5': 926 | optional: true 927 | 928 | '@esbuild/freebsd-x64@0.21.5': 929 | optional: true 930 | 931 | '@esbuild/linux-arm64@0.21.5': 932 | optional: true 933 | 934 | '@esbuild/linux-arm@0.21.5': 935 | optional: true 936 | 937 | '@esbuild/linux-ia32@0.21.5': 938 | optional: true 939 | 940 | '@esbuild/linux-loong64@0.21.5': 941 | optional: true 942 | 943 | '@esbuild/linux-mips64el@0.21.5': 944 | optional: true 945 | 946 | '@esbuild/linux-ppc64@0.21.5': 947 | optional: true 948 | 949 | '@esbuild/linux-riscv64@0.21.5': 950 | optional: true 951 | 952 | '@esbuild/linux-s390x@0.21.5': 953 | optional: true 954 | 955 | '@esbuild/linux-x64@0.21.5': 956 | optional: true 957 | 958 | '@esbuild/netbsd-x64@0.21.5': 959 | optional: true 960 | 961 | '@esbuild/openbsd-x64@0.21.5': 962 | optional: true 963 | 964 | '@esbuild/sunos-x64@0.21.5': 965 | optional: true 966 | 967 | '@esbuild/win32-arm64@0.21.5': 968 | optional: true 969 | 970 | '@esbuild/win32-ia32@0.21.5': 971 | optional: true 972 | 973 | '@esbuild/win32-x64@0.21.5': 974 | optional: true 975 | 976 | '@istanbuljs/schema@0.1.3': {} 977 | 978 | '@jest/schemas@29.6.3': 979 | dependencies: 980 | '@sinclair/typebox': 0.27.8 981 | 982 | '@jridgewell/gen-mapping@0.3.5': 983 | dependencies: 984 | '@jridgewell/set-array': 1.2.1 985 | '@jridgewell/sourcemap-codec': 1.4.15 986 | '@jridgewell/trace-mapping': 0.3.25 987 | 988 | '@jridgewell/resolve-uri@3.1.2': {} 989 | 990 | '@jridgewell/set-array@1.2.1': {} 991 | 992 | '@jridgewell/source-map@0.3.6': 993 | dependencies: 994 | '@jridgewell/gen-mapping': 0.3.5 995 | '@jridgewell/trace-mapping': 0.3.25 996 | optional: true 997 | 998 | '@jridgewell/sourcemap-codec@1.4.15': {} 999 | 1000 | '@jridgewell/trace-mapping@0.3.25': 1001 | dependencies: 1002 | '@jridgewell/resolve-uri': 3.1.2 1003 | '@jridgewell/sourcemap-codec': 1.4.15 1004 | 1005 | '@microsoft/tsdoc@0.12.24': {} 1006 | 1007 | '@rollup/rollup-android-arm-eabi@4.28.0': 1008 | optional: true 1009 | 1010 | '@rollup/rollup-android-arm64@4.28.0': 1011 | optional: true 1012 | 1013 | '@rollup/rollup-darwin-arm64@4.28.0': 1014 | optional: true 1015 | 1016 | '@rollup/rollup-darwin-x64@4.28.0': 1017 | optional: true 1018 | 1019 | '@rollup/rollup-freebsd-arm64@4.28.0': 1020 | optional: true 1021 | 1022 | '@rollup/rollup-freebsd-x64@4.28.0': 1023 | optional: true 1024 | 1025 | '@rollup/rollup-linux-arm-gnueabihf@4.28.0': 1026 | optional: true 1027 | 1028 | '@rollup/rollup-linux-arm-musleabihf@4.28.0': 1029 | optional: true 1030 | 1031 | '@rollup/rollup-linux-arm64-gnu@4.28.0': 1032 | optional: true 1033 | 1034 | '@rollup/rollup-linux-arm64-musl@4.28.0': 1035 | optional: true 1036 | 1037 | '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': 1038 | optional: true 1039 | 1040 | '@rollup/rollup-linux-riscv64-gnu@4.28.0': 1041 | optional: true 1042 | 1043 | '@rollup/rollup-linux-s390x-gnu@4.28.0': 1044 | optional: true 1045 | 1046 | '@rollup/rollup-linux-x64-gnu@4.28.0': 1047 | optional: true 1048 | 1049 | '@rollup/rollup-linux-x64-musl@4.28.0': 1050 | optional: true 1051 | 1052 | '@rollup/rollup-win32-arm64-msvc@4.28.0': 1053 | optional: true 1054 | 1055 | '@rollup/rollup-win32-ia32-msvc@4.28.0': 1056 | optional: true 1057 | 1058 | '@rollup/rollup-win32-x64-msvc@4.28.0': 1059 | optional: true 1060 | 1061 | '@sinclair/typebox@0.27.8': {} 1062 | 1063 | '@types/estree@1.0.6': {} 1064 | 1065 | '@types/node@22.10.2': 1066 | dependencies: 1067 | undici-types: 6.20.0 1068 | 1069 | '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@22.10.2)(terser@5.36.0))': 1070 | dependencies: 1071 | '@ampproject/remapping': 2.3.0 1072 | '@bcoe/v8-coverage': 0.2.3 1073 | debug: 4.3.5 1074 | istanbul-lib-coverage: 3.2.2 1075 | istanbul-lib-report: 3.0.1 1076 | istanbul-lib-source-maps: 5.0.4 1077 | istanbul-reports: 3.1.7 1078 | magic-string: 0.30.10 1079 | magicast: 0.3.4 1080 | picocolors: 1.0.1 1081 | std-env: 3.7.0 1082 | strip-literal: 2.1.0 1083 | test-exclude: 6.0.0 1084 | vitest: 1.6.0(@types/node@22.10.2)(terser@5.36.0) 1085 | transitivePeerDependencies: 1086 | - supports-color 1087 | 1088 | '@vitest/expect@1.6.0': 1089 | dependencies: 1090 | '@vitest/spy': 1.6.0 1091 | '@vitest/utils': 1.6.0 1092 | chai: 4.4.1 1093 | 1094 | '@vitest/runner@1.6.0': 1095 | dependencies: 1096 | '@vitest/utils': 1.6.0 1097 | p-limit: 5.0.0 1098 | pathe: 1.1.2 1099 | 1100 | '@vitest/snapshot@1.6.0': 1101 | dependencies: 1102 | magic-string: 0.30.10 1103 | pathe: 1.1.2 1104 | pretty-format: 29.7.0 1105 | 1106 | '@vitest/spy@1.6.0': 1107 | dependencies: 1108 | tinyspy: 2.2.1 1109 | 1110 | '@vitest/utils@1.6.0': 1111 | dependencies: 1112 | diff-sequences: 29.6.3 1113 | estree-walker: 3.0.3 1114 | loupe: 2.3.7 1115 | pretty-format: 29.7.0 1116 | 1117 | acorn-walk@8.3.3: 1118 | dependencies: 1119 | acorn: 8.12.0 1120 | 1121 | acorn@8.12.0: {} 1122 | 1123 | ansi-styles@5.2.0: {} 1124 | 1125 | assertion-error@1.1.0: {} 1126 | 1127 | balanced-match@1.0.2: {} 1128 | 1129 | brace-expansion@1.1.11: 1130 | dependencies: 1131 | balanced-match: 1.0.2 1132 | concat-map: 0.0.1 1133 | 1134 | buffer-from@1.1.2: {} 1135 | 1136 | cac@6.7.14: {} 1137 | 1138 | catacli@0.1.3: 1139 | dependencies: 1140 | source-map-support: 0.5.21 1141 | 1142 | chai@4.4.1: 1143 | dependencies: 1144 | assertion-error: 1.1.0 1145 | check-error: 1.0.3 1146 | deep-eql: 4.1.4 1147 | get-func-name: 2.0.2 1148 | loupe: 2.3.7 1149 | pathval: 1.1.1 1150 | type-detect: 4.0.8 1151 | 1152 | check-error@1.0.3: 1153 | dependencies: 1154 | get-func-name: 2.0.2 1155 | 1156 | commander@2.20.3: 1157 | optional: true 1158 | 1159 | concat-map@0.0.1: {} 1160 | 1161 | confbox@0.1.7: {} 1162 | 1163 | cross-spawn@7.0.6: 1164 | dependencies: 1165 | path-key: 3.1.1 1166 | shebang-command: 2.0.0 1167 | which: 2.0.2 1168 | 1169 | debug@4.3.5: 1170 | dependencies: 1171 | ms: 2.1.2 1172 | 1173 | deep-eql@4.1.4: 1174 | dependencies: 1175 | type-detect: 4.0.8 1176 | 1177 | diff-sequences@29.6.3: {} 1178 | 1179 | esbuild@0.21.5: 1180 | optionalDependencies: 1181 | '@esbuild/aix-ppc64': 0.21.5 1182 | '@esbuild/android-arm': 0.21.5 1183 | '@esbuild/android-arm64': 0.21.5 1184 | '@esbuild/android-x64': 0.21.5 1185 | '@esbuild/darwin-arm64': 0.21.5 1186 | '@esbuild/darwin-x64': 0.21.5 1187 | '@esbuild/freebsd-arm64': 0.21.5 1188 | '@esbuild/freebsd-x64': 0.21.5 1189 | '@esbuild/linux-arm': 0.21.5 1190 | '@esbuild/linux-arm64': 0.21.5 1191 | '@esbuild/linux-ia32': 0.21.5 1192 | '@esbuild/linux-loong64': 0.21.5 1193 | '@esbuild/linux-mips64el': 0.21.5 1194 | '@esbuild/linux-ppc64': 0.21.5 1195 | '@esbuild/linux-riscv64': 0.21.5 1196 | '@esbuild/linux-s390x': 0.21.5 1197 | '@esbuild/linux-x64': 0.21.5 1198 | '@esbuild/netbsd-x64': 0.21.5 1199 | '@esbuild/openbsd-x64': 0.21.5 1200 | '@esbuild/sunos-x64': 0.21.5 1201 | '@esbuild/win32-arm64': 0.21.5 1202 | '@esbuild/win32-ia32': 0.21.5 1203 | '@esbuild/win32-x64': 0.21.5 1204 | 1205 | estree-walker@3.0.3: 1206 | dependencies: 1207 | '@types/estree': 1.0.6 1208 | 1209 | execa@8.0.1: 1210 | dependencies: 1211 | cross-spawn: 7.0.6 1212 | get-stream: 8.0.1 1213 | human-signals: 5.0.0 1214 | is-stream: 3.0.0 1215 | merge-stream: 2.0.0 1216 | npm-run-path: 5.3.0 1217 | onetime: 6.0.0 1218 | signal-exit: 4.1.0 1219 | strip-final-newline: 3.0.0 1220 | 1221 | fs.realpath@1.0.0: {} 1222 | 1223 | fsevents@2.3.3: 1224 | optional: true 1225 | 1226 | get-func-name@2.0.2: {} 1227 | 1228 | get-stream@8.0.1: {} 1229 | 1230 | glob@7.2.3: 1231 | dependencies: 1232 | fs.realpath: 1.0.0 1233 | inflight: 1.0.6 1234 | inherits: 2.0.4 1235 | minimatch: 3.1.2 1236 | once: 1.4.0 1237 | path-is-absolute: 1.0.1 1238 | 1239 | has-flag@4.0.0: {} 1240 | 1241 | html-escaper@2.0.2: {} 1242 | 1243 | human-signals@5.0.0: {} 1244 | 1245 | husky@9.0.11: {} 1246 | 1247 | inflight@1.0.6: 1248 | dependencies: 1249 | once: 1.4.0 1250 | wrappy: 1.0.2 1251 | 1252 | inherits@2.0.4: {} 1253 | 1254 | is-stream@3.0.0: {} 1255 | 1256 | isexe@2.0.0: {} 1257 | 1258 | istanbul-lib-coverage@3.2.2: {} 1259 | 1260 | istanbul-lib-report@3.0.1: 1261 | dependencies: 1262 | istanbul-lib-coverage: 3.2.2 1263 | make-dir: 4.0.0 1264 | supports-color: 7.2.0 1265 | 1266 | istanbul-lib-source-maps@5.0.4: 1267 | dependencies: 1268 | '@jridgewell/trace-mapping': 0.3.25 1269 | debug: 4.3.5 1270 | istanbul-lib-coverage: 3.2.2 1271 | transitivePeerDependencies: 1272 | - supports-color 1273 | 1274 | istanbul-reports@3.1.7: 1275 | dependencies: 1276 | html-escaper: 2.0.2 1277 | istanbul-lib-report: 3.0.1 1278 | 1279 | js-tokens@9.0.0: {} 1280 | 1281 | local-pkg@0.5.0: 1282 | dependencies: 1283 | mlly: 1.7.1 1284 | pkg-types: 1.1.1 1285 | 1286 | loupe@2.3.7: 1287 | dependencies: 1288 | get-func-name: 2.0.2 1289 | 1290 | magic-string@0.30.10: 1291 | dependencies: 1292 | '@jridgewell/sourcemap-codec': 1.4.15 1293 | 1294 | magicast@0.3.4: 1295 | dependencies: 1296 | '@babel/parser': 7.24.7 1297 | '@babel/types': 7.24.7 1298 | source-map-js: 1.2.0 1299 | 1300 | make-dir@4.0.0: 1301 | dependencies: 1302 | semver: 7.6.2 1303 | 1304 | merge-stream@2.0.0: {} 1305 | 1306 | mimic-fn@4.0.0: {} 1307 | 1308 | minimatch@3.1.2: 1309 | dependencies: 1310 | brace-expansion: 1.1.11 1311 | 1312 | mlly@1.7.1: 1313 | dependencies: 1314 | acorn: 8.12.0 1315 | pathe: 1.1.2 1316 | pkg-types: 1.1.1 1317 | ufo: 1.5.3 1318 | 1319 | ms@2.1.2: {} 1320 | 1321 | nanoid@3.3.8: {} 1322 | 1323 | npm-run-path@5.3.0: 1324 | dependencies: 1325 | path-key: 4.0.0 1326 | 1327 | once@1.4.0: 1328 | dependencies: 1329 | wrappy: 1.0.2 1330 | 1331 | onetime@6.0.0: 1332 | dependencies: 1333 | mimic-fn: 4.0.0 1334 | 1335 | p-limit@5.0.0: 1336 | dependencies: 1337 | yocto-queue: 1.0.0 1338 | 1339 | path-is-absolute@1.0.1: {} 1340 | 1341 | path-key@3.1.1: {} 1342 | 1343 | path-key@4.0.0: {} 1344 | 1345 | pathe@1.1.2: {} 1346 | 1347 | pathval@1.1.1: {} 1348 | 1349 | picocolors@1.0.1: {} 1350 | 1351 | picocolors@1.1.1: {} 1352 | 1353 | pkg-types@1.1.1: 1354 | dependencies: 1355 | confbox: 0.1.7 1356 | mlly: 1.7.1 1357 | pathe: 1.1.2 1358 | 1359 | postcss@8.4.49: 1360 | dependencies: 1361 | nanoid: 3.3.8 1362 | picocolors: 1.1.1 1363 | source-map-js: 1.2.1 1364 | 1365 | prettier@1.19.1: {} 1366 | 1367 | pretty-format@29.7.0: 1368 | dependencies: 1369 | '@jest/schemas': 29.6.3 1370 | ansi-styles: 5.2.0 1371 | react-is: 18.3.1 1372 | 1373 | react-is@18.3.1: {} 1374 | 1375 | rollup@4.28.0: 1376 | dependencies: 1377 | '@types/estree': 1.0.6 1378 | optionalDependencies: 1379 | '@rollup/rollup-android-arm-eabi': 4.28.0 1380 | '@rollup/rollup-android-arm64': 4.28.0 1381 | '@rollup/rollup-darwin-arm64': 4.28.0 1382 | '@rollup/rollup-darwin-x64': 4.28.0 1383 | '@rollup/rollup-freebsd-arm64': 4.28.0 1384 | '@rollup/rollup-freebsd-x64': 4.28.0 1385 | '@rollup/rollup-linux-arm-gnueabihf': 4.28.0 1386 | '@rollup/rollup-linux-arm-musleabihf': 4.28.0 1387 | '@rollup/rollup-linux-arm64-gnu': 4.28.0 1388 | '@rollup/rollup-linux-arm64-musl': 4.28.0 1389 | '@rollup/rollup-linux-powerpc64le-gnu': 4.28.0 1390 | '@rollup/rollup-linux-riscv64-gnu': 4.28.0 1391 | '@rollup/rollup-linux-s390x-gnu': 4.28.0 1392 | '@rollup/rollup-linux-x64-gnu': 4.28.0 1393 | '@rollup/rollup-linux-x64-musl': 4.28.0 1394 | '@rollup/rollup-win32-arm64-msvc': 4.28.0 1395 | '@rollup/rollup-win32-ia32-msvc': 4.28.0 1396 | '@rollup/rollup-win32-x64-msvc': 4.28.0 1397 | fsevents: 2.3.3 1398 | 1399 | semver@7.6.2: {} 1400 | 1401 | shebang-command@2.0.0: 1402 | dependencies: 1403 | shebang-regex: 3.0.0 1404 | 1405 | shebang-regex@3.0.0: {} 1406 | 1407 | siginfo@2.0.0: {} 1408 | 1409 | signal-exit@4.1.0: {} 1410 | 1411 | source-map-js@1.2.0: {} 1412 | 1413 | source-map-js@1.2.1: {} 1414 | 1415 | source-map-support@0.5.21: 1416 | dependencies: 1417 | buffer-from: 1.1.2 1418 | source-map: 0.6.1 1419 | 1420 | source-map@0.6.1: {} 1421 | 1422 | stackback@0.0.2: {} 1423 | 1424 | std-env@3.7.0: {} 1425 | 1426 | strip-final-newline@3.0.0: {} 1427 | 1428 | strip-literal@2.1.0: 1429 | dependencies: 1430 | js-tokens: 9.0.0 1431 | 1432 | supports-color@7.2.0: 1433 | dependencies: 1434 | has-flag: 4.0.0 1435 | 1436 | terser@5.36.0: 1437 | dependencies: 1438 | '@jridgewell/source-map': 0.3.6 1439 | acorn: 8.12.0 1440 | commander: 2.20.3 1441 | source-map-support: 0.5.21 1442 | optional: true 1443 | 1444 | test-exclude@6.0.0: 1445 | dependencies: 1446 | '@istanbuljs/schema': 0.1.3 1447 | glob: 7.2.3 1448 | minimatch: 3.1.2 1449 | 1450 | tinybench@2.8.0: {} 1451 | 1452 | tinypool@0.8.4: {} 1453 | 1454 | tinyspy@2.2.1: {} 1455 | 1456 | to-fast-properties@2.0.0: {} 1457 | 1458 | tsdoc-testify@0.0.3: 1459 | dependencies: 1460 | '@microsoft/tsdoc': 0.12.24 1461 | catacli: 0.1.3 1462 | glob: 7.2.3 1463 | prettier: 1.19.1 1464 | source-map-support: 0.5.21 1465 | tsutils: 3.21.0(typescript@3.9.10) 1466 | typescript: 3.9.10 1467 | 1468 | tslib@1.14.1: {} 1469 | 1470 | tsutils@3.21.0(typescript@3.9.10): 1471 | dependencies: 1472 | tslib: 1.14.1 1473 | typescript: 3.9.10 1474 | 1475 | type-detect@4.0.8: {} 1476 | 1477 | typescript@3.9.10: {} 1478 | 1479 | typescript@5.7.2: {} 1480 | 1481 | ufo@1.5.3: {} 1482 | 1483 | undici-types@6.20.0: {} 1484 | 1485 | vite-node@1.6.0(@types/node@22.10.2)(terser@5.36.0): 1486 | dependencies: 1487 | cac: 6.7.14 1488 | debug: 4.3.5 1489 | pathe: 1.1.2 1490 | picocolors: 1.0.1 1491 | vite: 5.4.11(@types/node@22.10.2)(terser@5.36.0) 1492 | transitivePeerDependencies: 1493 | - '@types/node' 1494 | - less 1495 | - lightningcss 1496 | - sass 1497 | - sass-embedded 1498 | - stylus 1499 | - sugarss 1500 | - supports-color 1501 | - terser 1502 | 1503 | vite@5.4.11(@types/node@22.10.2)(terser@5.36.0): 1504 | dependencies: 1505 | esbuild: 0.21.5 1506 | postcss: 8.4.49 1507 | rollup: 4.28.0 1508 | optionalDependencies: 1509 | '@types/node': 22.10.2 1510 | fsevents: 2.3.3 1511 | terser: 5.36.0 1512 | 1513 | vitest@1.6.0(@types/node@22.10.2)(terser@5.36.0): 1514 | dependencies: 1515 | '@vitest/expect': 1.6.0 1516 | '@vitest/runner': 1.6.0 1517 | '@vitest/snapshot': 1.6.0 1518 | '@vitest/spy': 1.6.0 1519 | '@vitest/utils': 1.6.0 1520 | acorn-walk: 8.3.3 1521 | chai: 4.4.1 1522 | debug: 4.3.5 1523 | execa: 8.0.1 1524 | local-pkg: 0.5.0 1525 | magic-string: 0.30.10 1526 | pathe: 1.1.2 1527 | picocolors: 1.0.1 1528 | std-env: 3.7.0 1529 | strip-literal: 2.1.0 1530 | tinybench: 2.8.0 1531 | tinypool: 0.8.4 1532 | vite: 5.4.11(@types/node@22.10.2)(terser@5.36.0) 1533 | vite-node: 1.6.0(@types/node@22.10.2)(terser@5.36.0) 1534 | why-is-node-running: 2.2.2 1535 | optionalDependencies: 1536 | '@types/node': 22.10.2 1537 | transitivePeerDependencies: 1538 | - less 1539 | - lightningcss 1540 | - sass 1541 | - sass-embedded 1542 | - stylus 1543 | - sugarss 1544 | - supports-color 1545 | - terser 1546 | 1547 | which@2.0.2: 1548 | dependencies: 1549 | isexe: 2.0.0 1550 | 1551 | why-is-node-running@2.2.2: 1552 | dependencies: 1553 | siginfo: 2.0.0 1554 | stackback: 0.0.2 1555 | 1556 | wrappy@1.0.2: {} 1557 | 1558 | yocto-queue@1.0.0: {} 1559 | --------------------------------------------------------------------------------