├── .editorconfig ├── .gitignore ├── .prettierrc ├── .vscode └── settings.json ├── README-en.md ├── README.md ├── package-lock.json ├── package.json ├── src └── index.js ├── test └── index.spec.js ├── vitest.config.js └── wrangler.jsonc /.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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 140, 3 | "singleQuote": true, 4 | "semi": true, 5 | "useTabs": true 6 | } 7 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "wrangler.json": "jsonc" 4 | } 5 | } -------------------------------------------------------------------------------- /README-en.md: -------------------------------------------------------------------------------- 1 | # xAI API Proxy 2 | 3 | [English](README-en.md) | [中文](README.md) 4 | 5 | This Cloudflare Worker serves as a proxy for the xAI API, specifically handling image generation requests and preserving only the parameters supported in the documentation. When clients like Open-WebUI use the grok-2-image model, you must fill in the image resolution, which will cause failed requests to prompt `The size parameter is not supported at the moment. Leave it empty.` This project filters out unsupported parameters to avoid this issue. 6 | 7 | ## Features 8 | 9 | - Proxies requests to all xAI API endpoints 10 | - Specifically filters image generation request parameters, keeping only supported parameters: 11 | - `model` (e.g., "grok-2-image") 12 | - `prompt` (required) 13 | - `n` (number of images to generate, 1-10, default is 1) 14 | - `response_format` ("url" or "b64_json") 15 | - Handles CORS to support cross-origin requests 16 | 17 | **Note:** According to xAI's official documentation, the `quality`, `size`, and `style` parameters are currently not supported, and these parameters will be filtered out. 18 | 19 | ## Deployment Instructions 20 | 21 | ### Prerequisites 22 | 23 | - Install [Node.js](https://nodejs.org/) (version 14.x or higher recommended) 24 | - Install [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/) 25 | 26 | ### Installation 27 | 28 | 1. Clone this repository 29 | 2. Install dependencies: 30 | 31 | ```bash 32 | npm install 33 | ``` 34 | 35 | ### Development 36 | 37 | Local development: 38 | 39 | ```bash 40 | npm run dev 41 | ``` 42 | 43 | This will start a local development server, typically at http://localhost:8787 44 | 45 | ### Configuration 46 | 47 | Edit the `wrangler.toml` file to update route and domain settings. 48 | 49 | ### Deployment 50 | 51 | Deploy to Cloudflare Workers: 52 | 53 | ```bash 54 | npm run deploy 55 | ``` 56 | 57 | ## Usage 58 | 59 | Send your API requests to the Worker URL instead of directly to the xAI API. 60 | The Worker will forward the request to the xAI API and filter parameters for image generation requests. 61 | 62 | ### Example 63 | 64 | If your Worker is deployed at `https://xai-proxy.your-domain.workers.dev`: 65 | 66 | ```javascript 67 | fetch('https://xai-proxy.your-domain.workers.dev/v1/images/generations', { 68 | method: 'POST', 69 | headers: { 70 | 'Content-Type': 'application/json', 71 | 'Authorization': 'Bearer your-xai-api-key' 72 | }, 73 | body: JSON.stringify({ 74 | prompt: 'A kitten playing with a ball of yarn', 75 | model: 'grok-2-image', 76 | n: 1, 77 | response_format: 'url', 78 | // Other unsupported parameters will be filtered out, such as quality, size, style 79 | }) 80 | }) 81 | ``` 82 | 83 | Example response: 84 | 85 | ```json 86 | { 87 | "data": [ 88 | { 89 | "url": "https://...", 90 | "revised_prompt": "..." 91 | } 92 | ] 93 | } 94 | ``` 95 | 96 | If `response_format` is set to `b64_json`, the response will contain `b64_json` instead of `url`. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # xAI API Proxy 2 | 3 | [English](README-en.md) | [中文](README.md) 4 | 5 | 这个 Cloudflare Worker 作为 xAI API 的代理,特别处理图像生成请求,仅保留文档中支持的参数。在例如Open-WebUI这类客户端使用grok-2-image模型时,必须填写图像分辨率,从而会导致失败请求提示`The size parameter is not supported at the moment. Leave it empty.`。本项目通过过滤不支持的参数,从而避免此类问题。 6 | 7 | ## 功能 8 | 9 | - 代理所有 xAI API 端点请求 10 | - 特别过滤图像生成请求参数,只保留支持的参数: 11 | - `model` (例如 "grok-2-image") 12 | - `prompt` (必需) 13 | - `n` (生成图像数量,1-10,默认为1) 14 | - `response_format` ("url" 或 "b64_json") 15 | - 处理 CORS 以支持跨域请求 16 | 17 | **注意:** 根据 xAI 官方文档,`quality`、`size` 和 `style` 参数目前不受支持,这些参数会被过滤掉。 18 | 19 | ## 部署说明 20 | 21 | ### 前提条件 22 | 23 | - 安装 [Node.js](https://nodejs.org/) (建议 14.x 或更高版本) 24 | - 安装 [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/) 25 | 26 | ### 安装 27 | 28 | 1. 克隆此仓库 29 | 2. 安装依赖: 30 | 31 | ```bash 32 | npm install 33 | ``` 34 | 35 | ### 开发 36 | 37 | 本地开发: 38 | 39 | ```bash 40 | npm run dev 41 | ``` 42 | 43 | 这将启动一个本地开发服务器,通常在 http://localhost:8787 44 | 45 | ### 配置 46 | 47 | 编辑 `wrangler.toml` 文件,更新路由和域名设置。 48 | 49 | ### 部署 50 | 51 | 部署到 Cloudflare Workers: 52 | 53 | ```bash 54 | npm run deploy 55 | ``` 56 | 57 | ## 使用方法 58 | 59 | 将你的 API 请求发送到 Worker URL 而不是直接发送到 xAI API。 60 | Worker 会将请求转发到 xAI API,并对图像生成请求进行参数过滤。 61 | 62 | ### 例子 63 | 64 | 如果你的 Worker 部署在 `https://xai-proxy.your-domain.workers.dev`: 65 | 66 | ```javascript 67 | fetch('https://xai-proxy.your-domain.workers.dev/v1/images/generations', { 68 | method: 'POST', 69 | headers: { 70 | 'Content-Type': 'application/json', 71 | 'Authorization': 'Bearer your-xai-api-key' 72 | }, 73 | body: JSON.stringify({ 74 | prompt: '一只小猫在玩毛线球', 75 | model: 'grok-2-image', 76 | n: 1, 77 | response_format: 'url', 78 | // 其他不支持的参数会被过滤掉,如 quality, size, style 79 | }) 80 | }) 81 | ``` 82 | 83 | 响应示例: 84 | 85 | ```json 86 | { 87 | "data": [ 88 | { 89 | "url": "https://...", 90 | "revised_prompt": "..." 91 | } 92 | ] 93 | } 94 | ``` 95 | 96 | 如果设置 `response_format` 为 `b64_json`,则响应中会包含 `b64_json` 而不是 `url`。 -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xai-image-gen-refine", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "xai-image-gen-refine", 9 | "version": "0.0.0", 10 | "devDependencies": { 11 | "@cloudflare/vitest-pool-workers": "^0.7.5", 12 | "vitest": "~3.0.7", 13 | "wrangler": "^4.4.0" 14 | } 15 | }, 16 | "node_modules/@cloudflare/kv-asset-handler": { 17 | "version": "0.3.4", 18 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", 19 | "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", 20 | "dev": true, 21 | "dependencies": { 22 | "mime": "^3.0.0" 23 | }, 24 | "engines": { 25 | "node": ">=16.13" 26 | } 27 | }, 28 | "node_modules/@cloudflare/unenv-preset": { 29 | "version": "2.0.2", 30 | "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.0.2.tgz", 31 | "integrity": "sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==", 32 | "dev": true, 33 | "peerDependencies": { 34 | "unenv": "2.0.0-rc.14", 35 | "workerd": "^1.20250124.0" 36 | }, 37 | "peerDependenciesMeta": { 38 | "workerd": { 39 | "optional": true 40 | } 41 | } 42 | }, 43 | "node_modules/@cloudflare/vitest-pool-workers": { 44 | "version": "0.7.8", 45 | "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.7.8.tgz", 46 | "integrity": "sha512-y5N2PXsuT1sjzSV03COtedET/nh3k6k8vmXfX01r8uXcw9hUZvafG5HoAiRfdrLmRpk/I7FS7D/qglPO13l/bg==", 47 | "dev": true, 48 | "dependencies": { 49 | "birpc": "0.2.14", 50 | "cjs-module-lexer": "^1.2.3", 51 | "devalue": "^4.3.0", 52 | "esbuild": "0.17.19", 53 | "miniflare": "3.20250310.0", 54 | "semver": "^7.7.1", 55 | "wrangler": "3.114.1", 56 | "zod": "^3.22.3" 57 | }, 58 | "peerDependencies": { 59 | "@vitest/runner": "2.0.x - 3.0.x", 60 | "@vitest/snapshot": "2.0.x - 3.0.x", 61 | "vitest": "2.0.x - 3.0.x" 62 | } 63 | }, 64 | "node_modules/@cloudflare/vitest-pool-workers/node_modules/wrangler": { 65 | "version": "3.114.1", 66 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.114.1.tgz", 67 | "integrity": "sha512-GuS6SrnAZZDiNb20Vf2Ww0KCfnctHUEzi5GyML1i2brfQPI6BikgI/W/u6XDtYtah0OkbIWIiNJ+SdhWT7KEcw==", 68 | "dev": true, 69 | "dependencies": { 70 | "@cloudflare/kv-asset-handler": "0.3.4", 71 | "@cloudflare/unenv-preset": "2.0.2", 72 | "@esbuild-plugins/node-globals-polyfill": "0.2.3", 73 | "@esbuild-plugins/node-modules-polyfill": "0.2.2", 74 | "blake3-wasm": "2.1.5", 75 | "esbuild": "0.17.19", 76 | "miniflare": "3.20250310.0", 77 | "path-to-regexp": "6.3.0", 78 | "unenv": "2.0.0-rc.14", 79 | "workerd": "1.20250310.0" 80 | }, 81 | "bin": { 82 | "wrangler": "bin/wrangler.js", 83 | "wrangler2": "bin/wrangler.js" 84 | }, 85 | "engines": { 86 | "node": ">=16.17.0" 87 | }, 88 | "optionalDependencies": { 89 | "fsevents": "~2.3.2", 90 | "sharp": "^0.33.5" 91 | }, 92 | "peerDependencies": { 93 | "@cloudflare/workers-types": "^4.20250310.0" 94 | }, 95 | "peerDependenciesMeta": { 96 | "@cloudflare/workers-types": { 97 | "optional": true 98 | } 99 | } 100 | }, 101 | "node_modules/@cloudflare/workerd-darwin-64": { 102 | "version": "1.20250310.0", 103 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250310.0.tgz", 104 | "integrity": "sha512-LkLJO6F8lRNaCbK5sQCITi66SyCirDpffRuI5/5iILDJWQU4KVvAOKPvHrd4E5h/WDm9FGd22zMJwky7SxaNjg==", 105 | "cpu": [ 106 | "x64" 107 | ], 108 | "dev": true, 109 | "optional": true, 110 | "os": [ 111 | "darwin" 112 | ], 113 | "engines": { 114 | "node": ">=16" 115 | } 116 | }, 117 | "node_modules/@cloudflare/workerd-darwin-arm64": { 118 | "version": "1.20250310.0", 119 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250310.0.tgz", 120 | "integrity": "sha512-WythDJQbsU3Ii1hhA7pJZLBQlHezeYWAnaMnv3gS2Exj45oF8G4chFvrO7zCzjlcJXwSeBTtQRJqxw9AiUDhyA==", 121 | "cpu": [ 122 | "arm64" 123 | ], 124 | "dev": true, 125 | "optional": true, 126 | "os": [ 127 | "darwin" 128 | ], 129 | "engines": { 130 | "node": ">=16" 131 | } 132 | }, 133 | "node_modules/@cloudflare/workerd-linux-64": { 134 | "version": "1.20250310.0", 135 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250310.0.tgz", 136 | "integrity": "sha512-LbP769tT4/5QBHSj4lCt99QIKTi6cU+wYhLfF7rEtYHBnZS2+nIw9xttAzxeERx/aFrU+mxLcYPFV8fUeVxGng==", 137 | "cpu": [ 138 | "x64" 139 | ], 140 | "dev": true, 141 | "optional": true, 142 | "os": [ 143 | "linux" 144 | ], 145 | "engines": { 146 | "node": ">=16" 147 | } 148 | }, 149 | "node_modules/@cloudflare/workerd-linux-arm64": { 150 | "version": "1.20250310.0", 151 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250310.0.tgz", 152 | "integrity": "sha512-FzWeKM6id20EMZACaDg0Kkvg1C4lvXZgLBXVI6h6xaXTNFReoyEp4v4eMrRTuja5ec5k+m5iGKjP4/bMWJp9ew==", 153 | "cpu": [ 154 | "arm64" 155 | ], 156 | "dev": true, 157 | "optional": true, 158 | "os": [ 159 | "linux" 160 | ], 161 | "engines": { 162 | "node": ">=16" 163 | } 164 | }, 165 | "node_modules/@cloudflare/workerd-windows-64": { 166 | "version": "1.20250310.0", 167 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250310.0.tgz", 168 | "integrity": "sha512-04OgaDzm8/8nkjF3tovB+WywZLjSdAHCQT2omXKCwH3EDd1kpd8vvzE1pErtdIyKCOf9/sArY4BhPdxRj7ijlg==", 169 | "cpu": [ 170 | "x64" 171 | ], 172 | "dev": true, 173 | "optional": true, 174 | "os": [ 175 | "win32" 176 | ], 177 | "engines": { 178 | "node": ">=16" 179 | } 180 | }, 181 | "node_modules/@cspotcode/source-map-support": { 182 | "version": "0.8.1", 183 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 184 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 185 | "dev": true, 186 | "dependencies": { 187 | "@jridgewell/trace-mapping": "0.3.9" 188 | }, 189 | "engines": { 190 | "node": ">=12" 191 | } 192 | }, 193 | "node_modules/@emnapi/runtime": { 194 | "version": "1.3.1", 195 | "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", 196 | "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", 197 | "dev": true, 198 | "optional": true, 199 | "dependencies": { 200 | "tslib": "^2.4.0" 201 | } 202 | }, 203 | "node_modules/@esbuild-plugins/node-globals-polyfill": { 204 | "version": "0.2.3", 205 | "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", 206 | "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", 207 | "dev": true, 208 | "peerDependencies": { 209 | "esbuild": "*" 210 | } 211 | }, 212 | "node_modules/@esbuild-plugins/node-modules-polyfill": { 213 | "version": "0.2.2", 214 | "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", 215 | "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", 216 | "dev": true, 217 | "dependencies": { 218 | "escape-string-regexp": "^4.0.0", 219 | "rollup-plugin-node-polyfills": "^0.2.1" 220 | }, 221 | "peerDependencies": { 222 | "esbuild": "*" 223 | } 224 | }, 225 | "node_modules/@esbuild/aix-ppc64": { 226 | "version": "0.25.1", 227 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", 228 | "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", 229 | "cpu": [ 230 | "ppc64" 231 | ], 232 | "dev": true, 233 | "optional": true, 234 | "os": [ 235 | "aix" 236 | ], 237 | "engines": { 238 | "node": ">=18" 239 | } 240 | }, 241 | "node_modules/@esbuild/android-arm": { 242 | "version": "0.17.19", 243 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", 244 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", 245 | "cpu": [ 246 | "arm" 247 | ], 248 | "dev": true, 249 | "optional": true, 250 | "os": [ 251 | "android" 252 | ], 253 | "engines": { 254 | "node": ">=12" 255 | } 256 | }, 257 | "node_modules/@esbuild/android-arm64": { 258 | "version": "0.17.19", 259 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", 260 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", 261 | "cpu": [ 262 | "arm64" 263 | ], 264 | "dev": true, 265 | "optional": true, 266 | "os": [ 267 | "android" 268 | ], 269 | "engines": { 270 | "node": ">=12" 271 | } 272 | }, 273 | "node_modules/@esbuild/android-x64": { 274 | "version": "0.17.19", 275 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", 276 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", 277 | "cpu": [ 278 | "x64" 279 | ], 280 | "dev": true, 281 | "optional": true, 282 | "os": [ 283 | "android" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/@esbuild/darwin-arm64": { 290 | "version": "0.17.19", 291 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", 292 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", 293 | "cpu": [ 294 | "arm64" 295 | ], 296 | "dev": true, 297 | "optional": true, 298 | "os": [ 299 | "darwin" 300 | ], 301 | "engines": { 302 | "node": ">=12" 303 | } 304 | }, 305 | "node_modules/@esbuild/darwin-x64": { 306 | "version": "0.17.19", 307 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", 308 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", 309 | "cpu": [ 310 | "x64" 311 | ], 312 | "dev": true, 313 | "optional": true, 314 | "os": [ 315 | "darwin" 316 | ], 317 | "engines": { 318 | "node": ">=12" 319 | } 320 | }, 321 | "node_modules/@esbuild/freebsd-arm64": { 322 | "version": "0.17.19", 323 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", 324 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", 325 | "cpu": [ 326 | "arm64" 327 | ], 328 | "dev": true, 329 | "optional": true, 330 | "os": [ 331 | "freebsd" 332 | ], 333 | "engines": { 334 | "node": ">=12" 335 | } 336 | }, 337 | "node_modules/@esbuild/freebsd-x64": { 338 | "version": "0.17.19", 339 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", 340 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", 341 | "cpu": [ 342 | "x64" 343 | ], 344 | "dev": true, 345 | "optional": true, 346 | "os": [ 347 | "freebsd" 348 | ], 349 | "engines": { 350 | "node": ">=12" 351 | } 352 | }, 353 | "node_modules/@esbuild/linux-arm": { 354 | "version": "0.17.19", 355 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", 356 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", 357 | "cpu": [ 358 | "arm" 359 | ], 360 | "dev": true, 361 | "optional": true, 362 | "os": [ 363 | "linux" 364 | ], 365 | "engines": { 366 | "node": ">=12" 367 | } 368 | }, 369 | "node_modules/@esbuild/linux-arm64": { 370 | "version": "0.17.19", 371 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", 372 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", 373 | "cpu": [ 374 | "arm64" 375 | ], 376 | "dev": true, 377 | "optional": true, 378 | "os": [ 379 | "linux" 380 | ], 381 | "engines": { 382 | "node": ">=12" 383 | } 384 | }, 385 | "node_modules/@esbuild/linux-ia32": { 386 | "version": "0.17.19", 387 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", 388 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", 389 | "cpu": [ 390 | "ia32" 391 | ], 392 | "dev": true, 393 | "optional": true, 394 | "os": [ 395 | "linux" 396 | ], 397 | "engines": { 398 | "node": ">=12" 399 | } 400 | }, 401 | "node_modules/@esbuild/linux-loong64": { 402 | "version": "0.17.19", 403 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", 404 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", 405 | "cpu": [ 406 | "loong64" 407 | ], 408 | "dev": true, 409 | "optional": true, 410 | "os": [ 411 | "linux" 412 | ], 413 | "engines": { 414 | "node": ">=12" 415 | } 416 | }, 417 | "node_modules/@esbuild/linux-mips64el": { 418 | "version": "0.17.19", 419 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", 420 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", 421 | "cpu": [ 422 | "mips64el" 423 | ], 424 | "dev": true, 425 | "optional": true, 426 | "os": [ 427 | "linux" 428 | ], 429 | "engines": { 430 | "node": ">=12" 431 | } 432 | }, 433 | "node_modules/@esbuild/linux-ppc64": { 434 | "version": "0.17.19", 435 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", 436 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", 437 | "cpu": [ 438 | "ppc64" 439 | ], 440 | "dev": true, 441 | "optional": true, 442 | "os": [ 443 | "linux" 444 | ], 445 | "engines": { 446 | "node": ">=12" 447 | } 448 | }, 449 | "node_modules/@esbuild/linux-riscv64": { 450 | "version": "0.17.19", 451 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", 452 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", 453 | "cpu": [ 454 | "riscv64" 455 | ], 456 | "dev": true, 457 | "optional": true, 458 | "os": [ 459 | "linux" 460 | ], 461 | "engines": { 462 | "node": ">=12" 463 | } 464 | }, 465 | "node_modules/@esbuild/linux-s390x": { 466 | "version": "0.17.19", 467 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", 468 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", 469 | "cpu": [ 470 | "s390x" 471 | ], 472 | "dev": true, 473 | "optional": true, 474 | "os": [ 475 | "linux" 476 | ], 477 | "engines": { 478 | "node": ">=12" 479 | } 480 | }, 481 | "node_modules/@esbuild/linux-x64": { 482 | "version": "0.17.19", 483 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", 484 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", 485 | "cpu": [ 486 | "x64" 487 | ], 488 | "dev": true, 489 | "optional": true, 490 | "os": [ 491 | "linux" 492 | ], 493 | "engines": { 494 | "node": ">=12" 495 | } 496 | }, 497 | "node_modules/@esbuild/netbsd-arm64": { 498 | "version": "0.25.1", 499 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", 500 | "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", 501 | "cpu": [ 502 | "arm64" 503 | ], 504 | "dev": true, 505 | "optional": true, 506 | "os": [ 507 | "netbsd" 508 | ], 509 | "engines": { 510 | "node": ">=18" 511 | } 512 | }, 513 | "node_modules/@esbuild/netbsd-x64": { 514 | "version": "0.17.19", 515 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", 516 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", 517 | "cpu": [ 518 | "x64" 519 | ], 520 | "dev": true, 521 | "optional": true, 522 | "os": [ 523 | "netbsd" 524 | ], 525 | "engines": { 526 | "node": ">=12" 527 | } 528 | }, 529 | "node_modules/@esbuild/openbsd-arm64": { 530 | "version": "0.25.1", 531 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", 532 | "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", 533 | "cpu": [ 534 | "arm64" 535 | ], 536 | "dev": true, 537 | "optional": true, 538 | "os": [ 539 | "openbsd" 540 | ], 541 | "engines": { 542 | "node": ">=18" 543 | } 544 | }, 545 | "node_modules/@esbuild/openbsd-x64": { 546 | "version": "0.17.19", 547 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", 548 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", 549 | "cpu": [ 550 | "x64" 551 | ], 552 | "dev": true, 553 | "optional": true, 554 | "os": [ 555 | "openbsd" 556 | ], 557 | "engines": { 558 | "node": ">=12" 559 | } 560 | }, 561 | "node_modules/@esbuild/sunos-x64": { 562 | "version": "0.17.19", 563 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", 564 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", 565 | "cpu": [ 566 | "x64" 567 | ], 568 | "dev": true, 569 | "optional": true, 570 | "os": [ 571 | "sunos" 572 | ], 573 | "engines": { 574 | "node": ">=12" 575 | } 576 | }, 577 | "node_modules/@esbuild/win32-arm64": { 578 | "version": "0.17.19", 579 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", 580 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", 581 | "cpu": [ 582 | "arm64" 583 | ], 584 | "dev": true, 585 | "optional": true, 586 | "os": [ 587 | "win32" 588 | ], 589 | "engines": { 590 | "node": ">=12" 591 | } 592 | }, 593 | "node_modules/@esbuild/win32-ia32": { 594 | "version": "0.17.19", 595 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", 596 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", 597 | "cpu": [ 598 | "ia32" 599 | ], 600 | "dev": true, 601 | "optional": true, 602 | "os": [ 603 | "win32" 604 | ], 605 | "engines": { 606 | "node": ">=12" 607 | } 608 | }, 609 | "node_modules/@esbuild/win32-x64": { 610 | "version": "0.17.19", 611 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 612 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 613 | "cpu": [ 614 | "x64" 615 | ], 616 | "dev": true, 617 | "optional": true, 618 | "os": [ 619 | "win32" 620 | ], 621 | "engines": { 622 | "node": ">=12" 623 | } 624 | }, 625 | "node_modules/@fastify/busboy": { 626 | "version": "2.1.1", 627 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 628 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 629 | "dev": true, 630 | "engines": { 631 | "node": ">=14" 632 | } 633 | }, 634 | "node_modules/@img/sharp-darwin-arm64": { 635 | "version": "0.33.5", 636 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", 637 | "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", 638 | "cpu": [ 639 | "arm64" 640 | ], 641 | "dev": true, 642 | "optional": true, 643 | "os": [ 644 | "darwin" 645 | ], 646 | "engines": { 647 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 648 | }, 649 | "funding": { 650 | "url": "https://opencollective.com/libvips" 651 | }, 652 | "optionalDependencies": { 653 | "@img/sharp-libvips-darwin-arm64": "1.0.4" 654 | } 655 | }, 656 | "node_modules/@img/sharp-darwin-x64": { 657 | "version": "0.33.5", 658 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", 659 | "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", 660 | "cpu": [ 661 | "x64" 662 | ], 663 | "dev": true, 664 | "optional": true, 665 | "os": [ 666 | "darwin" 667 | ], 668 | "engines": { 669 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 670 | }, 671 | "funding": { 672 | "url": "https://opencollective.com/libvips" 673 | }, 674 | "optionalDependencies": { 675 | "@img/sharp-libvips-darwin-x64": "1.0.4" 676 | } 677 | }, 678 | "node_modules/@img/sharp-libvips-darwin-arm64": { 679 | "version": "1.0.4", 680 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", 681 | "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", 682 | "cpu": [ 683 | "arm64" 684 | ], 685 | "dev": true, 686 | "optional": true, 687 | "os": [ 688 | "darwin" 689 | ], 690 | "funding": { 691 | "url": "https://opencollective.com/libvips" 692 | } 693 | }, 694 | "node_modules/@img/sharp-libvips-darwin-x64": { 695 | "version": "1.0.4", 696 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", 697 | "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", 698 | "cpu": [ 699 | "x64" 700 | ], 701 | "dev": true, 702 | "optional": true, 703 | "os": [ 704 | "darwin" 705 | ], 706 | "funding": { 707 | "url": "https://opencollective.com/libvips" 708 | } 709 | }, 710 | "node_modules/@img/sharp-libvips-linux-arm": { 711 | "version": "1.0.5", 712 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", 713 | "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", 714 | "cpu": [ 715 | "arm" 716 | ], 717 | "dev": true, 718 | "optional": true, 719 | "os": [ 720 | "linux" 721 | ], 722 | "funding": { 723 | "url": "https://opencollective.com/libvips" 724 | } 725 | }, 726 | "node_modules/@img/sharp-libvips-linux-arm64": { 727 | "version": "1.0.4", 728 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", 729 | "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", 730 | "cpu": [ 731 | "arm64" 732 | ], 733 | "dev": true, 734 | "optional": true, 735 | "os": [ 736 | "linux" 737 | ], 738 | "funding": { 739 | "url": "https://opencollective.com/libvips" 740 | } 741 | }, 742 | "node_modules/@img/sharp-libvips-linux-s390x": { 743 | "version": "1.0.4", 744 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", 745 | "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", 746 | "cpu": [ 747 | "s390x" 748 | ], 749 | "dev": true, 750 | "optional": true, 751 | "os": [ 752 | "linux" 753 | ], 754 | "funding": { 755 | "url": "https://opencollective.com/libvips" 756 | } 757 | }, 758 | "node_modules/@img/sharp-libvips-linux-x64": { 759 | "version": "1.0.4", 760 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", 761 | "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", 762 | "cpu": [ 763 | "x64" 764 | ], 765 | "dev": true, 766 | "optional": true, 767 | "os": [ 768 | "linux" 769 | ], 770 | "funding": { 771 | "url": "https://opencollective.com/libvips" 772 | } 773 | }, 774 | "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 775 | "version": "1.0.4", 776 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", 777 | "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", 778 | "cpu": [ 779 | "arm64" 780 | ], 781 | "dev": true, 782 | "optional": true, 783 | "os": [ 784 | "linux" 785 | ], 786 | "funding": { 787 | "url": "https://opencollective.com/libvips" 788 | } 789 | }, 790 | "node_modules/@img/sharp-libvips-linuxmusl-x64": { 791 | "version": "1.0.4", 792 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", 793 | "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", 794 | "cpu": [ 795 | "x64" 796 | ], 797 | "dev": true, 798 | "optional": true, 799 | "os": [ 800 | "linux" 801 | ], 802 | "funding": { 803 | "url": "https://opencollective.com/libvips" 804 | } 805 | }, 806 | "node_modules/@img/sharp-linux-arm": { 807 | "version": "0.33.5", 808 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", 809 | "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", 810 | "cpu": [ 811 | "arm" 812 | ], 813 | "dev": true, 814 | "optional": true, 815 | "os": [ 816 | "linux" 817 | ], 818 | "engines": { 819 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 820 | }, 821 | "funding": { 822 | "url": "https://opencollective.com/libvips" 823 | }, 824 | "optionalDependencies": { 825 | "@img/sharp-libvips-linux-arm": "1.0.5" 826 | } 827 | }, 828 | "node_modules/@img/sharp-linux-arm64": { 829 | "version": "0.33.5", 830 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", 831 | "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", 832 | "cpu": [ 833 | "arm64" 834 | ], 835 | "dev": true, 836 | "optional": true, 837 | "os": [ 838 | "linux" 839 | ], 840 | "engines": { 841 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 842 | }, 843 | "funding": { 844 | "url": "https://opencollective.com/libvips" 845 | }, 846 | "optionalDependencies": { 847 | "@img/sharp-libvips-linux-arm64": "1.0.4" 848 | } 849 | }, 850 | "node_modules/@img/sharp-linux-s390x": { 851 | "version": "0.33.5", 852 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", 853 | "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", 854 | "cpu": [ 855 | "s390x" 856 | ], 857 | "dev": true, 858 | "optional": true, 859 | "os": [ 860 | "linux" 861 | ], 862 | "engines": { 863 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 864 | }, 865 | "funding": { 866 | "url": "https://opencollective.com/libvips" 867 | }, 868 | "optionalDependencies": { 869 | "@img/sharp-libvips-linux-s390x": "1.0.4" 870 | } 871 | }, 872 | "node_modules/@img/sharp-linux-x64": { 873 | "version": "0.33.5", 874 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", 875 | "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", 876 | "cpu": [ 877 | "x64" 878 | ], 879 | "dev": true, 880 | "optional": true, 881 | "os": [ 882 | "linux" 883 | ], 884 | "engines": { 885 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 886 | }, 887 | "funding": { 888 | "url": "https://opencollective.com/libvips" 889 | }, 890 | "optionalDependencies": { 891 | "@img/sharp-libvips-linux-x64": "1.0.4" 892 | } 893 | }, 894 | "node_modules/@img/sharp-linuxmusl-arm64": { 895 | "version": "0.33.5", 896 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", 897 | "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", 898 | "cpu": [ 899 | "arm64" 900 | ], 901 | "dev": true, 902 | "optional": true, 903 | "os": [ 904 | "linux" 905 | ], 906 | "engines": { 907 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 908 | }, 909 | "funding": { 910 | "url": "https://opencollective.com/libvips" 911 | }, 912 | "optionalDependencies": { 913 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" 914 | } 915 | }, 916 | "node_modules/@img/sharp-linuxmusl-x64": { 917 | "version": "0.33.5", 918 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", 919 | "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", 920 | "cpu": [ 921 | "x64" 922 | ], 923 | "dev": true, 924 | "optional": true, 925 | "os": [ 926 | "linux" 927 | ], 928 | "engines": { 929 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 930 | }, 931 | "funding": { 932 | "url": "https://opencollective.com/libvips" 933 | }, 934 | "optionalDependencies": { 935 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4" 936 | } 937 | }, 938 | "node_modules/@img/sharp-wasm32": { 939 | "version": "0.33.5", 940 | "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", 941 | "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", 942 | "cpu": [ 943 | "wasm32" 944 | ], 945 | "dev": true, 946 | "optional": true, 947 | "dependencies": { 948 | "@emnapi/runtime": "^1.2.0" 949 | }, 950 | "engines": { 951 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 952 | }, 953 | "funding": { 954 | "url": "https://opencollective.com/libvips" 955 | } 956 | }, 957 | "node_modules/@img/sharp-win32-ia32": { 958 | "version": "0.33.5", 959 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", 960 | "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", 961 | "cpu": [ 962 | "ia32" 963 | ], 964 | "dev": true, 965 | "optional": true, 966 | "os": [ 967 | "win32" 968 | ], 969 | "engines": { 970 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 971 | }, 972 | "funding": { 973 | "url": "https://opencollective.com/libvips" 974 | } 975 | }, 976 | "node_modules/@img/sharp-win32-x64": { 977 | "version": "0.33.5", 978 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", 979 | "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", 980 | "cpu": [ 981 | "x64" 982 | ], 983 | "dev": true, 984 | "optional": true, 985 | "os": [ 986 | "win32" 987 | ], 988 | "engines": { 989 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 990 | }, 991 | "funding": { 992 | "url": "https://opencollective.com/libvips" 993 | } 994 | }, 995 | "node_modules/@jridgewell/resolve-uri": { 996 | "version": "3.1.2", 997 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 998 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 999 | "dev": true, 1000 | "engines": { 1001 | "node": ">=6.0.0" 1002 | } 1003 | }, 1004 | "node_modules/@jridgewell/sourcemap-codec": { 1005 | "version": "1.5.0", 1006 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1007 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1008 | "dev": true 1009 | }, 1010 | "node_modules/@jridgewell/trace-mapping": { 1011 | "version": "0.3.9", 1012 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1013 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "@jridgewell/resolve-uri": "^3.0.3", 1017 | "@jridgewell/sourcemap-codec": "^1.4.10" 1018 | } 1019 | }, 1020 | "node_modules/@rollup/rollup-android-arm-eabi": { 1021 | "version": "4.36.0", 1022 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", 1023 | "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", 1024 | "cpu": [ 1025 | "arm" 1026 | ], 1027 | "dev": true, 1028 | "optional": true, 1029 | "os": [ 1030 | "android" 1031 | ] 1032 | }, 1033 | "node_modules/@rollup/rollup-android-arm64": { 1034 | "version": "4.36.0", 1035 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", 1036 | "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", 1037 | "cpu": [ 1038 | "arm64" 1039 | ], 1040 | "dev": true, 1041 | "optional": true, 1042 | "os": [ 1043 | "android" 1044 | ] 1045 | }, 1046 | "node_modules/@rollup/rollup-darwin-arm64": { 1047 | "version": "4.36.0", 1048 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", 1049 | "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", 1050 | "cpu": [ 1051 | "arm64" 1052 | ], 1053 | "dev": true, 1054 | "optional": true, 1055 | "os": [ 1056 | "darwin" 1057 | ] 1058 | }, 1059 | "node_modules/@rollup/rollup-darwin-x64": { 1060 | "version": "4.36.0", 1061 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", 1062 | "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", 1063 | "cpu": [ 1064 | "x64" 1065 | ], 1066 | "dev": true, 1067 | "optional": true, 1068 | "os": [ 1069 | "darwin" 1070 | ] 1071 | }, 1072 | "node_modules/@rollup/rollup-freebsd-arm64": { 1073 | "version": "4.36.0", 1074 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", 1075 | "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", 1076 | "cpu": [ 1077 | "arm64" 1078 | ], 1079 | "dev": true, 1080 | "optional": true, 1081 | "os": [ 1082 | "freebsd" 1083 | ] 1084 | }, 1085 | "node_modules/@rollup/rollup-freebsd-x64": { 1086 | "version": "4.36.0", 1087 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", 1088 | "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", 1089 | "cpu": [ 1090 | "x64" 1091 | ], 1092 | "dev": true, 1093 | "optional": true, 1094 | "os": [ 1095 | "freebsd" 1096 | ] 1097 | }, 1098 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1099 | "version": "4.36.0", 1100 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", 1101 | "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", 1102 | "cpu": [ 1103 | "arm" 1104 | ], 1105 | "dev": true, 1106 | "optional": true, 1107 | "os": [ 1108 | "linux" 1109 | ] 1110 | }, 1111 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1112 | "version": "4.36.0", 1113 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", 1114 | "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", 1115 | "cpu": [ 1116 | "arm" 1117 | ], 1118 | "dev": true, 1119 | "optional": true, 1120 | "os": [ 1121 | "linux" 1122 | ] 1123 | }, 1124 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 1125 | "version": "4.36.0", 1126 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", 1127 | "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", 1128 | "cpu": [ 1129 | "arm64" 1130 | ], 1131 | "dev": true, 1132 | "optional": true, 1133 | "os": [ 1134 | "linux" 1135 | ] 1136 | }, 1137 | "node_modules/@rollup/rollup-linux-arm64-musl": { 1138 | "version": "4.36.0", 1139 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", 1140 | "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", 1141 | "cpu": [ 1142 | "arm64" 1143 | ], 1144 | "dev": true, 1145 | "optional": true, 1146 | "os": [ 1147 | "linux" 1148 | ] 1149 | }, 1150 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1151 | "version": "4.36.0", 1152 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", 1153 | "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", 1154 | "cpu": [ 1155 | "loong64" 1156 | ], 1157 | "dev": true, 1158 | "optional": true, 1159 | "os": [ 1160 | "linux" 1161 | ] 1162 | }, 1163 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1164 | "version": "4.36.0", 1165 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", 1166 | "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", 1167 | "cpu": [ 1168 | "ppc64" 1169 | ], 1170 | "dev": true, 1171 | "optional": true, 1172 | "os": [ 1173 | "linux" 1174 | ] 1175 | }, 1176 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1177 | "version": "4.36.0", 1178 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", 1179 | "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", 1180 | "cpu": [ 1181 | "riscv64" 1182 | ], 1183 | "dev": true, 1184 | "optional": true, 1185 | "os": [ 1186 | "linux" 1187 | ] 1188 | }, 1189 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1190 | "version": "4.36.0", 1191 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", 1192 | "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", 1193 | "cpu": [ 1194 | "s390x" 1195 | ], 1196 | "dev": true, 1197 | "optional": true, 1198 | "os": [ 1199 | "linux" 1200 | ] 1201 | }, 1202 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1203 | "version": "4.36.0", 1204 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", 1205 | "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", 1206 | "cpu": [ 1207 | "x64" 1208 | ], 1209 | "dev": true, 1210 | "optional": true, 1211 | "os": [ 1212 | "linux" 1213 | ] 1214 | }, 1215 | "node_modules/@rollup/rollup-linux-x64-musl": { 1216 | "version": "4.36.0", 1217 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", 1218 | "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", 1219 | "cpu": [ 1220 | "x64" 1221 | ], 1222 | "dev": true, 1223 | "optional": true, 1224 | "os": [ 1225 | "linux" 1226 | ] 1227 | }, 1228 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1229 | "version": "4.36.0", 1230 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", 1231 | "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", 1232 | "cpu": [ 1233 | "arm64" 1234 | ], 1235 | "dev": true, 1236 | "optional": true, 1237 | "os": [ 1238 | "win32" 1239 | ] 1240 | }, 1241 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1242 | "version": "4.36.0", 1243 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", 1244 | "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", 1245 | "cpu": [ 1246 | "ia32" 1247 | ], 1248 | "dev": true, 1249 | "optional": true, 1250 | "os": [ 1251 | "win32" 1252 | ] 1253 | }, 1254 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1255 | "version": "4.36.0", 1256 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", 1257 | "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", 1258 | "cpu": [ 1259 | "x64" 1260 | ], 1261 | "dev": true, 1262 | "optional": true, 1263 | "os": [ 1264 | "win32" 1265 | ] 1266 | }, 1267 | "node_modules/@types/estree": { 1268 | "version": "1.0.6", 1269 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1270 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1271 | "dev": true 1272 | }, 1273 | "node_modules/@vitest/expect": { 1274 | "version": "3.0.9", 1275 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", 1276 | "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", 1277 | "dev": true, 1278 | "dependencies": { 1279 | "@vitest/spy": "3.0.9", 1280 | "@vitest/utils": "3.0.9", 1281 | "chai": "^5.2.0", 1282 | "tinyrainbow": "^2.0.0" 1283 | }, 1284 | "funding": { 1285 | "url": "https://opencollective.com/vitest" 1286 | } 1287 | }, 1288 | "node_modules/@vitest/mocker": { 1289 | "version": "3.0.9", 1290 | "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", 1291 | "integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", 1292 | "dev": true, 1293 | "dependencies": { 1294 | "@vitest/spy": "3.0.9", 1295 | "estree-walker": "^3.0.3", 1296 | "magic-string": "^0.30.17" 1297 | }, 1298 | "funding": { 1299 | "url": "https://opencollective.com/vitest" 1300 | }, 1301 | "peerDependencies": { 1302 | "msw": "^2.4.9", 1303 | "vite": "^5.0.0 || ^6.0.0" 1304 | }, 1305 | "peerDependenciesMeta": { 1306 | "msw": { 1307 | "optional": true 1308 | }, 1309 | "vite": { 1310 | "optional": true 1311 | } 1312 | } 1313 | }, 1314 | "node_modules/@vitest/pretty-format": { 1315 | "version": "3.0.9", 1316 | "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", 1317 | "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", 1318 | "dev": true, 1319 | "dependencies": { 1320 | "tinyrainbow": "^2.0.0" 1321 | }, 1322 | "funding": { 1323 | "url": "https://opencollective.com/vitest" 1324 | } 1325 | }, 1326 | "node_modules/@vitest/runner": { 1327 | "version": "3.0.9", 1328 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", 1329 | "integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", 1330 | "dev": true, 1331 | "dependencies": { 1332 | "@vitest/utils": "3.0.9", 1333 | "pathe": "^2.0.3" 1334 | }, 1335 | "funding": { 1336 | "url": "https://opencollective.com/vitest" 1337 | } 1338 | }, 1339 | "node_modules/@vitest/snapshot": { 1340 | "version": "3.0.9", 1341 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", 1342 | "integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", 1343 | "dev": true, 1344 | "dependencies": { 1345 | "@vitest/pretty-format": "3.0.9", 1346 | "magic-string": "^0.30.17", 1347 | "pathe": "^2.0.3" 1348 | }, 1349 | "funding": { 1350 | "url": "https://opencollective.com/vitest" 1351 | } 1352 | }, 1353 | "node_modules/@vitest/spy": { 1354 | "version": "3.0.9", 1355 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", 1356 | "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", 1357 | "dev": true, 1358 | "dependencies": { 1359 | "tinyspy": "^3.0.2" 1360 | }, 1361 | "funding": { 1362 | "url": "https://opencollective.com/vitest" 1363 | } 1364 | }, 1365 | "node_modules/@vitest/utils": { 1366 | "version": "3.0.9", 1367 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", 1368 | "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", 1369 | "dev": true, 1370 | "dependencies": { 1371 | "@vitest/pretty-format": "3.0.9", 1372 | "loupe": "^3.1.3", 1373 | "tinyrainbow": "^2.0.0" 1374 | }, 1375 | "funding": { 1376 | "url": "https://opencollective.com/vitest" 1377 | } 1378 | }, 1379 | "node_modules/acorn": { 1380 | "version": "8.14.0", 1381 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1382 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1383 | "dev": true, 1384 | "bin": { 1385 | "acorn": "bin/acorn" 1386 | }, 1387 | "engines": { 1388 | "node": ">=0.4.0" 1389 | } 1390 | }, 1391 | "node_modules/acorn-walk": { 1392 | "version": "8.3.2", 1393 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 1394 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 1395 | "dev": true, 1396 | "engines": { 1397 | "node": ">=0.4.0" 1398 | } 1399 | }, 1400 | "node_modules/as-table": { 1401 | "version": "1.0.55", 1402 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 1403 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 1404 | "dev": true, 1405 | "dependencies": { 1406 | "printable-characters": "^1.0.42" 1407 | } 1408 | }, 1409 | "node_modules/assertion-error": { 1410 | "version": "2.0.1", 1411 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 1412 | "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 1413 | "dev": true, 1414 | "engines": { 1415 | "node": ">=12" 1416 | } 1417 | }, 1418 | "node_modules/birpc": { 1419 | "version": "0.2.14", 1420 | "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.14.tgz", 1421 | "integrity": "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==", 1422 | "dev": true, 1423 | "funding": { 1424 | "url": "https://github.com/sponsors/antfu" 1425 | } 1426 | }, 1427 | "node_modules/blake3-wasm": { 1428 | "version": "2.1.5", 1429 | "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", 1430 | "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", 1431 | "dev": true 1432 | }, 1433 | "node_modules/cac": { 1434 | "version": "6.7.14", 1435 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1436 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1437 | "dev": true, 1438 | "engines": { 1439 | "node": ">=8" 1440 | } 1441 | }, 1442 | "node_modules/chai": { 1443 | "version": "5.2.0", 1444 | "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", 1445 | "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", 1446 | "dev": true, 1447 | "dependencies": { 1448 | "assertion-error": "^2.0.1", 1449 | "check-error": "^2.1.1", 1450 | "deep-eql": "^5.0.1", 1451 | "loupe": "^3.1.0", 1452 | "pathval": "^2.0.0" 1453 | }, 1454 | "engines": { 1455 | "node": ">=12" 1456 | } 1457 | }, 1458 | "node_modules/check-error": { 1459 | "version": "2.1.1", 1460 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 1461 | "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 1462 | "dev": true, 1463 | "engines": { 1464 | "node": ">= 16" 1465 | } 1466 | }, 1467 | "node_modules/cjs-module-lexer": { 1468 | "version": "1.4.3", 1469 | "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", 1470 | "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", 1471 | "dev": true 1472 | }, 1473 | "node_modules/color": { 1474 | "version": "4.2.3", 1475 | "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 1476 | "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 1477 | "dev": true, 1478 | "optional": true, 1479 | "dependencies": { 1480 | "color-convert": "^2.0.1", 1481 | "color-string": "^1.9.0" 1482 | }, 1483 | "engines": { 1484 | "node": ">=12.5.0" 1485 | } 1486 | }, 1487 | "node_modules/color-convert": { 1488 | "version": "2.0.1", 1489 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1490 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1491 | "dev": true, 1492 | "optional": true, 1493 | "dependencies": { 1494 | "color-name": "~1.1.4" 1495 | }, 1496 | "engines": { 1497 | "node": ">=7.0.0" 1498 | } 1499 | }, 1500 | "node_modules/color-name": { 1501 | "version": "1.1.4", 1502 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1503 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1504 | "dev": true, 1505 | "optional": true 1506 | }, 1507 | "node_modules/color-string": { 1508 | "version": "1.9.1", 1509 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 1510 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 1511 | "dev": true, 1512 | "optional": true, 1513 | "dependencies": { 1514 | "color-name": "^1.0.0", 1515 | "simple-swizzle": "^0.2.2" 1516 | } 1517 | }, 1518 | "node_modules/cookie": { 1519 | "version": "0.5.0", 1520 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1521 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 1522 | "dev": true, 1523 | "engines": { 1524 | "node": ">= 0.6" 1525 | } 1526 | }, 1527 | "node_modules/data-uri-to-buffer": { 1528 | "version": "2.0.2", 1529 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 1530 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 1531 | "dev": true 1532 | }, 1533 | "node_modules/debug": { 1534 | "version": "4.4.0", 1535 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1536 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1537 | "dev": true, 1538 | "dependencies": { 1539 | "ms": "^2.1.3" 1540 | }, 1541 | "engines": { 1542 | "node": ">=6.0" 1543 | }, 1544 | "peerDependenciesMeta": { 1545 | "supports-color": { 1546 | "optional": true 1547 | } 1548 | } 1549 | }, 1550 | "node_modules/deep-eql": { 1551 | "version": "5.0.2", 1552 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 1553 | "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 1554 | "dev": true, 1555 | "engines": { 1556 | "node": ">=6" 1557 | } 1558 | }, 1559 | "node_modules/defu": { 1560 | "version": "6.1.4", 1561 | "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 1562 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 1563 | "dev": true 1564 | }, 1565 | "node_modules/detect-libc": { 1566 | "version": "2.0.3", 1567 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 1568 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 1569 | "dev": true, 1570 | "optional": true, 1571 | "engines": { 1572 | "node": ">=8" 1573 | } 1574 | }, 1575 | "node_modules/devalue": { 1576 | "version": "4.3.3", 1577 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.3.tgz", 1578 | "integrity": "sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==", 1579 | "dev": true 1580 | }, 1581 | "node_modules/es-module-lexer": { 1582 | "version": "1.6.0", 1583 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", 1584 | "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", 1585 | "dev": true 1586 | }, 1587 | "node_modules/esbuild": { 1588 | "version": "0.17.19", 1589 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 1590 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 1591 | "dev": true, 1592 | "hasInstallScript": true, 1593 | "bin": { 1594 | "esbuild": "bin/esbuild" 1595 | }, 1596 | "engines": { 1597 | "node": ">=12" 1598 | }, 1599 | "optionalDependencies": { 1600 | "@esbuild/android-arm": "0.17.19", 1601 | "@esbuild/android-arm64": "0.17.19", 1602 | "@esbuild/android-x64": "0.17.19", 1603 | "@esbuild/darwin-arm64": "0.17.19", 1604 | "@esbuild/darwin-x64": "0.17.19", 1605 | "@esbuild/freebsd-arm64": "0.17.19", 1606 | "@esbuild/freebsd-x64": "0.17.19", 1607 | "@esbuild/linux-arm": "0.17.19", 1608 | "@esbuild/linux-arm64": "0.17.19", 1609 | "@esbuild/linux-ia32": "0.17.19", 1610 | "@esbuild/linux-loong64": "0.17.19", 1611 | "@esbuild/linux-mips64el": "0.17.19", 1612 | "@esbuild/linux-ppc64": "0.17.19", 1613 | "@esbuild/linux-riscv64": "0.17.19", 1614 | "@esbuild/linux-s390x": "0.17.19", 1615 | "@esbuild/linux-x64": "0.17.19", 1616 | "@esbuild/netbsd-x64": "0.17.19", 1617 | "@esbuild/openbsd-x64": "0.17.19", 1618 | "@esbuild/sunos-x64": "0.17.19", 1619 | "@esbuild/win32-arm64": "0.17.19", 1620 | "@esbuild/win32-ia32": "0.17.19", 1621 | "@esbuild/win32-x64": "0.17.19" 1622 | } 1623 | }, 1624 | "node_modules/escape-string-regexp": { 1625 | "version": "4.0.0", 1626 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1627 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1628 | "dev": true, 1629 | "engines": { 1630 | "node": ">=10" 1631 | }, 1632 | "funding": { 1633 | "url": "https://github.com/sponsors/sindresorhus" 1634 | } 1635 | }, 1636 | "node_modules/estree-walker": { 1637 | "version": "3.0.3", 1638 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1639 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1640 | "dev": true, 1641 | "dependencies": { 1642 | "@types/estree": "^1.0.0" 1643 | } 1644 | }, 1645 | "node_modules/exit-hook": { 1646 | "version": "2.2.1", 1647 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 1648 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 1649 | "dev": true, 1650 | "engines": { 1651 | "node": ">=6" 1652 | }, 1653 | "funding": { 1654 | "url": "https://github.com/sponsors/sindresorhus" 1655 | } 1656 | }, 1657 | "node_modules/expect-type": { 1658 | "version": "1.2.0", 1659 | "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.0.tgz", 1660 | "integrity": "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==", 1661 | "dev": true, 1662 | "engines": { 1663 | "node": ">=12.0.0" 1664 | } 1665 | }, 1666 | "node_modules/exsolve": { 1667 | "version": "1.0.4", 1668 | "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", 1669 | "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", 1670 | "dev": true 1671 | }, 1672 | "node_modules/fsevents": { 1673 | "version": "2.3.3", 1674 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1675 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1676 | "dev": true, 1677 | "hasInstallScript": true, 1678 | "optional": true, 1679 | "os": [ 1680 | "darwin" 1681 | ], 1682 | "engines": { 1683 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1684 | } 1685 | }, 1686 | "node_modules/get-source": { 1687 | "version": "2.0.12", 1688 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 1689 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 1690 | "dev": true, 1691 | "dependencies": { 1692 | "data-uri-to-buffer": "^2.0.0", 1693 | "source-map": "^0.6.1" 1694 | } 1695 | }, 1696 | "node_modules/glob-to-regexp": { 1697 | "version": "0.4.1", 1698 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 1699 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 1700 | "dev": true 1701 | }, 1702 | "node_modules/is-arrayish": { 1703 | "version": "0.3.2", 1704 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 1705 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", 1706 | "dev": true, 1707 | "optional": true 1708 | }, 1709 | "node_modules/loupe": { 1710 | "version": "3.1.3", 1711 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", 1712 | "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", 1713 | "dev": true 1714 | }, 1715 | "node_modules/magic-string": { 1716 | "version": "0.30.17", 1717 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 1718 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 1719 | "dev": true, 1720 | "dependencies": { 1721 | "@jridgewell/sourcemap-codec": "^1.5.0" 1722 | } 1723 | }, 1724 | "node_modules/mime": { 1725 | "version": "3.0.0", 1726 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 1727 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 1728 | "dev": true, 1729 | "bin": { 1730 | "mime": "cli.js" 1731 | }, 1732 | "engines": { 1733 | "node": ">=10.0.0" 1734 | } 1735 | }, 1736 | "node_modules/miniflare": { 1737 | "version": "3.20250310.0", 1738 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20250310.0.tgz", 1739 | "integrity": "sha512-TQAxoo2ZiQYjiOJoK3bbcyjKD/u1E3akYOeSHc2Zcp1sLVydrgzSjmxtrn65/3BfDIrUgfYHyy9wspT6wzBy/A==", 1740 | "dev": true, 1741 | "dependencies": { 1742 | "@cspotcode/source-map-support": "0.8.1", 1743 | "acorn": "8.14.0", 1744 | "acorn-walk": "8.3.2", 1745 | "exit-hook": "2.2.1", 1746 | "glob-to-regexp": "0.4.1", 1747 | "stoppable": "1.1.0", 1748 | "undici": "^5.28.5", 1749 | "workerd": "1.20250310.0", 1750 | "ws": "8.18.0", 1751 | "youch": "3.2.3", 1752 | "zod": "3.22.3" 1753 | }, 1754 | "bin": { 1755 | "miniflare": "bootstrap.js" 1756 | }, 1757 | "engines": { 1758 | "node": ">=16.13" 1759 | } 1760 | }, 1761 | "node_modules/miniflare/node_modules/zod": { 1762 | "version": "3.22.3", 1763 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", 1764 | "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", 1765 | "dev": true, 1766 | "funding": { 1767 | "url": "https://github.com/sponsors/colinhacks" 1768 | } 1769 | }, 1770 | "node_modules/ms": { 1771 | "version": "2.1.3", 1772 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1773 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1774 | "dev": true 1775 | }, 1776 | "node_modules/mustache": { 1777 | "version": "4.2.0", 1778 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 1779 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 1780 | "dev": true, 1781 | "bin": { 1782 | "mustache": "bin/mustache" 1783 | } 1784 | }, 1785 | "node_modules/nanoid": { 1786 | "version": "3.3.11", 1787 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 1788 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1789 | "dev": true, 1790 | "funding": [ 1791 | { 1792 | "type": "github", 1793 | "url": "https://github.com/sponsors/ai" 1794 | } 1795 | ], 1796 | "bin": { 1797 | "nanoid": "bin/nanoid.cjs" 1798 | }, 1799 | "engines": { 1800 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1801 | } 1802 | }, 1803 | "node_modules/ohash": { 1804 | "version": "2.0.11", 1805 | "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", 1806 | "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", 1807 | "dev": true 1808 | }, 1809 | "node_modules/path-to-regexp": { 1810 | "version": "6.3.0", 1811 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", 1812 | "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", 1813 | "dev": true 1814 | }, 1815 | "node_modules/pathe": { 1816 | "version": "2.0.3", 1817 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 1818 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 1819 | "dev": true 1820 | }, 1821 | "node_modules/pathval": { 1822 | "version": "2.0.0", 1823 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", 1824 | "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", 1825 | "dev": true, 1826 | "engines": { 1827 | "node": ">= 14.16" 1828 | } 1829 | }, 1830 | "node_modules/picocolors": { 1831 | "version": "1.1.1", 1832 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1833 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1834 | "dev": true 1835 | }, 1836 | "node_modules/postcss": { 1837 | "version": "8.5.3", 1838 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1839 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1840 | "dev": true, 1841 | "funding": [ 1842 | { 1843 | "type": "opencollective", 1844 | "url": "https://opencollective.com/postcss/" 1845 | }, 1846 | { 1847 | "type": "tidelift", 1848 | "url": "https://tidelift.com/funding/github/npm/postcss" 1849 | }, 1850 | { 1851 | "type": "github", 1852 | "url": "https://github.com/sponsors/ai" 1853 | } 1854 | ], 1855 | "dependencies": { 1856 | "nanoid": "^3.3.8", 1857 | "picocolors": "^1.1.1", 1858 | "source-map-js": "^1.2.1" 1859 | }, 1860 | "engines": { 1861 | "node": "^10 || ^12 || >=14" 1862 | } 1863 | }, 1864 | "node_modules/printable-characters": { 1865 | "version": "1.0.42", 1866 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 1867 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 1868 | "dev": true 1869 | }, 1870 | "node_modules/rollup": { 1871 | "version": "4.36.0", 1872 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", 1873 | "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", 1874 | "dev": true, 1875 | "dependencies": { 1876 | "@types/estree": "1.0.6" 1877 | }, 1878 | "bin": { 1879 | "rollup": "dist/bin/rollup" 1880 | }, 1881 | "engines": { 1882 | "node": ">=18.0.0", 1883 | "npm": ">=8.0.0" 1884 | }, 1885 | "optionalDependencies": { 1886 | "@rollup/rollup-android-arm-eabi": "4.36.0", 1887 | "@rollup/rollup-android-arm64": "4.36.0", 1888 | "@rollup/rollup-darwin-arm64": "4.36.0", 1889 | "@rollup/rollup-darwin-x64": "4.36.0", 1890 | "@rollup/rollup-freebsd-arm64": "4.36.0", 1891 | "@rollup/rollup-freebsd-x64": "4.36.0", 1892 | "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", 1893 | "@rollup/rollup-linux-arm-musleabihf": "4.36.0", 1894 | "@rollup/rollup-linux-arm64-gnu": "4.36.0", 1895 | "@rollup/rollup-linux-arm64-musl": "4.36.0", 1896 | "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", 1897 | "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", 1898 | "@rollup/rollup-linux-riscv64-gnu": "4.36.0", 1899 | "@rollup/rollup-linux-s390x-gnu": "4.36.0", 1900 | "@rollup/rollup-linux-x64-gnu": "4.36.0", 1901 | "@rollup/rollup-linux-x64-musl": "4.36.0", 1902 | "@rollup/rollup-win32-arm64-msvc": "4.36.0", 1903 | "@rollup/rollup-win32-ia32-msvc": "4.36.0", 1904 | "@rollup/rollup-win32-x64-msvc": "4.36.0", 1905 | "fsevents": "~2.3.2" 1906 | } 1907 | }, 1908 | "node_modules/rollup-plugin-inject": { 1909 | "version": "3.0.2", 1910 | "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", 1911 | "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", 1912 | "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", 1913 | "dev": true, 1914 | "dependencies": { 1915 | "estree-walker": "^0.6.1", 1916 | "magic-string": "^0.25.3", 1917 | "rollup-pluginutils": "^2.8.1" 1918 | } 1919 | }, 1920 | "node_modules/rollup-plugin-inject/node_modules/estree-walker": { 1921 | "version": "0.6.1", 1922 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 1923 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 1924 | "dev": true 1925 | }, 1926 | "node_modules/rollup-plugin-inject/node_modules/magic-string": { 1927 | "version": "0.25.9", 1928 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 1929 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 1930 | "dev": true, 1931 | "dependencies": { 1932 | "sourcemap-codec": "^1.4.8" 1933 | } 1934 | }, 1935 | "node_modules/rollup-plugin-node-polyfills": { 1936 | "version": "0.2.1", 1937 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", 1938 | "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", 1939 | "dev": true, 1940 | "dependencies": { 1941 | "rollup-plugin-inject": "^3.0.0" 1942 | } 1943 | }, 1944 | "node_modules/rollup-pluginutils": { 1945 | "version": "2.8.2", 1946 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 1947 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 1948 | "dev": true, 1949 | "dependencies": { 1950 | "estree-walker": "^0.6.1" 1951 | } 1952 | }, 1953 | "node_modules/rollup-pluginutils/node_modules/estree-walker": { 1954 | "version": "0.6.1", 1955 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 1956 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 1957 | "dev": true 1958 | }, 1959 | "node_modules/semver": { 1960 | "version": "7.7.1", 1961 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 1962 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 1963 | "dev": true, 1964 | "bin": { 1965 | "semver": "bin/semver.js" 1966 | }, 1967 | "engines": { 1968 | "node": ">=10" 1969 | } 1970 | }, 1971 | "node_modules/sharp": { 1972 | "version": "0.33.5", 1973 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", 1974 | "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", 1975 | "dev": true, 1976 | "hasInstallScript": true, 1977 | "optional": true, 1978 | "dependencies": { 1979 | "color": "^4.2.3", 1980 | "detect-libc": "^2.0.3", 1981 | "semver": "^7.6.3" 1982 | }, 1983 | "engines": { 1984 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1985 | }, 1986 | "funding": { 1987 | "url": "https://opencollective.com/libvips" 1988 | }, 1989 | "optionalDependencies": { 1990 | "@img/sharp-darwin-arm64": "0.33.5", 1991 | "@img/sharp-darwin-x64": "0.33.5", 1992 | "@img/sharp-libvips-darwin-arm64": "1.0.4", 1993 | "@img/sharp-libvips-darwin-x64": "1.0.4", 1994 | "@img/sharp-libvips-linux-arm": "1.0.5", 1995 | "@img/sharp-libvips-linux-arm64": "1.0.4", 1996 | "@img/sharp-libvips-linux-s390x": "1.0.4", 1997 | "@img/sharp-libvips-linux-x64": "1.0.4", 1998 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", 1999 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4", 2000 | "@img/sharp-linux-arm": "0.33.5", 2001 | "@img/sharp-linux-arm64": "0.33.5", 2002 | "@img/sharp-linux-s390x": "0.33.5", 2003 | "@img/sharp-linux-x64": "0.33.5", 2004 | "@img/sharp-linuxmusl-arm64": "0.33.5", 2005 | "@img/sharp-linuxmusl-x64": "0.33.5", 2006 | "@img/sharp-wasm32": "0.33.5", 2007 | "@img/sharp-win32-ia32": "0.33.5", 2008 | "@img/sharp-win32-x64": "0.33.5" 2009 | } 2010 | }, 2011 | "node_modules/siginfo": { 2012 | "version": "2.0.0", 2013 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 2014 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 2015 | "dev": true 2016 | }, 2017 | "node_modules/simple-swizzle": { 2018 | "version": "0.2.2", 2019 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2020 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 2021 | "dev": true, 2022 | "optional": true, 2023 | "dependencies": { 2024 | "is-arrayish": "^0.3.1" 2025 | } 2026 | }, 2027 | "node_modules/source-map": { 2028 | "version": "0.6.1", 2029 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2030 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2031 | "dev": true, 2032 | "engines": { 2033 | "node": ">=0.10.0" 2034 | } 2035 | }, 2036 | "node_modules/source-map-js": { 2037 | "version": "1.2.1", 2038 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2039 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2040 | "dev": true, 2041 | "engines": { 2042 | "node": ">=0.10.0" 2043 | } 2044 | }, 2045 | "node_modules/sourcemap-codec": { 2046 | "version": "1.4.8", 2047 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 2048 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 2049 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 2050 | "dev": true 2051 | }, 2052 | "node_modules/stackback": { 2053 | "version": "0.0.2", 2054 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 2055 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 2056 | "dev": true 2057 | }, 2058 | "node_modules/stacktracey": { 2059 | "version": "2.1.8", 2060 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 2061 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 2062 | "dev": true, 2063 | "dependencies": { 2064 | "as-table": "^1.0.36", 2065 | "get-source": "^2.0.12" 2066 | } 2067 | }, 2068 | "node_modules/std-env": { 2069 | "version": "3.8.1", 2070 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", 2071 | "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", 2072 | "dev": true 2073 | }, 2074 | "node_modules/stoppable": { 2075 | "version": "1.1.0", 2076 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 2077 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 2078 | "dev": true, 2079 | "engines": { 2080 | "node": ">=4", 2081 | "npm": ">=6" 2082 | } 2083 | }, 2084 | "node_modules/tinybench": { 2085 | "version": "2.9.0", 2086 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 2087 | "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 2088 | "dev": true 2089 | }, 2090 | "node_modules/tinyexec": { 2091 | "version": "0.3.2", 2092 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 2093 | "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 2094 | "dev": true 2095 | }, 2096 | "node_modules/tinypool": { 2097 | "version": "1.0.2", 2098 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", 2099 | "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", 2100 | "dev": true, 2101 | "engines": { 2102 | "node": "^18.0.0 || >=20.0.0" 2103 | } 2104 | }, 2105 | "node_modules/tinyrainbow": { 2106 | "version": "2.0.0", 2107 | "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", 2108 | "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", 2109 | "dev": true, 2110 | "engines": { 2111 | "node": ">=14.0.0" 2112 | } 2113 | }, 2114 | "node_modules/tinyspy": { 2115 | "version": "3.0.2", 2116 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", 2117 | "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", 2118 | "dev": true, 2119 | "engines": { 2120 | "node": ">=14.0.0" 2121 | } 2122 | }, 2123 | "node_modules/tslib": { 2124 | "version": "2.8.1", 2125 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2126 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2127 | "dev": true, 2128 | "optional": true 2129 | }, 2130 | "node_modules/ufo": { 2131 | "version": "1.5.4", 2132 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", 2133 | "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", 2134 | "dev": true 2135 | }, 2136 | "node_modules/undici": { 2137 | "version": "5.29.0", 2138 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 2139 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 2140 | "dev": true, 2141 | "dependencies": { 2142 | "@fastify/busboy": "^2.0.0" 2143 | }, 2144 | "engines": { 2145 | "node": ">=14.0" 2146 | } 2147 | }, 2148 | "node_modules/unenv": { 2149 | "version": "2.0.0-rc.14", 2150 | "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.14.tgz", 2151 | "integrity": "sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==", 2152 | "dev": true, 2153 | "dependencies": { 2154 | "defu": "^6.1.4", 2155 | "exsolve": "^1.0.1", 2156 | "ohash": "^2.0.10", 2157 | "pathe": "^2.0.3", 2158 | "ufo": "^1.5.4" 2159 | } 2160 | }, 2161 | "node_modules/vite": { 2162 | "version": "6.2.2", 2163 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", 2164 | "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", 2165 | "dev": true, 2166 | "dependencies": { 2167 | "esbuild": "^0.25.0", 2168 | "postcss": "^8.5.3", 2169 | "rollup": "^4.30.1" 2170 | }, 2171 | "bin": { 2172 | "vite": "bin/vite.js" 2173 | }, 2174 | "engines": { 2175 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2176 | }, 2177 | "funding": { 2178 | "url": "https://github.com/vitejs/vite?sponsor=1" 2179 | }, 2180 | "optionalDependencies": { 2181 | "fsevents": "~2.3.3" 2182 | }, 2183 | "peerDependencies": { 2184 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2185 | "jiti": ">=1.21.0", 2186 | "less": "*", 2187 | "lightningcss": "^1.21.0", 2188 | "sass": "*", 2189 | "sass-embedded": "*", 2190 | "stylus": "*", 2191 | "sugarss": "*", 2192 | "terser": "^5.16.0", 2193 | "tsx": "^4.8.1", 2194 | "yaml": "^2.4.2" 2195 | }, 2196 | "peerDependenciesMeta": { 2197 | "@types/node": { 2198 | "optional": true 2199 | }, 2200 | "jiti": { 2201 | "optional": true 2202 | }, 2203 | "less": { 2204 | "optional": true 2205 | }, 2206 | "lightningcss": { 2207 | "optional": true 2208 | }, 2209 | "sass": { 2210 | "optional": true 2211 | }, 2212 | "sass-embedded": { 2213 | "optional": true 2214 | }, 2215 | "stylus": { 2216 | "optional": true 2217 | }, 2218 | "sugarss": { 2219 | "optional": true 2220 | }, 2221 | "terser": { 2222 | "optional": true 2223 | }, 2224 | "tsx": { 2225 | "optional": true 2226 | }, 2227 | "yaml": { 2228 | "optional": true 2229 | } 2230 | } 2231 | }, 2232 | "node_modules/vite-node": { 2233 | "version": "3.0.9", 2234 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", 2235 | "integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", 2236 | "dev": true, 2237 | "dependencies": { 2238 | "cac": "^6.7.14", 2239 | "debug": "^4.4.0", 2240 | "es-module-lexer": "^1.6.0", 2241 | "pathe": "^2.0.3", 2242 | "vite": "^5.0.0 || ^6.0.0" 2243 | }, 2244 | "bin": { 2245 | "vite-node": "vite-node.mjs" 2246 | }, 2247 | "engines": { 2248 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2249 | }, 2250 | "funding": { 2251 | "url": "https://opencollective.com/vitest" 2252 | } 2253 | }, 2254 | "node_modules/vite/node_modules/@esbuild/android-arm": { 2255 | "version": "0.25.1", 2256 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", 2257 | "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", 2258 | "cpu": [ 2259 | "arm" 2260 | ], 2261 | "dev": true, 2262 | "optional": true, 2263 | "os": [ 2264 | "android" 2265 | ], 2266 | "engines": { 2267 | "node": ">=18" 2268 | } 2269 | }, 2270 | "node_modules/vite/node_modules/@esbuild/android-arm64": { 2271 | "version": "0.25.1", 2272 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", 2273 | "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", 2274 | "cpu": [ 2275 | "arm64" 2276 | ], 2277 | "dev": true, 2278 | "optional": true, 2279 | "os": [ 2280 | "android" 2281 | ], 2282 | "engines": { 2283 | "node": ">=18" 2284 | } 2285 | }, 2286 | "node_modules/vite/node_modules/@esbuild/android-x64": { 2287 | "version": "0.25.1", 2288 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", 2289 | "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", 2290 | "cpu": [ 2291 | "x64" 2292 | ], 2293 | "dev": true, 2294 | "optional": true, 2295 | "os": [ 2296 | "android" 2297 | ], 2298 | "engines": { 2299 | "node": ">=18" 2300 | } 2301 | }, 2302 | "node_modules/vite/node_modules/@esbuild/darwin-arm64": { 2303 | "version": "0.25.1", 2304 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", 2305 | "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", 2306 | "cpu": [ 2307 | "arm64" 2308 | ], 2309 | "dev": true, 2310 | "optional": true, 2311 | "os": [ 2312 | "darwin" 2313 | ], 2314 | "engines": { 2315 | "node": ">=18" 2316 | } 2317 | }, 2318 | "node_modules/vite/node_modules/@esbuild/darwin-x64": { 2319 | "version": "0.25.1", 2320 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", 2321 | "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", 2322 | "cpu": [ 2323 | "x64" 2324 | ], 2325 | "dev": true, 2326 | "optional": true, 2327 | "os": [ 2328 | "darwin" 2329 | ], 2330 | "engines": { 2331 | "node": ">=18" 2332 | } 2333 | }, 2334 | "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { 2335 | "version": "0.25.1", 2336 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", 2337 | "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", 2338 | "cpu": [ 2339 | "arm64" 2340 | ], 2341 | "dev": true, 2342 | "optional": true, 2343 | "os": [ 2344 | "freebsd" 2345 | ], 2346 | "engines": { 2347 | "node": ">=18" 2348 | } 2349 | }, 2350 | "node_modules/vite/node_modules/@esbuild/freebsd-x64": { 2351 | "version": "0.25.1", 2352 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", 2353 | "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", 2354 | "cpu": [ 2355 | "x64" 2356 | ], 2357 | "dev": true, 2358 | "optional": true, 2359 | "os": [ 2360 | "freebsd" 2361 | ], 2362 | "engines": { 2363 | "node": ">=18" 2364 | } 2365 | }, 2366 | "node_modules/vite/node_modules/@esbuild/linux-arm": { 2367 | "version": "0.25.1", 2368 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", 2369 | "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", 2370 | "cpu": [ 2371 | "arm" 2372 | ], 2373 | "dev": true, 2374 | "optional": true, 2375 | "os": [ 2376 | "linux" 2377 | ], 2378 | "engines": { 2379 | "node": ">=18" 2380 | } 2381 | }, 2382 | "node_modules/vite/node_modules/@esbuild/linux-arm64": { 2383 | "version": "0.25.1", 2384 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", 2385 | "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", 2386 | "cpu": [ 2387 | "arm64" 2388 | ], 2389 | "dev": true, 2390 | "optional": true, 2391 | "os": [ 2392 | "linux" 2393 | ], 2394 | "engines": { 2395 | "node": ">=18" 2396 | } 2397 | }, 2398 | "node_modules/vite/node_modules/@esbuild/linux-ia32": { 2399 | "version": "0.25.1", 2400 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", 2401 | "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", 2402 | "cpu": [ 2403 | "ia32" 2404 | ], 2405 | "dev": true, 2406 | "optional": true, 2407 | "os": [ 2408 | "linux" 2409 | ], 2410 | "engines": { 2411 | "node": ">=18" 2412 | } 2413 | }, 2414 | "node_modules/vite/node_modules/@esbuild/linux-loong64": { 2415 | "version": "0.25.1", 2416 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", 2417 | "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", 2418 | "cpu": [ 2419 | "loong64" 2420 | ], 2421 | "dev": true, 2422 | "optional": true, 2423 | "os": [ 2424 | "linux" 2425 | ], 2426 | "engines": { 2427 | "node": ">=18" 2428 | } 2429 | }, 2430 | "node_modules/vite/node_modules/@esbuild/linux-mips64el": { 2431 | "version": "0.25.1", 2432 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", 2433 | "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", 2434 | "cpu": [ 2435 | "mips64el" 2436 | ], 2437 | "dev": true, 2438 | "optional": true, 2439 | "os": [ 2440 | "linux" 2441 | ], 2442 | "engines": { 2443 | "node": ">=18" 2444 | } 2445 | }, 2446 | "node_modules/vite/node_modules/@esbuild/linux-ppc64": { 2447 | "version": "0.25.1", 2448 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", 2449 | "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", 2450 | "cpu": [ 2451 | "ppc64" 2452 | ], 2453 | "dev": true, 2454 | "optional": true, 2455 | "os": [ 2456 | "linux" 2457 | ], 2458 | "engines": { 2459 | "node": ">=18" 2460 | } 2461 | }, 2462 | "node_modules/vite/node_modules/@esbuild/linux-riscv64": { 2463 | "version": "0.25.1", 2464 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", 2465 | "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", 2466 | "cpu": [ 2467 | "riscv64" 2468 | ], 2469 | "dev": true, 2470 | "optional": true, 2471 | "os": [ 2472 | "linux" 2473 | ], 2474 | "engines": { 2475 | "node": ">=18" 2476 | } 2477 | }, 2478 | "node_modules/vite/node_modules/@esbuild/linux-s390x": { 2479 | "version": "0.25.1", 2480 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", 2481 | "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", 2482 | "cpu": [ 2483 | "s390x" 2484 | ], 2485 | "dev": true, 2486 | "optional": true, 2487 | "os": [ 2488 | "linux" 2489 | ], 2490 | "engines": { 2491 | "node": ">=18" 2492 | } 2493 | }, 2494 | "node_modules/vite/node_modules/@esbuild/linux-x64": { 2495 | "version": "0.25.1", 2496 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", 2497 | "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", 2498 | "cpu": [ 2499 | "x64" 2500 | ], 2501 | "dev": true, 2502 | "optional": true, 2503 | "os": [ 2504 | "linux" 2505 | ], 2506 | "engines": { 2507 | "node": ">=18" 2508 | } 2509 | }, 2510 | "node_modules/vite/node_modules/@esbuild/netbsd-x64": { 2511 | "version": "0.25.1", 2512 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", 2513 | "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", 2514 | "cpu": [ 2515 | "x64" 2516 | ], 2517 | "dev": true, 2518 | "optional": true, 2519 | "os": [ 2520 | "netbsd" 2521 | ], 2522 | "engines": { 2523 | "node": ">=18" 2524 | } 2525 | }, 2526 | "node_modules/vite/node_modules/@esbuild/openbsd-x64": { 2527 | "version": "0.25.1", 2528 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", 2529 | "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", 2530 | "cpu": [ 2531 | "x64" 2532 | ], 2533 | "dev": true, 2534 | "optional": true, 2535 | "os": [ 2536 | "openbsd" 2537 | ], 2538 | "engines": { 2539 | "node": ">=18" 2540 | } 2541 | }, 2542 | "node_modules/vite/node_modules/@esbuild/sunos-x64": { 2543 | "version": "0.25.1", 2544 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", 2545 | "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", 2546 | "cpu": [ 2547 | "x64" 2548 | ], 2549 | "dev": true, 2550 | "optional": true, 2551 | "os": [ 2552 | "sunos" 2553 | ], 2554 | "engines": { 2555 | "node": ">=18" 2556 | } 2557 | }, 2558 | "node_modules/vite/node_modules/@esbuild/win32-arm64": { 2559 | "version": "0.25.1", 2560 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", 2561 | "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", 2562 | "cpu": [ 2563 | "arm64" 2564 | ], 2565 | "dev": true, 2566 | "optional": true, 2567 | "os": [ 2568 | "win32" 2569 | ], 2570 | "engines": { 2571 | "node": ">=18" 2572 | } 2573 | }, 2574 | "node_modules/vite/node_modules/@esbuild/win32-ia32": { 2575 | "version": "0.25.1", 2576 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", 2577 | "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", 2578 | "cpu": [ 2579 | "ia32" 2580 | ], 2581 | "dev": true, 2582 | "optional": true, 2583 | "os": [ 2584 | "win32" 2585 | ], 2586 | "engines": { 2587 | "node": ">=18" 2588 | } 2589 | }, 2590 | "node_modules/vite/node_modules/@esbuild/win32-x64": { 2591 | "version": "0.25.1", 2592 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", 2593 | "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", 2594 | "cpu": [ 2595 | "x64" 2596 | ], 2597 | "dev": true, 2598 | "optional": true, 2599 | "os": [ 2600 | "win32" 2601 | ], 2602 | "engines": { 2603 | "node": ">=18" 2604 | } 2605 | }, 2606 | "node_modules/vite/node_modules/esbuild": { 2607 | "version": "0.25.1", 2608 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", 2609 | "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", 2610 | "dev": true, 2611 | "hasInstallScript": true, 2612 | "bin": { 2613 | "esbuild": "bin/esbuild" 2614 | }, 2615 | "engines": { 2616 | "node": ">=18" 2617 | }, 2618 | "optionalDependencies": { 2619 | "@esbuild/aix-ppc64": "0.25.1", 2620 | "@esbuild/android-arm": "0.25.1", 2621 | "@esbuild/android-arm64": "0.25.1", 2622 | "@esbuild/android-x64": "0.25.1", 2623 | "@esbuild/darwin-arm64": "0.25.1", 2624 | "@esbuild/darwin-x64": "0.25.1", 2625 | "@esbuild/freebsd-arm64": "0.25.1", 2626 | "@esbuild/freebsd-x64": "0.25.1", 2627 | "@esbuild/linux-arm": "0.25.1", 2628 | "@esbuild/linux-arm64": "0.25.1", 2629 | "@esbuild/linux-ia32": "0.25.1", 2630 | "@esbuild/linux-loong64": "0.25.1", 2631 | "@esbuild/linux-mips64el": "0.25.1", 2632 | "@esbuild/linux-ppc64": "0.25.1", 2633 | "@esbuild/linux-riscv64": "0.25.1", 2634 | "@esbuild/linux-s390x": "0.25.1", 2635 | "@esbuild/linux-x64": "0.25.1", 2636 | "@esbuild/netbsd-arm64": "0.25.1", 2637 | "@esbuild/netbsd-x64": "0.25.1", 2638 | "@esbuild/openbsd-arm64": "0.25.1", 2639 | "@esbuild/openbsd-x64": "0.25.1", 2640 | "@esbuild/sunos-x64": "0.25.1", 2641 | "@esbuild/win32-arm64": "0.25.1", 2642 | "@esbuild/win32-ia32": "0.25.1", 2643 | "@esbuild/win32-x64": "0.25.1" 2644 | } 2645 | }, 2646 | "node_modules/vitest": { 2647 | "version": "3.0.9", 2648 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", 2649 | "integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", 2650 | "dev": true, 2651 | "dependencies": { 2652 | "@vitest/expect": "3.0.9", 2653 | "@vitest/mocker": "3.0.9", 2654 | "@vitest/pretty-format": "^3.0.9", 2655 | "@vitest/runner": "3.0.9", 2656 | "@vitest/snapshot": "3.0.9", 2657 | "@vitest/spy": "3.0.9", 2658 | "@vitest/utils": "3.0.9", 2659 | "chai": "^5.2.0", 2660 | "debug": "^4.4.0", 2661 | "expect-type": "^1.1.0", 2662 | "magic-string": "^0.30.17", 2663 | "pathe": "^2.0.3", 2664 | "std-env": "^3.8.0", 2665 | "tinybench": "^2.9.0", 2666 | "tinyexec": "^0.3.2", 2667 | "tinypool": "^1.0.2", 2668 | "tinyrainbow": "^2.0.0", 2669 | "vite": "^5.0.0 || ^6.0.0", 2670 | "vite-node": "3.0.9", 2671 | "why-is-node-running": "^2.3.0" 2672 | }, 2673 | "bin": { 2674 | "vitest": "vitest.mjs" 2675 | }, 2676 | "engines": { 2677 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2678 | }, 2679 | "funding": { 2680 | "url": "https://opencollective.com/vitest" 2681 | }, 2682 | "peerDependencies": { 2683 | "@edge-runtime/vm": "*", 2684 | "@types/debug": "^4.1.12", 2685 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2686 | "@vitest/browser": "3.0.9", 2687 | "@vitest/ui": "3.0.9", 2688 | "happy-dom": "*", 2689 | "jsdom": "*" 2690 | }, 2691 | "peerDependenciesMeta": { 2692 | "@edge-runtime/vm": { 2693 | "optional": true 2694 | }, 2695 | "@types/debug": { 2696 | "optional": true 2697 | }, 2698 | "@types/node": { 2699 | "optional": true 2700 | }, 2701 | "@vitest/browser": { 2702 | "optional": true 2703 | }, 2704 | "@vitest/ui": { 2705 | "optional": true 2706 | }, 2707 | "happy-dom": { 2708 | "optional": true 2709 | }, 2710 | "jsdom": { 2711 | "optional": true 2712 | } 2713 | } 2714 | }, 2715 | "node_modules/why-is-node-running": { 2716 | "version": "2.3.0", 2717 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 2718 | "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 2719 | "dev": true, 2720 | "dependencies": { 2721 | "siginfo": "^2.0.0", 2722 | "stackback": "0.0.2" 2723 | }, 2724 | "bin": { 2725 | "why-is-node-running": "cli.js" 2726 | }, 2727 | "engines": { 2728 | "node": ">=8" 2729 | } 2730 | }, 2731 | "node_modules/workerd": { 2732 | "version": "1.20250310.0", 2733 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250310.0.tgz", 2734 | "integrity": "sha512-bAaZ9Bmts3mArbIrXYAtr+ZRsAJAAUEsCtvwfBavIYXaZ5sgdEOJBEiBbvsHp6CsVObegOM85tIWpYLpbTxQrQ==", 2735 | "dev": true, 2736 | "hasInstallScript": true, 2737 | "bin": { 2738 | "workerd": "bin/workerd" 2739 | }, 2740 | "engines": { 2741 | "node": ">=16" 2742 | }, 2743 | "optionalDependencies": { 2744 | "@cloudflare/workerd-darwin-64": "1.20250310.0", 2745 | "@cloudflare/workerd-darwin-arm64": "1.20250310.0", 2746 | "@cloudflare/workerd-linux-64": "1.20250310.0", 2747 | "@cloudflare/workerd-linux-arm64": "1.20250310.0", 2748 | "@cloudflare/workerd-windows-64": "1.20250310.0" 2749 | } 2750 | }, 2751 | "node_modules/wrangler": { 2752 | "version": "4.4.0", 2753 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.4.0.tgz", 2754 | "integrity": "sha512-VmHBpocMk/GTEER+jJzkQeGNx5i/qJJKoUse5zvKmJOnELG/dhEQBJoaWxllwOfaPhIbnqeXdtrN/B+dfQAsFA==", 2755 | "dev": true, 2756 | "dependencies": { 2757 | "@cloudflare/kv-asset-handler": "0.4.0", 2758 | "@cloudflare/unenv-preset": "2.3.0", 2759 | "blake3-wasm": "2.1.5", 2760 | "esbuild": "0.24.2", 2761 | "miniflare": "4.20250320.0", 2762 | "path-to-regexp": "6.3.0", 2763 | "unenv": "2.0.0-rc.15", 2764 | "workerd": "1.20250320.0" 2765 | }, 2766 | "bin": { 2767 | "wrangler": "bin/wrangler.js", 2768 | "wrangler2": "bin/wrangler.js" 2769 | }, 2770 | "engines": { 2771 | "node": ">=18.0.0" 2772 | }, 2773 | "optionalDependencies": { 2774 | "fsevents": "~2.3.2", 2775 | "sharp": "^0.33.5" 2776 | }, 2777 | "peerDependencies": { 2778 | "@cloudflare/workers-types": "^4.20250320.0" 2779 | }, 2780 | "peerDependenciesMeta": { 2781 | "@cloudflare/workers-types": { 2782 | "optional": true 2783 | } 2784 | } 2785 | }, 2786 | "node_modules/wrangler/node_modules/@cloudflare/kv-asset-handler": { 2787 | "version": "0.4.0", 2788 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", 2789 | "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", 2790 | "dev": true, 2791 | "dependencies": { 2792 | "mime": "^3.0.0" 2793 | }, 2794 | "engines": { 2795 | "node": ">=18.0.0" 2796 | } 2797 | }, 2798 | "node_modules/wrangler/node_modules/@cloudflare/unenv-preset": { 2799 | "version": "2.3.0", 2800 | "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.3.0.tgz", 2801 | "integrity": "sha512-AaKYnbFpHaVDZGh3Hjy3oLYd12+LZw9aupAOudYJ+tjekahxcIqlSAr0zK9kPOdtgn10tzaqH7QJFUWcLE+k7g==", 2802 | "dev": true, 2803 | "peerDependencies": { 2804 | "unenv": "2.0.0-rc.15", 2805 | "workerd": "^1.20250311.0" 2806 | }, 2807 | "peerDependenciesMeta": { 2808 | "workerd": { 2809 | "optional": true 2810 | } 2811 | } 2812 | }, 2813 | "node_modules/wrangler/node_modules/@cloudflare/workerd-darwin-64": { 2814 | "version": "1.20250320.0", 2815 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250320.0.tgz", 2816 | "integrity": "sha512-wS2fcowxgbrKtfahU0Mtt/0XYjnuAjZd+2FsTZ3GDgxlywVTTl8SeApM11cjYo7QNdGh56HEGYMsYojya5sHHQ==", 2817 | "cpu": [ 2818 | "x64" 2819 | ], 2820 | "dev": true, 2821 | "optional": true, 2822 | "os": [ 2823 | "darwin" 2824 | ], 2825 | "engines": { 2826 | "node": ">=16" 2827 | } 2828 | }, 2829 | "node_modules/wrangler/node_modules/@cloudflare/workerd-darwin-arm64": { 2830 | "version": "1.20250320.0", 2831 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250320.0.tgz", 2832 | "integrity": "sha512-QMqFay2buv3pPE+mi30QenX/cmlaB72sXTspk5e4LwEEgsxpoS8BryeIOeo8ScGDyt0NBfOutCRFTTiZLSqyzQ==", 2833 | "cpu": [ 2834 | "arm64" 2835 | ], 2836 | "dev": true, 2837 | "optional": true, 2838 | "os": [ 2839 | "darwin" 2840 | ], 2841 | "engines": { 2842 | "node": ">=16" 2843 | } 2844 | }, 2845 | "node_modules/wrangler/node_modules/@cloudflare/workerd-linux-64": { 2846 | "version": "1.20250320.0", 2847 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250320.0.tgz", 2848 | "integrity": "sha512-PBkmZdNtSIBRiFUhEMhkDoR5WX0bZWE+nSys0/v6DeFU3Pc6KiH+2VPGqWOLVH85uzL1wWFpAJk9ptsWwTC9Ww==", 2849 | "cpu": [ 2850 | "x64" 2851 | ], 2852 | "dev": true, 2853 | "optional": true, 2854 | "os": [ 2855 | "linux" 2856 | ], 2857 | "engines": { 2858 | "node": ">=16" 2859 | } 2860 | }, 2861 | "node_modules/wrangler/node_modules/@cloudflare/workerd-linux-arm64": { 2862 | "version": "1.20250320.0", 2863 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250320.0.tgz", 2864 | "integrity": "sha512-nHSMsNbUwaOJRYuHYK4EcZreOP3FlFqD47FUxGP6k1tjYs4l4z86XJMONbY8vE9WZ9BWPAzZX/xzSalB0DhGIA==", 2865 | "cpu": [ 2866 | "arm64" 2867 | ], 2868 | "dev": true, 2869 | "optional": true, 2870 | "os": [ 2871 | "linux" 2872 | ], 2873 | "engines": { 2874 | "node": ">=16" 2875 | } 2876 | }, 2877 | "node_modules/wrangler/node_modules/@cloudflare/workerd-windows-64": { 2878 | "version": "1.20250320.0", 2879 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250320.0.tgz", 2880 | "integrity": "sha512-Uj5z/PyGqO8xuVCkS19exmQ5yGcC1RbB3nUaf6j5rlft7lBTBkjC+l7NAhEiRxNKaZuT2Lfy+r4vAEPsiotegw==", 2881 | "cpu": [ 2882 | "x64" 2883 | ], 2884 | "dev": true, 2885 | "optional": true, 2886 | "os": [ 2887 | "win32" 2888 | ], 2889 | "engines": { 2890 | "node": ">=16" 2891 | } 2892 | }, 2893 | "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { 2894 | "version": "0.24.2", 2895 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", 2896 | "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", 2897 | "cpu": [ 2898 | "ppc64" 2899 | ], 2900 | "dev": true, 2901 | "optional": true, 2902 | "os": [ 2903 | "aix" 2904 | ], 2905 | "engines": { 2906 | "node": ">=18" 2907 | } 2908 | }, 2909 | "node_modules/wrangler/node_modules/@esbuild/android-arm": { 2910 | "version": "0.24.2", 2911 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", 2912 | "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", 2913 | "cpu": [ 2914 | "arm" 2915 | ], 2916 | "dev": true, 2917 | "optional": true, 2918 | "os": [ 2919 | "android" 2920 | ], 2921 | "engines": { 2922 | "node": ">=18" 2923 | } 2924 | }, 2925 | "node_modules/wrangler/node_modules/@esbuild/android-arm64": { 2926 | "version": "0.24.2", 2927 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", 2928 | "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", 2929 | "cpu": [ 2930 | "arm64" 2931 | ], 2932 | "dev": true, 2933 | "optional": true, 2934 | "os": [ 2935 | "android" 2936 | ], 2937 | "engines": { 2938 | "node": ">=18" 2939 | } 2940 | }, 2941 | "node_modules/wrangler/node_modules/@esbuild/android-x64": { 2942 | "version": "0.24.2", 2943 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", 2944 | "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", 2945 | "cpu": [ 2946 | "x64" 2947 | ], 2948 | "dev": true, 2949 | "optional": true, 2950 | "os": [ 2951 | "android" 2952 | ], 2953 | "engines": { 2954 | "node": ">=18" 2955 | } 2956 | }, 2957 | "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { 2958 | "version": "0.24.2", 2959 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", 2960 | "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", 2961 | "cpu": [ 2962 | "arm64" 2963 | ], 2964 | "dev": true, 2965 | "optional": true, 2966 | "os": [ 2967 | "darwin" 2968 | ], 2969 | "engines": { 2970 | "node": ">=18" 2971 | } 2972 | }, 2973 | "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { 2974 | "version": "0.24.2", 2975 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", 2976 | "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", 2977 | "cpu": [ 2978 | "x64" 2979 | ], 2980 | "dev": true, 2981 | "optional": true, 2982 | "os": [ 2983 | "darwin" 2984 | ], 2985 | "engines": { 2986 | "node": ">=18" 2987 | } 2988 | }, 2989 | "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { 2990 | "version": "0.24.2", 2991 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", 2992 | "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", 2993 | "cpu": [ 2994 | "arm64" 2995 | ], 2996 | "dev": true, 2997 | "optional": true, 2998 | "os": [ 2999 | "freebsd" 3000 | ], 3001 | "engines": { 3002 | "node": ">=18" 3003 | } 3004 | }, 3005 | "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { 3006 | "version": "0.24.2", 3007 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", 3008 | "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", 3009 | "cpu": [ 3010 | "x64" 3011 | ], 3012 | "dev": true, 3013 | "optional": true, 3014 | "os": [ 3015 | "freebsd" 3016 | ], 3017 | "engines": { 3018 | "node": ">=18" 3019 | } 3020 | }, 3021 | "node_modules/wrangler/node_modules/@esbuild/linux-arm": { 3022 | "version": "0.24.2", 3023 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", 3024 | "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", 3025 | "cpu": [ 3026 | "arm" 3027 | ], 3028 | "dev": true, 3029 | "optional": true, 3030 | "os": [ 3031 | "linux" 3032 | ], 3033 | "engines": { 3034 | "node": ">=18" 3035 | } 3036 | }, 3037 | "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { 3038 | "version": "0.24.2", 3039 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", 3040 | "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", 3041 | "cpu": [ 3042 | "arm64" 3043 | ], 3044 | "dev": true, 3045 | "optional": true, 3046 | "os": [ 3047 | "linux" 3048 | ], 3049 | "engines": { 3050 | "node": ">=18" 3051 | } 3052 | }, 3053 | "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { 3054 | "version": "0.24.2", 3055 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", 3056 | "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", 3057 | "cpu": [ 3058 | "ia32" 3059 | ], 3060 | "dev": true, 3061 | "optional": true, 3062 | "os": [ 3063 | "linux" 3064 | ], 3065 | "engines": { 3066 | "node": ">=18" 3067 | } 3068 | }, 3069 | "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { 3070 | "version": "0.24.2", 3071 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", 3072 | "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", 3073 | "cpu": [ 3074 | "loong64" 3075 | ], 3076 | "dev": true, 3077 | "optional": true, 3078 | "os": [ 3079 | "linux" 3080 | ], 3081 | "engines": { 3082 | "node": ">=18" 3083 | } 3084 | }, 3085 | "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { 3086 | "version": "0.24.2", 3087 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", 3088 | "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", 3089 | "cpu": [ 3090 | "mips64el" 3091 | ], 3092 | "dev": true, 3093 | "optional": true, 3094 | "os": [ 3095 | "linux" 3096 | ], 3097 | "engines": { 3098 | "node": ">=18" 3099 | } 3100 | }, 3101 | "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { 3102 | "version": "0.24.2", 3103 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", 3104 | "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", 3105 | "cpu": [ 3106 | "ppc64" 3107 | ], 3108 | "dev": true, 3109 | "optional": true, 3110 | "os": [ 3111 | "linux" 3112 | ], 3113 | "engines": { 3114 | "node": ">=18" 3115 | } 3116 | }, 3117 | "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { 3118 | "version": "0.24.2", 3119 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", 3120 | "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", 3121 | "cpu": [ 3122 | "riscv64" 3123 | ], 3124 | "dev": true, 3125 | "optional": true, 3126 | "os": [ 3127 | "linux" 3128 | ], 3129 | "engines": { 3130 | "node": ">=18" 3131 | } 3132 | }, 3133 | "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { 3134 | "version": "0.24.2", 3135 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", 3136 | "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", 3137 | "cpu": [ 3138 | "s390x" 3139 | ], 3140 | "dev": true, 3141 | "optional": true, 3142 | "os": [ 3143 | "linux" 3144 | ], 3145 | "engines": { 3146 | "node": ">=18" 3147 | } 3148 | }, 3149 | "node_modules/wrangler/node_modules/@esbuild/linux-x64": { 3150 | "version": "0.24.2", 3151 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", 3152 | "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", 3153 | "cpu": [ 3154 | "x64" 3155 | ], 3156 | "dev": true, 3157 | "optional": true, 3158 | "os": [ 3159 | "linux" 3160 | ], 3161 | "engines": { 3162 | "node": ">=18" 3163 | } 3164 | }, 3165 | "node_modules/wrangler/node_modules/@esbuild/netbsd-arm64": { 3166 | "version": "0.24.2", 3167 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", 3168 | "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", 3169 | "cpu": [ 3170 | "arm64" 3171 | ], 3172 | "dev": true, 3173 | "optional": true, 3174 | "os": [ 3175 | "netbsd" 3176 | ], 3177 | "engines": { 3178 | "node": ">=18" 3179 | } 3180 | }, 3181 | "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { 3182 | "version": "0.24.2", 3183 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", 3184 | "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", 3185 | "cpu": [ 3186 | "x64" 3187 | ], 3188 | "dev": true, 3189 | "optional": true, 3190 | "os": [ 3191 | "netbsd" 3192 | ], 3193 | "engines": { 3194 | "node": ">=18" 3195 | } 3196 | }, 3197 | "node_modules/wrangler/node_modules/@esbuild/openbsd-arm64": { 3198 | "version": "0.24.2", 3199 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", 3200 | "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", 3201 | "cpu": [ 3202 | "arm64" 3203 | ], 3204 | "dev": true, 3205 | "optional": true, 3206 | "os": [ 3207 | "openbsd" 3208 | ], 3209 | "engines": { 3210 | "node": ">=18" 3211 | } 3212 | }, 3213 | "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { 3214 | "version": "0.24.2", 3215 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", 3216 | "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", 3217 | "cpu": [ 3218 | "x64" 3219 | ], 3220 | "dev": true, 3221 | "optional": true, 3222 | "os": [ 3223 | "openbsd" 3224 | ], 3225 | "engines": { 3226 | "node": ">=18" 3227 | } 3228 | }, 3229 | "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { 3230 | "version": "0.24.2", 3231 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", 3232 | "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", 3233 | "cpu": [ 3234 | "x64" 3235 | ], 3236 | "dev": true, 3237 | "optional": true, 3238 | "os": [ 3239 | "sunos" 3240 | ], 3241 | "engines": { 3242 | "node": ">=18" 3243 | } 3244 | }, 3245 | "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { 3246 | "version": "0.24.2", 3247 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", 3248 | "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", 3249 | "cpu": [ 3250 | "arm64" 3251 | ], 3252 | "dev": true, 3253 | "optional": true, 3254 | "os": [ 3255 | "win32" 3256 | ], 3257 | "engines": { 3258 | "node": ">=18" 3259 | } 3260 | }, 3261 | "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { 3262 | "version": "0.24.2", 3263 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", 3264 | "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", 3265 | "cpu": [ 3266 | "ia32" 3267 | ], 3268 | "dev": true, 3269 | "optional": true, 3270 | "os": [ 3271 | "win32" 3272 | ], 3273 | "engines": { 3274 | "node": ">=18" 3275 | } 3276 | }, 3277 | "node_modules/wrangler/node_modules/@esbuild/win32-x64": { 3278 | "version": "0.24.2", 3279 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", 3280 | "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", 3281 | "cpu": [ 3282 | "x64" 3283 | ], 3284 | "dev": true, 3285 | "optional": true, 3286 | "os": [ 3287 | "win32" 3288 | ], 3289 | "engines": { 3290 | "node": ">=18" 3291 | } 3292 | }, 3293 | "node_modules/wrangler/node_modules/esbuild": { 3294 | "version": "0.24.2", 3295 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", 3296 | "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", 3297 | "dev": true, 3298 | "hasInstallScript": true, 3299 | "bin": { 3300 | "esbuild": "bin/esbuild" 3301 | }, 3302 | "engines": { 3303 | "node": ">=18" 3304 | }, 3305 | "optionalDependencies": { 3306 | "@esbuild/aix-ppc64": "0.24.2", 3307 | "@esbuild/android-arm": "0.24.2", 3308 | "@esbuild/android-arm64": "0.24.2", 3309 | "@esbuild/android-x64": "0.24.2", 3310 | "@esbuild/darwin-arm64": "0.24.2", 3311 | "@esbuild/darwin-x64": "0.24.2", 3312 | "@esbuild/freebsd-arm64": "0.24.2", 3313 | "@esbuild/freebsd-x64": "0.24.2", 3314 | "@esbuild/linux-arm": "0.24.2", 3315 | "@esbuild/linux-arm64": "0.24.2", 3316 | "@esbuild/linux-ia32": "0.24.2", 3317 | "@esbuild/linux-loong64": "0.24.2", 3318 | "@esbuild/linux-mips64el": "0.24.2", 3319 | "@esbuild/linux-ppc64": "0.24.2", 3320 | "@esbuild/linux-riscv64": "0.24.2", 3321 | "@esbuild/linux-s390x": "0.24.2", 3322 | "@esbuild/linux-x64": "0.24.2", 3323 | "@esbuild/netbsd-arm64": "0.24.2", 3324 | "@esbuild/netbsd-x64": "0.24.2", 3325 | "@esbuild/openbsd-arm64": "0.24.2", 3326 | "@esbuild/openbsd-x64": "0.24.2", 3327 | "@esbuild/sunos-x64": "0.24.2", 3328 | "@esbuild/win32-arm64": "0.24.2", 3329 | "@esbuild/win32-ia32": "0.24.2", 3330 | "@esbuild/win32-x64": "0.24.2" 3331 | } 3332 | }, 3333 | "node_modules/wrangler/node_modules/miniflare": { 3334 | "version": "4.20250320.0", 3335 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250320.0.tgz", 3336 | "integrity": "sha512-dD9gpO/nWaLURbBXctB/FOJEDexPlSbplIApb5Ea3xGuSSh+3Iq/cfbgh3IdgueIGMJb6vvTiOWpiPA5naX6vg==", 3337 | "dev": true, 3338 | "dependencies": { 3339 | "@cspotcode/source-map-support": "0.8.1", 3340 | "acorn": "8.14.0", 3341 | "acorn-walk": "8.3.2", 3342 | "exit-hook": "2.2.1", 3343 | "glob-to-regexp": "0.4.1", 3344 | "stoppable": "1.1.0", 3345 | "undici": "^5.28.5", 3346 | "workerd": "1.20250320.0", 3347 | "ws": "8.18.0", 3348 | "youch": "3.2.3", 3349 | "zod": "3.22.3" 3350 | }, 3351 | "bin": { 3352 | "miniflare": "bootstrap.js" 3353 | }, 3354 | "engines": { 3355 | "node": ">=18.0.0" 3356 | } 3357 | }, 3358 | "node_modules/wrangler/node_modules/unenv": { 3359 | "version": "2.0.0-rc.15", 3360 | "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.15.tgz", 3361 | "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==", 3362 | "dev": true, 3363 | "dependencies": { 3364 | "defu": "^6.1.4", 3365 | "exsolve": "^1.0.4", 3366 | "ohash": "^2.0.11", 3367 | "pathe": "^2.0.3", 3368 | "ufo": "^1.5.4" 3369 | } 3370 | }, 3371 | "node_modules/wrangler/node_modules/workerd": { 3372 | "version": "1.20250320.0", 3373 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250320.0.tgz", 3374 | "integrity": "sha512-XrjREboPo1AZNF3kSEly/H1Ejmpu2Mk/Wzsxprn7MHUmBnQNASFtvQdN0ef0bN+MaNdCWUawpsDLpNWNOyK4FA==", 3375 | "dev": true, 3376 | "hasInstallScript": true, 3377 | "bin": { 3378 | "workerd": "bin/workerd" 3379 | }, 3380 | "engines": { 3381 | "node": ">=16" 3382 | }, 3383 | "optionalDependencies": { 3384 | "@cloudflare/workerd-darwin-64": "1.20250320.0", 3385 | "@cloudflare/workerd-darwin-arm64": "1.20250320.0", 3386 | "@cloudflare/workerd-linux-64": "1.20250320.0", 3387 | "@cloudflare/workerd-linux-arm64": "1.20250320.0", 3388 | "@cloudflare/workerd-windows-64": "1.20250320.0" 3389 | } 3390 | }, 3391 | "node_modules/wrangler/node_modules/zod": { 3392 | "version": "3.22.3", 3393 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", 3394 | "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", 3395 | "dev": true, 3396 | "funding": { 3397 | "url": "https://github.com/sponsors/colinhacks" 3398 | } 3399 | }, 3400 | "node_modules/ws": { 3401 | "version": "8.18.0", 3402 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 3403 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 3404 | "dev": true, 3405 | "engines": { 3406 | "node": ">=10.0.0" 3407 | }, 3408 | "peerDependencies": { 3409 | "bufferutil": "^4.0.1", 3410 | "utf-8-validate": ">=5.0.2" 3411 | }, 3412 | "peerDependenciesMeta": { 3413 | "bufferutil": { 3414 | "optional": true 3415 | }, 3416 | "utf-8-validate": { 3417 | "optional": true 3418 | } 3419 | } 3420 | }, 3421 | "node_modules/youch": { 3422 | "version": "3.2.3", 3423 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.3.tgz", 3424 | "integrity": "sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==", 3425 | "dev": true, 3426 | "dependencies": { 3427 | "cookie": "^0.5.0", 3428 | "mustache": "^4.2.0", 3429 | "stacktracey": "^2.1.8" 3430 | } 3431 | }, 3432 | "node_modules/zod": { 3433 | "version": "3.24.2", 3434 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", 3435 | "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", 3436 | "dev": true, 3437 | "funding": { 3438 | "url": "https://github.com/sponsors/colinhacks" 3439 | } 3440 | } 3441 | } 3442 | } 3443 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xai-image-gen-refine", 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 | }, 11 | "devDependencies": { 12 | "@cloudflare/vitest-pool-workers": "^0.7.5", 13 | "vitest": "~3.0.7", 14 | "wrangler": "^4.4.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Welcome to Cloudflare Workers! This is your first worker. 3 | * 4 | * - Run `npm run dev` in your terminal to start a development server 5 | * - Open a browser tab at http://localhost:8787/ to see your worker in action 6 | * - Run `npm run deploy` to publish your worker 7 | * 8 | * Learn more at https://developers.cloudflare.com/workers/ 9 | */ 10 | 11 | /** 12 | * Cloudflare Worker to proxy xAI API requests 13 | * Specifically filters image generation requests to only include supported parameters 14 | */ 15 | 16 | // xAI API configuration 17 | const XAI_API_HOST = 'api.x.ai'; 18 | const IMAGE_GENERATION_PATH = '/v1/images/generations'; 19 | 20 | // Supported parameters for image generation based on documentation 21 | const SUPPORTED_IMAGE_PARAMS = [ 22 | 'model', 23 | 'prompt', 24 | 'n', 25 | 'response_format' 26 | ]; 27 | 28 | // Note: 'quality', 'size' and 'style' are explicitly NOT supported by xAI API at the moment 29 | 30 | export default { 31 | async fetch(request, env, ctx) { 32 | // Parse request URL 33 | const url = new URL(request.url); 34 | 35 | // Handle CORS preflight requests 36 | if (request.method === 'OPTIONS') { 37 | return handleCors(request); 38 | } 39 | 40 | try { 41 | // Only proxy requests to xAI API paths 42 | if (!url.pathname.startsWith('/v1/')) { 43 | return new Response('Not Found', { status: 404 }); 44 | } 45 | 46 | // Build the target URL for xAI API 47 | const targetUrl = new URL(`https://${XAI_API_HOST}${url.pathname}`); 48 | 49 | // Copy query parameters 50 | url.searchParams.forEach((value, key) => { 51 | targetUrl.searchParams.append(key, value); 52 | }); 53 | 54 | // Special handling for image generation requests 55 | if (url.pathname === IMAGE_GENERATION_PATH && request.method === 'POST') { 56 | return await handleImageGenerationRequest(request, targetUrl); 57 | } 58 | 59 | // For other API requests, create a new request to avoid body already consumed issue 60 | const headers = new Headers(request.headers); 61 | const newRequest = new Request(targetUrl.toString(), { 62 | method: request.method, 63 | headers, 64 | body: request.body ? request.clone().body : undefined, 65 | }); 66 | 67 | return await fetch(newRequest); 68 | 69 | } catch (error) { 70 | return new Response(`Error: ${error.message}`, { status: 500 }); 71 | } 72 | }, 73 | }; 74 | 75 | /** 76 | * Handle CORS preflight requests 77 | */ 78 | function handleCors() { 79 | return new Response(null, { 80 | headers: { 81 | 'Access-Control-Allow-Origin': '*', 82 | 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', 83 | 'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-Requested-With', 84 | 'Access-Control-Max-Age': '86400', 85 | }, 86 | }); 87 | } 88 | 89 | /** 90 | * Handle image generation requests by filtering parameters 91 | */ 92 | async function handleImageGenerationRequest(request, targetUrl) { 93 | // Parse request body 94 | const contentType = request.headers.get('Content-Type') || ''; 95 | 96 | if (contentType.includes('application/json')) { 97 | // Clone the request before consuming the body 98 | const clonedRequest = request.clone(); 99 | const originalBody = await clonedRequest.json(); 100 | 101 | // Filter out unsupported parameters 102 | const filteredBody = {}; 103 | for (const param of SUPPORTED_IMAGE_PARAMS) { 104 | if (originalBody[param] !== undefined) { 105 | filteredBody[param] = originalBody[param]; 106 | } 107 | } 108 | 109 | // Create new request with filtered parameters 110 | const newRequest = new Request(targetUrl.toString(), { 111 | method: 'POST', 112 | headers: { 113 | 'Content-Type': 'application/json', 114 | 'Authorization': request.headers.get('Authorization'), 115 | }, 116 | body: JSON.stringify(filteredBody), 117 | }); 118 | 119 | // Forward request to xAI API 120 | const response = await fetch(newRequest); 121 | 122 | // Create a new response with CORS headers 123 | const responseData = await response.clone().json(); 124 | const newResponse = new Response(JSON.stringify(responseData), { 125 | status: response.status, 126 | statusText: response.statusText, 127 | headers: { 128 | ...Object.fromEntries(response.headers), 129 | 'Access-Control-Allow-Origin': '*', 130 | 'Content-Type': 'application/json' 131 | } 132 | }); 133 | 134 | return newResponse; 135 | } else { 136 | return new Response('Unsupported Content-Type. Please use application/json', { 137 | status: 400 138 | }); 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /test/index.spec.js: -------------------------------------------------------------------------------- 1 | import { env, createExecutionContext, waitOnExecutionContext, SELF } from 'cloudflare:test'; 2 | import { describe, it, expect } from 'vitest'; 3 | import worker from '../src'; 4 | 5 | describe('Hello World worker', () => { 6 | it('responds with Hello World! (unit style)', async () => { 7 | const request = new Request('http://example.com'); 8 | // Create an empty context to pass to `worker.fetch()`. 9 | const ctx = createExecutionContext(); 10 | const response = await worker.fetch(request, env, ctx); 11 | // Wait for all `Promise`s passed to `ctx.waitUntil()` to settle before running test assertions 12 | await waitOnExecutionContext(ctx); 13 | expect(await response.text()).toMatchInlineSnapshot(`"Hello World!"`); 14 | }); 15 | 16 | it('responds with Hello World! (integration style)', async () => { 17 | const response = await SELF.fetch('http://example.com'); 18 | expect(await response.text()).toMatchInlineSnapshot(`"Hello World!"`); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /vitest.config.js: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /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": "xai-image-gen-refine", 8 | "main": "src/index.js", 9 | "compatibility_date": "2025-03-21", 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": { "MY_VARIABLE": "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 | --------------------------------------------------------------------------------