├── .editorconfig ├── .gitignore ├── .prettierrc ├── .vscode └── settings.json ├── README.md ├── package-lock.json ├── package.json ├── public ├── app.js ├── index.html ├── kontext-chat-rainbow.png ├── kontext-chat.jpg ├── kontext-chat.png └── logomarks │ ├── bfl.svg │ ├── cloudflare.svg │ ├── github.svg │ ├── replicate.svg │ └── youtube.svg ├── src └── index.ts ├── test ├── env.d.ts ├── index.spec.ts └── tsconfig.json ├── tsconfig.json ├── vitest.config.mts ├── worker-configuration.d.ts └── 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 | 174 | 175 | # may contain secrets 176 | chat.ai -------------------------------------------------------------------------------- /.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 | "djlint.showInstallError": false 6 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kontext Chat 2 | 3 | A chat app that generates images using Replicate and Cloudflare Workers. 4 | 5 | Kontext Chat is powered by [FLUX.1 Kontext Pro](https://replicate.com/black-forest-labs/flux-kontext-pro), a new image model from Black Forest Labs, running on [Replicate](https://replicate.com/black-forest-labs/flux-kontext-pro). The app is built with Hono and React and it deployed on [Cloudflare Workers](https://workers.dev/). 6 | 7 | See [kontext-chat.replicate.dev](https://kontext-chat.replicate.dev/) for a live demo. 8 | 9 | ## Local Development 10 | 11 | 1. Install dependencies: 12 | ```sh 13 | npm install 14 | ``` 15 | 16 | 1. Get a Replicate API Token: 17 | - Sign up at https://replicate.com/ and get your REPLICATE_API_TOKEN from your account settings at https://replicate.com/account/api-tokens. 18 | 19 | 1. Set up your local environment: 20 | - Create a .dev.vars file in the project root (already present in this repo) and add your token: 21 | ``` 22 | REPLICATE_API_TOKEN=your-token-here 23 | ``` 24 | 25 | 1. Start the local dev server: 26 | ```sh 27 | npm run dev 28 | ``` 29 | - The app will be available at http://localhost:8787 by default. 30 | 31 | ## Deployment to Cloudflare 32 | 33 | 1. Authenticate Wrangler: 34 | ```sh 35 | npx wrangler login 36 | ``` 37 | 38 | 1. Set your Replicate API token as a secret: 39 | ```sh 40 | npx wrangler secret put REPLICATE_API_TOKEN 41 | ``` 42 | 43 | 1. Deploy: 44 | ```sh 45 | npm run deploy 46 | ``` 47 | - Your app will be deployed to your Cloudflare Workers account. 48 | 49 | ## Notes 50 | 51 | - The frontend is served from the public/ directory. 52 | - The backend is a Cloudflare Worker (entry: src/index.ts). 53 | - The app requires a valid REPLICATE_API_TOKEN to function. 54 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kontext-chat", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "kontext-chat", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "hono": "^4.7.10", 12 | "replicate": "^1.0.1" 13 | }, 14 | "devDependencies": { 15 | "@cloudflare/vitest-pool-workers": "^0.8.19", 16 | "typescript": "^5.5.2", 17 | "vitest": "~3.0.7", 18 | "wrangler": "^4.18.0" 19 | } 20 | }, 21 | "node_modules/@cloudflare/kv-asset-handler": { 22 | "version": "0.4.0", 23 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", 24 | "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", 25 | "dev": true, 26 | "license": "MIT OR Apache-2.0", 27 | "dependencies": { 28 | "mime": "^3.0.0" 29 | }, 30 | "engines": { 31 | "node": ">=18.0.0" 32 | } 33 | }, 34 | "node_modules/@cloudflare/unenv-preset": { 35 | "version": "2.3.2", 36 | "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.3.2.tgz", 37 | "integrity": "sha512-MtUgNl+QkQyhQvv5bbWP+BpBC1N0me4CHHuP2H4ktmOMKdB/6kkz/lo+zqiA4mEazb4y+1cwyNjVrQ2DWeE4mg==", 38 | "dev": true, 39 | "license": "MIT OR Apache-2.0", 40 | "peerDependencies": { 41 | "unenv": "2.0.0-rc.17", 42 | "workerd": "^1.20250508.0" 43 | }, 44 | "peerDependenciesMeta": { 45 | "workerd": { 46 | "optional": true 47 | } 48 | } 49 | }, 50 | "node_modules/@cloudflare/vitest-pool-workers": { 51 | "version": "0.8.34", 52 | "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.8.34.tgz", 53 | "integrity": "sha512-MB+J+UAeU+a0wfrSt1DvElgBFsXYBxAf6O1H67iT/4L/zOwDhKcx2ewMikUDf8O217ag2q1yEhhwug6XQZ76nA==", 54 | "dev": true, 55 | "license": "MIT", 56 | "dependencies": { 57 | "birpc": "0.2.14", 58 | "cjs-module-lexer": "^1.2.3", 59 | "devalue": "^4.3.0", 60 | "miniflare": "4.20250525.0", 61 | "semver": "^7.7.1", 62 | "wrangler": "4.18.0", 63 | "zod": "^3.22.3" 64 | }, 65 | "peerDependencies": { 66 | "@vitest/runner": "2.0.x - 3.1.x", 67 | "@vitest/snapshot": "2.0.x - 3.1.x", 68 | "vitest": "2.0.x - 3.1.x" 69 | } 70 | }, 71 | "node_modules/@cloudflare/workerd-darwin-64": { 72 | "version": "1.20250525.0", 73 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250525.0.tgz", 74 | "integrity": "sha512-L5l+7sSJJT2+riR5rS3Q3PKNNySPjWfRIeaNGMVRi1dPO6QPi4lwuxfRUFNoeUdilZJUVPfSZvTtj9RedsKznQ==", 75 | "cpu": [ 76 | "x64" 77 | ], 78 | "dev": true, 79 | "license": "Apache-2.0", 80 | "optional": true, 81 | "os": [ 82 | "darwin" 83 | ], 84 | "engines": { 85 | "node": ">=16" 86 | } 87 | }, 88 | "node_modules/@cloudflare/workerd-darwin-arm64": { 89 | "version": "1.20250525.0", 90 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250525.0.tgz", 91 | "integrity": "sha512-Y3IbIdrF/vJWh/WBvshwcSyUh175VAiLRW7963S1dXChrZ1N5wuKGQm9xY69cIGVtitpMJWWW3jLq7J/Xxwm0Q==", 92 | "cpu": [ 93 | "arm64" 94 | ], 95 | "dev": true, 96 | "license": "Apache-2.0", 97 | "optional": true, 98 | "os": [ 99 | "darwin" 100 | ], 101 | "engines": { 102 | "node": ">=16" 103 | } 104 | }, 105 | "node_modules/@cloudflare/workerd-linux-64": { 106 | "version": "1.20250525.0", 107 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250525.0.tgz", 108 | "integrity": "sha512-KSyQPAby+c6cpENoO0ayCQlY6QIh28l/+QID7VC1SLXfiNHy+hPNsH1vVBTST6CilHVAQSsy9tCZ9O9XECB8yg==", 109 | "cpu": [ 110 | "x64" 111 | ], 112 | "dev": true, 113 | "license": "Apache-2.0", 114 | "optional": true, 115 | "os": [ 116 | "linux" 117 | ], 118 | "engines": { 119 | "node": ">=16" 120 | } 121 | }, 122 | "node_modules/@cloudflare/workerd-linux-arm64": { 123 | "version": "1.20250525.0", 124 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250525.0.tgz", 125 | "integrity": "sha512-Nt0FUxS2kQhJUea4hMCNPaetkrAFDhPnNX/ntwcqVlGgnGt75iaAhupWJbU0GB+gIWlKeuClUUnDZqKbicoKyg==", 126 | "cpu": [ 127 | "arm64" 128 | ], 129 | "dev": true, 130 | "license": "Apache-2.0", 131 | "optional": true, 132 | "os": [ 133 | "linux" 134 | ], 135 | "engines": { 136 | "node": ">=16" 137 | } 138 | }, 139 | "node_modules/@cloudflare/workerd-windows-64": { 140 | "version": "1.20250525.0", 141 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250525.0.tgz", 142 | "integrity": "sha512-mwTj+9f3uIa4NEXR1cOa82PjLa6dbrb3J+KCVJFYIaq7e63VxEzOchCXS4tublT2pmOhmFqkgBMXrxozxNkR2Q==", 143 | "cpu": [ 144 | "x64" 145 | ], 146 | "dev": true, 147 | "license": "Apache-2.0", 148 | "optional": true, 149 | "os": [ 150 | "win32" 151 | ], 152 | "engines": { 153 | "node": ">=16" 154 | } 155 | }, 156 | "node_modules/@cspotcode/source-map-support": { 157 | "version": "0.8.1", 158 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 159 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 160 | "dev": true, 161 | "license": "MIT", 162 | "dependencies": { 163 | "@jridgewell/trace-mapping": "0.3.9" 164 | }, 165 | "engines": { 166 | "node": ">=12" 167 | } 168 | }, 169 | "node_modules/@emnapi/runtime": { 170 | "version": "1.4.3", 171 | "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", 172 | "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", 173 | "dev": true, 174 | "license": "MIT", 175 | "optional": true, 176 | "dependencies": { 177 | "tslib": "^2.4.0" 178 | } 179 | }, 180 | "node_modules/@esbuild/aix-ppc64": { 181 | "version": "0.25.5", 182 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", 183 | "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", 184 | "cpu": [ 185 | "ppc64" 186 | ], 187 | "dev": true, 188 | "license": "MIT", 189 | "optional": true, 190 | "os": [ 191 | "aix" 192 | ], 193 | "engines": { 194 | "node": ">=18" 195 | } 196 | }, 197 | "node_modules/@esbuild/android-arm": { 198 | "version": "0.25.5", 199 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", 200 | "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", 201 | "cpu": [ 202 | "arm" 203 | ], 204 | "dev": true, 205 | "license": "MIT", 206 | "optional": true, 207 | "os": [ 208 | "android" 209 | ], 210 | "engines": { 211 | "node": ">=18" 212 | } 213 | }, 214 | "node_modules/@esbuild/android-arm64": { 215 | "version": "0.25.5", 216 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", 217 | "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", 218 | "cpu": [ 219 | "arm64" 220 | ], 221 | "dev": true, 222 | "license": "MIT", 223 | "optional": true, 224 | "os": [ 225 | "android" 226 | ], 227 | "engines": { 228 | "node": ">=18" 229 | } 230 | }, 231 | "node_modules/@esbuild/android-x64": { 232 | "version": "0.25.5", 233 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", 234 | "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", 235 | "cpu": [ 236 | "x64" 237 | ], 238 | "dev": true, 239 | "license": "MIT", 240 | "optional": true, 241 | "os": [ 242 | "android" 243 | ], 244 | "engines": { 245 | "node": ">=18" 246 | } 247 | }, 248 | "node_modules/@esbuild/darwin-arm64": { 249 | "version": "0.25.5", 250 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", 251 | "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", 252 | "cpu": [ 253 | "arm64" 254 | ], 255 | "dev": true, 256 | "license": "MIT", 257 | "optional": true, 258 | "os": [ 259 | "darwin" 260 | ], 261 | "engines": { 262 | "node": ">=18" 263 | } 264 | }, 265 | "node_modules/@esbuild/darwin-x64": { 266 | "version": "0.25.5", 267 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", 268 | "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", 269 | "cpu": [ 270 | "x64" 271 | ], 272 | "dev": true, 273 | "license": "MIT", 274 | "optional": true, 275 | "os": [ 276 | "darwin" 277 | ], 278 | "engines": { 279 | "node": ">=18" 280 | } 281 | }, 282 | "node_modules/@esbuild/freebsd-arm64": { 283 | "version": "0.25.5", 284 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", 285 | "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", 286 | "cpu": [ 287 | "arm64" 288 | ], 289 | "dev": true, 290 | "license": "MIT", 291 | "optional": true, 292 | "os": [ 293 | "freebsd" 294 | ], 295 | "engines": { 296 | "node": ">=18" 297 | } 298 | }, 299 | "node_modules/@esbuild/freebsd-x64": { 300 | "version": "0.25.5", 301 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", 302 | "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", 303 | "cpu": [ 304 | "x64" 305 | ], 306 | "dev": true, 307 | "license": "MIT", 308 | "optional": true, 309 | "os": [ 310 | "freebsd" 311 | ], 312 | "engines": { 313 | "node": ">=18" 314 | } 315 | }, 316 | "node_modules/@esbuild/linux-arm": { 317 | "version": "0.25.5", 318 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", 319 | "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", 320 | "cpu": [ 321 | "arm" 322 | ], 323 | "dev": true, 324 | "license": "MIT", 325 | "optional": true, 326 | "os": [ 327 | "linux" 328 | ], 329 | "engines": { 330 | "node": ">=18" 331 | } 332 | }, 333 | "node_modules/@esbuild/linux-arm64": { 334 | "version": "0.25.5", 335 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", 336 | "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", 337 | "cpu": [ 338 | "arm64" 339 | ], 340 | "dev": true, 341 | "license": "MIT", 342 | "optional": true, 343 | "os": [ 344 | "linux" 345 | ], 346 | "engines": { 347 | "node": ">=18" 348 | } 349 | }, 350 | "node_modules/@esbuild/linux-ia32": { 351 | "version": "0.25.5", 352 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", 353 | "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", 354 | "cpu": [ 355 | "ia32" 356 | ], 357 | "dev": true, 358 | "license": "MIT", 359 | "optional": true, 360 | "os": [ 361 | "linux" 362 | ], 363 | "engines": { 364 | "node": ">=18" 365 | } 366 | }, 367 | "node_modules/@esbuild/linux-loong64": { 368 | "version": "0.25.5", 369 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", 370 | "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", 371 | "cpu": [ 372 | "loong64" 373 | ], 374 | "dev": true, 375 | "license": "MIT", 376 | "optional": true, 377 | "os": [ 378 | "linux" 379 | ], 380 | "engines": { 381 | "node": ">=18" 382 | } 383 | }, 384 | "node_modules/@esbuild/linux-mips64el": { 385 | "version": "0.25.5", 386 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", 387 | "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", 388 | "cpu": [ 389 | "mips64el" 390 | ], 391 | "dev": true, 392 | "license": "MIT", 393 | "optional": true, 394 | "os": [ 395 | "linux" 396 | ], 397 | "engines": { 398 | "node": ">=18" 399 | } 400 | }, 401 | "node_modules/@esbuild/linux-ppc64": { 402 | "version": "0.25.5", 403 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", 404 | "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", 405 | "cpu": [ 406 | "ppc64" 407 | ], 408 | "dev": true, 409 | "license": "MIT", 410 | "optional": true, 411 | "os": [ 412 | "linux" 413 | ], 414 | "engines": { 415 | "node": ">=18" 416 | } 417 | }, 418 | "node_modules/@esbuild/linux-riscv64": { 419 | "version": "0.25.5", 420 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", 421 | "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", 422 | "cpu": [ 423 | "riscv64" 424 | ], 425 | "dev": true, 426 | "license": "MIT", 427 | "optional": true, 428 | "os": [ 429 | "linux" 430 | ], 431 | "engines": { 432 | "node": ">=18" 433 | } 434 | }, 435 | "node_modules/@esbuild/linux-s390x": { 436 | "version": "0.25.5", 437 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", 438 | "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", 439 | "cpu": [ 440 | "s390x" 441 | ], 442 | "dev": true, 443 | "license": "MIT", 444 | "optional": true, 445 | "os": [ 446 | "linux" 447 | ], 448 | "engines": { 449 | "node": ">=18" 450 | } 451 | }, 452 | "node_modules/@esbuild/linux-x64": { 453 | "version": "0.25.5", 454 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", 455 | "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", 456 | "cpu": [ 457 | "x64" 458 | ], 459 | "dev": true, 460 | "license": "MIT", 461 | "optional": true, 462 | "os": [ 463 | "linux" 464 | ], 465 | "engines": { 466 | "node": ">=18" 467 | } 468 | }, 469 | "node_modules/@esbuild/netbsd-arm64": { 470 | "version": "0.25.5", 471 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", 472 | "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", 473 | "cpu": [ 474 | "arm64" 475 | ], 476 | "dev": true, 477 | "license": "MIT", 478 | "optional": true, 479 | "os": [ 480 | "netbsd" 481 | ], 482 | "engines": { 483 | "node": ">=18" 484 | } 485 | }, 486 | "node_modules/@esbuild/netbsd-x64": { 487 | "version": "0.25.5", 488 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", 489 | "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", 490 | "cpu": [ 491 | "x64" 492 | ], 493 | "dev": true, 494 | "license": "MIT", 495 | "optional": true, 496 | "os": [ 497 | "netbsd" 498 | ], 499 | "engines": { 500 | "node": ">=18" 501 | } 502 | }, 503 | "node_modules/@esbuild/openbsd-arm64": { 504 | "version": "0.25.5", 505 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", 506 | "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", 507 | "cpu": [ 508 | "arm64" 509 | ], 510 | "dev": true, 511 | "license": "MIT", 512 | "optional": true, 513 | "os": [ 514 | "openbsd" 515 | ], 516 | "engines": { 517 | "node": ">=18" 518 | } 519 | }, 520 | "node_modules/@esbuild/openbsd-x64": { 521 | "version": "0.25.5", 522 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", 523 | "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", 524 | "cpu": [ 525 | "x64" 526 | ], 527 | "dev": true, 528 | "license": "MIT", 529 | "optional": true, 530 | "os": [ 531 | "openbsd" 532 | ], 533 | "engines": { 534 | "node": ">=18" 535 | } 536 | }, 537 | "node_modules/@esbuild/sunos-x64": { 538 | "version": "0.25.5", 539 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", 540 | "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", 541 | "cpu": [ 542 | "x64" 543 | ], 544 | "dev": true, 545 | "license": "MIT", 546 | "optional": true, 547 | "os": [ 548 | "sunos" 549 | ], 550 | "engines": { 551 | "node": ">=18" 552 | } 553 | }, 554 | "node_modules/@esbuild/win32-arm64": { 555 | "version": "0.25.5", 556 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", 557 | "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", 558 | "cpu": [ 559 | "arm64" 560 | ], 561 | "dev": true, 562 | "license": "MIT", 563 | "optional": true, 564 | "os": [ 565 | "win32" 566 | ], 567 | "engines": { 568 | "node": ">=18" 569 | } 570 | }, 571 | "node_modules/@esbuild/win32-ia32": { 572 | "version": "0.25.5", 573 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", 574 | "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", 575 | "cpu": [ 576 | "ia32" 577 | ], 578 | "dev": true, 579 | "license": "MIT", 580 | "optional": true, 581 | "os": [ 582 | "win32" 583 | ], 584 | "engines": { 585 | "node": ">=18" 586 | } 587 | }, 588 | "node_modules/@esbuild/win32-x64": { 589 | "version": "0.25.5", 590 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", 591 | "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", 592 | "cpu": [ 593 | "x64" 594 | ], 595 | "dev": true, 596 | "license": "MIT", 597 | "optional": true, 598 | "os": [ 599 | "win32" 600 | ], 601 | "engines": { 602 | "node": ">=18" 603 | } 604 | }, 605 | "node_modules/@fastify/busboy": { 606 | "version": "2.1.1", 607 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 608 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 609 | "dev": true, 610 | "license": "MIT", 611 | "engines": { 612 | "node": ">=14" 613 | } 614 | }, 615 | "node_modules/@img/sharp-darwin-arm64": { 616 | "version": "0.33.5", 617 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", 618 | "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", 619 | "cpu": [ 620 | "arm64" 621 | ], 622 | "dev": true, 623 | "license": "Apache-2.0", 624 | "optional": true, 625 | "os": [ 626 | "darwin" 627 | ], 628 | "engines": { 629 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 630 | }, 631 | "funding": { 632 | "url": "https://opencollective.com/libvips" 633 | }, 634 | "optionalDependencies": { 635 | "@img/sharp-libvips-darwin-arm64": "1.0.4" 636 | } 637 | }, 638 | "node_modules/@img/sharp-darwin-x64": { 639 | "version": "0.33.5", 640 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", 641 | "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", 642 | "cpu": [ 643 | "x64" 644 | ], 645 | "dev": true, 646 | "license": "Apache-2.0", 647 | "optional": true, 648 | "os": [ 649 | "darwin" 650 | ], 651 | "engines": { 652 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 653 | }, 654 | "funding": { 655 | "url": "https://opencollective.com/libvips" 656 | }, 657 | "optionalDependencies": { 658 | "@img/sharp-libvips-darwin-x64": "1.0.4" 659 | } 660 | }, 661 | "node_modules/@img/sharp-libvips-darwin-arm64": { 662 | "version": "1.0.4", 663 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", 664 | "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", 665 | "cpu": [ 666 | "arm64" 667 | ], 668 | "dev": true, 669 | "license": "LGPL-3.0-or-later", 670 | "optional": true, 671 | "os": [ 672 | "darwin" 673 | ], 674 | "funding": { 675 | "url": "https://opencollective.com/libvips" 676 | } 677 | }, 678 | "node_modules/@img/sharp-libvips-darwin-x64": { 679 | "version": "1.0.4", 680 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", 681 | "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", 682 | "cpu": [ 683 | "x64" 684 | ], 685 | "dev": true, 686 | "license": "LGPL-3.0-or-later", 687 | "optional": true, 688 | "os": [ 689 | "darwin" 690 | ], 691 | "funding": { 692 | "url": "https://opencollective.com/libvips" 693 | } 694 | }, 695 | "node_modules/@img/sharp-libvips-linux-arm": { 696 | "version": "1.0.5", 697 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", 698 | "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", 699 | "cpu": [ 700 | "arm" 701 | ], 702 | "dev": true, 703 | "license": "LGPL-3.0-or-later", 704 | "optional": true, 705 | "os": [ 706 | "linux" 707 | ], 708 | "funding": { 709 | "url": "https://opencollective.com/libvips" 710 | } 711 | }, 712 | "node_modules/@img/sharp-libvips-linux-arm64": { 713 | "version": "1.0.4", 714 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", 715 | "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", 716 | "cpu": [ 717 | "arm64" 718 | ], 719 | "dev": true, 720 | "license": "LGPL-3.0-or-later", 721 | "optional": true, 722 | "os": [ 723 | "linux" 724 | ], 725 | "funding": { 726 | "url": "https://opencollective.com/libvips" 727 | } 728 | }, 729 | "node_modules/@img/sharp-libvips-linux-s390x": { 730 | "version": "1.0.4", 731 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", 732 | "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", 733 | "cpu": [ 734 | "s390x" 735 | ], 736 | "dev": true, 737 | "license": "LGPL-3.0-or-later", 738 | "optional": true, 739 | "os": [ 740 | "linux" 741 | ], 742 | "funding": { 743 | "url": "https://opencollective.com/libvips" 744 | } 745 | }, 746 | "node_modules/@img/sharp-libvips-linux-x64": { 747 | "version": "1.0.4", 748 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", 749 | "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", 750 | "cpu": [ 751 | "x64" 752 | ], 753 | "dev": true, 754 | "license": "LGPL-3.0-or-later", 755 | "optional": true, 756 | "os": [ 757 | "linux" 758 | ], 759 | "funding": { 760 | "url": "https://opencollective.com/libvips" 761 | } 762 | }, 763 | "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 764 | "version": "1.0.4", 765 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", 766 | "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", 767 | "cpu": [ 768 | "arm64" 769 | ], 770 | "dev": true, 771 | "license": "LGPL-3.0-or-later", 772 | "optional": true, 773 | "os": [ 774 | "linux" 775 | ], 776 | "funding": { 777 | "url": "https://opencollective.com/libvips" 778 | } 779 | }, 780 | "node_modules/@img/sharp-libvips-linuxmusl-x64": { 781 | "version": "1.0.4", 782 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", 783 | "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", 784 | "cpu": [ 785 | "x64" 786 | ], 787 | "dev": true, 788 | "license": "LGPL-3.0-or-later", 789 | "optional": true, 790 | "os": [ 791 | "linux" 792 | ], 793 | "funding": { 794 | "url": "https://opencollective.com/libvips" 795 | } 796 | }, 797 | "node_modules/@img/sharp-linux-arm": { 798 | "version": "0.33.5", 799 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", 800 | "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", 801 | "cpu": [ 802 | "arm" 803 | ], 804 | "dev": true, 805 | "license": "Apache-2.0", 806 | "optional": true, 807 | "os": [ 808 | "linux" 809 | ], 810 | "engines": { 811 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 812 | }, 813 | "funding": { 814 | "url": "https://opencollective.com/libvips" 815 | }, 816 | "optionalDependencies": { 817 | "@img/sharp-libvips-linux-arm": "1.0.5" 818 | } 819 | }, 820 | "node_modules/@img/sharp-linux-arm64": { 821 | "version": "0.33.5", 822 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", 823 | "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", 824 | "cpu": [ 825 | "arm64" 826 | ], 827 | "dev": true, 828 | "license": "Apache-2.0", 829 | "optional": true, 830 | "os": [ 831 | "linux" 832 | ], 833 | "engines": { 834 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 835 | }, 836 | "funding": { 837 | "url": "https://opencollective.com/libvips" 838 | }, 839 | "optionalDependencies": { 840 | "@img/sharp-libvips-linux-arm64": "1.0.4" 841 | } 842 | }, 843 | "node_modules/@img/sharp-linux-s390x": { 844 | "version": "0.33.5", 845 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", 846 | "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", 847 | "cpu": [ 848 | "s390x" 849 | ], 850 | "dev": true, 851 | "license": "Apache-2.0", 852 | "optional": true, 853 | "os": [ 854 | "linux" 855 | ], 856 | "engines": { 857 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 858 | }, 859 | "funding": { 860 | "url": "https://opencollective.com/libvips" 861 | }, 862 | "optionalDependencies": { 863 | "@img/sharp-libvips-linux-s390x": "1.0.4" 864 | } 865 | }, 866 | "node_modules/@img/sharp-linux-x64": { 867 | "version": "0.33.5", 868 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", 869 | "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", 870 | "cpu": [ 871 | "x64" 872 | ], 873 | "dev": true, 874 | "license": "Apache-2.0", 875 | "optional": true, 876 | "os": [ 877 | "linux" 878 | ], 879 | "engines": { 880 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 881 | }, 882 | "funding": { 883 | "url": "https://opencollective.com/libvips" 884 | }, 885 | "optionalDependencies": { 886 | "@img/sharp-libvips-linux-x64": "1.0.4" 887 | } 888 | }, 889 | "node_modules/@img/sharp-linuxmusl-arm64": { 890 | "version": "0.33.5", 891 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", 892 | "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", 893 | "cpu": [ 894 | "arm64" 895 | ], 896 | "dev": true, 897 | "license": "Apache-2.0", 898 | "optional": true, 899 | "os": [ 900 | "linux" 901 | ], 902 | "engines": { 903 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 904 | }, 905 | "funding": { 906 | "url": "https://opencollective.com/libvips" 907 | }, 908 | "optionalDependencies": { 909 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" 910 | } 911 | }, 912 | "node_modules/@img/sharp-linuxmusl-x64": { 913 | "version": "0.33.5", 914 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", 915 | "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", 916 | "cpu": [ 917 | "x64" 918 | ], 919 | "dev": true, 920 | "license": "Apache-2.0", 921 | "optional": true, 922 | "os": [ 923 | "linux" 924 | ], 925 | "engines": { 926 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 927 | }, 928 | "funding": { 929 | "url": "https://opencollective.com/libvips" 930 | }, 931 | "optionalDependencies": { 932 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4" 933 | } 934 | }, 935 | "node_modules/@img/sharp-wasm32": { 936 | "version": "0.33.5", 937 | "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", 938 | "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", 939 | "cpu": [ 940 | "wasm32" 941 | ], 942 | "dev": true, 943 | "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", 944 | "optional": true, 945 | "dependencies": { 946 | "@emnapi/runtime": "^1.2.0" 947 | }, 948 | "engines": { 949 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 950 | }, 951 | "funding": { 952 | "url": "https://opencollective.com/libvips" 953 | } 954 | }, 955 | "node_modules/@img/sharp-win32-ia32": { 956 | "version": "0.33.5", 957 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", 958 | "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", 959 | "cpu": [ 960 | "ia32" 961 | ], 962 | "dev": true, 963 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 964 | "optional": true, 965 | "os": [ 966 | "win32" 967 | ], 968 | "engines": { 969 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 970 | }, 971 | "funding": { 972 | "url": "https://opencollective.com/libvips" 973 | } 974 | }, 975 | "node_modules/@img/sharp-win32-x64": { 976 | "version": "0.33.5", 977 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", 978 | "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", 979 | "cpu": [ 980 | "x64" 981 | ], 982 | "dev": true, 983 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 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 | "license": "MIT", 1001 | "engines": { 1002 | "node": ">=6.0.0" 1003 | } 1004 | }, 1005 | "node_modules/@jridgewell/sourcemap-codec": { 1006 | "version": "1.5.0", 1007 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1008 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1009 | "dev": true, 1010 | "license": "MIT" 1011 | }, 1012 | "node_modules/@jridgewell/trace-mapping": { 1013 | "version": "0.3.9", 1014 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1015 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1016 | "dev": true, 1017 | "license": "MIT", 1018 | "dependencies": { 1019 | "@jridgewell/resolve-uri": "^3.0.3", 1020 | "@jridgewell/sourcemap-codec": "^1.4.10" 1021 | } 1022 | }, 1023 | "node_modules/@rollup/rollup-android-arm-eabi": { 1024 | "version": "4.41.1", 1025 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", 1026 | "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", 1027 | "cpu": [ 1028 | "arm" 1029 | ], 1030 | "dev": true, 1031 | "license": "MIT", 1032 | "optional": true, 1033 | "os": [ 1034 | "android" 1035 | ] 1036 | }, 1037 | "node_modules/@rollup/rollup-android-arm64": { 1038 | "version": "4.41.1", 1039 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", 1040 | "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", 1041 | "cpu": [ 1042 | "arm64" 1043 | ], 1044 | "dev": true, 1045 | "license": "MIT", 1046 | "optional": true, 1047 | "os": [ 1048 | "android" 1049 | ] 1050 | }, 1051 | "node_modules/@rollup/rollup-darwin-arm64": { 1052 | "version": "4.41.1", 1053 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", 1054 | "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", 1055 | "cpu": [ 1056 | "arm64" 1057 | ], 1058 | "dev": true, 1059 | "license": "MIT", 1060 | "optional": true, 1061 | "os": [ 1062 | "darwin" 1063 | ] 1064 | }, 1065 | "node_modules/@rollup/rollup-darwin-x64": { 1066 | "version": "4.41.1", 1067 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", 1068 | "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", 1069 | "cpu": [ 1070 | "x64" 1071 | ], 1072 | "dev": true, 1073 | "license": "MIT", 1074 | "optional": true, 1075 | "os": [ 1076 | "darwin" 1077 | ] 1078 | }, 1079 | "node_modules/@rollup/rollup-freebsd-arm64": { 1080 | "version": "4.41.1", 1081 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", 1082 | "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", 1083 | "cpu": [ 1084 | "arm64" 1085 | ], 1086 | "dev": true, 1087 | "license": "MIT", 1088 | "optional": true, 1089 | "os": [ 1090 | "freebsd" 1091 | ] 1092 | }, 1093 | "node_modules/@rollup/rollup-freebsd-x64": { 1094 | "version": "4.41.1", 1095 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", 1096 | "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", 1097 | "cpu": [ 1098 | "x64" 1099 | ], 1100 | "dev": true, 1101 | "license": "MIT", 1102 | "optional": true, 1103 | "os": [ 1104 | "freebsd" 1105 | ] 1106 | }, 1107 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1108 | "version": "4.41.1", 1109 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", 1110 | "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", 1111 | "cpu": [ 1112 | "arm" 1113 | ], 1114 | "dev": true, 1115 | "license": "MIT", 1116 | "optional": true, 1117 | "os": [ 1118 | "linux" 1119 | ] 1120 | }, 1121 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1122 | "version": "4.41.1", 1123 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", 1124 | "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", 1125 | "cpu": [ 1126 | "arm" 1127 | ], 1128 | "dev": true, 1129 | "license": "MIT", 1130 | "optional": true, 1131 | "os": [ 1132 | "linux" 1133 | ] 1134 | }, 1135 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 1136 | "version": "4.41.1", 1137 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", 1138 | "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", 1139 | "cpu": [ 1140 | "arm64" 1141 | ], 1142 | "dev": true, 1143 | "license": "MIT", 1144 | "optional": true, 1145 | "os": [ 1146 | "linux" 1147 | ] 1148 | }, 1149 | "node_modules/@rollup/rollup-linux-arm64-musl": { 1150 | "version": "4.41.1", 1151 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", 1152 | "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", 1153 | "cpu": [ 1154 | "arm64" 1155 | ], 1156 | "dev": true, 1157 | "license": "MIT", 1158 | "optional": true, 1159 | "os": [ 1160 | "linux" 1161 | ] 1162 | }, 1163 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1164 | "version": "4.41.1", 1165 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", 1166 | "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", 1167 | "cpu": [ 1168 | "loong64" 1169 | ], 1170 | "dev": true, 1171 | "license": "MIT", 1172 | "optional": true, 1173 | "os": [ 1174 | "linux" 1175 | ] 1176 | }, 1177 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1178 | "version": "4.41.1", 1179 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", 1180 | "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", 1181 | "cpu": [ 1182 | "ppc64" 1183 | ], 1184 | "dev": true, 1185 | "license": "MIT", 1186 | "optional": true, 1187 | "os": [ 1188 | "linux" 1189 | ] 1190 | }, 1191 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1192 | "version": "4.41.1", 1193 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", 1194 | "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", 1195 | "cpu": [ 1196 | "riscv64" 1197 | ], 1198 | "dev": true, 1199 | "license": "MIT", 1200 | "optional": true, 1201 | "os": [ 1202 | "linux" 1203 | ] 1204 | }, 1205 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 1206 | "version": "4.41.1", 1207 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", 1208 | "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", 1209 | "cpu": [ 1210 | "riscv64" 1211 | ], 1212 | "dev": true, 1213 | "license": "MIT", 1214 | "optional": true, 1215 | "os": [ 1216 | "linux" 1217 | ] 1218 | }, 1219 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1220 | "version": "4.41.1", 1221 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", 1222 | "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", 1223 | "cpu": [ 1224 | "s390x" 1225 | ], 1226 | "dev": true, 1227 | "license": "MIT", 1228 | "optional": true, 1229 | "os": [ 1230 | "linux" 1231 | ] 1232 | }, 1233 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1234 | "version": "4.41.1", 1235 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", 1236 | "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", 1237 | "cpu": [ 1238 | "x64" 1239 | ], 1240 | "dev": true, 1241 | "license": "MIT", 1242 | "optional": true, 1243 | "os": [ 1244 | "linux" 1245 | ] 1246 | }, 1247 | "node_modules/@rollup/rollup-linux-x64-musl": { 1248 | "version": "4.41.1", 1249 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", 1250 | "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", 1251 | "cpu": [ 1252 | "x64" 1253 | ], 1254 | "dev": true, 1255 | "license": "MIT", 1256 | "optional": true, 1257 | "os": [ 1258 | "linux" 1259 | ] 1260 | }, 1261 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1262 | "version": "4.41.1", 1263 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", 1264 | "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", 1265 | "cpu": [ 1266 | "arm64" 1267 | ], 1268 | "dev": true, 1269 | "license": "MIT", 1270 | "optional": true, 1271 | "os": [ 1272 | "win32" 1273 | ] 1274 | }, 1275 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1276 | "version": "4.41.1", 1277 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", 1278 | "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", 1279 | "cpu": [ 1280 | "ia32" 1281 | ], 1282 | "dev": true, 1283 | "license": "MIT", 1284 | "optional": true, 1285 | "os": [ 1286 | "win32" 1287 | ] 1288 | }, 1289 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1290 | "version": "4.41.1", 1291 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", 1292 | "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", 1293 | "cpu": [ 1294 | "x64" 1295 | ], 1296 | "dev": true, 1297 | "license": "MIT", 1298 | "optional": true, 1299 | "os": [ 1300 | "win32" 1301 | ] 1302 | }, 1303 | "node_modules/@types/estree": { 1304 | "version": "1.0.7", 1305 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 1306 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 1307 | "dev": true, 1308 | "license": "MIT" 1309 | }, 1310 | "node_modules/@vitest/expect": { 1311 | "version": "3.0.9", 1312 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", 1313 | "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", 1314 | "dev": true, 1315 | "license": "MIT", 1316 | "dependencies": { 1317 | "@vitest/spy": "3.0.9", 1318 | "@vitest/utils": "3.0.9", 1319 | "chai": "^5.2.0", 1320 | "tinyrainbow": "^2.0.0" 1321 | }, 1322 | "funding": { 1323 | "url": "https://opencollective.com/vitest" 1324 | } 1325 | }, 1326 | "node_modules/@vitest/mocker": { 1327 | "version": "3.0.9", 1328 | "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", 1329 | "integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", 1330 | "dev": true, 1331 | "license": "MIT", 1332 | "dependencies": { 1333 | "@vitest/spy": "3.0.9", 1334 | "estree-walker": "^3.0.3", 1335 | "magic-string": "^0.30.17" 1336 | }, 1337 | "funding": { 1338 | "url": "https://opencollective.com/vitest" 1339 | }, 1340 | "peerDependencies": { 1341 | "msw": "^2.4.9", 1342 | "vite": "^5.0.0 || ^6.0.0" 1343 | }, 1344 | "peerDependenciesMeta": { 1345 | "msw": { 1346 | "optional": true 1347 | }, 1348 | "vite": { 1349 | "optional": true 1350 | } 1351 | } 1352 | }, 1353 | "node_modules/@vitest/pretty-format": { 1354 | "version": "3.1.4", 1355 | "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.4.tgz", 1356 | "integrity": "sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==", 1357 | "dev": true, 1358 | "license": "MIT", 1359 | "dependencies": { 1360 | "tinyrainbow": "^2.0.0" 1361 | }, 1362 | "funding": { 1363 | "url": "https://opencollective.com/vitest" 1364 | } 1365 | }, 1366 | "node_modules/@vitest/runner": { 1367 | "version": "3.0.9", 1368 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", 1369 | "integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", 1370 | "dev": true, 1371 | "license": "MIT", 1372 | "dependencies": { 1373 | "@vitest/utils": "3.0.9", 1374 | "pathe": "^2.0.3" 1375 | }, 1376 | "funding": { 1377 | "url": "https://opencollective.com/vitest" 1378 | } 1379 | }, 1380 | "node_modules/@vitest/snapshot": { 1381 | "version": "3.0.9", 1382 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", 1383 | "integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", 1384 | "dev": true, 1385 | "license": "MIT", 1386 | "dependencies": { 1387 | "@vitest/pretty-format": "3.0.9", 1388 | "magic-string": "^0.30.17", 1389 | "pathe": "^2.0.3" 1390 | }, 1391 | "funding": { 1392 | "url": "https://opencollective.com/vitest" 1393 | } 1394 | }, 1395 | "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { 1396 | "version": "3.0.9", 1397 | "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", 1398 | "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", 1399 | "dev": true, 1400 | "license": "MIT", 1401 | "dependencies": { 1402 | "tinyrainbow": "^2.0.0" 1403 | }, 1404 | "funding": { 1405 | "url": "https://opencollective.com/vitest" 1406 | } 1407 | }, 1408 | "node_modules/@vitest/spy": { 1409 | "version": "3.0.9", 1410 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", 1411 | "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", 1412 | "dev": true, 1413 | "license": "MIT", 1414 | "dependencies": { 1415 | "tinyspy": "^3.0.2" 1416 | }, 1417 | "funding": { 1418 | "url": "https://opencollective.com/vitest" 1419 | } 1420 | }, 1421 | "node_modules/@vitest/utils": { 1422 | "version": "3.0.9", 1423 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", 1424 | "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", 1425 | "dev": true, 1426 | "license": "MIT", 1427 | "dependencies": { 1428 | "@vitest/pretty-format": "3.0.9", 1429 | "loupe": "^3.1.3", 1430 | "tinyrainbow": "^2.0.0" 1431 | }, 1432 | "funding": { 1433 | "url": "https://opencollective.com/vitest" 1434 | } 1435 | }, 1436 | "node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { 1437 | "version": "3.0.9", 1438 | "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", 1439 | "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", 1440 | "dev": true, 1441 | "license": "MIT", 1442 | "dependencies": { 1443 | "tinyrainbow": "^2.0.0" 1444 | }, 1445 | "funding": { 1446 | "url": "https://opencollective.com/vitest" 1447 | } 1448 | }, 1449 | "node_modules/abort-controller": { 1450 | "version": "3.0.0", 1451 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 1452 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 1453 | "license": "MIT", 1454 | "optional": true, 1455 | "dependencies": { 1456 | "event-target-shim": "^5.0.0" 1457 | }, 1458 | "engines": { 1459 | "node": ">=6.5" 1460 | } 1461 | }, 1462 | "node_modules/acorn": { 1463 | "version": "8.14.0", 1464 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1465 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1466 | "dev": true, 1467 | "license": "MIT", 1468 | "bin": { 1469 | "acorn": "bin/acorn" 1470 | }, 1471 | "engines": { 1472 | "node": ">=0.4.0" 1473 | } 1474 | }, 1475 | "node_modules/acorn-walk": { 1476 | "version": "8.3.2", 1477 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 1478 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 1479 | "dev": true, 1480 | "license": "MIT", 1481 | "engines": { 1482 | "node": ">=0.4.0" 1483 | } 1484 | }, 1485 | "node_modules/as-table": { 1486 | "version": "1.0.55", 1487 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 1488 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 1489 | "dev": true, 1490 | "license": "MIT", 1491 | "dependencies": { 1492 | "printable-characters": "^1.0.42" 1493 | } 1494 | }, 1495 | "node_modules/assertion-error": { 1496 | "version": "2.0.1", 1497 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 1498 | "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 1499 | "dev": true, 1500 | "license": "MIT", 1501 | "engines": { 1502 | "node": ">=12" 1503 | } 1504 | }, 1505 | "node_modules/base64-js": { 1506 | "version": "1.5.1", 1507 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1508 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1509 | "funding": [ 1510 | { 1511 | "type": "github", 1512 | "url": "https://github.com/sponsors/feross" 1513 | }, 1514 | { 1515 | "type": "patreon", 1516 | "url": "https://www.patreon.com/feross" 1517 | }, 1518 | { 1519 | "type": "consulting", 1520 | "url": "https://feross.org/support" 1521 | } 1522 | ], 1523 | "license": "MIT", 1524 | "optional": true 1525 | }, 1526 | "node_modules/birpc": { 1527 | "version": "0.2.14", 1528 | "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.14.tgz", 1529 | "integrity": "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==", 1530 | "dev": true, 1531 | "license": "MIT", 1532 | "funding": { 1533 | "url": "https://github.com/sponsors/antfu" 1534 | } 1535 | }, 1536 | "node_modules/blake3-wasm": { 1537 | "version": "2.1.5", 1538 | "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", 1539 | "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", 1540 | "dev": true, 1541 | "license": "MIT" 1542 | }, 1543 | "node_modules/buffer": { 1544 | "version": "6.0.3", 1545 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 1546 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 1547 | "funding": [ 1548 | { 1549 | "type": "github", 1550 | "url": "https://github.com/sponsors/feross" 1551 | }, 1552 | { 1553 | "type": "patreon", 1554 | "url": "https://www.patreon.com/feross" 1555 | }, 1556 | { 1557 | "type": "consulting", 1558 | "url": "https://feross.org/support" 1559 | } 1560 | ], 1561 | "license": "MIT", 1562 | "optional": true, 1563 | "dependencies": { 1564 | "base64-js": "^1.3.1", 1565 | "ieee754": "^1.2.1" 1566 | } 1567 | }, 1568 | "node_modules/cac": { 1569 | "version": "6.7.14", 1570 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1571 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1572 | "dev": true, 1573 | "license": "MIT", 1574 | "engines": { 1575 | "node": ">=8" 1576 | } 1577 | }, 1578 | "node_modules/chai": { 1579 | "version": "5.2.0", 1580 | "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", 1581 | "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", 1582 | "dev": true, 1583 | "license": "MIT", 1584 | "dependencies": { 1585 | "assertion-error": "^2.0.1", 1586 | "check-error": "^2.1.1", 1587 | "deep-eql": "^5.0.1", 1588 | "loupe": "^3.1.0", 1589 | "pathval": "^2.0.0" 1590 | }, 1591 | "engines": { 1592 | "node": ">=12" 1593 | } 1594 | }, 1595 | "node_modules/check-error": { 1596 | "version": "2.1.1", 1597 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 1598 | "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 1599 | "dev": true, 1600 | "license": "MIT", 1601 | "engines": { 1602 | "node": ">= 16" 1603 | } 1604 | }, 1605 | "node_modules/cjs-module-lexer": { 1606 | "version": "1.4.3", 1607 | "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", 1608 | "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", 1609 | "dev": true, 1610 | "license": "MIT" 1611 | }, 1612 | "node_modules/color": { 1613 | "version": "4.2.3", 1614 | "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 1615 | "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 1616 | "dev": true, 1617 | "license": "MIT", 1618 | "dependencies": { 1619 | "color-convert": "^2.0.1", 1620 | "color-string": "^1.9.0" 1621 | }, 1622 | "engines": { 1623 | "node": ">=12.5.0" 1624 | } 1625 | }, 1626 | "node_modules/color-convert": { 1627 | "version": "2.0.1", 1628 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1629 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1630 | "dev": true, 1631 | "license": "MIT", 1632 | "dependencies": { 1633 | "color-name": "~1.1.4" 1634 | }, 1635 | "engines": { 1636 | "node": ">=7.0.0" 1637 | } 1638 | }, 1639 | "node_modules/color-name": { 1640 | "version": "1.1.4", 1641 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1642 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1643 | "dev": true, 1644 | "license": "MIT" 1645 | }, 1646 | "node_modules/color-string": { 1647 | "version": "1.9.1", 1648 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 1649 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 1650 | "dev": true, 1651 | "license": "MIT", 1652 | "dependencies": { 1653 | "color-name": "^1.0.0", 1654 | "simple-swizzle": "^0.2.2" 1655 | } 1656 | }, 1657 | "node_modules/cookie": { 1658 | "version": "0.7.2", 1659 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 1660 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 1661 | "dev": true, 1662 | "license": "MIT", 1663 | "engines": { 1664 | "node": ">= 0.6" 1665 | } 1666 | }, 1667 | "node_modules/data-uri-to-buffer": { 1668 | "version": "2.0.2", 1669 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 1670 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 1671 | "dev": true, 1672 | "license": "MIT" 1673 | }, 1674 | "node_modules/debug": { 1675 | "version": "4.4.1", 1676 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 1677 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 1678 | "dev": true, 1679 | "license": "MIT", 1680 | "dependencies": { 1681 | "ms": "^2.1.3" 1682 | }, 1683 | "engines": { 1684 | "node": ">=6.0" 1685 | }, 1686 | "peerDependenciesMeta": { 1687 | "supports-color": { 1688 | "optional": true 1689 | } 1690 | } 1691 | }, 1692 | "node_modules/deep-eql": { 1693 | "version": "5.0.2", 1694 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 1695 | "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 1696 | "dev": true, 1697 | "license": "MIT", 1698 | "engines": { 1699 | "node": ">=6" 1700 | } 1701 | }, 1702 | "node_modules/defu": { 1703 | "version": "6.1.4", 1704 | "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 1705 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 1706 | "dev": true, 1707 | "license": "MIT" 1708 | }, 1709 | "node_modules/detect-libc": { 1710 | "version": "2.0.4", 1711 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", 1712 | "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", 1713 | "dev": true, 1714 | "license": "Apache-2.0", 1715 | "engines": { 1716 | "node": ">=8" 1717 | } 1718 | }, 1719 | "node_modules/devalue": { 1720 | "version": "4.3.3", 1721 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.3.tgz", 1722 | "integrity": "sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==", 1723 | "dev": true, 1724 | "license": "MIT" 1725 | }, 1726 | "node_modules/es-module-lexer": { 1727 | "version": "1.7.0", 1728 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", 1729 | "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", 1730 | "dev": true, 1731 | "license": "MIT" 1732 | }, 1733 | "node_modules/esbuild": { 1734 | "version": "0.25.5", 1735 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", 1736 | "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", 1737 | "dev": true, 1738 | "hasInstallScript": true, 1739 | "license": "MIT", 1740 | "bin": { 1741 | "esbuild": "bin/esbuild" 1742 | }, 1743 | "engines": { 1744 | "node": ">=18" 1745 | }, 1746 | "optionalDependencies": { 1747 | "@esbuild/aix-ppc64": "0.25.5", 1748 | "@esbuild/android-arm": "0.25.5", 1749 | "@esbuild/android-arm64": "0.25.5", 1750 | "@esbuild/android-x64": "0.25.5", 1751 | "@esbuild/darwin-arm64": "0.25.5", 1752 | "@esbuild/darwin-x64": "0.25.5", 1753 | "@esbuild/freebsd-arm64": "0.25.5", 1754 | "@esbuild/freebsd-x64": "0.25.5", 1755 | "@esbuild/linux-arm": "0.25.5", 1756 | "@esbuild/linux-arm64": "0.25.5", 1757 | "@esbuild/linux-ia32": "0.25.5", 1758 | "@esbuild/linux-loong64": "0.25.5", 1759 | "@esbuild/linux-mips64el": "0.25.5", 1760 | "@esbuild/linux-ppc64": "0.25.5", 1761 | "@esbuild/linux-riscv64": "0.25.5", 1762 | "@esbuild/linux-s390x": "0.25.5", 1763 | "@esbuild/linux-x64": "0.25.5", 1764 | "@esbuild/netbsd-arm64": "0.25.5", 1765 | "@esbuild/netbsd-x64": "0.25.5", 1766 | "@esbuild/openbsd-arm64": "0.25.5", 1767 | "@esbuild/openbsd-x64": "0.25.5", 1768 | "@esbuild/sunos-x64": "0.25.5", 1769 | "@esbuild/win32-arm64": "0.25.5", 1770 | "@esbuild/win32-ia32": "0.25.5", 1771 | "@esbuild/win32-x64": "0.25.5" 1772 | } 1773 | }, 1774 | "node_modules/estree-walker": { 1775 | "version": "3.0.3", 1776 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1777 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1778 | "dev": true, 1779 | "license": "MIT", 1780 | "dependencies": { 1781 | "@types/estree": "^1.0.0" 1782 | } 1783 | }, 1784 | "node_modules/event-target-shim": { 1785 | "version": "5.0.1", 1786 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1787 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 1788 | "license": "MIT", 1789 | "optional": true, 1790 | "engines": { 1791 | "node": ">=6" 1792 | } 1793 | }, 1794 | "node_modules/events": { 1795 | "version": "3.3.0", 1796 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1797 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1798 | "license": "MIT", 1799 | "optional": true, 1800 | "engines": { 1801 | "node": ">=0.8.x" 1802 | } 1803 | }, 1804 | "node_modules/exit-hook": { 1805 | "version": "2.2.1", 1806 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 1807 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 1808 | "dev": true, 1809 | "license": "MIT", 1810 | "engines": { 1811 | "node": ">=6" 1812 | }, 1813 | "funding": { 1814 | "url": "https://github.com/sponsors/sindresorhus" 1815 | } 1816 | }, 1817 | "node_modules/expect-type": { 1818 | "version": "1.2.1", 1819 | "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", 1820 | "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", 1821 | "dev": true, 1822 | "license": "Apache-2.0", 1823 | "engines": { 1824 | "node": ">=12.0.0" 1825 | } 1826 | }, 1827 | "node_modules/exsolve": { 1828 | "version": "1.0.5", 1829 | "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", 1830 | "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", 1831 | "dev": true, 1832 | "license": "MIT" 1833 | }, 1834 | "node_modules/fdir": { 1835 | "version": "6.4.5", 1836 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", 1837 | "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", 1838 | "dev": true, 1839 | "license": "MIT", 1840 | "peerDependencies": { 1841 | "picomatch": "^3 || ^4" 1842 | }, 1843 | "peerDependenciesMeta": { 1844 | "picomatch": { 1845 | "optional": true 1846 | } 1847 | } 1848 | }, 1849 | "node_modules/fsevents": { 1850 | "version": "2.3.3", 1851 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1852 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1853 | "dev": true, 1854 | "hasInstallScript": true, 1855 | "license": "MIT", 1856 | "optional": true, 1857 | "os": [ 1858 | "darwin" 1859 | ], 1860 | "engines": { 1861 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1862 | } 1863 | }, 1864 | "node_modules/get-source": { 1865 | "version": "2.0.12", 1866 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 1867 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 1868 | "dev": true, 1869 | "license": "Unlicense", 1870 | "dependencies": { 1871 | "data-uri-to-buffer": "^2.0.0", 1872 | "source-map": "^0.6.1" 1873 | } 1874 | }, 1875 | "node_modules/glob-to-regexp": { 1876 | "version": "0.4.1", 1877 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 1878 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 1879 | "dev": true, 1880 | "license": "BSD-2-Clause" 1881 | }, 1882 | "node_modules/hono": { 1883 | "version": "4.7.10", 1884 | "resolved": "https://registry.npmjs.org/hono/-/hono-4.7.10.tgz", 1885 | "integrity": "sha512-QkACju9MiN59CKSY5JsGZCYmPZkA6sIW6OFCUp7qDjZu6S6KHtJHhAc9Uy9mV9F8PJ1/HQ3ybZF2yjCa/73fvQ==", 1886 | "license": "MIT", 1887 | "engines": { 1888 | "node": ">=16.9.0" 1889 | } 1890 | }, 1891 | "node_modules/ieee754": { 1892 | "version": "1.2.1", 1893 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1894 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1895 | "funding": [ 1896 | { 1897 | "type": "github", 1898 | "url": "https://github.com/sponsors/feross" 1899 | }, 1900 | { 1901 | "type": "patreon", 1902 | "url": "https://www.patreon.com/feross" 1903 | }, 1904 | { 1905 | "type": "consulting", 1906 | "url": "https://feross.org/support" 1907 | } 1908 | ], 1909 | "license": "BSD-3-Clause", 1910 | "optional": true 1911 | }, 1912 | "node_modules/is-arrayish": { 1913 | "version": "0.3.2", 1914 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 1915 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", 1916 | "dev": true, 1917 | "license": "MIT" 1918 | }, 1919 | "node_modules/loupe": { 1920 | "version": "3.1.3", 1921 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", 1922 | "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", 1923 | "dev": true, 1924 | "license": "MIT" 1925 | }, 1926 | "node_modules/magic-string": { 1927 | "version": "0.30.17", 1928 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 1929 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 1930 | "dev": true, 1931 | "license": "MIT", 1932 | "dependencies": { 1933 | "@jridgewell/sourcemap-codec": "^1.5.0" 1934 | } 1935 | }, 1936 | "node_modules/mime": { 1937 | "version": "3.0.0", 1938 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 1939 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 1940 | "dev": true, 1941 | "license": "MIT", 1942 | "bin": { 1943 | "mime": "cli.js" 1944 | }, 1945 | "engines": { 1946 | "node": ">=10.0.0" 1947 | } 1948 | }, 1949 | "node_modules/miniflare": { 1950 | "version": "4.20250525.0", 1951 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250525.0.tgz", 1952 | "integrity": "sha512-F5XRDn9WqxUaHphUT8qwy5WXC/3UwbBRJTdjjP5uwHX82vypxIlHNyHziZnplPLhQa1kbSdIY7wfuP1XJyyYZw==", 1953 | "dev": true, 1954 | "license": "MIT", 1955 | "dependencies": { 1956 | "@cspotcode/source-map-support": "0.8.1", 1957 | "acorn": "8.14.0", 1958 | "acorn-walk": "8.3.2", 1959 | "exit-hook": "2.2.1", 1960 | "glob-to-regexp": "0.4.1", 1961 | "sharp": "^0.33.5", 1962 | "stoppable": "1.1.0", 1963 | "undici": "^5.28.5", 1964 | "workerd": "1.20250525.0", 1965 | "ws": "8.18.0", 1966 | "youch": "3.3.4", 1967 | "zod": "3.22.3" 1968 | }, 1969 | "bin": { 1970 | "miniflare": "bootstrap.js" 1971 | }, 1972 | "engines": { 1973 | "node": ">=18.0.0" 1974 | } 1975 | }, 1976 | "node_modules/miniflare/node_modules/zod": { 1977 | "version": "3.22.3", 1978 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", 1979 | "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", 1980 | "dev": true, 1981 | "license": "MIT", 1982 | "funding": { 1983 | "url": "https://github.com/sponsors/colinhacks" 1984 | } 1985 | }, 1986 | "node_modules/ms": { 1987 | "version": "2.1.3", 1988 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1989 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1990 | "dev": true, 1991 | "license": "MIT" 1992 | }, 1993 | "node_modules/mustache": { 1994 | "version": "4.2.0", 1995 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 1996 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 1997 | "dev": true, 1998 | "license": "MIT", 1999 | "bin": { 2000 | "mustache": "bin/mustache" 2001 | } 2002 | }, 2003 | "node_modules/nanoid": { 2004 | "version": "3.3.11", 2005 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 2006 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 2007 | "dev": true, 2008 | "funding": [ 2009 | { 2010 | "type": "github", 2011 | "url": "https://github.com/sponsors/ai" 2012 | } 2013 | ], 2014 | "license": "MIT", 2015 | "bin": { 2016 | "nanoid": "bin/nanoid.cjs" 2017 | }, 2018 | "engines": { 2019 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2020 | } 2021 | }, 2022 | "node_modules/ohash": { 2023 | "version": "2.0.11", 2024 | "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", 2025 | "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", 2026 | "dev": true, 2027 | "license": "MIT" 2028 | }, 2029 | "node_modules/path-to-regexp": { 2030 | "version": "6.3.0", 2031 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", 2032 | "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", 2033 | "dev": true, 2034 | "license": "MIT" 2035 | }, 2036 | "node_modules/pathe": { 2037 | "version": "2.0.3", 2038 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 2039 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 2040 | "dev": true, 2041 | "license": "MIT" 2042 | }, 2043 | "node_modules/pathval": { 2044 | "version": "2.0.0", 2045 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", 2046 | "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", 2047 | "dev": true, 2048 | "license": "MIT", 2049 | "engines": { 2050 | "node": ">= 14.16" 2051 | } 2052 | }, 2053 | "node_modules/picocolors": { 2054 | "version": "1.1.1", 2055 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2056 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2057 | "dev": true, 2058 | "license": "ISC" 2059 | }, 2060 | "node_modules/picomatch": { 2061 | "version": "4.0.2", 2062 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 2063 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 2064 | "dev": true, 2065 | "license": "MIT", 2066 | "engines": { 2067 | "node": ">=12" 2068 | }, 2069 | "funding": { 2070 | "url": "https://github.com/sponsors/jonschlinkert" 2071 | } 2072 | }, 2073 | "node_modules/postcss": { 2074 | "version": "8.5.4", 2075 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", 2076 | "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", 2077 | "dev": true, 2078 | "funding": [ 2079 | { 2080 | "type": "opencollective", 2081 | "url": "https://opencollective.com/postcss/" 2082 | }, 2083 | { 2084 | "type": "tidelift", 2085 | "url": "https://tidelift.com/funding/github/npm/postcss" 2086 | }, 2087 | { 2088 | "type": "github", 2089 | "url": "https://github.com/sponsors/ai" 2090 | } 2091 | ], 2092 | "license": "MIT", 2093 | "dependencies": { 2094 | "nanoid": "^3.3.11", 2095 | "picocolors": "^1.1.1", 2096 | "source-map-js": "^1.2.1" 2097 | }, 2098 | "engines": { 2099 | "node": "^10 || ^12 || >=14" 2100 | } 2101 | }, 2102 | "node_modules/printable-characters": { 2103 | "version": "1.0.42", 2104 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 2105 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 2106 | "dev": true, 2107 | "license": "Unlicense" 2108 | }, 2109 | "node_modules/process": { 2110 | "version": "0.11.10", 2111 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2112 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 2113 | "license": "MIT", 2114 | "optional": true, 2115 | "engines": { 2116 | "node": ">= 0.6.0" 2117 | } 2118 | }, 2119 | "node_modules/readable-stream": { 2120 | "version": "4.7.0", 2121 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", 2122 | "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", 2123 | "license": "MIT", 2124 | "optional": true, 2125 | "dependencies": { 2126 | "abort-controller": "^3.0.0", 2127 | "buffer": "^6.0.3", 2128 | "events": "^3.3.0", 2129 | "process": "^0.11.10", 2130 | "string_decoder": "^1.3.0" 2131 | }, 2132 | "engines": { 2133 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2134 | } 2135 | }, 2136 | "node_modules/replicate": { 2137 | "version": "1.0.1", 2138 | "resolved": "https://registry.npmjs.org/replicate/-/replicate-1.0.1.tgz", 2139 | "integrity": "sha512-EY+rK1YR5bKHcM9pd6WyaIbv6m2aRIvHfHDh51j/LahlHTLKemTYXF6ptif2sLa+YospupAsIoxw8Ndt5nI3vg==", 2140 | "license": "Apache-2.0", 2141 | "engines": { 2142 | "git": ">=2.11.0", 2143 | "node": ">=18.0.0", 2144 | "npm": ">=7.19.0", 2145 | "yarn": ">=1.7.0" 2146 | }, 2147 | "optionalDependencies": { 2148 | "readable-stream": ">=4.0.0" 2149 | } 2150 | }, 2151 | "node_modules/rollup": { 2152 | "version": "4.41.1", 2153 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", 2154 | "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", 2155 | "dev": true, 2156 | "license": "MIT", 2157 | "dependencies": { 2158 | "@types/estree": "1.0.7" 2159 | }, 2160 | "bin": { 2161 | "rollup": "dist/bin/rollup" 2162 | }, 2163 | "engines": { 2164 | "node": ">=18.0.0", 2165 | "npm": ">=8.0.0" 2166 | }, 2167 | "optionalDependencies": { 2168 | "@rollup/rollup-android-arm-eabi": "4.41.1", 2169 | "@rollup/rollup-android-arm64": "4.41.1", 2170 | "@rollup/rollup-darwin-arm64": "4.41.1", 2171 | "@rollup/rollup-darwin-x64": "4.41.1", 2172 | "@rollup/rollup-freebsd-arm64": "4.41.1", 2173 | "@rollup/rollup-freebsd-x64": "4.41.1", 2174 | "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", 2175 | "@rollup/rollup-linux-arm-musleabihf": "4.41.1", 2176 | "@rollup/rollup-linux-arm64-gnu": "4.41.1", 2177 | "@rollup/rollup-linux-arm64-musl": "4.41.1", 2178 | "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", 2179 | "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", 2180 | "@rollup/rollup-linux-riscv64-gnu": "4.41.1", 2181 | "@rollup/rollup-linux-riscv64-musl": "4.41.1", 2182 | "@rollup/rollup-linux-s390x-gnu": "4.41.1", 2183 | "@rollup/rollup-linux-x64-gnu": "4.41.1", 2184 | "@rollup/rollup-linux-x64-musl": "4.41.1", 2185 | "@rollup/rollup-win32-arm64-msvc": "4.41.1", 2186 | "@rollup/rollup-win32-ia32-msvc": "4.41.1", 2187 | "@rollup/rollup-win32-x64-msvc": "4.41.1", 2188 | "fsevents": "~2.3.2" 2189 | } 2190 | }, 2191 | "node_modules/safe-buffer": { 2192 | "version": "5.2.1", 2193 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2194 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2195 | "funding": [ 2196 | { 2197 | "type": "github", 2198 | "url": "https://github.com/sponsors/feross" 2199 | }, 2200 | { 2201 | "type": "patreon", 2202 | "url": "https://www.patreon.com/feross" 2203 | }, 2204 | { 2205 | "type": "consulting", 2206 | "url": "https://feross.org/support" 2207 | } 2208 | ], 2209 | "license": "MIT", 2210 | "optional": true 2211 | }, 2212 | "node_modules/semver": { 2213 | "version": "7.7.2", 2214 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 2215 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 2216 | "dev": true, 2217 | "license": "ISC", 2218 | "bin": { 2219 | "semver": "bin/semver.js" 2220 | }, 2221 | "engines": { 2222 | "node": ">=10" 2223 | } 2224 | }, 2225 | "node_modules/sharp": { 2226 | "version": "0.33.5", 2227 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", 2228 | "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", 2229 | "dev": true, 2230 | "hasInstallScript": true, 2231 | "license": "Apache-2.0", 2232 | "dependencies": { 2233 | "color": "^4.2.3", 2234 | "detect-libc": "^2.0.3", 2235 | "semver": "^7.6.3" 2236 | }, 2237 | "engines": { 2238 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 2239 | }, 2240 | "funding": { 2241 | "url": "https://opencollective.com/libvips" 2242 | }, 2243 | "optionalDependencies": { 2244 | "@img/sharp-darwin-arm64": "0.33.5", 2245 | "@img/sharp-darwin-x64": "0.33.5", 2246 | "@img/sharp-libvips-darwin-arm64": "1.0.4", 2247 | "@img/sharp-libvips-darwin-x64": "1.0.4", 2248 | "@img/sharp-libvips-linux-arm": "1.0.5", 2249 | "@img/sharp-libvips-linux-arm64": "1.0.4", 2250 | "@img/sharp-libvips-linux-s390x": "1.0.4", 2251 | "@img/sharp-libvips-linux-x64": "1.0.4", 2252 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", 2253 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4", 2254 | "@img/sharp-linux-arm": "0.33.5", 2255 | "@img/sharp-linux-arm64": "0.33.5", 2256 | "@img/sharp-linux-s390x": "0.33.5", 2257 | "@img/sharp-linux-x64": "0.33.5", 2258 | "@img/sharp-linuxmusl-arm64": "0.33.5", 2259 | "@img/sharp-linuxmusl-x64": "0.33.5", 2260 | "@img/sharp-wasm32": "0.33.5", 2261 | "@img/sharp-win32-ia32": "0.33.5", 2262 | "@img/sharp-win32-x64": "0.33.5" 2263 | } 2264 | }, 2265 | "node_modules/siginfo": { 2266 | "version": "2.0.0", 2267 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 2268 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 2269 | "dev": true, 2270 | "license": "ISC" 2271 | }, 2272 | "node_modules/simple-swizzle": { 2273 | "version": "0.2.2", 2274 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2275 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 2276 | "dev": true, 2277 | "license": "MIT", 2278 | "dependencies": { 2279 | "is-arrayish": "^0.3.1" 2280 | } 2281 | }, 2282 | "node_modules/source-map": { 2283 | "version": "0.6.1", 2284 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2285 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2286 | "dev": true, 2287 | "license": "BSD-3-Clause", 2288 | "engines": { 2289 | "node": ">=0.10.0" 2290 | } 2291 | }, 2292 | "node_modules/source-map-js": { 2293 | "version": "1.2.1", 2294 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2295 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2296 | "dev": true, 2297 | "license": "BSD-3-Clause", 2298 | "engines": { 2299 | "node": ">=0.10.0" 2300 | } 2301 | }, 2302 | "node_modules/stackback": { 2303 | "version": "0.0.2", 2304 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 2305 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 2306 | "dev": true, 2307 | "license": "MIT" 2308 | }, 2309 | "node_modules/stacktracey": { 2310 | "version": "2.1.8", 2311 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 2312 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 2313 | "dev": true, 2314 | "license": "Unlicense", 2315 | "dependencies": { 2316 | "as-table": "^1.0.36", 2317 | "get-source": "^2.0.12" 2318 | } 2319 | }, 2320 | "node_modules/std-env": { 2321 | "version": "3.9.0", 2322 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", 2323 | "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", 2324 | "dev": true, 2325 | "license": "MIT" 2326 | }, 2327 | "node_modules/stoppable": { 2328 | "version": "1.1.0", 2329 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 2330 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 2331 | "dev": true, 2332 | "license": "MIT", 2333 | "engines": { 2334 | "node": ">=4", 2335 | "npm": ">=6" 2336 | } 2337 | }, 2338 | "node_modules/string_decoder": { 2339 | "version": "1.3.0", 2340 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2341 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2342 | "license": "MIT", 2343 | "optional": true, 2344 | "dependencies": { 2345 | "safe-buffer": "~5.2.0" 2346 | } 2347 | }, 2348 | "node_modules/tinybench": { 2349 | "version": "2.9.0", 2350 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 2351 | "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 2352 | "dev": true, 2353 | "license": "MIT" 2354 | }, 2355 | "node_modules/tinyexec": { 2356 | "version": "0.3.2", 2357 | "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 2358 | "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 2359 | "dev": true, 2360 | "license": "MIT" 2361 | }, 2362 | "node_modules/tinyglobby": { 2363 | "version": "0.2.14", 2364 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", 2365 | "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 2366 | "dev": true, 2367 | "license": "MIT", 2368 | "dependencies": { 2369 | "fdir": "^6.4.4", 2370 | "picomatch": "^4.0.2" 2371 | }, 2372 | "engines": { 2373 | "node": ">=12.0.0" 2374 | }, 2375 | "funding": { 2376 | "url": "https://github.com/sponsors/SuperchupuDev" 2377 | } 2378 | }, 2379 | "node_modules/tinypool": { 2380 | "version": "1.0.2", 2381 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", 2382 | "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", 2383 | "dev": true, 2384 | "license": "MIT", 2385 | "engines": { 2386 | "node": "^18.0.0 || >=20.0.0" 2387 | } 2388 | }, 2389 | "node_modules/tinyrainbow": { 2390 | "version": "2.0.0", 2391 | "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", 2392 | "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", 2393 | "dev": true, 2394 | "license": "MIT", 2395 | "engines": { 2396 | "node": ">=14.0.0" 2397 | } 2398 | }, 2399 | "node_modules/tinyspy": { 2400 | "version": "3.0.2", 2401 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", 2402 | "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", 2403 | "dev": true, 2404 | "license": "MIT", 2405 | "engines": { 2406 | "node": ">=14.0.0" 2407 | } 2408 | }, 2409 | "node_modules/tslib": { 2410 | "version": "2.8.1", 2411 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2412 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2413 | "dev": true, 2414 | "license": "0BSD", 2415 | "optional": true 2416 | }, 2417 | "node_modules/typescript": { 2418 | "version": "5.8.3", 2419 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 2420 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 2421 | "dev": true, 2422 | "license": "Apache-2.0", 2423 | "bin": { 2424 | "tsc": "bin/tsc", 2425 | "tsserver": "bin/tsserver" 2426 | }, 2427 | "engines": { 2428 | "node": ">=14.17" 2429 | } 2430 | }, 2431 | "node_modules/ufo": { 2432 | "version": "1.6.1", 2433 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", 2434 | "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", 2435 | "dev": true, 2436 | "license": "MIT" 2437 | }, 2438 | "node_modules/undici": { 2439 | "version": "5.29.0", 2440 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 2441 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 2442 | "dev": true, 2443 | "license": "MIT", 2444 | "dependencies": { 2445 | "@fastify/busboy": "^2.0.0" 2446 | }, 2447 | "engines": { 2448 | "node": ">=14.0" 2449 | } 2450 | }, 2451 | "node_modules/unenv": { 2452 | "version": "2.0.0-rc.17", 2453 | "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.17.tgz", 2454 | "integrity": "sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==", 2455 | "dev": true, 2456 | "license": "MIT", 2457 | "dependencies": { 2458 | "defu": "^6.1.4", 2459 | "exsolve": "^1.0.4", 2460 | "ohash": "^2.0.11", 2461 | "pathe": "^2.0.3", 2462 | "ufo": "^1.6.1" 2463 | } 2464 | }, 2465 | "node_modules/vite": { 2466 | "version": "6.3.5", 2467 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", 2468 | "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", 2469 | "dev": true, 2470 | "license": "MIT", 2471 | "dependencies": { 2472 | "esbuild": "^0.25.0", 2473 | "fdir": "^6.4.4", 2474 | "picomatch": "^4.0.2", 2475 | "postcss": "^8.5.3", 2476 | "rollup": "^4.34.9", 2477 | "tinyglobby": "^0.2.13" 2478 | }, 2479 | "bin": { 2480 | "vite": "bin/vite.js" 2481 | }, 2482 | "engines": { 2483 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2484 | }, 2485 | "funding": { 2486 | "url": "https://github.com/vitejs/vite?sponsor=1" 2487 | }, 2488 | "optionalDependencies": { 2489 | "fsevents": "~2.3.3" 2490 | }, 2491 | "peerDependencies": { 2492 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2493 | "jiti": ">=1.21.0", 2494 | "less": "*", 2495 | "lightningcss": "^1.21.0", 2496 | "sass": "*", 2497 | "sass-embedded": "*", 2498 | "stylus": "*", 2499 | "sugarss": "*", 2500 | "terser": "^5.16.0", 2501 | "tsx": "^4.8.1", 2502 | "yaml": "^2.4.2" 2503 | }, 2504 | "peerDependenciesMeta": { 2505 | "@types/node": { 2506 | "optional": true 2507 | }, 2508 | "jiti": { 2509 | "optional": true 2510 | }, 2511 | "less": { 2512 | "optional": true 2513 | }, 2514 | "lightningcss": { 2515 | "optional": true 2516 | }, 2517 | "sass": { 2518 | "optional": true 2519 | }, 2520 | "sass-embedded": { 2521 | "optional": true 2522 | }, 2523 | "stylus": { 2524 | "optional": true 2525 | }, 2526 | "sugarss": { 2527 | "optional": true 2528 | }, 2529 | "terser": { 2530 | "optional": true 2531 | }, 2532 | "tsx": { 2533 | "optional": true 2534 | }, 2535 | "yaml": { 2536 | "optional": true 2537 | } 2538 | } 2539 | }, 2540 | "node_modules/vite-node": { 2541 | "version": "3.0.9", 2542 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", 2543 | "integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", 2544 | "dev": true, 2545 | "license": "MIT", 2546 | "dependencies": { 2547 | "cac": "^6.7.14", 2548 | "debug": "^4.4.0", 2549 | "es-module-lexer": "^1.6.0", 2550 | "pathe": "^2.0.3", 2551 | "vite": "^5.0.0 || ^6.0.0" 2552 | }, 2553 | "bin": { 2554 | "vite-node": "vite-node.mjs" 2555 | }, 2556 | "engines": { 2557 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2558 | }, 2559 | "funding": { 2560 | "url": "https://opencollective.com/vitest" 2561 | } 2562 | }, 2563 | "node_modules/vitest": { 2564 | "version": "3.0.9", 2565 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", 2566 | "integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", 2567 | "dev": true, 2568 | "license": "MIT", 2569 | "dependencies": { 2570 | "@vitest/expect": "3.0.9", 2571 | "@vitest/mocker": "3.0.9", 2572 | "@vitest/pretty-format": "^3.0.9", 2573 | "@vitest/runner": "3.0.9", 2574 | "@vitest/snapshot": "3.0.9", 2575 | "@vitest/spy": "3.0.9", 2576 | "@vitest/utils": "3.0.9", 2577 | "chai": "^5.2.0", 2578 | "debug": "^4.4.0", 2579 | "expect-type": "^1.1.0", 2580 | "magic-string": "^0.30.17", 2581 | "pathe": "^2.0.3", 2582 | "std-env": "^3.8.0", 2583 | "tinybench": "^2.9.0", 2584 | "tinyexec": "^0.3.2", 2585 | "tinypool": "^1.0.2", 2586 | "tinyrainbow": "^2.0.0", 2587 | "vite": "^5.0.0 || ^6.0.0", 2588 | "vite-node": "3.0.9", 2589 | "why-is-node-running": "^2.3.0" 2590 | }, 2591 | "bin": { 2592 | "vitest": "vitest.mjs" 2593 | }, 2594 | "engines": { 2595 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2596 | }, 2597 | "funding": { 2598 | "url": "https://opencollective.com/vitest" 2599 | }, 2600 | "peerDependencies": { 2601 | "@edge-runtime/vm": "*", 2602 | "@types/debug": "^4.1.12", 2603 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2604 | "@vitest/browser": "3.0.9", 2605 | "@vitest/ui": "3.0.9", 2606 | "happy-dom": "*", 2607 | "jsdom": "*" 2608 | }, 2609 | "peerDependenciesMeta": { 2610 | "@edge-runtime/vm": { 2611 | "optional": true 2612 | }, 2613 | "@types/debug": { 2614 | "optional": true 2615 | }, 2616 | "@types/node": { 2617 | "optional": true 2618 | }, 2619 | "@vitest/browser": { 2620 | "optional": true 2621 | }, 2622 | "@vitest/ui": { 2623 | "optional": true 2624 | }, 2625 | "happy-dom": { 2626 | "optional": true 2627 | }, 2628 | "jsdom": { 2629 | "optional": true 2630 | } 2631 | } 2632 | }, 2633 | "node_modules/why-is-node-running": { 2634 | "version": "2.3.0", 2635 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 2636 | "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 2637 | "dev": true, 2638 | "license": "MIT", 2639 | "dependencies": { 2640 | "siginfo": "^2.0.0", 2641 | "stackback": "0.0.2" 2642 | }, 2643 | "bin": { 2644 | "why-is-node-running": "cli.js" 2645 | }, 2646 | "engines": { 2647 | "node": ">=8" 2648 | } 2649 | }, 2650 | "node_modules/workerd": { 2651 | "version": "1.20250525.0", 2652 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250525.0.tgz", 2653 | "integrity": "sha512-SXJgLREy/Aqw2J71Oah0Pbu+SShbqbTExjVQyRBTM1r7MG7fS5NUlknhnt6sikjA/t4cO09Bi8OJqHdTkrcnYQ==", 2654 | "dev": true, 2655 | "hasInstallScript": true, 2656 | "license": "Apache-2.0", 2657 | "bin": { 2658 | "workerd": "bin/workerd" 2659 | }, 2660 | "engines": { 2661 | "node": ">=16" 2662 | }, 2663 | "optionalDependencies": { 2664 | "@cloudflare/workerd-darwin-64": "1.20250525.0", 2665 | "@cloudflare/workerd-darwin-arm64": "1.20250525.0", 2666 | "@cloudflare/workerd-linux-64": "1.20250525.0", 2667 | "@cloudflare/workerd-linux-arm64": "1.20250525.0", 2668 | "@cloudflare/workerd-windows-64": "1.20250525.0" 2669 | } 2670 | }, 2671 | "node_modules/wrangler": { 2672 | "version": "4.18.0", 2673 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.18.0.tgz", 2674 | "integrity": "sha512-/ng0KI9io97SNsBU1rheADBLLTE5Djybgsi4gXuvH1RBKJGpyj1xWvZ2fuWu8vAonit3EiZkwtERTm6kESHP3A==", 2675 | "dev": true, 2676 | "license": "MIT OR Apache-2.0", 2677 | "dependencies": { 2678 | "@cloudflare/kv-asset-handler": "0.4.0", 2679 | "@cloudflare/unenv-preset": "2.3.2", 2680 | "blake3-wasm": "2.1.5", 2681 | "esbuild": "0.25.4", 2682 | "miniflare": "4.20250525.0", 2683 | "path-to-regexp": "6.3.0", 2684 | "unenv": "2.0.0-rc.17", 2685 | "workerd": "1.20250525.0" 2686 | }, 2687 | "bin": { 2688 | "wrangler": "bin/wrangler.js", 2689 | "wrangler2": "bin/wrangler.js" 2690 | }, 2691 | "engines": { 2692 | "node": ">=18.0.0" 2693 | }, 2694 | "optionalDependencies": { 2695 | "fsevents": "~2.3.2" 2696 | }, 2697 | "peerDependencies": { 2698 | "@cloudflare/workers-types": "^4.20250525.0" 2699 | }, 2700 | "peerDependenciesMeta": { 2701 | "@cloudflare/workers-types": { 2702 | "optional": true 2703 | } 2704 | } 2705 | }, 2706 | "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { 2707 | "version": "0.25.4", 2708 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 2709 | "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 2710 | "cpu": [ 2711 | "ppc64" 2712 | ], 2713 | "dev": true, 2714 | "license": "MIT", 2715 | "optional": true, 2716 | "os": [ 2717 | "aix" 2718 | ], 2719 | "engines": { 2720 | "node": ">=18" 2721 | } 2722 | }, 2723 | "node_modules/wrangler/node_modules/@esbuild/android-arm": { 2724 | "version": "0.25.4", 2725 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 2726 | "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 2727 | "cpu": [ 2728 | "arm" 2729 | ], 2730 | "dev": true, 2731 | "license": "MIT", 2732 | "optional": true, 2733 | "os": [ 2734 | "android" 2735 | ], 2736 | "engines": { 2737 | "node": ">=18" 2738 | } 2739 | }, 2740 | "node_modules/wrangler/node_modules/@esbuild/android-arm64": { 2741 | "version": "0.25.4", 2742 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 2743 | "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 2744 | "cpu": [ 2745 | "arm64" 2746 | ], 2747 | "dev": true, 2748 | "license": "MIT", 2749 | "optional": true, 2750 | "os": [ 2751 | "android" 2752 | ], 2753 | "engines": { 2754 | "node": ">=18" 2755 | } 2756 | }, 2757 | "node_modules/wrangler/node_modules/@esbuild/android-x64": { 2758 | "version": "0.25.4", 2759 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 2760 | "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 2761 | "cpu": [ 2762 | "x64" 2763 | ], 2764 | "dev": true, 2765 | "license": "MIT", 2766 | "optional": true, 2767 | "os": [ 2768 | "android" 2769 | ], 2770 | "engines": { 2771 | "node": ">=18" 2772 | } 2773 | }, 2774 | "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { 2775 | "version": "0.25.4", 2776 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 2777 | "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 2778 | "cpu": [ 2779 | "arm64" 2780 | ], 2781 | "dev": true, 2782 | "license": "MIT", 2783 | "optional": true, 2784 | "os": [ 2785 | "darwin" 2786 | ], 2787 | "engines": { 2788 | "node": ">=18" 2789 | } 2790 | }, 2791 | "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { 2792 | "version": "0.25.4", 2793 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 2794 | "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 2795 | "cpu": [ 2796 | "x64" 2797 | ], 2798 | "dev": true, 2799 | "license": "MIT", 2800 | "optional": true, 2801 | "os": [ 2802 | "darwin" 2803 | ], 2804 | "engines": { 2805 | "node": ">=18" 2806 | } 2807 | }, 2808 | "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { 2809 | "version": "0.25.4", 2810 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 2811 | "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 2812 | "cpu": [ 2813 | "arm64" 2814 | ], 2815 | "dev": true, 2816 | "license": "MIT", 2817 | "optional": true, 2818 | "os": [ 2819 | "freebsd" 2820 | ], 2821 | "engines": { 2822 | "node": ">=18" 2823 | } 2824 | }, 2825 | "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { 2826 | "version": "0.25.4", 2827 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 2828 | "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 2829 | "cpu": [ 2830 | "x64" 2831 | ], 2832 | "dev": true, 2833 | "license": "MIT", 2834 | "optional": true, 2835 | "os": [ 2836 | "freebsd" 2837 | ], 2838 | "engines": { 2839 | "node": ">=18" 2840 | } 2841 | }, 2842 | "node_modules/wrangler/node_modules/@esbuild/linux-arm": { 2843 | "version": "0.25.4", 2844 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 2845 | "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 2846 | "cpu": [ 2847 | "arm" 2848 | ], 2849 | "dev": true, 2850 | "license": "MIT", 2851 | "optional": true, 2852 | "os": [ 2853 | "linux" 2854 | ], 2855 | "engines": { 2856 | "node": ">=18" 2857 | } 2858 | }, 2859 | "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { 2860 | "version": "0.25.4", 2861 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 2862 | "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 2863 | "cpu": [ 2864 | "arm64" 2865 | ], 2866 | "dev": true, 2867 | "license": "MIT", 2868 | "optional": true, 2869 | "os": [ 2870 | "linux" 2871 | ], 2872 | "engines": { 2873 | "node": ">=18" 2874 | } 2875 | }, 2876 | "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { 2877 | "version": "0.25.4", 2878 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 2879 | "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 2880 | "cpu": [ 2881 | "ia32" 2882 | ], 2883 | "dev": true, 2884 | "license": "MIT", 2885 | "optional": true, 2886 | "os": [ 2887 | "linux" 2888 | ], 2889 | "engines": { 2890 | "node": ">=18" 2891 | } 2892 | }, 2893 | "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { 2894 | "version": "0.25.4", 2895 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 2896 | "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 2897 | "cpu": [ 2898 | "loong64" 2899 | ], 2900 | "dev": true, 2901 | "license": "MIT", 2902 | "optional": true, 2903 | "os": [ 2904 | "linux" 2905 | ], 2906 | "engines": { 2907 | "node": ">=18" 2908 | } 2909 | }, 2910 | "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { 2911 | "version": "0.25.4", 2912 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 2913 | "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 2914 | "cpu": [ 2915 | "mips64el" 2916 | ], 2917 | "dev": true, 2918 | "license": "MIT", 2919 | "optional": true, 2920 | "os": [ 2921 | "linux" 2922 | ], 2923 | "engines": { 2924 | "node": ">=18" 2925 | } 2926 | }, 2927 | "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { 2928 | "version": "0.25.4", 2929 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 2930 | "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 2931 | "cpu": [ 2932 | "ppc64" 2933 | ], 2934 | "dev": true, 2935 | "license": "MIT", 2936 | "optional": true, 2937 | "os": [ 2938 | "linux" 2939 | ], 2940 | "engines": { 2941 | "node": ">=18" 2942 | } 2943 | }, 2944 | "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { 2945 | "version": "0.25.4", 2946 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 2947 | "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 2948 | "cpu": [ 2949 | "riscv64" 2950 | ], 2951 | "dev": true, 2952 | "license": "MIT", 2953 | "optional": true, 2954 | "os": [ 2955 | "linux" 2956 | ], 2957 | "engines": { 2958 | "node": ">=18" 2959 | } 2960 | }, 2961 | "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { 2962 | "version": "0.25.4", 2963 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 2964 | "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 2965 | "cpu": [ 2966 | "s390x" 2967 | ], 2968 | "dev": true, 2969 | "license": "MIT", 2970 | "optional": true, 2971 | "os": [ 2972 | "linux" 2973 | ], 2974 | "engines": { 2975 | "node": ">=18" 2976 | } 2977 | }, 2978 | "node_modules/wrangler/node_modules/@esbuild/linux-x64": { 2979 | "version": "0.25.4", 2980 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 2981 | "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 2982 | "cpu": [ 2983 | "x64" 2984 | ], 2985 | "dev": true, 2986 | "license": "MIT", 2987 | "optional": true, 2988 | "os": [ 2989 | "linux" 2990 | ], 2991 | "engines": { 2992 | "node": ">=18" 2993 | } 2994 | }, 2995 | "node_modules/wrangler/node_modules/@esbuild/netbsd-arm64": { 2996 | "version": "0.25.4", 2997 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 2998 | "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 2999 | "cpu": [ 3000 | "arm64" 3001 | ], 3002 | "dev": true, 3003 | "license": "MIT", 3004 | "optional": true, 3005 | "os": [ 3006 | "netbsd" 3007 | ], 3008 | "engines": { 3009 | "node": ">=18" 3010 | } 3011 | }, 3012 | "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { 3013 | "version": "0.25.4", 3014 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 3015 | "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 3016 | "cpu": [ 3017 | "x64" 3018 | ], 3019 | "dev": true, 3020 | "license": "MIT", 3021 | "optional": true, 3022 | "os": [ 3023 | "netbsd" 3024 | ], 3025 | "engines": { 3026 | "node": ">=18" 3027 | } 3028 | }, 3029 | "node_modules/wrangler/node_modules/@esbuild/openbsd-arm64": { 3030 | "version": "0.25.4", 3031 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 3032 | "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 3033 | "cpu": [ 3034 | "arm64" 3035 | ], 3036 | "dev": true, 3037 | "license": "MIT", 3038 | "optional": true, 3039 | "os": [ 3040 | "openbsd" 3041 | ], 3042 | "engines": { 3043 | "node": ">=18" 3044 | } 3045 | }, 3046 | "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { 3047 | "version": "0.25.4", 3048 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 3049 | "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 3050 | "cpu": [ 3051 | "x64" 3052 | ], 3053 | "dev": true, 3054 | "license": "MIT", 3055 | "optional": true, 3056 | "os": [ 3057 | "openbsd" 3058 | ], 3059 | "engines": { 3060 | "node": ">=18" 3061 | } 3062 | }, 3063 | "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { 3064 | "version": "0.25.4", 3065 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 3066 | "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 3067 | "cpu": [ 3068 | "x64" 3069 | ], 3070 | "dev": true, 3071 | "license": "MIT", 3072 | "optional": true, 3073 | "os": [ 3074 | "sunos" 3075 | ], 3076 | "engines": { 3077 | "node": ">=18" 3078 | } 3079 | }, 3080 | "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { 3081 | "version": "0.25.4", 3082 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 3083 | "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 3084 | "cpu": [ 3085 | "arm64" 3086 | ], 3087 | "dev": true, 3088 | "license": "MIT", 3089 | "optional": true, 3090 | "os": [ 3091 | "win32" 3092 | ], 3093 | "engines": { 3094 | "node": ">=18" 3095 | } 3096 | }, 3097 | "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { 3098 | "version": "0.25.4", 3099 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 3100 | "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 3101 | "cpu": [ 3102 | "ia32" 3103 | ], 3104 | "dev": true, 3105 | "license": "MIT", 3106 | "optional": true, 3107 | "os": [ 3108 | "win32" 3109 | ], 3110 | "engines": { 3111 | "node": ">=18" 3112 | } 3113 | }, 3114 | "node_modules/wrangler/node_modules/@esbuild/win32-x64": { 3115 | "version": "0.25.4", 3116 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 3117 | "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 3118 | "cpu": [ 3119 | "x64" 3120 | ], 3121 | "dev": true, 3122 | "license": "MIT", 3123 | "optional": true, 3124 | "os": [ 3125 | "win32" 3126 | ], 3127 | "engines": { 3128 | "node": ">=18" 3129 | } 3130 | }, 3131 | "node_modules/wrangler/node_modules/esbuild": { 3132 | "version": "0.25.4", 3133 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", 3134 | "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 3135 | "dev": true, 3136 | "hasInstallScript": true, 3137 | "license": "MIT", 3138 | "bin": { 3139 | "esbuild": "bin/esbuild" 3140 | }, 3141 | "engines": { 3142 | "node": ">=18" 3143 | }, 3144 | "optionalDependencies": { 3145 | "@esbuild/aix-ppc64": "0.25.4", 3146 | "@esbuild/android-arm": "0.25.4", 3147 | "@esbuild/android-arm64": "0.25.4", 3148 | "@esbuild/android-x64": "0.25.4", 3149 | "@esbuild/darwin-arm64": "0.25.4", 3150 | "@esbuild/darwin-x64": "0.25.4", 3151 | "@esbuild/freebsd-arm64": "0.25.4", 3152 | "@esbuild/freebsd-x64": "0.25.4", 3153 | "@esbuild/linux-arm": "0.25.4", 3154 | "@esbuild/linux-arm64": "0.25.4", 3155 | "@esbuild/linux-ia32": "0.25.4", 3156 | "@esbuild/linux-loong64": "0.25.4", 3157 | "@esbuild/linux-mips64el": "0.25.4", 3158 | "@esbuild/linux-ppc64": "0.25.4", 3159 | "@esbuild/linux-riscv64": "0.25.4", 3160 | "@esbuild/linux-s390x": "0.25.4", 3161 | "@esbuild/linux-x64": "0.25.4", 3162 | "@esbuild/netbsd-arm64": "0.25.4", 3163 | "@esbuild/netbsd-x64": "0.25.4", 3164 | "@esbuild/openbsd-arm64": "0.25.4", 3165 | "@esbuild/openbsd-x64": "0.25.4", 3166 | "@esbuild/sunos-x64": "0.25.4", 3167 | "@esbuild/win32-arm64": "0.25.4", 3168 | "@esbuild/win32-ia32": "0.25.4", 3169 | "@esbuild/win32-x64": "0.25.4" 3170 | } 3171 | }, 3172 | "node_modules/ws": { 3173 | "version": "8.18.0", 3174 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 3175 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 3176 | "dev": true, 3177 | "license": "MIT", 3178 | "engines": { 3179 | "node": ">=10.0.0" 3180 | }, 3181 | "peerDependencies": { 3182 | "bufferutil": "^4.0.1", 3183 | "utf-8-validate": ">=5.0.2" 3184 | }, 3185 | "peerDependenciesMeta": { 3186 | "bufferutil": { 3187 | "optional": true 3188 | }, 3189 | "utf-8-validate": { 3190 | "optional": true 3191 | } 3192 | } 3193 | }, 3194 | "node_modules/youch": { 3195 | "version": "3.3.4", 3196 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", 3197 | "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", 3198 | "dev": true, 3199 | "license": "MIT", 3200 | "dependencies": { 3201 | "cookie": "^0.7.1", 3202 | "mustache": "^4.2.0", 3203 | "stacktracey": "^2.1.8" 3204 | } 3205 | }, 3206 | "node_modules/zod": { 3207 | "version": "3.25.42", 3208 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.42.tgz", 3209 | "integrity": "sha512-PcALTLskaucbeHc41tU/xfjfhcz8z0GdhhDcSgrCTmSazUuqnYqiXO63M0QUBVwpBlsLsNVn5qHSC5Dw3KZvaQ==", 3210 | "dev": true, 3211 | "license": "MIT", 3212 | "funding": { 3213 | "url": "https://github.com/sponsors/colinhacks" 3214 | } 3215 | } 3216 | } 3217 | } 3218 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kontext-chat", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "deploy": "wrangler deploy", 7 | "dev": "wrangler dev", 8 | "start": "wrangler dev", 9 | "test": "vitest", 10 | "cf-typegen": "wrangler types" 11 | }, 12 | "devDependencies": { 13 | "@cloudflare/vitest-pool-workers": "^0.8.19", 14 | "typescript": "^5.5.2", 15 | "vitest": "~3.0.7", 16 | "wrangler": "^4.18.0" 17 | }, 18 | "dependencies": { 19 | "hono": "^4.7.10", 20 | "replicate": "^1.0.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /public/app.js: -------------------------------------------------------------------------------- 1 | const starterImages = [ 2 | { 3 | imageUrl: 'https://replicate.delivery/pbxt/N55l5TWGh8mSlNzW8usReoaNhGbFwvLeZR3TX1NL4pd2Wtfv/replicate-prediction-f2d25rg6gnrma0cq257vdw2n4c.png', 4 | suggestedPrompt: 'make it into a 90s cartoon', 5 | }, 6 | { 7 | imageUrl: 'https://replicate.delivery/pbxt/N5cepICxyaagdvULl0phi7ImdxuFz05TR2l623zqxhNR9q5Y/van-gogh.jpeg', 8 | suggestedPrompt: 'Using this style, a panda astronaut riding a unicorn', 9 | }, 10 | { 11 | imageUrl: 'https://replicate.delivery/xezq/OKWfR6jlQwzekkSsfQOppX55O3vaNv6xZ4qY6RfHjwQHOwDTB/tmp9p3v3brc.png', 12 | suggestedPrompt: 'remove the text from the sweatshirt', 13 | }, 14 | { 15 | imageUrl: 'https://replicate.delivery/pbxt/N5trWTJCJQbJVWz5nhLEscS1w16r1hGl5zuWceJhVSnWZfGu/mona-lisa-1024.jpg', 16 | suggestedPrompt: 'close her eyes', 17 | }, 18 | { 19 | imageUrl: 'https://replicate.delivery/mgxm/b033ff07-1d2e-4768-a137-6c16b5ed4bed/d_1.png', 20 | suggestedPrompt: 'Convert to a high-quality restoration, enhancing details and removing any damage or degradation', 21 | } 22 | ] 23 | 24 | function PoweredByBanner() { 25 | return ( 26 |
36 | ); 37 | } 38 | 39 | function App() { 40 | // State for upload vs chat mode 41 | const [showUpload, setShowUpload] = React.useState(true); 42 | const [messages, setMessages] = React.useState([]); 43 | const [input, setInput] = React.useState(''); 44 | const [loading, setLoading] = React.useState(false); 45 | // No need for separate image state - just use what's in the chat! 46 | const [predictionId, setPredictionId] = React.useState(null); 47 | const [abortController, setAbortController] = React.useState(null); 48 | // New: track if a starter image was used (for future logic if needed) 49 | const [starterUsed, setStarterUsed] = React.useState(false); 50 | 51 | // Replicate API token state 52 | const [replicateToken, setReplicateToken] = React.useState(() => { 53 | if (typeof window !== 'undefined') { 54 | return localStorage.getItem('replicateApiToken') || ''; 55 | } 56 | return ''; 57 | }); 58 | const [showTokenModal, setShowTokenModal] = React.useState(!replicateToken); 59 | const [tokenInput, setTokenInput] = React.useState(''); 60 | const [tokenError, setTokenError] = React.useState(''); 61 | 62 | // Simple desktop check 63 | const [isDesktop, setIsDesktop] = React.useState(false); 64 | React.useEffect(() => { 65 | const checkDesktop = () => setIsDesktop(window.innerWidth >= 768); 66 | checkDesktop(); 67 | window.addEventListener('resize', checkDesktop); 68 | return () => window.removeEventListener('resize', checkDesktop); 69 | }, []); 70 | 71 | // Ref for chat container and file input 72 | const chatContainerRef = React.useRef(null); 73 | const fileInputRef = React.useRef(null); 74 | const textareaRef = React.useRef(null); 75 | 76 | // Focus textarea when component mounts or when switching to chat mode 77 | React.useEffect(() => { 78 | if (!showUpload && textareaRef.current) { 79 | textareaRef.current.focus(); 80 | textareaRef.current.select(); 81 | } 82 | }, [showUpload]); 83 | 84 | // Scroll to bottom when messages change 85 | React.useEffect(() => { 86 | if (chatContainerRef.current) { 87 | setTimeout(() => { 88 | chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight; 89 | }, 50); 90 | } 91 | }, [messages]); 92 | 93 | // Lock body scrolling on mobile for a consistent experience across screens 94 | React.useEffect(() => { 95 | if (!isDesktop) { 96 | document.body.style.overflow = 'hidden'; 97 | document.body.style.position = 'fixed'; 98 | document.body.style.width = '100%'; 99 | } else { 100 | document.body.style.overflow = ''; 101 | document.body.style.position = ''; 102 | document.body.style.width = ''; 103 | } 104 | 105 | return () => { 106 | document.body.style.overflow = ''; 107 | document.body.style.position = ''; 108 | document.body.style.width = ''; 109 | }; 110 | }, [isDesktop]); 111 | 112 | // Drag and drop state 113 | const [dragActive, setDragActive] = React.useState(false); 114 | 115 | // Helper to scroll to bottom (for image onLoad) 116 | function scrollToBottom() { 117 | if (chatContainerRef.current) { 118 | setTimeout(() => { 119 | chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight; 120 | }, 50); 121 | } 122 | } 123 | 124 | // Drag and drop handlers for upload area 125 | function handleDrag(e) { 126 | e.preventDefault(); 127 | e.stopPropagation(); 128 | if (e.type === 'dragenter' || e.type === 'dragover') { 129 | setDragActive(true); 130 | } else if (e.type === 'dragleave') { 131 | setDragActive(false); 132 | } 133 | } 134 | 135 | function handleDrop(e) { 136 | e.preventDefault(); 137 | e.stopPropagation(); 138 | setDragActive(false); 139 | const files = e.dataTransfer.files; 140 | if (files && files[0] && files[0].type.startsWith('image/')) { 141 | handleFile(files[0]); 142 | } 143 | } 144 | 145 | // Handle file selection 146 | function handleFileSelect(e) { 147 | const file = e.target.files[0]; 148 | if (file) { 149 | handleFile(file); 150 | } 151 | } 152 | 153 | // Process uploaded file 154 | async function handleFile(file) { 155 | if (!file.type.startsWith('image/')) { 156 | alert('Please select a valid image file.'); 157 | return; 158 | } 159 | 160 | // Validate file size (10MB limit) 161 | const maxSize = 10 * 1024 * 1024; 162 | if (file.size > maxSize) { 163 | alert('Image file is too large. Please select an image under 10MB.'); 164 | return; 165 | } 166 | 167 | try { 168 | // Scale down the image to 1 megapixel 169 | const scaledBlob = await scaleImageTo1Megapixel(file); 170 | const url = URL.createObjectURL(scaledBlob); 171 | 172 | // Add initial messages 173 | setMessages([ 174 | { type: 'image', image: url, imageBlob: scaledBlob, from: 'assistant', id: Date.now() }, 175 | { type: 'text', text: 'Image uploaded! How would you like to edit it?', from: 'system', id: Date.now() + 1 } 176 | ]); 177 | 178 | // Switch to chat mode 179 | setShowUpload(false); 180 | } catch (error) { 181 | alert('Failed to process image: ' + error.message); 182 | } 183 | } 184 | 185 | // Handle click on starter image 186 | async function handleStarterImageClick(starter) { 187 | // Fetch the image as a blob so it behaves like uploaded images 188 | try { 189 | setLoading(true); 190 | const res = await fetch(starter.imageUrl); 191 | const blob = await res.blob(); 192 | // Add image as first message 193 | setMessages([ 194 | { type: 'image', image: starter.imageUrl, imageBlob: blob, from: 'assistant', id: Date.now() }, 195 | { type: 'text', text: "Image loaded! Tell me how you'd like to edit it.", from: 'system', id: Date.now() + 1 } 196 | ]); 197 | setShowUpload(false); 198 | setInput(starter.suggestedPrompt || ''); 199 | setStarterUsed(true); 200 | } catch (err) { 201 | alert('Failed to load starter image.'); 202 | } finally { 203 | setLoading(false); 204 | } 205 | } 206 | 207 | // Helper function to convert blob to data URL 208 | function blobToDataUrl(blob) { 209 | return new Promise((resolve, reject) => { 210 | const reader = new FileReader(); 211 | reader.onload = () => resolve(reader.result); 212 | reader.onerror = reject; 213 | reader.readAsDataURL(blob); 214 | }); 215 | } 216 | 217 | // Get the most recent image from the chat 218 | function getLastImageBlob() { 219 | for (let i = messages.length - 1; i >= 0; i--) { 220 | if (messages[i].type === 'image' && messages[i].imageBlob) { 221 | return messages[i].imageBlob; 222 | } 223 | } 224 | return null; 225 | } 226 | 227 | // Scale image function 228 | async function scaleImageTo1Megapixel(file) { 229 | return new Promise((resolve, reject) => { 230 | const img = new Image(); 231 | const canvas = document.createElement('canvas'); 232 | const ctx = canvas.getContext('2d'); 233 | 234 | img.onload = () => { 235 | const originalWidth = img.width; 236 | const originalHeight = img.height; 237 | const originalPixels = originalWidth * originalHeight; 238 | const targetPixels = 1000000; 239 | 240 | let newWidth, newHeight; 241 | 242 | if (originalPixels <= targetPixels) { 243 | newWidth = originalWidth; 244 | newHeight = originalHeight; 245 | } else { 246 | const scaleFactor = Math.sqrt(targetPixels / originalPixels); 247 | newWidth = Math.round(originalWidth * scaleFactor); 248 | newHeight = Math.round(originalHeight * scaleFactor); 249 | } 250 | 251 | canvas.width = newWidth; 252 | canvas.height = newHeight; 253 | ctx.drawImage(img, 0, 0, newWidth, newHeight); 254 | 255 | canvas.toBlob((blob) => { 256 | if (blob) { 257 | resolve(blob); 258 | } else { 259 | reject(new Error('Failed to create scaled image')); 260 | } 261 | }, 'image/jpeg', 0.9); 262 | }; 263 | 264 | img.onerror = () => { 265 | reject(new Error('Failed to load image')); 266 | }; 267 | 268 | img.src = URL.createObjectURL(file); 269 | }); 270 | } 271 | 272 | // Reset to upload mode 273 | function resetApp() { 274 | if (abortController) { 275 | abortController.abort(); 276 | } 277 | setShowUpload(true); 278 | setMessages([]); 279 | setInput(''); 280 | setPredictionId(null); 281 | setAbortController(null); 282 | setLoading(false); 283 | setStarterUsed(false); 284 | if (fileInputRef.current) { 285 | fileInputRef.current.value = ''; 286 | } 287 | } 288 | 289 | // Handle sending a message 290 | const handleSend = async (e) => { 291 | e.preventDefault(); 292 | const lastImageBlob = getLastImageBlob(); 293 | if (!input.trim() || loading || !lastImageBlob || !replicateToken) return; 294 | 295 | const userMsg = { type: 'text', text: input, from: 'user', id: Date.now() }; 296 | setMessages(prev => [...prev, userMsg]); 297 | setInput(''); 298 | setLoading(true); 299 | 300 | // Add loading message 301 | const loadingMsg = { type: 'loading', from: 'assistant', id: Date.now() + 1 }; 302 | setMessages(prev => [...prev, loadingMsg]); 303 | 304 | try { 305 | // Create abort controller for this request 306 | const controller = new AbortController(); 307 | setAbortController(controller); 308 | 309 | // Convert blob to data URL for the API 310 | console.log('Converting blob to data URL...'); 311 | const imageDataUrl = await blobToDataUrl(lastImageBlob); 312 | console.log('Image data URL length:', imageDataUrl.length); 313 | 314 | console.log('Sending request to /generate-image...'); 315 | const requestBody = { 316 | prompt: input, 317 | input_image: imageDataUrl 318 | }; 319 | console.log('Request body size:', JSON.stringify(requestBody).length); 320 | 321 | const res = await fetch('/generate-image', { 322 | method: 'POST', 323 | headers: { 'Content-Type': 'application/json', 'X-Replicate-Api-Token': replicateToken }, 324 | body: JSON.stringify(requestBody), 325 | signal: controller.signal 326 | }); 327 | 328 | console.log('Response status:', res.status); 329 | console.log('Response headers:', Object.fromEntries(res.headers.entries())); 330 | 331 | if (!res.ok) { 332 | const errorText = await res.text(); 333 | console.error('Error response body:', errorText); 334 | throw new Error(`HTTP ${res.status}: ${errorText}`); 335 | } 336 | 337 | // The response is now JSON with the Cloudflare Images URL 338 | const result = await res.json(); 339 | console.log('Response result:', result); 340 | 341 | if (result.error) { 342 | throw new Error(result.error); 343 | } 344 | 345 | const imageUrl = result.imageUrl; 346 | console.log('Cloudflare Images URL:', imageUrl); 347 | 348 | // Fetch the image to create a blob for local storage/UI purposes 349 | const imageResponse = await fetch(imageUrl); 350 | const imageBlob = await imageResponse.blob(); 351 | console.log('Image blob size:', imageBlob.size); 352 | 353 | // Replace loading with image (store blob in message) 354 | setMessages(prev => prev.map(msg => 355 | msg.type === 'loading' ? 356 | { type: 'image', image: imageUrl, imageBlob: imageBlob, from: 'assistant', id: msg.id } : 357 | msg 358 | )); 359 | 360 | // Add delete button to user message 361 | setMessages(prev => prev.map(msg => 362 | msg.id === userMsg.id ? { ...msg, showDelete: true } : msg 363 | )); 364 | 365 | } catch (err) { 366 | // Don't show error if request was aborted (cancelled) 367 | if (err.name !== 'AbortError') { 368 | setMessages(prev => prev.filter(msg => msg.type !== 'loading')); 369 | setMessages(prev => [...prev, { 370 | type: 'text', 371 | text: 'Sorry, there was an error generating the image: ' + err.message, 372 | from: 'assistant', 373 | id: Date.now() 374 | }]); 375 | } else { 376 | console.log('Request was cancelled'); 377 | setMessages(prev => prev.filter(msg => msg.type !== 'loading')); 378 | } 379 | } finally { 380 | setLoading(false); 381 | setPredictionId(null); 382 | setAbortController(null); 383 | } 384 | }; 385 | 386 | // Cancel generation 387 | function cancelGeneration() { 388 | console.log('Cancel generation called'); 389 | 390 | // Abort the ongoing request 391 | if (abortController) { 392 | console.log('Aborting request...'); 393 | abortController.abort(); 394 | setAbortController(null); 395 | } 396 | 397 | // Stop loading 398 | setLoading(false); 399 | setPredictionId(null); 400 | 401 | // Find the most recent user message to restore to input 402 | const currentMessages = [...messages]; 403 | const lastUserMessage = currentMessages.slice().reverse().find(msg => msg.from === 'user' && msg.type === 'text'); 404 | console.log('Last user message:', lastUserMessage); 405 | 406 | // Remove loading message and the most recent user message 407 | // This automatically makes the previous image the "last image" again 408 | setMessages(prev => { 409 | const filtered = prev.filter(msg => 410 | msg.type !== 'loading' && 411 | !(lastUserMessage && msg.from === 'user' && msg.type === 'text' && msg.id === lastUserMessage.id) 412 | ); 413 | console.log('Messages after cancel:', filtered.length); 414 | return filtered; 415 | }); 416 | 417 | // Restore the cancelled message to input 418 | if (lastUserMessage) { 419 | setTimeout(() => { 420 | console.log('Restoring text to input:', lastUserMessage.text); 421 | setInput(lastUserMessage.text); 422 | }, 50); 423 | } 424 | } 425 | 426 | // Delete message and all subsequent messages 427 | function deleteFromMessage(messageId) { 428 | const messageIndex = messages.findIndex(msg => msg.id === messageId); 429 | if (messageIndex === -1) return; 430 | 431 | // Keep messages up to the clicked message (excluding it) 432 | const remainingMessages = messages.slice(0, messageIndex); 433 | setMessages(remainingMessages); 434 | 435 | // No need to set current image - getLastImageBlob will find it automatically 436 | } 437 | 438 | // No longer needed - state is derived from chat messages 439 | 440 | // Handle image click for full screen 441 | function handleImageClick(imageUrl) { 442 | window.open(imageUrl, '_blank'); 443 | } 444 | 445 | // Attach drag events when in upload mode 446 | React.useEffect(() => { 447 | if (showUpload) { 448 | window.addEventListener('dragenter', handleDrag); 449 | window.addEventListener('dragover', handleDrag); 450 | window.addEventListener('dragleave', handleDrag); 451 | window.addEventListener('drop', handleDrop); 452 | return () => { 453 | window.removeEventListener('dragenter', handleDrag); 454 | window.removeEventListener('dragover', handleDrag); 455 | window.removeEventListener('dragleave', handleDrag); 456 | window.removeEventListener('drop', handleDrop); 457 | }; 458 | } 459 | }, [showUpload]); 460 | 461 | React.useEffect(() => { 462 | if (!replicateToken) { 463 | setShowTokenModal(true); 464 | } else { 465 | setShowTokenModal(false); 466 | } 467 | }, [replicateToken]); 468 | 469 | function handleTokenSubmit(e) { 470 | e.preventDefault(); 471 | if (!tokenInput.trim()) { 472 | setTokenError('Please enter your Replicate API token.'); 473 | return; 474 | } 475 | localStorage.setItem('replicateApiToken', tokenInput.trim()); 476 | setReplicateToken(tokenInput.trim()); 477 | setShowTokenModal(false); 478 | setTokenInput(''); 479 | setTokenError(''); 480 | } 481 | 482 | function handleTokenLogout() { 483 | localStorage.removeItem('replicateApiToken'); 484 | setReplicateToken(''); 485 | setShowTokenModal(true); 486 | } 487 | 488 | return ( 489 |To use Kontext Chat, you'll need a Replicate API token.
497 | Create a token here and paste it below.
498 |
535 | Chat with images to edit them. 536 |
537 |Drag and drop an image here, or click to browse
553 | 560 |586 | Kontext Chat is powered by Flux Kontext Pro, a new image model from Black Forest Labs, running on Replicate. The app is built with Hono and React, running on Cloudflare Workers. Learn how to build your own app by taking a look at the source code on GitHub. 587 |
588 |