├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .prettierrc.js ├── CHANGELOG.md ├── LICENSE ├── README.md ├── eslint.config.js ├── examples ├── input.txt ├── net-fs.ts └── read-print.ts ├── package.json ├── pnpm-lock.yaml ├── src ├── index.test.ts └── index.ts ├── tsconfig.build.json └── tsconfig.json /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | pull_request: 5 | release: 6 | types: 7 | - created 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | matrix: 13 | node-version: 14 | - '18' 15 | - '20' 16 | - '22' 17 | steps: 18 | - uses: actions/checkout@v4 19 | - uses: pnpm/action-setup@v4 20 | with: 21 | version: 10 22 | - uses: actions/setup-node@v4 23 | with: 24 | node-version: ${{ matrix.node-version }} 25 | cache: 'pnpm' 26 | - run: pnpm install 27 | - run: pnpm format:check 28 | - run: pnpm lint:check 29 | - run: pnpm typecheck 30 | - run: pnpm test 31 | - run: pnpm build 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /lib 2 | 3 | ### https://raw.github.com/github/gitignore/e5323759e387ba347a9d50f8b0ddd16502eb71d4/Node.gitignore 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # Snowpack dependency directory (https://snowpack.dev/) 50 | web_modules/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Optional stylelint cache 62 | .stylelintcache 63 | 64 | # Microbundle cache 65 | .rpt2_cache/ 66 | .rts2_cache_cjs/ 67 | .rts2_cache_es/ 68 | .rts2_cache_umd/ 69 | 70 | # Optional REPL history 71 | .node_repl_history 72 | 73 | # Output of 'npm pack' 74 | *.tgz 75 | 76 | # Yarn Integrity file 77 | .yarn-integrity 78 | 79 | # dotenv environment variable files 80 | .env 81 | .env.development.local 82 | .env.test.local 83 | .env.production.local 84 | .env.local 85 | 86 | # parcel-bundler cache (https://parceljs.org/) 87 | .cache 88 | .parcel-cache 89 | 90 | # Next.js build output 91 | .next 92 | out 93 | 94 | # Nuxt.js build / generate output 95 | .nuxt 96 | dist 97 | 98 | # Gatsby files 99 | .cache/ 100 | # Comment in the public line in if your project uses Gatsby and not Next.js 101 | # https://nextjs.org/blog/next-9-1#public-directory-support 102 | # public 103 | 104 | # vuepress build output 105 | .vuepress/dist 106 | 107 | # vuepress v2.x temp and cache directory 108 | .temp 109 | .cache 110 | 111 | # Docusaurus cache and generated files 112 | .docusaurus 113 | 114 | # Serverless directories 115 | .serverless/ 116 | 117 | # FuseBox cache 118 | .fusebox/ 119 | 120 | # DynamoDB Local files 121 | .dynamodb/ 122 | 123 | # TernJS port file 124 | .tern-port 125 | 126 | # Stores VSCode versions used for testing VSCode extensions 127 | .vscode-test 128 | 129 | # yarn v2 130 | .yarn/cache 131 | .yarn/unplugged 132 | .yarn/build-state.yml 133 | .yarn/install-state.gz 134 | .pnp.* 135 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | export default { 2 | printWidth: 100, 3 | tabWidth: 2, 4 | useTabs: false, 5 | semi: true, 6 | singleQuote: false, 7 | quoteProps: "as-needed", 8 | jsxSingleQuote: false, 9 | trailingComma: "all", 10 | bracketSpacing: true, 11 | bracketSameLine: false, 12 | objectWrap: "preserve", 13 | arrowParens: "always", 14 | endOfLine: "lf", 15 | experimentalTernaries: true, 16 | experimentalOperatorPosition: "start", 17 | }; 18 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.7.1 (2025-05-19) 2 | 3 | - Improve type inference for `handle` and `interpret` 4 | 5 | ## 0.7.0 (2025-02-16) 6 | 7 | - Simplify the `interpret` function 8 | - Fix `onThrow` (the thrid argument of `run`) not to be called twice 9 | - **BREAKING** The previous `interpret` function has been renamed to `handle` 10 | 11 | ## 0.6.2 (2025-02-10) 12 | 13 | - Fix `waitFor` and `runAsync` to return awaited types 14 | 15 | ## 0.6.1 (2025-02-03) 16 | 17 | - Fix handling of errors thrown by effect handlers 18 | 19 | ## 0.6.0 (2025-02-02) 20 | 21 | - Add proper support for `try` / `catch` / `finally` in computations 22 | - Add new features 23 | - `abort`, `runPure`, `waitFor`, and `runAsync` functions 24 | - the optional third argument `onThrow` of `bind` 25 | - `async` effect 26 | - **BREAKING** `run` now takes two functions `onReturn` and `onThrow`, instead of a single function `ret`, to handle errors thrown in the computations 27 | - **BREAKING** Rename `EffectId` to `EffectKey` 28 | - **BREAKING** The arguments of `Eff` type is flipped (`Eff` to `Eff`) for convenience 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (http://opensource.org/licenses/mit-license.php) 2 | 3 | Copyright (c) 2022-2025 Susisu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 9 | of the Software, and to permit persons to whom the Software is furnished to do 10 | so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @susisu/effectful 2 | 3 | [![CI](https://github.com/susisu/effectful/actions/workflows/ci.yml/badge.svg)](https://github.com/susisu/effectful/actions/workflows/ci.yml) 4 | 5 | ``` shell 6 | # npm 7 | npm i @susisu/effectful 8 | # yarn 9 | yarn add @susisu/effectful 10 | # pnpm 11 | pnpm add @susisu/effectful 12 | ``` 13 | 14 | ## Examples 15 | 16 | ### 1. Register effects 17 | 18 | You can register effects by extending `EffectRegistry`. 19 | 20 | ``` ts 21 | declare module "@susisu/effectful" { 22 | interface EffectRegistry { 23 | // Reads a file and returns its content as a string. 24 | read: { 25 | filename: string; 26 | constraint: (x: string) => T; // constrains `T = string` 27 | }; 28 | // Prints a message and returns void. 29 | print: { 30 | message: string; 31 | constraint: (x: void) => T; // constrains `T = void` 32 | }; 33 | } 34 | } 35 | ``` 36 | 37 | ### 2. Define smart constructors for effects 38 | 39 | This is for later convenience. 40 | Here "smart constructors" are functions that construct atomic computations. 41 | `Eff` is the type of compuations that perform effects in `Row` (a union type of effect keys) and return `T`. 42 | 43 | ``` ts 44 | import type { Eff } from "@susisu/effectful"; 45 | import { perform } from "@susisu/effectful"; 46 | 47 | function read(filename: string): Eff { 48 | return perform({ 49 | key: "read", 50 | data: { 51 | filename, 52 | constraint: (x) => x, // `constraint` should be an identity function 53 | }, 54 | }); 55 | } 56 | 57 | function print(message: string): Eff { 58 | return perform({ 59 | key: "print", 60 | data: { 61 | message, 62 | constraint: (x) => x, 63 | }, 64 | }); 65 | } 66 | ``` 67 | 68 | ### 3. Write effectful computations 69 | 70 | You can write effectful computations using generators, like async / await for Promises. 71 | 72 | ``` ts 73 | function* getSize(filename: string): Eff { 74 | // Use `yield*` to perform effects. 75 | const contents = yield* read(filename); 76 | return contents.length; 77 | } 78 | 79 | function* main(): Eff { 80 | // `yield*` can also be used to compose computations. 81 | const size = yield* getSize("./examples/input.txt"); 82 | yield* print(`The file contains ${size} characters.`); 83 | } 84 | ``` 85 | 86 | 87 | ### 4. Write interpreters 88 | 89 | Write interpreters to translate effects to real-world ones. 90 | 91 | ``` ts 92 | import type { Interpreter } from "@susisu/effectful"; 93 | import { waitFor } from "@susisu/effectful"; 94 | import { readFile } from "fs/promises"; 95 | 96 | // Translates `read` effect to `async` effect. 97 | const interpretRead: Interpreter<"read", "async"> = function* (effect) { 98 | const content = yield* waitFor(readFile(effect.data.filename, "utf-8")); 99 | // Here the type `effect` is `Effect<"read", S>`, so the return value must be of type `S`. 100 | // You can use `constraint: (x: string) => S` to convert `content: string` to `S`. 101 | return effect.data.constraint(content); 102 | }; 103 | 104 | // Interprets `print` effect as output to the console. 105 | const interpretPrint: Interpreter<"print", never> = function* (effect) { 106 | console.log(effect.data.message); 107 | return effect.data.constraint(undefined); 108 | }; 109 | ``` 110 | 111 | ### 5. Run computations 112 | 113 | Run our `main` computation with interpreters. 114 | 115 | ``` ts 116 | import { interpret, runAsync } from "@susisu/effectful"; 117 | 118 | runAsync( 119 | interpret(main(), { 120 | read: interpretRead, 121 | print: interpretPrint, 122 | }), 123 | ).catch((error: unknown) => { 124 | console.error(error); 125 | }); 126 | 127 | ``` 128 | 129 | ## License 130 | 131 | [MIT License](http://opensource.org/licenses/mit-license.php) 132 | 133 | ## Author 134 | 135 | Susisu ([GitHub](https://github.com/susisu), [Twitter](https://twitter.com/susisu2413)) 136 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import { config } from "@susisu/eslint-config"; 2 | import vitestPlugin from "@vitest/eslint-plugin"; 3 | import globals from "globals"; 4 | 5 | export default config( 6 | { 7 | tsconfigRootDir: import.meta.dirname, 8 | }, 9 | { 10 | files: ["src/**/*.ts"], 11 | languageOptions: { 12 | globals: { 13 | ...globals.es2023, 14 | }, 15 | }, 16 | }, 17 | { 18 | files: ["src/**/*.test.ts"], 19 | plugins: { 20 | vitest: vitestPlugin, 21 | }, 22 | rules: { 23 | ...vitestPlugin.configs.recommended.rules, 24 | }, 25 | }, 26 | { 27 | files: ["examples/**/*.ts"], 28 | languageOptions: { 29 | globals: { 30 | ...globals.es2023, 31 | ...globals.node, 32 | }, 33 | }, 34 | }, 35 | { 36 | files: ["*.js"], 37 | languageOptions: { 38 | globals: { 39 | ...globals.es2023, 40 | ...globals.node, 41 | }, 42 | }, 43 | }, 44 | ); 45 | -------------------------------------------------------------------------------- /examples/input.txt: -------------------------------------------------------------------------------- 1 | Hello, world! 2 | -------------------------------------------------------------------------------- /examples/net-fs.ts: -------------------------------------------------------------------------------- 1 | import type { Eff, Interpreter } from "../src/index.js"; 2 | import { interpret, perform, runAsync, runPure, waitFor } from "../src/index.js"; 3 | import * as fs from "node:fs/promises"; 4 | 5 | declare module "../src/index.js" { 6 | interface EffectRegistry { 7 | net: { 8 | type: "httpGet"; 9 | url: URL; 10 | c: (x: string) => T; 11 | }; 12 | fs: { 13 | type: "writeFile"; 14 | filename: string; 15 | data: string; 16 | c: (x: void) => T; 17 | }; 18 | } 19 | } 20 | 21 | function httpGet(url: string | URL): Eff { 22 | return perform({ 23 | key: "net", 24 | data: { 25 | type: "httpGet", 26 | url: new URL(url), 27 | c: (x) => x, 28 | }, 29 | }); 30 | } 31 | 32 | function writeFile(filename: string, data: string): Eff { 33 | return perform({ 34 | key: "fs", 35 | data: { 36 | type: "writeFile", 37 | filename, 38 | data, 39 | c: (x) => x, 40 | }, 41 | }); 42 | } 43 | 44 | function* main(): Eff { 45 | const icon = yield* httpGet("https://susisu.ch/icon.svg"); 46 | yield* writeFile("./icon.svg", icon); 47 | } 48 | 49 | // eslint-disable-next-line func-style 50 | const interpretNet: Interpreter<"net", "async"> = function* (effect) { 51 | switch (effect.data.type) { 52 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition 53 | case "httpGet": { 54 | const res = yield* waitFor(fetch(effect.data.url)); 55 | const data = yield* waitFor(res.text()); 56 | return effect.data.c(data); 57 | } 58 | default: 59 | throw new Error(effect.data.type satisfies never); 60 | } 61 | }; 62 | 63 | // eslint-disable-next-line func-style 64 | const interpretFs: Interpreter<"fs", "async"> = function* (effect) { 65 | switch (effect.data.type) { 66 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition 67 | case "writeFile": { 68 | yield* waitFor(fs.writeFile(effect.data.filename, effect.data.data, "utf-8")); 69 | return effect.data.c(undefined); 70 | } 71 | default: 72 | throw new Error(effect.data.type satisfies never); 73 | } 74 | }; 75 | 76 | runAsync( 77 | interpret(main(), { 78 | net: interpretNet, 79 | fs: interpretFs, 80 | }), 81 | ).catch((err: unknown) => { 82 | // eslint-disable-next-line no-console 83 | console.error(err); 84 | }); 85 | 86 | // eslint-disable-next-line func-style 87 | const mockNet: Interpreter<"net", never> = function* (effect) { 88 | switch (effect.data.type) { 89 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition 90 | case "httpGet": { 91 | // eslint-disable-next-line no-console 92 | console.log(`HTTP GET: ${effect.data.url.toString()}`); 93 | return effect.data.c("DUMMY"); 94 | } 95 | default: 96 | throw new Error(effect.data.type satisfies never); 97 | } 98 | }; 99 | 100 | // eslint-disable-next-line func-style 101 | const mockFs: Interpreter<"fs", never> = function* (effect) { 102 | switch (effect.data.type) { 103 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition 104 | case "writeFile": { 105 | // eslint-disable-next-line no-console 106 | console.log(`Write file: ${effect.data.filename}\n${effect.data.data}`); 107 | return effect.data.c(undefined); 108 | } 109 | default: 110 | throw new Error(effect.data.type satisfies never); 111 | } 112 | }; 113 | 114 | runPure( 115 | interpret(main(), { 116 | net: mockNet, 117 | fs: mockFs, 118 | }), 119 | ); 120 | -------------------------------------------------------------------------------- /examples/read-print.ts: -------------------------------------------------------------------------------- 1 | // ### 1. Register effects 2 | 3 | // You can register effects by extending `EffectRegistry`. 4 | 5 | declare module "../src/index.js" { 6 | interface EffectRegistry { 7 | // Reads a file and returns its content as a string. 8 | read: { 9 | filename: string; 10 | constraint: (x: string) => T; // constrains `T = string` 11 | }; 12 | // Prints a message and returns void. 13 | print: { 14 | message: string; 15 | constraint: (x: void) => T; // constrains `T = void` 16 | }; 17 | } 18 | } 19 | 20 | // ### 2. Define smart constructors for effects 21 | 22 | // This is for later convenience. 23 | // Here "smart constructors" are functions that construct atomic computations. 24 | // `Eff` is the type of compuations that perform effects in `Row` (a union type of effect keys) and return `T`. 25 | 26 | import type { Eff } from "../src/index.js"; 27 | import { perform } from "../src/index.js"; 28 | 29 | function read(filename: string): Eff { 30 | return perform({ 31 | key: "read", 32 | data: { 33 | filename, 34 | constraint: (x) => x, // `constraint` should be an identity function 35 | }, 36 | }); 37 | } 38 | 39 | function print(message: string): Eff { 40 | return perform({ 41 | key: "print", 42 | data: { 43 | message, 44 | constraint: (x) => x, 45 | }, 46 | }); 47 | } 48 | 49 | // ### 3. Write effectful computations 50 | 51 | // You can write effectful computations using generators, like async / await for Promises. 52 | 53 | function* getSize(filename: string): Eff { 54 | // Use `yield*` to perform effects. 55 | const contents = yield* read(filename); 56 | return contents.length; 57 | } 58 | 59 | function* main(): Eff { 60 | // `yield*` can also be used to compose computations. 61 | const size = yield* getSize("./examples/input.txt"); 62 | yield* print(`The file contains ${size} characters.`); 63 | } 64 | 65 | // ### 4. Write interpreters 66 | 67 | // Write interpreters to translate effects to real-world ones. 68 | 69 | import type { Interpreter } from "../src/index.js"; 70 | import { waitFor } from "../src/index.js"; 71 | import { readFile } from "fs/promises"; 72 | 73 | // Translates `read` effect to `async` effect. 74 | // eslint-disable-next-line func-style 75 | const interpretRead: Interpreter<"read", "async"> = function* (effect) { 76 | const content = yield* waitFor(readFile(effect.data.filename, "utf-8")); 77 | // Here the type `effect` is `Effect<"read", S>`, so the return value must be of type `S`. 78 | // You can use `constraint: (x: string) => S` to convert `content: string` to `S`. 79 | return effect.data.constraint(content); 80 | }; 81 | 82 | // Interprets `print` effect as output to the console. 83 | // eslint-disable-next-line func-style 84 | const interpretPrint: Interpreter<"print", never> = function* (effect) { 85 | // eslint-disable-next-line no-console 86 | console.log(effect.data.message); 87 | return effect.data.constraint(undefined); 88 | }; 89 | 90 | // ### 5. Run computations 91 | 92 | // Run our `main` computation with interpreters. 93 | 94 | import { interpret, runAsync } from "../src/index.js"; 95 | 96 | runAsync( 97 | interpret(main(), { 98 | read: interpretRead, 99 | print: interpretPrint, 100 | }), 101 | ).catch((error: unknown) => { 102 | // eslint-disable-next-line no-console 103 | console.error(error); 104 | }); 105 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@susisu/effectful", 3 | "version": "0.7.1", 4 | "description": "Algebraic effects and handlers for TypeScript", 5 | "repository": "https://github.com/susisu/effectful.git", 6 | "author": "Susisu ", 7 | "license": "MIT", 8 | "type": "module", 9 | "sideEffects": false, 10 | "files": [ 11 | "lib", 12 | "src", 13 | "!src/**/*.{test,spec}.{ts,tsx}", 14 | "!src/**/__tests__" 15 | ], 16 | "main": "./lib/index.js", 17 | "types": "./lib/index.d.ts", 18 | "exports": { 19 | ".": { 20 | "import": { 21 | "types": "./lib/index.d.ts", 22 | "default": "./lib/index.js" 23 | } 24 | } 25 | }, 26 | "scripts": { 27 | "format": "prettier --write '*.js' src", 28 | "format:check": "prettier --check '*.js' src", 29 | "lint": "eslint --fix '*.js' src", 30 | "lint:check": "eslint '*.js' src", 31 | "typecheck": "tsc -p tsconfig.json --noEmit", 32 | "test": "vitest run --coverage", 33 | "test:dev": "vitest dev --coverage.enabled --coverage.reporter=text", 34 | "build": "tsc --build tsconfig.build.json", 35 | "clean": "run-s clean:tsc clean:rm", 36 | "clean:tsc": "tsc --build tsconfig.build.json --clean", 37 | "clean:rm": "rimraf lib", 38 | "prepublishOnly": "run-s clean format:check lint:check typecheck test build" 39 | }, 40 | "devDependencies": { 41 | "@susisu/eslint-config": "^0.0.97", 42 | "@types/node": "^22.15.18", 43 | "@vitest/coverage-v8": "^3.1.3", 44 | "@vitest/eslint-plugin": "^1.1.44", 45 | "eslint": "^9.26.0", 46 | "globals": "^16.1.0", 47 | "npm-run-all2": "^8.0.1", 48 | "prettier": "^3.5.3", 49 | "rimraf": "^6.0.1", 50 | "tsx": "^4.19.4", 51 | "typescript": "~5.8.3", 52 | "vitest": "^3.1.3" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@susisu/eslint-config': 12 | specifier: ^0.0.97 13 | version: 0.0.97(eslint@9.26.0)(typescript@5.8.3) 14 | '@types/node': 15 | specifier: ^22.15.18 16 | version: 22.15.18 17 | '@vitest/coverage-v8': 18 | specifier: ^3.1.3 19 | version: 3.1.3(vitest@3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0)) 20 | '@vitest/eslint-plugin': 21 | specifier: ^1.1.44 22 | version: 1.1.44(@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0)) 23 | eslint: 24 | specifier: ^9.26.0 25 | version: 9.26.0 26 | globals: 27 | specifier: ^16.1.0 28 | version: 16.1.0 29 | npm-run-all2: 30 | specifier: ^8.0.1 31 | version: 8.0.1 32 | prettier: 33 | specifier: ^3.5.3 34 | version: 3.5.3 35 | rimraf: 36 | specifier: ^6.0.1 37 | version: 6.0.1 38 | tsx: 39 | specifier: ^4.19.4 40 | version: 4.19.4 41 | typescript: 42 | specifier: ~5.8.3 43 | version: 5.8.3 44 | vitest: 45 | specifier: ^3.1.3 46 | version: 3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0) 47 | 48 | packages: 49 | 50 | '@ampproject/remapping@2.3.0': 51 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 52 | engines: {node: '>=6.0.0'} 53 | 54 | '@babel/helper-string-parser@7.27.1': 55 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 56 | engines: {node: '>=6.9.0'} 57 | 58 | '@babel/helper-validator-identifier@7.27.1': 59 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 60 | engines: {node: '>=6.9.0'} 61 | 62 | '@babel/parser@7.27.2': 63 | resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} 64 | engines: {node: '>=6.0.0'} 65 | hasBin: true 66 | 67 | '@babel/types@7.27.1': 68 | resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} 69 | engines: {node: '>=6.9.0'} 70 | 71 | '@bcoe/v8-coverage@1.0.2': 72 | resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} 73 | engines: {node: '>=18'} 74 | 75 | '@esbuild/aix-ppc64@0.25.4': 76 | resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} 77 | engines: {node: '>=18'} 78 | cpu: [ppc64] 79 | os: [aix] 80 | 81 | '@esbuild/android-arm64@0.25.4': 82 | resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} 83 | engines: {node: '>=18'} 84 | cpu: [arm64] 85 | os: [android] 86 | 87 | '@esbuild/android-arm@0.25.4': 88 | resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} 89 | engines: {node: '>=18'} 90 | cpu: [arm] 91 | os: [android] 92 | 93 | '@esbuild/android-x64@0.25.4': 94 | resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} 95 | engines: {node: '>=18'} 96 | cpu: [x64] 97 | os: [android] 98 | 99 | '@esbuild/darwin-arm64@0.25.4': 100 | resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} 101 | engines: {node: '>=18'} 102 | cpu: [arm64] 103 | os: [darwin] 104 | 105 | '@esbuild/darwin-x64@0.25.4': 106 | resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} 107 | engines: {node: '>=18'} 108 | cpu: [x64] 109 | os: [darwin] 110 | 111 | '@esbuild/freebsd-arm64@0.25.4': 112 | resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} 113 | engines: {node: '>=18'} 114 | cpu: [arm64] 115 | os: [freebsd] 116 | 117 | '@esbuild/freebsd-x64@0.25.4': 118 | resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} 119 | engines: {node: '>=18'} 120 | cpu: [x64] 121 | os: [freebsd] 122 | 123 | '@esbuild/linux-arm64@0.25.4': 124 | resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} 125 | engines: {node: '>=18'} 126 | cpu: [arm64] 127 | os: [linux] 128 | 129 | '@esbuild/linux-arm@0.25.4': 130 | resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} 131 | engines: {node: '>=18'} 132 | cpu: [arm] 133 | os: [linux] 134 | 135 | '@esbuild/linux-ia32@0.25.4': 136 | resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} 137 | engines: {node: '>=18'} 138 | cpu: [ia32] 139 | os: [linux] 140 | 141 | '@esbuild/linux-loong64@0.25.4': 142 | resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} 143 | engines: {node: '>=18'} 144 | cpu: [loong64] 145 | os: [linux] 146 | 147 | '@esbuild/linux-mips64el@0.25.4': 148 | resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} 149 | engines: {node: '>=18'} 150 | cpu: [mips64el] 151 | os: [linux] 152 | 153 | '@esbuild/linux-ppc64@0.25.4': 154 | resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} 155 | engines: {node: '>=18'} 156 | cpu: [ppc64] 157 | os: [linux] 158 | 159 | '@esbuild/linux-riscv64@0.25.4': 160 | resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} 161 | engines: {node: '>=18'} 162 | cpu: [riscv64] 163 | os: [linux] 164 | 165 | '@esbuild/linux-s390x@0.25.4': 166 | resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} 167 | engines: {node: '>=18'} 168 | cpu: [s390x] 169 | os: [linux] 170 | 171 | '@esbuild/linux-x64@0.25.4': 172 | resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} 173 | engines: {node: '>=18'} 174 | cpu: [x64] 175 | os: [linux] 176 | 177 | '@esbuild/netbsd-arm64@0.25.4': 178 | resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} 179 | engines: {node: '>=18'} 180 | cpu: [arm64] 181 | os: [netbsd] 182 | 183 | '@esbuild/netbsd-x64@0.25.4': 184 | resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} 185 | engines: {node: '>=18'} 186 | cpu: [x64] 187 | os: [netbsd] 188 | 189 | '@esbuild/openbsd-arm64@0.25.4': 190 | resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} 191 | engines: {node: '>=18'} 192 | cpu: [arm64] 193 | os: [openbsd] 194 | 195 | '@esbuild/openbsd-x64@0.25.4': 196 | resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} 197 | engines: {node: '>=18'} 198 | cpu: [x64] 199 | os: [openbsd] 200 | 201 | '@esbuild/sunos-x64@0.25.4': 202 | resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} 203 | engines: {node: '>=18'} 204 | cpu: [x64] 205 | os: [sunos] 206 | 207 | '@esbuild/win32-arm64@0.25.4': 208 | resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} 209 | engines: {node: '>=18'} 210 | cpu: [arm64] 211 | os: [win32] 212 | 213 | '@esbuild/win32-ia32@0.25.4': 214 | resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} 215 | engines: {node: '>=18'} 216 | cpu: [ia32] 217 | os: [win32] 218 | 219 | '@esbuild/win32-x64@0.25.4': 220 | resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} 221 | engines: {node: '>=18'} 222 | cpu: [x64] 223 | os: [win32] 224 | 225 | '@eslint-community/eslint-utils@4.7.0': 226 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 227 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 228 | peerDependencies: 229 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 230 | 231 | '@eslint-community/regexpp@4.12.1': 232 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 233 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 234 | 235 | '@eslint/config-array@0.20.0': 236 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 237 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 238 | 239 | '@eslint/config-helpers@0.2.2': 240 | resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} 241 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 242 | 243 | '@eslint/core@0.13.0': 244 | resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} 245 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 246 | 247 | '@eslint/eslintrc@3.3.1': 248 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 249 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 250 | 251 | '@eslint/js@9.26.0': 252 | resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} 253 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 254 | 255 | '@eslint/object-schema@2.1.6': 256 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 257 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 258 | 259 | '@eslint/plugin-kit@0.2.8': 260 | resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} 261 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 262 | 263 | '@humanfs/core@0.19.1': 264 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 265 | engines: {node: '>=18.18.0'} 266 | 267 | '@humanfs/node@0.16.6': 268 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 269 | engines: {node: '>=18.18.0'} 270 | 271 | '@humanwhocodes/module-importer@1.0.1': 272 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 273 | engines: {node: '>=12.22'} 274 | 275 | '@humanwhocodes/retry@0.3.1': 276 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 277 | engines: {node: '>=18.18'} 278 | 279 | '@humanwhocodes/retry@0.4.3': 280 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 281 | engines: {node: '>=18.18'} 282 | 283 | '@isaacs/cliui@8.0.2': 284 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 285 | engines: {node: '>=12'} 286 | 287 | '@istanbuljs/schema@0.1.3': 288 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 289 | engines: {node: '>=8'} 290 | 291 | '@jridgewell/gen-mapping@0.3.8': 292 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 293 | engines: {node: '>=6.0.0'} 294 | 295 | '@jridgewell/resolve-uri@3.1.2': 296 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 297 | engines: {node: '>=6.0.0'} 298 | 299 | '@jridgewell/set-array@1.2.1': 300 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 301 | engines: {node: '>=6.0.0'} 302 | 303 | '@jridgewell/sourcemap-codec@1.5.0': 304 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 305 | 306 | '@jridgewell/trace-mapping@0.3.25': 307 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 308 | 309 | '@modelcontextprotocol/sdk@1.11.3': 310 | resolution: {integrity: sha512-rmOWVRUbUJD7iSvJugjUbFZshTAuJ48MXoZ80Osx1GM0K/H1w7rSEvmw8m6vdWxNASgtaHIhAgre4H/E9GJiYQ==} 311 | engines: {node: '>=18'} 312 | 313 | '@nodelib/fs.scandir@2.1.5': 314 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 315 | engines: {node: '>= 8'} 316 | 317 | '@nodelib/fs.stat@2.0.5': 318 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 319 | engines: {node: '>= 8'} 320 | 321 | '@nodelib/fs.walk@1.2.8': 322 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 323 | engines: {node: '>= 8'} 324 | 325 | '@pkgjs/parseargs@0.11.0': 326 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 327 | engines: {node: '>=14'} 328 | 329 | '@rollup/rollup-android-arm-eabi@4.40.2': 330 | resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} 331 | cpu: [arm] 332 | os: [android] 333 | 334 | '@rollup/rollup-android-arm64@4.40.2': 335 | resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} 336 | cpu: [arm64] 337 | os: [android] 338 | 339 | '@rollup/rollup-darwin-arm64@4.40.2': 340 | resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} 341 | cpu: [arm64] 342 | os: [darwin] 343 | 344 | '@rollup/rollup-darwin-x64@4.40.2': 345 | resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} 346 | cpu: [x64] 347 | os: [darwin] 348 | 349 | '@rollup/rollup-freebsd-arm64@4.40.2': 350 | resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} 351 | cpu: [arm64] 352 | os: [freebsd] 353 | 354 | '@rollup/rollup-freebsd-x64@4.40.2': 355 | resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} 356 | cpu: [x64] 357 | os: [freebsd] 358 | 359 | '@rollup/rollup-linux-arm-gnueabihf@4.40.2': 360 | resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} 361 | cpu: [arm] 362 | os: [linux] 363 | 364 | '@rollup/rollup-linux-arm-musleabihf@4.40.2': 365 | resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} 366 | cpu: [arm] 367 | os: [linux] 368 | 369 | '@rollup/rollup-linux-arm64-gnu@4.40.2': 370 | resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} 371 | cpu: [arm64] 372 | os: [linux] 373 | 374 | '@rollup/rollup-linux-arm64-musl@4.40.2': 375 | resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} 376 | cpu: [arm64] 377 | os: [linux] 378 | 379 | '@rollup/rollup-linux-loongarch64-gnu@4.40.2': 380 | resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} 381 | cpu: [loong64] 382 | os: [linux] 383 | 384 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': 385 | resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} 386 | cpu: [ppc64] 387 | os: [linux] 388 | 389 | '@rollup/rollup-linux-riscv64-gnu@4.40.2': 390 | resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} 391 | cpu: [riscv64] 392 | os: [linux] 393 | 394 | '@rollup/rollup-linux-riscv64-musl@4.40.2': 395 | resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} 396 | cpu: [riscv64] 397 | os: [linux] 398 | 399 | '@rollup/rollup-linux-s390x-gnu@4.40.2': 400 | resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} 401 | cpu: [s390x] 402 | os: [linux] 403 | 404 | '@rollup/rollup-linux-x64-gnu@4.40.2': 405 | resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} 406 | cpu: [x64] 407 | os: [linux] 408 | 409 | '@rollup/rollup-linux-x64-musl@4.40.2': 410 | resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} 411 | cpu: [x64] 412 | os: [linux] 413 | 414 | '@rollup/rollup-win32-arm64-msvc@4.40.2': 415 | resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} 416 | cpu: [arm64] 417 | os: [win32] 418 | 419 | '@rollup/rollup-win32-ia32-msvc@4.40.2': 420 | resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} 421 | cpu: [ia32] 422 | os: [win32] 423 | 424 | '@rollup/rollup-win32-x64-msvc@4.40.2': 425 | resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} 426 | cpu: [x64] 427 | os: [win32] 428 | 429 | '@stylistic/eslint-plugin@4.2.0': 430 | resolution: {integrity: sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==} 431 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 432 | peerDependencies: 433 | eslint: '>=9.0.0' 434 | 435 | '@susisu/eslint-config@0.0.97': 436 | resolution: {integrity: sha512-6j4I2+v3BVo3fEZHDGw0ddl+6Kc1qOesAk/qUhytvxfg6K08e+TENcqz0ddo1gv8J31m+ekvQxSkLZ8w4B2w5Q==} 437 | peerDependencies: 438 | eslint: ^9.19.0 439 | 440 | '@susisu/eslint-plugin-safe-typescript@0.9.4': 441 | resolution: {integrity: sha512-mG3hea82ybJCz+F07Wwcp6QZHuROPud9M8VgTN4+7H4A5KRYM1Gn5ZvJXqnslQgID8mkafu8tSzgn4zjtNpi0w==} 442 | peerDependencies: 443 | '@typescript-eslint/parser': ^8.0.0 444 | eslint: ^9.10.0 445 | typescript: '*' 446 | typescript-eslint: ^8.0.0 447 | peerDependenciesMeta: 448 | '@typescript-eslint/parser': 449 | optional: true 450 | typescript-eslint: 451 | optional: true 452 | 453 | '@types/estree@1.0.7': 454 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 455 | 456 | '@types/json-schema@7.0.15': 457 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 458 | 459 | '@types/node@22.15.18': 460 | resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} 461 | 462 | '@typescript-eslint/eslint-plugin@8.32.1': 463 | resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} 464 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 465 | peerDependencies: 466 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 467 | eslint: ^8.57.0 || ^9.0.0 468 | typescript: '>=4.8.4 <5.9.0' 469 | 470 | '@typescript-eslint/parser@8.32.1': 471 | resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} 472 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 473 | peerDependencies: 474 | eslint: ^8.57.0 || ^9.0.0 475 | typescript: '>=4.8.4 <5.9.0' 476 | 477 | '@typescript-eslint/scope-manager@8.32.1': 478 | resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} 479 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 480 | 481 | '@typescript-eslint/type-utils@8.32.1': 482 | resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} 483 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 484 | peerDependencies: 485 | eslint: ^8.57.0 || ^9.0.0 486 | typescript: '>=4.8.4 <5.9.0' 487 | 488 | '@typescript-eslint/types@8.32.1': 489 | resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} 490 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 491 | 492 | '@typescript-eslint/typescript-estree@8.32.1': 493 | resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} 494 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 495 | peerDependencies: 496 | typescript: '>=4.8.4 <5.9.0' 497 | 498 | '@typescript-eslint/utils@8.32.1': 499 | resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} 500 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 501 | peerDependencies: 502 | eslint: ^8.57.0 || ^9.0.0 503 | typescript: '>=4.8.4 <5.9.0' 504 | 505 | '@typescript-eslint/visitor-keys@8.32.1': 506 | resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} 507 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 508 | 509 | '@vitest/coverage-v8@3.1.3': 510 | resolution: {integrity: sha512-cj76U5gXCl3g88KSnf80kof6+6w+K4BjOflCl7t6yRJPDuCrHtVu0SgNYOUARJOL5TI8RScDbm5x4s1/P9bvpw==} 511 | peerDependencies: 512 | '@vitest/browser': 3.1.3 513 | vitest: 3.1.3 514 | peerDependenciesMeta: 515 | '@vitest/browser': 516 | optional: true 517 | 518 | '@vitest/eslint-plugin@1.1.44': 519 | resolution: {integrity: sha512-m4XeohMT+Dj2RZfxnbiFR+Cv5dEC0H7C6TlxRQT7GK2556solm99kxgzJp/trKrZvanZcOFyw7aABykUTfWyrg==} 520 | peerDependencies: 521 | '@typescript-eslint/utils': '>= 8.24.0' 522 | eslint: '>= 8.57.0' 523 | typescript: '>= 5.0.0' 524 | vitest: '*' 525 | peerDependenciesMeta: 526 | typescript: 527 | optional: true 528 | vitest: 529 | optional: true 530 | 531 | '@vitest/expect@3.1.3': 532 | resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==} 533 | 534 | '@vitest/mocker@3.1.3': 535 | resolution: {integrity: sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==} 536 | peerDependencies: 537 | msw: ^2.4.9 538 | vite: ^5.0.0 || ^6.0.0 539 | peerDependenciesMeta: 540 | msw: 541 | optional: true 542 | vite: 543 | optional: true 544 | 545 | '@vitest/pretty-format@3.1.3': 546 | resolution: {integrity: sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==} 547 | 548 | '@vitest/runner@3.1.3': 549 | resolution: {integrity: sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==} 550 | 551 | '@vitest/snapshot@3.1.3': 552 | resolution: {integrity: sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==} 553 | 554 | '@vitest/spy@3.1.3': 555 | resolution: {integrity: sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==} 556 | 557 | '@vitest/utils@3.1.3': 558 | resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==} 559 | 560 | accepts@2.0.0: 561 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 562 | engines: {node: '>= 0.6'} 563 | 564 | acorn-jsx@5.3.2: 565 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 566 | peerDependencies: 567 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 568 | 569 | acorn@8.14.1: 570 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 571 | engines: {node: '>=0.4.0'} 572 | hasBin: true 573 | 574 | ajv@6.12.6: 575 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 576 | 577 | ansi-regex@5.0.1: 578 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 579 | engines: {node: '>=8'} 580 | 581 | ansi-regex@6.1.0: 582 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 583 | engines: {node: '>=12'} 584 | 585 | ansi-styles@4.3.0: 586 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 587 | engines: {node: '>=8'} 588 | 589 | ansi-styles@6.2.1: 590 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 591 | engines: {node: '>=12'} 592 | 593 | argparse@2.0.1: 594 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 595 | 596 | assertion-error@2.0.1: 597 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 598 | engines: {node: '>=12'} 599 | 600 | balanced-match@1.0.2: 601 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 602 | 603 | body-parser@2.2.0: 604 | resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} 605 | engines: {node: '>=18'} 606 | 607 | brace-expansion@1.1.11: 608 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 609 | 610 | brace-expansion@2.0.1: 611 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 612 | 613 | braces@3.0.3: 614 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 615 | engines: {node: '>=8'} 616 | 617 | bytes@3.1.2: 618 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 619 | engines: {node: '>= 0.8'} 620 | 621 | cac@6.7.14: 622 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 623 | engines: {node: '>=8'} 624 | 625 | call-bind-apply-helpers@1.0.2: 626 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 627 | engines: {node: '>= 0.4'} 628 | 629 | call-bound@1.0.4: 630 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 631 | engines: {node: '>= 0.4'} 632 | 633 | callsites@3.1.0: 634 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 635 | engines: {node: '>=6'} 636 | 637 | chai@5.2.0: 638 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 639 | engines: {node: '>=12'} 640 | 641 | chalk@4.1.2: 642 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 643 | engines: {node: '>=10'} 644 | 645 | check-error@2.1.1: 646 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 647 | engines: {node: '>= 16'} 648 | 649 | color-convert@2.0.1: 650 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 651 | engines: {node: '>=7.0.0'} 652 | 653 | color-name@1.1.4: 654 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 655 | 656 | concat-map@0.0.1: 657 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 658 | 659 | content-disposition@1.0.0: 660 | resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} 661 | engines: {node: '>= 0.6'} 662 | 663 | content-type@1.0.5: 664 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 665 | engines: {node: '>= 0.6'} 666 | 667 | cookie-signature@1.2.2: 668 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 669 | engines: {node: '>=6.6.0'} 670 | 671 | cookie@0.7.2: 672 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 673 | engines: {node: '>= 0.6'} 674 | 675 | cors@2.8.5: 676 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 677 | engines: {node: '>= 0.10'} 678 | 679 | cross-spawn@7.0.6: 680 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 681 | engines: {node: '>= 8'} 682 | 683 | debug@4.4.1: 684 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 685 | engines: {node: '>=6.0'} 686 | peerDependencies: 687 | supports-color: '*' 688 | peerDependenciesMeta: 689 | supports-color: 690 | optional: true 691 | 692 | deep-eql@5.0.2: 693 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 694 | engines: {node: '>=6'} 695 | 696 | deep-is@0.1.4: 697 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 698 | 699 | depd@2.0.0: 700 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 701 | engines: {node: '>= 0.8'} 702 | 703 | dunder-proto@1.0.1: 704 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 705 | engines: {node: '>= 0.4'} 706 | 707 | eastasianwidth@0.2.0: 708 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 709 | 710 | ee-first@1.1.1: 711 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 712 | 713 | emoji-regex@8.0.0: 714 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 715 | 716 | emoji-regex@9.2.2: 717 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 718 | 719 | encodeurl@2.0.0: 720 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 721 | engines: {node: '>= 0.8'} 722 | 723 | es-define-property@1.0.1: 724 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 725 | engines: {node: '>= 0.4'} 726 | 727 | es-errors@1.3.0: 728 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 729 | engines: {node: '>= 0.4'} 730 | 731 | es-module-lexer@1.7.0: 732 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 733 | 734 | es-object-atoms@1.1.1: 735 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 736 | engines: {node: '>= 0.4'} 737 | 738 | esbuild@0.25.4: 739 | resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} 740 | engines: {node: '>=18'} 741 | hasBin: true 742 | 743 | escape-html@1.0.3: 744 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 745 | 746 | escape-string-regexp@4.0.0: 747 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 748 | engines: {node: '>=10'} 749 | 750 | eslint-config-prettier@10.1.5: 751 | resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} 752 | hasBin: true 753 | peerDependencies: 754 | eslint: '>=7.0.0' 755 | 756 | eslint-scope@8.3.0: 757 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 758 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 759 | 760 | eslint-visitor-keys@3.4.3: 761 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 762 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 763 | 764 | eslint-visitor-keys@4.2.0: 765 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 766 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 767 | 768 | eslint@9.26.0: 769 | resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} 770 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 771 | hasBin: true 772 | peerDependencies: 773 | jiti: '*' 774 | peerDependenciesMeta: 775 | jiti: 776 | optional: true 777 | 778 | espree@10.3.0: 779 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 780 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 781 | 782 | esquery@1.6.0: 783 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 784 | engines: {node: '>=0.10'} 785 | 786 | esrecurse@4.3.0: 787 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 788 | engines: {node: '>=4.0'} 789 | 790 | estraverse@5.3.0: 791 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 792 | engines: {node: '>=4.0'} 793 | 794 | estree-walker@3.0.3: 795 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 796 | 797 | esutils@2.0.3: 798 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 799 | engines: {node: '>=0.10.0'} 800 | 801 | etag@1.8.1: 802 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 803 | engines: {node: '>= 0.6'} 804 | 805 | eventsource-parser@3.0.2: 806 | resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} 807 | engines: {node: '>=18.0.0'} 808 | 809 | eventsource@3.0.7: 810 | resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} 811 | engines: {node: '>=18.0.0'} 812 | 813 | expect-type@1.2.1: 814 | resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} 815 | engines: {node: '>=12.0.0'} 816 | 817 | express-rate-limit@7.5.0: 818 | resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} 819 | engines: {node: '>= 16'} 820 | peerDependencies: 821 | express: ^4.11 || 5 || ^5.0.0-beta.1 822 | 823 | express@5.1.0: 824 | resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} 825 | engines: {node: '>= 18'} 826 | 827 | fast-deep-equal@3.1.3: 828 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 829 | 830 | fast-glob@3.3.3: 831 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 832 | engines: {node: '>=8.6.0'} 833 | 834 | fast-json-stable-stringify@2.1.0: 835 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 836 | 837 | fast-levenshtein@2.0.6: 838 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 839 | 840 | fastq@1.19.1: 841 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 842 | 843 | fdir@6.4.4: 844 | resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} 845 | peerDependencies: 846 | picomatch: ^3 || ^4 847 | peerDependenciesMeta: 848 | picomatch: 849 | optional: true 850 | 851 | file-entry-cache@8.0.0: 852 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 853 | engines: {node: '>=16.0.0'} 854 | 855 | fill-range@7.1.1: 856 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 857 | engines: {node: '>=8'} 858 | 859 | finalhandler@2.1.0: 860 | resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} 861 | engines: {node: '>= 0.8'} 862 | 863 | find-up@5.0.0: 864 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 865 | engines: {node: '>=10'} 866 | 867 | flat-cache@4.0.1: 868 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 869 | engines: {node: '>=16'} 870 | 871 | flatted@3.3.3: 872 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 873 | 874 | foreground-child@3.3.1: 875 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 876 | engines: {node: '>=14'} 877 | 878 | forwarded@0.2.0: 879 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 880 | engines: {node: '>= 0.6'} 881 | 882 | fresh@2.0.0: 883 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 884 | engines: {node: '>= 0.8'} 885 | 886 | fsevents@2.3.3: 887 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 888 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 889 | os: [darwin] 890 | 891 | function-bind@1.1.2: 892 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 893 | 894 | get-intrinsic@1.3.0: 895 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 896 | engines: {node: '>= 0.4'} 897 | 898 | get-proto@1.0.1: 899 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 900 | engines: {node: '>= 0.4'} 901 | 902 | get-tsconfig@4.10.0: 903 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 904 | 905 | glob-parent@5.1.2: 906 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 907 | engines: {node: '>= 6'} 908 | 909 | glob-parent@6.0.2: 910 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 911 | engines: {node: '>=10.13.0'} 912 | 913 | glob@10.4.5: 914 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 915 | hasBin: true 916 | 917 | glob@11.0.2: 918 | resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} 919 | engines: {node: 20 || >=22} 920 | hasBin: true 921 | 922 | globals@14.0.0: 923 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 924 | engines: {node: '>=18'} 925 | 926 | globals@16.1.0: 927 | resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} 928 | engines: {node: '>=18'} 929 | 930 | gopd@1.2.0: 931 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 932 | engines: {node: '>= 0.4'} 933 | 934 | graphemer@1.4.0: 935 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 936 | 937 | has-flag@4.0.0: 938 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 939 | engines: {node: '>=8'} 940 | 941 | has-symbols@1.1.0: 942 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 943 | engines: {node: '>= 0.4'} 944 | 945 | hasown@2.0.2: 946 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 947 | engines: {node: '>= 0.4'} 948 | 949 | html-escaper@2.0.2: 950 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 951 | 952 | http-errors@2.0.0: 953 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 954 | engines: {node: '>= 0.8'} 955 | 956 | iconv-lite@0.6.3: 957 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 958 | engines: {node: '>=0.10.0'} 959 | 960 | ignore@5.3.2: 961 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 962 | engines: {node: '>= 4'} 963 | 964 | ignore@7.0.4: 965 | resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} 966 | engines: {node: '>= 4'} 967 | 968 | import-fresh@3.3.1: 969 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 970 | engines: {node: '>=6'} 971 | 972 | imurmurhash@0.1.4: 973 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 974 | engines: {node: '>=0.8.19'} 975 | 976 | inherits@2.0.4: 977 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 978 | 979 | ipaddr.js@1.9.1: 980 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 981 | engines: {node: '>= 0.10'} 982 | 983 | is-extglob@2.1.1: 984 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 985 | engines: {node: '>=0.10.0'} 986 | 987 | is-fullwidth-code-point@3.0.0: 988 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 989 | engines: {node: '>=8'} 990 | 991 | is-glob@4.0.3: 992 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 993 | engines: {node: '>=0.10.0'} 994 | 995 | is-number@7.0.0: 996 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 997 | engines: {node: '>=0.12.0'} 998 | 999 | is-promise@4.0.0: 1000 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 1001 | 1002 | isexe@2.0.0: 1003 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1004 | 1005 | isexe@3.1.1: 1006 | resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} 1007 | engines: {node: '>=16'} 1008 | 1009 | istanbul-lib-coverage@3.2.2: 1010 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1011 | engines: {node: '>=8'} 1012 | 1013 | istanbul-lib-report@3.0.1: 1014 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1015 | engines: {node: '>=10'} 1016 | 1017 | istanbul-lib-source-maps@5.0.6: 1018 | resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} 1019 | engines: {node: '>=10'} 1020 | 1021 | istanbul-reports@3.1.7: 1022 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1023 | engines: {node: '>=8'} 1024 | 1025 | jackspeak@3.4.3: 1026 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1027 | 1028 | jackspeak@4.1.0: 1029 | resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} 1030 | engines: {node: 20 || >=22} 1031 | 1032 | js-yaml@4.1.0: 1033 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1034 | hasBin: true 1035 | 1036 | json-buffer@3.0.1: 1037 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1038 | 1039 | json-parse-even-better-errors@4.0.0: 1040 | resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} 1041 | engines: {node: ^18.17.0 || >=20.5.0} 1042 | 1043 | json-schema-traverse@0.4.1: 1044 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1045 | 1046 | json-stable-stringify-without-jsonify@1.0.1: 1047 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1048 | 1049 | keyv@4.5.4: 1050 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1051 | 1052 | levn@0.4.1: 1053 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1054 | engines: {node: '>= 0.8.0'} 1055 | 1056 | locate-path@6.0.0: 1057 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1058 | engines: {node: '>=10'} 1059 | 1060 | lodash.merge@4.6.2: 1061 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1062 | 1063 | loupe@3.1.3: 1064 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 1065 | 1066 | lru-cache@10.4.3: 1067 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1068 | 1069 | lru-cache@11.1.0: 1070 | resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} 1071 | engines: {node: 20 || >=22} 1072 | 1073 | magic-string@0.30.17: 1074 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1075 | 1076 | magicast@0.3.5: 1077 | resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} 1078 | 1079 | make-dir@4.0.0: 1080 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1081 | engines: {node: '>=10'} 1082 | 1083 | math-intrinsics@1.1.0: 1084 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1085 | engines: {node: '>= 0.4'} 1086 | 1087 | media-typer@1.1.0: 1088 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 1089 | engines: {node: '>= 0.8'} 1090 | 1091 | memorystream@0.3.1: 1092 | resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1093 | engines: {node: '>= 0.10.0'} 1094 | 1095 | merge-descriptors@2.0.0: 1096 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 1097 | engines: {node: '>=18'} 1098 | 1099 | merge2@1.4.1: 1100 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1101 | engines: {node: '>= 8'} 1102 | 1103 | micromatch@4.0.8: 1104 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1105 | engines: {node: '>=8.6'} 1106 | 1107 | mime-db@1.54.0: 1108 | resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} 1109 | engines: {node: '>= 0.6'} 1110 | 1111 | mime-types@3.0.1: 1112 | resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} 1113 | engines: {node: '>= 0.6'} 1114 | 1115 | minimatch@10.0.1: 1116 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 1117 | engines: {node: 20 || >=22} 1118 | 1119 | minimatch@3.1.2: 1120 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1121 | 1122 | minimatch@9.0.5: 1123 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1124 | engines: {node: '>=16 || 14 >=14.17'} 1125 | 1126 | minipass@7.1.2: 1127 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1128 | engines: {node: '>=16 || 14 >=14.17'} 1129 | 1130 | ms@2.1.3: 1131 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1132 | 1133 | nanoid@3.3.11: 1134 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1135 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1136 | hasBin: true 1137 | 1138 | natural-compare@1.4.0: 1139 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1140 | 1141 | negotiator@1.0.0: 1142 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 1143 | engines: {node: '>= 0.6'} 1144 | 1145 | npm-normalize-package-bin@4.0.0: 1146 | resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} 1147 | engines: {node: ^18.17.0 || >=20.5.0} 1148 | 1149 | npm-run-all2@8.0.1: 1150 | resolution: {integrity: sha512-jkhE0AsELQeCtScrcJ/7mSIdk+ZsnWjvKk3KwE96HZ6+OFVB74XhxQtHT1W6kdUfn92fRnBb29Mz82j9bV2XEQ==} 1151 | engines: {node: ^20.5.0 || >=22.0.0, npm: '>= 10'} 1152 | hasBin: true 1153 | 1154 | object-assign@4.1.1: 1155 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1156 | engines: {node: '>=0.10.0'} 1157 | 1158 | object-inspect@1.13.4: 1159 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 1160 | engines: {node: '>= 0.4'} 1161 | 1162 | on-finished@2.4.1: 1163 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1164 | engines: {node: '>= 0.8'} 1165 | 1166 | once@1.4.0: 1167 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1168 | 1169 | optionator@0.9.4: 1170 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1171 | engines: {node: '>= 0.8.0'} 1172 | 1173 | p-limit@3.1.0: 1174 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1175 | engines: {node: '>=10'} 1176 | 1177 | p-locate@5.0.0: 1178 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1179 | engines: {node: '>=10'} 1180 | 1181 | package-json-from-dist@1.0.1: 1182 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1183 | 1184 | parent-module@1.0.1: 1185 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1186 | engines: {node: '>=6'} 1187 | 1188 | parseurl@1.3.3: 1189 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1190 | engines: {node: '>= 0.8'} 1191 | 1192 | path-exists@4.0.0: 1193 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1194 | engines: {node: '>=8'} 1195 | 1196 | path-key@3.1.1: 1197 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1198 | engines: {node: '>=8'} 1199 | 1200 | path-scurry@1.11.1: 1201 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1202 | engines: {node: '>=16 || 14 >=14.18'} 1203 | 1204 | path-scurry@2.0.0: 1205 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 1206 | engines: {node: 20 || >=22} 1207 | 1208 | path-to-regexp@8.2.0: 1209 | resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} 1210 | engines: {node: '>=16'} 1211 | 1212 | pathe@2.0.3: 1213 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1214 | 1215 | pathval@2.0.0: 1216 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1217 | engines: {node: '>= 14.16'} 1218 | 1219 | picocolors@1.1.1: 1220 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1221 | 1222 | picomatch@2.3.1: 1223 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1224 | engines: {node: '>=8.6'} 1225 | 1226 | picomatch@4.0.2: 1227 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1228 | engines: {node: '>=12'} 1229 | 1230 | pidtree@0.6.0: 1231 | resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} 1232 | engines: {node: '>=0.10'} 1233 | hasBin: true 1234 | 1235 | pkce-challenge@5.0.0: 1236 | resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} 1237 | engines: {node: '>=16.20.0'} 1238 | 1239 | postcss@8.5.3: 1240 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1241 | engines: {node: ^10 || ^12 || >=14} 1242 | 1243 | prelude-ls@1.2.1: 1244 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1245 | engines: {node: '>= 0.8.0'} 1246 | 1247 | prettier@3.5.3: 1248 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 1249 | engines: {node: '>=14'} 1250 | hasBin: true 1251 | 1252 | proxy-addr@2.0.7: 1253 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1254 | engines: {node: '>= 0.10'} 1255 | 1256 | punycode@2.3.1: 1257 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1258 | engines: {node: '>=6'} 1259 | 1260 | qs@6.14.0: 1261 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 1262 | engines: {node: '>=0.6'} 1263 | 1264 | queue-microtask@1.2.3: 1265 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1266 | 1267 | range-parser@1.2.1: 1268 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1269 | engines: {node: '>= 0.6'} 1270 | 1271 | raw-body@3.0.0: 1272 | resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} 1273 | engines: {node: '>= 0.8'} 1274 | 1275 | read-package-json-fast@4.0.0: 1276 | resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} 1277 | engines: {node: ^18.17.0 || >=20.5.0} 1278 | 1279 | resolve-from@4.0.0: 1280 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1281 | engines: {node: '>=4'} 1282 | 1283 | resolve-pkg-maps@1.0.0: 1284 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1285 | 1286 | reusify@1.1.0: 1287 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1288 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1289 | 1290 | rimraf@6.0.1: 1291 | resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} 1292 | engines: {node: 20 || >=22} 1293 | hasBin: true 1294 | 1295 | rollup@4.40.2: 1296 | resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} 1297 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1298 | hasBin: true 1299 | 1300 | router@2.2.0: 1301 | resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} 1302 | engines: {node: '>= 18'} 1303 | 1304 | run-parallel@1.2.0: 1305 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1306 | 1307 | safe-buffer@5.2.1: 1308 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1309 | 1310 | safer-buffer@2.1.2: 1311 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1312 | 1313 | semver@7.7.2: 1314 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1315 | engines: {node: '>=10'} 1316 | hasBin: true 1317 | 1318 | send@1.2.0: 1319 | resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} 1320 | engines: {node: '>= 18'} 1321 | 1322 | serve-static@2.2.0: 1323 | resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} 1324 | engines: {node: '>= 18'} 1325 | 1326 | setprototypeof@1.2.0: 1327 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1328 | 1329 | shebang-command@2.0.0: 1330 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1331 | engines: {node: '>=8'} 1332 | 1333 | shebang-regex@3.0.0: 1334 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1335 | engines: {node: '>=8'} 1336 | 1337 | shell-quote@1.8.2: 1338 | resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} 1339 | engines: {node: '>= 0.4'} 1340 | 1341 | side-channel-list@1.0.0: 1342 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1343 | engines: {node: '>= 0.4'} 1344 | 1345 | side-channel-map@1.0.1: 1346 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1347 | engines: {node: '>= 0.4'} 1348 | 1349 | side-channel-weakmap@1.0.2: 1350 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1351 | engines: {node: '>= 0.4'} 1352 | 1353 | side-channel@1.1.0: 1354 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1355 | engines: {node: '>= 0.4'} 1356 | 1357 | siginfo@2.0.0: 1358 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1359 | 1360 | signal-exit@4.1.0: 1361 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1362 | engines: {node: '>=14'} 1363 | 1364 | source-map-js@1.2.1: 1365 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1366 | engines: {node: '>=0.10.0'} 1367 | 1368 | stackback@0.0.2: 1369 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1370 | 1371 | statuses@2.0.1: 1372 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1373 | engines: {node: '>= 0.8'} 1374 | 1375 | std-env@3.9.0: 1376 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 1377 | 1378 | string-width@4.2.3: 1379 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1380 | engines: {node: '>=8'} 1381 | 1382 | string-width@5.1.2: 1383 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1384 | engines: {node: '>=12'} 1385 | 1386 | strip-ansi@6.0.1: 1387 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1388 | engines: {node: '>=8'} 1389 | 1390 | strip-ansi@7.1.0: 1391 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1392 | engines: {node: '>=12'} 1393 | 1394 | strip-json-comments@3.1.1: 1395 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1396 | engines: {node: '>=8'} 1397 | 1398 | supports-color@7.2.0: 1399 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1400 | engines: {node: '>=8'} 1401 | 1402 | test-exclude@7.0.1: 1403 | resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} 1404 | engines: {node: '>=18'} 1405 | 1406 | tinybench@2.9.0: 1407 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1408 | 1409 | tinyexec@0.3.2: 1410 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1411 | 1412 | tinyglobby@0.2.13: 1413 | resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} 1414 | engines: {node: '>=12.0.0'} 1415 | 1416 | tinypool@1.0.2: 1417 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1418 | engines: {node: ^18.0.0 || >=20.0.0} 1419 | 1420 | tinyrainbow@2.0.0: 1421 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 1422 | engines: {node: '>=14.0.0'} 1423 | 1424 | tinyspy@3.0.2: 1425 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1426 | engines: {node: '>=14.0.0'} 1427 | 1428 | to-regex-range@5.0.1: 1429 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1430 | engines: {node: '>=8.0'} 1431 | 1432 | toidentifier@1.0.1: 1433 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1434 | engines: {node: '>=0.6'} 1435 | 1436 | ts-api-utils@2.1.0: 1437 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1438 | engines: {node: '>=18.12'} 1439 | peerDependencies: 1440 | typescript: '>=4.8.4' 1441 | 1442 | tsx@4.19.4: 1443 | resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} 1444 | engines: {node: '>=18.0.0'} 1445 | hasBin: true 1446 | 1447 | type-check@0.4.0: 1448 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1449 | engines: {node: '>= 0.8.0'} 1450 | 1451 | type-is@2.0.1: 1452 | resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} 1453 | engines: {node: '>= 0.6'} 1454 | 1455 | typescript@5.8.3: 1456 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1457 | engines: {node: '>=14.17'} 1458 | hasBin: true 1459 | 1460 | undici-types@6.21.0: 1461 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1462 | 1463 | unpipe@1.0.0: 1464 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1465 | engines: {node: '>= 0.8'} 1466 | 1467 | uri-js@4.4.1: 1468 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1469 | 1470 | vary@1.1.2: 1471 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1472 | engines: {node: '>= 0.8'} 1473 | 1474 | vite-node@3.1.3: 1475 | resolution: {integrity: sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==} 1476 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1477 | hasBin: true 1478 | 1479 | vite@6.3.5: 1480 | resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1481 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1482 | hasBin: true 1483 | peerDependencies: 1484 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1485 | jiti: '>=1.21.0' 1486 | less: '*' 1487 | lightningcss: ^1.21.0 1488 | sass: '*' 1489 | sass-embedded: '*' 1490 | stylus: '*' 1491 | sugarss: '*' 1492 | terser: ^5.16.0 1493 | tsx: ^4.8.1 1494 | yaml: ^2.4.2 1495 | peerDependenciesMeta: 1496 | '@types/node': 1497 | optional: true 1498 | jiti: 1499 | optional: true 1500 | less: 1501 | optional: true 1502 | lightningcss: 1503 | optional: true 1504 | sass: 1505 | optional: true 1506 | sass-embedded: 1507 | optional: true 1508 | stylus: 1509 | optional: true 1510 | sugarss: 1511 | optional: true 1512 | terser: 1513 | optional: true 1514 | tsx: 1515 | optional: true 1516 | yaml: 1517 | optional: true 1518 | 1519 | vitest@3.1.3: 1520 | resolution: {integrity: sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==} 1521 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1522 | hasBin: true 1523 | peerDependencies: 1524 | '@edge-runtime/vm': '*' 1525 | '@types/debug': ^4.1.12 1526 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1527 | '@vitest/browser': 3.1.3 1528 | '@vitest/ui': 3.1.3 1529 | happy-dom: '*' 1530 | jsdom: '*' 1531 | peerDependenciesMeta: 1532 | '@edge-runtime/vm': 1533 | optional: true 1534 | '@types/debug': 1535 | optional: true 1536 | '@types/node': 1537 | optional: true 1538 | '@vitest/browser': 1539 | optional: true 1540 | '@vitest/ui': 1541 | optional: true 1542 | happy-dom: 1543 | optional: true 1544 | jsdom: 1545 | optional: true 1546 | 1547 | which@2.0.2: 1548 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1549 | engines: {node: '>= 8'} 1550 | hasBin: true 1551 | 1552 | which@5.0.0: 1553 | resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} 1554 | engines: {node: ^18.17.0 || >=20.5.0} 1555 | hasBin: true 1556 | 1557 | why-is-node-running@2.3.0: 1558 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1559 | engines: {node: '>=8'} 1560 | hasBin: true 1561 | 1562 | word-wrap@1.2.5: 1563 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1564 | engines: {node: '>=0.10.0'} 1565 | 1566 | wrap-ansi@7.0.0: 1567 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1568 | engines: {node: '>=10'} 1569 | 1570 | wrap-ansi@8.1.0: 1571 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1572 | engines: {node: '>=12'} 1573 | 1574 | wrappy@1.0.2: 1575 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1576 | 1577 | yaml@2.6.0: 1578 | resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} 1579 | engines: {node: '>= 14'} 1580 | hasBin: true 1581 | 1582 | yocto-queue@0.1.0: 1583 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1584 | engines: {node: '>=10'} 1585 | 1586 | zod-to-json-schema@3.24.5: 1587 | resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} 1588 | peerDependencies: 1589 | zod: ^3.24.1 1590 | 1591 | zod@3.24.4: 1592 | resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} 1593 | 1594 | snapshots: 1595 | 1596 | '@ampproject/remapping@2.3.0': 1597 | dependencies: 1598 | '@jridgewell/gen-mapping': 0.3.8 1599 | '@jridgewell/trace-mapping': 0.3.25 1600 | 1601 | '@babel/helper-string-parser@7.27.1': {} 1602 | 1603 | '@babel/helper-validator-identifier@7.27.1': {} 1604 | 1605 | '@babel/parser@7.27.2': 1606 | dependencies: 1607 | '@babel/types': 7.27.1 1608 | 1609 | '@babel/types@7.27.1': 1610 | dependencies: 1611 | '@babel/helper-string-parser': 7.27.1 1612 | '@babel/helper-validator-identifier': 7.27.1 1613 | 1614 | '@bcoe/v8-coverage@1.0.2': {} 1615 | 1616 | '@esbuild/aix-ppc64@0.25.4': 1617 | optional: true 1618 | 1619 | '@esbuild/android-arm64@0.25.4': 1620 | optional: true 1621 | 1622 | '@esbuild/android-arm@0.25.4': 1623 | optional: true 1624 | 1625 | '@esbuild/android-x64@0.25.4': 1626 | optional: true 1627 | 1628 | '@esbuild/darwin-arm64@0.25.4': 1629 | optional: true 1630 | 1631 | '@esbuild/darwin-x64@0.25.4': 1632 | optional: true 1633 | 1634 | '@esbuild/freebsd-arm64@0.25.4': 1635 | optional: true 1636 | 1637 | '@esbuild/freebsd-x64@0.25.4': 1638 | optional: true 1639 | 1640 | '@esbuild/linux-arm64@0.25.4': 1641 | optional: true 1642 | 1643 | '@esbuild/linux-arm@0.25.4': 1644 | optional: true 1645 | 1646 | '@esbuild/linux-ia32@0.25.4': 1647 | optional: true 1648 | 1649 | '@esbuild/linux-loong64@0.25.4': 1650 | optional: true 1651 | 1652 | '@esbuild/linux-mips64el@0.25.4': 1653 | optional: true 1654 | 1655 | '@esbuild/linux-ppc64@0.25.4': 1656 | optional: true 1657 | 1658 | '@esbuild/linux-riscv64@0.25.4': 1659 | optional: true 1660 | 1661 | '@esbuild/linux-s390x@0.25.4': 1662 | optional: true 1663 | 1664 | '@esbuild/linux-x64@0.25.4': 1665 | optional: true 1666 | 1667 | '@esbuild/netbsd-arm64@0.25.4': 1668 | optional: true 1669 | 1670 | '@esbuild/netbsd-x64@0.25.4': 1671 | optional: true 1672 | 1673 | '@esbuild/openbsd-arm64@0.25.4': 1674 | optional: true 1675 | 1676 | '@esbuild/openbsd-x64@0.25.4': 1677 | optional: true 1678 | 1679 | '@esbuild/sunos-x64@0.25.4': 1680 | optional: true 1681 | 1682 | '@esbuild/win32-arm64@0.25.4': 1683 | optional: true 1684 | 1685 | '@esbuild/win32-ia32@0.25.4': 1686 | optional: true 1687 | 1688 | '@esbuild/win32-x64@0.25.4': 1689 | optional: true 1690 | 1691 | '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0)': 1692 | dependencies: 1693 | eslint: 9.26.0 1694 | eslint-visitor-keys: 3.4.3 1695 | 1696 | '@eslint-community/regexpp@4.12.1': {} 1697 | 1698 | '@eslint/config-array@0.20.0': 1699 | dependencies: 1700 | '@eslint/object-schema': 2.1.6 1701 | debug: 4.4.1 1702 | minimatch: 3.1.2 1703 | transitivePeerDependencies: 1704 | - supports-color 1705 | 1706 | '@eslint/config-helpers@0.2.2': {} 1707 | 1708 | '@eslint/core@0.13.0': 1709 | dependencies: 1710 | '@types/json-schema': 7.0.15 1711 | 1712 | '@eslint/eslintrc@3.3.1': 1713 | dependencies: 1714 | ajv: 6.12.6 1715 | debug: 4.4.1 1716 | espree: 10.3.0 1717 | globals: 14.0.0 1718 | ignore: 5.3.2 1719 | import-fresh: 3.3.1 1720 | js-yaml: 4.1.0 1721 | minimatch: 3.1.2 1722 | strip-json-comments: 3.1.1 1723 | transitivePeerDependencies: 1724 | - supports-color 1725 | 1726 | '@eslint/js@9.26.0': {} 1727 | 1728 | '@eslint/object-schema@2.1.6': {} 1729 | 1730 | '@eslint/plugin-kit@0.2.8': 1731 | dependencies: 1732 | '@eslint/core': 0.13.0 1733 | levn: 0.4.1 1734 | 1735 | '@humanfs/core@0.19.1': {} 1736 | 1737 | '@humanfs/node@0.16.6': 1738 | dependencies: 1739 | '@humanfs/core': 0.19.1 1740 | '@humanwhocodes/retry': 0.3.1 1741 | 1742 | '@humanwhocodes/module-importer@1.0.1': {} 1743 | 1744 | '@humanwhocodes/retry@0.3.1': {} 1745 | 1746 | '@humanwhocodes/retry@0.4.3': {} 1747 | 1748 | '@isaacs/cliui@8.0.2': 1749 | dependencies: 1750 | string-width: 5.1.2 1751 | string-width-cjs: string-width@4.2.3 1752 | strip-ansi: 7.1.0 1753 | strip-ansi-cjs: strip-ansi@6.0.1 1754 | wrap-ansi: 8.1.0 1755 | wrap-ansi-cjs: wrap-ansi@7.0.0 1756 | 1757 | '@istanbuljs/schema@0.1.3': {} 1758 | 1759 | '@jridgewell/gen-mapping@0.3.8': 1760 | dependencies: 1761 | '@jridgewell/set-array': 1.2.1 1762 | '@jridgewell/sourcemap-codec': 1.5.0 1763 | '@jridgewell/trace-mapping': 0.3.25 1764 | 1765 | '@jridgewell/resolve-uri@3.1.2': {} 1766 | 1767 | '@jridgewell/set-array@1.2.1': {} 1768 | 1769 | '@jridgewell/sourcemap-codec@1.5.0': {} 1770 | 1771 | '@jridgewell/trace-mapping@0.3.25': 1772 | dependencies: 1773 | '@jridgewell/resolve-uri': 3.1.2 1774 | '@jridgewell/sourcemap-codec': 1.5.0 1775 | 1776 | '@modelcontextprotocol/sdk@1.11.3': 1777 | dependencies: 1778 | content-type: 1.0.5 1779 | cors: 2.8.5 1780 | cross-spawn: 7.0.6 1781 | eventsource: 3.0.7 1782 | express: 5.1.0 1783 | express-rate-limit: 7.5.0(express@5.1.0) 1784 | pkce-challenge: 5.0.0 1785 | raw-body: 3.0.0 1786 | zod: 3.24.4 1787 | zod-to-json-schema: 3.24.5(zod@3.24.4) 1788 | transitivePeerDependencies: 1789 | - supports-color 1790 | 1791 | '@nodelib/fs.scandir@2.1.5': 1792 | dependencies: 1793 | '@nodelib/fs.stat': 2.0.5 1794 | run-parallel: 1.2.0 1795 | 1796 | '@nodelib/fs.stat@2.0.5': {} 1797 | 1798 | '@nodelib/fs.walk@1.2.8': 1799 | dependencies: 1800 | '@nodelib/fs.scandir': 2.1.5 1801 | fastq: 1.19.1 1802 | 1803 | '@pkgjs/parseargs@0.11.0': 1804 | optional: true 1805 | 1806 | '@rollup/rollup-android-arm-eabi@4.40.2': 1807 | optional: true 1808 | 1809 | '@rollup/rollup-android-arm64@4.40.2': 1810 | optional: true 1811 | 1812 | '@rollup/rollup-darwin-arm64@4.40.2': 1813 | optional: true 1814 | 1815 | '@rollup/rollup-darwin-x64@4.40.2': 1816 | optional: true 1817 | 1818 | '@rollup/rollup-freebsd-arm64@4.40.2': 1819 | optional: true 1820 | 1821 | '@rollup/rollup-freebsd-x64@4.40.2': 1822 | optional: true 1823 | 1824 | '@rollup/rollup-linux-arm-gnueabihf@4.40.2': 1825 | optional: true 1826 | 1827 | '@rollup/rollup-linux-arm-musleabihf@4.40.2': 1828 | optional: true 1829 | 1830 | '@rollup/rollup-linux-arm64-gnu@4.40.2': 1831 | optional: true 1832 | 1833 | '@rollup/rollup-linux-arm64-musl@4.40.2': 1834 | optional: true 1835 | 1836 | '@rollup/rollup-linux-loongarch64-gnu@4.40.2': 1837 | optional: true 1838 | 1839 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': 1840 | optional: true 1841 | 1842 | '@rollup/rollup-linux-riscv64-gnu@4.40.2': 1843 | optional: true 1844 | 1845 | '@rollup/rollup-linux-riscv64-musl@4.40.2': 1846 | optional: true 1847 | 1848 | '@rollup/rollup-linux-s390x-gnu@4.40.2': 1849 | optional: true 1850 | 1851 | '@rollup/rollup-linux-x64-gnu@4.40.2': 1852 | optional: true 1853 | 1854 | '@rollup/rollup-linux-x64-musl@4.40.2': 1855 | optional: true 1856 | 1857 | '@rollup/rollup-win32-arm64-msvc@4.40.2': 1858 | optional: true 1859 | 1860 | '@rollup/rollup-win32-ia32-msvc@4.40.2': 1861 | optional: true 1862 | 1863 | '@rollup/rollup-win32-x64-msvc@4.40.2': 1864 | optional: true 1865 | 1866 | '@stylistic/eslint-plugin@4.2.0(eslint@9.26.0)(typescript@5.8.3)': 1867 | dependencies: 1868 | '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1869 | eslint: 9.26.0 1870 | eslint-visitor-keys: 4.2.0 1871 | espree: 10.3.0 1872 | estraverse: 5.3.0 1873 | picomatch: 4.0.2 1874 | transitivePeerDependencies: 1875 | - supports-color 1876 | - typescript 1877 | 1878 | '@susisu/eslint-config@0.0.97(eslint@9.26.0)(typescript@5.8.3)': 1879 | dependencies: 1880 | '@eslint/config-helpers': 0.2.2 1881 | '@stylistic/eslint-plugin': 4.2.0(eslint@9.26.0)(typescript@5.8.3) 1882 | '@susisu/eslint-plugin-safe-typescript': 0.9.4(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) 1883 | '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) 1884 | '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1885 | eslint: 9.26.0 1886 | eslint-config-prettier: 10.1.5(eslint@9.26.0) 1887 | transitivePeerDependencies: 1888 | - supports-color 1889 | - typescript 1890 | - typescript-eslint 1891 | 1892 | '@susisu/eslint-plugin-safe-typescript@0.9.4(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': 1893 | dependencies: 1894 | '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1895 | eslint: 9.26.0 1896 | typescript: 5.8.3 1897 | optionalDependencies: 1898 | '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1899 | transitivePeerDependencies: 1900 | - supports-color 1901 | 1902 | '@types/estree@1.0.7': {} 1903 | 1904 | '@types/json-schema@7.0.15': {} 1905 | 1906 | '@types/node@22.15.18': 1907 | dependencies: 1908 | undici-types: 6.21.0 1909 | 1910 | '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': 1911 | dependencies: 1912 | '@eslint-community/regexpp': 4.12.1 1913 | '@typescript-eslint/parser': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1914 | '@typescript-eslint/scope-manager': 8.32.1 1915 | '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1916 | '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1917 | '@typescript-eslint/visitor-keys': 8.32.1 1918 | eslint: 9.26.0 1919 | graphemer: 1.4.0 1920 | ignore: 7.0.4 1921 | natural-compare: 1.4.0 1922 | ts-api-utils: 2.1.0(typescript@5.8.3) 1923 | typescript: 5.8.3 1924 | transitivePeerDependencies: 1925 | - supports-color 1926 | 1927 | '@typescript-eslint/parser@8.32.1(eslint@9.26.0)(typescript@5.8.3)': 1928 | dependencies: 1929 | '@typescript-eslint/scope-manager': 8.32.1 1930 | '@typescript-eslint/types': 8.32.1 1931 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 1932 | '@typescript-eslint/visitor-keys': 8.32.1 1933 | debug: 4.4.1 1934 | eslint: 9.26.0 1935 | typescript: 5.8.3 1936 | transitivePeerDependencies: 1937 | - supports-color 1938 | 1939 | '@typescript-eslint/scope-manager@8.32.1': 1940 | dependencies: 1941 | '@typescript-eslint/types': 8.32.1 1942 | '@typescript-eslint/visitor-keys': 8.32.1 1943 | 1944 | '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0)(typescript@5.8.3)': 1945 | dependencies: 1946 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 1947 | '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 1948 | debug: 4.4.1 1949 | eslint: 9.26.0 1950 | ts-api-utils: 2.1.0(typescript@5.8.3) 1951 | typescript: 5.8.3 1952 | transitivePeerDependencies: 1953 | - supports-color 1954 | 1955 | '@typescript-eslint/types@8.32.1': {} 1956 | 1957 | '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': 1958 | dependencies: 1959 | '@typescript-eslint/types': 8.32.1 1960 | '@typescript-eslint/visitor-keys': 8.32.1 1961 | debug: 4.4.1 1962 | fast-glob: 3.3.3 1963 | is-glob: 4.0.3 1964 | minimatch: 9.0.5 1965 | semver: 7.7.2 1966 | ts-api-utils: 2.1.0(typescript@5.8.3) 1967 | typescript: 5.8.3 1968 | transitivePeerDependencies: 1969 | - supports-color 1970 | 1971 | '@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3)': 1972 | dependencies: 1973 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) 1974 | '@typescript-eslint/scope-manager': 8.32.1 1975 | '@typescript-eslint/types': 8.32.1 1976 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 1977 | eslint: 9.26.0 1978 | typescript: 5.8.3 1979 | transitivePeerDependencies: 1980 | - supports-color 1981 | 1982 | '@typescript-eslint/visitor-keys@8.32.1': 1983 | dependencies: 1984 | '@typescript-eslint/types': 8.32.1 1985 | eslint-visitor-keys: 4.2.0 1986 | 1987 | '@vitest/coverage-v8@3.1.3(vitest@3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0))': 1988 | dependencies: 1989 | '@ampproject/remapping': 2.3.0 1990 | '@bcoe/v8-coverage': 1.0.2 1991 | debug: 4.4.1 1992 | istanbul-lib-coverage: 3.2.2 1993 | istanbul-lib-report: 3.0.1 1994 | istanbul-lib-source-maps: 5.0.6 1995 | istanbul-reports: 3.1.7 1996 | magic-string: 0.30.17 1997 | magicast: 0.3.5 1998 | std-env: 3.9.0 1999 | test-exclude: 7.0.1 2000 | tinyrainbow: 2.0.0 2001 | vitest: 3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0) 2002 | transitivePeerDependencies: 2003 | - supports-color 2004 | 2005 | '@vitest/eslint-plugin@1.1.44(@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0))': 2006 | dependencies: 2007 | '@typescript-eslint/utils': 8.32.1(eslint@9.26.0)(typescript@5.8.3) 2008 | eslint: 9.26.0 2009 | optionalDependencies: 2010 | typescript: 5.8.3 2011 | vitest: 3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0) 2012 | 2013 | '@vitest/expect@3.1.3': 2014 | dependencies: 2015 | '@vitest/spy': 3.1.3 2016 | '@vitest/utils': 3.1.3 2017 | chai: 5.2.0 2018 | tinyrainbow: 2.0.0 2019 | 2020 | '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0))': 2021 | dependencies: 2022 | '@vitest/spy': 3.1.3 2023 | estree-walker: 3.0.3 2024 | magic-string: 0.30.17 2025 | optionalDependencies: 2026 | vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0) 2027 | 2028 | '@vitest/pretty-format@3.1.3': 2029 | dependencies: 2030 | tinyrainbow: 2.0.0 2031 | 2032 | '@vitest/runner@3.1.3': 2033 | dependencies: 2034 | '@vitest/utils': 3.1.3 2035 | pathe: 2.0.3 2036 | 2037 | '@vitest/snapshot@3.1.3': 2038 | dependencies: 2039 | '@vitest/pretty-format': 3.1.3 2040 | magic-string: 0.30.17 2041 | pathe: 2.0.3 2042 | 2043 | '@vitest/spy@3.1.3': 2044 | dependencies: 2045 | tinyspy: 3.0.2 2046 | 2047 | '@vitest/utils@3.1.3': 2048 | dependencies: 2049 | '@vitest/pretty-format': 3.1.3 2050 | loupe: 3.1.3 2051 | tinyrainbow: 2.0.0 2052 | 2053 | accepts@2.0.0: 2054 | dependencies: 2055 | mime-types: 3.0.1 2056 | negotiator: 1.0.0 2057 | 2058 | acorn-jsx@5.3.2(acorn@8.14.1): 2059 | dependencies: 2060 | acorn: 8.14.1 2061 | 2062 | acorn@8.14.1: {} 2063 | 2064 | ajv@6.12.6: 2065 | dependencies: 2066 | fast-deep-equal: 3.1.3 2067 | fast-json-stable-stringify: 2.1.0 2068 | json-schema-traverse: 0.4.1 2069 | uri-js: 4.4.1 2070 | 2071 | ansi-regex@5.0.1: {} 2072 | 2073 | ansi-regex@6.1.0: {} 2074 | 2075 | ansi-styles@4.3.0: 2076 | dependencies: 2077 | color-convert: 2.0.1 2078 | 2079 | ansi-styles@6.2.1: {} 2080 | 2081 | argparse@2.0.1: {} 2082 | 2083 | assertion-error@2.0.1: {} 2084 | 2085 | balanced-match@1.0.2: {} 2086 | 2087 | body-parser@2.2.0: 2088 | dependencies: 2089 | bytes: 3.1.2 2090 | content-type: 1.0.5 2091 | debug: 4.4.1 2092 | http-errors: 2.0.0 2093 | iconv-lite: 0.6.3 2094 | on-finished: 2.4.1 2095 | qs: 6.14.0 2096 | raw-body: 3.0.0 2097 | type-is: 2.0.1 2098 | transitivePeerDependencies: 2099 | - supports-color 2100 | 2101 | brace-expansion@1.1.11: 2102 | dependencies: 2103 | balanced-match: 1.0.2 2104 | concat-map: 0.0.1 2105 | 2106 | brace-expansion@2.0.1: 2107 | dependencies: 2108 | balanced-match: 1.0.2 2109 | 2110 | braces@3.0.3: 2111 | dependencies: 2112 | fill-range: 7.1.1 2113 | 2114 | bytes@3.1.2: {} 2115 | 2116 | cac@6.7.14: {} 2117 | 2118 | call-bind-apply-helpers@1.0.2: 2119 | dependencies: 2120 | es-errors: 1.3.0 2121 | function-bind: 1.1.2 2122 | 2123 | call-bound@1.0.4: 2124 | dependencies: 2125 | call-bind-apply-helpers: 1.0.2 2126 | get-intrinsic: 1.3.0 2127 | 2128 | callsites@3.1.0: {} 2129 | 2130 | chai@5.2.0: 2131 | dependencies: 2132 | assertion-error: 2.0.1 2133 | check-error: 2.1.1 2134 | deep-eql: 5.0.2 2135 | loupe: 3.1.3 2136 | pathval: 2.0.0 2137 | 2138 | chalk@4.1.2: 2139 | dependencies: 2140 | ansi-styles: 4.3.0 2141 | supports-color: 7.2.0 2142 | 2143 | check-error@2.1.1: {} 2144 | 2145 | color-convert@2.0.1: 2146 | dependencies: 2147 | color-name: 1.1.4 2148 | 2149 | color-name@1.1.4: {} 2150 | 2151 | concat-map@0.0.1: {} 2152 | 2153 | content-disposition@1.0.0: 2154 | dependencies: 2155 | safe-buffer: 5.2.1 2156 | 2157 | content-type@1.0.5: {} 2158 | 2159 | cookie-signature@1.2.2: {} 2160 | 2161 | cookie@0.7.2: {} 2162 | 2163 | cors@2.8.5: 2164 | dependencies: 2165 | object-assign: 4.1.1 2166 | vary: 1.1.2 2167 | 2168 | cross-spawn@7.0.6: 2169 | dependencies: 2170 | path-key: 3.1.1 2171 | shebang-command: 2.0.0 2172 | which: 2.0.2 2173 | 2174 | debug@4.4.1: 2175 | dependencies: 2176 | ms: 2.1.3 2177 | 2178 | deep-eql@5.0.2: {} 2179 | 2180 | deep-is@0.1.4: {} 2181 | 2182 | depd@2.0.0: {} 2183 | 2184 | dunder-proto@1.0.1: 2185 | dependencies: 2186 | call-bind-apply-helpers: 1.0.2 2187 | es-errors: 1.3.0 2188 | gopd: 1.2.0 2189 | 2190 | eastasianwidth@0.2.0: {} 2191 | 2192 | ee-first@1.1.1: {} 2193 | 2194 | emoji-regex@8.0.0: {} 2195 | 2196 | emoji-regex@9.2.2: {} 2197 | 2198 | encodeurl@2.0.0: {} 2199 | 2200 | es-define-property@1.0.1: {} 2201 | 2202 | es-errors@1.3.0: {} 2203 | 2204 | es-module-lexer@1.7.0: {} 2205 | 2206 | es-object-atoms@1.1.1: 2207 | dependencies: 2208 | es-errors: 1.3.0 2209 | 2210 | esbuild@0.25.4: 2211 | optionalDependencies: 2212 | '@esbuild/aix-ppc64': 0.25.4 2213 | '@esbuild/android-arm': 0.25.4 2214 | '@esbuild/android-arm64': 0.25.4 2215 | '@esbuild/android-x64': 0.25.4 2216 | '@esbuild/darwin-arm64': 0.25.4 2217 | '@esbuild/darwin-x64': 0.25.4 2218 | '@esbuild/freebsd-arm64': 0.25.4 2219 | '@esbuild/freebsd-x64': 0.25.4 2220 | '@esbuild/linux-arm': 0.25.4 2221 | '@esbuild/linux-arm64': 0.25.4 2222 | '@esbuild/linux-ia32': 0.25.4 2223 | '@esbuild/linux-loong64': 0.25.4 2224 | '@esbuild/linux-mips64el': 0.25.4 2225 | '@esbuild/linux-ppc64': 0.25.4 2226 | '@esbuild/linux-riscv64': 0.25.4 2227 | '@esbuild/linux-s390x': 0.25.4 2228 | '@esbuild/linux-x64': 0.25.4 2229 | '@esbuild/netbsd-arm64': 0.25.4 2230 | '@esbuild/netbsd-x64': 0.25.4 2231 | '@esbuild/openbsd-arm64': 0.25.4 2232 | '@esbuild/openbsd-x64': 0.25.4 2233 | '@esbuild/sunos-x64': 0.25.4 2234 | '@esbuild/win32-arm64': 0.25.4 2235 | '@esbuild/win32-ia32': 0.25.4 2236 | '@esbuild/win32-x64': 0.25.4 2237 | 2238 | escape-html@1.0.3: {} 2239 | 2240 | escape-string-regexp@4.0.0: {} 2241 | 2242 | eslint-config-prettier@10.1.5(eslint@9.26.0): 2243 | dependencies: 2244 | eslint: 9.26.0 2245 | 2246 | eslint-scope@8.3.0: 2247 | dependencies: 2248 | esrecurse: 4.3.0 2249 | estraverse: 5.3.0 2250 | 2251 | eslint-visitor-keys@3.4.3: {} 2252 | 2253 | eslint-visitor-keys@4.2.0: {} 2254 | 2255 | eslint@9.26.0: 2256 | dependencies: 2257 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) 2258 | '@eslint-community/regexpp': 4.12.1 2259 | '@eslint/config-array': 0.20.0 2260 | '@eslint/config-helpers': 0.2.2 2261 | '@eslint/core': 0.13.0 2262 | '@eslint/eslintrc': 3.3.1 2263 | '@eslint/js': 9.26.0 2264 | '@eslint/plugin-kit': 0.2.8 2265 | '@humanfs/node': 0.16.6 2266 | '@humanwhocodes/module-importer': 1.0.1 2267 | '@humanwhocodes/retry': 0.4.3 2268 | '@modelcontextprotocol/sdk': 1.11.3 2269 | '@types/estree': 1.0.7 2270 | '@types/json-schema': 7.0.15 2271 | ajv: 6.12.6 2272 | chalk: 4.1.2 2273 | cross-spawn: 7.0.6 2274 | debug: 4.4.1 2275 | escape-string-regexp: 4.0.0 2276 | eslint-scope: 8.3.0 2277 | eslint-visitor-keys: 4.2.0 2278 | espree: 10.3.0 2279 | esquery: 1.6.0 2280 | esutils: 2.0.3 2281 | fast-deep-equal: 3.1.3 2282 | file-entry-cache: 8.0.0 2283 | find-up: 5.0.0 2284 | glob-parent: 6.0.2 2285 | ignore: 5.3.2 2286 | imurmurhash: 0.1.4 2287 | is-glob: 4.0.3 2288 | json-stable-stringify-without-jsonify: 1.0.1 2289 | lodash.merge: 4.6.2 2290 | minimatch: 3.1.2 2291 | natural-compare: 1.4.0 2292 | optionator: 0.9.4 2293 | zod: 3.24.4 2294 | transitivePeerDependencies: 2295 | - supports-color 2296 | 2297 | espree@10.3.0: 2298 | dependencies: 2299 | acorn: 8.14.1 2300 | acorn-jsx: 5.3.2(acorn@8.14.1) 2301 | eslint-visitor-keys: 4.2.0 2302 | 2303 | esquery@1.6.0: 2304 | dependencies: 2305 | estraverse: 5.3.0 2306 | 2307 | esrecurse@4.3.0: 2308 | dependencies: 2309 | estraverse: 5.3.0 2310 | 2311 | estraverse@5.3.0: {} 2312 | 2313 | estree-walker@3.0.3: 2314 | dependencies: 2315 | '@types/estree': 1.0.7 2316 | 2317 | esutils@2.0.3: {} 2318 | 2319 | etag@1.8.1: {} 2320 | 2321 | eventsource-parser@3.0.2: {} 2322 | 2323 | eventsource@3.0.7: 2324 | dependencies: 2325 | eventsource-parser: 3.0.2 2326 | 2327 | expect-type@1.2.1: {} 2328 | 2329 | express-rate-limit@7.5.0(express@5.1.0): 2330 | dependencies: 2331 | express: 5.1.0 2332 | 2333 | express@5.1.0: 2334 | dependencies: 2335 | accepts: 2.0.0 2336 | body-parser: 2.2.0 2337 | content-disposition: 1.0.0 2338 | content-type: 1.0.5 2339 | cookie: 0.7.2 2340 | cookie-signature: 1.2.2 2341 | debug: 4.4.1 2342 | encodeurl: 2.0.0 2343 | escape-html: 1.0.3 2344 | etag: 1.8.1 2345 | finalhandler: 2.1.0 2346 | fresh: 2.0.0 2347 | http-errors: 2.0.0 2348 | merge-descriptors: 2.0.0 2349 | mime-types: 3.0.1 2350 | on-finished: 2.4.1 2351 | once: 1.4.0 2352 | parseurl: 1.3.3 2353 | proxy-addr: 2.0.7 2354 | qs: 6.14.0 2355 | range-parser: 1.2.1 2356 | router: 2.2.0 2357 | send: 1.2.0 2358 | serve-static: 2.2.0 2359 | statuses: 2.0.1 2360 | type-is: 2.0.1 2361 | vary: 1.1.2 2362 | transitivePeerDependencies: 2363 | - supports-color 2364 | 2365 | fast-deep-equal@3.1.3: {} 2366 | 2367 | fast-glob@3.3.3: 2368 | dependencies: 2369 | '@nodelib/fs.stat': 2.0.5 2370 | '@nodelib/fs.walk': 1.2.8 2371 | glob-parent: 5.1.2 2372 | merge2: 1.4.1 2373 | micromatch: 4.0.8 2374 | 2375 | fast-json-stable-stringify@2.1.0: {} 2376 | 2377 | fast-levenshtein@2.0.6: {} 2378 | 2379 | fastq@1.19.1: 2380 | dependencies: 2381 | reusify: 1.1.0 2382 | 2383 | fdir@6.4.4(picomatch@4.0.2): 2384 | optionalDependencies: 2385 | picomatch: 4.0.2 2386 | 2387 | file-entry-cache@8.0.0: 2388 | dependencies: 2389 | flat-cache: 4.0.1 2390 | 2391 | fill-range@7.1.1: 2392 | dependencies: 2393 | to-regex-range: 5.0.1 2394 | 2395 | finalhandler@2.1.0: 2396 | dependencies: 2397 | debug: 4.4.1 2398 | encodeurl: 2.0.0 2399 | escape-html: 1.0.3 2400 | on-finished: 2.4.1 2401 | parseurl: 1.3.3 2402 | statuses: 2.0.1 2403 | transitivePeerDependencies: 2404 | - supports-color 2405 | 2406 | find-up@5.0.0: 2407 | dependencies: 2408 | locate-path: 6.0.0 2409 | path-exists: 4.0.0 2410 | 2411 | flat-cache@4.0.1: 2412 | dependencies: 2413 | flatted: 3.3.3 2414 | keyv: 4.5.4 2415 | 2416 | flatted@3.3.3: {} 2417 | 2418 | foreground-child@3.3.1: 2419 | dependencies: 2420 | cross-spawn: 7.0.6 2421 | signal-exit: 4.1.0 2422 | 2423 | forwarded@0.2.0: {} 2424 | 2425 | fresh@2.0.0: {} 2426 | 2427 | fsevents@2.3.3: 2428 | optional: true 2429 | 2430 | function-bind@1.1.2: {} 2431 | 2432 | get-intrinsic@1.3.0: 2433 | dependencies: 2434 | call-bind-apply-helpers: 1.0.2 2435 | es-define-property: 1.0.1 2436 | es-errors: 1.3.0 2437 | es-object-atoms: 1.1.1 2438 | function-bind: 1.1.2 2439 | get-proto: 1.0.1 2440 | gopd: 1.2.0 2441 | has-symbols: 1.1.0 2442 | hasown: 2.0.2 2443 | math-intrinsics: 1.1.0 2444 | 2445 | get-proto@1.0.1: 2446 | dependencies: 2447 | dunder-proto: 1.0.1 2448 | es-object-atoms: 1.1.1 2449 | 2450 | get-tsconfig@4.10.0: 2451 | dependencies: 2452 | resolve-pkg-maps: 1.0.0 2453 | 2454 | glob-parent@5.1.2: 2455 | dependencies: 2456 | is-glob: 4.0.3 2457 | 2458 | glob-parent@6.0.2: 2459 | dependencies: 2460 | is-glob: 4.0.3 2461 | 2462 | glob@10.4.5: 2463 | dependencies: 2464 | foreground-child: 3.3.1 2465 | jackspeak: 3.4.3 2466 | minimatch: 9.0.5 2467 | minipass: 7.1.2 2468 | package-json-from-dist: 1.0.1 2469 | path-scurry: 1.11.1 2470 | 2471 | glob@11.0.2: 2472 | dependencies: 2473 | foreground-child: 3.3.1 2474 | jackspeak: 4.1.0 2475 | minimatch: 10.0.1 2476 | minipass: 7.1.2 2477 | package-json-from-dist: 1.0.1 2478 | path-scurry: 2.0.0 2479 | 2480 | globals@14.0.0: {} 2481 | 2482 | globals@16.1.0: {} 2483 | 2484 | gopd@1.2.0: {} 2485 | 2486 | graphemer@1.4.0: {} 2487 | 2488 | has-flag@4.0.0: {} 2489 | 2490 | has-symbols@1.1.0: {} 2491 | 2492 | hasown@2.0.2: 2493 | dependencies: 2494 | function-bind: 1.1.2 2495 | 2496 | html-escaper@2.0.2: {} 2497 | 2498 | http-errors@2.0.0: 2499 | dependencies: 2500 | depd: 2.0.0 2501 | inherits: 2.0.4 2502 | setprototypeof: 1.2.0 2503 | statuses: 2.0.1 2504 | toidentifier: 1.0.1 2505 | 2506 | iconv-lite@0.6.3: 2507 | dependencies: 2508 | safer-buffer: 2.1.2 2509 | 2510 | ignore@5.3.2: {} 2511 | 2512 | ignore@7.0.4: {} 2513 | 2514 | import-fresh@3.3.1: 2515 | dependencies: 2516 | parent-module: 1.0.1 2517 | resolve-from: 4.0.0 2518 | 2519 | imurmurhash@0.1.4: {} 2520 | 2521 | inherits@2.0.4: {} 2522 | 2523 | ipaddr.js@1.9.1: {} 2524 | 2525 | is-extglob@2.1.1: {} 2526 | 2527 | is-fullwidth-code-point@3.0.0: {} 2528 | 2529 | is-glob@4.0.3: 2530 | dependencies: 2531 | is-extglob: 2.1.1 2532 | 2533 | is-number@7.0.0: {} 2534 | 2535 | is-promise@4.0.0: {} 2536 | 2537 | isexe@2.0.0: {} 2538 | 2539 | isexe@3.1.1: {} 2540 | 2541 | istanbul-lib-coverage@3.2.2: {} 2542 | 2543 | istanbul-lib-report@3.0.1: 2544 | dependencies: 2545 | istanbul-lib-coverage: 3.2.2 2546 | make-dir: 4.0.0 2547 | supports-color: 7.2.0 2548 | 2549 | istanbul-lib-source-maps@5.0.6: 2550 | dependencies: 2551 | '@jridgewell/trace-mapping': 0.3.25 2552 | debug: 4.4.1 2553 | istanbul-lib-coverage: 3.2.2 2554 | transitivePeerDependencies: 2555 | - supports-color 2556 | 2557 | istanbul-reports@3.1.7: 2558 | dependencies: 2559 | html-escaper: 2.0.2 2560 | istanbul-lib-report: 3.0.1 2561 | 2562 | jackspeak@3.4.3: 2563 | dependencies: 2564 | '@isaacs/cliui': 8.0.2 2565 | optionalDependencies: 2566 | '@pkgjs/parseargs': 0.11.0 2567 | 2568 | jackspeak@4.1.0: 2569 | dependencies: 2570 | '@isaacs/cliui': 8.0.2 2571 | 2572 | js-yaml@4.1.0: 2573 | dependencies: 2574 | argparse: 2.0.1 2575 | 2576 | json-buffer@3.0.1: {} 2577 | 2578 | json-parse-even-better-errors@4.0.0: {} 2579 | 2580 | json-schema-traverse@0.4.1: {} 2581 | 2582 | json-stable-stringify-without-jsonify@1.0.1: {} 2583 | 2584 | keyv@4.5.4: 2585 | dependencies: 2586 | json-buffer: 3.0.1 2587 | 2588 | levn@0.4.1: 2589 | dependencies: 2590 | prelude-ls: 1.2.1 2591 | type-check: 0.4.0 2592 | 2593 | locate-path@6.0.0: 2594 | dependencies: 2595 | p-locate: 5.0.0 2596 | 2597 | lodash.merge@4.6.2: {} 2598 | 2599 | loupe@3.1.3: {} 2600 | 2601 | lru-cache@10.4.3: {} 2602 | 2603 | lru-cache@11.1.0: {} 2604 | 2605 | magic-string@0.30.17: 2606 | dependencies: 2607 | '@jridgewell/sourcemap-codec': 1.5.0 2608 | 2609 | magicast@0.3.5: 2610 | dependencies: 2611 | '@babel/parser': 7.27.2 2612 | '@babel/types': 7.27.1 2613 | source-map-js: 1.2.1 2614 | 2615 | make-dir@4.0.0: 2616 | dependencies: 2617 | semver: 7.7.2 2618 | 2619 | math-intrinsics@1.1.0: {} 2620 | 2621 | media-typer@1.1.0: {} 2622 | 2623 | memorystream@0.3.1: {} 2624 | 2625 | merge-descriptors@2.0.0: {} 2626 | 2627 | merge2@1.4.1: {} 2628 | 2629 | micromatch@4.0.8: 2630 | dependencies: 2631 | braces: 3.0.3 2632 | picomatch: 2.3.1 2633 | 2634 | mime-db@1.54.0: {} 2635 | 2636 | mime-types@3.0.1: 2637 | dependencies: 2638 | mime-db: 1.54.0 2639 | 2640 | minimatch@10.0.1: 2641 | dependencies: 2642 | brace-expansion: 2.0.1 2643 | 2644 | minimatch@3.1.2: 2645 | dependencies: 2646 | brace-expansion: 1.1.11 2647 | 2648 | minimatch@9.0.5: 2649 | dependencies: 2650 | brace-expansion: 2.0.1 2651 | 2652 | minipass@7.1.2: {} 2653 | 2654 | ms@2.1.3: {} 2655 | 2656 | nanoid@3.3.11: {} 2657 | 2658 | natural-compare@1.4.0: {} 2659 | 2660 | negotiator@1.0.0: {} 2661 | 2662 | npm-normalize-package-bin@4.0.0: {} 2663 | 2664 | npm-run-all2@8.0.1: 2665 | dependencies: 2666 | ansi-styles: 6.2.1 2667 | cross-spawn: 7.0.6 2668 | memorystream: 0.3.1 2669 | minimatch: 10.0.1 2670 | pidtree: 0.6.0 2671 | read-package-json-fast: 4.0.0 2672 | shell-quote: 1.8.2 2673 | which: 5.0.0 2674 | 2675 | object-assign@4.1.1: {} 2676 | 2677 | object-inspect@1.13.4: {} 2678 | 2679 | on-finished@2.4.1: 2680 | dependencies: 2681 | ee-first: 1.1.1 2682 | 2683 | once@1.4.0: 2684 | dependencies: 2685 | wrappy: 1.0.2 2686 | 2687 | optionator@0.9.4: 2688 | dependencies: 2689 | deep-is: 0.1.4 2690 | fast-levenshtein: 2.0.6 2691 | levn: 0.4.1 2692 | prelude-ls: 1.2.1 2693 | type-check: 0.4.0 2694 | word-wrap: 1.2.5 2695 | 2696 | p-limit@3.1.0: 2697 | dependencies: 2698 | yocto-queue: 0.1.0 2699 | 2700 | p-locate@5.0.0: 2701 | dependencies: 2702 | p-limit: 3.1.0 2703 | 2704 | package-json-from-dist@1.0.1: {} 2705 | 2706 | parent-module@1.0.1: 2707 | dependencies: 2708 | callsites: 3.1.0 2709 | 2710 | parseurl@1.3.3: {} 2711 | 2712 | path-exists@4.0.0: {} 2713 | 2714 | path-key@3.1.1: {} 2715 | 2716 | path-scurry@1.11.1: 2717 | dependencies: 2718 | lru-cache: 10.4.3 2719 | minipass: 7.1.2 2720 | 2721 | path-scurry@2.0.0: 2722 | dependencies: 2723 | lru-cache: 11.1.0 2724 | minipass: 7.1.2 2725 | 2726 | path-to-regexp@8.2.0: {} 2727 | 2728 | pathe@2.0.3: {} 2729 | 2730 | pathval@2.0.0: {} 2731 | 2732 | picocolors@1.1.1: {} 2733 | 2734 | picomatch@2.3.1: {} 2735 | 2736 | picomatch@4.0.2: {} 2737 | 2738 | pidtree@0.6.0: {} 2739 | 2740 | pkce-challenge@5.0.0: {} 2741 | 2742 | postcss@8.5.3: 2743 | dependencies: 2744 | nanoid: 3.3.11 2745 | picocolors: 1.1.1 2746 | source-map-js: 1.2.1 2747 | 2748 | prelude-ls@1.2.1: {} 2749 | 2750 | prettier@3.5.3: {} 2751 | 2752 | proxy-addr@2.0.7: 2753 | dependencies: 2754 | forwarded: 0.2.0 2755 | ipaddr.js: 1.9.1 2756 | 2757 | punycode@2.3.1: {} 2758 | 2759 | qs@6.14.0: 2760 | dependencies: 2761 | side-channel: 1.1.0 2762 | 2763 | queue-microtask@1.2.3: {} 2764 | 2765 | range-parser@1.2.1: {} 2766 | 2767 | raw-body@3.0.0: 2768 | dependencies: 2769 | bytes: 3.1.2 2770 | http-errors: 2.0.0 2771 | iconv-lite: 0.6.3 2772 | unpipe: 1.0.0 2773 | 2774 | read-package-json-fast@4.0.0: 2775 | dependencies: 2776 | json-parse-even-better-errors: 4.0.0 2777 | npm-normalize-package-bin: 4.0.0 2778 | 2779 | resolve-from@4.0.0: {} 2780 | 2781 | resolve-pkg-maps@1.0.0: {} 2782 | 2783 | reusify@1.1.0: {} 2784 | 2785 | rimraf@6.0.1: 2786 | dependencies: 2787 | glob: 11.0.2 2788 | package-json-from-dist: 1.0.1 2789 | 2790 | rollup@4.40.2: 2791 | dependencies: 2792 | '@types/estree': 1.0.7 2793 | optionalDependencies: 2794 | '@rollup/rollup-android-arm-eabi': 4.40.2 2795 | '@rollup/rollup-android-arm64': 4.40.2 2796 | '@rollup/rollup-darwin-arm64': 4.40.2 2797 | '@rollup/rollup-darwin-x64': 4.40.2 2798 | '@rollup/rollup-freebsd-arm64': 4.40.2 2799 | '@rollup/rollup-freebsd-x64': 4.40.2 2800 | '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 2801 | '@rollup/rollup-linux-arm-musleabihf': 4.40.2 2802 | '@rollup/rollup-linux-arm64-gnu': 4.40.2 2803 | '@rollup/rollup-linux-arm64-musl': 4.40.2 2804 | '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 2805 | '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 2806 | '@rollup/rollup-linux-riscv64-gnu': 4.40.2 2807 | '@rollup/rollup-linux-riscv64-musl': 4.40.2 2808 | '@rollup/rollup-linux-s390x-gnu': 4.40.2 2809 | '@rollup/rollup-linux-x64-gnu': 4.40.2 2810 | '@rollup/rollup-linux-x64-musl': 4.40.2 2811 | '@rollup/rollup-win32-arm64-msvc': 4.40.2 2812 | '@rollup/rollup-win32-ia32-msvc': 4.40.2 2813 | '@rollup/rollup-win32-x64-msvc': 4.40.2 2814 | fsevents: 2.3.3 2815 | 2816 | router@2.2.0: 2817 | dependencies: 2818 | debug: 4.4.1 2819 | depd: 2.0.0 2820 | is-promise: 4.0.0 2821 | parseurl: 1.3.3 2822 | path-to-regexp: 8.2.0 2823 | transitivePeerDependencies: 2824 | - supports-color 2825 | 2826 | run-parallel@1.2.0: 2827 | dependencies: 2828 | queue-microtask: 1.2.3 2829 | 2830 | safe-buffer@5.2.1: {} 2831 | 2832 | safer-buffer@2.1.2: {} 2833 | 2834 | semver@7.7.2: {} 2835 | 2836 | send@1.2.0: 2837 | dependencies: 2838 | debug: 4.4.1 2839 | encodeurl: 2.0.0 2840 | escape-html: 1.0.3 2841 | etag: 1.8.1 2842 | fresh: 2.0.0 2843 | http-errors: 2.0.0 2844 | mime-types: 3.0.1 2845 | ms: 2.1.3 2846 | on-finished: 2.4.1 2847 | range-parser: 1.2.1 2848 | statuses: 2.0.1 2849 | transitivePeerDependencies: 2850 | - supports-color 2851 | 2852 | serve-static@2.2.0: 2853 | dependencies: 2854 | encodeurl: 2.0.0 2855 | escape-html: 1.0.3 2856 | parseurl: 1.3.3 2857 | send: 1.2.0 2858 | transitivePeerDependencies: 2859 | - supports-color 2860 | 2861 | setprototypeof@1.2.0: {} 2862 | 2863 | shebang-command@2.0.0: 2864 | dependencies: 2865 | shebang-regex: 3.0.0 2866 | 2867 | shebang-regex@3.0.0: {} 2868 | 2869 | shell-quote@1.8.2: {} 2870 | 2871 | side-channel-list@1.0.0: 2872 | dependencies: 2873 | es-errors: 1.3.0 2874 | object-inspect: 1.13.4 2875 | 2876 | side-channel-map@1.0.1: 2877 | dependencies: 2878 | call-bound: 1.0.4 2879 | es-errors: 1.3.0 2880 | get-intrinsic: 1.3.0 2881 | object-inspect: 1.13.4 2882 | 2883 | side-channel-weakmap@1.0.2: 2884 | dependencies: 2885 | call-bound: 1.0.4 2886 | es-errors: 1.3.0 2887 | get-intrinsic: 1.3.0 2888 | object-inspect: 1.13.4 2889 | side-channel-map: 1.0.1 2890 | 2891 | side-channel@1.1.0: 2892 | dependencies: 2893 | es-errors: 1.3.0 2894 | object-inspect: 1.13.4 2895 | side-channel-list: 1.0.0 2896 | side-channel-map: 1.0.1 2897 | side-channel-weakmap: 1.0.2 2898 | 2899 | siginfo@2.0.0: {} 2900 | 2901 | signal-exit@4.1.0: {} 2902 | 2903 | source-map-js@1.2.1: {} 2904 | 2905 | stackback@0.0.2: {} 2906 | 2907 | statuses@2.0.1: {} 2908 | 2909 | std-env@3.9.0: {} 2910 | 2911 | string-width@4.2.3: 2912 | dependencies: 2913 | emoji-regex: 8.0.0 2914 | is-fullwidth-code-point: 3.0.0 2915 | strip-ansi: 6.0.1 2916 | 2917 | string-width@5.1.2: 2918 | dependencies: 2919 | eastasianwidth: 0.2.0 2920 | emoji-regex: 9.2.2 2921 | strip-ansi: 7.1.0 2922 | 2923 | strip-ansi@6.0.1: 2924 | dependencies: 2925 | ansi-regex: 5.0.1 2926 | 2927 | strip-ansi@7.1.0: 2928 | dependencies: 2929 | ansi-regex: 6.1.0 2930 | 2931 | strip-json-comments@3.1.1: {} 2932 | 2933 | supports-color@7.2.0: 2934 | dependencies: 2935 | has-flag: 4.0.0 2936 | 2937 | test-exclude@7.0.1: 2938 | dependencies: 2939 | '@istanbuljs/schema': 0.1.3 2940 | glob: 10.4.5 2941 | minimatch: 9.0.5 2942 | 2943 | tinybench@2.9.0: {} 2944 | 2945 | tinyexec@0.3.2: {} 2946 | 2947 | tinyglobby@0.2.13: 2948 | dependencies: 2949 | fdir: 6.4.4(picomatch@4.0.2) 2950 | picomatch: 4.0.2 2951 | 2952 | tinypool@1.0.2: {} 2953 | 2954 | tinyrainbow@2.0.0: {} 2955 | 2956 | tinyspy@3.0.2: {} 2957 | 2958 | to-regex-range@5.0.1: 2959 | dependencies: 2960 | is-number: 7.0.0 2961 | 2962 | toidentifier@1.0.1: {} 2963 | 2964 | ts-api-utils@2.1.0(typescript@5.8.3): 2965 | dependencies: 2966 | typescript: 5.8.3 2967 | 2968 | tsx@4.19.4: 2969 | dependencies: 2970 | esbuild: 0.25.4 2971 | get-tsconfig: 4.10.0 2972 | optionalDependencies: 2973 | fsevents: 2.3.3 2974 | 2975 | type-check@0.4.0: 2976 | dependencies: 2977 | prelude-ls: 1.2.1 2978 | 2979 | type-is@2.0.1: 2980 | dependencies: 2981 | content-type: 1.0.5 2982 | media-typer: 1.1.0 2983 | mime-types: 3.0.1 2984 | 2985 | typescript@5.8.3: {} 2986 | 2987 | undici-types@6.21.0: {} 2988 | 2989 | unpipe@1.0.0: {} 2990 | 2991 | uri-js@4.4.1: 2992 | dependencies: 2993 | punycode: 2.3.1 2994 | 2995 | vary@1.1.2: {} 2996 | 2997 | vite-node@3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0): 2998 | dependencies: 2999 | cac: 6.7.14 3000 | debug: 4.4.1 3001 | es-module-lexer: 1.7.0 3002 | pathe: 2.0.3 3003 | vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0) 3004 | transitivePeerDependencies: 3005 | - '@types/node' 3006 | - jiti 3007 | - less 3008 | - lightningcss 3009 | - sass 3010 | - sass-embedded 3011 | - stylus 3012 | - sugarss 3013 | - supports-color 3014 | - terser 3015 | - tsx 3016 | - yaml 3017 | 3018 | vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0): 3019 | dependencies: 3020 | esbuild: 0.25.4 3021 | fdir: 6.4.4(picomatch@4.0.2) 3022 | picomatch: 4.0.2 3023 | postcss: 8.5.3 3024 | rollup: 4.40.2 3025 | tinyglobby: 0.2.13 3026 | optionalDependencies: 3027 | '@types/node': 22.15.18 3028 | fsevents: 2.3.3 3029 | tsx: 4.19.4 3030 | yaml: 2.6.0 3031 | 3032 | vitest@3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0): 3033 | dependencies: 3034 | '@vitest/expect': 3.1.3 3035 | '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0)) 3036 | '@vitest/pretty-format': 3.1.3 3037 | '@vitest/runner': 3.1.3 3038 | '@vitest/snapshot': 3.1.3 3039 | '@vitest/spy': 3.1.3 3040 | '@vitest/utils': 3.1.3 3041 | chai: 5.2.0 3042 | debug: 4.4.1 3043 | expect-type: 1.2.1 3044 | magic-string: 0.30.17 3045 | pathe: 2.0.3 3046 | std-env: 3.9.0 3047 | tinybench: 2.9.0 3048 | tinyexec: 0.3.2 3049 | tinyglobby: 0.2.13 3050 | tinypool: 1.0.2 3051 | tinyrainbow: 2.0.0 3052 | vite: 6.3.5(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0) 3053 | vite-node: 3.1.3(@types/node@22.15.18)(tsx@4.19.4)(yaml@2.6.0) 3054 | why-is-node-running: 2.3.0 3055 | optionalDependencies: 3056 | '@types/node': 22.15.18 3057 | transitivePeerDependencies: 3058 | - jiti 3059 | - less 3060 | - lightningcss 3061 | - msw 3062 | - sass 3063 | - sass-embedded 3064 | - stylus 3065 | - sugarss 3066 | - supports-color 3067 | - terser 3068 | - tsx 3069 | - yaml 3070 | 3071 | which@2.0.2: 3072 | dependencies: 3073 | isexe: 2.0.0 3074 | 3075 | which@5.0.0: 3076 | dependencies: 3077 | isexe: 3.1.1 3078 | 3079 | why-is-node-running@2.3.0: 3080 | dependencies: 3081 | siginfo: 2.0.0 3082 | stackback: 0.0.2 3083 | 3084 | word-wrap@1.2.5: {} 3085 | 3086 | wrap-ansi@7.0.0: 3087 | dependencies: 3088 | ansi-styles: 4.3.0 3089 | string-width: 4.2.3 3090 | strip-ansi: 6.0.1 3091 | 3092 | wrap-ansi@8.1.0: 3093 | dependencies: 3094 | ansi-styles: 6.2.1 3095 | string-width: 5.1.2 3096 | strip-ansi: 7.1.0 3097 | 3098 | wrappy@1.0.2: {} 3099 | 3100 | yaml@2.6.0: 3101 | optional: true 3102 | 3103 | yocto-queue@0.1.0: {} 3104 | 3105 | zod-to-json-schema@3.24.5(zod@3.24.4): 3106 | dependencies: 3107 | zod: 3.24.4 3108 | 3109 | zod@3.24.4: {} 3110 | -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from "vitest"; 2 | import type { Effectful } from "./index.js"; 3 | import { 4 | perform, 5 | map, 6 | pure, 7 | abort, 8 | bind, 9 | run, 10 | handle, 11 | interpret, 12 | runPure, 13 | waitFor, 14 | runAsync, 15 | } from "./index.js"; 16 | 17 | declare module "./index.js" { 18 | interface EffectRegistry { 19 | "test/identity": T; 20 | "test/number": { 21 | value: number; 22 | constraint: (x: number) => T; 23 | }; 24 | "test/string": { 25 | value: string; 26 | constraint: (x: string) => T; 27 | }; 28 | } 29 | } 30 | 31 | function identity(value: T): Effectful<"test/identity", T> { 32 | return perform({ 33 | key: "test/identity", 34 | data: value, 35 | }); 36 | } 37 | 38 | function number(value: number): Effectful<"test/number", number> { 39 | return perform({ 40 | key: "test/number", 41 | data: { 42 | value, 43 | constraint: (x) => x, 44 | }, 45 | }); 46 | } 47 | 48 | function string(value: string): Effectful<"test/string", string> { 49 | return perform({ 50 | key: "test/string", 51 | data: { 52 | value, 53 | constraint: (x) => x, 54 | }, 55 | }); 56 | } 57 | 58 | describe("map", () => { 59 | it("transforms the return value of a computation by a function", () => { 60 | const comp = pure(6); 61 | const func = (x: number): string => "A".repeat(x); 62 | const res = runPure(map(comp, func)); 63 | expect(res).toBe("AAAAAA"); 64 | }); 65 | }); 66 | 67 | describe("pure", () => { 68 | it("creates a pure computation that returns the given value", () => { 69 | const comp = pure(42); 70 | const res = runPure(comp); 71 | expect(res).toBe(42); 72 | }); 73 | }); 74 | 75 | describe("abort", () => { 76 | it("creates a computation that throws the given error", () => { 77 | const comp = abort(new Error("ERROR")); 78 | expect(() => runPure(comp)).toThrowError("ERROR"); 79 | }); 80 | }); 81 | 82 | describe("bind", () => { 83 | it("composes two computations sequentially", () => { 84 | const comp = pure(6); 85 | const func = (x: number): Effectful => pure("A".repeat(x)); 86 | const res = runPure(bind(comp, func)); 87 | expect(res).toBe("AAAAAA"); 88 | }); 89 | 90 | it("throws if the first computation throws and `onThrows` is not given", () => { 91 | const comp = abort(new Error("ERROR")); 92 | const func = (x: number): Effectful => pure("A".repeat(x)); 93 | expect(() => runPure(bind(comp, func))).toThrowError("ERROR"); 94 | }); 95 | 96 | it("calls `onReturn` branch if the first computation returns", () => { 97 | const comp = pure(6); 98 | const onReturn = (x: number): Effectful => pure("A".repeat(x)); 99 | const onThrow = (error: unknown): Effectful => { 100 | if (error instanceof Error) { 101 | return pure(error.message); 102 | } else { 103 | return pure(""); 104 | } 105 | }; 106 | const res = runPure(bind(comp, onReturn, onThrow)); 107 | expect(res).toBe("AAAAAA"); 108 | }); 109 | 110 | it("calls `onThrow` branch if the first computation throws", () => { 111 | const comp = abort(new Error("ERROR")); 112 | const onReturn = (x: number): Effectful => pure("A".repeat(x)); 113 | const onThrow = (error: unknown): Effectful => { 114 | if (error instanceof Error) { 115 | return pure(error.message); 116 | } else { 117 | return pure(""); 118 | } 119 | }; 120 | const res = runPure(bind(comp, onReturn, onThrow)); 121 | expect(res).toBe("ERROR"); 122 | }); 123 | }); 124 | 125 | describe("run", () => { 126 | function* main(): Effectful<"test/number" | "test/string", string> { 127 | const x = yield* number(3); 128 | const y = yield* string("A"); 129 | return y.repeat(x); 130 | } 131 | 132 | it("allows handlers to resume the computation", () => { 133 | const res = run( 134 | main(), 135 | (value) => value, 136 | (error) => { 137 | // eslint-disable-next-line @typescript-eslint/only-throw-error 138 | throw error; 139 | }, 140 | { 141 | "test/number"(effect, resume) { 142 | return resume(effect.data.constraint(effect.data.value * 2)); 143 | }, 144 | "test/string"(effect, resume) { 145 | return resume(effect.data.constraint(effect.data.value.toLowerCase())); 146 | }, 147 | }, 148 | ); 149 | expect(res).toBe("aaaaaa"); 150 | }); 151 | 152 | it("allows handlers to abort the computation", () => { 153 | expect(() => 154 | run( 155 | main(), 156 | (value) => value, 157 | (error) => { 158 | // eslint-disable-next-line @typescript-eslint/only-throw-error 159 | throw error; 160 | }, 161 | { 162 | "test/number"(effect, resume) { 163 | return resume(effect.data.constraint(effect.data.value)); 164 | }, 165 | "test/string"(_effect, _resume, abort) { 166 | return abort(new Error("ERROR")); 167 | }, 168 | }, 169 | ), 170 | ).toThrowError("ERROR"); 171 | }); 172 | 173 | it("allows onReturn to modify the value returned by the computation", () => { 174 | const res = run( 175 | main(), 176 | (value) => value.length, 177 | (error) => { 178 | // eslint-disable-next-line @typescript-eslint/only-throw-error 179 | throw error; 180 | }, 181 | { 182 | "test/number"(effect, resume) { 183 | return resume(effect.data.constraint(effect.data.value)); 184 | }, 185 | "test/string"(effect, resume) { 186 | return resume(effect.data.constraint(effect.data.value)); 187 | }, 188 | }, 189 | ); 190 | expect(res).toBe(3); 191 | }); 192 | 193 | it("allows onThrow to modify the error thrown by the computation", () => { 194 | const res = run( 195 | main(), 196 | (value) => value, 197 | (error) => { 198 | if (error instanceof Error) { 199 | return error.message; 200 | } else { 201 | return ""; 202 | } 203 | }, 204 | { 205 | "test/number"(effect, resume) { 206 | return resume(effect.data.constraint(effect.data.value)); 207 | }, 208 | "test/string"(_effect, _resume, abort) { 209 | return abort(new Error("ERROR")); 210 | }, 211 | }, 212 | ); 213 | expect(res).toBe("ERROR"); 214 | }); 215 | 216 | it("throws if resume is called after the computation is resumed or aborted", () => { 217 | expect(() => 218 | run( 219 | main(), 220 | (value) => value, 221 | (error) => { 222 | // eslint-disable-next-line @typescript-eslint/only-throw-error 223 | throw error; 224 | }, 225 | { 226 | "test/number"(effect, resume) { 227 | return resume(effect.data.constraint(effect.data.value)); 228 | }, 229 | "test/string"(effect, resume) { 230 | resume(effect.data.constraint(effect.data.value)); 231 | return resume(effect.data.constraint(effect.data.value.toLowerCase())); 232 | }, 233 | }, 234 | ), 235 | ).toThrowError("cannot resume; already resumed or aborted"); 236 | }); 237 | 238 | it("throws if abort is called after the computation is resumed or aborted", () => { 239 | expect(() => 240 | run( 241 | main(), 242 | (value) => value, 243 | (error) => { 244 | // eslint-disable-next-line @typescript-eslint/only-throw-error 245 | throw error; 246 | }, 247 | { 248 | "test/number"(effect, resume) { 249 | return resume(effect.data.constraint(effect.data.value)); 250 | }, 251 | "test/string"(effect, resume, abort) { 252 | resume(effect.data.constraint(effect.data.value)); 253 | return abort(new Error("ERROR")); 254 | }, 255 | }, 256 | ), 257 | ).toThrowError("cannot abort; already resumed or aborted"); 258 | }); 259 | }); 260 | 261 | describe("handle", () => { 262 | function* main(): Effectful<"test/number" | "test/string", string> { 263 | let x; 264 | try { 265 | x = yield* number(3); 266 | } catch { 267 | x = 1; 268 | } 269 | const y = yield* string("A"); 270 | return y.repeat(x); 271 | } 272 | 273 | it("allow handlers to translate effects to other effects", () => { 274 | const comp = handle<"test/string", "test/identity" | "test/number", string>(main(), { 275 | *"test/string"(effect, resume) { 276 | const value = yield* identity(effect.data.value); 277 | return yield* resume(effect.data.constraint(value)); 278 | }, 279 | }); 280 | const res = run( 281 | comp, 282 | (value) => value, 283 | (error) => { 284 | // eslint-disable-next-line @typescript-eslint/only-throw-error 285 | throw error; 286 | }, 287 | { 288 | "test/identity"(effect, resume) { 289 | return resume(effect.data); 290 | }, 291 | "test/number"(_effect, _resume, abort) { 292 | return abort(new Error("ERROR")); 293 | }, 294 | }, 295 | ); 296 | expect(res).toBe("A"); 297 | }); 298 | 299 | it("allow handlers to abort the computation", () => { 300 | const comp = handle<"test/string", "test/identity" | "test/number", string>(main(), { 301 | *"test/string"(_effect, _resume, abort) { 302 | return yield* abort(new Error("ERROR FOO")); 303 | }, 304 | }); 305 | expect(() => 306 | run( 307 | comp, 308 | (value) => value, 309 | (error) => { 310 | // eslint-disable-next-line @typescript-eslint/only-throw-error 311 | throw error; 312 | }, 313 | { 314 | "test/identity"(effect, resume) { 315 | return resume(effect.data); 316 | }, 317 | "test/number"(_effect, _resume, abort) { 318 | return abort(new Error("ERROR BAR")); 319 | }, 320 | }, 321 | ), 322 | ).toThrowError("ERROR FOO"); 323 | }); 324 | 325 | it("throws if resume is called after the computation is resumed or aborted", () => { 326 | const comp = handle<"test/string", "test/identity" | "test/number", string>(main(), { 327 | *"test/string"(effect, resume) { 328 | yield* resume(effect.data.constraint(effect.data.value)); 329 | return yield* resume(effect.data.constraint(effect.data.value.toLowerCase())); 330 | }, 331 | }); 332 | expect(() => 333 | run( 334 | comp, 335 | (value) => value, 336 | (error) => { 337 | // eslint-disable-next-line @typescript-eslint/only-throw-error 338 | throw error; 339 | }, 340 | { 341 | "test/identity"(effect, resume) { 342 | return resume(effect.data); 343 | }, 344 | "test/number"(_effect, _resume, abort) { 345 | return abort(new Error("ERROR")); 346 | }, 347 | }, 348 | ), 349 | ).toThrowError("cannot resume; already resumed or aborted"); 350 | }); 351 | 352 | it("throws if abort is called after the computation is resumed or aborted", () => { 353 | const comp = handle<"test/string", "test/identity" | "test/number", string>(main(), { 354 | *"test/string"(effect, resume, abort) { 355 | yield* resume(effect.data.constraint(effect.data.value)); 356 | return yield* abort(new Error("ERROR")); 357 | }, 358 | }); 359 | expect(() => 360 | run( 361 | comp, 362 | (value) => value, 363 | (error) => { 364 | // eslint-disable-next-line @typescript-eslint/only-throw-error 365 | throw error; 366 | }, 367 | { 368 | "test/identity"(effect, resume) { 369 | return resume(effect.data); 370 | }, 371 | "test/number"(_effect, _resume, abort) { 372 | return abort(new Error("ERROR")); 373 | }, 374 | }, 375 | ), 376 | ).toThrowError("cannot abort; already resumed or aborted"); 377 | }); 378 | }); 379 | 380 | describe("interpret", () => { 381 | function* main(): Effectful<"test/number" | "test/string", string> { 382 | let x; 383 | try { 384 | x = yield* number(3); 385 | } catch { 386 | x = 1; 387 | } 388 | const y = yield* string("A"); 389 | return y.repeat(x); 390 | } 391 | 392 | it("allow interpreters to translate effects to other effects", () => { 393 | const comp = interpret<"test/string", "test/identity" | "test/number", string>(main(), { 394 | *"test/string"(effect) { 395 | const value = yield* identity(effect.data.value); 396 | return effect.data.constraint(value); 397 | }, 398 | }); 399 | const res = run( 400 | comp, 401 | (value) => value, 402 | (error) => { 403 | // eslint-disable-next-line @typescript-eslint/only-throw-error 404 | throw error; 405 | }, 406 | { 407 | "test/identity"(effect, resume) { 408 | return resume(effect.data); 409 | }, 410 | "test/number"(_effect, _resume, abort) { 411 | return abort(new Error("ERROR")); 412 | }, 413 | }, 414 | ); 415 | expect(res).toBe("A"); 416 | }); 417 | 418 | it("allow interpreters to abort the computation", () => { 419 | const comp = interpret<"test/string", "test/identity" | "test/number", string>(main(), { 420 | *"test/string"() { 421 | throw new Error("ERROR FOO"); 422 | }, 423 | }); 424 | expect(() => 425 | run( 426 | comp, 427 | (value) => value, 428 | (error) => { 429 | // eslint-disable-next-line @typescript-eslint/only-throw-error 430 | throw error; 431 | }, 432 | { 433 | "test/identity"(effect, resume) { 434 | return resume(effect.data); 435 | }, 436 | "test/number"(_effect, _resume, abort) { 437 | return abort(new Error("ERROR BAR")); 438 | }, 439 | }, 440 | ), 441 | ).toThrowError("ERROR FOO"); 442 | }); 443 | }); 444 | 445 | describe("runPure", () => { 446 | it("runs a pure computation", () => { 447 | function* main(): Effectful { 448 | return 42; 449 | } 450 | 451 | const res = runPure(main()); 452 | expect(res).toBe(42); 453 | }); 454 | }); 455 | 456 | describe("runAsync", () => { 457 | it("runs an async computation", async () => { 458 | function* main(): Effectful<"async", number> { 459 | const x = yield* waitFor(Promise.resolve(42)); 460 | let y; 461 | try { 462 | y = yield* waitFor(Promise.reject(new Error("ERROR"))); 463 | } catch { 464 | y = 1; 465 | } 466 | return x + y; 467 | } 468 | 469 | const res = runAsync(main()); 470 | await expect(res).resolves.toBe(43); 471 | }); 472 | 473 | it("rejects if a promise is rejected and not handled", async () => { 474 | function* main(): Effectful<"async", number> { 475 | const x = yield* waitFor(Promise.resolve(42)); 476 | const y = yield* waitFor(Promise.reject(new Error("ERROR"))); 477 | return x + y; 478 | } 479 | const res = runAsync(main()); 480 | await expect(res).rejects.toThrowError("ERROR"); 481 | }); 482 | }); 483 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * `EffectRegistry` is the global registry of effects. 3 | * Users can extend this interface (by declaration merging) to register custom effects. 4 | * Each key defines an effect, and the type associated to the key is the data type of the effect. 5 | * @param T The type returned when an effect is performed. 6 | */ 7 | export interface EffectRegistry { 8 | async: Promise; 9 | } 10 | 11 | /** 12 | * `EffectKey` is the union type containing all the keys in `EffectRegistry`, 13 | * i.e. the upper bound for effect rows. 14 | */ 15 | export type EffectKey = keyof EffectRegistry; 16 | 17 | /** 18 | * `EffectData` is the associated data type of effects. 19 | * It distributes over `Key`, i.e. `EffectData = EffectData | EffectData`. 20 | */ 21 | export type EffectData = EffectRegistry[Key]; 22 | 23 | /** 24 | * `Effect` is the type of effects that return `T` when performed. 25 | * It distributes over `Key`, i.e. `Effect = Effect | Effect`. 26 | */ 27 | export type Effect = 28 | Key extends unknown ? 29 | Readonly<{ 30 | key: Key; 31 | data: EffectData; 32 | }> 33 | : never; 34 | 35 | /** 36 | * `Effectful` is the type of effectful computations that return `T` and may perform 37 | * effects declared in `Row`. 38 | * 39 | * NOTE: 40 | * - A computation cannot be run twice. 41 | * - Functions that take computations usually "consume" them, i.e. a computation cannot be passed to 42 | * those functions twice. 43 | */ 44 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 45 | export type Effectful = Generator, T, any>; 46 | 47 | /** 48 | * `Eff` is an alias for `Effectful`. 49 | */ 50 | export type Eff = Effectful; 51 | 52 | /** 53 | * Creates a computation that performs a signle effect. 54 | * @param effect An effect to perform. 55 | * @returns A computation that performs the given effect. 56 | */ 57 | export function* perform(effect: Effect): Effectful { 58 | // eslint-disable-next-line @typescript-eslint/no-unsafe-return 59 | return yield effect; 60 | } 61 | 62 | /** 63 | * Transforms the return value of a computation by a function. 64 | * @param comp A computation. 65 | * @param func A function that transforms the return value of the computation. 66 | * @returns A computation that returns the value transformed by the function. 67 | */ 68 | export function* map( 69 | comp: Effectful, 70 | func: (value: T) => U, 71 | ): Effectful { 72 | const value = yield* comp; 73 | return func(value); 74 | } 75 | 76 | /** 77 | * Creates a pure computation that does not perform any effect and returns the given value. 78 | * @param value A value to return. 79 | * @returns A pure computation. 80 | */ 81 | export function* pure(value: T): Effectful { 82 | return value; 83 | } 84 | 85 | /** 86 | * Creates a computation that does not perform any effect and throws the given error. 87 | * @param error An error to throw. 88 | * @returns A computation. 89 | */ 90 | export function* abort(error: unknown): Effectful { 91 | // eslint-disable-next-line @typescript-eslint/only-throw-error 92 | throw error; 93 | } 94 | 95 | /** 96 | * Composes (or chains) two computations sequentially, like `Promise.prototype.then`. 97 | * It calls `onReturn` if the first computation returns, and calls `onThrow` if throws. 98 | * @param comp A computation. 99 | * @param onReturn A function that takes the value returned by the first computation, and returns a 100 | * subsequent computation. 101 | * @param onThrow A function that takes the error thrown by the first computation, and returns a 102 | * subsequent computation. 103 | * @returns A composed computation. 104 | */ 105 | export function* bind( 106 | comp: Effectful, 107 | onReturn: (value: T) => Effectful, 108 | onThrow?: (error: unknown) => Effectful, 109 | ): Effectful { 110 | let value; 111 | if (onThrow) { 112 | try { 113 | value = yield* comp; 114 | } catch (error) { 115 | return yield* onThrow(error); 116 | } 117 | } else { 118 | // short-circuit of onThrow = abort 119 | value = yield* comp; 120 | } 121 | return yield* onReturn(value); 122 | } 123 | 124 | /** 125 | * `Handler` is the type of effect handlers. 126 | * An effect handler takes an effect performed by a computation, handles it, and determines whether to resume (with a 127 | * value) or abort (with an error) the computation. 128 | * It distributes over `Key`, i.e. `Handler = Handler | Handler`. 129 | */ 130 | export type Handler = 131 | Key extends unknown ? 132 | (effect: Effect, resume: (value: S) => T, abort: (error: unknown) => T) => T 133 | : never; 134 | 135 | /** 136 | * HandlerRecord is the type of sets of effect handlers. 137 | */ 138 | export type HandlerRecord = Readonly<{ 139 | [Key in Row]: Handler; 140 | }>; 141 | 142 | /** 143 | * Runs an effectful computation. 144 | * @param comp An effectful computation to run. 145 | * @param onReturn A function that handles the value returned by the computation. 146 | * @param onThrow A function that handles the error thrown by the computation. 147 | * @param handlers A set of effect handlers to handle effects performed by the computation. 148 | * NOTE: handlers should not throw; instead they should call the thrid argument to properly abort the computation. 149 | * @returns The value returned by `onReturn` or `onThrow`. 150 | */ 151 | export function run( 152 | comp: Effectful, 153 | onReturn: (value: T) => U, 154 | onThrow: (error: unknown) => U, 155 | handlers: HandlerRecord, 156 | ): U { 157 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 158 | function onResume(value?: any): U { 159 | let res; 160 | try { 161 | // eslint-disable-next-line @typescript-eslint/no-unsafe-argument 162 | res = comp.next(value); 163 | } catch (err) { 164 | return onThrow(err); 165 | } 166 | if (res.done) { 167 | return onReturn(res.value); 168 | } 169 | return onYield(res.value); 170 | } 171 | 172 | function onAbort(error: unknown): U { 173 | let res; 174 | try { 175 | res = comp.throw(error); 176 | } catch (err) { 177 | return onThrow(err); 178 | } 179 | if (res.done) { 180 | return onReturn(res.value); 181 | } 182 | return onYield(res.value); 183 | } 184 | 185 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 186 | function onYield(effect: Effect): U { 187 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion 188 | const handler = handlers[effect.key as Row]; 189 | let done = false; 190 | return handler( 191 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion, @typescript-eslint/no-explicit-any 192 | effect as Effect, 193 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 194 | (value: any) => { 195 | if (done) { 196 | throw new Error("cannot resume; already resumed or aborted"); 197 | } 198 | done = true; 199 | return onResume(value); 200 | }, 201 | (error: unknown) => { 202 | if (done) { 203 | throw new Error("cannot abort; already resumed or aborted"); 204 | } 205 | done = true; 206 | return onAbort(error); 207 | }, 208 | ); 209 | } 210 | 211 | return onResume(); 212 | } 213 | 214 | /** 215 | * Handles a subset of effects performed by a computation. 216 | * @param comp An effectful computation. 217 | * @param handlers A set of effect handlers to handle effects performed by the computation. 218 | * NOTE: handlers should not throw; instead they should call the thrid argument to properly abort the computation. 219 | * @returns A wrapped computation. 220 | */ 221 | export function* handle( 222 | comp: Effectful, T>, 223 | handlers: HandlerRecord>, 224 | ): Effectful { 225 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 226 | function onResume(value?: any): Effectful { 227 | let res; 228 | try { 229 | // eslint-disable-next-line @typescript-eslint/no-unsafe-argument 230 | res = comp.next(value); 231 | } catch (err) { 232 | return abort(err); 233 | } 234 | if (res.done) { 235 | return pure(res.value); 236 | } 237 | return onYield(res.value); 238 | } 239 | 240 | function onAbort(error: unknown): Effectful { 241 | let res; 242 | try { 243 | res = comp.throw(error); 244 | } catch (err) { 245 | return abort(err); 246 | } 247 | if (res.done) { 248 | return pure(res.value); 249 | } 250 | return onYield(res.value); 251 | } 252 | 253 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 254 | function onYield(effect: Effect): Effectful { 255 | // NOTE: `eff.key in handlers` does not always imply `eff.key: RowA` because of subtyping, 256 | // but we assume so here for convenience. 257 | // eslint-disable-next-line @susisu/safe-typescript/no-unsafe-object-property-check 258 | if (effect.key in handlers) { 259 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion 260 | const handler = handlers[effect.key as RowA]; 261 | let done = false; 262 | return handler( 263 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion, @typescript-eslint/no-explicit-any 264 | effect as Effect, 265 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 266 | (value: any) => { 267 | if (done) { 268 | throw new Error("cannot resume; already resumed or aborted"); 269 | } 270 | done = true; 271 | return onResume(value); 272 | }, 273 | (error: unknown) => { 274 | if (done) { 275 | throw new Error("cannot abort; already resumed or aborted"); 276 | } 277 | done = true; 278 | return onAbort(error); 279 | }, 280 | ); 281 | } 282 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion, @typescript-eslint/no-explicit-any 283 | return bind(perform(effect as Effect), onResume, onAbort); 284 | } 285 | 286 | return yield* onResume(); 287 | } 288 | 289 | /** 290 | * `Interpreter` is the type of interpreters. 291 | * An interpreter takes an effect effects performed by a computation, handles it by (optionally) tralnslating to other 292 | * effects, and returns to resume or throws to abort. 293 | * It distributes over `Key`, i.e. `Interpreter = Interpreter | Interpreter`. 294 | */ 295 | export type Interpreter = 296 | Key extends unknown ? (effect: Effect) => Effectful : never; 297 | 298 | /** 299 | * InterpreterRecord is the type of sets of interpreters. 300 | */ 301 | export type InterpreterRecord = Readonly<{ 302 | [Key in RowA]: Interpreter; 303 | }>; 304 | 305 | /** 306 | * Interprets a subset of effects performed by a computation. 307 | * @param comp An effectful computation. 308 | * @param interpreters A set of interpreters to translate effects performed by the computation. 309 | * @returns A wrapped computation. 310 | */ 311 | export function* interpret( 312 | comp: Effectful, T>, 313 | interpreters: InterpreterRecord, 314 | ): Effectful { 315 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 316 | function onResume(value?: any): Effectful { 317 | let res; 318 | try { 319 | // eslint-disable-next-line @typescript-eslint/no-unsafe-argument 320 | res = comp.next(value); 321 | } catch (err) { 322 | return abort(err); 323 | } 324 | if (res.done) { 325 | return pure(res.value); 326 | } 327 | return onYield(res.value); 328 | } 329 | 330 | function onAbort(error: unknown): Effectful { 331 | let res; 332 | try { 333 | res = comp.throw(error); 334 | } catch (err) { 335 | return abort(err); 336 | } 337 | if (res.done) { 338 | return pure(res.value); 339 | } 340 | return onYield(res.value); 341 | } 342 | 343 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 344 | function onYield(effect: Effect): Effectful { 345 | // NOTE: `eff.key in interpreters` does not always imply `eff.key: RowA` because of subtyping, 346 | // but we assume so here for convenience. 347 | // eslint-disable-next-line @susisu/safe-typescript/no-unsafe-object-property-check 348 | if (effect.key in interpreters) { 349 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion 350 | const interpreter = interpreters[effect.key as RowA]; 351 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion, @typescript-eslint/no-explicit-any 352 | return bind(interpreter(effect as Effect), onResume, onAbort); 353 | } 354 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion, @typescript-eslint/no-explicit-any 355 | return bind(perform(effect as Effect), onResume, onAbort); 356 | } 357 | 358 | return yield* onResume(); 359 | } 360 | 361 | /** 362 | * Runs a pure computation. 363 | * @param comp A computation to run. 364 | * @returns The value returned by the computation. 365 | */ 366 | export function runPure(comp: Effectful): T { 367 | return run( 368 | comp, 369 | (value) => value, 370 | (error) => { 371 | // eslint-disable-next-line @typescript-eslint/only-throw-error 372 | throw error; 373 | }, 374 | {}, 375 | ); 376 | } 377 | 378 | /** 379 | * Performs an async effect to wait for a promise. 380 | * @param promise A promise to wait for. 381 | * @returns A computation that performs an async effect. 382 | */ 383 | export function waitFor(promise: Promise): Effectful<"async", Awaited> { 384 | return perform({ 385 | key: "async", 386 | // eslint-disable-next-line @susisu/safe-typescript/no-type-assertion 387 | data: promise as Promise>, 388 | }); 389 | } 390 | 391 | /** 392 | * Runs an async computation. 393 | * @param comp A computation to run. 394 | * @returns The value returned by the computation. 395 | */ 396 | // eslint-disable-next-line @typescript-eslint/promise-function-async 397 | export function runAsync(comp: Effectful<"async", T>): Promise> { 398 | return run( 399 | comp, 400 | // eslint-disable-next-line @typescript-eslint/promise-function-async 401 | (value) => Promise.resolve(value), 402 | // eslint-disable-next-line @typescript-eslint/promise-function-async, @typescript-eslint/prefer-promise-reject-errors 403 | (error) => Promise.reject(error), 404 | { 405 | // eslint-disable-next-line @typescript-eslint/promise-function-async 406 | async(effect, resume, abort) { 407 | return effect.data.then(resume, abort); 408 | }, 409 | }, 410 | ); 411 | } 412 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "outDir": "lib", 6 | "sourceMap": true, 7 | "declaration": true, 8 | "declarationMap": true 9 | }, 10 | "include": [ 11 | "src/**/*" 12 | ], 13 | "exclude": [ 14 | "src/**/*.test.*", 15 | "src/**/*.spec.*", 16 | "src/**/__tests__/**/*" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "nodenext", 5 | "moduleResolution": "nodenext", 6 | "esModuleInterop": true, 7 | "verbatimModuleSyntax": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "jsx": "react-jsx", 10 | "lib": ["esnext"], 11 | "strict": true, 12 | "exactOptionalPropertyTypes": true, 13 | "noImplicitOverride": true, 14 | "noImplicitReturns": true, 15 | "noPropertyAccessFromIndexSignature": true, 16 | "noUncheckedIndexedAccess": true, 17 | "skipLibCheck": true 18 | }, 19 | "include": [ 20 | "**/*" 21 | ] 22 | } 23 | --------------------------------------------------------------------------------