├── .npmrc ├── pnpm-workspace.yaml ├── assets └── banner.png ├── apps └── example-worker │ ├── .vscode │ └── settings.json │ ├── test │ ├── env.d.ts │ ├── tsconfig.json │ └── index.spec.ts │ ├── .prettierrc │ ├── .editorconfig │ ├── vitest.config.mts │ ├── package.json │ ├── wrangler.jsonc │ ├── tsconfig.json │ ├── src │ └── index.ts │ └── .gitignore ├── .vscode └── settings.json ├── packages └── mizu-router │ ├── .npmignore │ ├── vitest.config.ts │ ├── tsconfig.json │ ├── package.json │ ├── rollup.config.mjs │ ├── README.md │ ├── src │ ├── cors.ts │ └── index.ts │ └── test │ └── router.test.ts ├── turbo.json ├── package.json ├── .gitignore ├── LICENSE ├── README.md └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - "apps/*" 3 | - "packages/*" 4 | -------------------------------------------------------------------------------- /assets/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DarthBenro008/mizu-router/HEAD/assets/banner.png -------------------------------------------------------------------------------- /apps/example-worker/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "wrangler.json": "jsonc" 4 | } 5 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.workingDirectories": [ 3 | { 4 | "mode": "auto" 5 | } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /apps/example-worker/test/env.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'cloudflare:test' { 2 | interface ProvidedEnv extends Env {} 3 | } 4 | -------------------------------------------------------------------------------- /apps/example-worker/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 140, 3 | "singleQuote": true, 4 | "semi": true, 5 | "useTabs": true 6 | } 7 | -------------------------------------------------------------------------------- /packages/mizu-router/.npmignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | src/ 3 | test/ 4 | tsconfig.json 5 | vitest.config.ts 6 | .turbo 7 | .vscode 8 | .DS_Store 9 | .env 10 | .env.local 11 | .env.development.local 12 | .env.test.local 13 | rollup.config.mjs -------------------------------------------------------------------------------- /apps/example-worker/.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = tab 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.yml] 12 | indent_style = space 13 | -------------------------------------------------------------------------------- /apps/example-worker/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["@cloudflare/workers-types/experimental", "@cloudflare/vitest-pool-workers"] 5 | }, 6 | "include": ["./**/*.ts", "../worker-configuration.d.ts"], 7 | "exclude": [] 8 | } 9 | -------------------------------------------------------------------------------- /apps/example-worker/vitest.config.mts: -------------------------------------------------------------------------------- 1 | import { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config'; 2 | 3 | export default defineWorkersConfig({ 4 | test: { 5 | poolOptions: { 6 | workers: { 7 | wrangler: { configPath: './wrangler.jsonc' }, 8 | }, 9 | }, 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /packages/mizu-router/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | environment: 'edge-runtime', 6 | globals: true, 7 | reporters: ["verbose"], 8 | include: ['test/**/*.test.ts'], 9 | }, 10 | }); -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "ui": "tui", 4 | "tasks": { 5 | "build": { 6 | "dependsOn": ["^build"], 7 | "inputs": ["$TURBO_DEFAULT$", ".env*"], 8 | "outputs": [".next/**", "!.next/cache/**"] 9 | }, 10 | "lint": { 11 | "dependsOn": ["^lint"] 12 | }, 13 | "check-types": { 14 | "dependsOn": ["^check-types"] 15 | }, 16 | "dev": { 17 | "cache": false, 18 | "persistent": true 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mizu-router", 3 | "private": true, 4 | "scripts": { 5 | "build": "turbo run build", 6 | "dev": "turbo run dev", 7 | "lint": "turbo run lint", 8 | "format": "prettier --write \"**/*.{ts,tsx,md}\"", 9 | "check-types": "turbo run check-types" 10 | }, 11 | "devDependencies": { 12 | "prettier": "^3.5.3", 13 | "turbo": "^2.5.0", 14 | "typescript": "5.8.2" 15 | }, 16 | "packageManager": "pnpm@9.0.0", 17 | "engines": { 18 | "node": ">=18" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # Dependencies 4 | node_modules 5 | .pnp 6 | .pnp.js 7 | 8 | # Local env files 9 | .env 10 | .env.local 11 | .env.development.local 12 | .env.test.local 13 | .env.production.local 14 | 15 | # Testing 16 | coverage 17 | 18 | # Turbo 19 | .turbo 20 | 21 | # Vercel 22 | .vercel 23 | 24 | # Build Outputs 25 | .next/ 26 | out/ 27 | build 28 | dist 29 | 30 | 31 | # Debug 32 | npm-debug.log* 33 | yarn-debug.log* 34 | yarn-error.log* 35 | 36 | # Misc 37 | .DS_Store 38 | *.pem 39 | -------------------------------------------------------------------------------- /apps/example-worker/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example-worker", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "deploy": "wrangler deploy", 7 | "dev": "wrangler dev", 8 | "start": "wrangler dev", 9 | "test": "vitest", 10 | "cf-typegen": "wrangler types" 11 | }, 12 | "dependencies": { 13 | "mizu-router": "workspace:*" 14 | }, 15 | "devDependencies": { 16 | "@cloudflare/vitest-pool-workers": "^0.7.5", 17 | "@cloudflare/workers-types": "^4.20250414.0", 18 | "typescript": "^5.5.2", 19 | "vitest": "~3.0.7", 20 | "wrangler": "^4.10.0" 21 | } 22 | } -------------------------------------------------------------------------------- /packages/mizu-router/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "dist/", 4 | "module": "esnext", 5 | "target": "esnext", 6 | "lib": ["esnext"], 7 | "declaration": true, 8 | "strict": true, 9 | "noImplicitAny": true, 10 | "strictNullChecks": true, 11 | "strictFunctionTypes": true, 12 | "strictBindCallApply": true, 13 | "strictPropertyInitialization": true, 14 | "noImplicitThis": true, 15 | "alwaysStrict": true, 16 | "noUnusedLocals": true, 17 | "noUnusedParameters": true, 18 | "noFallthroughCasesInSwitch": true, 19 | "esModuleInterop": true, 20 | "preserveConstEnums": true, 21 | "moduleResolution": "node", 22 | "types": ["@cloudflare/workers-types"] 23 | }, 24 | "include": ["src"], 25 | "exclude": ["node_modules"] 26 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Hemanth Krishna 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /apps/example-worker/test/index.spec.ts: -------------------------------------------------------------------------------- 1 | // test/index.spec.ts 2 | import { env, createExecutionContext, waitOnExecutionContext, SELF } from 'cloudflare:test'; 3 | import { describe, it, expect } from 'vitest'; 4 | import worker from '../src/index'; 5 | 6 | // For now, you'll need to do something like this to get a correctly-typed 7 | // `Request` to pass to `worker.fetch()`. 8 | const IncomingRequest = Request; 9 | 10 | describe('Hello World worker', () => { 11 | it('responds with Hello World! (unit style)', async () => { 12 | const request = new IncomingRequest('http://example.com'); 13 | // Create an empty context to pass to `worker.fetch()`. 14 | const ctx = createExecutionContext(); 15 | const response = await worker.fetch(request, env, ctx); 16 | // Wait for all `Promise`s passed to `ctx.waitUntil()` to settle before running test assertions 17 | await waitOnExecutionContext(ctx); 18 | expect(await response.text()).toMatchInlineSnapshot(`"Hello World!"`); 19 | }); 20 | 21 | it('responds with Hello World! (integration style)', async () => { 22 | const response = await SELF.fetch('https://example.com'); 23 | expect(await response.text()).toMatchInlineSnapshot(`"Hello World!"`); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /apps/example-worker/wrangler.jsonc: -------------------------------------------------------------------------------- 1 | /** 2 | * For more details on how to configure Wrangler, refer to: 3 | * https://developers.cloudflare.com/workers/wrangler/configuration/ 4 | */ 5 | { 6 | "$schema": "node_modules/wrangler/config-schema.json", 7 | "name": "example-worker", 8 | "main": "src/index.ts", 9 | "compatibility_date": "2025-04-14", 10 | "observability": { 11 | "enabled": true 12 | }, 13 | /** 14 | * Smart Placement 15 | * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement 16 | */ 17 | // "placement": { "mode": "smart" }, 18 | 19 | /** 20 | * Bindings 21 | * Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform, including 22 | * databases, object storage, AI inference, real-time communication and more. 23 | * https://developers.cloudflare.com/workers/runtime-apis/bindings/ 24 | */ 25 | 26 | /** 27 | * Environment Variables 28 | * https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables 29 | */ 30 | "vars": { "SECRET": "production_value" }, 31 | /** 32 | * Note: Use secrets to store sensitive data. 33 | * https://developers.cloudflare.com/workers/configuration/secrets/ 34 | */ 35 | 36 | /** 37 | * Static Assets 38 | * https://developers.cloudflare.com/workers/static-assets/binding/ 39 | */ 40 | // "assets": { "directory": "./public/", "binding": "ASSETS" }, 41 | 42 | /** 43 | * Service Bindings (communicate between multiple Workers) 44 | * https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings 45 | */ 46 | // "services": [{ "binding": "MY_SERVICE", "service": "my-service" }] 47 | } 48 | -------------------------------------------------------------------------------- /packages/mizu-router/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mizu-router", 3 | "version": "1.0.1", 4 | "description": "Fast zero-dependency trie-based router for Cloudflare Workers", 5 | "type": "module", 6 | "author": "Hemanth Krishna (https://github.com/DarthBenro008)", 7 | "license": "MIT", 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/DarthBenro008/mizu-router.git" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/DarthBenro008/mizu-router/issues" 14 | }, 15 | "homepage": "https://github.com/DarthBenro008/mizu-router#readme", 16 | "scripts": { 17 | "build": "rollup -c", 18 | "test": "vitest run", 19 | "test:watch": "vitest" 20 | }, 21 | "types": "./dist/index.d.ts", 22 | "exports": { 23 | ".": { 24 | "types": "./dist/index.d.ts", 25 | "import": "./dist/index.mjs", 26 | "require": "./dist/index.js" 27 | }, 28 | "./cors": { 29 | "types": "./dist/cors.d.ts", 30 | "import": "./dist/cors.mjs", 31 | "require": "./dist/cors.js" 32 | } 33 | }, 34 | "keywords": [ 35 | "router", 36 | "cloudflare", 37 | "cloudflare-workers", 38 | "middleware", 39 | "api", 40 | "edge-runtime" 41 | ], 42 | "devDependencies": { 43 | "@cloudflare/workers-types": "^4.20250414.0", 44 | "@edge-runtime/vm": "^5.0.0", 45 | "@rollup/plugin-terser": "^0.4.4", 46 | "@rollup/plugin-typescript": "^12.1.2", 47 | "fs-extra": "^11.3.0", 48 | "globby": "^14.1.0", 49 | "rollup": "^4.40.0", 50 | "rollup-plugin-bundle-size": "^1.0.3", 51 | "rollup-plugin-copy": "^3.5.0", 52 | "typescript": "^5.5.2", 53 | "vitest": "~3.0.7" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /apps/example-worker/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 6 | "target": "es2021", 7 | /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 8 | "lib": ["es2021"], 9 | /* Specify what JSX code is generated. */ 10 | "jsx": "react-jsx", 11 | 12 | /* Specify what module code is generated. */ 13 | "module": "es2022", 14 | /* Specify how TypeScript looks up a file from a given module specifier. */ 15 | "moduleResolution": "Bundler", 16 | /* Specify type package names to be included without being referenced in a source file. */ 17 | "types": [ 18 | "@cloudflare/workers-types/2023-07-01" 19 | ], 20 | /* Enable importing .json files */ 21 | "resolveJsonModule": true, 22 | 23 | /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ 24 | "allowJs": true, 25 | /* Enable error reporting in type-checked JavaScript files. */ 26 | "checkJs": false, 27 | 28 | /* Disable emitting files from a compilation. */ 29 | "noEmit": true, 30 | 31 | /* Ensure that each file can be safely transpiled without relying on other imports. */ 32 | "isolatedModules": true, 33 | /* Allow 'import x from y' when a module doesn't have a default export. */ 34 | "allowSyntheticDefaultImports": true, 35 | /* Ensure that casing is correct in imports. */ 36 | "forceConsistentCasingInFileNames": true, 37 | 38 | /* Enable all strict type-checking options. */ 39 | "strict": true, 40 | 41 | /* Skip type checking all .d.ts files. */ 42 | "skipLibCheck": true 43 | }, 44 | "exclude": ["test"], 45 | "include": ["worker-configuration.d.ts", "src/**/*.ts"] 46 | } 47 | -------------------------------------------------------------------------------- /packages/mizu-router/rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import terser from '@rollup/plugin-terser' 2 | import typescript from '@rollup/plugin-typescript' 3 | import { globby } from 'globby' 4 | import bundleSize from 'rollup-plugin-bundle-size' 5 | import copy from 'rollup-plugin-copy' 6 | import fs from 'fs-extra' 7 | 8 | // scan files to build 9 | const files = (await globby('./src/*.ts', { 10 | ignore: ['**/*.spec.ts', 'examples'], 11 | })).map(path => ({ 12 | path, 13 | shortPath: path.replace(/(\/src)|(\.ts)/g, '').replace('./index', '.'), 14 | esm: path.replace('/src/', '/dist/').replace('.ts', '.mjs'), 15 | cjs: path.replace('/src/', '/dist/').replace('.ts', '.js'), 16 | types: path.replace('/src/', '/dist/').replace('.ts', '.d.ts'), 17 | })).sort((a, b) => a.shortPath.toLowerCase() < b.shortPath.toLowerCase() ? -1 : 1) 18 | 19 | // read original package.json 20 | const pkg = await fs.readJSON('./package.json') 21 | 22 | // create updated exports list from build files 23 | pkg.exports = files.reduce((acc, file) => { 24 | acc[file.shortPath] = { 25 | types: file.types, 26 | import: file.esm, 27 | require: file.cjs, 28 | } 29 | 30 | return acc 31 | }, {}) 32 | 33 | // write updated package.json 34 | await fs.writeJSON('./package.json', pkg, { spaces: 2 }) 35 | 36 | export default async () => { 37 | console.log(files.map(f => f.path)) 38 | 39 | return files.map(file => ({ 40 | input: file.path, 41 | output: [ 42 | { 43 | format: 'esm', 44 | file: file.esm, 45 | sourcemap: true, 46 | }, 47 | { 48 | format: 'cjs', 49 | file: file.cjs, 50 | sourcemap: true, 51 | }, 52 | ], 53 | plugins: [ 54 | typescript({ sourceMap: true }), 55 | terser(), 56 | bundleSize(), 57 | copy({ 58 | targets: [ 59 | { 60 | src: ['../../LICENSE'], 61 | dest: 'dist', 62 | }, 63 | { 64 | src: ['../../README.md'], 65 | dest: '.', 66 | }, 67 | ], 68 | }), 69 | ], 70 | })) 71 | } -------------------------------------------------------------------------------- /apps/example-worker/src/index.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "mizu-router"; 2 | import { cors } from "mizu-router/cors"; 3 | 4 | // 1. Define Env interface for Cloudflare bindings 5 | interface Env { 6 | SECRET: string; 7 | } 8 | 9 | // 2. Define Store interface for global state 10 | interface Store { 11 | localSecret: string; 12 | } 13 | 14 | // Create router with Env and Store types 15 | const router = new Router(); 16 | router.use(cors()); 17 | 18 | // 3. Global middleware that initializes store 19 | router.use(async (ctx, next) => { 20 | // Initialize store with request count 21 | ctx.store = { localSecret: "hello world - inital store" }; 22 | return next(); 23 | }); 24 | 25 | router.get("/", async (ctx) => { 26 | // store will be initial value 27 | return new Response(JSON.stringify({ 28 | secret: ctx.env.SECRET, 29 | store: ctx.store.localSecret, 30 | })); 31 | }); 32 | 33 | // 4. Global middleware that increments request count 34 | router.use(async (ctx, next) => { 35 | // updating global store 36 | ctx.store.localSecret = "updated store"; 37 | return next(); 38 | }); 39 | 40 | router.get("/updated", async (ctx) => { 41 | // store will be updated value 42 | return new Response(JSON.stringify({ 43 | secret: ctx.env.SECRET, 44 | store: ctx.store.localSecret, 45 | })); 46 | }); 47 | 48 | // Create a subrouter 49 | const userRouter = new Router(); 50 | 51 | // 5. Route with dynamic parameter 52 | userRouter.get("/:id", async (ctx) => { 53 | // Access dynamic parameter 54 | const userId = ctx.params.id; 55 | 56 | // Access query parameters 57 | const format = ctx.query.format || "json"; 58 | 59 | return new Response(JSON.stringify({ 60 | userId, 61 | secret: ctx.env.SECRET, 62 | localSecret: ctx.store.localSecret, 63 | format 64 | })); 65 | }); 66 | 67 | // 6. Mount subrouter 68 | router.route("/users", userRouter); 69 | 70 | // 7. Add wildcard route 71 | router.get("/wildcard/*", async (ctx) => { 72 | return new Response(JSON.stringify({ 73 | message: "wildcard route", 74 | path: ctx.params 75 | })); 76 | }); 77 | 78 | export default { 79 | async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { 80 | return router.handle(request, env, {} as Store); 81 | }, 82 | } satisfies ExportedHandler; 83 | -------------------------------------------------------------------------------- /apps/example-worker/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | 3 | logs 4 | _.log 5 | npm-debug.log_ 6 | yarn-debug.log* 7 | yarn-error.log* 8 | lerna-debug.log* 9 | .pnpm-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | 13 | report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json 14 | 15 | # Runtime data 16 | 17 | pids 18 | _.pid 19 | _.seed 20 | \*.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | 28 | coverage 29 | \*.lcov 30 | 31 | # nyc test coverage 32 | 33 | .nyc_output 34 | 35 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 36 | 37 | .grunt 38 | 39 | # Bower dependency directory (https://bower.io/) 40 | 41 | bower_components 42 | 43 | # node-waf configuration 44 | 45 | .lock-wscript 46 | 47 | # Compiled binary addons (https://nodejs.org/api/addons.html) 48 | 49 | build/Release 50 | 51 | # Dependency directories 52 | 53 | node_modules/ 54 | jspm_packages/ 55 | 56 | # Snowpack dependency directory (https://snowpack.dev/) 57 | 58 | web_modules/ 59 | 60 | # TypeScript cache 61 | 62 | \*.tsbuildinfo 63 | 64 | # Optional npm cache directory 65 | 66 | .npm 67 | 68 | # Optional eslint cache 69 | 70 | .eslintcache 71 | 72 | # Optional stylelint cache 73 | 74 | .stylelintcache 75 | 76 | # Microbundle cache 77 | 78 | .rpt2_cache/ 79 | .rts2_cache_cjs/ 80 | .rts2_cache_es/ 81 | .rts2_cache_umd/ 82 | 83 | # Optional REPL history 84 | 85 | .node_repl_history 86 | 87 | # Output of 'npm pack' 88 | 89 | \*.tgz 90 | 91 | # Yarn Integrity file 92 | 93 | .yarn-integrity 94 | 95 | # dotenv environment variable files 96 | 97 | .env 98 | .env.development.local 99 | .env.test.local 100 | .env.production.local 101 | .env.local 102 | 103 | # parcel-bundler cache (https://parceljs.org/) 104 | 105 | .cache 106 | .parcel-cache 107 | 108 | # Next.js build output 109 | 110 | .next 111 | out 112 | 113 | # Nuxt.js build / generate output 114 | 115 | .nuxt 116 | dist 117 | 118 | # Gatsby files 119 | 120 | .cache/ 121 | 122 | # Comment in the public line in if your project uses Gatsby and not Next.js 123 | 124 | # https://nextjs.org/blog/next-9-1#public-directory-support 125 | 126 | # public 127 | 128 | # vuepress build output 129 | 130 | .vuepress/dist 131 | 132 | # vuepress v2.x temp and cache directory 133 | 134 | .temp 135 | .cache 136 | 137 | # Docusaurus cache and generated files 138 | 139 | .docusaurus 140 | 141 | # Serverless directories 142 | 143 | .serverless/ 144 | 145 | # FuseBox cache 146 | 147 | .fusebox/ 148 | 149 | # DynamoDB Local files 150 | 151 | .dynamodb/ 152 | 153 | # TernJS port file 154 | 155 | .tern-port 156 | 157 | # Stores VSCode versions used for testing VSCode extensions 158 | 159 | .vscode-test 160 | 161 | # yarn v2 162 | 163 | .yarn/cache 164 | .yarn/unplugged 165 | .yarn/build-state.yml 166 | .yarn/install-state.gz 167 | .pnp.\* 168 | 169 | # wrangler project 170 | 171 | .dev.vars 172 | .wrangler/ 173 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![banner](assets/banner.png) 2 | ![GitHub Release](https://img.shields.io/github/v/release/darthbenro008/mizu-router) 3 | ![GitHub License](https://img.shields.io/github/license/darthbenro008/mizu-router) 4 | [![NPMJS](https://img.shields.io/npm/v/mizu-router)](https://www.npmjs.com/package/mizu-router) 5 | 6 | # Mizu Router 7 | 8 |

Mizu Router is a zero-depency, minimalistic web router for Cloudflare Workers!

9 | 10 | ## 🤔 Why Mizu Router? 11 | 12 | Mizu Router is inspired by [Hono](https://hono.dev) and boasts the following features: 13 | 14 | 1. 🏎️ **Extremely Fast**: Trie Based routing allows Mizu to scale and perform lookups very instantly 15 | 2. 0️⃣ **Zero dependencies**: Natively written in typescript and uses standard web APIs 16 | 3. 🐤 **Minimalistic and Small**: Less than 1.0K when gzipped! 17 | 4. 🌏 **Supports Global store**: instantiate global objects and pass it to all routes! 18 | 5. 🤨 **Supports automated query parsing**: Automated query parsing! 19 | 6. 🚏 **Supports dynamic routing**: `/users/:id` - id is available via `ctx.params` 20 | 7. 🔁 **Supports subrouting**: attach multiple routers expressJS style! (see example below) 21 | 8. ⭐️ **Supports wildcard routes**: handle wildcard routes! (see example below) 22 | 23 | > I built this router for fun, as Hono doesn't support global stores and some cool features. 24 | 25 | ## ⚡️ Quickstart 26 | 27 | ```ts 28 | import { Router } from "mizu-router"; 29 | 30 | // 1. Define Env interface for Cloudflare bindings 31 | interface Env { 32 | SECRET: string; 33 | } 34 | 35 | // 2. Define Store interface for global state 36 | interface Store { 37 | localSecret: string; 38 | } 39 | 40 | // Create router with Env and Store types 41 | const router = new Router(); 42 | 43 | // 3. Global middleware that initializes store 44 | router.use(async (ctx, next) => { 45 | // Initialize store with request count 46 | ctx.store = { localSecret: "hello world - inital store" }; 47 | return next(); 48 | }); 49 | 50 | router.get("/", async (ctx) => { 51 | // store will be initial value 52 | return new Response(JSON.stringify({ 53 | secret: ctx.env.SECRET, 54 | store: ctx.store.localSecret, 55 | })); 56 | }); 57 | 58 | // 4. Global middleware that increments request count 59 | router.use(async (ctx, next) => { 60 | // updating global store 61 | ctx.store.localSecret = "updated store"; 62 | return next(); 63 | }); 64 | 65 | router.get("/updated", async (ctx) => { 66 | // store will be updated value 67 | return new Response(JSON.stringify({ 68 | secret: ctx.env.SECRET, 69 | store: ctx.store.localSecret, 70 | })); 71 | }); 72 | 73 | // Create a subrouter 74 | const userRouter = new Router(); 75 | 76 | // 5. Route with dynamic parameter 77 | userRouter.get("/:id", async (ctx) => { 78 | // Access dynamic parameter 79 | const userId = ctx.params.id; 80 | 81 | // Access query parameters 82 | const format = ctx.query.format || "json"; 83 | 84 | return new Response(JSON.stringify({ 85 | userId, 86 | secret: ctx.env.SECRET, 87 | localSecret: ctx.store.localSecret, 88 | format 89 | })); 90 | }); 91 | 92 | // 6. Mount subrouter 93 | router.route("/users", userRouter); 94 | 95 | // 7. Add wildcard route 96 | router.get("/wildcard/*", async (ctx) => { 97 | return new Response(JSON.stringify({ 98 | message: "wildcard route", 99 | path: ctx.params 100 | })); 101 | }); 102 | 103 | export default { 104 | async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { 105 | return router.handle(request, env, {} as Store); 106 | }, 107 | } satisfies ExportedHandler; 108 | 109 | ``` 110 | 111 | ## ⬇️ Installation 112 | 113 | 1. Initalise Cloudflare worker project via wrangler 114 | 115 | ```bash 116 | pnpm dlx wrangler init 117 | ``` 118 | 119 | 2. Add `mizu-router` as dependency 120 | 121 | ```bash 122 | pnpm add mizu-router 123 | ``` 124 | 125 | ## 🤝 Contributions 126 | 127 | - Feel Free to Open a PR/Issue for any feature or bug(s). 128 | - Make sure you follow the [community guidelines](https://docs.github.com/en/github/site-policy/github-community-guidelines). 129 | - Feel free to open an issue to ask a question/discuss anything about mizu-router. 130 | - Have a feature request? Open an Issue! 131 | - Please ensure to run `pnpm test` before submitting your PRs! 132 | 133 | ## ⚖ License 134 | 135 | Copyright 2025 Hemanth Krishna 136 | 137 | Licensed under MIT License : 138 | 139 |

Made with ❤ , single can of redbull

140 | -------------------------------------------------------------------------------- /packages/mizu-router/README.md: -------------------------------------------------------------------------------- 1 | ![banner](assets/banner.png) 2 | ![GitHub Release](https://img.shields.io/github/v/release/darthbenro008/mizu-router) 3 | ![GitHub License](https://img.shields.io/github/license/darthbenro008/mizu-router) 4 | [![NPMJS](https://img.shields.io/npm/v/mizu-router)](https://www.npmjs.com/package/mizu-router) 5 | 6 | # Mizu Router 7 | 8 |

Mizu Router is a zero-depency, minimalistic web router for Cloudflare Workers!

9 | 10 | ## 🤔 Why Mizu Router? 11 | 12 | Mizu Router is inspired by [Hono](https://hono.dev) and boasts the following features: 13 | 14 | 1. 🏎️ **Extremely Fast**: Trie Based routing allows Mizu to scale and perform lookups very instantly 15 | 2. 0️⃣ **Zero dependencies**: Natively written in typescript and uses standard web APIs 16 | 3. 🐤 **Minimalistic and Small**: Less than 1.0K when gzipped! 17 | 4. 🌏 **Supports Global store**: instantiate global objects and pass it to all routes! 18 | 5. 🤨 **Supports automated query parsing**: Automated query parsing! 19 | 6. 🚏 **Supports dynamic routing**: `/users/:id` - id is available via `ctx.params` 20 | 7. 🔁 **Supports subrouting**: attach multiple routers expressJS style! (see example below) 21 | 8. ⭐️ **Supports wildcard routes**: handle wildcard routes! (see example below) 22 | 23 | > I built this router for fun, as Hono doesn't support global stores and some cool features. 24 | 25 | ## ⚡️ Quickstart 26 | 27 | ```ts 28 | import { Router } from "mizu-router"; 29 | 30 | // 1. Define Env interface for Cloudflare bindings 31 | interface Env { 32 | SECRET: string; 33 | } 34 | 35 | // 2. Define Store interface for global state 36 | interface Store { 37 | localSecret: string; 38 | } 39 | 40 | // Create router with Env and Store types 41 | const router = new Router(); 42 | 43 | // 3. Global middleware that initializes store 44 | router.use(async (ctx, next) => { 45 | // Initialize store with request count 46 | ctx.store = { localSecret: "hello world - inital store" }; 47 | return next(); 48 | }); 49 | 50 | router.get("/", async (ctx) => { 51 | // store will be initial value 52 | return new Response(JSON.stringify({ 53 | secret: ctx.env.SECRET, 54 | store: ctx.store.localSecret, 55 | })); 56 | }); 57 | 58 | // 4. Global middleware that increments request count 59 | router.use(async (ctx, next) => { 60 | // updating global store 61 | ctx.store.localSecret = "updated store"; 62 | return next(); 63 | }); 64 | 65 | router.get("/updated", async (ctx) => { 66 | // store will be updated value 67 | return new Response(JSON.stringify({ 68 | secret: ctx.env.SECRET, 69 | store: ctx.store.localSecret, 70 | })); 71 | }); 72 | 73 | // Create a subrouter 74 | const userRouter = new Router(); 75 | 76 | // 5. Route with dynamic parameter 77 | userRouter.get("/:id", async (ctx) => { 78 | // Access dynamic parameter 79 | const userId = ctx.params.id; 80 | 81 | // Access query parameters 82 | const format = ctx.query.format || "json"; 83 | 84 | return new Response(JSON.stringify({ 85 | userId, 86 | secret: ctx.env.SECRET, 87 | localSecret: ctx.store.localSecret, 88 | format 89 | })); 90 | }); 91 | 92 | // 6. Mount subrouter 93 | router.route("/users", userRouter); 94 | 95 | // 7. Add wildcard route 96 | router.get("/wildcard/*", async (ctx) => { 97 | return new Response(JSON.stringify({ 98 | message: "wildcard route", 99 | path: ctx.params 100 | })); 101 | }); 102 | 103 | export default { 104 | async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { 105 | return router.handle(request, env, {} as Store); 106 | }, 107 | } satisfies ExportedHandler; 108 | 109 | ``` 110 | 111 | ## ⬇️ Installation 112 | 113 | 1. Initalise Cloudflare worker project via wrangler 114 | 115 | ```bash 116 | pnpm dlx wrangler init 117 | ``` 118 | 119 | 2. Add `mizu-router` as dependency 120 | 121 | ```bash 122 | pnpm add mizu-router 123 | ``` 124 | 125 | ## 🤝 Contributions 126 | 127 | - Feel Free to Open a PR/Issue for any feature or bug(s). 128 | - Make sure you follow the [community guidelines](https://docs.github.com/en/github/site-policy/github-community-guidelines). 129 | - Feel free to open an issue to ask a question/discuss anything about mizu-router. 130 | - Have a feature request? Open an Issue! 131 | - Please ensure to run `pnpm test` before submitting your PRs! 132 | 133 | ## ⚖ License 134 | 135 | Copyright 2025 Hemanth Krishna 136 | 137 | Licensed under MIT License : 138 | 139 |

Made with ❤ , single can of redbull

140 | -------------------------------------------------------------------------------- /packages/mizu-router/src/cors.ts: -------------------------------------------------------------------------------- 1 | import type { Context } from './index' 2 | 3 | /** 4 | * Configuration options for CORS middleware 5 | * @interface CorsOptions 6 | */ 7 | export interface CorsOptions { 8 | /** 9 | * Configures the Access-Control-Allow-Origin CORS header 10 | * @default '*' 11 | * - Boolean true to allow any origin 12 | * - Boolean false to disable CORS 13 | * - String for a single origin 14 | * - Array of strings for multiple origins 15 | */ 16 | origin?: string | string[] | boolean 17 | 18 | /** 19 | * Configures the Access-Control-Allow-Methods CORS header 20 | * @default ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'] 21 | */ 22 | methods?: string[] 23 | 24 | /** 25 | * Configures the Access-Control-Allow-Headers CORS header 26 | * @default ['Content-Type'] 27 | */ 28 | allowedHeaders?: string[] 29 | 30 | /** 31 | * Configures the Access-Control-Expose-Headers CORS header 32 | * @default [] 33 | */ 34 | exposedHeaders?: string[] 35 | 36 | /** 37 | * Configures the Access-Control-Allow-Credentials CORS header 38 | * @default false 39 | */ 40 | credentials?: boolean 41 | 42 | /** 43 | * Configures the Access-Control-Max-Age CORS header 44 | * @default 86400 (24 hours) 45 | */ 46 | maxAge?: number 47 | 48 | /** 49 | * Whether to pass OPTIONS requests to the next handler 50 | * @default false 51 | */ 52 | preflightContinue?: boolean 53 | 54 | /** 55 | * Success status for OPTIONS requests 56 | * @default 204 57 | */ 58 | optionsSuccessStatus?: number 59 | } 60 | 61 | /** @internal */ 62 | const defaultOptions: CorsOptions = { 63 | origin: '*', 64 | methods: ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'], 65 | allowedHeaders: ['Content-Type'], 66 | exposedHeaders: [], 67 | credentials: false, 68 | maxAge: 86400, // 24 hours 69 | preflightContinue: false, 70 | optionsSuccessStatus: 204 71 | } 72 | 73 | /** 74 | * Checks if a given origin is allowed based on the CORS configuration 75 | * @internal 76 | * @param origin - The origin to check 77 | * @param allowed - The allowed origin configuration 78 | * @returns Whether the origin is allowed 79 | */ 80 | function isOriginAllowed(origin: string, allowed: string | string[] | boolean): boolean { 81 | if (allowed === true) return true 82 | if (allowed === false) return false 83 | if (allowed === '*') return true 84 | if (Array.isArray(allowed)) return allowed.includes(origin) 85 | return origin === allowed 86 | } 87 | 88 | /** 89 | * Creates a CORS middleware for the Mizu router 90 | * 91 | * @example 92 | * Basic usage: 93 | * ```typescript 94 | * import { Router } from "mizu-router"; 95 | * import { cors } from "mizu-router/cors"; 96 | * 97 | * const router = new Router(); 98 | * router.use(cors()); // Uses default options 99 | * ``` 100 | * 101 | * @example 102 | * With custom options: 103 | * ```typescript 104 | * router.use(cors({ 105 | * origin: ['https://example.com', 'https://api.example.com'], 106 | * methods: ['GET', 'POST'], 107 | * allowedHeaders: ['Content-Type', 'Authorization'], 108 | * credentials: true, 109 | * maxAge: 3600 // 1 hour 110 | * })); 111 | * ``` 112 | * 113 | * @template Env - Type for environment bindings 114 | * @template Store - Type for global state store 115 | * @param {CorsOptions} [options] - CORS configuration options 116 | * @returns A middleware function that handles CORS 117 | */ 118 | export function cors(options: CorsOptions = {}) { 119 | const opts = { ...defaultOptions, ...options } 120 | 121 | return async (ctx: Context, next: () => Promise) => { 122 | const origin = ctx.req.headers.get('origin') 123 | const method = ctx.req.method.toUpperCase() 124 | 125 | // Handle preflight requests 126 | if (method === 'OPTIONS') { 127 | if (!origin) { 128 | return next() 129 | } 130 | 131 | // Check if origin is allowed 132 | if (!isOriginAllowed(origin, opts.origin!)) { 133 | return next() 134 | } 135 | 136 | const headers = new Headers() 137 | 138 | // Basic CORS headers 139 | headers.set('Access-Control-Allow-Origin', 140 | typeof opts.origin === 'boolean' ? '*' : origin) 141 | 142 | if (opts.credentials) { 143 | headers.set('Access-Control-Allow-Credentials', 'true') 144 | } 145 | 146 | if (opts.maxAge) { 147 | headers.set('Access-Control-Max-Age', opts.maxAge.toString()) 148 | } 149 | 150 | // Handle preflight headers 151 | const requestMethod = ctx.req.headers.get('access-control-request-method') 152 | const requestHeaders = ctx.req.headers.get('access-control-request-headers') 153 | 154 | if (requestMethod && opts.methods!.includes(requestMethod.toUpperCase())) { 155 | headers.set('Access-Control-Allow-Methods', opts.methods!.join(', ')) 156 | } 157 | 158 | if (requestHeaders) { 159 | headers.set('Access-Control-Allow-Headers', 160 | opts.allowedHeaders!.join(', ')) 161 | } 162 | 163 | if (opts.exposedHeaders?.length) { 164 | headers.set('Access-Control-Expose-Headers', 165 | opts.exposedHeaders.join(', ')) 166 | } 167 | 168 | if (!opts.preflightContinue) { 169 | return new Response(null, { 170 | status: opts.optionsSuccessStatus, 171 | headers 172 | }) 173 | } 174 | 175 | const response = await next() 176 | if (response) { 177 | // Copy over existing headers 178 | for (const [key, value] of headers.entries()) { 179 | response.headers.set(key, value) 180 | } 181 | return response 182 | } 183 | 184 | return new Response(null, { 185 | status: opts.optionsSuccessStatus, 186 | headers 187 | }) 188 | } 189 | 190 | // Handle actual requests 191 | const response = await next() 192 | if (!response || !origin) return response 193 | 194 | const headers = new Headers(response.headers) 195 | 196 | // Set CORS headers 197 | headers.set('Access-Control-Allow-Origin', 198 | typeof opts.origin === 'boolean' ? '*' : origin) 199 | 200 | if (opts.credentials) { 201 | headers.set('Access-Control-Allow-Credentials', 'true') 202 | } 203 | 204 | if (opts.exposedHeaders?.length) { 205 | headers.set('Access-Control-Expose-Headers', 206 | opts.exposedHeaders.join(', ')) 207 | } 208 | 209 | return new Response(response.body, { 210 | status: response.status, 211 | statusText: response.statusText, 212 | headers 213 | }) 214 | } 215 | } -------------------------------------------------------------------------------- /packages/mizu-router/src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Request context containing environment, store, and request information 3 | * @template Env - Type for environment bindings (e.g., KV, D1, R2) 4 | * @template Store - Type for global state store 5 | */ 6 | export type Context = { 7 | /** Original request object */ 8 | req: Request 9 | /** URL parameters extracted from route patterns */ 10 | params: Record 11 | /** Query parameters from URL */ 12 | query: Record 13 | /** Environment bindings */ 14 | env: Env 15 | /** Global state store */ 16 | store: Store 17 | } 18 | 19 | /** 20 | * Handler function type for route handlers and middleware 21 | * @template Env - Type for environment bindings 22 | * @template Store - Type for global state store 23 | */ 24 | type Handler = ( 25 | ctx: Context, 26 | next: () => Promise 27 | ) => Promise 28 | 29 | /** 30 | * Internal type representing a route with its handler and middleware stack 31 | * @internal 32 | */ 33 | type Route = { 34 | handler: Handler 35 | middlewares: Handler[] 36 | } 37 | 38 | /** 39 | * Internal type representing a node in the routing trie 40 | * @internal 41 | */ 42 | type Node = { 43 | /** Static route segments */ 44 | children: Map> 45 | /** Dynamic parameter node (e.g., :id) */ 46 | param?: Node 47 | /** Name of the parameter if this is a param node */ 48 | paramName?: string 49 | /** Wildcard node (*) */ 50 | wildcard?: Node 51 | /** Route handler if this node is a route endpoint */ 52 | route?: Route 53 | } 54 | 55 | /** 56 | * Mizu Router - A fast, minimal and feature-rich router for Cloudflare Workers 57 | * 58 | * @example 59 | * Basic usage: 60 | * ```typescript 61 | * const router = new Router(); 62 | * 63 | * router.get("/", async (ctx) => { 64 | * return new Response("Hello World!"); 65 | * }); 66 | * 67 | * // Handle request 68 | * export default { 69 | * fetch(request: Request, env: Env, ctx: ExecutionContext) { 70 | * return router.handle(request, env); 71 | * } 72 | * }; 73 | * ``` 74 | * 75 | * @example 76 | * With middleware and parameters: 77 | * ```typescript 78 | * // Add middleware 79 | * router.use(async (ctx, next) => { 80 | * console.log("Request:", ctx.req.url); 81 | * return next(); 82 | * }); 83 | * 84 | * // Route with parameters 85 | * router.get("/users/:id", async (ctx) => { 86 | * const userId = ctx.params.id; 87 | * return new Response(`User: ${userId}`); 88 | * }); 89 | * ``` 90 | * 91 | * @template Env - Type for environment bindings 92 | * @template Store - Type for global state store 93 | */ 94 | export class Router { 95 | private trees = new Map>() 96 | private middlewares: Handler[] = [] 97 | 98 | /** 99 | * Adds a global middleware to the router 100 | * @param middleware - Middleware function to add 101 | */ 102 | use(middleware: Handler) { 103 | this.middlewares.push(middleware) 104 | } 105 | 106 | /** 107 | * Mounts a subrouter at the specified prefix 108 | * @param prefix - URL prefix to mount the subrouter at 109 | * @param router - Subrouter to mount 110 | * 111 | * @example 112 | * ```typescript 113 | * const userRouter = new Router(); 114 | * userRouter.get("/:id", async (ctx) => { 115 | * return new Response(`User: ${ctx.params.id}`); 116 | * }); 117 | * 118 | * // Mount at /users 119 | * mainRouter.route("/users", userRouter); 120 | * ``` 121 | */ 122 | route(prefix: string, router: Router) { 123 | this.register("*", 124 | prefix.endsWith("/") ? `${prefix}*` : `${prefix}/*`, 125 | async (ctx, _) => { 126 | const url = new URL(ctx.req.url) 127 | const path = url.pathname.startsWith(prefix) 128 | ? url.pathname.slice(prefix.length) || "/" 129 | : "/" 130 | const newUrl = new URL(ctx.req.url) 131 | newUrl.pathname = path 132 | return router.handle(new Request(newUrl.toString(), ctx.req), ctx.env, ctx.store) 133 | }, 134 | [] 135 | ) 136 | } 137 | 138 | /** 139 | * Internal method to register routes 140 | * @internal 141 | */ 142 | private register(method: string, path: string, handler: Handler, middlewares: Handler[] = []) { 143 | const segments = path.replace(/^\//, "").split("/").filter(Boolean) 144 | 145 | if (!this.trees.has(method)) { 146 | this.trees.set(method, { children: new Map() }) 147 | } 148 | 149 | let node = this.trees.get(method)! 150 | 151 | for (const segment of segments) { 152 | // handle wildcard 153 | if (segment === "*") { 154 | node.wildcard = node.wildcard || { children: new Map() } 155 | node = node.wildcard 156 | break 157 | } 158 | 159 | // handle param 160 | if (segment.startsWith(":")) { 161 | const paramName = segment.slice(1) 162 | if (!node.param) { 163 | node.param = { children: new Map(), paramName } 164 | } 165 | node = node.param 166 | } else { 167 | // handle static 168 | if (!node.children.has(segment)) { 169 | node.children.set(segment, { children: new Map() }) 170 | } 171 | node = node.children.get(segment)! 172 | } 173 | } 174 | 175 | node.route = { 176 | handler, 177 | middlewares: [...this.middlewares, ...middlewares] 178 | } 179 | } 180 | 181 | /** 182 | * Registers a GET route 183 | * @param path - URL pattern to match 184 | * @param handler - Route handler function 185 | * @param middlewares - Optional route-specific middleware 186 | */ 187 | get = this.register.bind(this, "GET") 188 | 189 | /** 190 | * Registers a POST route 191 | * @param path - URL pattern to match 192 | * @param handler - Route handler function 193 | * @param middlewares - Optional route-specific middleware 194 | */ 195 | post = this.register.bind(this, "POST") 196 | 197 | /** 198 | * Registers a PUT route 199 | * @param path - URL pattern to match 200 | * @param handler - Route handler function 201 | * @param middlewares - Optional route-specific middleware 202 | */ 203 | put = this.register.bind(this, "PUT") 204 | 205 | /** 206 | * Registers a PATCH route 207 | * @param path - URL pattern to match 208 | * @param handler - Route handler function 209 | * @param middlewares - Optional route-specific middleware 210 | */ 211 | patch = this.register.bind(this, "PATCH") 212 | 213 | /** 214 | * Registers a DELETE route 215 | * @param path - URL pattern to match 216 | * @param handler - Route handler function 217 | * @param middlewares - Optional route-specific middleware 218 | */ 219 | delete = this.register.bind(this, "DELETE") 220 | 221 | /** 222 | * Registers a HEAD route 223 | * @param path - URL pattern to match 224 | * @param handler - Route handler function 225 | * @param middlewares - Optional route-specific middleware 226 | */ 227 | head = this.register.bind(this, "HEAD") 228 | 229 | /** 230 | * Registers an OPTIONS route 231 | * @param path - URL pattern to match 232 | * @param handler - Route handler function 233 | * @param middlewares - Optional route-specific middleware 234 | */ 235 | options = this.register.bind(this, "OPTIONS") 236 | 237 | /** 238 | * Handles an incoming request 239 | * @param req - Request object 240 | * @param env - Environment bindings 241 | * @param store - Optional global state store 242 | * @returns Promise resolving to a Response 243 | */ 244 | async handle(req: Request, env: Env, store?: Store): Promise { 245 | const url = new URL(req.url) 246 | const method = req.method 247 | const segments = url.pathname.replace(/^\//, "").split("/").filter(Boolean) 248 | const query = Object.fromEntries(url.searchParams) 249 | 250 | const ctx: Context = { 251 | req, 252 | env, 253 | store: store as Store, 254 | params: {}, 255 | query 256 | } 257 | 258 | const matchRoute = (node?: Node) => { 259 | if (!node) return 260 | 261 | let current = node 262 | const params: Record = {} 263 | 264 | for (let i = 0; i < segments.length; i++) { 265 | const segment = segments[i] 266 | 267 | if (current.children.has(segment)) { 268 | current = current.children.get(segment)! 269 | } else if (current.param) { 270 | // handle param 271 | params[current.param.paramName!] = segment 272 | current = current.param 273 | } else if (current.wildcard) { 274 | // handle wildcard 275 | params["*"] = segments.slice(i).join("/") 276 | current = current.wildcard 277 | break 278 | } else { 279 | return 280 | } 281 | } 282 | 283 | if (current?.route) { 284 | ctx.params = params 285 | return current.route 286 | } 287 | } 288 | 289 | const route = matchRoute(this.trees.get(method)) || matchRoute(this.trees.get("*")) 290 | if (!route) return new Response("Not Found", { status: 404 }) 291 | 292 | let index = -1 293 | // dispatch middleware(s) 294 | const dispatch = async (i: number): Promise => { 295 | if (i <= index) throw new Error("next() called multiple times") 296 | index = i 297 | 298 | const middleware = route.middlewares[i] 299 | if (!middleware) return route.handler(ctx, () => Promise.resolve()) 300 | 301 | try { 302 | return await middleware(ctx, () => dispatch(i + 1)) 303 | } catch (err) { 304 | console.error("[ERROR]: Middleware error", err) 305 | return new Response("Internal Server Error", { status: 500 }) 306 | } 307 | } 308 | 309 | return (await dispatch(0)) || new Response("OK") 310 | } 311 | } -------------------------------------------------------------------------------- /packages/mizu-router/test/router.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect, beforeEach } from 'vitest'; 2 | import { Router } from '../src/index'; 3 | 4 | describe('Router', () => { 5 | let router: Router; 6 | 7 | beforeEach(() => { 8 | router = new Router(); 9 | }); 10 | 11 | describe('Basic HTTP Methods', () => { 12 | it('should handle GET requests', async () => { 13 | router.get('/test', async (ctx) => { 14 | return new Response('GET test'); 15 | }); 16 | 17 | const req = new Request('http://localhost/test'); 18 | const res = await router.handle(req, {}); 19 | expect(await res.text()).toBe('GET test'); 20 | }); 21 | 22 | it('should handle POST requests', async () => { 23 | router.post('/test', async (ctx) => { 24 | return new Response('POST test'); 25 | }); 26 | 27 | const req = new Request('http://localhost/test', { method: 'POST' }); 28 | const res = await router.handle(req, {}); 29 | expect(await res.text()).toBe('POST test'); 30 | }); 31 | 32 | it('should handle PUT requests', async () => { 33 | router.put('/test', async (ctx) => { 34 | return new Response('PUT test'); 35 | }); 36 | 37 | const req = new Request('http://localhost/test', { method: 'PUT' }); 38 | const res = await router.handle(req, {}); 39 | expect(await res.text()).toBe('PUT test'); 40 | }); 41 | 42 | it('should handle DELETE requests', async () => { 43 | router.delete('/test', async (ctx) => { 44 | return new Response('DELETE test'); 45 | }); 46 | 47 | const req = new Request('http://localhost/test', { method: 'DELETE' }); 48 | const res = await router.handle(req, {}); 49 | expect(await res.text()).toBe('DELETE test'); 50 | }); 51 | 52 | it('should handle PATCH requests', async () => { 53 | router.patch('/test', async (ctx) => { 54 | return new Response('PATCH test'); 55 | }); 56 | 57 | const req = new Request('http://localhost/test', { method: 'PATCH' }); 58 | const res = await router.handle(req, {}); 59 | expect(await res.text()).toBe('PATCH test'); 60 | }); 61 | 62 | it('should handle HEAD requests', async () => { 63 | router.head('/test', async (ctx) => { 64 | return new Response('HEAD test'); 65 | }); 66 | 67 | const req = new Request('http://localhost/test', { method: 'HEAD' }); 68 | const res = await router.handle(req, {}); 69 | expect(res.status).toBe(200); 70 | }); 71 | 72 | it('should handle OPTIONS requests', async () => { 73 | router.options('/test', async (ctx) => { 74 | return new Response('OPTIONS test'); 75 | }); 76 | 77 | const req = new Request('http://localhost/test', { method: 'OPTIONS' }); 78 | const res = await router.handle(req, {}); 79 | expect(await res.text()).toBe('OPTIONS test'); 80 | }); 81 | }); 82 | 83 | describe('Path Parameters', () => { 84 | it('should parse path parameters', async () => { 85 | router.get('/users/:id', async (ctx) => { 86 | return new Response(`User ID: ${ctx.params.id}`); 87 | }); 88 | 89 | const req = new Request('http://localhost/users/123'); 90 | const res = await router.handle(req, {}); 91 | expect(await res.text()).toBe('User ID: 123'); 92 | }); 93 | 94 | it('should handle multiple path parameters', async () => { 95 | router.get('/users/:userId/posts/:postId', async (ctx) => { 96 | return new Response(`User ${ctx.params.userId}, Post ${ctx.params.postId}`); 97 | }); 98 | 99 | const req = new Request('http://localhost/users/123/posts/456'); 100 | const res = await router.handle(req, {}); 101 | expect(await res.text()).toBe('User 123, Post 456'); 102 | }); 103 | }); 104 | 105 | describe('Query Parameters', () => { 106 | it('should parse query parameters', async () => { 107 | router.get('/search', async (ctx) => { 108 | return new Response(`Search for: ${ctx.query.q}`); 109 | }); 110 | 111 | const req = new Request('http://localhost/search?q=test'); 112 | const res = await router.handle(req, {}); 113 | expect(await res.text()).toBe('Search for: test'); 114 | }); 115 | 116 | it('should handle multiple query parameters', async () => { 117 | router.get('/search', async (ctx) => { 118 | return new Response(`Search for: ${ctx.query.q}, sort: ${ctx.query.sort}`); 119 | }); 120 | 121 | const req = new Request('http://localhost/search?q=test&sort=desc'); 122 | const res = await router.handle(req, {}); 123 | expect(await res.text()).toBe('Search for: test, sort: desc'); 124 | }); 125 | }); 126 | 127 | describe('Wildcards', () => { 128 | it('should handle wildcard routes', async () => { 129 | router.get('/api/*', async (ctx) => { 130 | return new Response(`Wildcard path: ${ctx.params['*']}`); 131 | }); 132 | 133 | const req = new Request('http://localhost/api/users/123/posts'); 134 | const res = await router.handle(req, {}); 135 | expect(await res.text()).toBe('Wildcard path: users/123/posts'); 136 | }); 137 | 138 | it('should handle nested wildcards', async () => { 139 | router.get('/api/*/posts/*', async (ctx) => { 140 | return new Response(`Resource: ${ctx.params['*']}`); 141 | }); 142 | 143 | const req = new Request('http://localhost/api/users/123/posts/456'); 144 | const res = await router.handle(req, {}); 145 | expect(await res.text()).toBe('Resource: users/123/posts/456'); 146 | }); 147 | }); 148 | 149 | describe('Subrouting', () => { 150 | it('should handle subrouters', async () => { 151 | const subRouter = new Router(); 152 | subRouter.get('/users', async (ctx) => { 153 | return new Response('Subrouter users'); 154 | }); 155 | 156 | router.route('/api', subRouter); 157 | 158 | const req = new Request('http://localhost/api/users'); 159 | const res = await router.handle(req, {}); 160 | expect(await res.text()).toBe('Subrouter users'); 161 | }); 162 | 163 | it('should handle nested subrouters', async () => { 164 | const subRouter1 = new Router(); 165 | const subRouter2 = new Router(); 166 | 167 | subRouter2.get('/posts', async (ctx) => { 168 | return new Response('Nested subrouter posts'); 169 | }); 170 | 171 | subRouter1.route('/v1', subRouter2); 172 | router.route('/api', subRouter1); 173 | 174 | const req = new Request('http://localhost/api/v1/posts'); 175 | const res = await router.handle(req, {}); 176 | expect(await res.text()).toBe('Nested subrouter posts'); 177 | }); 178 | }); 179 | 180 | describe('Middleware', () => { 181 | it('should execute global middleware', async () => { 182 | let middlewareExecuted = false; 183 | 184 | router.use(async (ctx, next) => { 185 | middlewareExecuted = true; 186 | return next(); 187 | }); 188 | 189 | router.get('/test', async (ctx) => { 190 | return new Response('Test'); 191 | }); 192 | 193 | const req = new Request('http://localhost/test'); 194 | await router.handle(req, {}); 195 | expect(middlewareExecuted).toBe(true); 196 | }); 197 | 198 | it('should execute route-specific middleware', async () => { 199 | let middlewareExecuted = false; 200 | 201 | const middleware = async (ctx: any, next: any) => { 202 | middlewareExecuted = true; 203 | return next(); 204 | }; 205 | 206 | router.get('/test', async (ctx) => { 207 | return new Response('Test'); 208 | }, [middleware]); 209 | 210 | const req = new Request('http://localhost/test'); 211 | await router.handle(req, {}); 212 | expect(middlewareExecuted).toBe(true); 213 | }); 214 | 215 | it('should execute middleware in correct order', async () => { 216 | const executionOrder: string[] = []; 217 | 218 | router.use(async (ctx, next) => { 219 | executionOrder.push('global1'); 220 | return next(); 221 | }); 222 | 223 | router.use(async (ctx, next) => { 224 | executionOrder.push('global2'); 225 | return next(); 226 | }); 227 | 228 | const routeMiddleware = async (ctx: any, next: any) => { 229 | executionOrder.push('route'); 230 | return next(); 231 | }; 232 | 233 | router.get('/test', async (ctx) => { 234 | executionOrder.push('handler'); 235 | return new Response('Test'); 236 | }, [routeMiddleware]); 237 | 238 | const req = new Request('http://localhost/test'); 239 | await router.handle(req, {}); 240 | expect(executionOrder).toEqual(['global1', 'global2', 'route', 'handler']); 241 | }); 242 | }); 243 | 244 | describe('Error Handling', () => { 245 | it('should return 404 for non-existent routes', async () => { 246 | const req = new Request('http://localhost/nonexistent'); 247 | const res = await router.handle(req, {}); 248 | expect(res.status).toBe(404); 249 | }); 250 | 251 | it('should handle middleware errors', async () => { 252 | router.use(async (ctx, next) => { 253 | throw new Error('Middleware error'); 254 | }); 255 | 256 | router.get('/test', async (ctx) => { 257 | return new Response('Test'); 258 | }); 259 | 260 | const req = new Request('http://localhost/test'); 261 | const res = await router.handle(req, {}); 262 | expect(res.status).toBe(500); 263 | }); 264 | }); 265 | 266 | describe('Context', () => { 267 | it('should pass environment variables to handlers', async () => { 268 | const env = { API_KEY: 'secret' }; 269 | 270 | 271 | const tempRouter = new Router<{ API_KEY: string }, {}>(); 272 | 273 | tempRouter.get('/test', async (ctx) => { 274 | return new Response(`API Key: ${ctx.env.API_KEY}`); 275 | }); 276 | const req = new Request('http://localhost/test'); 277 | const res = await tempRouter.handle(req, env); 278 | expect(await res.text()).toBe('API Key: secret'); 279 | }); 280 | 281 | it('should pass store to handlers', async () => { 282 | const store = { user: { id: 123 } }; 283 | 284 | const tempRouter = new Router<{}, { user: { id: number } }>(); 285 | tempRouter.get('/test', async (ctx) => { 286 | return new Response(`User ID: ${ctx.store.user.id}`); 287 | }); 288 | 289 | const req = new Request('http://localhost/test'); 290 | const res = await tempRouter.handle(req, {}, store); 291 | expect(await res.text()).toBe('User ID: 123'); 292 | }); 293 | }); 294 | }); -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | prettier: 12 | specifier: ^3.5.3 13 | version: 3.5.3 14 | turbo: 15 | specifier: ^2.5.0 16 | version: 2.5.0 17 | typescript: 18 | specifier: 5.8.2 19 | version: 5.8.2 20 | 21 | apps/example-worker: 22 | dependencies: 23 | mizu-router: 24 | specifier: workspace:* 25 | version: link:../../packages/mizu-router 26 | devDependencies: 27 | '@cloudflare/vitest-pool-workers': 28 | specifier: ^0.7.5 29 | version: 0.7.8(@cloudflare/workers-types@4.20250414.0)(@vitest/runner@3.0.9)(@vitest/snapshot@3.0.9)(vitest@3.0.9(@edge-runtime/vm@5.0.0)(@types/node@22.14.0)(terser@5.39.0)) 30 | '@cloudflare/workers-types': 31 | specifier: ^4.20250414.0 32 | version: 4.20250414.0 33 | typescript: 34 | specifier: ^5.5.2 35 | version: 5.8.2 36 | vitest: 37 | specifier: ~3.0.7 38 | version: 3.0.9(@edge-runtime/vm@5.0.0)(@types/node@22.14.0)(terser@5.39.0) 39 | wrangler: 40 | specifier: ^4.10.0 41 | version: 4.10.0(@cloudflare/workers-types@4.20250414.0) 42 | 43 | packages/mizu-router: 44 | devDependencies: 45 | '@cloudflare/workers-types': 46 | specifier: ^4.20250414.0 47 | version: 4.20250414.0 48 | '@edge-runtime/vm': 49 | specifier: ^5.0.0 50 | version: 5.0.0 51 | '@rollup/plugin-terser': 52 | specifier: ^0.4.4 53 | version: 0.4.4(rollup@4.40.0) 54 | '@rollup/plugin-typescript': 55 | specifier: ^12.1.2 56 | version: 12.1.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.2) 57 | fs-extra: 58 | specifier: ^11.3.0 59 | version: 11.3.0 60 | globby: 61 | specifier: ^14.1.0 62 | version: 14.1.0 63 | rollup: 64 | specifier: ^4.40.0 65 | version: 4.40.0 66 | rollup-plugin-bundle-size: 67 | specifier: ^1.0.3 68 | version: 1.0.3 69 | rollup-plugin-copy: 70 | specifier: ^3.5.0 71 | version: 3.5.0 72 | typescript: 73 | specifier: ^5.5.2 74 | version: 5.8.2 75 | vitest: 76 | specifier: ~3.0.7 77 | version: 3.0.9(@edge-runtime/vm@5.0.0)(@types/node@22.14.0)(terser@5.39.0) 78 | 79 | packages: 80 | 81 | '@cloudflare/kv-asset-handler@0.3.4': 82 | resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} 83 | engines: {node: '>=16.13'} 84 | 85 | '@cloudflare/kv-asset-handler@0.4.0': 86 | resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} 87 | engines: {node: '>=18.0.0'} 88 | 89 | '@cloudflare/unenv-preset@2.0.2': 90 | resolution: {integrity: sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==} 91 | peerDependencies: 92 | unenv: 2.0.0-rc.14 93 | workerd: ^1.20250124.0 94 | peerDependenciesMeta: 95 | workerd: 96 | optional: true 97 | 98 | '@cloudflare/unenv-preset@2.3.1': 99 | resolution: {integrity: sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==} 100 | peerDependencies: 101 | unenv: 2.0.0-rc.15 102 | workerd: ^1.20250320.0 103 | peerDependenciesMeta: 104 | workerd: 105 | optional: true 106 | 107 | '@cloudflare/vitest-pool-workers@0.7.8': 108 | resolution: {integrity: sha512-y5N2PXsuT1sjzSV03COtedET/nh3k6k8vmXfX01r8uXcw9hUZvafG5HoAiRfdrLmRpk/I7FS7D/qglPO13l/bg==} 109 | peerDependencies: 110 | '@vitest/runner': 2.0.x - 3.0.x 111 | '@vitest/snapshot': 2.0.x - 3.0.x 112 | vitest: 2.0.x - 3.0.x 113 | 114 | '@cloudflare/workerd-darwin-64@1.20250310.0': 115 | resolution: {integrity: sha512-LkLJO6F8lRNaCbK5sQCITi66SyCirDpffRuI5/5iILDJWQU4KVvAOKPvHrd4E5h/WDm9FGd22zMJwky7SxaNjg==} 116 | engines: {node: '>=16'} 117 | cpu: [x64] 118 | os: [darwin] 119 | 120 | '@cloudflare/workerd-darwin-64@1.20250409.0': 121 | resolution: {integrity: sha512-smA9yq77xsdQ1NMLhFz3JZxMHGd01lg0bE+X3dTFmIUs+hHskJ+HJ/IkMFInkCCeEFlUkoL4yO7ilaU/fin/xA==} 122 | engines: {node: '>=16'} 123 | cpu: [x64] 124 | os: [darwin] 125 | 126 | '@cloudflare/workerd-darwin-arm64@1.20250310.0': 127 | resolution: {integrity: sha512-WythDJQbsU3Ii1hhA7pJZLBQlHezeYWAnaMnv3gS2Exj45oF8G4chFvrO7zCzjlcJXwSeBTtQRJqxw9AiUDhyA==} 128 | engines: {node: '>=16'} 129 | cpu: [arm64] 130 | os: [darwin] 131 | 132 | '@cloudflare/workerd-darwin-arm64@1.20250409.0': 133 | resolution: {integrity: sha512-oLVcf+Y5Qun8JHcy1VcR/YnbA5U2ne0czh3XNhDqdHZFK8+vKeC7MnVPX+kEqQA3+uLcMM1/FsIDU1U4Na0h1g==} 134 | engines: {node: '>=16'} 135 | cpu: [arm64] 136 | os: [darwin] 137 | 138 | '@cloudflare/workerd-linux-64@1.20250310.0': 139 | resolution: {integrity: sha512-LbP769tT4/5QBHSj4lCt99QIKTi6cU+wYhLfF7rEtYHBnZS2+nIw9xttAzxeERx/aFrU+mxLcYPFV8fUeVxGng==} 140 | engines: {node: '>=16'} 141 | cpu: [x64] 142 | os: [linux] 143 | 144 | '@cloudflare/workerd-linux-64@1.20250409.0': 145 | resolution: {integrity: sha512-D31B4kdC3a0RD5yfpdIa89//kGHbYsYihZmejm1k4S4NHOho3MUDHAEh4aHtafQNXbZdydGHlSyiVYjTdQ9ILQ==} 146 | engines: {node: '>=16'} 147 | cpu: [x64] 148 | os: [linux] 149 | 150 | '@cloudflare/workerd-linux-arm64@1.20250310.0': 151 | resolution: {integrity: sha512-FzWeKM6id20EMZACaDg0Kkvg1C4lvXZgLBXVI6h6xaXTNFReoyEp4v4eMrRTuja5ec5k+m5iGKjP4/bMWJp9ew==} 152 | engines: {node: '>=16'} 153 | cpu: [arm64] 154 | os: [linux] 155 | 156 | '@cloudflare/workerd-linux-arm64@1.20250409.0': 157 | resolution: {integrity: sha512-Sr59P0TREayil5OQ7kcbjuIn6L6OTSRLI91LKu0D8vi1hss2q9FUwBcwxg0+Yd/x+ty/x7IISiAK5QBkAMeITQ==} 158 | engines: {node: '>=16'} 159 | cpu: [arm64] 160 | os: [linux] 161 | 162 | '@cloudflare/workerd-windows-64@1.20250310.0': 163 | resolution: {integrity: sha512-04OgaDzm8/8nkjF3tovB+WywZLjSdAHCQT2omXKCwH3EDd1kpd8vvzE1pErtdIyKCOf9/sArY4BhPdxRj7ijlg==} 164 | engines: {node: '>=16'} 165 | cpu: [x64] 166 | os: [win32] 167 | 168 | '@cloudflare/workerd-windows-64@1.20250409.0': 169 | resolution: {integrity: sha512-dK9I8zBX5rR7MtaaP2AhICQTEw3PVzHcsltN8o46w7JsbYlMvFOj27FfYH5dhs3IahgmIfw2e572QXW2o/dbpg==} 170 | engines: {node: '>=16'} 171 | cpu: [x64] 172 | os: [win32] 173 | 174 | '@cloudflare/workers-types@4.20250414.0': 175 | resolution: {integrity: sha512-ZHl8LiyUMWiIxYqpasen8Lc75Ef+0afqL26TEd95eRIi5kgkEbjDJ7uIUnpxMoZTRI0J8Hy5YEPtt4nFXt+TpA==} 176 | 177 | '@cspotcode/source-map-support@0.8.1': 178 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 179 | engines: {node: '>=12'} 180 | 181 | '@edge-runtime/primitives@6.0.0': 182 | resolution: {integrity: sha512-FqoxaBT+prPBHBwE1WXS1ocnu/VLTQyZ6NMUBAdbP7N2hsFTTxMC/jMu2D/8GAlMQfxeuppcPuCUk/HO3fpIvA==} 183 | engines: {node: '>=18'} 184 | 185 | '@edge-runtime/vm@5.0.0': 186 | resolution: {integrity: sha512-NKBGBSIKUG584qrS1tyxVpX/AKJKQw5HgjYEnPLC0QsTw79JrGn+qUr8CXFb955Iy7GUdiiUv1rJ6JBGvaKb6w==} 187 | engines: {node: '>=18'} 188 | 189 | '@emnapi/runtime@1.4.1': 190 | resolution: {integrity: sha512-LMshMVP0ZhACNjQNYXiU1iZJ6QCcv0lUdPDPugqGvCGXt5xtRVBPdtA0qU12pEXZzpWAhWlZYptfdAFq10DOVQ==} 191 | 192 | '@esbuild-plugins/node-globals-polyfill@0.2.3': 193 | resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} 194 | peerDependencies: 195 | esbuild: '*' 196 | 197 | '@esbuild-plugins/node-modules-polyfill@0.2.2': 198 | resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} 199 | peerDependencies: 200 | esbuild: '*' 201 | 202 | '@esbuild/aix-ppc64@0.24.2': 203 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 204 | engines: {node: '>=18'} 205 | cpu: [ppc64] 206 | os: [aix] 207 | 208 | '@esbuild/aix-ppc64@0.25.2': 209 | resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} 210 | engines: {node: '>=18'} 211 | cpu: [ppc64] 212 | os: [aix] 213 | 214 | '@esbuild/android-arm64@0.17.19': 215 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 216 | engines: {node: '>=12'} 217 | cpu: [arm64] 218 | os: [android] 219 | 220 | '@esbuild/android-arm64@0.24.2': 221 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 222 | engines: {node: '>=18'} 223 | cpu: [arm64] 224 | os: [android] 225 | 226 | '@esbuild/android-arm64@0.25.2': 227 | resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} 228 | engines: {node: '>=18'} 229 | cpu: [arm64] 230 | os: [android] 231 | 232 | '@esbuild/android-arm@0.17.19': 233 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 234 | engines: {node: '>=12'} 235 | cpu: [arm] 236 | os: [android] 237 | 238 | '@esbuild/android-arm@0.24.2': 239 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 240 | engines: {node: '>=18'} 241 | cpu: [arm] 242 | os: [android] 243 | 244 | '@esbuild/android-arm@0.25.2': 245 | resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} 246 | engines: {node: '>=18'} 247 | cpu: [arm] 248 | os: [android] 249 | 250 | '@esbuild/android-x64@0.17.19': 251 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 252 | engines: {node: '>=12'} 253 | cpu: [x64] 254 | os: [android] 255 | 256 | '@esbuild/android-x64@0.24.2': 257 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 258 | engines: {node: '>=18'} 259 | cpu: [x64] 260 | os: [android] 261 | 262 | '@esbuild/android-x64@0.25.2': 263 | resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} 264 | engines: {node: '>=18'} 265 | cpu: [x64] 266 | os: [android] 267 | 268 | '@esbuild/darwin-arm64@0.17.19': 269 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 270 | engines: {node: '>=12'} 271 | cpu: [arm64] 272 | os: [darwin] 273 | 274 | '@esbuild/darwin-arm64@0.24.2': 275 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 276 | engines: {node: '>=18'} 277 | cpu: [arm64] 278 | os: [darwin] 279 | 280 | '@esbuild/darwin-arm64@0.25.2': 281 | resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} 282 | engines: {node: '>=18'} 283 | cpu: [arm64] 284 | os: [darwin] 285 | 286 | '@esbuild/darwin-x64@0.17.19': 287 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 288 | engines: {node: '>=12'} 289 | cpu: [x64] 290 | os: [darwin] 291 | 292 | '@esbuild/darwin-x64@0.24.2': 293 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 294 | engines: {node: '>=18'} 295 | cpu: [x64] 296 | os: [darwin] 297 | 298 | '@esbuild/darwin-x64@0.25.2': 299 | resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} 300 | engines: {node: '>=18'} 301 | cpu: [x64] 302 | os: [darwin] 303 | 304 | '@esbuild/freebsd-arm64@0.17.19': 305 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 306 | engines: {node: '>=12'} 307 | cpu: [arm64] 308 | os: [freebsd] 309 | 310 | '@esbuild/freebsd-arm64@0.24.2': 311 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 312 | engines: {node: '>=18'} 313 | cpu: [arm64] 314 | os: [freebsd] 315 | 316 | '@esbuild/freebsd-arm64@0.25.2': 317 | resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} 318 | engines: {node: '>=18'} 319 | cpu: [arm64] 320 | os: [freebsd] 321 | 322 | '@esbuild/freebsd-x64@0.17.19': 323 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 324 | engines: {node: '>=12'} 325 | cpu: [x64] 326 | os: [freebsd] 327 | 328 | '@esbuild/freebsd-x64@0.24.2': 329 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 330 | engines: {node: '>=18'} 331 | cpu: [x64] 332 | os: [freebsd] 333 | 334 | '@esbuild/freebsd-x64@0.25.2': 335 | resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} 336 | engines: {node: '>=18'} 337 | cpu: [x64] 338 | os: [freebsd] 339 | 340 | '@esbuild/linux-arm64@0.17.19': 341 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 342 | engines: {node: '>=12'} 343 | cpu: [arm64] 344 | os: [linux] 345 | 346 | '@esbuild/linux-arm64@0.24.2': 347 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 348 | engines: {node: '>=18'} 349 | cpu: [arm64] 350 | os: [linux] 351 | 352 | '@esbuild/linux-arm64@0.25.2': 353 | resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} 354 | engines: {node: '>=18'} 355 | cpu: [arm64] 356 | os: [linux] 357 | 358 | '@esbuild/linux-arm@0.17.19': 359 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 360 | engines: {node: '>=12'} 361 | cpu: [arm] 362 | os: [linux] 363 | 364 | '@esbuild/linux-arm@0.24.2': 365 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 366 | engines: {node: '>=18'} 367 | cpu: [arm] 368 | os: [linux] 369 | 370 | '@esbuild/linux-arm@0.25.2': 371 | resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} 372 | engines: {node: '>=18'} 373 | cpu: [arm] 374 | os: [linux] 375 | 376 | '@esbuild/linux-ia32@0.17.19': 377 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 378 | engines: {node: '>=12'} 379 | cpu: [ia32] 380 | os: [linux] 381 | 382 | '@esbuild/linux-ia32@0.24.2': 383 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 384 | engines: {node: '>=18'} 385 | cpu: [ia32] 386 | os: [linux] 387 | 388 | '@esbuild/linux-ia32@0.25.2': 389 | resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} 390 | engines: {node: '>=18'} 391 | cpu: [ia32] 392 | os: [linux] 393 | 394 | '@esbuild/linux-loong64@0.17.19': 395 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 396 | engines: {node: '>=12'} 397 | cpu: [loong64] 398 | os: [linux] 399 | 400 | '@esbuild/linux-loong64@0.24.2': 401 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 402 | engines: {node: '>=18'} 403 | cpu: [loong64] 404 | os: [linux] 405 | 406 | '@esbuild/linux-loong64@0.25.2': 407 | resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} 408 | engines: {node: '>=18'} 409 | cpu: [loong64] 410 | os: [linux] 411 | 412 | '@esbuild/linux-mips64el@0.17.19': 413 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 414 | engines: {node: '>=12'} 415 | cpu: [mips64el] 416 | os: [linux] 417 | 418 | '@esbuild/linux-mips64el@0.24.2': 419 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 420 | engines: {node: '>=18'} 421 | cpu: [mips64el] 422 | os: [linux] 423 | 424 | '@esbuild/linux-mips64el@0.25.2': 425 | resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} 426 | engines: {node: '>=18'} 427 | cpu: [mips64el] 428 | os: [linux] 429 | 430 | '@esbuild/linux-ppc64@0.17.19': 431 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 432 | engines: {node: '>=12'} 433 | cpu: [ppc64] 434 | os: [linux] 435 | 436 | '@esbuild/linux-ppc64@0.24.2': 437 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 438 | engines: {node: '>=18'} 439 | cpu: [ppc64] 440 | os: [linux] 441 | 442 | '@esbuild/linux-ppc64@0.25.2': 443 | resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} 444 | engines: {node: '>=18'} 445 | cpu: [ppc64] 446 | os: [linux] 447 | 448 | '@esbuild/linux-riscv64@0.17.19': 449 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 450 | engines: {node: '>=12'} 451 | cpu: [riscv64] 452 | os: [linux] 453 | 454 | '@esbuild/linux-riscv64@0.24.2': 455 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 456 | engines: {node: '>=18'} 457 | cpu: [riscv64] 458 | os: [linux] 459 | 460 | '@esbuild/linux-riscv64@0.25.2': 461 | resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} 462 | engines: {node: '>=18'} 463 | cpu: [riscv64] 464 | os: [linux] 465 | 466 | '@esbuild/linux-s390x@0.17.19': 467 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 468 | engines: {node: '>=12'} 469 | cpu: [s390x] 470 | os: [linux] 471 | 472 | '@esbuild/linux-s390x@0.24.2': 473 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 474 | engines: {node: '>=18'} 475 | cpu: [s390x] 476 | os: [linux] 477 | 478 | '@esbuild/linux-s390x@0.25.2': 479 | resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} 480 | engines: {node: '>=18'} 481 | cpu: [s390x] 482 | os: [linux] 483 | 484 | '@esbuild/linux-x64@0.17.19': 485 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 486 | engines: {node: '>=12'} 487 | cpu: [x64] 488 | os: [linux] 489 | 490 | '@esbuild/linux-x64@0.24.2': 491 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 492 | engines: {node: '>=18'} 493 | cpu: [x64] 494 | os: [linux] 495 | 496 | '@esbuild/linux-x64@0.25.2': 497 | resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} 498 | engines: {node: '>=18'} 499 | cpu: [x64] 500 | os: [linux] 501 | 502 | '@esbuild/netbsd-arm64@0.24.2': 503 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 504 | engines: {node: '>=18'} 505 | cpu: [arm64] 506 | os: [netbsd] 507 | 508 | '@esbuild/netbsd-arm64@0.25.2': 509 | resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} 510 | engines: {node: '>=18'} 511 | cpu: [arm64] 512 | os: [netbsd] 513 | 514 | '@esbuild/netbsd-x64@0.17.19': 515 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 516 | engines: {node: '>=12'} 517 | cpu: [x64] 518 | os: [netbsd] 519 | 520 | '@esbuild/netbsd-x64@0.24.2': 521 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 522 | engines: {node: '>=18'} 523 | cpu: [x64] 524 | os: [netbsd] 525 | 526 | '@esbuild/netbsd-x64@0.25.2': 527 | resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} 528 | engines: {node: '>=18'} 529 | cpu: [x64] 530 | os: [netbsd] 531 | 532 | '@esbuild/openbsd-arm64@0.24.2': 533 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 534 | engines: {node: '>=18'} 535 | cpu: [arm64] 536 | os: [openbsd] 537 | 538 | '@esbuild/openbsd-arm64@0.25.2': 539 | resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} 540 | engines: {node: '>=18'} 541 | cpu: [arm64] 542 | os: [openbsd] 543 | 544 | '@esbuild/openbsd-x64@0.17.19': 545 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 546 | engines: {node: '>=12'} 547 | cpu: [x64] 548 | os: [openbsd] 549 | 550 | '@esbuild/openbsd-x64@0.24.2': 551 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 552 | engines: {node: '>=18'} 553 | cpu: [x64] 554 | os: [openbsd] 555 | 556 | '@esbuild/openbsd-x64@0.25.2': 557 | resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} 558 | engines: {node: '>=18'} 559 | cpu: [x64] 560 | os: [openbsd] 561 | 562 | '@esbuild/sunos-x64@0.17.19': 563 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 564 | engines: {node: '>=12'} 565 | cpu: [x64] 566 | os: [sunos] 567 | 568 | '@esbuild/sunos-x64@0.24.2': 569 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 570 | engines: {node: '>=18'} 571 | cpu: [x64] 572 | os: [sunos] 573 | 574 | '@esbuild/sunos-x64@0.25.2': 575 | resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} 576 | engines: {node: '>=18'} 577 | cpu: [x64] 578 | os: [sunos] 579 | 580 | '@esbuild/win32-arm64@0.17.19': 581 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 582 | engines: {node: '>=12'} 583 | cpu: [arm64] 584 | os: [win32] 585 | 586 | '@esbuild/win32-arm64@0.24.2': 587 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 588 | engines: {node: '>=18'} 589 | cpu: [arm64] 590 | os: [win32] 591 | 592 | '@esbuild/win32-arm64@0.25.2': 593 | resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} 594 | engines: {node: '>=18'} 595 | cpu: [arm64] 596 | os: [win32] 597 | 598 | '@esbuild/win32-ia32@0.17.19': 599 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 600 | engines: {node: '>=12'} 601 | cpu: [ia32] 602 | os: [win32] 603 | 604 | '@esbuild/win32-ia32@0.24.2': 605 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 606 | engines: {node: '>=18'} 607 | cpu: [ia32] 608 | os: [win32] 609 | 610 | '@esbuild/win32-ia32@0.25.2': 611 | resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} 612 | engines: {node: '>=18'} 613 | cpu: [ia32] 614 | os: [win32] 615 | 616 | '@esbuild/win32-x64@0.17.19': 617 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 618 | engines: {node: '>=12'} 619 | cpu: [x64] 620 | os: [win32] 621 | 622 | '@esbuild/win32-x64@0.24.2': 623 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 624 | engines: {node: '>=18'} 625 | cpu: [x64] 626 | os: [win32] 627 | 628 | '@esbuild/win32-x64@0.25.2': 629 | resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} 630 | engines: {node: '>=18'} 631 | cpu: [x64] 632 | os: [win32] 633 | 634 | '@fastify/busboy@2.1.1': 635 | resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} 636 | engines: {node: '>=14'} 637 | 638 | '@img/sharp-darwin-arm64@0.33.5': 639 | resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} 640 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 641 | cpu: [arm64] 642 | os: [darwin] 643 | 644 | '@img/sharp-darwin-x64@0.33.5': 645 | resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} 646 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 647 | cpu: [x64] 648 | os: [darwin] 649 | 650 | '@img/sharp-libvips-darwin-arm64@1.0.4': 651 | resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} 652 | cpu: [arm64] 653 | os: [darwin] 654 | 655 | '@img/sharp-libvips-darwin-x64@1.0.4': 656 | resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} 657 | cpu: [x64] 658 | os: [darwin] 659 | 660 | '@img/sharp-libvips-linux-arm64@1.0.4': 661 | resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} 662 | cpu: [arm64] 663 | os: [linux] 664 | 665 | '@img/sharp-libvips-linux-arm@1.0.5': 666 | resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} 667 | cpu: [arm] 668 | os: [linux] 669 | 670 | '@img/sharp-libvips-linux-s390x@1.0.4': 671 | resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} 672 | cpu: [s390x] 673 | os: [linux] 674 | 675 | '@img/sharp-libvips-linux-x64@1.0.4': 676 | resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} 677 | cpu: [x64] 678 | os: [linux] 679 | 680 | '@img/sharp-libvips-linuxmusl-arm64@1.0.4': 681 | resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} 682 | cpu: [arm64] 683 | os: [linux] 684 | 685 | '@img/sharp-libvips-linuxmusl-x64@1.0.4': 686 | resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} 687 | cpu: [x64] 688 | os: [linux] 689 | 690 | '@img/sharp-linux-arm64@0.33.5': 691 | resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} 692 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 693 | cpu: [arm64] 694 | os: [linux] 695 | 696 | '@img/sharp-linux-arm@0.33.5': 697 | resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} 698 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 699 | cpu: [arm] 700 | os: [linux] 701 | 702 | '@img/sharp-linux-s390x@0.33.5': 703 | resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} 704 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 705 | cpu: [s390x] 706 | os: [linux] 707 | 708 | '@img/sharp-linux-x64@0.33.5': 709 | resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} 710 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 711 | cpu: [x64] 712 | os: [linux] 713 | 714 | '@img/sharp-linuxmusl-arm64@0.33.5': 715 | resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} 716 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 717 | cpu: [arm64] 718 | os: [linux] 719 | 720 | '@img/sharp-linuxmusl-x64@0.33.5': 721 | resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} 722 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 723 | cpu: [x64] 724 | os: [linux] 725 | 726 | '@img/sharp-wasm32@0.33.5': 727 | resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} 728 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 729 | cpu: [wasm32] 730 | 731 | '@img/sharp-win32-ia32@0.33.5': 732 | resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} 733 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 734 | cpu: [ia32] 735 | os: [win32] 736 | 737 | '@img/sharp-win32-x64@0.33.5': 738 | resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} 739 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 740 | cpu: [x64] 741 | os: [win32] 742 | 743 | '@jridgewell/gen-mapping@0.3.8': 744 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 745 | engines: {node: '>=6.0.0'} 746 | 747 | '@jridgewell/resolve-uri@3.1.2': 748 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 749 | engines: {node: '>=6.0.0'} 750 | 751 | '@jridgewell/set-array@1.2.1': 752 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 753 | engines: {node: '>=6.0.0'} 754 | 755 | '@jridgewell/source-map@0.3.6': 756 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 757 | 758 | '@jridgewell/sourcemap-codec@1.5.0': 759 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 760 | 761 | '@jridgewell/trace-mapping@0.3.25': 762 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 763 | 764 | '@jridgewell/trace-mapping@0.3.9': 765 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 766 | 767 | '@nodelib/fs.scandir@2.1.5': 768 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 769 | engines: {node: '>= 8'} 770 | 771 | '@nodelib/fs.stat@2.0.5': 772 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 773 | engines: {node: '>= 8'} 774 | 775 | '@nodelib/fs.walk@1.2.8': 776 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 777 | engines: {node: '>= 8'} 778 | 779 | '@rollup/plugin-terser@0.4.4': 780 | resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} 781 | engines: {node: '>=14.0.0'} 782 | peerDependencies: 783 | rollup: ^2.0.0||^3.0.0||^4.0.0 784 | peerDependenciesMeta: 785 | rollup: 786 | optional: true 787 | 788 | '@rollup/plugin-typescript@12.1.2': 789 | resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} 790 | engines: {node: '>=14.0.0'} 791 | peerDependencies: 792 | rollup: ^2.14.0||^3.0.0||^4.0.0 793 | tslib: '*' 794 | typescript: '>=3.7.0' 795 | peerDependenciesMeta: 796 | rollup: 797 | optional: true 798 | tslib: 799 | optional: true 800 | 801 | '@rollup/pluginutils@5.1.4': 802 | resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 803 | engines: {node: '>=14.0.0'} 804 | peerDependencies: 805 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 806 | peerDependenciesMeta: 807 | rollup: 808 | optional: true 809 | 810 | '@rollup/rollup-android-arm-eabi@4.40.0': 811 | resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} 812 | cpu: [arm] 813 | os: [android] 814 | 815 | '@rollup/rollup-android-arm64@4.40.0': 816 | resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} 817 | cpu: [arm64] 818 | os: [android] 819 | 820 | '@rollup/rollup-darwin-arm64@4.40.0': 821 | resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} 822 | cpu: [arm64] 823 | os: [darwin] 824 | 825 | '@rollup/rollup-darwin-x64@4.40.0': 826 | resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} 827 | cpu: [x64] 828 | os: [darwin] 829 | 830 | '@rollup/rollup-freebsd-arm64@4.40.0': 831 | resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} 832 | cpu: [arm64] 833 | os: [freebsd] 834 | 835 | '@rollup/rollup-freebsd-x64@4.40.0': 836 | resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} 837 | cpu: [x64] 838 | os: [freebsd] 839 | 840 | '@rollup/rollup-linux-arm-gnueabihf@4.40.0': 841 | resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} 842 | cpu: [arm] 843 | os: [linux] 844 | 845 | '@rollup/rollup-linux-arm-musleabihf@4.40.0': 846 | resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} 847 | cpu: [arm] 848 | os: [linux] 849 | 850 | '@rollup/rollup-linux-arm64-gnu@4.40.0': 851 | resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} 852 | cpu: [arm64] 853 | os: [linux] 854 | 855 | '@rollup/rollup-linux-arm64-musl@4.40.0': 856 | resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} 857 | cpu: [arm64] 858 | os: [linux] 859 | 860 | '@rollup/rollup-linux-loongarch64-gnu@4.40.0': 861 | resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} 862 | cpu: [loong64] 863 | os: [linux] 864 | 865 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': 866 | resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} 867 | cpu: [ppc64] 868 | os: [linux] 869 | 870 | '@rollup/rollup-linux-riscv64-gnu@4.40.0': 871 | resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} 872 | cpu: [riscv64] 873 | os: [linux] 874 | 875 | '@rollup/rollup-linux-riscv64-musl@4.40.0': 876 | resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} 877 | cpu: [riscv64] 878 | os: [linux] 879 | 880 | '@rollup/rollup-linux-s390x-gnu@4.40.0': 881 | resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} 882 | cpu: [s390x] 883 | os: [linux] 884 | 885 | '@rollup/rollup-linux-x64-gnu@4.40.0': 886 | resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} 887 | cpu: [x64] 888 | os: [linux] 889 | 890 | '@rollup/rollup-linux-x64-musl@4.40.0': 891 | resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} 892 | cpu: [x64] 893 | os: [linux] 894 | 895 | '@rollup/rollup-win32-arm64-msvc@4.40.0': 896 | resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} 897 | cpu: [arm64] 898 | os: [win32] 899 | 900 | '@rollup/rollup-win32-ia32-msvc@4.40.0': 901 | resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} 902 | cpu: [ia32] 903 | os: [win32] 904 | 905 | '@rollup/rollup-win32-x64-msvc@4.40.0': 906 | resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} 907 | cpu: [x64] 908 | os: [win32] 909 | 910 | '@sindresorhus/merge-streams@2.3.0': 911 | resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} 912 | engines: {node: '>=18'} 913 | 914 | '@types/estree@1.0.7': 915 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 916 | 917 | '@types/fs-extra@8.1.5': 918 | resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} 919 | 920 | '@types/glob@7.2.0': 921 | resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} 922 | 923 | '@types/minimatch@5.1.2': 924 | resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} 925 | 926 | '@types/node@22.14.0': 927 | resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} 928 | 929 | '@vitest/expect@3.0.9': 930 | resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} 931 | 932 | '@vitest/mocker@3.0.9': 933 | resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} 934 | peerDependencies: 935 | msw: ^2.4.9 936 | vite: ^5.0.0 || ^6.0.0 937 | peerDependenciesMeta: 938 | msw: 939 | optional: true 940 | vite: 941 | optional: true 942 | 943 | '@vitest/pretty-format@3.0.9': 944 | resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} 945 | 946 | '@vitest/pretty-format@3.1.1': 947 | resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} 948 | 949 | '@vitest/runner@3.0.9': 950 | resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} 951 | 952 | '@vitest/snapshot@3.0.9': 953 | resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} 954 | 955 | '@vitest/spy@3.0.9': 956 | resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} 957 | 958 | '@vitest/utils@3.0.9': 959 | resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} 960 | 961 | acorn-walk@8.3.2: 962 | resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} 963 | engines: {node: '>=0.4.0'} 964 | 965 | acorn@8.14.0: 966 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 967 | engines: {node: '>=0.4.0'} 968 | hasBin: true 969 | 970 | ansi-regex@2.1.1: 971 | resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} 972 | engines: {node: '>=0.10.0'} 973 | 974 | ansi-styles@2.2.1: 975 | resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} 976 | engines: {node: '>=0.10.0'} 977 | 978 | array-union@2.1.0: 979 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 980 | engines: {node: '>=8'} 981 | 982 | as-table@1.0.55: 983 | resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} 984 | 985 | assertion-error@2.0.1: 986 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 987 | engines: {node: '>=12'} 988 | 989 | balanced-match@1.0.2: 990 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 991 | 992 | birpc@0.2.14: 993 | resolution: {integrity: sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==} 994 | 995 | blake3-wasm@2.1.5: 996 | resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 997 | 998 | brace-expansion@1.1.11: 999 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1000 | 1001 | braces@3.0.3: 1002 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 1003 | engines: {node: '>=8'} 1004 | 1005 | buffer-from@1.1.2: 1006 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1007 | 1008 | cac@6.7.14: 1009 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1010 | engines: {node: '>=8'} 1011 | 1012 | chai@5.2.0: 1013 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 1014 | engines: {node: '>=12'} 1015 | 1016 | chalk@1.1.3: 1017 | resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} 1018 | engines: {node: '>=0.10.0'} 1019 | 1020 | check-error@2.1.1: 1021 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1022 | engines: {node: '>= 16'} 1023 | 1024 | cjs-module-lexer@1.4.3: 1025 | resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} 1026 | 1027 | color-convert@2.0.1: 1028 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1029 | engines: {node: '>=7.0.0'} 1030 | 1031 | color-name@1.1.4: 1032 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1033 | 1034 | color-string@1.9.1: 1035 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 1036 | 1037 | color@4.2.3: 1038 | resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 1039 | engines: {node: '>=12.5.0'} 1040 | 1041 | colorette@1.4.0: 1042 | resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} 1043 | 1044 | commander@2.20.3: 1045 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 1046 | 1047 | concat-map@0.0.1: 1048 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1049 | 1050 | cookie@0.5.0: 1051 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1052 | engines: {node: '>= 0.6'} 1053 | 1054 | cookie@0.7.2: 1055 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 1056 | engines: {node: '>= 0.6'} 1057 | 1058 | data-uri-to-buffer@2.0.2: 1059 | resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} 1060 | 1061 | debug@4.4.0: 1062 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 1063 | engines: {node: '>=6.0'} 1064 | peerDependencies: 1065 | supports-color: '*' 1066 | peerDependenciesMeta: 1067 | supports-color: 1068 | optional: true 1069 | 1070 | deep-eql@5.0.2: 1071 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 1072 | engines: {node: '>=6'} 1073 | 1074 | defu@6.1.4: 1075 | resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 1076 | 1077 | detect-libc@2.0.3: 1078 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 1079 | engines: {node: '>=8'} 1080 | 1081 | devalue@4.3.3: 1082 | resolution: {integrity: sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==} 1083 | 1084 | dir-glob@3.0.1: 1085 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1086 | engines: {node: '>=8'} 1087 | 1088 | duplexer@0.1.2: 1089 | resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} 1090 | 1091 | es-module-lexer@1.6.0: 1092 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 1093 | 1094 | esbuild@0.17.19: 1095 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 1096 | engines: {node: '>=12'} 1097 | hasBin: true 1098 | 1099 | esbuild@0.24.2: 1100 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 1101 | engines: {node: '>=18'} 1102 | hasBin: true 1103 | 1104 | esbuild@0.25.2: 1105 | resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} 1106 | engines: {node: '>=18'} 1107 | hasBin: true 1108 | 1109 | escape-string-regexp@1.0.5: 1110 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1111 | engines: {node: '>=0.8.0'} 1112 | 1113 | escape-string-regexp@4.0.0: 1114 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1115 | engines: {node: '>=10'} 1116 | 1117 | estree-walker@0.6.1: 1118 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 1119 | 1120 | estree-walker@2.0.2: 1121 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1122 | 1123 | estree-walker@3.0.3: 1124 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1125 | 1126 | exit-hook@2.2.1: 1127 | resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} 1128 | engines: {node: '>=6'} 1129 | 1130 | expect-type@1.2.1: 1131 | resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} 1132 | engines: {node: '>=12.0.0'} 1133 | 1134 | exsolve@1.0.4: 1135 | resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} 1136 | 1137 | fast-glob@3.3.3: 1138 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 1139 | engines: {node: '>=8.6.0'} 1140 | 1141 | fastq@1.19.1: 1142 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 1143 | 1144 | figures@1.7.0: 1145 | resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} 1146 | engines: {node: '>=0.10.0'} 1147 | 1148 | fill-range@7.1.1: 1149 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1150 | engines: {node: '>=8'} 1151 | 1152 | fs-extra@11.3.0: 1153 | resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} 1154 | engines: {node: '>=14.14'} 1155 | 1156 | fs-extra@8.1.0: 1157 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 1158 | engines: {node: '>=6 <7 || >=8'} 1159 | 1160 | fs.realpath@1.0.0: 1161 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1162 | 1163 | fsevents@2.3.3: 1164 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1165 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1166 | os: [darwin] 1167 | 1168 | function-bind@1.1.2: 1169 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1170 | 1171 | get-source@2.0.12: 1172 | resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} 1173 | 1174 | glob-parent@5.1.2: 1175 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1176 | engines: {node: '>= 6'} 1177 | 1178 | glob-to-regexp@0.4.1: 1179 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 1180 | 1181 | glob@7.2.3: 1182 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1183 | deprecated: Glob versions prior to v9 are no longer supported 1184 | 1185 | globby@10.0.1: 1186 | resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} 1187 | engines: {node: '>=8'} 1188 | 1189 | globby@14.1.0: 1190 | resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} 1191 | engines: {node: '>=18'} 1192 | 1193 | graceful-fs@4.2.11: 1194 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1195 | 1196 | gzip-size@3.0.0: 1197 | resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} 1198 | engines: {node: '>=0.12.0'} 1199 | 1200 | has-ansi@2.0.0: 1201 | resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} 1202 | engines: {node: '>=0.10.0'} 1203 | 1204 | hasown@2.0.2: 1205 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1206 | engines: {node: '>= 0.4'} 1207 | 1208 | ignore@5.3.2: 1209 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1210 | engines: {node: '>= 4'} 1211 | 1212 | ignore@7.0.3: 1213 | resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} 1214 | engines: {node: '>= 4'} 1215 | 1216 | inflight@1.0.6: 1217 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1218 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 1219 | 1220 | inherits@2.0.4: 1221 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1222 | 1223 | is-arrayish@0.3.2: 1224 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 1225 | 1226 | is-core-module@2.16.1: 1227 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1228 | engines: {node: '>= 0.4'} 1229 | 1230 | is-extglob@2.1.1: 1231 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1232 | engines: {node: '>=0.10.0'} 1233 | 1234 | is-glob@4.0.3: 1235 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1236 | engines: {node: '>=0.10.0'} 1237 | 1238 | is-number@7.0.0: 1239 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1240 | engines: {node: '>=0.12.0'} 1241 | 1242 | is-plain-object@3.0.1: 1243 | resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} 1244 | engines: {node: '>=0.10.0'} 1245 | 1246 | jsonfile@4.0.0: 1247 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 1248 | 1249 | jsonfile@6.1.0: 1250 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1251 | 1252 | loupe@3.1.3: 1253 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 1254 | 1255 | magic-string@0.25.9: 1256 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1257 | 1258 | magic-string@0.30.17: 1259 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1260 | 1261 | maxmin@2.1.0: 1262 | resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} 1263 | engines: {node: '>=0.12'} 1264 | 1265 | merge2@1.4.1: 1266 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1267 | engines: {node: '>= 8'} 1268 | 1269 | micromatch@4.0.8: 1270 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1271 | engines: {node: '>=8.6'} 1272 | 1273 | mime@3.0.0: 1274 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 1275 | engines: {node: '>=10.0.0'} 1276 | hasBin: true 1277 | 1278 | miniflare@3.20250310.0: 1279 | resolution: {integrity: sha512-TQAxoo2ZiQYjiOJoK3bbcyjKD/u1E3akYOeSHc2Zcp1sLVydrgzSjmxtrn65/3BfDIrUgfYHyy9wspT6wzBy/A==} 1280 | engines: {node: '>=16.13'} 1281 | hasBin: true 1282 | 1283 | miniflare@4.20250409.0: 1284 | resolution: {integrity: sha512-Hu02dYZvFR+MyrI57O6rSrOUTofcO9EIvcodgq2SAHzAeWSJw2E0oq9lylOrcckFwPMcwxUAb/cQN1LIoCyySw==} 1285 | engines: {node: '>=18.0.0'} 1286 | hasBin: true 1287 | 1288 | minimatch@3.1.2: 1289 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1290 | 1291 | ms@2.1.3: 1292 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1293 | 1294 | mustache@4.2.0: 1295 | resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} 1296 | hasBin: true 1297 | 1298 | nanoid@3.3.11: 1299 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1300 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1301 | hasBin: true 1302 | 1303 | number-is-nan@1.0.1: 1304 | resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} 1305 | engines: {node: '>=0.10.0'} 1306 | 1307 | object-assign@4.1.1: 1308 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1309 | engines: {node: '>=0.10.0'} 1310 | 1311 | ohash@2.0.11: 1312 | resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} 1313 | 1314 | once@1.4.0: 1315 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1316 | 1317 | path-is-absolute@1.0.1: 1318 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1319 | engines: {node: '>=0.10.0'} 1320 | 1321 | path-parse@1.0.7: 1322 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1323 | 1324 | path-to-regexp@6.3.0: 1325 | resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 1326 | 1327 | path-type@4.0.0: 1328 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1329 | engines: {node: '>=8'} 1330 | 1331 | path-type@6.0.0: 1332 | resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} 1333 | engines: {node: '>=18'} 1334 | 1335 | pathe@2.0.3: 1336 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1337 | 1338 | pathval@2.0.0: 1339 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1340 | engines: {node: '>= 14.16'} 1341 | 1342 | picocolors@1.1.1: 1343 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1344 | 1345 | picomatch@2.3.1: 1346 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1347 | engines: {node: '>=8.6'} 1348 | 1349 | picomatch@4.0.2: 1350 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1351 | engines: {node: '>=12'} 1352 | 1353 | postcss@8.5.3: 1354 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1355 | engines: {node: ^10 || ^12 || >=14} 1356 | 1357 | prettier@3.5.3: 1358 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 1359 | engines: {node: '>=14'} 1360 | hasBin: true 1361 | 1362 | pretty-bytes@3.0.1: 1363 | resolution: {integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==} 1364 | engines: {node: '>=0.10.0'} 1365 | 1366 | printable-characters@1.0.42: 1367 | resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} 1368 | 1369 | queue-microtask@1.2.3: 1370 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1371 | 1372 | randombytes@2.1.0: 1373 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1374 | 1375 | resolve@1.22.10: 1376 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1377 | engines: {node: '>= 0.4'} 1378 | hasBin: true 1379 | 1380 | reusify@1.1.0: 1381 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1382 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1383 | 1384 | rollup-plugin-bundle-size@1.0.3: 1385 | resolution: {integrity: sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==} 1386 | 1387 | rollup-plugin-copy@3.5.0: 1388 | resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} 1389 | engines: {node: '>=8.3'} 1390 | 1391 | rollup-plugin-inject@3.0.2: 1392 | resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} 1393 | deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. 1394 | 1395 | rollup-plugin-node-polyfills@0.2.1: 1396 | resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} 1397 | 1398 | rollup-pluginutils@2.8.2: 1399 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 1400 | 1401 | rollup@4.40.0: 1402 | resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} 1403 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1404 | hasBin: true 1405 | 1406 | run-parallel@1.2.0: 1407 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1408 | 1409 | safe-buffer@5.2.1: 1410 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1411 | 1412 | semver@7.7.1: 1413 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1414 | engines: {node: '>=10'} 1415 | hasBin: true 1416 | 1417 | serialize-javascript@6.0.2: 1418 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1419 | 1420 | sharp@0.33.5: 1421 | resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} 1422 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 1423 | 1424 | siginfo@2.0.0: 1425 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1426 | 1427 | simple-swizzle@0.2.2: 1428 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1429 | 1430 | slash@3.0.0: 1431 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1432 | engines: {node: '>=8'} 1433 | 1434 | slash@5.1.0: 1435 | resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} 1436 | engines: {node: '>=14.16'} 1437 | 1438 | smob@1.5.0: 1439 | resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} 1440 | 1441 | source-map-js@1.2.1: 1442 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1443 | engines: {node: '>=0.10.0'} 1444 | 1445 | source-map-support@0.5.21: 1446 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1447 | 1448 | source-map@0.6.1: 1449 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1450 | engines: {node: '>=0.10.0'} 1451 | 1452 | sourcemap-codec@1.4.8: 1453 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1454 | deprecated: Please use @jridgewell/sourcemap-codec instead 1455 | 1456 | stackback@0.0.2: 1457 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1458 | 1459 | stacktracey@2.1.8: 1460 | resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} 1461 | 1462 | std-env@3.9.0: 1463 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 1464 | 1465 | stoppable@1.1.0: 1466 | resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} 1467 | engines: {node: '>=4', npm: '>=6'} 1468 | 1469 | strip-ansi@3.0.1: 1470 | resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} 1471 | engines: {node: '>=0.10.0'} 1472 | 1473 | supports-color@2.0.0: 1474 | resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} 1475 | engines: {node: '>=0.8.0'} 1476 | 1477 | supports-preserve-symlinks-flag@1.0.0: 1478 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1479 | engines: {node: '>= 0.4'} 1480 | 1481 | terser@5.39.0: 1482 | resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} 1483 | engines: {node: '>=10'} 1484 | hasBin: true 1485 | 1486 | tinybench@2.9.0: 1487 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1488 | 1489 | tinyexec@0.3.2: 1490 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1491 | 1492 | tinypool@1.0.2: 1493 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1494 | engines: {node: ^18.0.0 || >=20.0.0} 1495 | 1496 | tinyrainbow@2.0.0: 1497 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 1498 | engines: {node: '>=14.0.0'} 1499 | 1500 | tinyspy@3.0.2: 1501 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1502 | engines: {node: '>=14.0.0'} 1503 | 1504 | to-regex-range@5.0.1: 1505 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1506 | engines: {node: '>=8.0'} 1507 | 1508 | tslib@2.8.1: 1509 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1510 | 1511 | turbo-darwin-64@2.5.0: 1512 | resolution: {integrity: sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag==} 1513 | cpu: [x64] 1514 | os: [darwin] 1515 | 1516 | turbo-darwin-arm64@2.5.0: 1517 | resolution: {integrity: sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA==} 1518 | cpu: [arm64] 1519 | os: [darwin] 1520 | 1521 | turbo-linux-64@2.5.0: 1522 | resolution: {integrity: sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ==} 1523 | cpu: [x64] 1524 | os: [linux] 1525 | 1526 | turbo-linux-arm64@2.5.0: 1527 | resolution: {integrity: sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA==} 1528 | cpu: [arm64] 1529 | os: [linux] 1530 | 1531 | turbo-windows-64@2.5.0: 1532 | resolution: {integrity: sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg==} 1533 | cpu: [x64] 1534 | os: [win32] 1535 | 1536 | turbo-windows-arm64@2.5.0: 1537 | resolution: {integrity: sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg==} 1538 | cpu: [arm64] 1539 | os: [win32] 1540 | 1541 | turbo@2.5.0: 1542 | resolution: {integrity: sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA==} 1543 | hasBin: true 1544 | 1545 | typescript@5.8.2: 1546 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 1547 | engines: {node: '>=14.17'} 1548 | hasBin: true 1549 | 1550 | ufo@1.6.1: 1551 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1552 | 1553 | undici-types@6.21.0: 1554 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1555 | 1556 | undici@5.29.0: 1557 | resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} 1558 | engines: {node: '>=14.0'} 1559 | 1560 | unenv@2.0.0-rc.14: 1561 | resolution: {integrity: sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==} 1562 | 1563 | unenv@2.0.0-rc.15: 1564 | resolution: {integrity: sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==} 1565 | 1566 | unicorn-magic@0.3.0: 1567 | resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} 1568 | engines: {node: '>=18'} 1569 | 1570 | universalify@0.1.2: 1571 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1572 | engines: {node: '>= 4.0.0'} 1573 | 1574 | universalify@2.0.1: 1575 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1576 | engines: {node: '>= 10.0.0'} 1577 | 1578 | vite-node@3.0.9: 1579 | resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} 1580 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1581 | hasBin: true 1582 | 1583 | vite@6.2.6: 1584 | resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==} 1585 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1586 | hasBin: true 1587 | peerDependencies: 1588 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1589 | jiti: '>=1.21.0' 1590 | less: '*' 1591 | lightningcss: ^1.21.0 1592 | sass: '*' 1593 | sass-embedded: '*' 1594 | stylus: '*' 1595 | sugarss: '*' 1596 | terser: ^5.16.0 1597 | tsx: ^4.8.1 1598 | yaml: ^2.4.2 1599 | peerDependenciesMeta: 1600 | '@types/node': 1601 | optional: true 1602 | jiti: 1603 | optional: true 1604 | less: 1605 | optional: true 1606 | lightningcss: 1607 | optional: true 1608 | sass: 1609 | optional: true 1610 | sass-embedded: 1611 | optional: true 1612 | stylus: 1613 | optional: true 1614 | sugarss: 1615 | optional: true 1616 | terser: 1617 | optional: true 1618 | tsx: 1619 | optional: true 1620 | yaml: 1621 | optional: true 1622 | 1623 | vitest@3.0.9: 1624 | resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} 1625 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1626 | hasBin: true 1627 | peerDependencies: 1628 | '@edge-runtime/vm': '*' 1629 | '@types/debug': ^4.1.12 1630 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1631 | '@vitest/browser': 3.0.9 1632 | '@vitest/ui': 3.0.9 1633 | happy-dom: '*' 1634 | jsdom: '*' 1635 | peerDependenciesMeta: 1636 | '@edge-runtime/vm': 1637 | optional: true 1638 | '@types/debug': 1639 | optional: true 1640 | '@types/node': 1641 | optional: true 1642 | '@vitest/browser': 1643 | optional: true 1644 | '@vitest/ui': 1645 | optional: true 1646 | happy-dom: 1647 | optional: true 1648 | jsdom: 1649 | optional: true 1650 | 1651 | why-is-node-running@2.3.0: 1652 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1653 | engines: {node: '>=8'} 1654 | hasBin: true 1655 | 1656 | workerd@1.20250310.0: 1657 | resolution: {integrity: sha512-bAaZ9Bmts3mArbIrXYAtr+ZRsAJAAUEsCtvwfBavIYXaZ5sgdEOJBEiBbvsHp6CsVObegOM85tIWpYLpbTxQrQ==} 1658 | engines: {node: '>=16'} 1659 | hasBin: true 1660 | 1661 | workerd@1.20250409.0: 1662 | resolution: {integrity: sha512-hqjX9swiHvrkOI3jlH9lrZsZRRv9lddUwcMe8Ua76jnyQz+brybWznNjHu8U5oswwcrFwvky1A4CcLjcLY31gQ==} 1663 | engines: {node: '>=16'} 1664 | hasBin: true 1665 | 1666 | wrangler@3.114.1: 1667 | resolution: {integrity: sha512-GuS6SrnAZZDiNb20Vf2Ww0KCfnctHUEzi5GyML1i2brfQPI6BikgI/W/u6XDtYtah0OkbIWIiNJ+SdhWT7KEcw==} 1668 | engines: {node: '>=16.17.0'} 1669 | hasBin: true 1670 | peerDependencies: 1671 | '@cloudflare/workers-types': ^4.20250310.0 1672 | peerDependenciesMeta: 1673 | '@cloudflare/workers-types': 1674 | optional: true 1675 | 1676 | wrangler@4.10.0: 1677 | resolution: {integrity: sha512-fTE4hZ79msEUt8+HEjl/8Q72haCyzPLu4PgrU3L81ysmjrMEdiYfUPqnvCkBUVtJvrDNdctTEimkufT1Y0ipNg==} 1678 | engines: {node: '>=18.0.0'} 1679 | hasBin: true 1680 | peerDependencies: 1681 | '@cloudflare/workers-types': ^4.20250409.0 1682 | peerDependenciesMeta: 1683 | '@cloudflare/workers-types': 1684 | optional: true 1685 | 1686 | wrappy@1.0.2: 1687 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1688 | 1689 | ws@8.18.0: 1690 | resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} 1691 | engines: {node: '>=10.0.0'} 1692 | peerDependencies: 1693 | bufferutil: ^4.0.1 1694 | utf-8-validate: '>=5.0.2' 1695 | peerDependenciesMeta: 1696 | bufferutil: 1697 | optional: true 1698 | utf-8-validate: 1699 | optional: true 1700 | 1701 | youch@3.2.3: 1702 | resolution: {integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==} 1703 | 1704 | youch@3.3.4: 1705 | resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} 1706 | 1707 | zod@3.22.3: 1708 | resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} 1709 | 1710 | zod@3.24.2: 1711 | resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} 1712 | 1713 | snapshots: 1714 | 1715 | '@cloudflare/kv-asset-handler@0.3.4': 1716 | dependencies: 1717 | mime: 3.0.0 1718 | 1719 | '@cloudflare/kv-asset-handler@0.4.0': 1720 | dependencies: 1721 | mime: 3.0.0 1722 | 1723 | '@cloudflare/unenv-preset@2.0.2(unenv@2.0.0-rc.14)(workerd@1.20250310.0)': 1724 | dependencies: 1725 | unenv: 2.0.0-rc.14 1726 | optionalDependencies: 1727 | workerd: 1.20250310.0 1728 | 1729 | '@cloudflare/unenv-preset@2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250409.0)': 1730 | dependencies: 1731 | unenv: 2.0.0-rc.15 1732 | optionalDependencies: 1733 | workerd: 1.20250409.0 1734 | 1735 | '@cloudflare/vitest-pool-workers@0.7.8(@cloudflare/workers-types@4.20250414.0)(@vitest/runner@3.0.9)(@vitest/snapshot@3.0.9)(vitest@3.0.9(@edge-runtime/vm@5.0.0)(@types/node@22.14.0)(terser@5.39.0))': 1736 | dependencies: 1737 | '@vitest/runner': 3.0.9 1738 | '@vitest/snapshot': 3.0.9 1739 | birpc: 0.2.14 1740 | cjs-module-lexer: 1.4.3 1741 | devalue: 4.3.3 1742 | esbuild: 0.17.19 1743 | miniflare: 3.20250310.0 1744 | semver: 7.7.1 1745 | vitest: 3.0.9(@edge-runtime/vm@5.0.0)(@types/node@22.14.0)(terser@5.39.0) 1746 | wrangler: 3.114.1(@cloudflare/workers-types@4.20250414.0) 1747 | zod: 3.24.2 1748 | transitivePeerDependencies: 1749 | - '@cloudflare/workers-types' 1750 | - bufferutil 1751 | - utf-8-validate 1752 | 1753 | '@cloudflare/workerd-darwin-64@1.20250310.0': 1754 | optional: true 1755 | 1756 | '@cloudflare/workerd-darwin-64@1.20250409.0': 1757 | optional: true 1758 | 1759 | '@cloudflare/workerd-darwin-arm64@1.20250310.0': 1760 | optional: true 1761 | 1762 | '@cloudflare/workerd-darwin-arm64@1.20250409.0': 1763 | optional: true 1764 | 1765 | '@cloudflare/workerd-linux-64@1.20250310.0': 1766 | optional: true 1767 | 1768 | '@cloudflare/workerd-linux-64@1.20250409.0': 1769 | optional: true 1770 | 1771 | '@cloudflare/workerd-linux-arm64@1.20250310.0': 1772 | optional: true 1773 | 1774 | '@cloudflare/workerd-linux-arm64@1.20250409.0': 1775 | optional: true 1776 | 1777 | '@cloudflare/workerd-windows-64@1.20250310.0': 1778 | optional: true 1779 | 1780 | '@cloudflare/workerd-windows-64@1.20250409.0': 1781 | optional: true 1782 | 1783 | '@cloudflare/workers-types@4.20250414.0': {} 1784 | 1785 | '@cspotcode/source-map-support@0.8.1': 1786 | dependencies: 1787 | '@jridgewell/trace-mapping': 0.3.9 1788 | 1789 | '@edge-runtime/primitives@6.0.0': {} 1790 | 1791 | '@edge-runtime/vm@5.0.0': 1792 | dependencies: 1793 | '@edge-runtime/primitives': 6.0.0 1794 | 1795 | '@emnapi/runtime@1.4.1': 1796 | dependencies: 1797 | tslib: 2.8.1 1798 | optional: true 1799 | 1800 | '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': 1801 | dependencies: 1802 | esbuild: 0.17.19 1803 | 1804 | '@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19)': 1805 | dependencies: 1806 | esbuild: 0.17.19 1807 | escape-string-regexp: 4.0.0 1808 | rollup-plugin-node-polyfills: 0.2.1 1809 | 1810 | '@esbuild/aix-ppc64@0.24.2': 1811 | optional: true 1812 | 1813 | '@esbuild/aix-ppc64@0.25.2': 1814 | optional: true 1815 | 1816 | '@esbuild/android-arm64@0.17.19': 1817 | optional: true 1818 | 1819 | '@esbuild/android-arm64@0.24.2': 1820 | optional: true 1821 | 1822 | '@esbuild/android-arm64@0.25.2': 1823 | optional: true 1824 | 1825 | '@esbuild/android-arm@0.17.19': 1826 | optional: true 1827 | 1828 | '@esbuild/android-arm@0.24.2': 1829 | optional: true 1830 | 1831 | '@esbuild/android-arm@0.25.2': 1832 | optional: true 1833 | 1834 | '@esbuild/android-x64@0.17.19': 1835 | optional: true 1836 | 1837 | '@esbuild/android-x64@0.24.2': 1838 | optional: true 1839 | 1840 | '@esbuild/android-x64@0.25.2': 1841 | optional: true 1842 | 1843 | '@esbuild/darwin-arm64@0.17.19': 1844 | optional: true 1845 | 1846 | '@esbuild/darwin-arm64@0.24.2': 1847 | optional: true 1848 | 1849 | '@esbuild/darwin-arm64@0.25.2': 1850 | optional: true 1851 | 1852 | '@esbuild/darwin-x64@0.17.19': 1853 | optional: true 1854 | 1855 | '@esbuild/darwin-x64@0.24.2': 1856 | optional: true 1857 | 1858 | '@esbuild/darwin-x64@0.25.2': 1859 | optional: true 1860 | 1861 | '@esbuild/freebsd-arm64@0.17.19': 1862 | optional: true 1863 | 1864 | '@esbuild/freebsd-arm64@0.24.2': 1865 | optional: true 1866 | 1867 | '@esbuild/freebsd-arm64@0.25.2': 1868 | optional: true 1869 | 1870 | '@esbuild/freebsd-x64@0.17.19': 1871 | optional: true 1872 | 1873 | '@esbuild/freebsd-x64@0.24.2': 1874 | optional: true 1875 | 1876 | '@esbuild/freebsd-x64@0.25.2': 1877 | optional: true 1878 | 1879 | '@esbuild/linux-arm64@0.17.19': 1880 | optional: true 1881 | 1882 | '@esbuild/linux-arm64@0.24.2': 1883 | optional: true 1884 | 1885 | '@esbuild/linux-arm64@0.25.2': 1886 | optional: true 1887 | 1888 | '@esbuild/linux-arm@0.17.19': 1889 | optional: true 1890 | 1891 | '@esbuild/linux-arm@0.24.2': 1892 | optional: true 1893 | 1894 | '@esbuild/linux-arm@0.25.2': 1895 | optional: true 1896 | 1897 | '@esbuild/linux-ia32@0.17.19': 1898 | optional: true 1899 | 1900 | '@esbuild/linux-ia32@0.24.2': 1901 | optional: true 1902 | 1903 | '@esbuild/linux-ia32@0.25.2': 1904 | optional: true 1905 | 1906 | '@esbuild/linux-loong64@0.17.19': 1907 | optional: true 1908 | 1909 | '@esbuild/linux-loong64@0.24.2': 1910 | optional: true 1911 | 1912 | '@esbuild/linux-loong64@0.25.2': 1913 | optional: true 1914 | 1915 | '@esbuild/linux-mips64el@0.17.19': 1916 | optional: true 1917 | 1918 | '@esbuild/linux-mips64el@0.24.2': 1919 | optional: true 1920 | 1921 | '@esbuild/linux-mips64el@0.25.2': 1922 | optional: true 1923 | 1924 | '@esbuild/linux-ppc64@0.17.19': 1925 | optional: true 1926 | 1927 | '@esbuild/linux-ppc64@0.24.2': 1928 | optional: true 1929 | 1930 | '@esbuild/linux-ppc64@0.25.2': 1931 | optional: true 1932 | 1933 | '@esbuild/linux-riscv64@0.17.19': 1934 | optional: true 1935 | 1936 | '@esbuild/linux-riscv64@0.24.2': 1937 | optional: true 1938 | 1939 | '@esbuild/linux-riscv64@0.25.2': 1940 | optional: true 1941 | 1942 | '@esbuild/linux-s390x@0.17.19': 1943 | optional: true 1944 | 1945 | '@esbuild/linux-s390x@0.24.2': 1946 | optional: true 1947 | 1948 | '@esbuild/linux-s390x@0.25.2': 1949 | optional: true 1950 | 1951 | '@esbuild/linux-x64@0.17.19': 1952 | optional: true 1953 | 1954 | '@esbuild/linux-x64@0.24.2': 1955 | optional: true 1956 | 1957 | '@esbuild/linux-x64@0.25.2': 1958 | optional: true 1959 | 1960 | '@esbuild/netbsd-arm64@0.24.2': 1961 | optional: true 1962 | 1963 | '@esbuild/netbsd-arm64@0.25.2': 1964 | optional: true 1965 | 1966 | '@esbuild/netbsd-x64@0.17.19': 1967 | optional: true 1968 | 1969 | '@esbuild/netbsd-x64@0.24.2': 1970 | optional: true 1971 | 1972 | '@esbuild/netbsd-x64@0.25.2': 1973 | optional: true 1974 | 1975 | '@esbuild/openbsd-arm64@0.24.2': 1976 | optional: true 1977 | 1978 | '@esbuild/openbsd-arm64@0.25.2': 1979 | optional: true 1980 | 1981 | '@esbuild/openbsd-x64@0.17.19': 1982 | optional: true 1983 | 1984 | '@esbuild/openbsd-x64@0.24.2': 1985 | optional: true 1986 | 1987 | '@esbuild/openbsd-x64@0.25.2': 1988 | optional: true 1989 | 1990 | '@esbuild/sunos-x64@0.17.19': 1991 | optional: true 1992 | 1993 | '@esbuild/sunos-x64@0.24.2': 1994 | optional: true 1995 | 1996 | '@esbuild/sunos-x64@0.25.2': 1997 | optional: true 1998 | 1999 | '@esbuild/win32-arm64@0.17.19': 2000 | optional: true 2001 | 2002 | '@esbuild/win32-arm64@0.24.2': 2003 | optional: true 2004 | 2005 | '@esbuild/win32-arm64@0.25.2': 2006 | optional: true 2007 | 2008 | '@esbuild/win32-ia32@0.17.19': 2009 | optional: true 2010 | 2011 | '@esbuild/win32-ia32@0.24.2': 2012 | optional: true 2013 | 2014 | '@esbuild/win32-ia32@0.25.2': 2015 | optional: true 2016 | 2017 | '@esbuild/win32-x64@0.17.19': 2018 | optional: true 2019 | 2020 | '@esbuild/win32-x64@0.24.2': 2021 | optional: true 2022 | 2023 | '@esbuild/win32-x64@0.25.2': 2024 | optional: true 2025 | 2026 | '@fastify/busboy@2.1.1': {} 2027 | 2028 | '@img/sharp-darwin-arm64@0.33.5': 2029 | optionalDependencies: 2030 | '@img/sharp-libvips-darwin-arm64': 1.0.4 2031 | optional: true 2032 | 2033 | '@img/sharp-darwin-x64@0.33.5': 2034 | optionalDependencies: 2035 | '@img/sharp-libvips-darwin-x64': 1.0.4 2036 | optional: true 2037 | 2038 | '@img/sharp-libvips-darwin-arm64@1.0.4': 2039 | optional: true 2040 | 2041 | '@img/sharp-libvips-darwin-x64@1.0.4': 2042 | optional: true 2043 | 2044 | '@img/sharp-libvips-linux-arm64@1.0.4': 2045 | optional: true 2046 | 2047 | '@img/sharp-libvips-linux-arm@1.0.5': 2048 | optional: true 2049 | 2050 | '@img/sharp-libvips-linux-s390x@1.0.4': 2051 | optional: true 2052 | 2053 | '@img/sharp-libvips-linux-x64@1.0.4': 2054 | optional: true 2055 | 2056 | '@img/sharp-libvips-linuxmusl-arm64@1.0.4': 2057 | optional: true 2058 | 2059 | '@img/sharp-libvips-linuxmusl-x64@1.0.4': 2060 | optional: true 2061 | 2062 | '@img/sharp-linux-arm64@0.33.5': 2063 | optionalDependencies: 2064 | '@img/sharp-libvips-linux-arm64': 1.0.4 2065 | optional: true 2066 | 2067 | '@img/sharp-linux-arm@0.33.5': 2068 | optionalDependencies: 2069 | '@img/sharp-libvips-linux-arm': 1.0.5 2070 | optional: true 2071 | 2072 | '@img/sharp-linux-s390x@0.33.5': 2073 | optionalDependencies: 2074 | '@img/sharp-libvips-linux-s390x': 1.0.4 2075 | optional: true 2076 | 2077 | '@img/sharp-linux-x64@0.33.5': 2078 | optionalDependencies: 2079 | '@img/sharp-libvips-linux-x64': 1.0.4 2080 | optional: true 2081 | 2082 | '@img/sharp-linuxmusl-arm64@0.33.5': 2083 | optionalDependencies: 2084 | '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 2085 | optional: true 2086 | 2087 | '@img/sharp-linuxmusl-x64@0.33.5': 2088 | optionalDependencies: 2089 | '@img/sharp-libvips-linuxmusl-x64': 1.0.4 2090 | optional: true 2091 | 2092 | '@img/sharp-wasm32@0.33.5': 2093 | dependencies: 2094 | '@emnapi/runtime': 1.4.1 2095 | optional: true 2096 | 2097 | '@img/sharp-win32-ia32@0.33.5': 2098 | optional: true 2099 | 2100 | '@img/sharp-win32-x64@0.33.5': 2101 | optional: true 2102 | 2103 | '@jridgewell/gen-mapping@0.3.8': 2104 | dependencies: 2105 | '@jridgewell/set-array': 1.2.1 2106 | '@jridgewell/sourcemap-codec': 1.5.0 2107 | '@jridgewell/trace-mapping': 0.3.25 2108 | 2109 | '@jridgewell/resolve-uri@3.1.2': {} 2110 | 2111 | '@jridgewell/set-array@1.2.1': {} 2112 | 2113 | '@jridgewell/source-map@0.3.6': 2114 | dependencies: 2115 | '@jridgewell/gen-mapping': 0.3.8 2116 | '@jridgewell/trace-mapping': 0.3.25 2117 | 2118 | '@jridgewell/sourcemap-codec@1.5.0': {} 2119 | 2120 | '@jridgewell/trace-mapping@0.3.25': 2121 | dependencies: 2122 | '@jridgewell/resolve-uri': 3.1.2 2123 | '@jridgewell/sourcemap-codec': 1.5.0 2124 | 2125 | '@jridgewell/trace-mapping@0.3.9': 2126 | dependencies: 2127 | '@jridgewell/resolve-uri': 3.1.2 2128 | '@jridgewell/sourcemap-codec': 1.5.0 2129 | 2130 | '@nodelib/fs.scandir@2.1.5': 2131 | dependencies: 2132 | '@nodelib/fs.stat': 2.0.5 2133 | run-parallel: 1.2.0 2134 | 2135 | '@nodelib/fs.stat@2.0.5': {} 2136 | 2137 | '@nodelib/fs.walk@1.2.8': 2138 | dependencies: 2139 | '@nodelib/fs.scandir': 2.1.5 2140 | fastq: 1.19.1 2141 | 2142 | '@rollup/plugin-terser@0.4.4(rollup@4.40.0)': 2143 | dependencies: 2144 | serialize-javascript: 6.0.2 2145 | smob: 1.5.0 2146 | terser: 5.39.0 2147 | optionalDependencies: 2148 | rollup: 4.40.0 2149 | 2150 | '@rollup/plugin-typescript@12.1.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.2)': 2151 | dependencies: 2152 | '@rollup/pluginutils': 5.1.4(rollup@4.40.0) 2153 | resolve: 1.22.10 2154 | typescript: 5.8.2 2155 | optionalDependencies: 2156 | rollup: 4.40.0 2157 | tslib: 2.8.1 2158 | 2159 | '@rollup/pluginutils@5.1.4(rollup@4.40.0)': 2160 | dependencies: 2161 | '@types/estree': 1.0.7 2162 | estree-walker: 2.0.2 2163 | picomatch: 4.0.2 2164 | optionalDependencies: 2165 | rollup: 4.40.0 2166 | 2167 | '@rollup/rollup-android-arm-eabi@4.40.0': 2168 | optional: true 2169 | 2170 | '@rollup/rollup-android-arm64@4.40.0': 2171 | optional: true 2172 | 2173 | '@rollup/rollup-darwin-arm64@4.40.0': 2174 | optional: true 2175 | 2176 | '@rollup/rollup-darwin-x64@4.40.0': 2177 | optional: true 2178 | 2179 | '@rollup/rollup-freebsd-arm64@4.40.0': 2180 | optional: true 2181 | 2182 | '@rollup/rollup-freebsd-x64@4.40.0': 2183 | optional: true 2184 | 2185 | '@rollup/rollup-linux-arm-gnueabihf@4.40.0': 2186 | optional: true 2187 | 2188 | '@rollup/rollup-linux-arm-musleabihf@4.40.0': 2189 | optional: true 2190 | 2191 | '@rollup/rollup-linux-arm64-gnu@4.40.0': 2192 | optional: true 2193 | 2194 | '@rollup/rollup-linux-arm64-musl@4.40.0': 2195 | optional: true 2196 | 2197 | '@rollup/rollup-linux-loongarch64-gnu@4.40.0': 2198 | optional: true 2199 | 2200 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': 2201 | optional: true 2202 | 2203 | '@rollup/rollup-linux-riscv64-gnu@4.40.0': 2204 | optional: true 2205 | 2206 | '@rollup/rollup-linux-riscv64-musl@4.40.0': 2207 | optional: true 2208 | 2209 | '@rollup/rollup-linux-s390x-gnu@4.40.0': 2210 | optional: true 2211 | 2212 | '@rollup/rollup-linux-x64-gnu@4.40.0': 2213 | optional: true 2214 | 2215 | '@rollup/rollup-linux-x64-musl@4.40.0': 2216 | optional: true 2217 | 2218 | '@rollup/rollup-win32-arm64-msvc@4.40.0': 2219 | optional: true 2220 | 2221 | '@rollup/rollup-win32-ia32-msvc@4.40.0': 2222 | optional: true 2223 | 2224 | '@rollup/rollup-win32-x64-msvc@4.40.0': 2225 | optional: true 2226 | 2227 | '@sindresorhus/merge-streams@2.3.0': {} 2228 | 2229 | '@types/estree@1.0.7': {} 2230 | 2231 | '@types/fs-extra@8.1.5': 2232 | dependencies: 2233 | '@types/node': 22.14.0 2234 | 2235 | '@types/glob@7.2.0': 2236 | dependencies: 2237 | '@types/minimatch': 5.1.2 2238 | '@types/node': 22.14.0 2239 | 2240 | '@types/minimatch@5.1.2': {} 2241 | 2242 | '@types/node@22.14.0': 2243 | dependencies: 2244 | undici-types: 6.21.0 2245 | 2246 | '@vitest/expect@3.0.9': 2247 | dependencies: 2248 | '@vitest/spy': 3.0.9 2249 | '@vitest/utils': 3.0.9 2250 | chai: 5.2.0 2251 | tinyrainbow: 2.0.0 2252 | 2253 | '@vitest/mocker@3.0.9(vite@6.2.6(@types/node@22.14.0)(terser@5.39.0))': 2254 | dependencies: 2255 | '@vitest/spy': 3.0.9 2256 | estree-walker: 3.0.3 2257 | magic-string: 0.30.17 2258 | optionalDependencies: 2259 | vite: 6.2.6(@types/node@22.14.0)(terser@5.39.0) 2260 | 2261 | '@vitest/pretty-format@3.0.9': 2262 | dependencies: 2263 | tinyrainbow: 2.0.0 2264 | 2265 | '@vitest/pretty-format@3.1.1': 2266 | dependencies: 2267 | tinyrainbow: 2.0.0 2268 | 2269 | '@vitest/runner@3.0.9': 2270 | dependencies: 2271 | '@vitest/utils': 3.0.9 2272 | pathe: 2.0.3 2273 | 2274 | '@vitest/snapshot@3.0.9': 2275 | dependencies: 2276 | '@vitest/pretty-format': 3.0.9 2277 | magic-string: 0.30.17 2278 | pathe: 2.0.3 2279 | 2280 | '@vitest/spy@3.0.9': 2281 | dependencies: 2282 | tinyspy: 3.0.2 2283 | 2284 | '@vitest/utils@3.0.9': 2285 | dependencies: 2286 | '@vitest/pretty-format': 3.0.9 2287 | loupe: 3.1.3 2288 | tinyrainbow: 2.0.0 2289 | 2290 | acorn-walk@8.3.2: {} 2291 | 2292 | acorn@8.14.0: {} 2293 | 2294 | ansi-regex@2.1.1: {} 2295 | 2296 | ansi-styles@2.2.1: {} 2297 | 2298 | array-union@2.1.0: {} 2299 | 2300 | as-table@1.0.55: 2301 | dependencies: 2302 | printable-characters: 1.0.42 2303 | 2304 | assertion-error@2.0.1: {} 2305 | 2306 | balanced-match@1.0.2: {} 2307 | 2308 | birpc@0.2.14: {} 2309 | 2310 | blake3-wasm@2.1.5: {} 2311 | 2312 | brace-expansion@1.1.11: 2313 | dependencies: 2314 | balanced-match: 1.0.2 2315 | concat-map: 0.0.1 2316 | 2317 | braces@3.0.3: 2318 | dependencies: 2319 | fill-range: 7.1.1 2320 | 2321 | buffer-from@1.1.2: {} 2322 | 2323 | cac@6.7.14: {} 2324 | 2325 | chai@5.2.0: 2326 | dependencies: 2327 | assertion-error: 2.0.1 2328 | check-error: 2.1.1 2329 | deep-eql: 5.0.2 2330 | loupe: 3.1.3 2331 | pathval: 2.0.0 2332 | 2333 | chalk@1.1.3: 2334 | dependencies: 2335 | ansi-styles: 2.2.1 2336 | escape-string-regexp: 1.0.5 2337 | has-ansi: 2.0.0 2338 | strip-ansi: 3.0.1 2339 | supports-color: 2.0.0 2340 | 2341 | check-error@2.1.1: {} 2342 | 2343 | cjs-module-lexer@1.4.3: {} 2344 | 2345 | color-convert@2.0.1: 2346 | dependencies: 2347 | color-name: 1.1.4 2348 | optional: true 2349 | 2350 | color-name@1.1.4: 2351 | optional: true 2352 | 2353 | color-string@1.9.1: 2354 | dependencies: 2355 | color-name: 1.1.4 2356 | simple-swizzle: 0.2.2 2357 | optional: true 2358 | 2359 | color@4.2.3: 2360 | dependencies: 2361 | color-convert: 2.0.1 2362 | color-string: 1.9.1 2363 | optional: true 2364 | 2365 | colorette@1.4.0: {} 2366 | 2367 | commander@2.20.3: {} 2368 | 2369 | concat-map@0.0.1: {} 2370 | 2371 | cookie@0.5.0: {} 2372 | 2373 | cookie@0.7.2: {} 2374 | 2375 | data-uri-to-buffer@2.0.2: {} 2376 | 2377 | debug@4.4.0: 2378 | dependencies: 2379 | ms: 2.1.3 2380 | 2381 | deep-eql@5.0.2: {} 2382 | 2383 | defu@6.1.4: {} 2384 | 2385 | detect-libc@2.0.3: 2386 | optional: true 2387 | 2388 | devalue@4.3.3: {} 2389 | 2390 | dir-glob@3.0.1: 2391 | dependencies: 2392 | path-type: 4.0.0 2393 | 2394 | duplexer@0.1.2: {} 2395 | 2396 | es-module-lexer@1.6.0: {} 2397 | 2398 | esbuild@0.17.19: 2399 | optionalDependencies: 2400 | '@esbuild/android-arm': 0.17.19 2401 | '@esbuild/android-arm64': 0.17.19 2402 | '@esbuild/android-x64': 0.17.19 2403 | '@esbuild/darwin-arm64': 0.17.19 2404 | '@esbuild/darwin-x64': 0.17.19 2405 | '@esbuild/freebsd-arm64': 0.17.19 2406 | '@esbuild/freebsd-x64': 0.17.19 2407 | '@esbuild/linux-arm': 0.17.19 2408 | '@esbuild/linux-arm64': 0.17.19 2409 | '@esbuild/linux-ia32': 0.17.19 2410 | '@esbuild/linux-loong64': 0.17.19 2411 | '@esbuild/linux-mips64el': 0.17.19 2412 | '@esbuild/linux-ppc64': 0.17.19 2413 | '@esbuild/linux-riscv64': 0.17.19 2414 | '@esbuild/linux-s390x': 0.17.19 2415 | '@esbuild/linux-x64': 0.17.19 2416 | '@esbuild/netbsd-x64': 0.17.19 2417 | '@esbuild/openbsd-x64': 0.17.19 2418 | '@esbuild/sunos-x64': 0.17.19 2419 | '@esbuild/win32-arm64': 0.17.19 2420 | '@esbuild/win32-ia32': 0.17.19 2421 | '@esbuild/win32-x64': 0.17.19 2422 | 2423 | esbuild@0.24.2: 2424 | optionalDependencies: 2425 | '@esbuild/aix-ppc64': 0.24.2 2426 | '@esbuild/android-arm': 0.24.2 2427 | '@esbuild/android-arm64': 0.24.2 2428 | '@esbuild/android-x64': 0.24.2 2429 | '@esbuild/darwin-arm64': 0.24.2 2430 | '@esbuild/darwin-x64': 0.24.2 2431 | '@esbuild/freebsd-arm64': 0.24.2 2432 | '@esbuild/freebsd-x64': 0.24.2 2433 | '@esbuild/linux-arm': 0.24.2 2434 | '@esbuild/linux-arm64': 0.24.2 2435 | '@esbuild/linux-ia32': 0.24.2 2436 | '@esbuild/linux-loong64': 0.24.2 2437 | '@esbuild/linux-mips64el': 0.24.2 2438 | '@esbuild/linux-ppc64': 0.24.2 2439 | '@esbuild/linux-riscv64': 0.24.2 2440 | '@esbuild/linux-s390x': 0.24.2 2441 | '@esbuild/linux-x64': 0.24.2 2442 | '@esbuild/netbsd-arm64': 0.24.2 2443 | '@esbuild/netbsd-x64': 0.24.2 2444 | '@esbuild/openbsd-arm64': 0.24.2 2445 | '@esbuild/openbsd-x64': 0.24.2 2446 | '@esbuild/sunos-x64': 0.24.2 2447 | '@esbuild/win32-arm64': 0.24.2 2448 | '@esbuild/win32-ia32': 0.24.2 2449 | '@esbuild/win32-x64': 0.24.2 2450 | 2451 | esbuild@0.25.2: 2452 | optionalDependencies: 2453 | '@esbuild/aix-ppc64': 0.25.2 2454 | '@esbuild/android-arm': 0.25.2 2455 | '@esbuild/android-arm64': 0.25.2 2456 | '@esbuild/android-x64': 0.25.2 2457 | '@esbuild/darwin-arm64': 0.25.2 2458 | '@esbuild/darwin-x64': 0.25.2 2459 | '@esbuild/freebsd-arm64': 0.25.2 2460 | '@esbuild/freebsd-x64': 0.25.2 2461 | '@esbuild/linux-arm': 0.25.2 2462 | '@esbuild/linux-arm64': 0.25.2 2463 | '@esbuild/linux-ia32': 0.25.2 2464 | '@esbuild/linux-loong64': 0.25.2 2465 | '@esbuild/linux-mips64el': 0.25.2 2466 | '@esbuild/linux-ppc64': 0.25.2 2467 | '@esbuild/linux-riscv64': 0.25.2 2468 | '@esbuild/linux-s390x': 0.25.2 2469 | '@esbuild/linux-x64': 0.25.2 2470 | '@esbuild/netbsd-arm64': 0.25.2 2471 | '@esbuild/netbsd-x64': 0.25.2 2472 | '@esbuild/openbsd-arm64': 0.25.2 2473 | '@esbuild/openbsd-x64': 0.25.2 2474 | '@esbuild/sunos-x64': 0.25.2 2475 | '@esbuild/win32-arm64': 0.25.2 2476 | '@esbuild/win32-ia32': 0.25.2 2477 | '@esbuild/win32-x64': 0.25.2 2478 | 2479 | escape-string-regexp@1.0.5: {} 2480 | 2481 | escape-string-regexp@4.0.0: {} 2482 | 2483 | estree-walker@0.6.1: {} 2484 | 2485 | estree-walker@2.0.2: {} 2486 | 2487 | estree-walker@3.0.3: 2488 | dependencies: 2489 | '@types/estree': 1.0.7 2490 | 2491 | exit-hook@2.2.1: {} 2492 | 2493 | expect-type@1.2.1: {} 2494 | 2495 | exsolve@1.0.4: {} 2496 | 2497 | fast-glob@3.3.3: 2498 | dependencies: 2499 | '@nodelib/fs.stat': 2.0.5 2500 | '@nodelib/fs.walk': 1.2.8 2501 | glob-parent: 5.1.2 2502 | merge2: 1.4.1 2503 | micromatch: 4.0.8 2504 | 2505 | fastq@1.19.1: 2506 | dependencies: 2507 | reusify: 1.1.0 2508 | 2509 | figures@1.7.0: 2510 | dependencies: 2511 | escape-string-regexp: 1.0.5 2512 | object-assign: 4.1.1 2513 | 2514 | fill-range@7.1.1: 2515 | dependencies: 2516 | to-regex-range: 5.0.1 2517 | 2518 | fs-extra@11.3.0: 2519 | dependencies: 2520 | graceful-fs: 4.2.11 2521 | jsonfile: 6.1.0 2522 | universalify: 2.0.1 2523 | 2524 | fs-extra@8.1.0: 2525 | dependencies: 2526 | graceful-fs: 4.2.11 2527 | jsonfile: 4.0.0 2528 | universalify: 0.1.2 2529 | 2530 | fs.realpath@1.0.0: {} 2531 | 2532 | fsevents@2.3.3: 2533 | optional: true 2534 | 2535 | function-bind@1.1.2: {} 2536 | 2537 | get-source@2.0.12: 2538 | dependencies: 2539 | data-uri-to-buffer: 2.0.2 2540 | source-map: 0.6.1 2541 | 2542 | glob-parent@5.1.2: 2543 | dependencies: 2544 | is-glob: 4.0.3 2545 | 2546 | glob-to-regexp@0.4.1: {} 2547 | 2548 | glob@7.2.3: 2549 | dependencies: 2550 | fs.realpath: 1.0.0 2551 | inflight: 1.0.6 2552 | inherits: 2.0.4 2553 | minimatch: 3.1.2 2554 | once: 1.4.0 2555 | path-is-absolute: 1.0.1 2556 | 2557 | globby@10.0.1: 2558 | dependencies: 2559 | '@types/glob': 7.2.0 2560 | array-union: 2.1.0 2561 | dir-glob: 3.0.1 2562 | fast-glob: 3.3.3 2563 | glob: 7.2.3 2564 | ignore: 5.3.2 2565 | merge2: 1.4.1 2566 | slash: 3.0.0 2567 | 2568 | globby@14.1.0: 2569 | dependencies: 2570 | '@sindresorhus/merge-streams': 2.3.0 2571 | fast-glob: 3.3.3 2572 | ignore: 7.0.3 2573 | path-type: 6.0.0 2574 | slash: 5.1.0 2575 | unicorn-magic: 0.3.0 2576 | 2577 | graceful-fs@4.2.11: {} 2578 | 2579 | gzip-size@3.0.0: 2580 | dependencies: 2581 | duplexer: 0.1.2 2582 | 2583 | has-ansi@2.0.0: 2584 | dependencies: 2585 | ansi-regex: 2.1.1 2586 | 2587 | hasown@2.0.2: 2588 | dependencies: 2589 | function-bind: 1.1.2 2590 | 2591 | ignore@5.3.2: {} 2592 | 2593 | ignore@7.0.3: {} 2594 | 2595 | inflight@1.0.6: 2596 | dependencies: 2597 | once: 1.4.0 2598 | wrappy: 1.0.2 2599 | 2600 | inherits@2.0.4: {} 2601 | 2602 | is-arrayish@0.3.2: 2603 | optional: true 2604 | 2605 | is-core-module@2.16.1: 2606 | dependencies: 2607 | hasown: 2.0.2 2608 | 2609 | is-extglob@2.1.1: {} 2610 | 2611 | is-glob@4.0.3: 2612 | dependencies: 2613 | is-extglob: 2.1.1 2614 | 2615 | is-number@7.0.0: {} 2616 | 2617 | is-plain-object@3.0.1: {} 2618 | 2619 | jsonfile@4.0.0: 2620 | optionalDependencies: 2621 | graceful-fs: 4.2.11 2622 | 2623 | jsonfile@6.1.0: 2624 | dependencies: 2625 | universalify: 2.0.1 2626 | optionalDependencies: 2627 | graceful-fs: 4.2.11 2628 | 2629 | loupe@3.1.3: {} 2630 | 2631 | magic-string@0.25.9: 2632 | dependencies: 2633 | sourcemap-codec: 1.4.8 2634 | 2635 | magic-string@0.30.17: 2636 | dependencies: 2637 | '@jridgewell/sourcemap-codec': 1.5.0 2638 | 2639 | maxmin@2.1.0: 2640 | dependencies: 2641 | chalk: 1.1.3 2642 | figures: 1.7.0 2643 | gzip-size: 3.0.0 2644 | pretty-bytes: 3.0.1 2645 | 2646 | merge2@1.4.1: {} 2647 | 2648 | micromatch@4.0.8: 2649 | dependencies: 2650 | braces: 3.0.3 2651 | picomatch: 2.3.1 2652 | 2653 | mime@3.0.0: {} 2654 | 2655 | miniflare@3.20250310.0: 2656 | dependencies: 2657 | '@cspotcode/source-map-support': 0.8.1 2658 | acorn: 8.14.0 2659 | acorn-walk: 8.3.2 2660 | exit-hook: 2.2.1 2661 | glob-to-regexp: 0.4.1 2662 | stoppable: 1.1.0 2663 | undici: 5.29.0 2664 | workerd: 1.20250310.0 2665 | ws: 8.18.0 2666 | youch: 3.2.3 2667 | zod: 3.22.3 2668 | transitivePeerDependencies: 2669 | - bufferutil 2670 | - utf-8-validate 2671 | 2672 | miniflare@4.20250409.0: 2673 | dependencies: 2674 | '@cspotcode/source-map-support': 0.8.1 2675 | acorn: 8.14.0 2676 | acorn-walk: 8.3.2 2677 | exit-hook: 2.2.1 2678 | glob-to-regexp: 0.4.1 2679 | stoppable: 1.1.0 2680 | undici: 5.29.0 2681 | workerd: 1.20250409.0 2682 | ws: 8.18.0 2683 | youch: 3.3.4 2684 | zod: 3.22.3 2685 | transitivePeerDependencies: 2686 | - bufferutil 2687 | - utf-8-validate 2688 | 2689 | minimatch@3.1.2: 2690 | dependencies: 2691 | brace-expansion: 1.1.11 2692 | 2693 | ms@2.1.3: {} 2694 | 2695 | mustache@4.2.0: {} 2696 | 2697 | nanoid@3.3.11: {} 2698 | 2699 | number-is-nan@1.0.1: {} 2700 | 2701 | object-assign@4.1.1: {} 2702 | 2703 | ohash@2.0.11: {} 2704 | 2705 | once@1.4.0: 2706 | dependencies: 2707 | wrappy: 1.0.2 2708 | 2709 | path-is-absolute@1.0.1: {} 2710 | 2711 | path-parse@1.0.7: {} 2712 | 2713 | path-to-regexp@6.3.0: {} 2714 | 2715 | path-type@4.0.0: {} 2716 | 2717 | path-type@6.0.0: {} 2718 | 2719 | pathe@2.0.3: {} 2720 | 2721 | pathval@2.0.0: {} 2722 | 2723 | picocolors@1.1.1: {} 2724 | 2725 | picomatch@2.3.1: {} 2726 | 2727 | picomatch@4.0.2: {} 2728 | 2729 | postcss@8.5.3: 2730 | dependencies: 2731 | nanoid: 3.3.11 2732 | picocolors: 1.1.1 2733 | source-map-js: 1.2.1 2734 | 2735 | prettier@3.5.3: {} 2736 | 2737 | pretty-bytes@3.0.1: 2738 | dependencies: 2739 | number-is-nan: 1.0.1 2740 | 2741 | printable-characters@1.0.42: {} 2742 | 2743 | queue-microtask@1.2.3: {} 2744 | 2745 | randombytes@2.1.0: 2746 | dependencies: 2747 | safe-buffer: 5.2.1 2748 | 2749 | resolve@1.22.10: 2750 | dependencies: 2751 | is-core-module: 2.16.1 2752 | path-parse: 1.0.7 2753 | supports-preserve-symlinks-flag: 1.0.0 2754 | 2755 | reusify@1.1.0: {} 2756 | 2757 | rollup-plugin-bundle-size@1.0.3: 2758 | dependencies: 2759 | chalk: 1.1.3 2760 | maxmin: 2.1.0 2761 | 2762 | rollup-plugin-copy@3.5.0: 2763 | dependencies: 2764 | '@types/fs-extra': 8.1.5 2765 | colorette: 1.4.0 2766 | fs-extra: 8.1.0 2767 | globby: 10.0.1 2768 | is-plain-object: 3.0.1 2769 | 2770 | rollup-plugin-inject@3.0.2: 2771 | dependencies: 2772 | estree-walker: 0.6.1 2773 | magic-string: 0.25.9 2774 | rollup-pluginutils: 2.8.2 2775 | 2776 | rollup-plugin-node-polyfills@0.2.1: 2777 | dependencies: 2778 | rollup-plugin-inject: 3.0.2 2779 | 2780 | rollup-pluginutils@2.8.2: 2781 | dependencies: 2782 | estree-walker: 0.6.1 2783 | 2784 | rollup@4.40.0: 2785 | dependencies: 2786 | '@types/estree': 1.0.7 2787 | optionalDependencies: 2788 | '@rollup/rollup-android-arm-eabi': 4.40.0 2789 | '@rollup/rollup-android-arm64': 4.40.0 2790 | '@rollup/rollup-darwin-arm64': 4.40.0 2791 | '@rollup/rollup-darwin-x64': 4.40.0 2792 | '@rollup/rollup-freebsd-arm64': 4.40.0 2793 | '@rollup/rollup-freebsd-x64': 4.40.0 2794 | '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 2795 | '@rollup/rollup-linux-arm-musleabihf': 4.40.0 2796 | '@rollup/rollup-linux-arm64-gnu': 4.40.0 2797 | '@rollup/rollup-linux-arm64-musl': 4.40.0 2798 | '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 2799 | '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 2800 | '@rollup/rollup-linux-riscv64-gnu': 4.40.0 2801 | '@rollup/rollup-linux-riscv64-musl': 4.40.0 2802 | '@rollup/rollup-linux-s390x-gnu': 4.40.0 2803 | '@rollup/rollup-linux-x64-gnu': 4.40.0 2804 | '@rollup/rollup-linux-x64-musl': 4.40.0 2805 | '@rollup/rollup-win32-arm64-msvc': 4.40.0 2806 | '@rollup/rollup-win32-ia32-msvc': 4.40.0 2807 | '@rollup/rollup-win32-x64-msvc': 4.40.0 2808 | fsevents: 2.3.3 2809 | 2810 | run-parallel@1.2.0: 2811 | dependencies: 2812 | queue-microtask: 1.2.3 2813 | 2814 | safe-buffer@5.2.1: {} 2815 | 2816 | semver@7.7.1: {} 2817 | 2818 | serialize-javascript@6.0.2: 2819 | dependencies: 2820 | randombytes: 2.1.0 2821 | 2822 | sharp@0.33.5: 2823 | dependencies: 2824 | color: 4.2.3 2825 | detect-libc: 2.0.3 2826 | semver: 7.7.1 2827 | optionalDependencies: 2828 | '@img/sharp-darwin-arm64': 0.33.5 2829 | '@img/sharp-darwin-x64': 0.33.5 2830 | '@img/sharp-libvips-darwin-arm64': 1.0.4 2831 | '@img/sharp-libvips-darwin-x64': 1.0.4 2832 | '@img/sharp-libvips-linux-arm': 1.0.5 2833 | '@img/sharp-libvips-linux-arm64': 1.0.4 2834 | '@img/sharp-libvips-linux-s390x': 1.0.4 2835 | '@img/sharp-libvips-linux-x64': 1.0.4 2836 | '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 2837 | '@img/sharp-libvips-linuxmusl-x64': 1.0.4 2838 | '@img/sharp-linux-arm': 0.33.5 2839 | '@img/sharp-linux-arm64': 0.33.5 2840 | '@img/sharp-linux-s390x': 0.33.5 2841 | '@img/sharp-linux-x64': 0.33.5 2842 | '@img/sharp-linuxmusl-arm64': 0.33.5 2843 | '@img/sharp-linuxmusl-x64': 0.33.5 2844 | '@img/sharp-wasm32': 0.33.5 2845 | '@img/sharp-win32-ia32': 0.33.5 2846 | '@img/sharp-win32-x64': 0.33.5 2847 | optional: true 2848 | 2849 | siginfo@2.0.0: {} 2850 | 2851 | simple-swizzle@0.2.2: 2852 | dependencies: 2853 | is-arrayish: 0.3.2 2854 | optional: true 2855 | 2856 | slash@3.0.0: {} 2857 | 2858 | slash@5.1.0: {} 2859 | 2860 | smob@1.5.0: {} 2861 | 2862 | source-map-js@1.2.1: {} 2863 | 2864 | source-map-support@0.5.21: 2865 | dependencies: 2866 | buffer-from: 1.1.2 2867 | source-map: 0.6.1 2868 | 2869 | source-map@0.6.1: {} 2870 | 2871 | sourcemap-codec@1.4.8: {} 2872 | 2873 | stackback@0.0.2: {} 2874 | 2875 | stacktracey@2.1.8: 2876 | dependencies: 2877 | as-table: 1.0.55 2878 | get-source: 2.0.12 2879 | 2880 | std-env@3.9.0: {} 2881 | 2882 | stoppable@1.1.0: {} 2883 | 2884 | strip-ansi@3.0.1: 2885 | dependencies: 2886 | ansi-regex: 2.1.1 2887 | 2888 | supports-color@2.0.0: {} 2889 | 2890 | supports-preserve-symlinks-flag@1.0.0: {} 2891 | 2892 | terser@5.39.0: 2893 | dependencies: 2894 | '@jridgewell/source-map': 0.3.6 2895 | acorn: 8.14.0 2896 | commander: 2.20.3 2897 | source-map-support: 0.5.21 2898 | 2899 | tinybench@2.9.0: {} 2900 | 2901 | tinyexec@0.3.2: {} 2902 | 2903 | tinypool@1.0.2: {} 2904 | 2905 | tinyrainbow@2.0.0: {} 2906 | 2907 | tinyspy@3.0.2: {} 2908 | 2909 | to-regex-range@5.0.1: 2910 | dependencies: 2911 | is-number: 7.0.0 2912 | 2913 | tslib@2.8.1: 2914 | optional: true 2915 | 2916 | turbo-darwin-64@2.5.0: 2917 | optional: true 2918 | 2919 | turbo-darwin-arm64@2.5.0: 2920 | optional: true 2921 | 2922 | turbo-linux-64@2.5.0: 2923 | optional: true 2924 | 2925 | turbo-linux-arm64@2.5.0: 2926 | optional: true 2927 | 2928 | turbo-windows-64@2.5.0: 2929 | optional: true 2930 | 2931 | turbo-windows-arm64@2.5.0: 2932 | optional: true 2933 | 2934 | turbo@2.5.0: 2935 | optionalDependencies: 2936 | turbo-darwin-64: 2.5.0 2937 | turbo-darwin-arm64: 2.5.0 2938 | turbo-linux-64: 2.5.0 2939 | turbo-linux-arm64: 2.5.0 2940 | turbo-windows-64: 2.5.0 2941 | turbo-windows-arm64: 2.5.0 2942 | 2943 | typescript@5.8.2: {} 2944 | 2945 | ufo@1.6.1: {} 2946 | 2947 | undici-types@6.21.0: {} 2948 | 2949 | undici@5.29.0: 2950 | dependencies: 2951 | '@fastify/busboy': 2.1.1 2952 | 2953 | unenv@2.0.0-rc.14: 2954 | dependencies: 2955 | defu: 6.1.4 2956 | exsolve: 1.0.4 2957 | ohash: 2.0.11 2958 | pathe: 2.0.3 2959 | ufo: 1.6.1 2960 | 2961 | unenv@2.0.0-rc.15: 2962 | dependencies: 2963 | defu: 6.1.4 2964 | exsolve: 1.0.4 2965 | ohash: 2.0.11 2966 | pathe: 2.0.3 2967 | ufo: 1.6.1 2968 | 2969 | unicorn-magic@0.3.0: {} 2970 | 2971 | universalify@0.1.2: {} 2972 | 2973 | universalify@2.0.1: {} 2974 | 2975 | vite-node@3.0.9(@types/node@22.14.0)(terser@5.39.0): 2976 | dependencies: 2977 | cac: 6.7.14 2978 | debug: 4.4.0 2979 | es-module-lexer: 1.6.0 2980 | pathe: 2.0.3 2981 | vite: 6.2.6(@types/node@22.14.0)(terser@5.39.0) 2982 | transitivePeerDependencies: 2983 | - '@types/node' 2984 | - jiti 2985 | - less 2986 | - lightningcss 2987 | - sass 2988 | - sass-embedded 2989 | - stylus 2990 | - sugarss 2991 | - supports-color 2992 | - terser 2993 | - tsx 2994 | - yaml 2995 | 2996 | vite@6.2.6(@types/node@22.14.0)(terser@5.39.0): 2997 | dependencies: 2998 | esbuild: 0.25.2 2999 | postcss: 8.5.3 3000 | rollup: 4.40.0 3001 | optionalDependencies: 3002 | '@types/node': 22.14.0 3003 | fsevents: 2.3.3 3004 | terser: 5.39.0 3005 | 3006 | vitest@3.0.9(@edge-runtime/vm@5.0.0)(@types/node@22.14.0)(terser@5.39.0): 3007 | dependencies: 3008 | '@vitest/expect': 3.0.9 3009 | '@vitest/mocker': 3.0.9(vite@6.2.6(@types/node@22.14.0)(terser@5.39.0)) 3010 | '@vitest/pretty-format': 3.1.1 3011 | '@vitest/runner': 3.0.9 3012 | '@vitest/snapshot': 3.0.9 3013 | '@vitest/spy': 3.0.9 3014 | '@vitest/utils': 3.0.9 3015 | chai: 5.2.0 3016 | debug: 4.4.0 3017 | expect-type: 1.2.1 3018 | magic-string: 0.30.17 3019 | pathe: 2.0.3 3020 | std-env: 3.9.0 3021 | tinybench: 2.9.0 3022 | tinyexec: 0.3.2 3023 | tinypool: 1.0.2 3024 | tinyrainbow: 2.0.0 3025 | vite: 6.2.6(@types/node@22.14.0)(terser@5.39.0) 3026 | vite-node: 3.0.9(@types/node@22.14.0)(terser@5.39.0) 3027 | why-is-node-running: 2.3.0 3028 | optionalDependencies: 3029 | '@edge-runtime/vm': 5.0.0 3030 | '@types/node': 22.14.0 3031 | transitivePeerDependencies: 3032 | - jiti 3033 | - less 3034 | - lightningcss 3035 | - msw 3036 | - sass 3037 | - sass-embedded 3038 | - stylus 3039 | - sugarss 3040 | - supports-color 3041 | - terser 3042 | - tsx 3043 | - yaml 3044 | 3045 | why-is-node-running@2.3.0: 3046 | dependencies: 3047 | siginfo: 2.0.0 3048 | stackback: 0.0.2 3049 | 3050 | workerd@1.20250310.0: 3051 | optionalDependencies: 3052 | '@cloudflare/workerd-darwin-64': 1.20250310.0 3053 | '@cloudflare/workerd-darwin-arm64': 1.20250310.0 3054 | '@cloudflare/workerd-linux-64': 1.20250310.0 3055 | '@cloudflare/workerd-linux-arm64': 1.20250310.0 3056 | '@cloudflare/workerd-windows-64': 1.20250310.0 3057 | 3058 | workerd@1.20250409.0: 3059 | optionalDependencies: 3060 | '@cloudflare/workerd-darwin-64': 1.20250409.0 3061 | '@cloudflare/workerd-darwin-arm64': 1.20250409.0 3062 | '@cloudflare/workerd-linux-64': 1.20250409.0 3063 | '@cloudflare/workerd-linux-arm64': 1.20250409.0 3064 | '@cloudflare/workerd-windows-64': 1.20250409.0 3065 | 3066 | wrangler@3.114.1(@cloudflare/workers-types@4.20250414.0): 3067 | dependencies: 3068 | '@cloudflare/kv-asset-handler': 0.3.4 3069 | '@cloudflare/unenv-preset': 2.0.2(unenv@2.0.0-rc.14)(workerd@1.20250310.0) 3070 | '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) 3071 | '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) 3072 | blake3-wasm: 2.1.5 3073 | esbuild: 0.17.19 3074 | miniflare: 3.20250310.0 3075 | path-to-regexp: 6.3.0 3076 | unenv: 2.0.0-rc.14 3077 | workerd: 1.20250310.0 3078 | optionalDependencies: 3079 | '@cloudflare/workers-types': 4.20250414.0 3080 | fsevents: 2.3.3 3081 | sharp: 0.33.5 3082 | transitivePeerDependencies: 3083 | - bufferutil 3084 | - utf-8-validate 3085 | 3086 | wrangler@4.10.0(@cloudflare/workers-types@4.20250414.0): 3087 | dependencies: 3088 | '@cloudflare/kv-asset-handler': 0.4.0 3089 | '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250409.0) 3090 | blake3-wasm: 2.1.5 3091 | esbuild: 0.24.2 3092 | miniflare: 4.20250409.0 3093 | path-to-regexp: 6.3.0 3094 | unenv: 2.0.0-rc.15 3095 | workerd: 1.20250409.0 3096 | optionalDependencies: 3097 | '@cloudflare/workers-types': 4.20250414.0 3098 | fsevents: 2.3.3 3099 | sharp: 0.33.5 3100 | transitivePeerDependencies: 3101 | - bufferutil 3102 | - utf-8-validate 3103 | 3104 | wrappy@1.0.2: {} 3105 | 3106 | ws@8.18.0: {} 3107 | 3108 | youch@3.2.3: 3109 | dependencies: 3110 | cookie: 0.5.0 3111 | mustache: 4.2.0 3112 | stacktracey: 2.1.8 3113 | 3114 | youch@3.3.4: 3115 | dependencies: 3116 | cookie: 0.7.2 3117 | mustache: 4.2.0 3118 | stacktracey: 2.1.8 3119 | 3120 | zod@3.22.3: {} 3121 | 3122 | zod@3.24.2: {} 3123 | --------------------------------------------------------------------------------