├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src └── index.js └── wrangler.jsonc /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | dashboard.json 132 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false, 4 | "trailingComma": "all", 5 | "tabWidth": 2, 6 | "printWidth": 120 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Jonas 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Logpush to Grafana Loki Endpoint 2 | 3 | [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/pew/cloudflare-worker-logpush-loki) 4 | 5 | - [Logpush to Grafana Loki Endpoint](#logpush-to-grafana-loki-endpoint) 6 | - [Create the Worker](#create-the-worker) 7 | - [Logpush](#logpush) 8 | - [Get Log Fields](#get-log-fields) 9 | - [Create Logpush Job](#create-logpush-job) 10 | - [Debugging](#debugging) 11 | - [Todo / Improvements](#todo--improvements) 12 | 13 | You can configure Cloudflare Logpush to send Logs to any [HTTP destination](https://developers.cloudflare.com/logs/get-started/enable-destinations/http/), so let's send some logs to [Grafana Loki](https://grafana.com/oss/loki/). 14 | 15 | This Worker takes the incoming Logpush JSON Format and transforms it into something Loki understands: 16 | 17 | - take incoming gzipped Logpush data, unpack it 18 | - merge all fields into the Loki API format and send it off to the destination 19 | - profit 20 | 21 | ## Create the Worker 22 | 23 | - clone this repo 24 | - update `wrangler.jsonc` to point to your Grafana Loki HTTP Endpoint 25 | - feel free to make other adjustments in `wrangler.jsonc` to your liking 26 | - deploy the worker: 27 | 28 | ```shell 29 | npm run deploy 30 | ``` 31 | 32 | Note down the returned URL to create the actual logpush job. 33 | 34 | ## Logpush 35 | 36 | - You can configure Cloudflare Logpush through the Dashboard or API. 37 | 38 | ### Get Log Fields 39 | 40 | First, get all the available log fields for your zone. To do this, get your Zone ID from the Cloudflare Dashboard and generate an API Key. Replace `` and `your-token-here` in the following command: 41 | 42 | ```shell 43 | curl -s "https://api.cloudflare.com/client/v4/zones//logpush/datasets/http_requests/fields" -H "Authorization: Bearer your-token-here" -H 'Content-Type: application/json' | jq -r '.result|keys[]'|tr '\n' ',' | sed 's/,$/\n/' 44 | ``` 45 | 46 | You should see a comma separated list of available fields you can send to your destination 47 | 48 | ``` 49 | BotScore,BotScoreSrc,BotTags,CacheCacheStatus,CacheReserveUsed,CacheResponseBytes,CacheResponseStatus,CacheTieredFill,ClientASN,ClientCountry,ClientDeviceType,ClientIP,ClientIPClass,ClientMTLSAuthCertFingerprint,ClientMTLSAuthStatus,ClientRequestBytes,ClientRequestHost,ClientRequestMethod,ClientRequestPath,ClientRequestProtocol,ClientRequestReferer,ClientRequestScheme,ClientRequestSource,ClientRequestURI,ClientRequestUserAgent,ClientSSLCipher,ClientSSLProtocol,ClientSrcPort,ClientTCPRTTMs,ClientXRequestedWith,Cookies,EdgeCFConnectingO2O,EdgeColoCode,EdgeColoID,EdgeEndTimestamp,EdgePathingOp,EdgePathingSrc,EdgePathingStatus,EdgeRateLimitAction,EdgeRateLimitID,EdgeRequestHost,EdgeResponseBodyBytes,EdgeResponseBytes,EdgeResponseCompressionRatio,EdgeResponseContentType,EdgeResponseStatus,EdgeServerIP,EdgeStartTimestamp,EdgeTimeToFirstByteMs,FirewallMatchesActions,FirewallMatchesRuleIDs,FirewallMatchesSources,JA3Hash,OriginDNSResponseTimeMs,OriginIP,OriginRequestHeaderSendDurationMs,OriginResponseBytes,OriginResponseDurationMs,OriginResponseHTTPExpires,OriginResponseHTTPLastModified,OriginResponseHeaderReceiveDurationMs,OriginResponseStatus,OriginResponseTime,OriginSSLProtocol,OriginTCPHandshakeDurationMs,OriginTLSHandshakeDurationMs,ParentRayID,RayID,RequestHeaders,ResponseHeaders,SecurityLevel,SmartRouteColoID,UpperTierColoID,WAFAction,WAFFlags,WAFMatchedVar,WAFProfile,WAFRuleID,WAFRuleMessage,WorkerCPUTime,WorkerStatus,WorkerSubrequest,WorkerSubrequestCount,WorkerWallTimeUs,ZoneID,ZoneName 50 | ``` 51 | 52 | ### Create Logpush Job 53 | 54 | Here's a curl request to create a Logpush Job with a lot of included fields already. You might want to update the `fields=` field below with the output from above. Please keep the `×tamps=unixnano`: 55 | 56 | ``` 57 | curl --location --request POST 'https://api.cloudflare.com/client/v4/zones//logpush/jobs' \ 58 | --header 'X-Auth-Email: you@example.com' \ 59 | --header 'X-Auth-Key: abcSecretAPIKey' \ 60 | --header 'Content-Type: application/json' \ 61 | --data-raw '{ 62 | "name": "http", 63 | "logpull_options": "fields=BotScore,BotScoreSrc,CacheCacheStatus,CacheResponseBytes,CacheResponseStatus,CacheTieredFill,ClientASN,ClientCountry,ClientDeviceType,ClientIP,ClientIPClass,ClientRequestBytes,ClientRequestHost,ClientRequestMethod,ClientRequestPath,ClientRequestProtocol,ClientRequestReferer,ClientRequestURI,ClientRequestUserAgent,ClientSSLCipher,ClientSSLProtocol,ClientSrcPort,ClientXRequestedWith,EdgeColoCode,EdgeColoID,EdgeEndTimestamp,EdgePathingOp,EdgePathingSrc,EdgePathingStatus,EdgeRateLimitAction,EdgeRateLimitID,EdgeRequestHost,EdgeResponseBytes,EdgeResponseCompressionRatio,EdgeResponseContentType,EdgeResponseStatus,EdgeServerIP,EdgeStartTimestamp,FirewallMatchesActions,FirewallMatchesRuleIDs,FirewallMatchesSources,OriginIP,OriginResponseBytes,OriginResponseHTTPExpires,OriginResponseHTTPLastModified,OriginResponseStatus,OriginResponseTime,OriginSSLProtocol,ParentRayID,RayID,SecurityLevel,WAFAction,WAFFlags,WAFMatchedVar,WAFProfile,WAFRuleID,WAFRuleMessage,WorkerCPUTime,WorkerStatus,WorkerSubrequest,WorkerSubrequestCount,ZoneID×tamps=unixnano", 64 | "destination_conf": "https://your.example.workers.dev?header_Authorization=Basic%20dXNlcm5hbWU6cGFzc3dvcmQK&job=lokiJobName", 65 | "max_upload_bytes": 5000000, 66 | "max_upload_records": 1000, 67 | "dataset": "http_requests", 68 | "frequency": "high", 69 | "enabled": true 70 | }' 71 | ``` 72 | 73 | - please make sure to update the following fields in the curl request above: 74 | - your own zone id instead of `` 75 | - your own **API Key** and/or E-Mail and Global API Key 76 | - You might want to update the `logpull_options` (check API Docs) 77 | - **destination_conf** enter your own workers domain in there, but **keep** the `?header_Authorization=Basic%20`, just update the `Authorization` header with your own username and password 78 | - Update the **job** query string to the stream name you want to see in Grafana later on. 79 | 80 | If everything went according to plan, you should see your new Logpush Job in [the Analytics => Log tab](https://dash.cloudflare.com/?to=/:account/:zone/analytics/logs) as well as in Grafana Loki. This is how it could look like. 81 | 82 | ## Debugging 83 | 84 | The initial creation of the logpush job will push one json line to Loki, you should see something along the lines: 85 | 86 | ``` 87 | {"content": "test", "filename": "test.txt"} 88 | ``` 89 | 90 | in your Loki logs. 91 | 92 | ## Todo / Improvements 93 | 94 | - Create some nice sample Dashboards to make sense out of the data 95 | - Error Handling 🤷‍♂️ 96 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare-worker-loki", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "cloudflare-worker-loki", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "pako": "^2.1.0" 12 | }, 13 | "devDependencies": { 14 | "prettier": "^3.5.3", 15 | "wrangler": "4.14.4" 16 | } 17 | }, 18 | "node_modules/@cloudflare/kv-asset-handler": { 19 | "version": "0.4.0", 20 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", 21 | "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", 22 | "dev": true, 23 | "license": "MIT OR Apache-2.0", 24 | "dependencies": { 25 | "mime": "^3.0.0" 26 | }, 27 | "engines": { 28 | "node": ">=18.0.0" 29 | } 30 | }, 31 | "node_modules/@cloudflare/unenv-preset": { 32 | "version": "2.3.1", 33 | "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.3.1.tgz", 34 | "integrity": "sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==", 35 | "dev": true, 36 | "license": "MIT OR Apache-2.0", 37 | "peerDependencies": { 38 | "unenv": "2.0.0-rc.15", 39 | "workerd": "^1.20250320.0" 40 | }, 41 | "peerDependenciesMeta": { 42 | "workerd": { 43 | "optional": true 44 | } 45 | } 46 | }, 47 | "node_modules/@cloudflare/workerd-darwin-64": { 48 | "version": "1.20250507.0", 49 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250507.0.tgz", 50 | "integrity": "sha512-xC+8hmQuOUUNCVT9DWpLMfxhR4Xs4kI8v7Bkybh4pzGC85moH6fMfCBNaP0YQCNAA/BR56aL/AwfvMVGskTK/A==", 51 | "cpu": [ 52 | "x64" 53 | ], 54 | "dev": true, 55 | "license": "Apache-2.0", 56 | "optional": true, 57 | "os": [ 58 | "darwin" 59 | ], 60 | "engines": { 61 | "node": ">=16" 62 | } 63 | }, 64 | "node_modules/@cloudflare/workerd-darwin-arm64": { 65 | "version": "1.20250507.0", 66 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250507.0.tgz", 67 | "integrity": "sha512-Oynff5H8yM4trfUFaKdkOvPV3jac8mg7QC19ILZluCVgLx/JGEVLEJ7do1Na9rLqV8CK4gmUXPrUMX7uerhQgg==", 68 | "cpu": [ 69 | "arm64" 70 | ], 71 | "dev": true, 72 | "license": "Apache-2.0", 73 | "optional": true, 74 | "os": [ 75 | "darwin" 76 | ], 77 | "engines": { 78 | "node": ">=16" 79 | } 80 | }, 81 | "node_modules/@cloudflare/workerd-linux-64": { 82 | "version": "1.20250507.0", 83 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250507.0.tgz", 84 | "integrity": "sha512-/HAA+Zg/R7Q/Smyl835FUFKjotZN1UzN9j/BHBd0xKmKov97QkXAX8gsyGnyKqRReIOinp8x/8+UebTICR7VJw==", 85 | "cpu": [ 86 | "x64" 87 | ], 88 | "dev": true, 89 | "license": "Apache-2.0", 90 | "optional": true, 91 | "os": [ 92 | "linux" 93 | ], 94 | "engines": { 95 | "node": ">=16" 96 | } 97 | }, 98 | "node_modules/@cloudflare/workerd-linux-arm64": { 99 | "version": "1.20250507.0", 100 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250507.0.tgz", 101 | "integrity": "sha512-NMPibSdOYeycU0IrKkgOESFJQy7dEpHvuatZxQxlT+mIQK0INzI3irp2kKxhF99s25kPC4p+xg9bU3ugTrs3VQ==", 102 | "cpu": [ 103 | "arm64" 104 | ], 105 | "dev": true, 106 | "license": "Apache-2.0", 107 | "optional": true, 108 | "os": [ 109 | "linux" 110 | ], 111 | "engines": { 112 | "node": ">=16" 113 | } 114 | }, 115 | "node_modules/@cloudflare/workerd-windows-64": { 116 | "version": "1.20250507.0", 117 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250507.0.tgz", 118 | "integrity": "sha512-c91fhNP8ufycdIDqjVyKTqeb4ewkbAYXFQbLreMVgh4LLQQPDDEte8wCdmaFy5bIL0M9d85PpdCq51RCzq/FaQ==", 119 | "cpu": [ 120 | "x64" 121 | ], 122 | "dev": true, 123 | "license": "Apache-2.0", 124 | "optional": true, 125 | "os": [ 126 | "win32" 127 | ], 128 | "engines": { 129 | "node": ">=16" 130 | } 131 | }, 132 | "node_modules/@cspotcode/source-map-support": { 133 | "version": "0.8.1", 134 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 135 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 136 | "dev": true, 137 | "license": "MIT", 138 | "dependencies": { 139 | "@jridgewell/trace-mapping": "0.3.9" 140 | }, 141 | "engines": { 142 | "node": ">=12" 143 | } 144 | }, 145 | "node_modules/@emnapi/runtime": { 146 | "version": "1.4.3", 147 | "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", 148 | "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", 149 | "dev": true, 150 | "license": "MIT", 151 | "optional": true, 152 | "dependencies": { 153 | "tslib": "^2.4.0" 154 | } 155 | }, 156 | "node_modules/@esbuild/aix-ppc64": { 157 | "version": "0.25.4", 158 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 159 | "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 160 | "cpu": [ 161 | "ppc64" 162 | ], 163 | "dev": true, 164 | "license": "MIT", 165 | "optional": true, 166 | "os": [ 167 | "aix" 168 | ], 169 | "engines": { 170 | "node": ">=18" 171 | } 172 | }, 173 | "node_modules/@esbuild/android-arm": { 174 | "version": "0.25.4", 175 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 176 | "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 177 | "cpu": [ 178 | "arm" 179 | ], 180 | "dev": true, 181 | "license": "MIT", 182 | "optional": true, 183 | "os": [ 184 | "android" 185 | ], 186 | "engines": { 187 | "node": ">=18" 188 | } 189 | }, 190 | "node_modules/@esbuild/android-arm64": { 191 | "version": "0.25.4", 192 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 193 | "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 194 | "cpu": [ 195 | "arm64" 196 | ], 197 | "dev": true, 198 | "license": "MIT", 199 | "optional": true, 200 | "os": [ 201 | "android" 202 | ], 203 | "engines": { 204 | "node": ">=18" 205 | } 206 | }, 207 | "node_modules/@esbuild/android-x64": { 208 | "version": "0.25.4", 209 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 210 | "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 211 | "cpu": [ 212 | "x64" 213 | ], 214 | "dev": true, 215 | "license": "MIT", 216 | "optional": true, 217 | "os": [ 218 | "android" 219 | ], 220 | "engines": { 221 | "node": ">=18" 222 | } 223 | }, 224 | "node_modules/@esbuild/darwin-arm64": { 225 | "version": "0.25.4", 226 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 227 | "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 228 | "cpu": [ 229 | "arm64" 230 | ], 231 | "dev": true, 232 | "license": "MIT", 233 | "optional": true, 234 | "os": [ 235 | "darwin" 236 | ], 237 | "engines": { 238 | "node": ">=18" 239 | } 240 | }, 241 | "node_modules/@esbuild/darwin-x64": { 242 | "version": "0.25.4", 243 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 244 | "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 245 | "cpu": [ 246 | "x64" 247 | ], 248 | "dev": true, 249 | "license": "MIT", 250 | "optional": true, 251 | "os": [ 252 | "darwin" 253 | ], 254 | "engines": { 255 | "node": ">=18" 256 | } 257 | }, 258 | "node_modules/@esbuild/freebsd-arm64": { 259 | "version": "0.25.4", 260 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 261 | "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 262 | "cpu": [ 263 | "arm64" 264 | ], 265 | "dev": true, 266 | "license": "MIT", 267 | "optional": true, 268 | "os": [ 269 | "freebsd" 270 | ], 271 | "engines": { 272 | "node": ">=18" 273 | } 274 | }, 275 | "node_modules/@esbuild/freebsd-x64": { 276 | "version": "0.25.4", 277 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 278 | "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 279 | "cpu": [ 280 | "x64" 281 | ], 282 | "dev": true, 283 | "license": "MIT", 284 | "optional": true, 285 | "os": [ 286 | "freebsd" 287 | ], 288 | "engines": { 289 | "node": ">=18" 290 | } 291 | }, 292 | "node_modules/@esbuild/linux-arm": { 293 | "version": "0.25.4", 294 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 295 | "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 296 | "cpu": [ 297 | "arm" 298 | ], 299 | "dev": true, 300 | "license": "MIT", 301 | "optional": true, 302 | "os": [ 303 | "linux" 304 | ], 305 | "engines": { 306 | "node": ">=18" 307 | } 308 | }, 309 | "node_modules/@esbuild/linux-arm64": { 310 | "version": "0.25.4", 311 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 312 | "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 313 | "cpu": [ 314 | "arm64" 315 | ], 316 | "dev": true, 317 | "license": "MIT", 318 | "optional": true, 319 | "os": [ 320 | "linux" 321 | ], 322 | "engines": { 323 | "node": ">=18" 324 | } 325 | }, 326 | "node_modules/@esbuild/linux-ia32": { 327 | "version": "0.25.4", 328 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 329 | "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 330 | "cpu": [ 331 | "ia32" 332 | ], 333 | "dev": true, 334 | "license": "MIT", 335 | "optional": true, 336 | "os": [ 337 | "linux" 338 | ], 339 | "engines": { 340 | "node": ">=18" 341 | } 342 | }, 343 | "node_modules/@esbuild/linux-loong64": { 344 | "version": "0.25.4", 345 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 346 | "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 347 | "cpu": [ 348 | "loong64" 349 | ], 350 | "dev": true, 351 | "license": "MIT", 352 | "optional": true, 353 | "os": [ 354 | "linux" 355 | ], 356 | "engines": { 357 | "node": ">=18" 358 | } 359 | }, 360 | "node_modules/@esbuild/linux-mips64el": { 361 | "version": "0.25.4", 362 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 363 | "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 364 | "cpu": [ 365 | "mips64el" 366 | ], 367 | "dev": true, 368 | "license": "MIT", 369 | "optional": true, 370 | "os": [ 371 | "linux" 372 | ], 373 | "engines": { 374 | "node": ">=18" 375 | } 376 | }, 377 | "node_modules/@esbuild/linux-ppc64": { 378 | "version": "0.25.4", 379 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 380 | "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 381 | "cpu": [ 382 | "ppc64" 383 | ], 384 | "dev": true, 385 | "license": "MIT", 386 | "optional": true, 387 | "os": [ 388 | "linux" 389 | ], 390 | "engines": { 391 | "node": ">=18" 392 | } 393 | }, 394 | "node_modules/@esbuild/linux-riscv64": { 395 | "version": "0.25.4", 396 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 397 | "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 398 | "cpu": [ 399 | "riscv64" 400 | ], 401 | "dev": true, 402 | "license": "MIT", 403 | "optional": true, 404 | "os": [ 405 | "linux" 406 | ], 407 | "engines": { 408 | "node": ">=18" 409 | } 410 | }, 411 | "node_modules/@esbuild/linux-s390x": { 412 | "version": "0.25.4", 413 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 414 | "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 415 | "cpu": [ 416 | "s390x" 417 | ], 418 | "dev": true, 419 | "license": "MIT", 420 | "optional": true, 421 | "os": [ 422 | "linux" 423 | ], 424 | "engines": { 425 | "node": ">=18" 426 | } 427 | }, 428 | "node_modules/@esbuild/linux-x64": { 429 | "version": "0.25.4", 430 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 431 | "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 432 | "cpu": [ 433 | "x64" 434 | ], 435 | "dev": true, 436 | "license": "MIT", 437 | "optional": true, 438 | "os": [ 439 | "linux" 440 | ], 441 | "engines": { 442 | "node": ">=18" 443 | } 444 | }, 445 | "node_modules/@esbuild/netbsd-arm64": { 446 | "version": "0.25.4", 447 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 448 | "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 449 | "cpu": [ 450 | "arm64" 451 | ], 452 | "dev": true, 453 | "license": "MIT", 454 | "optional": true, 455 | "os": [ 456 | "netbsd" 457 | ], 458 | "engines": { 459 | "node": ">=18" 460 | } 461 | }, 462 | "node_modules/@esbuild/netbsd-x64": { 463 | "version": "0.25.4", 464 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 465 | "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 466 | "cpu": [ 467 | "x64" 468 | ], 469 | "dev": true, 470 | "license": "MIT", 471 | "optional": true, 472 | "os": [ 473 | "netbsd" 474 | ], 475 | "engines": { 476 | "node": ">=18" 477 | } 478 | }, 479 | "node_modules/@esbuild/openbsd-arm64": { 480 | "version": "0.25.4", 481 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 482 | "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 483 | "cpu": [ 484 | "arm64" 485 | ], 486 | "dev": true, 487 | "license": "MIT", 488 | "optional": true, 489 | "os": [ 490 | "openbsd" 491 | ], 492 | "engines": { 493 | "node": ">=18" 494 | } 495 | }, 496 | "node_modules/@esbuild/openbsd-x64": { 497 | "version": "0.25.4", 498 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 499 | "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 500 | "cpu": [ 501 | "x64" 502 | ], 503 | "dev": true, 504 | "license": "MIT", 505 | "optional": true, 506 | "os": [ 507 | "openbsd" 508 | ], 509 | "engines": { 510 | "node": ">=18" 511 | } 512 | }, 513 | "node_modules/@esbuild/sunos-x64": { 514 | "version": "0.25.4", 515 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 516 | "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 517 | "cpu": [ 518 | "x64" 519 | ], 520 | "dev": true, 521 | "license": "MIT", 522 | "optional": true, 523 | "os": [ 524 | "sunos" 525 | ], 526 | "engines": { 527 | "node": ">=18" 528 | } 529 | }, 530 | "node_modules/@esbuild/win32-arm64": { 531 | "version": "0.25.4", 532 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 533 | "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 534 | "cpu": [ 535 | "arm64" 536 | ], 537 | "dev": true, 538 | "license": "MIT", 539 | "optional": true, 540 | "os": [ 541 | "win32" 542 | ], 543 | "engines": { 544 | "node": ">=18" 545 | } 546 | }, 547 | "node_modules/@esbuild/win32-ia32": { 548 | "version": "0.25.4", 549 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 550 | "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 551 | "cpu": [ 552 | "ia32" 553 | ], 554 | "dev": true, 555 | "license": "MIT", 556 | "optional": true, 557 | "os": [ 558 | "win32" 559 | ], 560 | "engines": { 561 | "node": ">=18" 562 | } 563 | }, 564 | "node_modules/@esbuild/win32-x64": { 565 | "version": "0.25.4", 566 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 567 | "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 568 | "cpu": [ 569 | "x64" 570 | ], 571 | "dev": true, 572 | "license": "MIT", 573 | "optional": true, 574 | "os": [ 575 | "win32" 576 | ], 577 | "engines": { 578 | "node": ">=18" 579 | } 580 | }, 581 | "node_modules/@fastify/busboy": { 582 | "version": "2.1.1", 583 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 584 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 585 | "dev": true, 586 | "license": "MIT", 587 | "engines": { 588 | "node": ">=14" 589 | } 590 | }, 591 | "node_modules/@img/sharp-darwin-arm64": { 592 | "version": "0.33.5", 593 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", 594 | "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", 595 | "cpu": [ 596 | "arm64" 597 | ], 598 | "dev": true, 599 | "license": "Apache-2.0", 600 | "optional": true, 601 | "os": [ 602 | "darwin" 603 | ], 604 | "engines": { 605 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 606 | }, 607 | "funding": { 608 | "url": "https://opencollective.com/libvips" 609 | }, 610 | "optionalDependencies": { 611 | "@img/sharp-libvips-darwin-arm64": "1.0.4" 612 | } 613 | }, 614 | "node_modules/@img/sharp-darwin-x64": { 615 | "version": "0.33.5", 616 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", 617 | "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", 618 | "cpu": [ 619 | "x64" 620 | ], 621 | "dev": true, 622 | "license": "Apache-2.0", 623 | "optional": true, 624 | "os": [ 625 | "darwin" 626 | ], 627 | "engines": { 628 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 629 | }, 630 | "funding": { 631 | "url": "https://opencollective.com/libvips" 632 | }, 633 | "optionalDependencies": { 634 | "@img/sharp-libvips-darwin-x64": "1.0.4" 635 | } 636 | }, 637 | "node_modules/@img/sharp-libvips-darwin-arm64": { 638 | "version": "1.0.4", 639 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", 640 | "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", 641 | "cpu": [ 642 | "arm64" 643 | ], 644 | "dev": true, 645 | "license": "LGPL-3.0-or-later", 646 | "optional": true, 647 | "os": [ 648 | "darwin" 649 | ], 650 | "funding": { 651 | "url": "https://opencollective.com/libvips" 652 | } 653 | }, 654 | "node_modules/@img/sharp-libvips-darwin-x64": { 655 | "version": "1.0.4", 656 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", 657 | "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", 658 | "cpu": [ 659 | "x64" 660 | ], 661 | "dev": true, 662 | "license": "LGPL-3.0-or-later", 663 | "optional": true, 664 | "os": [ 665 | "darwin" 666 | ], 667 | "funding": { 668 | "url": "https://opencollective.com/libvips" 669 | } 670 | }, 671 | "node_modules/@img/sharp-libvips-linux-arm": { 672 | "version": "1.0.5", 673 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", 674 | "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", 675 | "cpu": [ 676 | "arm" 677 | ], 678 | "dev": true, 679 | "license": "LGPL-3.0-or-later", 680 | "optional": true, 681 | "os": [ 682 | "linux" 683 | ], 684 | "funding": { 685 | "url": "https://opencollective.com/libvips" 686 | } 687 | }, 688 | "node_modules/@img/sharp-libvips-linux-arm64": { 689 | "version": "1.0.4", 690 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", 691 | "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", 692 | "cpu": [ 693 | "arm64" 694 | ], 695 | "dev": true, 696 | "license": "LGPL-3.0-or-later", 697 | "optional": true, 698 | "os": [ 699 | "linux" 700 | ], 701 | "funding": { 702 | "url": "https://opencollective.com/libvips" 703 | } 704 | }, 705 | "node_modules/@img/sharp-libvips-linux-s390x": { 706 | "version": "1.0.4", 707 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", 708 | "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", 709 | "cpu": [ 710 | "s390x" 711 | ], 712 | "dev": true, 713 | "license": "LGPL-3.0-or-later", 714 | "optional": true, 715 | "os": [ 716 | "linux" 717 | ], 718 | "funding": { 719 | "url": "https://opencollective.com/libvips" 720 | } 721 | }, 722 | "node_modules/@img/sharp-libvips-linux-x64": { 723 | "version": "1.0.4", 724 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", 725 | "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", 726 | "cpu": [ 727 | "x64" 728 | ], 729 | "dev": true, 730 | "license": "LGPL-3.0-or-later", 731 | "optional": true, 732 | "os": [ 733 | "linux" 734 | ], 735 | "funding": { 736 | "url": "https://opencollective.com/libvips" 737 | } 738 | }, 739 | "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 740 | "version": "1.0.4", 741 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", 742 | "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", 743 | "cpu": [ 744 | "arm64" 745 | ], 746 | "dev": true, 747 | "license": "LGPL-3.0-or-later", 748 | "optional": true, 749 | "os": [ 750 | "linux" 751 | ], 752 | "funding": { 753 | "url": "https://opencollective.com/libvips" 754 | } 755 | }, 756 | "node_modules/@img/sharp-libvips-linuxmusl-x64": { 757 | "version": "1.0.4", 758 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", 759 | "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", 760 | "cpu": [ 761 | "x64" 762 | ], 763 | "dev": true, 764 | "license": "LGPL-3.0-or-later", 765 | "optional": true, 766 | "os": [ 767 | "linux" 768 | ], 769 | "funding": { 770 | "url": "https://opencollective.com/libvips" 771 | } 772 | }, 773 | "node_modules/@img/sharp-linux-arm": { 774 | "version": "0.33.5", 775 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", 776 | "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", 777 | "cpu": [ 778 | "arm" 779 | ], 780 | "dev": true, 781 | "license": "Apache-2.0", 782 | "optional": true, 783 | "os": [ 784 | "linux" 785 | ], 786 | "engines": { 787 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 788 | }, 789 | "funding": { 790 | "url": "https://opencollective.com/libvips" 791 | }, 792 | "optionalDependencies": { 793 | "@img/sharp-libvips-linux-arm": "1.0.5" 794 | } 795 | }, 796 | "node_modules/@img/sharp-linux-arm64": { 797 | "version": "0.33.5", 798 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", 799 | "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", 800 | "cpu": [ 801 | "arm64" 802 | ], 803 | "dev": true, 804 | "license": "Apache-2.0", 805 | "optional": true, 806 | "os": [ 807 | "linux" 808 | ], 809 | "engines": { 810 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 811 | }, 812 | "funding": { 813 | "url": "https://opencollective.com/libvips" 814 | }, 815 | "optionalDependencies": { 816 | "@img/sharp-libvips-linux-arm64": "1.0.4" 817 | } 818 | }, 819 | "node_modules/@img/sharp-linux-s390x": { 820 | "version": "0.33.5", 821 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", 822 | "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", 823 | "cpu": [ 824 | "s390x" 825 | ], 826 | "dev": true, 827 | "license": "Apache-2.0", 828 | "optional": true, 829 | "os": [ 830 | "linux" 831 | ], 832 | "engines": { 833 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 834 | }, 835 | "funding": { 836 | "url": "https://opencollective.com/libvips" 837 | }, 838 | "optionalDependencies": { 839 | "@img/sharp-libvips-linux-s390x": "1.0.4" 840 | } 841 | }, 842 | "node_modules/@img/sharp-linux-x64": { 843 | "version": "0.33.5", 844 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", 845 | "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", 846 | "cpu": [ 847 | "x64" 848 | ], 849 | "dev": true, 850 | "license": "Apache-2.0", 851 | "optional": true, 852 | "os": [ 853 | "linux" 854 | ], 855 | "engines": { 856 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 857 | }, 858 | "funding": { 859 | "url": "https://opencollective.com/libvips" 860 | }, 861 | "optionalDependencies": { 862 | "@img/sharp-libvips-linux-x64": "1.0.4" 863 | } 864 | }, 865 | "node_modules/@img/sharp-linuxmusl-arm64": { 866 | "version": "0.33.5", 867 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", 868 | "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", 869 | "cpu": [ 870 | "arm64" 871 | ], 872 | "dev": true, 873 | "license": "Apache-2.0", 874 | "optional": true, 875 | "os": [ 876 | "linux" 877 | ], 878 | "engines": { 879 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 880 | }, 881 | "funding": { 882 | "url": "https://opencollective.com/libvips" 883 | }, 884 | "optionalDependencies": { 885 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" 886 | } 887 | }, 888 | "node_modules/@img/sharp-linuxmusl-x64": { 889 | "version": "0.33.5", 890 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", 891 | "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", 892 | "cpu": [ 893 | "x64" 894 | ], 895 | "dev": true, 896 | "license": "Apache-2.0", 897 | "optional": true, 898 | "os": [ 899 | "linux" 900 | ], 901 | "engines": { 902 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 903 | }, 904 | "funding": { 905 | "url": "https://opencollective.com/libvips" 906 | }, 907 | "optionalDependencies": { 908 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4" 909 | } 910 | }, 911 | "node_modules/@img/sharp-wasm32": { 912 | "version": "0.33.5", 913 | "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", 914 | "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", 915 | "cpu": [ 916 | "wasm32" 917 | ], 918 | "dev": true, 919 | "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", 920 | "optional": true, 921 | "dependencies": { 922 | "@emnapi/runtime": "^1.2.0" 923 | }, 924 | "engines": { 925 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 926 | }, 927 | "funding": { 928 | "url": "https://opencollective.com/libvips" 929 | } 930 | }, 931 | "node_modules/@img/sharp-win32-ia32": { 932 | "version": "0.33.5", 933 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", 934 | "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", 935 | "cpu": [ 936 | "ia32" 937 | ], 938 | "dev": true, 939 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 940 | "optional": true, 941 | "os": [ 942 | "win32" 943 | ], 944 | "engines": { 945 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 946 | }, 947 | "funding": { 948 | "url": "https://opencollective.com/libvips" 949 | } 950 | }, 951 | "node_modules/@img/sharp-win32-x64": { 952 | "version": "0.33.5", 953 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", 954 | "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", 955 | "cpu": [ 956 | "x64" 957 | ], 958 | "dev": true, 959 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 960 | "optional": true, 961 | "os": [ 962 | "win32" 963 | ], 964 | "engines": { 965 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 966 | }, 967 | "funding": { 968 | "url": "https://opencollective.com/libvips" 969 | } 970 | }, 971 | "node_modules/@jridgewell/resolve-uri": { 972 | "version": "3.1.2", 973 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 974 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 975 | "dev": true, 976 | "license": "MIT", 977 | "engines": { 978 | "node": ">=6.0.0" 979 | } 980 | }, 981 | "node_modules/@jridgewell/sourcemap-codec": { 982 | "version": "1.5.0", 983 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 984 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 985 | "dev": true, 986 | "license": "MIT" 987 | }, 988 | "node_modules/@jridgewell/trace-mapping": { 989 | "version": "0.3.9", 990 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 991 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 992 | "dev": true, 993 | "license": "MIT", 994 | "dependencies": { 995 | "@jridgewell/resolve-uri": "^3.0.3", 996 | "@jridgewell/sourcemap-codec": "^1.4.10" 997 | } 998 | }, 999 | "node_modules/acorn": { 1000 | "version": "8.14.0", 1001 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1002 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1003 | "dev": true, 1004 | "license": "MIT", 1005 | "bin": { 1006 | "acorn": "bin/acorn" 1007 | }, 1008 | "engines": { 1009 | "node": ">=0.4.0" 1010 | } 1011 | }, 1012 | "node_modules/acorn-walk": { 1013 | "version": "8.3.2", 1014 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 1015 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 1016 | "dev": true, 1017 | "license": "MIT", 1018 | "engines": { 1019 | "node": ">=0.4.0" 1020 | } 1021 | }, 1022 | "node_modules/as-table": { 1023 | "version": "1.0.55", 1024 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 1025 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 1026 | "dev": true, 1027 | "license": "MIT", 1028 | "dependencies": { 1029 | "printable-characters": "^1.0.42" 1030 | } 1031 | }, 1032 | "node_modules/blake3-wasm": { 1033 | "version": "2.1.5", 1034 | "dev": true, 1035 | "license": "MIT" 1036 | }, 1037 | "node_modules/color": { 1038 | "version": "4.2.3", 1039 | "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 1040 | "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 1041 | "dev": true, 1042 | "license": "MIT", 1043 | "optional": true, 1044 | "dependencies": { 1045 | "color-convert": "^2.0.1", 1046 | "color-string": "^1.9.0" 1047 | }, 1048 | "engines": { 1049 | "node": ">=12.5.0" 1050 | } 1051 | }, 1052 | "node_modules/color-convert": { 1053 | "version": "2.0.1", 1054 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1055 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1056 | "dev": true, 1057 | "license": "MIT", 1058 | "optional": true, 1059 | "dependencies": { 1060 | "color-name": "~1.1.4" 1061 | }, 1062 | "engines": { 1063 | "node": ">=7.0.0" 1064 | } 1065 | }, 1066 | "node_modules/color-name": { 1067 | "version": "1.1.4", 1068 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1069 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1070 | "dev": true, 1071 | "license": "MIT", 1072 | "optional": true 1073 | }, 1074 | "node_modules/color-string": { 1075 | "version": "1.9.1", 1076 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 1077 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 1078 | "dev": true, 1079 | "license": "MIT", 1080 | "optional": true, 1081 | "dependencies": { 1082 | "color-name": "^1.0.0", 1083 | "simple-swizzle": "^0.2.2" 1084 | } 1085 | }, 1086 | "node_modules/cookie": { 1087 | "version": "0.7.2", 1088 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 1089 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 1090 | "dev": true, 1091 | "license": "MIT", 1092 | "engines": { 1093 | "node": ">= 0.6" 1094 | } 1095 | }, 1096 | "node_modules/data-uri-to-buffer": { 1097 | "version": "2.0.2", 1098 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 1099 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 1100 | "dev": true, 1101 | "license": "MIT" 1102 | }, 1103 | "node_modules/defu": { 1104 | "version": "6.1.4", 1105 | "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 1106 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 1107 | "dev": true, 1108 | "license": "MIT" 1109 | }, 1110 | "node_modules/detect-libc": { 1111 | "version": "2.0.4", 1112 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", 1113 | "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", 1114 | "dev": true, 1115 | "license": "Apache-2.0", 1116 | "optional": true, 1117 | "engines": { 1118 | "node": ">=8" 1119 | } 1120 | }, 1121 | "node_modules/esbuild": { 1122 | "version": "0.25.4", 1123 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", 1124 | "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 1125 | "dev": true, 1126 | "hasInstallScript": true, 1127 | "license": "MIT", 1128 | "bin": { 1129 | "esbuild": "bin/esbuild" 1130 | }, 1131 | "engines": { 1132 | "node": ">=18" 1133 | }, 1134 | "optionalDependencies": { 1135 | "@esbuild/aix-ppc64": "0.25.4", 1136 | "@esbuild/android-arm": "0.25.4", 1137 | "@esbuild/android-arm64": "0.25.4", 1138 | "@esbuild/android-x64": "0.25.4", 1139 | "@esbuild/darwin-arm64": "0.25.4", 1140 | "@esbuild/darwin-x64": "0.25.4", 1141 | "@esbuild/freebsd-arm64": "0.25.4", 1142 | "@esbuild/freebsd-x64": "0.25.4", 1143 | "@esbuild/linux-arm": "0.25.4", 1144 | "@esbuild/linux-arm64": "0.25.4", 1145 | "@esbuild/linux-ia32": "0.25.4", 1146 | "@esbuild/linux-loong64": "0.25.4", 1147 | "@esbuild/linux-mips64el": "0.25.4", 1148 | "@esbuild/linux-ppc64": "0.25.4", 1149 | "@esbuild/linux-riscv64": "0.25.4", 1150 | "@esbuild/linux-s390x": "0.25.4", 1151 | "@esbuild/linux-x64": "0.25.4", 1152 | "@esbuild/netbsd-arm64": "0.25.4", 1153 | "@esbuild/netbsd-x64": "0.25.4", 1154 | "@esbuild/openbsd-arm64": "0.25.4", 1155 | "@esbuild/openbsd-x64": "0.25.4", 1156 | "@esbuild/sunos-x64": "0.25.4", 1157 | "@esbuild/win32-arm64": "0.25.4", 1158 | "@esbuild/win32-ia32": "0.25.4", 1159 | "@esbuild/win32-x64": "0.25.4" 1160 | } 1161 | }, 1162 | "node_modules/exit-hook": { 1163 | "version": "2.2.1", 1164 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 1165 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 1166 | "dev": true, 1167 | "license": "MIT", 1168 | "engines": { 1169 | "node": ">=6" 1170 | }, 1171 | "funding": { 1172 | "url": "https://github.com/sponsors/sindresorhus" 1173 | } 1174 | }, 1175 | "node_modules/exsolve": { 1176 | "version": "1.0.5", 1177 | "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", 1178 | "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", 1179 | "dev": true, 1180 | "license": "MIT" 1181 | }, 1182 | "node_modules/fsevents": { 1183 | "version": "2.3.3", 1184 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1185 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1186 | "dev": true, 1187 | "hasInstallScript": true, 1188 | "license": "MIT", 1189 | "optional": true, 1190 | "os": [ 1191 | "darwin" 1192 | ], 1193 | "engines": { 1194 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1195 | } 1196 | }, 1197 | "node_modules/get-source": { 1198 | "version": "2.0.12", 1199 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 1200 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 1201 | "dev": true, 1202 | "license": "Unlicense", 1203 | "dependencies": { 1204 | "data-uri-to-buffer": "^2.0.0", 1205 | "source-map": "^0.6.1" 1206 | } 1207 | }, 1208 | "node_modules/glob-to-regexp": { 1209 | "version": "0.4.1", 1210 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 1211 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 1212 | "dev": true, 1213 | "license": "BSD-2-Clause" 1214 | }, 1215 | "node_modules/is-arrayish": { 1216 | "version": "0.3.2", 1217 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 1218 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", 1219 | "dev": true, 1220 | "license": "MIT", 1221 | "optional": true 1222 | }, 1223 | "node_modules/mime": { 1224 | "version": "3.0.0", 1225 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 1226 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 1227 | "dev": true, 1228 | "license": "MIT", 1229 | "bin": { 1230 | "mime": "cli.js" 1231 | }, 1232 | "engines": { 1233 | "node": ">=10.0.0" 1234 | } 1235 | }, 1236 | "node_modules/miniflare": { 1237 | "version": "4.20250507.0", 1238 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250507.0.tgz", 1239 | "integrity": "sha512-EgbQRt/Hnr8HCmW2J/4LRNE3yOzJTdNd98XJ8gnGXFKcimXxUFPiWP3k1df+ZPCtEHp6cXxi8+jP7v9vuIbIsg==", 1240 | "dev": true, 1241 | "license": "MIT", 1242 | "dependencies": { 1243 | "@cspotcode/source-map-support": "0.8.1", 1244 | "acorn": "8.14.0", 1245 | "acorn-walk": "8.3.2", 1246 | "exit-hook": "2.2.1", 1247 | "glob-to-regexp": "0.4.1", 1248 | "stoppable": "1.1.0", 1249 | "undici": "^5.28.5", 1250 | "workerd": "1.20250507.0", 1251 | "ws": "8.18.0", 1252 | "youch": "3.3.4", 1253 | "zod": "3.22.3" 1254 | }, 1255 | "bin": { 1256 | "miniflare": "bootstrap.js" 1257 | }, 1258 | "engines": { 1259 | "node": ">=18.0.0" 1260 | } 1261 | }, 1262 | "node_modules/mustache": { 1263 | "version": "4.2.0", 1264 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 1265 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 1266 | "dev": true, 1267 | "license": "MIT", 1268 | "bin": { 1269 | "mustache": "bin/mustache" 1270 | } 1271 | }, 1272 | "node_modules/ohash": { 1273 | "version": "2.0.11", 1274 | "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", 1275 | "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", 1276 | "dev": true, 1277 | "license": "MIT" 1278 | }, 1279 | "node_modules/pako": { 1280 | "version": "2.1.0", 1281 | "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", 1282 | "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" 1283 | }, 1284 | "node_modules/path-to-regexp": { 1285 | "version": "6.3.0", 1286 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", 1287 | "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", 1288 | "dev": true, 1289 | "license": "MIT" 1290 | }, 1291 | "node_modules/pathe": { 1292 | "version": "2.0.3", 1293 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 1294 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 1295 | "dev": true, 1296 | "license": "MIT" 1297 | }, 1298 | "node_modules/prettier": { 1299 | "version": "3.5.3", 1300 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", 1301 | "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", 1302 | "dev": true, 1303 | "license": "MIT", 1304 | "bin": { 1305 | "prettier": "bin/prettier.cjs" 1306 | }, 1307 | "engines": { 1308 | "node": ">=14" 1309 | }, 1310 | "funding": { 1311 | "url": "https://github.com/prettier/prettier?sponsor=1" 1312 | } 1313 | }, 1314 | "node_modules/printable-characters": { 1315 | "version": "1.0.42", 1316 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 1317 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 1318 | "dev": true, 1319 | "license": "Unlicense" 1320 | }, 1321 | "node_modules/semver": { 1322 | "version": "7.7.1", 1323 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 1324 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 1325 | "dev": true, 1326 | "license": "ISC", 1327 | "optional": true, 1328 | "bin": { 1329 | "semver": "bin/semver.js" 1330 | }, 1331 | "engines": { 1332 | "node": ">=10" 1333 | } 1334 | }, 1335 | "node_modules/sharp": { 1336 | "version": "0.33.5", 1337 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", 1338 | "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", 1339 | "dev": true, 1340 | "hasInstallScript": true, 1341 | "license": "Apache-2.0", 1342 | "optional": true, 1343 | "dependencies": { 1344 | "color": "^4.2.3", 1345 | "detect-libc": "^2.0.3", 1346 | "semver": "^7.6.3" 1347 | }, 1348 | "engines": { 1349 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1350 | }, 1351 | "funding": { 1352 | "url": "https://opencollective.com/libvips" 1353 | }, 1354 | "optionalDependencies": { 1355 | "@img/sharp-darwin-arm64": "0.33.5", 1356 | "@img/sharp-darwin-x64": "0.33.5", 1357 | "@img/sharp-libvips-darwin-arm64": "1.0.4", 1358 | "@img/sharp-libvips-darwin-x64": "1.0.4", 1359 | "@img/sharp-libvips-linux-arm": "1.0.5", 1360 | "@img/sharp-libvips-linux-arm64": "1.0.4", 1361 | "@img/sharp-libvips-linux-s390x": "1.0.4", 1362 | "@img/sharp-libvips-linux-x64": "1.0.4", 1363 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", 1364 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4", 1365 | "@img/sharp-linux-arm": "0.33.5", 1366 | "@img/sharp-linux-arm64": "0.33.5", 1367 | "@img/sharp-linux-s390x": "0.33.5", 1368 | "@img/sharp-linux-x64": "0.33.5", 1369 | "@img/sharp-linuxmusl-arm64": "0.33.5", 1370 | "@img/sharp-linuxmusl-x64": "0.33.5", 1371 | "@img/sharp-wasm32": "0.33.5", 1372 | "@img/sharp-win32-ia32": "0.33.5", 1373 | "@img/sharp-win32-x64": "0.33.5" 1374 | } 1375 | }, 1376 | "node_modules/simple-swizzle": { 1377 | "version": "0.2.2", 1378 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 1379 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 1380 | "dev": true, 1381 | "license": "MIT", 1382 | "optional": true, 1383 | "dependencies": { 1384 | "is-arrayish": "^0.3.1" 1385 | } 1386 | }, 1387 | "node_modules/source-map": { 1388 | "version": "0.6.1", 1389 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1390 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1391 | "dev": true, 1392 | "license": "BSD-3-Clause", 1393 | "engines": { 1394 | "node": ">=0.10.0" 1395 | } 1396 | }, 1397 | "node_modules/stacktracey": { 1398 | "version": "2.1.8", 1399 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 1400 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 1401 | "dev": true, 1402 | "license": "Unlicense", 1403 | "dependencies": { 1404 | "as-table": "^1.0.36", 1405 | "get-source": "^2.0.12" 1406 | } 1407 | }, 1408 | "node_modules/stoppable": { 1409 | "version": "1.1.0", 1410 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 1411 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 1412 | "dev": true, 1413 | "license": "MIT", 1414 | "engines": { 1415 | "node": ">=4", 1416 | "npm": ">=6" 1417 | } 1418 | }, 1419 | "node_modules/tslib": { 1420 | "version": "2.8.1", 1421 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1422 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1423 | "dev": true, 1424 | "license": "0BSD", 1425 | "optional": true 1426 | }, 1427 | "node_modules/ufo": { 1428 | "version": "1.6.1", 1429 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", 1430 | "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", 1431 | "dev": true, 1432 | "license": "MIT" 1433 | }, 1434 | "node_modules/undici": { 1435 | "version": "5.29.0", 1436 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 1437 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 1438 | "dev": true, 1439 | "license": "MIT", 1440 | "dependencies": { 1441 | "@fastify/busboy": "^2.0.0" 1442 | }, 1443 | "engines": { 1444 | "node": ">=14.0" 1445 | } 1446 | }, 1447 | "node_modules/unenv": { 1448 | "version": "2.0.0-rc.15", 1449 | "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.15.tgz", 1450 | "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==", 1451 | "dev": true, 1452 | "license": "MIT", 1453 | "dependencies": { 1454 | "defu": "^6.1.4", 1455 | "exsolve": "^1.0.4", 1456 | "ohash": "^2.0.11", 1457 | "pathe": "^2.0.3", 1458 | "ufo": "^1.5.4" 1459 | } 1460 | }, 1461 | "node_modules/workerd": { 1462 | "version": "1.20250507.0", 1463 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250507.0.tgz", 1464 | "integrity": "sha512-OXaGjEh5THT9iblwWIyPrYBoaPe/d4zN03Go7/w8CmS8sma7//O9hjbk43sboWkc89taGPmU0/LNyZUUiUlHeQ==", 1465 | "dev": true, 1466 | "hasInstallScript": true, 1467 | "license": "Apache-2.0", 1468 | "bin": { 1469 | "workerd": "bin/workerd" 1470 | }, 1471 | "engines": { 1472 | "node": ">=16" 1473 | }, 1474 | "optionalDependencies": { 1475 | "@cloudflare/workerd-darwin-64": "1.20250507.0", 1476 | "@cloudflare/workerd-darwin-arm64": "1.20250507.0", 1477 | "@cloudflare/workerd-linux-64": "1.20250507.0", 1478 | "@cloudflare/workerd-linux-arm64": "1.20250507.0", 1479 | "@cloudflare/workerd-windows-64": "1.20250507.0" 1480 | } 1481 | }, 1482 | "node_modules/wrangler": { 1483 | "version": "4.14.4", 1484 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.14.4.tgz", 1485 | "integrity": "sha512-HIdOdiMIcJV5ymw80RKsr3Uzen/p1kRX4jnCEmR2XVeoEhV2Qw6GABxS5WMTlSES2/vEX0Y+ezUAdsprcUhJ5g==", 1486 | "dev": true, 1487 | "license": "MIT OR Apache-2.0", 1488 | "dependencies": { 1489 | "@cloudflare/kv-asset-handler": "0.4.0", 1490 | "@cloudflare/unenv-preset": "2.3.1", 1491 | "blake3-wasm": "2.1.5", 1492 | "esbuild": "0.25.4", 1493 | "miniflare": "4.20250507.0", 1494 | "path-to-regexp": "6.3.0", 1495 | "unenv": "2.0.0-rc.15", 1496 | "workerd": "1.20250507.0" 1497 | }, 1498 | "bin": { 1499 | "wrangler": "bin/wrangler.js", 1500 | "wrangler2": "bin/wrangler.js" 1501 | }, 1502 | "engines": { 1503 | "node": ">=18.0.0" 1504 | }, 1505 | "optionalDependencies": { 1506 | "fsevents": "~2.3.2", 1507 | "sharp": "^0.33.5" 1508 | }, 1509 | "peerDependencies": { 1510 | "@cloudflare/workers-types": "^4.20250507.0" 1511 | }, 1512 | "peerDependenciesMeta": { 1513 | "@cloudflare/workers-types": { 1514 | "optional": true 1515 | } 1516 | } 1517 | }, 1518 | "node_modules/ws": { 1519 | "version": "8.18.0", 1520 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 1521 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 1522 | "dev": true, 1523 | "license": "MIT", 1524 | "engines": { 1525 | "node": ">=10.0.0" 1526 | }, 1527 | "peerDependencies": { 1528 | "bufferutil": "^4.0.1", 1529 | "utf-8-validate": ">=5.0.2" 1530 | }, 1531 | "peerDependenciesMeta": { 1532 | "bufferutil": { 1533 | "optional": true 1534 | }, 1535 | "utf-8-validate": { 1536 | "optional": true 1537 | } 1538 | } 1539 | }, 1540 | "node_modules/youch": { 1541 | "version": "3.3.4", 1542 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", 1543 | "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", 1544 | "dev": true, 1545 | "license": "MIT", 1546 | "dependencies": { 1547 | "cookie": "^0.7.1", 1548 | "mustache": "^4.2.0", 1549 | "stacktracey": "^2.1.8" 1550 | } 1551 | }, 1552 | "node_modules/zod": { 1553 | "version": "3.22.3", 1554 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", 1555 | "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", 1556 | "dev": true, 1557 | "license": "MIT", 1558 | "funding": { 1559 | "url": "https://github.com/sponsors/colinhacks" 1560 | } 1561 | } 1562 | }, 1563 | "dependencies": { 1564 | "@cloudflare/kv-asset-handler": { 1565 | "version": "0.4.0", 1566 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", 1567 | "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", 1568 | "dev": true, 1569 | "requires": { 1570 | "mime": "^3.0.0" 1571 | } 1572 | }, 1573 | "@cloudflare/unenv-preset": { 1574 | "version": "2.3.1", 1575 | "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.3.1.tgz", 1576 | "integrity": "sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==", 1577 | "dev": true, 1578 | "requires": {} 1579 | }, 1580 | "@cloudflare/workerd-darwin-64": { 1581 | "version": "1.20250507.0", 1582 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250507.0.tgz", 1583 | "integrity": "sha512-xC+8hmQuOUUNCVT9DWpLMfxhR4Xs4kI8v7Bkybh4pzGC85moH6fMfCBNaP0YQCNAA/BR56aL/AwfvMVGskTK/A==", 1584 | "dev": true, 1585 | "optional": true 1586 | }, 1587 | "@cloudflare/workerd-darwin-arm64": { 1588 | "version": "1.20250507.0", 1589 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250507.0.tgz", 1590 | "integrity": "sha512-Oynff5H8yM4trfUFaKdkOvPV3jac8mg7QC19ILZluCVgLx/JGEVLEJ7do1Na9rLqV8CK4gmUXPrUMX7uerhQgg==", 1591 | "dev": true, 1592 | "optional": true 1593 | }, 1594 | "@cloudflare/workerd-linux-64": { 1595 | "version": "1.20250507.0", 1596 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250507.0.tgz", 1597 | "integrity": "sha512-/HAA+Zg/R7Q/Smyl835FUFKjotZN1UzN9j/BHBd0xKmKov97QkXAX8gsyGnyKqRReIOinp8x/8+UebTICR7VJw==", 1598 | "dev": true, 1599 | "optional": true 1600 | }, 1601 | "@cloudflare/workerd-linux-arm64": { 1602 | "version": "1.20250507.0", 1603 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250507.0.tgz", 1604 | "integrity": "sha512-NMPibSdOYeycU0IrKkgOESFJQy7dEpHvuatZxQxlT+mIQK0INzI3irp2kKxhF99s25kPC4p+xg9bU3ugTrs3VQ==", 1605 | "dev": true, 1606 | "optional": true 1607 | }, 1608 | "@cloudflare/workerd-windows-64": { 1609 | "version": "1.20250507.0", 1610 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250507.0.tgz", 1611 | "integrity": "sha512-c91fhNP8ufycdIDqjVyKTqeb4ewkbAYXFQbLreMVgh4LLQQPDDEte8wCdmaFy5bIL0M9d85PpdCq51RCzq/FaQ==", 1612 | "dev": true, 1613 | "optional": true 1614 | }, 1615 | "@cspotcode/source-map-support": { 1616 | "version": "0.8.1", 1617 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 1618 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 1619 | "dev": true, 1620 | "requires": { 1621 | "@jridgewell/trace-mapping": "0.3.9" 1622 | } 1623 | }, 1624 | "@emnapi/runtime": { 1625 | "version": "1.4.3", 1626 | "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", 1627 | "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", 1628 | "dev": true, 1629 | "optional": true, 1630 | "requires": { 1631 | "tslib": "^2.4.0" 1632 | } 1633 | }, 1634 | "@esbuild/aix-ppc64": { 1635 | "version": "0.25.4", 1636 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 1637 | "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 1638 | "dev": true, 1639 | "optional": true 1640 | }, 1641 | "@esbuild/android-arm": { 1642 | "version": "0.25.4", 1643 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 1644 | "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 1645 | "dev": true, 1646 | "optional": true 1647 | }, 1648 | "@esbuild/android-arm64": { 1649 | "version": "0.25.4", 1650 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 1651 | "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 1652 | "dev": true, 1653 | "optional": true 1654 | }, 1655 | "@esbuild/android-x64": { 1656 | "version": "0.25.4", 1657 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 1658 | "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 1659 | "dev": true, 1660 | "optional": true 1661 | }, 1662 | "@esbuild/darwin-arm64": { 1663 | "version": "0.25.4", 1664 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 1665 | "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 1666 | "dev": true, 1667 | "optional": true 1668 | }, 1669 | "@esbuild/darwin-x64": { 1670 | "version": "0.25.4", 1671 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 1672 | "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 1673 | "dev": true, 1674 | "optional": true 1675 | }, 1676 | "@esbuild/freebsd-arm64": { 1677 | "version": "0.25.4", 1678 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 1679 | "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 1680 | "dev": true, 1681 | "optional": true 1682 | }, 1683 | "@esbuild/freebsd-x64": { 1684 | "version": "0.25.4", 1685 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 1686 | "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 1687 | "dev": true, 1688 | "optional": true 1689 | }, 1690 | "@esbuild/linux-arm": { 1691 | "version": "0.25.4", 1692 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 1693 | "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 1694 | "dev": true, 1695 | "optional": true 1696 | }, 1697 | "@esbuild/linux-arm64": { 1698 | "version": "0.25.4", 1699 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 1700 | "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 1701 | "dev": true, 1702 | "optional": true 1703 | }, 1704 | "@esbuild/linux-ia32": { 1705 | "version": "0.25.4", 1706 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 1707 | "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 1708 | "dev": true, 1709 | "optional": true 1710 | }, 1711 | "@esbuild/linux-loong64": { 1712 | "version": "0.25.4", 1713 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 1714 | "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 1715 | "dev": true, 1716 | "optional": true 1717 | }, 1718 | "@esbuild/linux-mips64el": { 1719 | "version": "0.25.4", 1720 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 1721 | "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 1722 | "dev": true, 1723 | "optional": true 1724 | }, 1725 | "@esbuild/linux-ppc64": { 1726 | "version": "0.25.4", 1727 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 1728 | "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 1729 | "dev": true, 1730 | "optional": true 1731 | }, 1732 | "@esbuild/linux-riscv64": { 1733 | "version": "0.25.4", 1734 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 1735 | "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 1736 | "dev": true, 1737 | "optional": true 1738 | }, 1739 | "@esbuild/linux-s390x": { 1740 | "version": "0.25.4", 1741 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 1742 | "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 1743 | "dev": true, 1744 | "optional": true 1745 | }, 1746 | "@esbuild/linux-x64": { 1747 | "version": "0.25.4", 1748 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 1749 | "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 1750 | "dev": true, 1751 | "optional": true 1752 | }, 1753 | "@esbuild/netbsd-arm64": { 1754 | "version": "0.25.4", 1755 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 1756 | "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 1757 | "dev": true, 1758 | "optional": true 1759 | }, 1760 | "@esbuild/netbsd-x64": { 1761 | "version": "0.25.4", 1762 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 1763 | "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 1764 | "dev": true, 1765 | "optional": true 1766 | }, 1767 | "@esbuild/openbsd-arm64": { 1768 | "version": "0.25.4", 1769 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 1770 | "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 1771 | "dev": true, 1772 | "optional": true 1773 | }, 1774 | "@esbuild/openbsd-x64": { 1775 | "version": "0.25.4", 1776 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 1777 | "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 1778 | "dev": true, 1779 | "optional": true 1780 | }, 1781 | "@esbuild/sunos-x64": { 1782 | "version": "0.25.4", 1783 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 1784 | "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 1785 | "dev": true, 1786 | "optional": true 1787 | }, 1788 | "@esbuild/win32-arm64": { 1789 | "version": "0.25.4", 1790 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 1791 | "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 1792 | "dev": true, 1793 | "optional": true 1794 | }, 1795 | "@esbuild/win32-ia32": { 1796 | "version": "0.25.4", 1797 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 1798 | "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 1799 | "dev": true, 1800 | "optional": true 1801 | }, 1802 | "@esbuild/win32-x64": { 1803 | "version": "0.25.4", 1804 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 1805 | "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 1806 | "dev": true, 1807 | "optional": true 1808 | }, 1809 | "@fastify/busboy": { 1810 | "version": "2.1.1", 1811 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 1812 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 1813 | "dev": true 1814 | }, 1815 | "@img/sharp-darwin-arm64": { 1816 | "version": "0.33.5", 1817 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", 1818 | "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", 1819 | "dev": true, 1820 | "optional": true, 1821 | "requires": { 1822 | "@img/sharp-libvips-darwin-arm64": "1.0.4" 1823 | } 1824 | }, 1825 | "@img/sharp-darwin-x64": { 1826 | "version": "0.33.5", 1827 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", 1828 | "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", 1829 | "dev": true, 1830 | "optional": true, 1831 | "requires": { 1832 | "@img/sharp-libvips-darwin-x64": "1.0.4" 1833 | } 1834 | }, 1835 | "@img/sharp-libvips-darwin-arm64": { 1836 | "version": "1.0.4", 1837 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", 1838 | "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", 1839 | "dev": true, 1840 | "optional": true 1841 | }, 1842 | "@img/sharp-libvips-darwin-x64": { 1843 | "version": "1.0.4", 1844 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", 1845 | "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", 1846 | "dev": true, 1847 | "optional": true 1848 | }, 1849 | "@img/sharp-libvips-linux-arm": { 1850 | "version": "1.0.5", 1851 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", 1852 | "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", 1853 | "dev": true, 1854 | "optional": true 1855 | }, 1856 | "@img/sharp-libvips-linux-arm64": { 1857 | "version": "1.0.4", 1858 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", 1859 | "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", 1860 | "dev": true, 1861 | "optional": true 1862 | }, 1863 | "@img/sharp-libvips-linux-s390x": { 1864 | "version": "1.0.4", 1865 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", 1866 | "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", 1867 | "dev": true, 1868 | "optional": true 1869 | }, 1870 | "@img/sharp-libvips-linux-x64": { 1871 | "version": "1.0.4", 1872 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", 1873 | "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", 1874 | "dev": true, 1875 | "optional": true 1876 | }, 1877 | "@img/sharp-libvips-linuxmusl-arm64": { 1878 | "version": "1.0.4", 1879 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", 1880 | "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", 1881 | "dev": true, 1882 | "optional": true 1883 | }, 1884 | "@img/sharp-libvips-linuxmusl-x64": { 1885 | "version": "1.0.4", 1886 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", 1887 | "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", 1888 | "dev": true, 1889 | "optional": true 1890 | }, 1891 | "@img/sharp-linux-arm": { 1892 | "version": "0.33.5", 1893 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", 1894 | "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", 1895 | "dev": true, 1896 | "optional": true, 1897 | "requires": { 1898 | "@img/sharp-libvips-linux-arm": "1.0.5" 1899 | } 1900 | }, 1901 | "@img/sharp-linux-arm64": { 1902 | "version": "0.33.5", 1903 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", 1904 | "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", 1905 | "dev": true, 1906 | "optional": true, 1907 | "requires": { 1908 | "@img/sharp-libvips-linux-arm64": "1.0.4" 1909 | } 1910 | }, 1911 | "@img/sharp-linux-s390x": { 1912 | "version": "0.33.5", 1913 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", 1914 | "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", 1915 | "dev": true, 1916 | "optional": true, 1917 | "requires": { 1918 | "@img/sharp-libvips-linux-s390x": "1.0.4" 1919 | } 1920 | }, 1921 | "@img/sharp-linux-x64": { 1922 | "version": "0.33.5", 1923 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", 1924 | "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", 1925 | "dev": true, 1926 | "optional": true, 1927 | "requires": { 1928 | "@img/sharp-libvips-linux-x64": "1.0.4" 1929 | } 1930 | }, 1931 | "@img/sharp-linuxmusl-arm64": { 1932 | "version": "0.33.5", 1933 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", 1934 | "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", 1935 | "dev": true, 1936 | "optional": true, 1937 | "requires": { 1938 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" 1939 | } 1940 | }, 1941 | "@img/sharp-linuxmusl-x64": { 1942 | "version": "0.33.5", 1943 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", 1944 | "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", 1945 | "dev": true, 1946 | "optional": true, 1947 | "requires": { 1948 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4" 1949 | } 1950 | }, 1951 | "@img/sharp-wasm32": { 1952 | "version": "0.33.5", 1953 | "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", 1954 | "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", 1955 | "dev": true, 1956 | "optional": true, 1957 | "requires": { 1958 | "@emnapi/runtime": "^1.2.0" 1959 | } 1960 | }, 1961 | "@img/sharp-win32-ia32": { 1962 | "version": "0.33.5", 1963 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", 1964 | "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", 1965 | "dev": true, 1966 | "optional": true 1967 | }, 1968 | "@img/sharp-win32-x64": { 1969 | "version": "0.33.5", 1970 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", 1971 | "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", 1972 | "dev": true, 1973 | "optional": true 1974 | }, 1975 | "@jridgewell/resolve-uri": { 1976 | "version": "3.1.2", 1977 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1978 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1979 | "dev": true 1980 | }, 1981 | "@jridgewell/sourcemap-codec": { 1982 | "version": "1.5.0", 1983 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1984 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1985 | "dev": true 1986 | }, 1987 | "@jridgewell/trace-mapping": { 1988 | "version": "0.3.9", 1989 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1990 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1991 | "dev": true, 1992 | "requires": { 1993 | "@jridgewell/resolve-uri": "^3.0.3", 1994 | "@jridgewell/sourcemap-codec": "^1.4.10" 1995 | } 1996 | }, 1997 | "acorn": { 1998 | "version": "8.14.0", 1999 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 2000 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 2001 | "dev": true 2002 | }, 2003 | "acorn-walk": { 2004 | "version": "8.3.2", 2005 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 2006 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 2007 | "dev": true 2008 | }, 2009 | "as-table": { 2010 | "version": "1.0.55", 2011 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 2012 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 2013 | "dev": true, 2014 | "requires": { 2015 | "printable-characters": "^1.0.42" 2016 | } 2017 | }, 2018 | "blake3-wasm": { 2019 | "version": "2.1.5", 2020 | "dev": true 2021 | }, 2022 | "color": { 2023 | "version": "4.2.3", 2024 | "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 2025 | "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 2026 | "dev": true, 2027 | "optional": true, 2028 | "requires": { 2029 | "color-convert": "^2.0.1", 2030 | "color-string": "^1.9.0" 2031 | } 2032 | }, 2033 | "color-convert": { 2034 | "version": "2.0.1", 2035 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2036 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2037 | "dev": true, 2038 | "optional": true, 2039 | "requires": { 2040 | "color-name": "~1.1.4" 2041 | } 2042 | }, 2043 | "color-name": { 2044 | "version": "1.1.4", 2045 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2046 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2047 | "dev": true, 2048 | "optional": true 2049 | }, 2050 | "color-string": { 2051 | "version": "1.9.1", 2052 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 2053 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 2054 | "dev": true, 2055 | "optional": true, 2056 | "requires": { 2057 | "color-name": "^1.0.0", 2058 | "simple-swizzle": "^0.2.2" 2059 | } 2060 | }, 2061 | "cookie": { 2062 | "version": "0.7.2", 2063 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 2064 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 2065 | "dev": true 2066 | }, 2067 | "data-uri-to-buffer": { 2068 | "version": "2.0.2", 2069 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 2070 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 2071 | "dev": true 2072 | }, 2073 | "defu": { 2074 | "version": "6.1.4", 2075 | "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 2076 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 2077 | "dev": true 2078 | }, 2079 | "detect-libc": { 2080 | "version": "2.0.4", 2081 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", 2082 | "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", 2083 | "dev": true, 2084 | "optional": true 2085 | }, 2086 | "esbuild": { 2087 | "version": "0.25.4", 2088 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", 2089 | "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 2090 | "dev": true, 2091 | "requires": { 2092 | "@esbuild/aix-ppc64": "0.25.4", 2093 | "@esbuild/android-arm": "0.25.4", 2094 | "@esbuild/android-arm64": "0.25.4", 2095 | "@esbuild/android-x64": "0.25.4", 2096 | "@esbuild/darwin-arm64": "0.25.4", 2097 | "@esbuild/darwin-x64": "0.25.4", 2098 | "@esbuild/freebsd-arm64": "0.25.4", 2099 | "@esbuild/freebsd-x64": "0.25.4", 2100 | "@esbuild/linux-arm": "0.25.4", 2101 | "@esbuild/linux-arm64": "0.25.4", 2102 | "@esbuild/linux-ia32": "0.25.4", 2103 | "@esbuild/linux-loong64": "0.25.4", 2104 | "@esbuild/linux-mips64el": "0.25.4", 2105 | "@esbuild/linux-ppc64": "0.25.4", 2106 | "@esbuild/linux-riscv64": "0.25.4", 2107 | "@esbuild/linux-s390x": "0.25.4", 2108 | "@esbuild/linux-x64": "0.25.4", 2109 | "@esbuild/netbsd-arm64": "0.25.4", 2110 | "@esbuild/netbsd-x64": "0.25.4", 2111 | "@esbuild/openbsd-arm64": "0.25.4", 2112 | "@esbuild/openbsd-x64": "0.25.4", 2113 | "@esbuild/sunos-x64": "0.25.4", 2114 | "@esbuild/win32-arm64": "0.25.4", 2115 | "@esbuild/win32-ia32": "0.25.4", 2116 | "@esbuild/win32-x64": "0.25.4" 2117 | } 2118 | }, 2119 | "exit-hook": { 2120 | "version": "2.2.1", 2121 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 2122 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 2123 | "dev": true 2124 | }, 2125 | "exsolve": { 2126 | "version": "1.0.5", 2127 | "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", 2128 | "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", 2129 | "dev": true 2130 | }, 2131 | "fsevents": { 2132 | "version": "2.3.3", 2133 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2134 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2135 | "dev": true, 2136 | "optional": true 2137 | }, 2138 | "get-source": { 2139 | "version": "2.0.12", 2140 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 2141 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 2142 | "dev": true, 2143 | "requires": { 2144 | "data-uri-to-buffer": "^2.0.0", 2145 | "source-map": "^0.6.1" 2146 | } 2147 | }, 2148 | "glob-to-regexp": { 2149 | "version": "0.4.1", 2150 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 2151 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 2152 | "dev": true 2153 | }, 2154 | "is-arrayish": { 2155 | "version": "0.3.2", 2156 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 2157 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", 2158 | "dev": true, 2159 | "optional": true 2160 | }, 2161 | "mime": { 2162 | "version": "3.0.0", 2163 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 2164 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 2165 | "dev": true 2166 | }, 2167 | "miniflare": { 2168 | "version": "4.20250507.0", 2169 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250507.0.tgz", 2170 | "integrity": "sha512-EgbQRt/Hnr8HCmW2J/4LRNE3yOzJTdNd98XJ8gnGXFKcimXxUFPiWP3k1df+ZPCtEHp6cXxi8+jP7v9vuIbIsg==", 2171 | "dev": true, 2172 | "requires": { 2173 | "@cspotcode/source-map-support": "0.8.1", 2174 | "acorn": "8.14.0", 2175 | "acorn-walk": "8.3.2", 2176 | "exit-hook": "2.2.1", 2177 | "glob-to-regexp": "0.4.1", 2178 | "stoppable": "1.1.0", 2179 | "undici": "^5.28.5", 2180 | "workerd": "1.20250507.0", 2181 | "ws": "8.18.0", 2182 | "youch": "3.3.4", 2183 | "zod": "3.22.3" 2184 | } 2185 | }, 2186 | "mustache": { 2187 | "version": "4.2.0", 2188 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 2189 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 2190 | "dev": true 2191 | }, 2192 | "ohash": { 2193 | "version": "2.0.11", 2194 | "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", 2195 | "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", 2196 | "dev": true 2197 | }, 2198 | "pako": { 2199 | "version": "2.1.0", 2200 | "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", 2201 | "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" 2202 | }, 2203 | "path-to-regexp": { 2204 | "version": "6.3.0", 2205 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", 2206 | "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", 2207 | "dev": true 2208 | }, 2209 | "pathe": { 2210 | "version": "2.0.3", 2211 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 2212 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 2213 | "dev": true 2214 | }, 2215 | "prettier": { 2216 | "version": "3.5.3", 2217 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", 2218 | "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", 2219 | "dev": true 2220 | }, 2221 | "printable-characters": { 2222 | "version": "1.0.42", 2223 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 2224 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 2225 | "dev": true 2226 | }, 2227 | "semver": { 2228 | "version": "7.7.1", 2229 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 2230 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 2231 | "dev": true, 2232 | "optional": true 2233 | }, 2234 | "sharp": { 2235 | "version": "0.33.5", 2236 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", 2237 | "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", 2238 | "dev": true, 2239 | "optional": true, 2240 | "requires": { 2241 | "@img/sharp-darwin-arm64": "0.33.5", 2242 | "@img/sharp-darwin-x64": "0.33.5", 2243 | "@img/sharp-libvips-darwin-arm64": "1.0.4", 2244 | "@img/sharp-libvips-darwin-x64": "1.0.4", 2245 | "@img/sharp-libvips-linux-arm": "1.0.5", 2246 | "@img/sharp-libvips-linux-arm64": "1.0.4", 2247 | "@img/sharp-libvips-linux-s390x": "1.0.4", 2248 | "@img/sharp-libvips-linux-x64": "1.0.4", 2249 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", 2250 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4", 2251 | "@img/sharp-linux-arm": "0.33.5", 2252 | "@img/sharp-linux-arm64": "0.33.5", 2253 | "@img/sharp-linux-s390x": "0.33.5", 2254 | "@img/sharp-linux-x64": "0.33.5", 2255 | "@img/sharp-linuxmusl-arm64": "0.33.5", 2256 | "@img/sharp-linuxmusl-x64": "0.33.5", 2257 | "@img/sharp-wasm32": "0.33.5", 2258 | "@img/sharp-win32-ia32": "0.33.5", 2259 | "@img/sharp-win32-x64": "0.33.5", 2260 | "color": "^4.2.3", 2261 | "detect-libc": "^2.0.3", 2262 | "semver": "^7.6.3" 2263 | } 2264 | }, 2265 | "simple-swizzle": { 2266 | "version": "0.2.2", 2267 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2268 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 2269 | "dev": true, 2270 | "optional": true, 2271 | "requires": { 2272 | "is-arrayish": "^0.3.1" 2273 | } 2274 | }, 2275 | "source-map": { 2276 | "version": "0.6.1", 2277 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2278 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2279 | "dev": true 2280 | }, 2281 | "stacktracey": { 2282 | "version": "2.1.8", 2283 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 2284 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 2285 | "dev": true, 2286 | "requires": { 2287 | "as-table": "^1.0.36", 2288 | "get-source": "^2.0.12" 2289 | } 2290 | }, 2291 | "stoppable": { 2292 | "version": "1.1.0", 2293 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 2294 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 2295 | "dev": true 2296 | }, 2297 | "tslib": { 2298 | "version": "2.8.1", 2299 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2300 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2301 | "dev": true, 2302 | "optional": true 2303 | }, 2304 | "ufo": { 2305 | "version": "1.6.1", 2306 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", 2307 | "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", 2308 | "dev": true 2309 | }, 2310 | "undici": { 2311 | "version": "5.29.0", 2312 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 2313 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 2314 | "dev": true, 2315 | "requires": { 2316 | "@fastify/busboy": "^2.0.0" 2317 | } 2318 | }, 2319 | "unenv": { 2320 | "version": "2.0.0-rc.15", 2321 | "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.15.tgz", 2322 | "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==", 2323 | "dev": true, 2324 | "requires": { 2325 | "defu": "^6.1.4", 2326 | "exsolve": "^1.0.4", 2327 | "ohash": "^2.0.11", 2328 | "pathe": "^2.0.3", 2329 | "ufo": "^1.5.4" 2330 | } 2331 | }, 2332 | "workerd": { 2333 | "version": "1.20250507.0", 2334 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250507.0.tgz", 2335 | "integrity": "sha512-OXaGjEh5THT9iblwWIyPrYBoaPe/d4zN03Go7/w8CmS8sma7//O9hjbk43sboWkc89taGPmU0/LNyZUUiUlHeQ==", 2336 | "dev": true, 2337 | "requires": { 2338 | "@cloudflare/workerd-darwin-64": "1.20250507.0", 2339 | "@cloudflare/workerd-darwin-arm64": "1.20250507.0", 2340 | "@cloudflare/workerd-linux-64": "1.20250507.0", 2341 | "@cloudflare/workerd-linux-arm64": "1.20250507.0", 2342 | "@cloudflare/workerd-windows-64": "1.20250507.0" 2343 | } 2344 | }, 2345 | "wrangler": { 2346 | "version": "4.14.4", 2347 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.14.4.tgz", 2348 | "integrity": "sha512-HIdOdiMIcJV5ymw80RKsr3Uzen/p1kRX4jnCEmR2XVeoEhV2Qw6GABxS5WMTlSES2/vEX0Y+ezUAdsprcUhJ5g==", 2349 | "dev": true, 2350 | "requires": { 2351 | "@cloudflare/kv-asset-handler": "0.4.0", 2352 | "@cloudflare/unenv-preset": "2.3.1", 2353 | "blake3-wasm": "2.1.5", 2354 | "esbuild": "0.25.4", 2355 | "fsevents": "~2.3.2", 2356 | "miniflare": "4.20250507.0", 2357 | "path-to-regexp": "6.3.0", 2358 | "sharp": "^0.33.5", 2359 | "unenv": "2.0.0-rc.15", 2360 | "workerd": "1.20250507.0" 2361 | } 2362 | }, 2363 | "ws": { 2364 | "version": "8.18.0", 2365 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 2366 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 2367 | "dev": true, 2368 | "requires": {} 2369 | }, 2370 | "youch": { 2371 | "version": "3.3.4", 2372 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", 2373 | "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", 2374 | "dev": true, 2375 | "requires": { 2376 | "cookie": "^0.7.1", 2377 | "mustache": "^4.2.0", 2378 | "stacktracey": "^2.1.8" 2379 | } 2380 | }, 2381 | "zod": { 2382 | "version": "3.22.3", 2383 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", 2384 | "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", 2385 | "dev": true 2386 | } 2387 | } 2388 | } 2389 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare-worker-loki", 3 | "version": "0.0.0", 4 | "devDependencies": { 5 | "prettier": "^3.5.3", 6 | "wrangler": "4.14.4" 7 | }, 8 | "private": true, 9 | "scripts": { 10 | "start": "wrangler dev", 11 | "format": "prettier --write '*.{json,js}' 'src/**/*.{js,ts}'", 12 | "deploy": "npm run format && wrangler deploy" 13 | }, 14 | "dependencies": { 15 | "pako": "^2.1.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import { inflate } from 'pako' 2 | 3 | async function transformLogs(obj) { 4 | const encoding = obj.contentEncoding || undefined 5 | let payload = obj.payload 6 | const jobname = obj.job || 'cloudflare_logpush' 7 | 8 | const lokiFormat = { 9 | streams: [ 10 | { 11 | stream: { 12 | job: jobname, 13 | }, 14 | values: [], 15 | }, 16 | ], 17 | } 18 | 19 | let log 20 | 21 | if (encoding === 'gzip') { 22 | payload = await payload.arrayBuffer() 23 | 24 | const data = inflate(payload) 25 | const logdata = new Uint16Array(data).reduce((data, byte) => data + String.fromCharCode(byte), '') 26 | log = logdata.split('\n') 27 | } else { 28 | const date = new Date().getTime() * 1000000 29 | if (obj.contentType.includes('application/json')) { 30 | log = await payload.json() 31 | } 32 | if (obj.contentType.includes('application/text')) { 33 | log = await payload.text() 34 | } 35 | lokiFormat.streams[0].values.push([date.toString(), JSON.stringify(log)]) 36 | return lokiFormat 37 | } 38 | 39 | log.forEach((element) => { 40 | const date = element.EdgeStartTimestamp || new Date().getTime() * 1000000 41 | lokiFormat.streams[0].values.push([date.toString(), element]) 42 | }) 43 | 44 | return lokiFormat 45 | } 46 | 47 | async function pushLogs(payload, credentials, env) { 48 | const lokiServer = env.lokiHost 49 | const req = await fetch(lokiServer, { 50 | body: JSON.stringify(payload), 51 | method: 'POST', 52 | headers: { 53 | Authorization: credentials, 54 | 'Content-Type': 'application/json', 55 | }, 56 | }) 57 | return req 58 | } 59 | 60 | export default { 61 | async fetch(request, env) { 62 | const { searchParams } = new URL(request.url) 63 | const job = searchParams.get('job') 64 | 65 | const authHeader = request.headers.get('authorization') 66 | const contentEncoding = request.headers.get('content-encoding') 67 | const contentType = request.headers.get('content-type') 68 | 69 | if (request.method !== 'POST') { 70 | return new Response( 71 | JSON.stringify( 72 | { success: false, message: 'please authenticate and use POST requests' }, 73 | { headers: { 'content-type': 'application/json' } }, 74 | ), 75 | ) 76 | } 77 | 78 | if (!authHeader) { 79 | return new Response( 80 | JSON.stringify( 81 | { success: false, message: 'please authenticate' }, 82 | { headers: { 'content-type': 'application/json' } }, 83 | ), 84 | ) 85 | } 86 | const output = await transformLogs({ payload: await request, contentEncoding, job, contentType }) 87 | 88 | await pushLogs(output, authHeader, env) 89 | return new Response(JSON.stringify({ success: true }), { 90 | headers: { 'content-type': 'application/json' }, 91 | }) 92 | }, 93 | } 94 | -------------------------------------------------------------------------------- /wrangler.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "compatibility_date": "2025-05-09", 3 | "main": "src/index.js", 4 | "name": "cloudflare-worker-loki", 5 | "workers_dev": true, 6 | "observability": { 7 | "enabled": true, 8 | }, 9 | "vars": { 10 | "lokiHost": "https://logs-prod-us-central1.grafana.net/loki/api/v1/push", 11 | }, 12 | } 13 | --------------------------------------------------------------------------------