├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── README.md ├── config.json ├── env.example ├── images └── example_alert.png ├── package-lock.json ├── package.json ├── scripts └── deploy.js ├── src ├── cert-utils.ts ├── index.ts ├── test-cert.ts └── types.ts ├── tsconfig.json └── wrangler.toml /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy DNS Bot 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | - master 8 | workflow_dispatch: 9 | 10 | jobs: 11 | deploy: 12 | runs-on: ubuntu-latest 13 | name: Deploy 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Setup Node.js 18 | uses: actions/setup-node@v4 19 | with: 20 | node-version: "20" 21 | 22 | - name: Install dependencies 23 | run: npm ci 24 | 25 | - name: Check required secrets 26 | run: | 27 | if [ -z "${{ secrets.CLOUDFLARE_API_TOKEN }}" ]; then 28 | echo "❌ CLOUDFLARE_API_TOKEN is not set" 29 | exit 1 30 | fi 31 | if [ -z "${{ secrets.TELEGRAM_BOT_TOKEN }}" ]; then 32 | echo "❌ TELEGRAM_BOT_TOKEN is not set" 33 | exit 1 34 | fi 35 | if [ -z "${{ secrets.TELEGRAM_CHAT_ID }}" ]; then 36 | echo "❌ TELEGRAM_CHAT_ID is not set" 37 | exit 1 38 | fi 39 | echo "✅ All required secrets are set" 40 | 41 | - name: Deploy to Cloudflare Workers 42 | env: 43 | CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} 44 | TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} 45 | TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} 46 | run: npm run deploy 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | 7 | # Build output 8 | dist/ 9 | build/ 10 | .wrangler/ 11 | 12 | # Environment variables 13 | .env 14 | .env.local 15 | .env.*.local 16 | 17 | # IDE 18 | .idea/ 19 | .vscode/ 20 | *.swp 21 | *.swo 22 | 23 | # OS 24 | .DS_Store 25 | Thumbs.db -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DNS Monitor Bot 2 | 3 | A simple, pre-built Cloudflare Worker that monitors DNS records and TLS certificates for any list of user-specified domains and sends notifications via Telegram when changes are detected. 4 | 5 | The project is designed to stay comfortably within Cloudflare's free tier for its Worker and KV storage services. 6 | 7 |

8 | Example alert 9 |
10 | Example alert 11 |

12 | 13 | ## Prerequisites 14 | 15 | - [Node.js](https://nodejs.org/) (v20 or later) 16 | - [npm](https://www.npmjs.com/) (comes with Node.js) 17 | - [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/) (v4 or later) 18 | 19 | ## Setup 20 | 21 | 1. **Clone the repository:** 22 | 23 | ```bash 24 | git clone https://github.com/wavey0x/dns-bot.git 25 | cd dns-bot 26 | ``` 27 | 28 | 2. **Install dependencies:** 29 | 30 | ```bash 31 | npm install 32 | ``` 33 | 34 | 3. **Configure your bot and secrets:** 35 | 36 | - Create a `.env` file in the project root and supply values: 37 | 38 | ```bash 39 | cp .env.example .env 40 | ``` 41 | 42 | - Supply the same variables and values as GitHub Actions secrets within your repository's settings.[^1] 43 | 44 | - Update `config.json` with your settings. The config file is now read directly by the Worker (no need for environment variable secrets for domain config): 45 | 46 | ```json 47 | { 48 | "domains": [ 49 | { 50 | "name": "domain1.com", 51 | "suppressNonIpSoaAlerts": true, 52 | "suppressCertAlerts": false, 53 | "suppressIpChangeAlerts": false, 54 | "criticalChangeWindowMinutes": 10 55 | }, 56 | { 57 | "name": "domain2.com", 58 | "suppressCertAlerts": false, 59 | "suppressIpChangeAlerts": false, 60 | "criticalChangeWindowMinutes": 10 61 | } 62 | ], 63 | "cron": "*/5 * * * *", 64 | "kvNamespace": { 65 | "id": "your-kv-namespace-id" 66 | } 67 | } 68 | ``` 69 | 70 | > **Note:** Each domain you want to monitor must be explicitly listed in the `domains` array. Subdomains are not automatically monitored - if you want to monitor a subdomain, add it to the list (e.g., `"name": "sub.domain.com"`). 71 | 72 | - Get your Cloudflare API token[^2] 73 | 74 | 4. **Deploy the bot:** 75 | 76 | - **Option 1: Deploy locally** 77 | 78 | Run the deploy script: 79 | 80 | ```bash 81 | npm run deploy 82 | ``` 83 | 84 | This will: 85 | 86 | - Set up the KV namespace if needed 87 | - Configure Telegram secrets 88 | - Update the worker configuration 89 | - Deploy to Cloudflare Workers 90 | 91 | - **Option 2: Deploy via GitHub Actions** 92 | 93 | - Push your changes to the `main` branch. 94 | - The GitHub Action will automatically deploy the bot. 95 | 96 | ## Viewing Logs 97 | 98 | To view the logs for your deployed worker: 99 | 100 | 1. Go to the [Cloudflare Dashboard](https://dash.cloudflare.com/). 101 | 2. Navigate to **Workers & Pages**. 102 | 3. Select your worker (`dns-bot`). 103 | 4. Click on **Logs** to view the worker's logs. 104 | 105 | ## Troubleshooting 106 | 107 | - **Wrangler not found:** Ensure Wrangler is installed globally or use `npx wrangler`. 108 | - **Deployment fails:** Check your API token and ensure all environment variables are set correctly. 109 | - **No logs:** Ensure logging is enabled in your `wrangler.toml` file. 110 | - **GitHub Actions fails:** Verify that all required secrets are set in your repository's Settings > Secrets and variables > Actions. 111 | 112 | ## Footnotes 113 | 114 | [^1]: Required secrets must be set in both your local `.env` file and GitHub Actions repository secrets. Go to your repository's Settings > Secrets and variables > Actions and add: `CLOUDFLARE_API_TOKEN`, `TELEGRAM_BOT_TOKEN`, and `TELEGRAM_CHAT_ID`. 115 | [^2]: To get your Cloudflare API token: 116 | 117 | 1. Go to the [Cloudflare Dashboard](https://dash.cloudflare.com/) 118 | 2. Navigate to **My Profile** > **API Tokens** 119 | 3. Click **Create Token** 120 | 4. Choose **Create Custom Token** 121 | 5. Set the following permissions: 122 | - **Account** > **Workers** > **Edit** 123 | - **Zone** > **DNS** > **Read** 124 | 6. Set the **Account Resources** to **All accounts** 125 | 7. Set the **Zone Resources** to **All zones** 126 | 8. Click **Continue to summary** and then **Create Token** 127 | 128 | ## Certificate and DNS Change Detection Logic 129 | 130 | The bot includes robust logic to detect both DNS and certificate changes for your domains: 131 | 132 | 1. **IP Change Detection:** 133 | 134 | - The bot monitors DNS A records for each domain. 135 | - IP addresses are always sorted before comparison to avoid false positives due to order changes. 136 | - When an IP change is detected, the bot sends an alert with before/after details. 137 | 138 | 2. **Certificate Validation:** 139 | 140 | - On every run, the bot connects to the domain's IP and retrieves the TLS certificate. 141 | - The certificate is compared to a baseline (the last known valid certificate) stored in KV. 142 | - If the certificate changes unexpectedly, a high-severity alert is sent. 143 | - If the certificate is invalid or cannot be retrieved, a critical alert is sent immediately. 144 | 145 | 3. **SOA Change Detection:** 146 | 147 | - The bot also checks the SOA serial for the domain. 148 | - If the SOA serial changes (and IPs have not changed), an alert is sent (unless suppressed by config). 149 | 150 | 4. **Critical Change Window:** 151 | 152 | - If both an IP change and a certificate change occur within a configurable time window, a critical alert is sent. 153 | 154 | 5. **Alerting:** 155 | 156 | - Alerts are sent via Telegram with clear before/after information and technical details. 157 | - You can suppress certain alerts (e.g., SOA, IP, or certificate) per domain in the config. 158 | 159 | 6. **No CloudFront Logic:** 160 | - All CloudFront-specific logic and configuration have been removed. The bot now works for any domain and does not treat CloudFront IPs specially. 161 | 162 | ## Best Practices 163 | 164 | - **Monitor all critical domains and subdomains.** 165 | - **Review alerts promptly** to catch potential DNS hijacking or certificate issues. 166 | - **Update the baseline certificate** in KV if you perform a legitimate certificate renewal. 167 | - **Keep your config.json up to date** with all domains you want to monitor. 168 | 169 | This bot adds an extra layer of security to your DNS monitoring, ensuring that both IP and certificate changes are tracked and alerted on for potential threats. 170 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "domains": [ 3 | { 4 | "name": "yearn.fi", 5 | "suppressNonIpSoaAlerts": true, 6 | "suppressCertAlerts": false, 7 | "suppressIpChangeAlerts": false, 8 | "criticalChangeWindowMinutes": 10 9 | }, 10 | { 11 | "name": "yearn.finance", 12 | "suppressCertAlerts": false, 13 | "suppressIpChangeAlerts": false, 14 | "criticalChangeWindowMinutes": 10 15 | }, 16 | { 17 | "name": "curve.fi", 18 | "suppressCertAlerts": false, 19 | "suppressIpChangeAlerts": false, 20 | "criticalChangeWindowMinutes": 10 21 | }, 22 | { 23 | "name": "curve.finance", 24 | "suppressCertAlerts": false, 25 | "suppressIpChangeAlerts": false, 26 | "criticalChangeWindowMinutes": 10 27 | }, 28 | { 29 | "name": "resupply.fi", 30 | "suppressCertAlerts": false, 31 | "suppressIpChangeAlerts": false, 32 | "criticalChangeWindowMinutes": 10 33 | }, 34 | { 35 | "name": "convexfinance.com", 36 | "suppressCertAlerts": false, 37 | "suppressIpChangeAlerts": false, 38 | "criticalChangeWindowMinutes": 10 39 | }, 40 | { 41 | "name": "safe-transaction-mainnet.safe.global", 42 | "suppressCertAlerts": false, 43 | "suppressIpChangeAlerts": true, 44 | "criticalChangeWindowMinutes": 10 45 | }, 46 | { 47 | "name": "safe.global", 48 | "suppressCertAlerts": false, 49 | "suppressIpChangeAlerts": true, 50 | "criticalChangeWindowMinutes": 10 51 | }, 52 | { 53 | "name": "app.safe.global", 54 | "suppressCertAlerts": false, 55 | "suppressIpChangeAlerts": true, 56 | "criticalChangeWindowMinutes": 10 57 | } 58 | ], 59 | "cron": "* * * * *", 60 | "kvNamespace": { 61 | "id": "860d4c5cb9384e1cab56e7e70504d765" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /env.example: -------------------------------------------------------------------------------- 1 | TELEGRAM_CHAT_ID= 2 | TELEGRAM_BOT_TOKEN= 3 | CLOUDFLARE_API_TOKEN= -------------------------------------------------------------------------------- /images/example_alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wavey0x/dns-bot/9c39850cde7424ab67c9704cbbdded80453a7ad5/images/example_alert.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dns-bot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "dns-bot", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "dotenv": "^16.5.0", 13 | "node-telegram-bot-api": "^0.64.0" 14 | }, 15 | "devDependencies": { 16 | "@cloudflare/workers-types": "^4.20240208.0", 17 | "@types/node": "^22.15.29", 18 | "typescript": "^5.3.3", 19 | "wrangler": "^4.0.0" 20 | } 21 | }, 22 | "node_modules/@cloudflare/kv-asset-handler": { 23 | "version": "0.4.0", 24 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", 25 | "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", 26 | "dev": true, 27 | "license": "MIT OR Apache-2.0", 28 | "dependencies": { 29 | "mime": "^3.0.0" 30 | }, 31 | "engines": { 32 | "node": ">=18.0.0" 33 | } 34 | }, 35 | "node_modules/@cloudflare/unenv-preset": { 36 | "version": "2.3.1", 37 | "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.3.1.tgz", 38 | "integrity": "sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==", 39 | "dev": true, 40 | "license": "MIT OR Apache-2.0", 41 | "peerDependencies": { 42 | "unenv": "2.0.0-rc.15", 43 | "workerd": "^1.20250320.0" 44 | }, 45 | "peerDependenciesMeta": { 46 | "workerd": { 47 | "optional": true 48 | } 49 | } 50 | }, 51 | "node_modules/@cloudflare/workerd-darwin-64": { 52 | "version": "1.20250507.0", 53 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250507.0.tgz", 54 | "integrity": "sha512-xC+8hmQuOUUNCVT9DWpLMfxhR4Xs4kI8v7Bkybh4pzGC85moH6fMfCBNaP0YQCNAA/BR56aL/AwfvMVGskTK/A==", 55 | "cpu": [ 56 | "x64" 57 | ], 58 | "dev": true, 59 | "license": "Apache-2.0", 60 | "optional": true, 61 | "os": [ 62 | "darwin" 63 | ], 64 | "engines": { 65 | "node": ">=16" 66 | } 67 | }, 68 | "node_modules/@cloudflare/workerd-darwin-arm64": { 69 | "version": "1.20250507.0", 70 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250507.0.tgz", 71 | "integrity": "sha512-Oynff5H8yM4trfUFaKdkOvPV3jac8mg7QC19ILZluCVgLx/JGEVLEJ7do1Na9rLqV8CK4gmUXPrUMX7uerhQgg==", 72 | "cpu": [ 73 | "arm64" 74 | ], 75 | "dev": true, 76 | "license": "Apache-2.0", 77 | "optional": true, 78 | "os": [ 79 | "darwin" 80 | ], 81 | "engines": { 82 | "node": ">=16" 83 | } 84 | }, 85 | "node_modules/@cloudflare/workerd-linux-64": { 86 | "version": "1.20250507.0", 87 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250507.0.tgz", 88 | "integrity": "sha512-/HAA+Zg/R7Q/Smyl835FUFKjotZN1UzN9j/BHBd0xKmKov97QkXAX8gsyGnyKqRReIOinp8x/8+UebTICR7VJw==", 89 | "cpu": [ 90 | "x64" 91 | ], 92 | "dev": true, 93 | "license": "Apache-2.0", 94 | "optional": true, 95 | "os": [ 96 | "linux" 97 | ], 98 | "engines": { 99 | "node": ">=16" 100 | } 101 | }, 102 | "node_modules/@cloudflare/workerd-linux-arm64": { 103 | "version": "1.20250507.0", 104 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250507.0.tgz", 105 | "integrity": "sha512-NMPibSdOYeycU0IrKkgOESFJQy7dEpHvuatZxQxlT+mIQK0INzI3irp2kKxhF99s25kPC4p+xg9bU3ugTrs3VQ==", 106 | "cpu": [ 107 | "arm64" 108 | ], 109 | "dev": true, 110 | "license": "Apache-2.0", 111 | "optional": true, 112 | "os": [ 113 | "linux" 114 | ], 115 | "engines": { 116 | "node": ">=16" 117 | } 118 | }, 119 | "node_modules/@cloudflare/workerd-windows-64": { 120 | "version": "1.20250507.0", 121 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250507.0.tgz", 122 | "integrity": "sha512-c91fhNP8ufycdIDqjVyKTqeb4ewkbAYXFQbLreMVgh4LLQQPDDEte8wCdmaFy5bIL0M9d85PpdCq51RCzq/FaQ==", 123 | "cpu": [ 124 | "x64" 125 | ], 126 | "dev": true, 127 | "license": "Apache-2.0", 128 | "optional": true, 129 | "os": [ 130 | "win32" 131 | ], 132 | "engines": { 133 | "node": ">=16" 134 | } 135 | }, 136 | "node_modules/@cloudflare/workers-types": { 137 | "version": "4.20250514.0", 138 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250514.0.tgz", 139 | "integrity": "sha512-zjyqRjoFnAzg7n+mxMxJAbIeOggUXLJTXA8WyT+xGDE+6MF9bSf1ypEULu4DXQQYLf6nDM6NwzLex/8ABTH+Lw==", 140 | "dev": true, 141 | "license": "MIT OR Apache-2.0" 142 | }, 143 | "node_modules/@cspotcode/source-map-support": { 144 | "version": "0.8.1", 145 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 146 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 147 | "dev": true, 148 | "license": "MIT", 149 | "dependencies": { 150 | "@jridgewell/trace-mapping": "0.3.9" 151 | }, 152 | "engines": { 153 | "node": ">=12" 154 | } 155 | }, 156 | "node_modules/@cypress/request": { 157 | "version": "3.0.8", 158 | "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz", 159 | "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==", 160 | "license": "Apache-2.0", 161 | "dependencies": { 162 | "aws-sign2": "~0.7.0", 163 | "aws4": "^1.8.0", 164 | "caseless": "~0.12.0", 165 | "combined-stream": "~1.0.6", 166 | "extend": "~3.0.2", 167 | "forever-agent": "~0.6.1", 168 | "form-data": "~4.0.0", 169 | "http-signature": "~1.4.0", 170 | "is-typedarray": "~1.0.0", 171 | "isstream": "~0.1.2", 172 | "json-stringify-safe": "~5.0.1", 173 | "mime-types": "~2.1.19", 174 | "performance-now": "^2.1.0", 175 | "qs": "6.14.0", 176 | "safe-buffer": "^5.1.2", 177 | "tough-cookie": "^5.0.0", 178 | "tunnel-agent": "^0.6.0", 179 | "uuid": "^8.3.2" 180 | }, 181 | "engines": { 182 | "node": ">= 6" 183 | } 184 | }, 185 | "node_modules/@cypress/request-promise": { 186 | "version": "5.0.0", 187 | "resolved": "https://registry.npmjs.org/@cypress/request-promise/-/request-promise-5.0.0.tgz", 188 | "integrity": "sha512-eKdYVpa9cBEw2kTBlHeu1PP16Blwtum6QHg/u9s/MoHkZfuo1pRGka1VlUHXF5kdew82BvOJVVGk0x8X0nbp+w==", 189 | "license": "ISC", 190 | "dependencies": { 191 | "bluebird": "^3.5.0", 192 | "request-promise-core": "1.1.3", 193 | "stealthy-require": "^1.1.1", 194 | "tough-cookie": "^4.1.3" 195 | }, 196 | "engines": { 197 | "node": ">=0.10.0" 198 | }, 199 | "peerDependencies": { 200 | "@cypress/request": "^3.0.0" 201 | } 202 | }, 203 | "node_modules/@cypress/request-promise/node_modules/tough-cookie": { 204 | "version": "4.1.4", 205 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", 206 | "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", 207 | "license": "BSD-3-Clause", 208 | "dependencies": { 209 | "psl": "^1.1.33", 210 | "punycode": "^2.1.1", 211 | "universalify": "^0.2.0", 212 | "url-parse": "^1.5.3" 213 | }, 214 | "engines": { 215 | "node": ">=6" 216 | } 217 | }, 218 | "node_modules/@emnapi/runtime": { 219 | "version": "1.4.3", 220 | "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", 221 | "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", 222 | "dev": true, 223 | "license": "MIT", 224 | "optional": true, 225 | "dependencies": { 226 | "tslib": "^2.4.0" 227 | } 228 | }, 229 | "node_modules/@esbuild/aix-ppc64": { 230 | "version": "0.25.4", 231 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 232 | "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 233 | "cpu": [ 234 | "ppc64" 235 | ], 236 | "dev": true, 237 | "license": "MIT", 238 | "optional": true, 239 | "os": [ 240 | "aix" 241 | ], 242 | "engines": { 243 | "node": ">=18" 244 | } 245 | }, 246 | "node_modules/@esbuild/android-arm": { 247 | "version": "0.25.4", 248 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 249 | "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 250 | "cpu": [ 251 | "arm" 252 | ], 253 | "dev": true, 254 | "license": "MIT", 255 | "optional": true, 256 | "os": [ 257 | "android" 258 | ], 259 | "engines": { 260 | "node": ">=18" 261 | } 262 | }, 263 | "node_modules/@esbuild/android-arm64": { 264 | "version": "0.25.4", 265 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 266 | "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 267 | "cpu": [ 268 | "arm64" 269 | ], 270 | "dev": true, 271 | "license": "MIT", 272 | "optional": true, 273 | "os": [ 274 | "android" 275 | ], 276 | "engines": { 277 | "node": ">=18" 278 | } 279 | }, 280 | "node_modules/@esbuild/android-x64": { 281 | "version": "0.25.4", 282 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 283 | "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 284 | "cpu": [ 285 | "x64" 286 | ], 287 | "dev": true, 288 | "license": "MIT", 289 | "optional": true, 290 | "os": [ 291 | "android" 292 | ], 293 | "engines": { 294 | "node": ">=18" 295 | } 296 | }, 297 | "node_modules/@esbuild/darwin-arm64": { 298 | "version": "0.25.4", 299 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 300 | "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 301 | "cpu": [ 302 | "arm64" 303 | ], 304 | "dev": true, 305 | "license": "MIT", 306 | "optional": true, 307 | "os": [ 308 | "darwin" 309 | ], 310 | "engines": { 311 | "node": ">=18" 312 | } 313 | }, 314 | "node_modules/@esbuild/darwin-x64": { 315 | "version": "0.25.4", 316 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 317 | "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 318 | "cpu": [ 319 | "x64" 320 | ], 321 | "dev": true, 322 | "license": "MIT", 323 | "optional": true, 324 | "os": [ 325 | "darwin" 326 | ], 327 | "engines": { 328 | "node": ">=18" 329 | } 330 | }, 331 | "node_modules/@esbuild/freebsd-arm64": { 332 | "version": "0.25.4", 333 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 334 | "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 335 | "cpu": [ 336 | "arm64" 337 | ], 338 | "dev": true, 339 | "license": "MIT", 340 | "optional": true, 341 | "os": [ 342 | "freebsd" 343 | ], 344 | "engines": { 345 | "node": ">=18" 346 | } 347 | }, 348 | "node_modules/@esbuild/freebsd-x64": { 349 | "version": "0.25.4", 350 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 351 | "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 352 | "cpu": [ 353 | "x64" 354 | ], 355 | "dev": true, 356 | "license": "MIT", 357 | "optional": true, 358 | "os": [ 359 | "freebsd" 360 | ], 361 | "engines": { 362 | "node": ">=18" 363 | } 364 | }, 365 | "node_modules/@esbuild/linux-arm": { 366 | "version": "0.25.4", 367 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 368 | "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 369 | "cpu": [ 370 | "arm" 371 | ], 372 | "dev": true, 373 | "license": "MIT", 374 | "optional": true, 375 | "os": [ 376 | "linux" 377 | ], 378 | "engines": { 379 | "node": ">=18" 380 | } 381 | }, 382 | "node_modules/@esbuild/linux-arm64": { 383 | "version": "0.25.4", 384 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 385 | "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 386 | "cpu": [ 387 | "arm64" 388 | ], 389 | "dev": true, 390 | "license": "MIT", 391 | "optional": true, 392 | "os": [ 393 | "linux" 394 | ], 395 | "engines": { 396 | "node": ">=18" 397 | } 398 | }, 399 | "node_modules/@esbuild/linux-ia32": { 400 | "version": "0.25.4", 401 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 402 | "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 403 | "cpu": [ 404 | "ia32" 405 | ], 406 | "dev": true, 407 | "license": "MIT", 408 | "optional": true, 409 | "os": [ 410 | "linux" 411 | ], 412 | "engines": { 413 | "node": ">=18" 414 | } 415 | }, 416 | "node_modules/@esbuild/linux-loong64": { 417 | "version": "0.25.4", 418 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 419 | "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 420 | "cpu": [ 421 | "loong64" 422 | ], 423 | "dev": true, 424 | "license": "MIT", 425 | "optional": true, 426 | "os": [ 427 | "linux" 428 | ], 429 | "engines": { 430 | "node": ">=18" 431 | } 432 | }, 433 | "node_modules/@esbuild/linux-mips64el": { 434 | "version": "0.25.4", 435 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 436 | "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 437 | "cpu": [ 438 | "mips64el" 439 | ], 440 | "dev": true, 441 | "license": "MIT", 442 | "optional": true, 443 | "os": [ 444 | "linux" 445 | ], 446 | "engines": { 447 | "node": ">=18" 448 | } 449 | }, 450 | "node_modules/@esbuild/linux-ppc64": { 451 | "version": "0.25.4", 452 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 453 | "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 454 | "cpu": [ 455 | "ppc64" 456 | ], 457 | "dev": true, 458 | "license": "MIT", 459 | "optional": true, 460 | "os": [ 461 | "linux" 462 | ], 463 | "engines": { 464 | "node": ">=18" 465 | } 466 | }, 467 | "node_modules/@esbuild/linux-riscv64": { 468 | "version": "0.25.4", 469 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 470 | "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 471 | "cpu": [ 472 | "riscv64" 473 | ], 474 | "dev": true, 475 | "license": "MIT", 476 | "optional": true, 477 | "os": [ 478 | "linux" 479 | ], 480 | "engines": { 481 | "node": ">=18" 482 | } 483 | }, 484 | "node_modules/@esbuild/linux-s390x": { 485 | "version": "0.25.4", 486 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 487 | "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 488 | "cpu": [ 489 | "s390x" 490 | ], 491 | "dev": true, 492 | "license": "MIT", 493 | "optional": true, 494 | "os": [ 495 | "linux" 496 | ], 497 | "engines": { 498 | "node": ">=18" 499 | } 500 | }, 501 | "node_modules/@esbuild/linux-x64": { 502 | "version": "0.25.4", 503 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 504 | "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 505 | "cpu": [ 506 | "x64" 507 | ], 508 | "dev": true, 509 | "license": "MIT", 510 | "optional": true, 511 | "os": [ 512 | "linux" 513 | ], 514 | "engines": { 515 | "node": ">=18" 516 | } 517 | }, 518 | "node_modules/@esbuild/netbsd-arm64": { 519 | "version": "0.25.4", 520 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 521 | "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 522 | "cpu": [ 523 | "arm64" 524 | ], 525 | "dev": true, 526 | "license": "MIT", 527 | "optional": true, 528 | "os": [ 529 | "netbsd" 530 | ], 531 | "engines": { 532 | "node": ">=18" 533 | } 534 | }, 535 | "node_modules/@esbuild/netbsd-x64": { 536 | "version": "0.25.4", 537 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 538 | "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 539 | "cpu": [ 540 | "x64" 541 | ], 542 | "dev": true, 543 | "license": "MIT", 544 | "optional": true, 545 | "os": [ 546 | "netbsd" 547 | ], 548 | "engines": { 549 | "node": ">=18" 550 | } 551 | }, 552 | "node_modules/@esbuild/openbsd-arm64": { 553 | "version": "0.25.4", 554 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 555 | "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 556 | "cpu": [ 557 | "arm64" 558 | ], 559 | "dev": true, 560 | "license": "MIT", 561 | "optional": true, 562 | "os": [ 563 | "openbsd" 564 | ], 565 | "engines": { 566 | "node": ">=18" 567 | } 568 | }, 569 | "node_modules/@esbuild/openbsd-x64": { 570 | "version": "0.25.4", 571 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 572 | "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 573 | "cpu": [ 574 | "x64" 575 | ], 576 | "dev": true, 577 | "license": "MIT", 578 | "optional": true, 579 | "os": [ 580 | "openbsd" 581 | ], 582 | "engines": { 583 | "node": ">=18" 584 | } 585 | }, 586 | "node_modules/@esbuild/sunos-x64": { 587 | "version": "0.25.4", 588 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 589 | "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 590 | "cpu": [ 591 | "x64" 592 | ], 593 | "dev": true, 594 | "license": "MIT", 595 | "optional": true, 596 | "os": [ 597 | "sunos" 598 | ], 599 | "engines": { 600 | "node": ">=18" 601 | } 602 | }, 603 | "node_modules/@esbuild/win32-arm64": { 604 | "version": "0.25.4", 605 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 606 | "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 607 | "cpu": [ 608 | "arm64" 609 | ], 610 | "dev": true, 611 | "license": "MIT", 612 | "optional": true, 613 | "os": [ 614 | "win32" 615 | ], 616 | "engines": { 617 | "node": ">=18" 618 | } 619 | }, 620 | "node_modules/@esbuild/win32-ia32": { 621 | "version": "0.25.4", 622 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 623 | "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 624 | "cpu": [ 625 | "ia32" 626 | ], 627 | "dev": true, 628 | "license": "MIT", 629 | "optional": true, 630 | "os": [ 631 | "win32" 632 | ], 633 | "engines": { 634 | "node": ">=18" 635 | } 636 | }, 637 | "node_modules/@esbuild/win32-x64": { 638 | "version": "0.25.4", 639 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 640 | "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 641 | "cpu": [ 642 | "x64" 643 | ], 644 | "dev": true, 645 | "license": "MIT", 646 | "optional": true, 647 | "os": [ 648 | "win32" 649 | ], 650 | "engines": { 651 | "node": ">=18" 652 | } 653 | }, 654 | "node_modules/@fastify/busboy": { 655 | "version": "2.1.1", 656 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 657 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 658 | "dev": true, 659 | "license": "MIT", 660 | "engines": { 661 | "node": ">=14" 662 | } 663 | }, 664 | "node_modules/@img/sharp-darwin-arm64": { 665 | "version": "0.33.5", 666 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", 667 | "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", 668 | "cpu": [ 669 | "arm64" 670 | ], 671 | "dev": true, 672 | "license": "Apache-2.0", 673 | "optional": true, 674 | "os": [ 675 | "darwin" 676 | ], 677 | "engines": { 678 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 679 | }, 680 | "funding": { 681 | "url": "https://opencollective.com/libvips" 682 | }, 683 | "optionalDependencies": { 684 | "@img/sharp-libvips-darwin-arm64": "1.0.4" 685 | } 686 | }, 687 | "node_modules/@img/sharp-darwin-x64": { 688 | "version": "0.33.5", 689 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", 690 | "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", 691 | "cpu": [ 692 | "x64" 693 | ], 694 | "dev": true, 695 | "license": "Apache-2.0", 696 | "optional": true, 697 | "os": [ 698 | "darwin" 699 | ], 700 | "engines": { 701 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 702 | }, 703 | "funding": { 704 | "url": "https://opencollective.com/libvips" 705 | }, 706 | "optionalDependencies": { 707 | "@img/sharp-libvips-darwin-x64": "1.0.4" 708 | } 709 | }, 710 | "node_modules/@img/sharp-libvips-darwin-arm64": { 711 | "version": "1.0.4", 712 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", 713 | "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", 714 | "cpu": [ 715 | "arm64" 716 | ], 717 | "dev": true, 718 | "license": "LGPL-3.0-or-later", 719 | "optional": true, 720 | "os": [ 721 | "darwin" 722 | ], 723 | "funding": { 724 | "url": "https://opencollective.com/libvips" 725 | } 726 | }, 727 | "node_modules/@img/sharp-libvips-darwin-x64": { 728 | "version": "1.0.4", 729 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", 730 | "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", 731 | "cpu": [ 732 | "x64" 733 | ], 734 | "dev": true, 735 | "license": "LGPL-3.0-or-later", 736 | "optional": true, 737 | "os": [ 738 | "darwin" 739 | ], 740 | "funding": { 741 | "url": "https://opencollective.com/libvips" 742 | } 743 | }, 744 | "node_modules/@img/sharp-libvips-linux-arm": { 745 | "version": "1.0.5", 746 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", 747 | "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", 748 | "cpu": [ 749 | "arm" 750 | ], 751 | "dev": true, 752 | "license": "LGPL-3.0-or-later", 753 | "optional": true, 754 | "os": [ 755 | "linux" 756 | ], 757 | "funding": { 758 | "url": "https://opencollective.com/libvips" 759 | } 760 | }, 761 | "node_modules/@img/sharp-libvips-linux-arm64": { 762 | "version": "1.0.4", 763 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", 764 | "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", 765 | "cpu": [ 766 | "arm64" 767 | ], 768 | "dev": true, 769 | "license": "LGPL-3.0-or-later", 770 | "optional": true, 771 | "os": [ 772 | "linux" 773 | ], 774 | "funding": { 775 | "url": "https://opencollective.com/libvips" 776 | } 777 | }, 778 | "node_modules/@img/sharp-libvips-linux-s390x": { 779 | "version": "1.0.4", 780 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", 781 | "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", 782 | "cpu": [ 783 | "s390x" 784 | ], 785 | "dev": true, 786 | "license": "LGPL-3.0-or-later", 787 | "optional": true, 788 | "os": [ 789 | "linux" 790 | ], 791 | "funding": { 792 | "url": "https://opencollective.com/libvips" 793 | } 794 | }, 795 | "node_modules/@img/sharp-libvips-linux-x64": { 796 | "version": "1.0.4", 797 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", 798 | "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", 799 | "cpu": [ 800 | "x64" 801 | ], 802 | "dev": true, 803 | "license": "LGPL-3.0-or-later", 804 | "optional": true, 805 | "os": [ 806 | "linux" 807 | ], 808 | "funding": { 809 | "url": "https://opencollective.com/libvips" 810 | } 811 | }, 812 | "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 813 | "version": "1.0.4", 814 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", 815 | "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", 816 | "cpu": [ 817 | "arm64" 818 | ], 819 | "dev": true, 820 | "license": "LGPL-3.0-or-later", 821 | "optional": true, 822 | "os": [ 823 | "linux" 824 | ], 825 | "funding": { 826 | "url": "https://opencollective.com/libvips" 827 | } 828 | }, 829 | "node_modules/@img/sharp-libvips-linuxmusl-x64": { 830 | "version": "1.0.4", 831 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", 832 | "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", 833 | "cpu": [ 834 | "x64" 835 | ], 836 | "dev": true, 837 | "license": "LGPL-3.0-or-later", 838 | "optional": true, 839 | "os": [ 840 | "linux" 841 | ], 842 | "funding": { 843 | "url": "https://opencollective.com/libvips" 844 | } 845 | }, 846 | "node_modules/@img/sharp-linux-arm": { 847 | "version": "0.33.5", 848 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", 849 | "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", 850 | "cpu": [ 851 | "arm" 852 | ], 853 | "dev": true, 854 | "license": "Apache-2.0", 855 | "optional": true, 856 | "os": [ 857 | "linux" 858 | ], 859 | "engines": { 860 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 861 | }, 862 | "funding": { 863 | "url": "https://opencollective.com/libvips" 864 | }, 865 | "optionalDependencies": { 866 | "@img/sharp-libvips-linux-arm": "1.0.5" 867 | } 868 | }, 869 | "node_modules/@img/sharp-linux-arm64": { 870 | "version": "0.33.5", 871 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", 872 | "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", 873 | "cpu": [ 874 | "arm64" 875 | ], 876 | "dev": true, 877 | "license": "Apache-2.0", 878 | "optional": true, 879 | "os": [ 880 | "linux" 881 | ], 882 | "engines": { 883 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 884 | }, 885 | "funding": { 886 | "url": "https://opencollective.com/libvips" 887 | }, 888 | "optionalDependencies": { 889 | "@img/sharp-libvips-linux-arm64": "1.0.4" 890 | } 891 | }, 892 | "node_modules/@img/sharp-linux-s390x": { 893 | "version": "0.33.5", 894 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", 895 | "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", 896 | "cpu": [ 897 | "s390x" 898 | ], 899 | "dev": true, 900 | "license": "Apache-2.0", 901 | "optional": true, 902 | "os": [ 903 | "linux" 904 | ], 905 | "engines": { 906 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 907 | }, 908 | "funding": { 909 | "url": "https://opencollective.com/libvips" 910 | }, 911 | "optionalDependencies": { 912 | "@img/sharp-libvips-linux-s390x": "1.0.4" 913 | } 914 | }, 915 | "node_modules/@img/sharp-linux-x64": { 916 | "version": "0.33.5", 917 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", 918 | "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", 919 | "cpu": [ 920 | "x64" 921 | ], 922 | "dev": true, 923 | "license": "Apache-2.0", 924 | "optional": true, 925 | "os": [ 926 | "linux" 927 | ], 928 | "engines": { 929 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 930 | }, 931 | "funding": { 932 | "url": "https://opencollective.com/libvips" 933 | }, 934 | "optionalDependencies": { 935 | "@img/sharp-libvips-linux-x64": "1.0.4" 936 | } 937 | }, 938 | "node_modules/@img/sharp-linuxmusl-arm64": { 939 | "version": "0.33.5", 940 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", 941 | "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", 942 | "cpu": [ 943 | "arm64" 944 | ], 945 | "dev": true, 946 | "license": "Apache-2.0", 947 | "optional": true, 948 | "os": [ 949 | "linux" 950 | ], 951 | "engines": { 952 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 953 | }, 954 | "funding": { 955 | "url": "https://opencollective.com/libvips" 956 | }, 957 | "optionalDependencies": { 958 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" 959 | } 960 | }, 961 | "node_modules/@img/sharp-linuxmusl-x64": { 962 | "version": "0.33.5", 963 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", 964 | "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", 965 | "cpu": [ 966 | "x64" 967 | ], 968 | "dev": true, 969 | "license": "Apache-2.0", 970 | "optional": true, 971 | "os": [ 972 | "linux" 973 | ], 974 | "engines": { 975 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 976 | }, 977 | "funding": { 978 | "url": "https://opencollective.com/libvips" 979 | }, 980 | "optionalDependencies": { 981 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4" 982 | } 983 | }, 984 | "node_modules/@img/sharp-wasm32": { 985 | "version": "0.33.5", 986 | "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", 987 | "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", 988 | "cpu": [ 989 | "wasm32" 990 | ], 991 | "dev": true, 992 | "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", 993 | "optional": true, 994 | "dependencies": { 995 | "@emnapi/runtime": "^1.2.0" 996 | }, 997 | "engines": { 998 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 999 | }, 1000 | "funding": { 1001 | "url": "https://opencollective.com/libvips" 1002 | } 1003 | }, 1004 | "node_modules/@img/sharp-win32-ia32": { 1005 | "version": "0.33.5", 1006 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", 1007 | "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", 1008 | "cpu": [ 1009 | "ia32" 1010 | ], 1011 | "dev": true, 1012 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 1013 | "optional": true, 1014 | "os": [ 1015 | "win32" 1016 | ], 1017 | "engines": { 1018 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1019 | }, 1020 | "funding": { 1021 | "url": "https://opencollective.com/libvips" 1022 | } 1023 | }, 1024 | "node_modules/@img/sharp-win32-x64": { 1025 | "version": "0.33.5", 1026 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", 1027 | "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", 1028 | "cpu": [ 1029 | "x64" 1030 | ], 1031 | "dev": true, 1032 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 1033 | "optional": true, 1034 | "os": [ 1035 | "win32" 1036 | ], 1037 | "engines": { 1038 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1039 | }, 1040 | "funding": { 1041 | "url": "https://opencollective.com/libvips" 1042 | } 1043 | }, 1044 | "node_modules/@jridgewell/resolve-uri": { 1045 | "version": "3.1.2", 1046 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1047 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1048 | "dev": true, 1049 | "license": "MIT", 1050 | "engines": { 1051 | "node": ">=6.0.0" 1052 | } 1053 | }, 1054 | "node_modules/@jridgewell/sourcemap-codec": { 1055 | "version": "1.5.0", 1056 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1057 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1058 | "dev": true, 1059 | "license": "MIT" 1060 | }, 1061 | "node_modules/@jridgewell/trace-mapping": { 1062 | "version": "0.3.9", 1063 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1064 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1065 | "dev": true, 1066 | "license": "MIT", 1067 | "dependencies": { 1068 | "@jridgewell/resolve-uri": "^3.0.3", 1069 | "@jridgewell/sourcemap-codec": "^1.4.10" 1070 | } 1071 | }, 1072 | "node_modules/@types/node": { 1073 | "version": "22.15.29", 1074 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz", 1075 | "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==", 1076 | "dev": true, 1077 | "license": "MIT", 1078 | "dependencies": { 1079 | "undici-types": "~6.21.0" 1080 | } 1081 | }, 1082 | "node_modules/acorn": { 1083 | "version": "8.14.0", 1084 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1085 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1086 | "dev": true, 1087 | "license": "MIT", 1088 | "bin": { 1089 | "acorn": "bin/acorn" 1090 | }, 1091 | "engines": { 1092 | "node": ">=0.4.0" 1093 | } 1094 | }, 1095 | "node_modules/acorn-walk": { 1096 | "version": "8.3.2", 1097 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 1098 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 1099 | "dev": true, 1100 | "license": "MIT", 1101 | "engines": { 1102 | "node": ">=0.4.0" 1103 | } 1104 | }, 1105 | "node_modules/ajv": { 1106 | "version": "6.12.6", 1107 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1108 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1109 | "license": "MIT", 1110 | "peer": true, 1111 | "dependencies": { 1112 | "fast-deep-equal": "^3.1.1", 1113 | "fast-json-stable-stringify": "^2.0.0", 1114 | "json-schema-traverse": "^0.4.1", 1115 | "uri-js": "^4.2.2" 1116 | }, 1117 | "funding": { 1118 | "type": "github", 1119 | "url": "https://github.com/sponsors/epoberezkin" 1120 | } 1121 | }, 1122 | "node_modules/array-buffer-byte-length": { 1123 | "version": "1.0.2", 1124 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", 1125 | "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", 1126 | "license": "MIT", 1127 | "dependencies": { 1128 | "call-bound": "^1.0.3", 1129 | "is-array-buffer": "^3.0.5" 1130 | }, 1131 | "engines": { 1132 | "node": ">= 0.4" 1133 | }, 1134 | "funding": { 1135 | "url": "https://github.com/sponsors/ljharb" 1136 | } 1137 | }, 1138 | "node_modules/array.prototype.findindex": { 1139 | "version": "2.2.4", 1140 | "resolved": "https://registry.npmjs.org/array.prototype.findindex/-/array.prototype.findindex-2.2.4.tgz", 1141 | "integrity": "sha512-LLm4mhxa9v8j0A/RPnpQAP4svXToJFh+Hp1pNYl5ZD5qpB4zdx/D4YjpVcETkhFbUKWO3iGMVLvrOnnmkAJT6A==", 1142 | "license": "MIT", 1143 | "dependencies": { 1144 | "call-bind": "^1.0.8", 1145 | "call-bound": "^1.0.3", 1146 | "define-properties": "^1.2.1", 1147 | "es-abstract": "^1.23.6", 1148 | "es-object-atoms": "^1.0.0", 1149 | "es-shim-unscopables": "^1.0.2" 1150 | }, 1151 | "engines": { 1152 | "node": ">= 0.4" 1153 | } 1154 | }, 1155 | "node_modules/arraybuffer.prototype.slice": { 1156 | "version": "1.0.4", 1157 | "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", 1158 | "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", 1159 | "license": "MIT", 1160 | "dependencies": { 1161 | "array-buffer-byte-length": "^1.0.1", 1162 | "call-bind": "^1.0.8", 1163 | "define-properties": "^1.2.1", 1164 | "es-abstract": "^1.23.5", 1165 | "es-errors": "^1.3.0", 1166 | "get-intrinsic": "^1.2.6", 1167 | "is-array-buffer": "^3.0.4" 1168 | }, 1169 | "engines": { 1170 | "node": ">= 0.4" 1171 | }, 1172 | "funding": { 1173 | "url": "https://github.com/sponsors/ljharb" 1174 | } 1175 | }, 1176 | "node_modules/as-table": { 1177 | "version": "1.0.55", 1178 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 1179 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 1180 | "dev": true, 1181 | "license": "MIT", 1182 | "dependencies": { 1183 | "printable-characters": "^1.0.42" 1184 | } 1185 | }, 1186 | "node_modules/asn1": { 1187 | "version": "0.2.6", 1188 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 1189 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 1190 | "license": "MIT", 1191 | "dependencies": { 1192 | "safer-buffer": "~2.1.0" 1193 | } 1194 | }, 1195 | "node_modules/assert-plus": { 1196 | "version": "1.0.0", 1197 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1198 | "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", 1199 | "license": "MIT", 1200 | "engines": { 1201 | "node": ">=0.8" 1202 | } 1203 | }, 1204 | "node_modules/async-function": { 1205 | "version": "1.0.0", 1206 | "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", 1207 | "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", 1208 | "license": "MIT", 1209 | "engines": { 1210 | "node": ">= 0.4" 1211 | } 1212 | }, 1213 | "node_modules/asynckit": { 1214 | "version": "0.4.0", 1215 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1216 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 1217 | "license": "MIT" 1218 | }, 1219 | "node_modules/available-typed-arrays": { 1220 | "version": "1.0.7", 1221 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 1222 | "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 1223 | "license": "MIT", 1224 | "dependencies": { 1225 | "possible-typed-array-names": "^1.0.0" 1226 | }, 1227 | "engines": { 1228 | "node": ">= 0.4" 1229 | }, 1230 | "funding": { 1231 | "url": "https://github.com/sponsors/ljharb" 1232 | } 1233 | }, 1234 | "node_modules/aws-sign2": { 1235 | "version": "0.7.0", 1236 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 1237 | "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", 1238 | "license": "Apache-2.0", 1239 | "engines": { 1240 | "node": "*" 1241 | } 1242 | }, 1243 | "node_modules/aws4": { 1244 | "version": "1.13.2", 1245 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", 1246 | "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", 1247 | "license": "MIT" 1248 | }, 1249 | "node_modules/bcrypt-pbkdf": { 1250 | "version": "1.0.2", 1251 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 1252 | "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", 1253 | "license": "BSD-3-Clause", 1254 | "dependencies": { 1255 | "tweetnacl": "^0.14.3" 1256 | } 1257 | }, 1258 | "node_modules/bl": { 1259 | "version": "1.2.3", 1260 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 1261 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 1262 | "license": "MIT", 1263 | "dependencies": { 1264 | "readable-stream": "^2.3.5", 1265 | "safe-buffer": "^5.1.1" 1266 | } 1267 | }, 1268 | "node_modules/blake3-wasm": { 1269 | "version": "2.1.5", 1270 | "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", 1271 | "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", 1272 | "dev": true, 1273 | "license": "MIT" 1274 | }, 1275 | "node_modules/bluebird": { 1276 | "version": "3.7.2", 1277 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 1278 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 1279 | "license": "MIT" 1280 | }, 1281 | "node_modules/call-bind": { 1282 | "version": "1.0.8", 1283 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", 1284 | "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", 1285 | "license": "MIT", 1286 | "dependencies": { 1287 | "call-bind-apply-helpers": "^1.0.0", 1288 | "es-define-property": "^1.0.0", 1289 | "get-intrinsic": "^1.2.4", 1290 | "set-function-length": "^1.2.2" 1291 | }, 1292 | "engines": { 1293 | "node": ">= 0.4" 1294 | }, 1295 | "funding": { 1296 | "url": "https://github.com/sponsors/ljharb" 1297 | } 1298 | }, 1299 | "node_modules/call-bind-apply-helpers": { 1300 | "version": "1.0.2", 1301 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 1302 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 1303 | "license": "MIT", 1304 | "dependencies": { 1305 | "es-errors": "^1.3.0", 1306 | "function-bind": "^1.1.2" 1307 | }, 1308 | "engines": { 1309 | "node": ">= 0.4" 1310 | } 1311 | }, 1312 | "node_modules/call-bound": { 1313 | "version": "1.0.4", 1314 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 1315 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 1316 | "license": "MIT", 1317 | "dependencies": { 1318 | "call-bind-apply-helpers": "^1.0.2", 1319 | "get-intrinsic": "^1.3.0" 1320 | }, 1321 | "engines": { 1322 | "node": ">= 0.4" 1323 | }, 1324 | "funding": { 1325 | "url": "https://github.com/sponsors/ljharb" 1326 | } 1327 | }, 1328 | "node_modules/caseless": { 1329 | "version": "0.12.0", 1330 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 1331 | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", 1332 | "license": "Apache-2.0" 1333 | }, 1334 | "node_modules/color": { 1335 | "version": "4.2.3", 1336 | "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 1337 | "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 1338 | "dev": true, 1339 | "license": "MIT", 1340 | "optional": true, 1341 | "dependencies": { 1342 | "color-convert": "^2.0.1", 1343 | "color-string": "^1.9.0" 1344 | }, 1345 | "engines": { 1346 | "node": ">=12.5.0" 1347 | } 1348 | }, 1349 | "node_modules/color-convert": { 1350 | "version": "2.0.1", 1351 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1352 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1353 | "dev": true, 1354 | "license": "MIT", 1355 | "optional": true, 1356 | "dependencies": { 1357 | "color-name": "~1.1.4" 1358 | }, 1359 | "engines": { 1360 | "node": ">=7.0.0" 1361 | } 1362 | }, 1363 | "node_modules/color-name": { 1364 | "version": "1.1.4", 1365 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1366 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1367 | "dev": true, 1368 | "license": "MIT", 1369 | "optional": true 1370 | }, 1371 | "node_modules/color-string": { 1372 | "version": "1.9.1", 1373 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 1374 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 1375 | "dev": true, 1376 | "license": "MIT", 1377 | "optional": true, 1378 | "dependencies": { 1379 | "color-name": "^1.0.0", 1380 | "simple-swizzle": "^0.2.2" 1381 | } 1382 | }, 1383 | "node_modules/combined-stream": { 1384 | "version": "1.0.8", 1385 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1386 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1387 | "license": "MIT", 1388 | "dependencies": { 1389 | "delayed-stream": "~1.0.0" 1390 | }, 1391 | "engines": { 1392 | "node": ">= 0.8" 1393 | } 1394 | }, 1395 | "node_modules/cookie": { 1396 | "version": "0.7.2", 1397 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 1398 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 1399 | "dev": true, 1400 | "license": "MIT", 1401 | "engines": { 1402 | "node": ">= 0.6" 1403 | } 1404 | }, 1405 | "node_modules/core-util-is": { 1406 | "version": "1.0.3", 1407 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1408 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 1409 | "license": "MIT" 1410 | }, 1411 | "node_modules/dashdash": { 1412 | "version": "1.14.1", 1413 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 1414 | "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", 1415 | "license": "MIT", 1416 | "dependencies": { 1417 | "assert-plus": "^1.0.0" 1418 | }, 1419 | "engines": { 1420 | "node": ">=0.10" 1421 | } 1422 | }, 1423 | "node_modules/data-uri-to-buffer": { 1424 | "version": "2.0.2", 1425 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 1426 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 1427 | "dev": true, 1428 | "license": "MIT" 1429 | }, 1430 | "node_modules/data-view-buffer": { 1431 | "version": "1.0.2", 1432 | "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", 1433 | "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", 1434 | "license": "MIT", 1435 | "dependencies": { 1436 | "call-bound": "^1.0.3", 1437 | "es-errors": "^1.3.0", 1438 | "is-data-view": "^1.0.2" 1439 | }, 1440 | "engines": { 1441 | "node": ">= 0.4" 1442 | }, 1443 | "funding": { 1444 | "url": "https://github.com/sponsors/ljharb" 1445 | } 1446 | }, 1447 | "node_modules/data-view-byte-length": { 1448 | "version": "1.0.2", 1449 | "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", 1450 | "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", 1451 | "license": "MIT", 1452 | "dependencies": { 1453 | "call-bound": "^1.0.3", 1454 | "es-errors": "^1.3.0", 1455 | "is-data-view": "^1.0.2" 1456 | }, 1457 | "engines": { 1458 | "node": ">= 0.4" 1459 | }, 1460 | "funding": { 1461 | "url": "https://github.com/sponsors/inspect-js" 1462 | } 1463 | }, 1464 | "node_modules/data-view-byte-offset": { 1465 | "version": "1.0.1", 1466 | "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", 1467 | "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", 1468 | "license": "MIT", 1469 | "dependencies": { 1470 | "call-bound": "^1.0.2", 1471 | "es-errors": "^1.3.0", 1472 | "is-data-view": "^1.0.1" 1473 | }, 1474 | "engines": { 1475 | "node": ">= 0.4" 1476 | }, 1477 | "funding": { 1478 | "url": "https://github.com/sponsors/ljharb" 1479 | } 1480 | }, 1481 | "node_modules/debug": { 1482 | "version": "3.2.7", 1483 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1484 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1485 | "license": "MIT", 1486 | "dependencies": { 1487 | "ms": "^2.1.1" 1488 | } 1489 | }, 1490 | "node_modules/define-data-property": { 1491 | "version": "1.1.4", 1492 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 1493 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 1494 | "license": "MIT", 1495 | "dependencies": { 1496 | "es-define-property": "^1.0.0", 1497 | "es-errors": "^1.3.0", 1498 | "gopd": "^1.0.1" 1499 | }, 1500 | "engines": { 1501 | "node": ">= 0.4" 1502 | }, 1503 | "funding": { 1504 | "url": "https://github.com/sponsors/ljharb" 1505 | } 1506 | }, 1507 | "node_modules/define-properties": { 1508 | "version": "1.2.1", 1509 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 1510 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 1511 | "license": "MIT", 1512 | "dependencies": { 1513 | "define-data-property": "^1.0.1", 1514 | "has-property-descriptors": "^1.0.0", 1515 | "object-keys": "^1.1.1" 1516 | }, 1517 | "engines": { 1518 | "node": ">= 0.4" 1519 | }, 1520 | "funding": { 1521 | "url": "https://github.com/sponsors/ljharb" 1522 | } 1523 | }, 1524 | "node_modules/defu": { 1525 | "version": "6.1.4", 1526 | "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 1527 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 1528 | "dev": true, 1529 | "license": "MIT" 1530 | }, 1531 | "node_modules/delayed-stream": { 1532 | "version": "1.0.0", 1533 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1534 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1535 | "license": "MIT", 1536 | "engines": { 1537 | "node": ">=0.4.0" 1538 | } 1539 | }, 1540 | "node_modules/detect-libc": { 1541 | "version": "2.0.4", 1542 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", 1543 | "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", 1544 | "dev": true, 1545 | "license": "Apache-2.0", 1546 | "optional": true, 1547 | "engines": { 1548 | "node": ">=8" 1549 | } 1550 | }, 1551 | "node_modules/dotenv": { 1552 | "version": "16.5.0", 1553 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", 1554 | "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", 1555 | "license": "BSD-2-Clause", 1556 | "engines": { 1557 | "node": ">=12" 1558 | }, 1559 | "funding": { 1560 | "url": "https://dotenvx.com" 1561 | } 1562 | }, 1563 | "node_modules/dunder-proto": { 1564 | "version": "1.0.1", 1565 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 1566 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 1567 | "license": "MIT", 1568 | "dependencies": { 1569 | "call-bind-apply-helpers": "^1.0.1", 1570 | "es-errors": "^1.3.0", 1571 | "gopd": "^1.2.0" 1572 | }, 1573 | "engines": { 1574 | "node": ">= 0.4" 1575 | } 1576 | }, 1577 | "node_modules/ecc-jsbn": { 1578 | "version": "0.1.2", 1579 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 1580 | "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", 1581 | "license": "MIT", 1582 | "dependencies": { 1583 | "jsbn": "~0.1.0", 1584 | "safer-buffer": "^2.1.0" 1585 | } 1586 | }, 1587 | "node_modules/end-of-stream": { 1588 | "version": "1.4.4", 1589 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1590 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1591 | "license": "MIT", 1592 | "dependencies": { 1593 | "once": "^1.4.0" 1594 | } 1595 | }, 1596 | "node_modules/es-abstract": { 1597 | "version": "1.23.9", 1598 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", 1599 | "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", 1600 | "license": "MIT", 1601 | "dependencies": { 1602 | "array-buffer-byte-length": "^1.0.2", 1603 | "arraybuffer.prototype.slice": "^1.0.4", 1604 | "available-typed-arrays": "^1.0.7", 1605 | "call-bind": "^1.0.8", 1606 | "call-bound": "^1.0.3", 1607 | "data-view-buffer": "^1.0.2", 1608 | "data-view-byte-length": "^1.0.2", 1609 | "data-view-byte-offset": "^1.0.1", 1610 | "es-define-property": "^1.0.1", 1611 | "es-errors": "^1.3.0", 1612 | "es-object-atoms": "^1.0.0", 1613 | "es-set-tostringtag": "^2.1.0", 1614 | "es-to-primitive": "^1.3.0", 1615 | "function.prototype.name": "^1.1.8", 1616 | "get-intrinsic": "^1.2.7", 1617 | "get-proto": "^1.0.0", 1618 | "get-symbol-description": "^1.1.0", 1619 | "globalthis": "^1.0.4", 1620 | "gopd": "^1.2.0", 1621 | "has-property-descriptors": "^1.0.2", 1622 | "has-proto": "^1.2.0", 1623 | "has-symbols": "^1.1.0", 1624 | "hasown": "^2.0.2", 1625 | "internal-slot": "^1.1.0", 1626 | "is-array-buffer": "^3.0.5", 1627 | "is-callable": "^1.2.7", 1628 | "is-data-view": "^1.0.2", 1629 | "is-regex": "^1.2.1", 1630 | "is-shared-array-buffer": "^1.0.4", 1631 | "is-string": "^1.1.1", 1632 | "is-typed-array": "^1.1.15", 1633 | "is-weakref": "^1.1.0", 1634 | "math-intrinsics": "^1.1.0", 1635 | "object-inspect": "^1.13.3", 1636 | "object-keys": "^1.1.1", 1637 | "object.assign": "^4.1.7", 1638 | "own-keys": "^1.0.1", 1639 | "regexp.prototype.flags": "^1.5.3", 1640 | "safe-array-concat": "^1.1.3", 1641 | "safe-push-apply": "^1.0.0", 1642 | "safe-regex-test": "^1.1.0", 1643 | "set-proto": "^1.0.0", 1644 | "string.prototype.trim": "^1.2.10", 1645 | "string.prototype.trimend": "^1.0.9", 1646 | "string.prototype.trimstart": "^1.0.8", 1647 | "typed-array-buffer": "^1.0.3", 1648 | "typed-array-byte-length": "^1.0.3", 1649 | "typed-array-byte-offset": "^1.0.4", 1650 | "typed-array-length": "^1.0.7", 1651 | "unbox-primitive": "^1.1.0", 1652 | "which-typed-array": "^1.1.18" 1653 | }, 1654 | "engines": { 1655 | "node": ">= 0.4" 1656 | }, 1657 | "funding": { 1658 | "url": "https://github.com/sponsors/ljharb" 1659 | } 1660 | }, 1661 | "node_modules/es-define-property": { 1662 | "version": "1.0.1", 1663 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 1664 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 1665 | "license": "MIT", 1666 | "engines": { 1667 | "node": ">= 0.4" 1668 | } 1669 | }, 1670 | "node_modules/es-errors": { 1671 | "version": "1.3.0", 1672 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 1673 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 1674 | "license": "MIT", 1675 | "engines": { 1676 | "node": ">= 0.4" 1677 | } 1678 | }, 1679 | "node_modules/es-object-atoms": { 1680 | "version": "1.1.1", 1681 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 1682 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 1683 | "license": "MIT", 1684 | "dependencies": { 1685 | "es-errors": "^1.3.0" 1686 | }, 1687 | "engines": { 1688 | "node": ">= 0.4" 1689 | } 1690 | }, 1691 | "node_modules/es-set-tostringtag": { 1692 | "version": "2.1.0", 1693 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 1694 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 1695 | "license": "MIT", 1696 | "dependencies": { 1697 | "es-errors": "^1.3.0", 1698 | "get-intrinsic": "^1.2.6", 1699 | "has-tostringtag": "^1.0.2", 1700 | "hasown": "^2.0.2" 1701 | }, 1702 | "engines": { 1703 | "node": ">= 0.4" 1704 | } 1705 | }, 1706 | "node_modules/es-shim-unscopables": { 1707 | "version": "1.1.0", 1708 | "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", 1709 | "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", 1710 | "license": "MIT", 1711 | "dependencies": { 1712 | "hasown": "^2.0.2" 1713 | }, 1714 | "engines": { 1715 | "node": ">= 0.4" 1716 | } 1717 | }, 1718 | "node_modules/es-to-primitive": { 1719 | "version": "1.3.0", 1720 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", 1721 | "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", 1722 | "license": "MIT", 1723 | "dependencies": { 1724 | "is-callable": "^1.2.7", 1725 | "is-date-object": "^1.0.5", 1726 | "is-symbol": "^1.0.4" 1727 | }, 1728 | "engines": { 1729 | "node": ">= 0.4" 1730 | }, 1731 | "funding": { 1732 | "url": "https://github.com/sponsors/ljharb" 1733 | } 1734 | }, 1735 | "node_modules/esbuild": { 1736 | "version": "0.25.4", 1737 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", 1738 | "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 1739 | "dev": true, 1740 | "hasInstallScript": true, 1741 | "license": "MIT", 1742 | "bin": { 1743 | "esbuild": "bin/esbuild" 1744 | }, 1745 | "engines": { 1746 | "node": ">=18" 1747 | }, 1748 | "optionalDependencies": { 1749 | "@esbuild/aix-ppc64": "0.25.4", 1750 | "@esbuild/android-arm": "0.25.4", 1751 | "@esbuild/android-arm64": "0.25.4", 1752 | "@esbuild/android-x64": "0.25.4", 1753 | "@esbuild/darwin-arm64": "0.25.4", 1754 | "@esbuild/darwin-x64": "0.25.4", 1755 | "@esbuild/freebsd-arm64": "0.25.4", 1756 | "@esbuild/freebsd-x64": "0.25.4", 1757 | "@esbuild/linux-arm": "0.25.4", 1758 | "@esbuild/linux-arm64": "0.25.4", 1759 | "@esbuild/linux-ia32": "0.25.4", 1760 | "@esbuild/linux-loong64": "0.25.4", 1761 | "@esbuild/linux-mips64el": "0.25.4", 1762 | "@esbuild/linux-ppc64": "0.25.4", 1763 | "@esbuild/linux-riscv64": "0.25.4", 1764 | "@esbuild/linux-s390x": "0.25.4", 1765 | "@esbuild/linux-x64": "0.25.4", 1766 | "@esbuild/netbsd-arm64": "0.25.4", 1767 | "@esbuild/netbsd-x64": "0.25.4", 1768 | "@esbuild/openbsd-arm64": "0.25.4", 1769 | "@esbuild/openbsd-x64": "0.25.4", 1770 | "@esbuild/sunos-x64": "0.25.4", 1771 | "@esbuild/win32-arm64": "0.25.4", 1772 | "@esbuild/win32-ia32": "0.25.4", 1773 | "@esbuild/win32-x64": "0.25.4" 1774 | } 1775 | }, 1776 | "node_modules/eventemitter3": { 1777 | "version": "3.1.2", 1778 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", 1779 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", 1780 | "license": "MIT" 1781 | }, 1782 | "node_modules/exit-hook": { 1783 | "version": "2.2.1", 1784 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 1785 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 1786 | "dev": true, 1787 | "license": "MIT", 1788 | "engines": { 1789 | "node": ">=6" 1790 | }, 1791 | "funding": { 1792 | "url": "https://github.com/sponsors/sindresorhus" 1793 | } 1794 | }, 1795 | "node_modules/exsolve": { 1796 | "version": "1.0.5", 1797 | "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", 1798 | "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", 1799 | "dev": true, 1800 | "license": "MIT" 1801 | }, 1802 | "node_modules/extend": { 1803 | "version": "3.0.2", 1804 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1805 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 1806 | "license": "MIT" 1807 | }, 1808 | "node_modules/extsprintf": { 1809 | "version": "1.3.0", 1810 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 1811 | "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", 1812 | "engines": [ 1813 | "node >=0.6.0" 1814 | ], 1815 | "license": "MIT" 1816 | }, 1817 | "node_modules/fast-deep-equal": { 1818 | "version": "3.1.3", 1819 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1820 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1821 | "license": "MIT", 1822 | "peer": true 1823 | }, 1824 | "node_modules/fast-json-stable-stringify": { 1825 | "version": "2.1.0", 1826 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1827 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1828 | "license": "MIT", 1829 | "peer": true 1830 | }, 1831 | "node_modules/file-type": { 1832 | "version": "3.9.0", 1833 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 1834 | "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", 1835 | "license": "MIT", 1836 | "engines": { 1837 | "node": ">=0.10.0" 1838 | } 1839 | }, 1840 | "node_modules/for-each": { 1841 | "version": "0.3.5", 1842 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", 1843 | "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", 1844 | "license": "MIT", 1845 | "dependencies": { 1846 | "is-callable": "^1.2.7" 1847 | }, 1848 | "engines": { 1849 | "node": ">= 0.4" 1850 | }, 1851 | "funding": { 1852 | "url": "https://github.com/sponsors/ljharb" 1853 | } 1854 | }, 1855 | "node_modules/forever-agent": { 1856 | "version": "0.6.1", 1857 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1858 | "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", 1859 | "license": "Apache-2.0", 1860 | "engines": { 1861 | "node": "*" 1862 | } 1863 | }, 1864 | "node_modules/form-data": { 1865 | "version": "4.0.2", 1866 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", 1867 | "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", 1868 | "license": "MIT", 1869 | "dependencies": { 1870 | "asynckit": "^0.4.0", 1871 | "combined-stream": "^1.0.8", 1872 | "es-set-tostringtag": "^2.1.0", 1873 | "mime-types": "^2.1.12" 1874 | }, 1875 | "engines": { 1876 | "node": ">= 6" 1877 | } 1878 | }, 1879 | "node_modules/fsevents": { 1880 | "version": "2.3.3", 1881 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1882 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1883 | "dev": true, 1884 | "hasInstallScript": true, 1885 | "license": "MIT", 1886 | "optional": true, 1887 | "os": [ 1888 | "darwin" 1889 | ], 1890 | "engines": { 1891 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1892 | } 1893 | }, 1894 | "node_modules/function-bind": { 1895 | "version": "1.1.2", 1896 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1897 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1898 | "license": "MIT", 1899 | "funding": { 1900 | "url": "https://github.com/sponsors/ljharb" 1901 | } 1902 | }, 1903 | "node_modules/function.prototype.name": { 1904 | "version": "1.1.8", 1905 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", 1906 | "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", 1907 | "license": "MIT", 1908 | "dependencies": { 1909 | "call-bind": "^1.0.8", 1910 | "call-bound": "^1.0.3", 1911 | "define-properties": "^1.2.1", 1912 | "functions-have-names": "^1.2.3", 1913 | "hasown": "^2.0.2", 1914 | "is-callable": "^1.2.7" 1915 | }, 1916 | "engines": { 1917 | "node": ">= 0.4" 1918 | }, 1919 | "funding": { 1920 | "url": "https://github.com/sponsors/ljharb" 1921 | } 1922 | }, 1923 | "node_modules/functions-have-names": { 1924 | "version": "1.2.3", 1925 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 1926 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 1927 | "license": "MIT", 1928 | "funding": { 1929 | "url": "https://github.com/sponsors/ljharb" 1930 | } 1931 | }, 1932 | "node_modules/get-intrinsic": { 1933 | "version": "1.3.0", 1934 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 1935 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 1936 | "license": "MIT", 1937 | "dependencies": { 1938 | "call-bind-apply-helpers": "^1.0.2", 1939 | "es-define-property": "^1.0.1", 1940 | "es-errors": "^1.3.0", 1941 | "es-object-atoms": "^1.1.1", 1942 | "function-bind": "^1.1.2", 1943 | "get-proto": "^1.0.1", 1944 | "gopd": "^1.2.0", 1945 | "has-symbols": "^1.1.0", 1946 | "hasown": "^2.0.2", 1947 | "math-intrinsics": "^1.1.0" 1948 | }, 1949 | "engines": { 1950 | "node": ">= 0.4" 1951 | }, 1952 | "funding": { 1953 | "url": "https://github.com/sponsors/ljharb" 1954 | } 1955 | }, 1956 | "node_modules/get-proto": { 1957 | "version": "1.0.1", 1958 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 1959 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 1960 | "license": "MIT", 1961 | "dependencies": { 1962 | "dunder-proto": "^1.0.1", 1963 | "es-object-atoms": "^1.0.0" 1964 | }, 1965 | "engines": { 1966 | "node": ">= 0.4" 1967 | } 1968 | }, 1969 | "node_modules/get-source": { 1970 | "version": "2.0.12", 1971 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 1972 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 1973 | "dev": true, 1974 | "license": "Unlicense", 1975 | "dependencies": { 1976 | "data-uri-to-buffer": "^2.0.0", 1977 | "source-map": "^0.6.1" 1978 | } 1979 | }, 1980 | "node_modules/get-symbol-description": { 1981 | "version": "1.1.0", 1982 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", 1983 | "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", 1984 | "license": "MIT", 1985 | "dependencies": { 1986 | "call-bound": "^1.0.3", 1987 | "es-errors": "^1.3.0", 1988 | "get-intrinsic": "^1.2.6" 1989 | }, 1990 | "engines": { 1991 | "node": ">= 0.4" 1992 | }, 1993 | "funding": { 1994 | "url": "https://github.com/sponsors/ljharb" 1995 | } 1996 | }, 1997 | "node_modules/getpass": { 1998 | "version": "0.1.7", 1999 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 2000 | "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", 2001 | "license": "MIT", 2002 | "dependencies": { 2003 | "assert-plus": "^1.0.0" 2004 | } 2005 | }, 2006 | "node_modules/glob-to-regexp": { 2007 | "version": "0.4.1", 2008 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 2009 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 2010 | "dev": true, 2011 | "license": "BSD-2-Clause" 2012 | }, 2013 | "node_modules/globalthis": { 2014 | "version": "1.0.4", 2015 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", 2016 | "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", 2017 | "license": "MIT", 2018 | "dependencies": { 2019 | "define-properties": "^1.2.1", 2020 | "gopd": "^1.0.1" 2021 | }, 2022 | "engines": { 2023 | "node": ">= 0.4" 2024 | }, 2025 | "funding": { 2026 | "url": "https://github.com/sponsors/ljharb" 2027 | } 2028 | }, 2029 | "node_modules/gopd": { 2030 | "version": "1.2.0", 2031 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 2032 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 2033 | "license": "MIT", 2034 | "engines": { 2035 | "node": ">= 0.4" 2036 | }, 2037 | "funding": { 2038 | "url": "https://github.com/sponsors/ljharb" 2039 | } 2040 | }, 2041 | "node_modules/har-schema": { 2042 | "version": "2.0.0", 2043 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 2044 | "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", 2045 | "license": "ISC", 2046 | "peer": true, 2047 | "engines": { 2048 | "node": ">=4" 2049 | } 2050 | }, 2051 | "node_modules/har-validator": { 2052 | "version": "5.1.5", 2053 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 2054 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 2055 | "deprecated": "this library is no longer supported", 2056 | "license": "MIT", 2057 | "peer": true, 2058 | "dependencies": { 2059 | "ajv": "^6.12.3", 2060 | "har-schema": "^2.0.0" 2061 | }, 2062 | "engines": { 2063 | "node": ">=6" 2064 | } 2065 | }, 2066 | "node_modules/has-bigints": { 2067 | "version": "1.1.0", 2068 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", 2069 | "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", 2070 | "license": "MIT", 2071 | "engines": { 2072 | "node": ">= 0.4" 2073 | }, 2074 | "funding": { 2075 | "url": "https://github.com/sponsors/ljharb" 2076 | } 2077 | }, 2078 | "node_modules/has-property-descriptors": { 2079 | "version": "1.0.2", 2080 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 2081 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 2082 | "license": "MIT", 2083 | "dependencies": { 2084 | "es-define-property": "^1.0.0" 2085 | }, 2086 | "funding": { 2087 | "url": "https://github.com/sponsors/ljharb" 2088 | } 2089 | }, 2090 | "node_modules/has-proto": { 2091 | "version": "1.2.0", 2092 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", 2093 | "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", 2094 | "license": "MIT", 2095 | "dependencies": { 2096 | "dunder-proto": "^1.0.0" 2097 | }, 2098 | "engines": { 2099 | "node": ">= 0.4" 2100 | }, 2101 | "funding": { 2102 | "url": "https://github.com/sponsors/ljharb" 2103 | } 2104 | }, 2105 | "node_modules/has-symbols": { 2106 | "version": "1.1.0", 2107 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 2108 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 2109 | "license": "MIT", 2110 | "engines": { 2111 | "node": ">= 0.4" 2112 | }, 2113 | "funding": { 2114 | "url": "https://github.com/sponsors/ljharb" 2115 | } 2116 | }, 2117 | "node_modules/has-tostringtag": { 2118 | "version": "1.0.2", 2119 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 2120 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 2121 | "license": "MIT", 2122 | "dependencies": { 2123 | "has-symbols": "^1.0.3" 2124 | }, 2125 | "engines": { 2126 | "node": ">= 0.4" 2127 | }, 2128 | "funding": { 2129 | "url": "https://github.com/sponsors/ljharb" 2130 | } 2131 | }, 2132 | "node_modules/hasown": { 2133 | "version": "2.0.2", 2134 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2135 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2136 | "license": "MIT", 2137 | "dependencies": { 2138 | "function-bind": "^1.1.2" 2139 | }, 2140 | "engines": { 2141 | "node": ">= 0.4" 2142 | } 2143 | }, 2144 | "node_modules/http-signature": { 2145 | "version": "1.4.0", 2146 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", 2147 | "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", 2148 | "license": "MIT", 2149 | "dependencies": { 2150 | "assert-plus": "^1.0.0", 2151 | "jsprim": "^2.0.2", 2152 | "sshpk": "^1.18.0" 2153 | }, 2154 | "engines": { 2155 | "node": ">=0.10" 2156 | } 2157 | }, 2158 | "node_modules/inherits": { 2159 | "version": "2.0.4", 2160 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2161 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2162 | "license": "ISC" 2163 | }, 2164 | "node_modules/internal-slot": { 2165 | "version": "1.1.0", 2166 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", 2167 | "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", 2168 | "license": "MIT", 2169 | "dependencies": { 2170 | "es-errors": "^1.3.0", 2171 | "hasown": "^2.0.2", 2172 | "side-channel": "^1.1.0" 2173 | }, 2174 | "engines": { 2175 | "node": ">= 0.4" 2176 | } 2177 | }, 2178 | "node_modules/is-array-buffer": { 2179 | "version": "3.0.5", 2180 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", 2181 | "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", 2182 | "license": "MIT", 2183 | "dependencies": { 2184 | "call-bind": "^1.0.8", 2185 | "call-bound": "^1.0.3", 2186 | "get-intrinsic": "^1.2.6" 2187 | }, 2188 | "engines": { 2189 | "node": ">= 0.4" 2190 | }, 2191 | "funding": { 2192 | "url": "https://github.com/sponsors/ljharb" 2193 | } 2194 | }, 2195 | "node_modules/is-arrayish": { 2196 | "version": "0.3.2", 2197 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 2198 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", 2199 | "dev": true, 2200 | "license": "MIT", 2201 | "optional": true 2202 | }, 2203 | "node_modules/is-async-function": { 2204 | "version": "2.1.1", 2205 | "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", 2206 | "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", 2207 | "license": "MIT", 2208 | "dependencies": { 2209 | "async-function": "^1.0.0", 2210 | "call-bound": "^1.0.3", 2211 | "get-proto": "^1.0.1", 2212 | "has-tostringtag": "^1.0.2", 2213 | "safe-regex-test": "^1.1.0" 2214 | }, 2215 | "engines": { 2216 | "node": ">= 0.4" 2217 | }, 2218 | "funding": { 2219 | "url": "https://github.com/sponsors/ljharb" 2220 | } 2221 | }, 2222 | "node_modules/is-bigint": { 2223 | "version": "1.1.0", 2224 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", 2225 | "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", 2226 | "license": "MIT", 2227 | "dependencies": { 2228 | "has-bigints": "^1.0.2" 2229 | }, 2230 | "engines": { 2231 | "node": ">= 0.4" 2232 | }, 2233 | "funding": { 2234 | "url": "https://github.com/sponsors/ljharb" 2235 | } 2236 | }, 2237 | "node_modules/is-boolean-object": { 2238 | "version": "1.2.2", 2239 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", 2240 | "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", 2241 | "license": "MIT", 2242 | "dependencies": { 2243 | "call-bound": "^1.0.3", 2244 | "has-tostringtag": "^1.0.2" 2245 | }, 2246 | "engines": { 2247 | "node": ">= 0.4" 2248 | }, 2249 | "funding": { 2250 | "url": "https://github.com/sponsors/ljharb" 2251 | } 2252 | }, 2253 | "node_modules/is-callable": { 2254 | "version": "1.2.7", 2255 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 2256 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 2257 | "license": "MIT", 2258 | "engines": { 2259 | "node": ">= 0.4" 2260 | }, 2261 | "funding": { 2262 | "url": "https://github.com/sponsors/ljharb" 2263 | } 2264 | }, 2265 | "node_modules/is-data-view": { 2266 | "version": "1.0.2", 2267 | "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", 2268 | "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", 2269 | "license": "MIT", 2270 | "dependencies": { 2271 | "call-bound": "^1.0.2", 2272 | "get-intrinsic": "^1.2.6", 2273 | "is-typed-array": "^1.1.13" 2274 | }, 2275 | "engines": { 2276 | "node": ">= 0.4" 2277 | }, 2278 | "funding": { 2279 | "url": "https://github.com/sponsors/ljharb" 2280 | } 2281 | }, 2282 | "node_modules/is-date-object": { 2283 | "version": "1.1.0", 2284 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", 2285 | "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", 2286 | "license": "MIT", 2287 | "dependencies": { 2288 | "call-bound": "^1.0.2", 2289 | "has-tostringtag": "^1.0.2" 2290 | }, 2291 | "engines": { 2292 | "node": ">= 0.4" 2293 | }, 2294 | "funding": { 2295 | "url": "https://github.com/sponsors/ljharb" 2296 | } 2297 | }, 2298 | "node_modules/is-finalizationregistry": { 2299 | "version": "1.1.1", 2300 | "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", 2301 | "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", 2302 | "license": "MIT", 2303 | "dependencies": { 2304 | "call-bound": "^1.0.3" 2305 | }, 2306 | "engines": { 2307 | "node": ">= 0.4" 2308 | }, 2309 | "funding": { 2310 | "url": "https://github.com/sponsors/ljharb" 2311 | } 2312 | }, 2313 | "node_modules/is-generator-function": { 2314 | "version": "1.1.0", 2315 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", 2316 | "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", 2317 | "license": "MIT", 2318 | "dependencies": { 2319 | "call-bound": "^1.0.3", 2320 | "get-proto": "^1.0.0", 2321 | "has-tostringtag": "^1.0.2", 2322 | "safe-regex-test": "^1.1.0" 2323 | }, 2324 | "engines": { 2325 | "node": ">= 0.4" 2326 | }, 2327 | "funding": { 2328 | "url": "https://github.com/sponsors/ljharb" 2329 | } 2330 | }, 2331 | "node_modules/is-map": { 2332 | "version": "2.0.3", 2333 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", 2334 | "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", 2335 | "license": "MIT", 2336 | "engines": { 2337 | "node": ">= 0.4" 2338 | }, 2339 | "funding": { 2340 | "url": "https://github.com/sponsors/ljharb" 2341 | } 2342 | }, 2343 | "node_modules/is-number-object": { 2344 | "version": "1.1.1", 2345 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", 2346 | "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", 2347 | "license": "MIT", 2348 | "dependencies": { 2349 | "call-bound": "^1.0.3", 2350 | "has-tostringtag": "^1.0.2" 2351 | }, 2352 | "engines": { 2353 | "node": ">= 0.4" 2354 | }, 2355 | "funding": { 2356 | "url": "https://github.com/sponsors/ljharb" 2357 | } 2358 | }, 2359 | "node_modules/is-regex": { 2360 | "version": "1.2.1", 2361 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", 2362 | "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", 2363 | "license": "MIT", 2364 | "dependencies": { 2365 | "call-bound": "^1.0.2", 2366 | "gopd": "^1.2.0", 2367 | "has-tostringtag": "^1.0.2", 2368 | "hasown": "^2.0.2" 2369 | }, 2370 | "engines": { 2371 | "node": ">= 0.4" 2372 | }, 2373 | "funding": { 2374 | "url": "https://github.com/sponsors/ljharb" 2375 | } 2376 | }, 2377 | "node_modules/is-set": { 2378 | "version": "2.0.3", 2379 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", 2380 | "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", 2381 | "license": "MIT", 2382 | "engines": { 2383 | "node": ">= 0.4" 2384 | }, 2385 | "funding": { 2386 | "url": "https://github.com/sponsors/ljharb" 2387 | } 2388 | }, 2389 | "node_modules/is-shared-array-buffer": { 2390 | "version": "1.0.4", 2391 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", 2392 | "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", 2393 | "license": "MIT", 2394 | "dependencies": { 2395 | "call-bound": "^1.0.3" 2396 | }, 2397 | "engines": { 2398 | "node": ">= 0.4" 2399 | }, 2400 | "funding": { 2401 | "url": "https://github.com/sponsors/ljharb" 2402 | } 2403 | }, 2404 | "node_modules/is-string": { 2405 | "version": "1.1.1", 2406 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", 2407 | "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", 2408 | "license": "MIT", 2409 | "dependencies": { 2410 | "call-bound": "^1.0.3", 2411 | "has-tostringtag": "^1.0.2" 2412 | }, 2413 | "engines": { 2414 | "node": ">= 0.4" 2415 | }, 2416 | "funding": { 2417 | "url": "https://github.com/sponsors/ljharb" 2418 | } 2419 | }, 2420 | "node_modules/is-symbol": { 2421 | "version": "1.1.1", 2422 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", 2423 | "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", 2424 | "license": "MIT", 2425 | "dependencies": { 2426 | "call-bound": "^1.0.2", 2427 | "has-symbols": "^1.1.0", 2428 | "safe-regex-test": "^1.1.0" 2429 | }, 2430 | "engines": { 2431 | "node": ">= 0.4" 2432 | }, 2433 | "funding": { 2434 | "url": "https://github.com/sponsors/ljharb" 2435 | } 2436 | }, 2437 | "node_modules/is-typed-array": { 2438 | "version": "1.1.15", 2439 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", 2440 | "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", 2441 | "license": "MIT", 2442 | "dependencies": { 2443 | "which-typed-array": "^1.1.16" 2444 | }, 2445 | "engines": { 2446 | "node": ">= 0.4" 2447 | }, 2448 | "funding": { 2449 | "url": "https://github.com/sponsors/ljharb" 2450 | } 2451 | }, 2452 | "node_modules/is-typedarray": { 2453 | "version": "1.0.0", 2454 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 2455 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", 2456 | "license": "MIT" 2457 | }, 2458 | "node_modules/is-weakmap": { 2459 | "version": "2.0.2", 2460 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", 2461 | "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", 2462 | "license": "MIT", 2463 | "engines": { 2464 | "node": ">= 0.4" 2465 | }, 2466 | "funding": { 2467 | "url": "https://github.com/sponsors/ljharb" 2468 | } 2469 | }, 2470 | "node_modules/is-weakref": { 2471 | "version": "1.1.1", 2472 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", 2473 | "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", 2474 | "license": "MIT", 2475 | "dependencies": { 2476 | "call-bound": "^1.0.3" 2477 | }, 2478 | "engines": { 2479 | "node": ">= 0.4" 2480 | }, 2481 | "funding": { 2482 | "url": "https://github.com/sponsors/ljharb" 2483 | } 2484 | }, 2485 | "node_modules/is-weakset": { 2486 | "version": "2.0.4", 2487 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", 2488 | "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", 2489 | "license": "MIT", 2490 | "dependencies": { 2491 | "call-bound": "^1.0.3", 2492 | "get-intrinsic": "^1.2.6" 2493 | }, 2494 | "engines": { 2495 | "node": ">= 0.4" 2496 | }, 2497 | "funding": { 2498 | "url": "https://github.com/sponsors/ljharb" 2499 | } 2500 | }, 2501 | "node_modules/isarray": { 2502 | "version": "1.0.0", 2503 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2504 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 2505 | "license": "MIT" 2506 | }, 2507 | "node_modules/isstream": { 2508 | "version": "0.1.2", 2509 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 2510 | "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", 2511 | "license": "MIT" 2512 | }, 2513 | "node_modules/jsbn": { 2514 | "version": "0.1.1", 2515 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 2516 | "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", 2517 | "license": "MIT" 2518 | }, 2519 | "node_modules/json-schema": { 2520 | "version": "0.4.0", 2521 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 2522 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", 2523 | "license": "(AFL-2.1 OR BSD-3-Clause)" 2524 | }, 2525 | "node_modules/json-schema-traverse": { 2526 | "version": "0.4.1", 2527 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2528 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2529 | "license": "MIT", 2530 | "peer": true 2531 | }, 2532 | "node_modules/json-stringify-safe": { 2533 | "version": "5.0.1", 2534 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 2535 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", 2536 | "license": "ISC" 2537 | }, 2538 | "node_modules/jsprim": { 2539 | "version": "2.0.2", 2540 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", 2541 | "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", 2542 | "engines": [ 2543 | "node >=0.6.0" 2544 | ], 2545 | "license": "MIT", 2546 | "dependencies": { 2547 | "assert-plus": "1.0.0", 2548 | "extsprintf": "1.3.0", 2549 | "json-schema": "0.4.0", 2550 | "verror": "1.10.0" 2551 | } 2552 | }, 2553 | "node_modules/lodash": { 2554 | "version": "4.17.21", 2555 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2556 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2557 | "license": "MIT" 2558 | }, 2559 | "node_modules/math-intrinsics": { 2560 | "version": "1.1.0", 2561 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 2562 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 2563 | "license": "MIT", 2564 | "engines": { 2565 | "node": ">= 0.4" 2566 | } 2567 | }, 2568 | "node_modules/mime": { 2569 | "version": "3.0.0", 2570 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 2571 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 2572 | "dev": true, 2573 | "license": "MIT", 2574 | "bin": { 2575 | "mime": "cli.js" 2576 | }, 2577 | "engines": { 2578 | "node": ">=10.0.0" 2579 | } 2580 | }, 2581 | "node_modules/mime-db": { 2582 | "version": "1.52.0", 2583 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2584 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2585 | "license": "MIT", 2586 | "engines": { 2587 | "node": ">= 0.6" 2588 | } 2589 | }, 2590 | "node_modules/mime-types": { 2591 | "version": "2.1.35", 2592 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2593 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2594 | "license": "MIT", 2595 | "dependencies": { 2596 | "mime-db": "1.52.0" 2597 | }, 2598 | "engines": { 2599 | "node": ">= 0.6" 2600 | } 2601 | }, 2602 | "node_modules/miniflare": { 2603 | "version": "4.20250507.0", 2604 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250507.0.tgz", 2605 | "integrity": "sha512-EgbQRt/Hnr8HCmW2J/4LRNE3yOzJTdNd98XJ8gnGXFKcimXxUFPiWP3k1df+ZPCtEHp6cXxi8+jP7v9vuIbIsg==", 2606 | "dev": true, 2607 | "license": "MIT", 2608 | "dependencies": { 2609 | "@cspotcode/source-map-support": "0.8.1", 2610 | "acorn": "8.14.0", 2611 | "acorn-walk": "8.3.2", 2612 | "exit-hook": "2.2.1", 2613 | "glob-to-regexp": "0.4.1", 2614 | "stoppable": "1.1.0", 2615 | "undici": "^5.28.5", 2616 | "workerd": "1.20250507.0", 2617 | "ws": "8.18.0", 2618 | "youch": "3.3.4", 2619 | "zod": "3.22.3" 2620 | }, 2621 | "bin": { 2622 | "miniflare": "bootstrap.js" 2623 | }, 2624 | "engines": { 2625 | "node": ">=18.0.0" 2626 | } 2627 | }, 2628 | "node_modules/ms": { 2629 | "version": "2.1.3", 2630 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2631 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2632 | "license": "MIT" 2633 | }, 2634 | "node_modules/mustache": { 2635 | "version": "4.2.0", 2636 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 2637 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 2638 | "dev": true, 2639 | "license": "MIT", 2640 | "bin": { 2641 | "mustache": "bin/mustache" 2642 | } 2643 | }, 2644 | "node_modules/node-telegram-bot-api": { 2645 | "version": "0.64.0", 2646 | "resolved": "https://registry.npmjs.org/node-telegram-bot-api/-/node-telegram-bot-api-0.64.0.tgz", 2647 | "integrity": "sha512-/gxCuaEDUyWMBiHInP0ufopUkaaKprXiv3lyP9MMZdPy2KPfYKNYNKfd1Ph7o9KhfURDtOYowPZCi4UCr+2caw==", 2648 | "license": "MIT", 2649 | "dependencies": { 2650 | "@cypress/request": "^3.0.1", 2651 | "@cypress/request-promise": "^5.0.0", 2652 | "array.prototype.findindex": "^2.0.2", 2653 | "bl": "^1.2.3", 2654 | "debug": "^3.2.7", 2655 | "eventemitter3": "^3.0.0", 2656 | "file-type": "^3.9.0", 2657 | "mime": "^1.6.0", 2658 | "pump": "^2.0.0" 2659 | }, 2660 | "engines": { 2661 | "node": ">=0.12" 2662 | } 2663 | }, 2664 | "node_modules/node-telegram-bot-api/node_modules/mime": { 2665 | "version": "1.6.0", 2666 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2667 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 2668 | "license": "MIT", 2669 | "bin": { 2670 | "mime": "cli.js" 2671 | }, 2672 | "engines": { 2673 | "node": ">=4" 2674 | } 2675 | }, 2676 | "node_modules/oauth-sign": { 2677 | "version": "0.9.0", 2678 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 2679 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 2680 | "license": "Apache-2.0", 2681 | "peer": true, 2682 | "engines": { 2683 | "node": "*" 2684 | } 2685 | }, 2686 | "node_modules/object-inspect": { 2687 | "version": "1.13.4", 2688 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 2689 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 2690 | "license": "MIT", 2691 | "engines": { 2692 | "node": ">= 0.4" 2693 | }, 2694 | "funding": { 2695 | "url": "https://github.com/sponsors/ljharb" 2696 | } 2697 | }, 2698 | "node_modules/object-keys": { 2699 | "version": "1.1.1", 2700 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2701 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2702 | "license": "MIT", 2703 | "engines": { 2704 | "node": ">= 0.4" 2705 | } 2706 | }, 2707 | "node_modules/object.assign": { 2708 | "version": "4.1.7", 2709 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", 2710 | "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", 2711 | "license": "MIT", 2712 | "dependencies": { 2713 | "call-bind": "^1.0.8", 2714 | "call-bound": "^1.0.3", 2715 | "define-properties": "^1.2.1", 2716 | "es-object-atoms": "^1.0.0", 2717 | "has-symbols": "^1.1.0", 2718 | "object-keys": "^1.1.1" 2719 | }, 2720 | "engines": { 2721 | "node": ">= 0.4" 2722 | }, 2723 | "funding": { 2724 | "url": "https://github.com/sponsors/ljharb" 2725 | } 2726 | }, 2727 | "node_modules/ohash": { 2728 | "version": "2.0.11", 2729 | "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", 2730 | "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", 2731 | "dev": true, 2732 | "license": "MIT" 2733 | }, 2734 | "node_modules/once": { 2735 | "version": "1.4.0", 2736 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2737 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2738 | "license": "ISC", 2739 | "dependencies": { 2740 | "wrappy": "1" 2741 | } 2742 | }, 2743 | "node_modules/own-keys": { 2744 | "version": "1.0.1", 2745 | "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", 2746 | "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", 2747 | "license": "MIT", 2748 | "dependencies": { 2749 | "get-intrinsic": "^1.2.6", 2750 | "object-keys": "^1.1.1", 2751 | "safe-push-apply": "^1.0.0" 2752 | }, 2753 | "engines": { 2754 | "node": ">= 0.4" 2755 | }, 2756 | "funding": { 2757 | "url": "https://github.com/sponsors/ljharb" 2758 | } 2759 | }, 2760 | "node_modules/path-to-regexp": { 2761 | "version": "6.3.0", 2762 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", 2763 | "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", 2764 | "dev": true, 2765 | "license": "MIT" 2766 | }, 2767 | "node_modules/pathe": { 2768 | "version": "2.0.3", 2769 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 2770 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 2771 | "dev": true, 2772 | "license": "MIT" 2773 | }, 2774 | "node_modules/performance-now": { 2775 | "version": "2.1.0", 2776 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2777 | "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", 2778 | "license": "MIT" 2779 | }, 2780 | "node_modules/possible-typed-array-names": { 2781 | "version": "1.1.0", 2782 | "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", 2783 | "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", 2784 | "license": "MIT", 2785 | "engines": { 2786 | "node": ">= 0.4" 2787 | } 2788 | }, 2789 | "node_modules/printable-characters": { 2790 | "version": "1.0.42", 2791 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 2792 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 2793 | "dev": true, 2794 | "license": "Unlicense" 2795 | }, 2796 | "node_modules/process-nextick-args": { 2797 | "version": "2.0.1", 2798 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2799 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2800 | "license": "MIT" 2801 | }, 2802 | "node_modules/psl": { 2803 | "version": "1.15.0", 2804 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", 2805 | "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", 2806 | "license": "MIT", 2807 | "dependencies": { 2808 | "punycode": "^2.3.1" 2809 | }, 2810 | "funding": { 2811 | "url": "https://github.com/sponsors/lupomontero" 2812 | } 2813 | }, 2814 | "node_modules/pump": { 2815 | "version": "2.0.1", 2816 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 2817 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 2818 | "license": "MIT", 2819 | "dependencies": { 2820 | "end-of-stream": "^1.1.0", 2821 | "once": "^1.3.1" 2822 | } 2823 | }, 2824 | "node_modules/punycode": { 2825 | "version": "2.3.1", 2826 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2827 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2828 | "license": "MIT", 2829 | "engines": { 2830 | "node": ">=6" 2831 | } 2832 | }, 2833 | "node_modules/qs": { 2834 | "version": "6.14.0", 2835 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 2836 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 2837 | "license": "BSD-3-Clause", 2838 | "dependencies": { 2839 | "side-channel": "^1.1.0" 2840 | }, 2841 | "engines": { 2842 | "node": ">=0.6" 2843 | }, 2844 | "funding": { 2845 | "url": "https://github.com/sponsors/ljharb" 2846 | } 2847 | }, 2848 | "node_modules/querystringify": { 2849 | "version": "2.2.0", 2850 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", 2851 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", 2852 | "license": "MIT" 2853 | }, 2854 | "node_modules/readable-stream": { 2855 | "version": "2.3.8", 2856 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 2857 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 2858 | "license": "MIT", 2859 | "dependencies": { 2860 | "core-util-is": "~1.0.0", 2861 | "inherits": "~2.0.3", 2862 | "isarray": "~1.0.0", 2863 | "process-nextick-args": "~2.0.0", 2864 | "safe-buffer": "~5.1.1", 2865 | "string_decoder": "~1.1.1", 2866 | "util-deprecate": "~1.0.1" 2867 | } 2868 | }, 2869 | "node_modules/readable-stream/node_modules/safe-buffer": { 2870 | "version": "5.1.2", 2871 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2872 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2873 | "license": "MIT" 2874 | }, 2875 | "node_modules/reflect.getprototypeof": { 2876 | "version": "1.0.10", 2877 | "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", 2878 | "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", 2879 | "license": "MIT", 2880 | "dependencies": { 2881 | "call-bind": "^1.0.8", 2882 | "define-properties": "^1.2.1", 2883 | "es-abstract": "^1.23.9", 2884 | "es-errors": "^1.3.0", 2885 | "es-object-atoms": "^1.0.0", 2886 | "get-intrinsic": "^1.2.7", 2887 | "get-proto": "^1.0.1", 2888 | "which-builtin-type": "^1.2.1" 2889 | }, 2890 | "engines": { 2891 | "node": ">= 0.4" 2892 | }, 2893 | "funding": { 2894 | "url": "https://github.com/sponsors/ljharb" 2895 | } 2896 | }, 2897 | "node_modules/regexp.prototype.flags": { 2898 | "version": "1.5.4", 2899 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", 2900 | "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", 2901 | "license": "MIT", 2902 | "dependencies": { 2903 | "call-bind": "^1.0.8", 2904 | "define-properties": "^1.2.1", 2905 | "es-errors": "^1.3.0", 2906 | "get-proto": "^1.0.1", 2907 | "gopd": "^1.2.0", 2908 | "set-function-name": "^2.0.2" 2909 | }, 2910 | "engines": { 2911 | "node": ">= 0.4" 2912 | }, 2913 | "funding": { 2914 | "url": "https://github.com/sponsors/ljharb" 2915 | } 2916 | }, 2917 | "node_modules/request": { 2918 | "version": "2.88.2", 2919 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 2920 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 2921 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", 2922 | "license": "Apache-2.0", 2923 | "peer": true, 2924 | "dependencies": { 2925 | "aws-sign2": "~0.7.0", 2926 | "aws4": "^1.8.0", 2927 | "caseless": "~0.12.0", 2928 | "combined-stream": "~1.0.6", 2929 | "extend": "~3.0.2", 2930 | "forever-agent": "~0.6.1", 2931 | "form-data": "~2.3.2", 2932 | "har-validator": "~5.1.3", 2933 | "http-signature": "~1.2.0", 2934 | "is-typedarray": "~1.0.0", 2935 | "isstream": "~0.1.2", 2936 | "json-stringify-safe": "~5.0.1", 2937 | "mime-types": "~2.1.19", 2938 | "oauth-sign": "~0.9.0", 2939 | "performance-now": "^2.1.0", 2940 | "qs": "~6.5.2", 2941 | "safe-buffer": "^5.1.2", 2942 | "tough-cookie": "~2.5.0", 2943 | "tunnel-agent": "^0.6.0", 2944 | "uuid": "^3.3.2" 2945 | }, 2946 | "engines": { 2947 | "node": ">= 6" 2948 | } 2949 | }, 2950 | "node_modules/request-promise-core": { 2951 | "version": "1.1.3", 2952 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", 2953 | "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", 2954 | "license": "ISC", 2955 | "dependencies": { 2956 | "lodash": "^4.17.15" 2957 | }, 2958 | "engines": { 2959 | "node": ">=0.10.0" 2960 | }, 2961 | "peerDependencies": { 2962 | "request": "^2.34" 2963 | } 2964 | }, 2965 | "node_modules/request/node_modules/form-data": { 2966 | "version": "2.3.3", 2967 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 2968 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 2969 | "license": "MIT", 2970 | "peer": true, 2971 | "dependencies": { 2972 | "asynckit": "^0.4.0", 2973 | "combined-stream": "^1.0.6", 2974 | "mime-types": "^2.1.12" 2975 | }, 2976 | "engines": { 2977 | "node": ">= 0.12" 2978 | } 2979 | }, 2980 | "node_modules/request/node_modules/http-signature": { 2981 | "version": "1.2.0", 2982 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 2983 | "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", 2984 | "license": "MIT", 2985 | "peer": true, 2986 | "dependencies": { 2987 | "assert-plus": "^1.0.0", 2988 | "jsprim": "^1.2.2", 2989 | "sshpk": "^1.7.0" 2990 | }, 2991 | "engines": { 2992 | "node": ">=0.8", 2993 | "npm": ">=1.3.7" 2994 | } 2995 | }, 2996 | "node_modules/request/node_modules/jsprim": { 2997 | "version": "1.4.2", 2998 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 2999 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 3000 | "license": "MIT", 3001 | "peer": true, 3002 | "dependencies": { 3003 | "assert-plus": "1.0.0", 3004 | "extsprintf": "1.3.0", 3005 | "json-schema": "0.4.0", 3006 | "verror": "1.10.0" 3007 | }, 3008 | "engines": { 3009 | "node": ">=0.6.0" 3010 | } 3011 | }, 3012 | "node_modules/request/node_modules/qs": { 3013 | "version": "6.5.3", 3014 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 3015 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 3016 | "license": "BSD-3-Clause", 3017 | "peer": true, 3018 | "engines": { 3019 | "node": ">=0.6" 3020 | } 3021 | }, 3022 | "node_modules/request/node_modules/tough-cookie": { 3023 | "version": "2.5.0", 3024 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 3025 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 3026 | "license": "BSD-3-Clause", 3027 | "peer": true, 3028 | "dependencies": { 3029 | "psl": "^1.1.28", 3030 | "punycode": "^2.1.1" 3031 | }, 3032 | "engines": { 3033 | "node": ">=0.8" 3034 | } 3035 | }, 3036 | "node_modules/request/node_modules/uuid": { 3037 | "version": "3.4.0", 3038 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 3039 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 3040 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 3041 | "license": "MIT", 3042 | "peer": true, 3043 | "bin": { 3044 | "uuid": "bin/uuid" 3045 | } 3046 | }, 3047 | "node_modules/requires-port": { 3048 | "version": "1.0.0", 3049 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 3050 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 3051 | "license": "MIT" 3052 | }, 3053 | "node_modules/safe-array-concat": { 3054 | "version": "1.1.3", 3055 | "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", 3056 | "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", 3057 | "license": "MIT", 3058 | "dependencies": { 3059 | "call-bind": "^1.0.8", 3060 | "call-bound": "^1.0.2", 3061 | "get-intrinsic": "^1.2.6", 3062 | "has-symbols": "^1.1.0", 3063 | "isarray": "^2.0.5" 3064 | }, 3065 | "engines": { 3066 | "node": ">=0.4" 3067 | }, 3068 | "funding": { 3069 | "url": "https://github.com/sponsors/ljharb" 3070 | } 3071 | }, 3072 | "node_modules/safe-array-concat/node_modules/isarray": { 3073 | "version": "2.0.5", 3074 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 3075 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 3076 | "license": "MIT" 3077 | }, 3078 | "node_modules/safe-buffer": { 3079 | "version": "5.2.1", 3080 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 3081 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 3082 | "funding": [ 3083 | { 3084 | "type": "github", 3085 | "url": "https://github.com/sponsors/feross" 3086 | }, 3087 | { 3088 | "type": "patreon", 3089 | "url": "https://www.patreon.com/feross" 3090 | }, 3091 | { 3092 | "type": "consulting", 3093 | "url": "https://feross.org/support" 3094 | } 3095 | ], 3096 | "license": "MIT" 3097 | }, 3098 | "node_modules/safe-push-apply": { 3099 | "version": "1.0.0", 3100 | "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", 3101 | "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", 3102 | "license": "MIT", 3103 | "dependencies": { 3104 | "es-errors": "^1.3.0", 3105 | "isarray": "^2.0.5" 3106 | }, 3107 | "engines": { 3108 | "node": ">= 0.4" 3109 | }, 3110 | "funding": { 3111 | "url": "https://github.com/sponsors/ljharb" 3112 | } 3113 | }, 3114 | "node_modules/safe-push-apply/node_modules/isarray": { 3115 | "version": "2.0.5", 3116 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 3117 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 3118 | "license": "MIT" 3119 | }, 3120 | "node_modules/safe-regex-test": { 3121 | "version": "1.1.0", 3122 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", 3123 | "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", 3124 | "license": "MIT", 3125 | "dependencies": { 3126 | "call-bound": "^1.0.2", 3127 | "es-errors": "^1.3.0", 3128 | "is-regex": "^1.2.1" 3129 | }, 3130 | "engines": { 3131 | "node": ">= 0.4" 3132 | }, 3133 | "funding": { 3134 | "url": "https://github.com/sponsors/ljharb" 3135 | } 3136 | }, 3137 | "node_modules/safer-buffer": { 3138 | "version": "2.1.2", 3139 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3140 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 3141 | "license": "MIT" 3142 | }, 3143 | "node_modules/semver": { 3144 | "version": "7.7.2", 3145 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 3146 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 3147 | "dev": true, 3148 | "license": "ISC", 3149 | "optional": true, 3150 | "bin": { 3151 | "semver": "bin/semver.js" 3152 | }, 3153 | "engines": { 3154 | "node": ">=10" 3155 | } 3156 | }, 3157 | "node_modules/set-function-length": { 3158 | "version": "1.2.2", 3159 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 3160 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 3161 | "license": "MIT", 3162 | "dependencies": { 3163 | "define-data-property": "^1.1.4", 3164 | "es-errors": "^1.3.0", 3165 | "function-bind": "^1.1.2", 3166 | "get-intrinsic": "^1.2.4", 3167 | "gopd": "^1.0.1", 3168 | "has-property-descriptors": "^1.0.2" 3169 | }, 3170 | "engines": { 3171 | "node": ">= 0.4" 3172 | } 3173 | }, 3174 | "node_modules/set-function-name": { 3175 | "version": "2.0.2", 3176 | "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 3177 | "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 3178 | "license": "MIT", 3179 | "dependencies": { 3180 | "define-data-property": "^1.1.4", 3181 | "es-errors": "^1.3.0", 3182 | "functions-have-names": "^1.2.3", 3183 | "has-property-descriptors": "^1.0.2" 3184 | }, 3185 | "engines": { 3186 | "node": ">= 0.4" 3187 | } 3188 | }, 3189 | "node_modules/set-proto": { 3190 | "version": "1.0.0", 3191 | "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", 3192 | "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", 3193 | "license": "MIT", 3194 | "dependencies": { 3195 | "dunder-proto": "^1.0.1", 3196 | "es-errors": "^1.3.0", 3197 | "es-object-atoms": "^1.0.0" 3198 | }, 3199 | "engines": { 3200 | "node": ">= 0.4" 3201 | } 3202 | }, 3203 | "node_modules/sharp": { 3204 | "version": "0.33.5", 3205 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", 3206 | "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", 3207 | "dev": true, 3208 | "hasInstallScript": true, 3209 | "license": "Apache-2.0", 3210 | "optional": true, 3211 | "dependencies": { 3212 | "color": "^4.2.3", 3213 | "detect-libc": "^2.0.3", 3214 | "semver": "^7.6.3" 3215 | }, 3216 | "engines": { 3217 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 3218 | }, 3219 | "funding": { 3220 | "url": "https://opencollective.com/libvips" 3221 | }, 3222 | "optionalDependencies": { 3223 | "@img/sharp-darwin-arm64": "0.33.5", 3224 | "@img/sharp-darwin-x64": "0.33.5", 3225 | "@img/sharp-libvips-darwin-arm64": "1.0.4", 3226 | "@img/sharp-libvips-darwin-x64": "1.0.4", 3227 | "@img/sharp-libvips-linux-arm": "1.0.5", 3228 | "@img/sharp-libvips-linux-arm64": "1.0.4", 3229 | "@img/sharp-libvips-linux-s390x": "1.0.4", 3230 | "@img/sharp-libvips-linux-x64": "1.0.4", 3231 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", 3232 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4", 3233 | "@img/sharp-linux-arm": "0.33.5", 3234 | "@img/sharp-linux-arm64": "0.33.5", 3235 | "@img/sharp-linux-s390x": "0.33.5", 3236 | "@img/sharp-linux-x64": "0.33.5", 3237 | "@img/sharp-linuxmusl-arm64": "0.33.5", 3238 | "@img/sharp-linuxmusl-x64": "0.33.5", 3239 | "@img/sharp-wasm32": "0.33.5", 3240 | "@img/sharp-win32-ia32": "0.33.5", 3241 | "@img/sharp-win32-x64": "0.33.5" 3242 | } 3243 | }, 3244 | "node_modules/side-channel": { 3245 | "version": "1.1.0", 3246 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 3247 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 3248 | "license": "MIT", 3249 | "dependencies": { 3250 | "es-errors": "^1.3.0", 3251 | "object-inspect": "^1.13.3", 3252 | "side-channel-list": "^1.0.0", 3253 | "side-channel-map": "^1.0.1", 3254 | "side-channel-weakmap": "^1.0.2" 3255 | }, 3256 | "engines": { 3257 | "node": ">= 0.4" 3258 | }, 3259 | "funding": { 3260 | "url": "https://github.com/sponsors/ljharb" 3261 | } 3262 | }, 3263 | "node_modules/side-channel-list": { 3264 | "version": "1.0.0", 3265 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 3266 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 3267 | "license": "MIT", 3268 | "dependencies": { 3269 | "es-errors": "^1.3.0", 3270 | "object-inspect": "^1.13.3" 3271 | }, 3272 | "engines": { 3273 | "node": ">= 0.4" 3274 | }, 3275 | "funding": { 3276 | "url": "https://github.com/sponsors/ljharb" 3277 | } 3278 | }, 3279 | "node_modules/side-channel-map": { 3280 | "version": "1.0.1", 3281 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 3282 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 3283 | "license": "MIT", 3284 | "dependencies": { 3285 | "call-bound": "^1.0.2", 3286 | "es-errors": "^1.3.0", 3287 | "get-intrinsic": "^1.2.5", 3288 | "object-inspect": "^1.13.3" 3289 | }, 3290 | "engines": { 3291 | "node": ">= 0.4" 3292 | }, 3293 | "funding": { 3294 | "url": "https://github.com/sponsors/ljharb" 3295 | } 3296 | }, 3297 | "node_modules/side-channel-weakmap": { 3298 | "version": "1.0.2", 3299 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 3300 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 3301 | "license": "MIT", 3302 | "dependencies": { 3303 | "call-bound": "^1.0.2", 3304 | "es-errors": "^1.3.0", 3305 | "get-intrinsic": "^1.2.5", 3306 | "object-inspect": "^1.13.3", 3307 | "side-channel-map": "^1.0.1" 3308 | }, 3309 | "engines": { 3310 | "node": ">= 0.4" 3311 | }, 3312 | "funding": { 3313 | "url": "https://github.com/sponsors/ljharb" 3314 | } 3315 | }, 3316 | "node_modules/simple-swizzle": { 3317 | "version": "0.2.2", 3318 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 3319 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 3320 | "dev": true, 3321 | "license": "MIT", 3322 | "optional": true, 3323 | "dependencies": { 3324 | "is-arrayish": "^0.3.1" 3325 | } 3326 | }, 3327 | "node_modules/source-map": { 3328 | "version": "0.6.1", 3329 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3330 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3331 | "dev": true, 3332 | "license": "BSD-3-Clause", 3333 | "engines": { 3334 | "node": ">=0.10.0" 3335 | } 3336 | }, 3337 | "node_modules/sshpk": { 3338 | "version": "1.18.0", 3339 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", 3340 | "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", 3341 | "license": "MIT", 3342 | "dependencies": { 3343 | "asn1": "~0.2.3", 3344 | "assert-plus": "^1.0.0", 3345 | "bcrypt-pbkdf": "^1.0.0", 3346 | "dashdash": "^1.12.0", 3347 | "ecc-jsbn": "~0.1.1", 3348 | "getpass": "^0.1.1", 3349 | "jsbn": "~0.1.0", 3350 | "safer-buffer": "^2.0.2", 3351 | "tweetnacl": "~0.14.0" 3352 | }, 3353 | "bin": { 3354 | "sshpk-conv": "bin/sshpk-conv", 3355 | "sshpk-sign": "bin/sshpk-sign", 3356 | "sshpk-verify": "bin/sshpk-verify" 3357 | }, 3358 | "engines": { 3359 | "node": ">=0.10.0" 3360 | } 3361 | }, 3362 | "node_modules/stacktracey": { 3363 | "version": "2.1.8", 3364 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 3365 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 3366 | "dev": true, 3367 | "license": "Unlicense", 3368 | "dependencies": { 3369 | "as-table": "^1.0.36", 3370 | "get-source": "^2.0.12" 3371 | } 3372 | }, 3373 | "node_modules/stealthy-require": { 3374 | "version": "1.1.1", 3375 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 3376 | "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", 3377 | "license": "ISC", 3378 | "engines": { 3379 | "node": ">=0.10.0" 3380 | } 3381 | }, 3382 | "node_modules/stoppable": { 3383 | "version": "1.1.0", 3384 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 3385 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 3386 | "dev": true, 3387 | "license": "MIT", 3388 | "engines": { 3389 | "node": ">=4", 3390 | "npm": ">=6" 3391 | } 3392 | }, 3393 | "node_modules/string_decoder": { 3394 | "version": "1.1.1", 3395 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3396 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3397 | "license": "MIT", 3398 | "dependencies": { 3399 | "safe-buffer": "~5.1.0" 3400 | } 3401 | }, 3402 | "node_modules/string_decoder/node_modules/safe-buffer": { 3403 | "version": "5.1.2", 3404 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3405 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 3406 | "license": "MIT" 3407 | }, 3408 | "node_modules/string.prototype.trim": { 3409 | "version": "1.2.10", 3410 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", 3411 | "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", 3412 | "license": "MIT", 3413 | "dependencies": { 3414 | "call-bind": "^1.0.8", 3415 | "call-bound": "^1.0.2", 3416 | "define-data-property": "^1.1.4", 3417 | "define-properties": "^1.2.1", 3418 | "es-abstract": "^1.23.5", 3419 | "es-object-atoms": "^1.0.0", 3420 | "has-property-descriptors": "^1.0.2" 3421 | }, 3422 | "engines": { 3423 | "node": ">= 0.4" 3424 | }, 3425 | "funding": { 3426 | "url": "https://github.com/sponsors/ljharb" 3427 | } 3428 | }, 3429 | "node_modules/string.prototype.trimend": { 3430 | "version": "1.0.9", 3431 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", 3432 | "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", 3433 | "license": "MIT", 3434 | "dependencies": { 3435 | "call-bind": "^1.0.8", 3436 | "call-bound": "^1.0.2", 3437 | "define-properties": "^1.2.1", 3438 | "es-object-atoms": "^1.0.0" 3439 | }, 3440 | "engines": { 3441 | "node": ">= 0.4" 3442 | }, 3443 | "funding": { 3444 | "url": "https://github.com/sponsors/ljharb" 3445 | } 3446 | }, 3447 | "node_modules/string.prototype.trimstart": { 3448 | "version": "1.0.8", 3449 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 3450 | "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 3451 | "license": "MIT", 3452 | "dependencies": { 3453 | "call-bind": "^1.0.7", 3454 | "define-properties": "^1.2.1", 3455 | "es-object-atoms": "^1.0.0" 3456 | }, 3457 | "engines": { 3458 | "node": ">= 0.4" 3459 | }, 3460 | "funding": { 3461 | "url": "https://github.com/sponsors/ljharb" 3462 | } 3463 | }, 3464 | "node_modules/tldts": { 3465 | "version": "6.1.86", 3466 | "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", 3467 | "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", 3468 | "license": "MIT", 3469 | "dependencies": { 3470 | "tldts-core": "^6.1.86" 3471 | }, 3472 | "bin": { 3473 | "tldts": "bin/cli.js" 3474 | } 3475 | }, 3476 | "node_modules/tldts-core": { 3477 | "version": "6.1.86", 3478 | "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", 3479 | "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", 3480 | "license": "MIT" 3481 | }, 3482 | "node_modules/tough-cookie": { 3483 | "version": "5.1.2", 3484 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", 3485 | "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", 3486 | "license": "BSD-3-Clause", 3487 | "dependencies": { 3488 | "tldts": "^6.1.32" 3489 | }, 3490 | "engines": { 3491 | "node": ">=16" 3492 | } 3493 | }, 3494 | "node_modules/tslib": { 3495 | "version": "2.8.1", 3496 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 3497 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 3498 | "dev": true, 3499 | "license": "0BSD", 3500 | "optional": true 3501 | }, 3502 | "node_modules/tunnel-agent": { 3503 | "version": "0.6.0", 3504 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3505 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 3506 | "license": "Apache-2.0", 3507 | "dependencies": { 3508 | "safe-buffer": "^5.0.1" 3509 | }, 3510 | "engines": { 3511 | "node": "*" 3512 | } 3513 | }, 3514 | "node_modules/tweetnacl": { 3515 | "version": "0.14.5", 3516 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3517 | "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", 3518 | "license": "Unlicense" 3519 | }, 3520 | "node_modules/typed-array-buffer": { 3521 | "version": "1.0.3", 3522 | "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", 3523 | "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", 3524 | "license": "MIT", 3525 | "dependencies": { 3526 | "call-bound": "^1.0.3", 3527 | "es-errors": "^1.3.0", 3528 | "is-typed-array": "^1.1.14" 3529 | }, 3530 | "engines": { 3531 | "node": ">= 0.4" 3532 | } 3533 | }, 3534 | "node_modules/typed-array-byte-length": { 3535 | "version": "1.0.3", 3536 | "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", 3537 | "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", 3538 | "license": "MIT", 3539 | "dependencies": { 3540 | "call-bind": "^1.0.8", 3541 | "for-each": "^0.3.3", 3542 | "gopd": "^1.2.0", 3543 | "has-proto": "^1.2.0", 3544 | "is-typed-array": "^1.1.14" 3545 | }, 3546 | "engines": { 3547 | "node": ">= 0.4" 3548 | }, 3549 | "funding": { 3550 | "url": "https://github.com/sponsors/ljharb" 3551 | } 3552 | }, 3553 | "node_modules/typed-array-byte-offset": { 3554 | "version": "1.0.4", 3555 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", 3556 | "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", 3557 | "license": "MIT", 3558 | "dependencies": { 3559 | "available-typed-arrays": "^1.0.7", 3560 | "call-bind": "^1.0.8", 3561 | "for-each": "^0.3.3", 3562 | "gopd": "^1.2.0", 3563 | "has-proto": "^1.2.0", 3564 | "is-typed-array": "^1.1.15", 3565 | "reflect.getprototypeof": "^1.0.9" 3566 | }, 3567 | "engines": { 3568 | "node": ">= 0.4" 3569 | }, 3570 | "funding": { 3571 | "url": "https://github.com/sponsors/ljharb" 3572 | } 3573 | }, 3574 | "node_modules/typed-array-length": { 3575 | "version": "1.0.7", 3576 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", 3577 | "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", 3578 | "license": "MIT", 3579 | "dependencies": { 3580 | "call-bind": "^1.0.7", 3581 | "for-each": "^0.3.3", 3582 | "gopd": "^1.0.1", 3583 | "is-typed-array": "^1.1.13", 3584 | "possible-typed-array-names": "^1.0.0", 3585 | "reflect.getprototypeof": "^1.0.6" 3586 | }, 3587 | "engines": { 3588 | "node": ">= 0.4" 3589 | }, 3590 | "funding": { 3591 | "url": "https://github.com/sponsors/ljharb" 3592 | } 3593 | }, 3594 | "node_modules/typescript": { 3595 | "version": "5.8.3", 3596 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 3597 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 3598 | "dev": true, 3599 | "license": "Apache-2.0", 3600 | "bin": { 3601 | "tsc": "bin/tsc", 3602 | "tsserver": "bin/tsserver" 3603 | }, 3604 | "engines": { 3605 | "node": ">=14.17" 3606 | } 3607 | }, 3608 | "node_modules/ufo": { 3609 | "version": "1.6.1", 3610 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", 3611 | "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", 3612 | "dev": true, 3613 | "license": "MIT" 3614 | }, 3615 | "node_modules/unbox-primitive": { 3616 | "version": "1.1.0", 3617 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", 3618 | "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", 3619 | "license": "MIT", 3620 | "dependencies": { 3621 | "call-bound": "^1.0.3", 3622 | "has-bigints": "^1.0.2", 3623 | "has-symbols": "^1.1.0", 3624 | "which-boxed-primitive": "^1.1.1" 3625 | }, 3626 | "engines": { 3627 | "node": ">= 0.4" 3628 | }, 3629 | "funding": { 3630 | "url": "https://github.com/sponsors/ljharb" 3631 | } 3632 | }, 3633 | "node_modules/undici": { 3634 | "version": "5.29.0", 3635 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 3636 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 3637 | "dev": true, 3638 | "license": "MIT", 3639 | "dependencies": { 3640 | "@fastify/busboy": "^2.0.0" 3641 | }, 3642 | "engines": { 3643 | "node": ">=14.0" 3644 | } 3645 | }, 3646 | "node_modules/undici-types": { 3647 | "version": "6.21.0", 3648 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 3649 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 3650 | "dev": true, 3651 | "license": "MIT" 3652 | }, 3653 | "node_modules/unenv": { 3654 | "version": "2.0.0-rc.15", 3655 | "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.15.tgz", 3656 | "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==", 3657 | "dev": true, 3658 | "license": "MIT", 3659 | "dependencies": { 3660 | "defu": "^6.1.4", 3661 | "exsolve": "^1.0.4", 3662 | "ohash": "^2.0.11", 3663 | "pathe": "^2.0.3", 3664 | "ufo": "^1.5.4" 3665 | } 3666 | }, 3667 | "node_modules/universalify": { 3668 | "version": "0.2.0", 3669 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", 3670 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", 3671 | "license": "MIT", 3672 | "engines": { 3673 | "node": ">= 4.0.0" 3674 | } 3675 | }, 3676 | "node_modules/uri-js": { 3677 | "version": "4.4.1", 3678 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3679 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3680 | "license": "BSD-2-Clause", 3681 | "peer": true, 3682 | "dependencies": { 3683 | "punycode": "^2.1.0" 3684 | } 3685 | }, 3686 | "node_modules/url-parse": { 3687 | "version": "1.5.10", 3688 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", 3689 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", 3690 | "license": "MIT", 3691 | "dependencies": { 3692 | "querystringify": "^2.1.1", 3693 | "requires-port": "^1.0.0" 3694 | } 3695 | }, 3696 | "node_modules/util-deprecate": { 3697 | "version": "1.0.2", 3698 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3699 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3700 | "license": "MIT" 3701 | }, 3702 | "node_modules/uuid": { 3703 | "version": "8.3.2", 3704 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 3705 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 3706 | "license": "MIT", 3707 | "bin": { 3708 | "uuid": "dist/bin/uuid" 3709 | } 3710 | }, 3711 | "node_modules/verror": { 3712 | "version": "1.10.0", 3713 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3714 | "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", 3715 | "engines": [ 3716 | "node >=0.6.0" 3717 | ], 3718 | "license": "MIT", 3719 | "dependencies": { 3720 | "assert-plus": "^1.0.0", 3721 | "core-util-is": "1.0.2", 3722 | "extsprintf": "^1.2.0" 3723 | } 3724 | }, 3725 | "node_modules/verror/node_modules/core-util-is": { 3726 | "version": "1.0.2", 3727 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 3728 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", 3729 | "license": "MIT" 3730 | }, 3731 | "node_modules/which-boxed-primitive": { 3732 | "version": "1.1.1", 3733 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", 3734 | "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", 3735 | "license": "MIT", 3736 | "dependencies": { 3737 | "is-bigint": "^1.1.0", 3738 | "is-boolean-object": "^1.2.1", 3739 | "is-number-object": "^1.1.1", 3740 | "is-string": "^1.1.1", 3741 | "is-symbol": "^1.1.1" 3742 | }, 3743 | "engines": { 3744 | "node": ">= 0.4" 3745 | }, 3746 | "funding": { 3747 | "url": "https://github.com/sponsors/ljharb" 3748 | } 3749 | }, 3750 | "node_modules/which-builtin-type": { 3751 | "version": "1.2.1", 3752 | "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", 3753 | "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", 3754 | "license": "MIT", 3755 | "dependencies": { 3756 | "call-bound": "^1.0.2", 3757 | "function.prototype.name": "^1.1.6", 3758 | "has-tostringtag": "^1.0.2", 3759 | "is-async-function": "^2.0.0", 3760 | "is-date-object": "^1.1.0", 3761 | "is-finalizationregistry": "^1.1.0", 3762 | "is-generator-function": "^1.0.10", 3763 | "is-regex": "^1.2.1", 3764 | "is-weakref": "^1.0.2", 3765 | "isarray": "^2.0.5", 3766 | "which-boxed-primitive": "^1.1.0", 3767 | "which-collection": "^1.0.2", 3768 | "which-typed-array": "^1.1.16" 3769 | }, 3770 | "engines": { 3771 | "node": ">= 0.4" 3772 | }, 3773 | "funding": { 3774 | "url": "https://github.com/sponsors/ljharb" 3775 | } 3776 | }, 3777 | "node_modules/which-builtin-type/node_modules/isarray": { 3778 | "version": "2.0.5", 3779 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 3780 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 3781 | "license": "MIT" 3782 | }, 3783 | "node_modules/which-collection": { 3784 | "version": "1.0.2", 3785 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", 3786 | "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", 3787 | "license": "MIT", 3788 | "dependencies": { 3789 | "is-map": "^2.0.3", 3790 | "is-set": "^2.0.3", 3791 | "is-weakmap": "^2.0.2", 3792 | "is-weakset": "^2.0.3" 3793 | }, 3794 | "engines": { 3795 | "node": ">= 0.4" 3796 | }, 3797 | "funding": { 3798 | "url": "https://github.com/sponsors/ljharb" 3799 | } 3800 | }, 3801 | "node_modules/which-typed-array": { 3802 | "version": "1.1.19", 3803 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", 3804 | "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", 3805 | "license": "MIT", 3806 | "dependencies": { 3807 | "available-typed-arrays": "^1.0.7", 3808 | "call-bind": "^1.0.8", 3809 | "call-bound": "^1.0.4", 3810 | "for-each": "^0.3.5", 3811 | "get-proto": "^1.0.1", 3812 | "gopd": "^1.2.0", 3813 | "has-tostringtag": "^1.0.2" 3814 | }, 3815 | "engines": { 3816 | "node": ">= 0.4" 3817 | }, 3818 | "funding": { 3819 | "url": "https://github.com/sponsors/ljharb" 3820 | } 3821 | }, 3822 | "node_modules/workerd": { 3823 | "version": "1.20250507.0", 3824 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250507.0.tgz", 3825 | "integrity": "sha512-OXaGjEh5THT9iblwWIyPrYBoaPe/d4zN03Go7/w8CmS8sma7//O9hjbk43sboWkc89taGPmU0/LNyZUUiUlHeQ==", 3826 | "dev": true, 3827 | "hasInstallScript": true, 3828 | "license": "Apache-2.0", 3829 | "bin": { 3830 | "workerd": "bin/workerd" 3831 | }, 3832 | "engines": { 3833 | "node": ">=16" 3834 | }, 3835 | "optionalDependencies": { 3836 | "@cloudflare/workerd-darwin-64": "1.20250507.0", 3837 | "@cloudflare/workerd-darwin-arm64": "1.20250507.0", 3838 | "@cloudflare/workerd-linux-64": "1.20250507.0", 3839 | "@cloudflare/workerd-linux-arm64": "1.20250507.0", 3840 | "@cloudflare/workerd-windows-64": "1.20250507.0" 3841 | } 3842 | }, 3843 | "node_modules/wrangler": { 3844 | "version": "4.14.4", 3845 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.14.4.tgz", 3846 | "integrity": "sha512-HIdOdiMIcJV5ymw80RKsr3Uzen/p1kRX4jnCEmR2XVeoEhV2Qw6GABxS5WMTlSES2/vEX0Y+ezUAdsprcUhJ5g==", 3847 | "dev": true, 3848 | "license": "MIT OR Apache-2.0", 3849 | "dependencies": { 3850 | "@cloudflare/kv-asset-handler": "0.4.0", 3851 | "@cloudflare/unenv-preset": "2.3.1", 3852 | "blake3-wasm": "2.1.5", 3853 | "esbuild": "0.25.4", 3854 | "miniflare": "4.20250507.0", 3855 | "path-to-regexp": "6.3.0", 3856 | "unenv": "2.0.0-rc.15", 3857 | "workerd": "1.20250507.0" 3858 | }, 3859 | "bin": { 3860 | "wrangler": "bin/wrangler.js", 3861 | "wrangler2": "bin/wrangler.js" 3862 | }, 3863 | "engines": { 3864 | "node": ">=18.0.0" 3865 | }, 3866 | "optionalDependencies": { 3867 | "fsevents": "~2.3.2", 3868 | "sharp": "^0.33.5" 3869 | }, 3870 | "peerDependencies": { 3871 | "@cloudflare/workers-types": "^4.20250507.0" 3872 | }, 3873 | "peerDependenciesMeta": { 3874 | "@cloudflare/workers-types": { 3875 | "optional": true 3876 | } 3877 | } 3878 | }, 3879 | "node_modules/wrappy": { 3880 | "version": "1.0.2", 3881 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3882 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3883 | "license": "ISC" 3884 | }, 3885 | "node_modules/ws": { 3886 | "version": "8.18.0", 3887 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 3888 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 3889 | "dev": true, 3890 | "license": "MIT", 3891 | "engines": { 3892 | "node": ">=10.0.0" 3893 | }, 3894 | "peerDependencies": { 3895 | "bufferutil": "^4.0.1", 3896 | "utf-8-validate": ">=5.0.2" 3897 | }, 3898 | "peerDependenciesMeta": { 3899 | "bufferutil": { 3900 | "optional": true 3901 | }, 3902 | "utf-8-validate": { 3903 | "optional": true 3904 | } 3905 | } 3906 | }, 3907 | "node_modules/youch": { 3908 | "version": "3.3.4", 3909 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", 3910 | "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", 3911 | "dev": true, 3912 | "license": "MIT", 3913 | "dependencies": { 3914 | "cookie": "^0.7.1", 3915 | "mustache": "^4.2.0", 3916 | "stacktracey": "^2.1.8" 3917 | } 3918 | }, 3919 | "node_modules/zod": { 3920 | "version": "3.22.3", 3921 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", 3922 | "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", 3923 | "dev": true, 3924 | "license": "MIT", 3925 | "funding": { 3926 | "url": "https://github.com/sponsors/colinhacks" 3927 | } 3928 | } 3929 | } 3930 | } 3931 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dns-bot", 3 | "version": "1.0.0", 4 | "description": "DNS monitoring bot using Cloudflare Workers", 5 | "main": "src/index.ts", 6 | "scripts": { 7 | "build": "node scripts/build.js", 8 | "deploy": "node scripts/deploy.js", 9 | "dev": "npx wrangler dev", 10 | "test": "echo \"Error: no test specified\" && exit 1" 11 | }, 12 | "keywords": [ 13 | "dns", 14 | "monitoring", 15 | "cloudflare", 16 | "workers" 17 | ], 18 | "author": "", 19 | "license": "MIT", 20 | "dependencies": { 21 | "dotenv": "^16.5.0", 22 | "node-telegram-bot-api": "^0.64.0" 23 | }, 24 | "devDependencies": { 25 | "@cloudflare/workers-types": "^4.20240208.0", 26 | "@types/node": "^22.15.29", 27 | "typescript": "^5.3.3", 28 | "wrangler": "^4.0.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /scripts/deploy.js: -------------------------------------------------------------------------------- 1 | const { execSync } = require("child_process"); 2 | const fs = require("fs"); 3 | const path = require("path"); 4 | const readline = require("readline"); 5 | require("dotenv").config(); 6 | 7 | const rl = readline.createInterface({ 8 | input: process.stdin, 9 | output: process.stdout, 10 | }); 11 | 12 | // Helper to run commands and handle errors 13 | function runCommand(command, errorMessage) { 14 | try { 15 | return execSync(command, { stdio: "inherit" }); 16 | } catch (error) { 17 | console.error(`❌ ${errorMessage}`); 18 | console.error(error.message); 19 | process.exit(1); 20 | } 21 | } 22 | 23 | // Helper to prompt for input 24 | function prompt(question) { 25 | return new Promise((resolve) => { 26 | rl.question(question, (answer) => { 27 | resolve(answer); 28 | }); 29 | }); 30 | } 31 | 32 | // Check if Wrangler is installed 33 | function checkWrangler() { 34 | try { 35 | execSync("npx wrangler --version", { stdio: "ignore" }); 36 | console.log("✅ Wrangler is installed"); 37 | } catch (error) { 38 | console.error("❌ Installing Wrangler..."); 39 | runCommand( 40 | "npm install --save-dev wrangler@4", 41 | "Failed to install Wrangler" 42 | ); 43 | } 44 | } 45 | 46 | // Check if logged in to Cloudflare 47 | function checkCloudflareLogin() { 48 | try { 49 | execSync("npx wrangler whoami", { stdio: "ignore" }); 50 | console.log("✅ Logged in to Cloudflare"); 51 | } catch (error) { 52 | console.error("❌ Not logged in to Cloudflare. Please login..."); 53 | runCommand("npx wrangler login", "Failed to login to Cloudflare"); 54 | } 55 | } 56 | 57 | // Update wrangler.toml with config values 58 | function updateWranglerConfig() { 59 | console.log("📝 Updating wrangler.toml with config values..."); 60 | 61 | // Read config.json 62 | const config = JSON.parse( 63 | fs.readFileSync(path.join(__dirname, "../config.json"), "utf8") 64 | ); 65 | 66 | // Read wrangler.toml 67 | const wranglerPath = path.join(__dirname, "../wrangler.toml"); 68 | let wranglerContent = fs.readFileSync(wranglerPath, "utf8"); 69 | 70 | // Update KV namespace ID 71 | wranglerContent = wranglerContent.replace( 72 | /id = ".*"/, 73 | `id = "${config.kvNamespace.id}"` 74 | ); 75 | 76 | // Update cron schedule 77 | wranglerContent = wranglerContent.replace( 78 | /crons = \[".*"\]/, 79 | `crons = ["${config.cron}"]` 80 | ); 81 | 82 | // Write updated wrangler.toml 83 | fs.writeFileSync(wranglerPath, wranglerContent); 84 | console.log("✅ Updated wrangler.toml with config values"); 85 | } 86 | 87 | // Check and create KV namespace if needed 88 | async function setupKVNamespace() { 89 | const config = JSON.parse( 90 | fs.readFileSync(path.join(__dirname, "../config.json"), "utf8") 91 | ); 92 | 93 | if (!config.kvNamespace?.id) { 94 | console.log("Creating KV namespace..."); 95 | const output = execSync('npx wrangler kv:namespace create "DNS_KV"', { 96 | encoding: "utf8", 97 | }); 98 | const match = output.match(/id = "([^"]+)"/); 99 | 100 | if (!match) { 101 | console.error("❌ Failed to create KV namespace"); 102 | process.exit(1); 103 | } 104 | 105 | const namespaceId = match[1]; 106 | config.kvNamespace = { id: namespaceId }; 107 | fs.writeFileSync( 108 | path.join(__dirname, "../config.json"), 109 | JSON.stringify(config, null, 2) 110 | ); 111 | console.log("✅ KV namespace created and added to config.json"); 112 | } else { 113 | console.log("✅ KV namespace already configured"); 114 | } 115 | } 116 | 117 | // Check and set up Telegram secrets 118 | async function setupTelegramSecrets() { 119 | // TELEGRAM_BOT_TOKEN 120 | let botToken = process.env.TELEGRAM_BOT_TOKEN; 121 | if (botToken) { 122 | console.log("ℹ️ Using TELEGRAM_BOT_TOKEN from environment"); 123 | runCommand( 124 | `echo '${botToken}' | npx wrangler secret put TELEGRAM_BOT_TOKEN`, 125 | "Failed to set Telegram bot token from environment" 126 | ); 127 | } else { 128 | try { 129 | execSync("npx wrangler secret get TELEGRAM_BOT_TOKEN", { 130 | stdio: "ignore", 131 | }); 132 | console.log("✅ Telegram bot token is set"); 133 | } catch (error) { 134 | const token = await prompt("Enter your Telegram bot token: "); 135 | runCommand( 136 | `echo '${token}' | npx wrangler secret put TELEGRAM_BOT_TOKEN`, 137 | "Failed to set Telegram bot token" 138 | ); 139 | } 140 | } 141 | 142 | // TELEGRAM_CHAT_ID 143 | let chatId = process.env.TELEGRAM_CHAT_ID; 144 | if (chatId) { 145 | console.log("ℹ️ Using TELEGRAM_CHAT_ID from environment"); 146 | runCommand( 147 | `echo '${chatId}' | npx wrangler secret put TELEGRAM_CHAT_ID`, 148 | "Failed to set Telegram chat ID from environment" 149 | ); 150 | } else { 151 | try { 152 | execSync("npx wrangler secret get TELEGRAM_CHAT_ID", { stdio: "ignore" }); 153 | console.log("✅ Telegram chat ID is set"); 154 | } catch (error) { 155 | const chatIdPrompt = await prompt("Enter your Telegram chat ID: "); 156 | runCommand( 157 | `echo '${chatIdPrompt}' | npx wrangler secret put TELEGRAM_CHAT_ID`, 158 | "Failed to set Telegram chat ID" 159 | ); 160 | } 161 | } 162 | } 163 | 164 | // Main deployment process 165 | async function deploy() { 166 | console.log("🚀 Starting deployment process...\n"); 167 | 168 | // Check prerequisites 169 | checkWrangler(); 170 | checkCloudflareLogin(); 171 | 172 | // Set up configuration 173 | await setupKVNamespace(); 174 | await setupTelegramSecrets(); 175 | updateWranglerConfig(); 176 | 177 | // Deploy 178 | console.log("\n📦 Deploying..."); 179 | runCommand("npx wrangler deploy", "Deployment failed"); 180 | 181 | console.log("\n✅ Deployment completed successfully!"); 182 | rl.close(); 183 | } 184 | 185 | // Run deployment 186 | deploy().catch((error) => { 187 | console.error("❌ Deployment failed:", error); 188 | process.exit(1); 189 | }); 190 | -------------------------------------------------------------------------------- /src/cert-utils.ts: -------------------------------------------------------------------------------- 1 | import { Env, CertificateInfo, DomainState } from "./types"; 2 | import * as tls from "node:tls"; 3 | 4 | export async function checkCertificate( 5 | domain: string, 6 | ip: string 7 | ): Promise<{ certInfo: CertificateInfo | null; certError: string | null }> { 8 | return new Promise((resolve) => { 9 | let errorMsg: string | null = null; 10 | const socket = tls.connect( 11 | { 12 | host: ip, 13 | servername: domain, 14 | port: 443, 15 | }, 16 | () => { 17 | const cert = socket.getPeerCertificate(); 18 | socket.end(); 19 | 20 | if (!cert || !cert.subject) { 21 | resolve({ 22 | certInfo: null, 23 | certError: "No certificate or subject found", 24 | }); 25 | return; 26 | } 27 | 28 | resolve({ 29 | certInfo: { 30 | issuer: cert.issuer.CN || cert.issuer.O || "Unknown", 31 | subject: cert.subject.CN || cert.subject.O || "Unknown", 32 | validFrom: new Date(cert.valid_from).toISOString(), 33 | validTo: new Date(cert.valid_to).toISOString(), 34 | fingerprint: cert.fingerprint, 35 | }, 36 | certError: null, 37 | }); 38 | } 39 | ); 40 | 41 | socket.on("error", (err) => { 42 | errorMsg = err?.message || "Unknown TLS error"; 43 | resolve({ certInfo: null, certError: errorMsg }); 44 | }); 45 | socket.setTimeout(5000, () => { 46 | socket.destroy(); 47 | resolve({ certInfo: null, certError: "TLS connection timed out" }); 48 | }); 49 | }); 50 | } 51 | 52 | export async function validateCertificates( 53 | domain: string, 54 | ips: string[], 55 | domainState: DomainState 56 | ): Promise<{ 57 | isExpected: boolean; 58 | certInfo: CertificateInfo | null; 59 | certChanged: boolean; 60 | certCriticalError: string | null; 61 | }> { 62 | if (ips.length === 0) { 63 | return { 64 | isExpected: true, 65 | certInfo: null, 66 | certChanged: false, 67 | certCriticalError: null, 68 | }; 69 | } 70 | 71 | // Check certificate for the first IP 72 | const { certInfo, certError } = await checkCertificate(domain, ips[0]); 73 | if (certError) { 74 | return { 75 | isExpected: false, 76 | certInfo: null, 77 | certChanged: false, 78 | certCriticalError: certError, 79 | }; 80 | } 81 | if (!certInfo) { 82 | return { 83 | isExpected: true, 84 | certInfo: null, 85 | certChanged: false, 86 | certCriticalError: null, 87 | }; 88 | } 89 | 90 | // If we have a baseline certificate, compare with it 91 | if (domainState.baselineCert) { 92 | const isExpected = 93 | certInfo.fingerprint === domainState.baselineCert.fingerprint; 94 | return { 95 | isExpected, 96 | certInfo, 97 | certChanged: !isExpected, 98 | certCriticalError: null, 99 | }; 100 | } 101 | 102 | // No baseline certificate, this is our first check 103 | return { 104 | isExpected: true, 105 | certInfo, 106 | certChanged: false, 107 | certCriticalError: null, 108 | }; 109 | } 110 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Env, 3 | CertificateInfo, 4 | DNSResponse, 5 | DomainConfig, 6 | DomainState, 7 | Config, 8 | } from "./types"; 9 | import { checkCertificate, validateCertificates } from "./cert-utils"; 10 | import config from "../config.json"; 11 | 12 | async function sendTelegramMessage(env: Env, message: string): Promise { 13 | const url = `https://api.telegram.org/bot${env.TELEGRAM_BOT_TOKEN}/sendMessage`; 14 | const response = await fetch(url, { 15 | method: "POST", 16 | headers: { 17 | "Content-Type": "application/json", 18 | }, 19 | body: JSON.stringify({ 20 | chat_id: env.TELEGRAM_CHAT_ID, 21 | text: message, 22 | parse_mode: "HTML", 23 | }), 24 | }); 25 | 26 | if (!response.ok) { 27 | throw new Error(`Failed to send Telegram message: ${response.statusText}`); 28 | } 29 | } 30 | 31 | function arraysEqual(a: string[], b: string[]): boolean { 32 | if (a.length !== b.length) return false; 33 | const sortedA = [...a].sort(); 34 | const sortedB = [...b].sort(); 35 | return sortedA.every((val, index) => val === sortedB[index]); 36 | } 37 | 38 | async function queryDNS(domain: string): Promise { 39 | // Using Cloudflare's 1.1.1.1 DNS service for reliable DNS queries 40 | const response = await fetch( 41 | `https://1.1.1.1/dns-query?name=${domain}&type=A`, 42 | { 43 | headers: { 44 | accept: "application/dns-json", 45 | }, 46 | } 47 | ); 48 | return response.json(); 49 | } 50 | 51 | async function checkDomain(env: Env, domainConfig: DomainConfig) { 52 | const domain = domainConfig.name; 53 | const dnsData = await queryDNS(domain); 54 | 55 | // Get current domain state from KV 56 | const domainStateStr = await env.DNS_KV.get(`dns:${domain}`); 57 | const domainState = domainStateStr 58 | ? (JSON.parse(domainStateStr) as DomainState) 59 | : null; 60 | 61 | if (domainState && domainState.ips) { 62 | domainState.ips = [...domainState.ips].sort(); 63 | } 64 | 65 | // Initialize state if it doesn't exist 66 | if (!domainState) { 67 | const newState: DomainState = { 68 | state: "No Reachable Authority", 69 | ips: [], 70 | serial: null, 71 | lastIpChange: null, 72 | lastCertChange: null, 73 | baselineCert: null, 74 | }; 75 | await env.DNS_KV.put(`dns:${domain}`, JSON.stringify(newState)); 76 | console.log(`[${domain}] Initialized state`); 77 | return; 78 | } 79 | 80 | // Check for "No Reachable Authority" case 81 | if (dnsData.Status === 3) { 82 | if (domainState.state !== "No Reachable Authority") { 83 | domainState.state = "No Reachable Authority"; 84 | domainState.ips = []; 85 | domainState.serial = null; 86 | await env.DNS_KV.put(`dns:${domain}`, JSON.stringify(domainState)); 87 | console.log(`[${domain}] Domain unreachable`); 88 | } 89 | return; 90 | } 91 | 92 | // Get current IPs from A records and sort them 93 | const currentIps = ( 94 | dnsData.Answer?.filter((record) => record.type === 1).map( 95 | (record) => record.data 96 | ) || [] 97 | ).sort(); 98 | const previousIps = (domainState.ips || []).sort(); 99 | const ipChanged = !arraysEqual(currentIps, previousIps); 100 | 101 | // Get SOA serial 102 | const soaData = 103 | dnsData.Answer?.find((record) => record.type === 6)?.data.split(" ") || []; 104 | const serial = soaData[2] || null; 105 | 106 | // Update state if needed 107 | let needsUpdate = false; 108 | let certChanged = false; 109 | let certInfo: CertificateInfo | null = null; 110 | 111 | // Always validate certificates 112 | if (currentIps.length > 0) { 113 | const { 114 | isExpected, 115 | certInfo: newCertInfo, 116 | certChanged: newCertChanged, 117 | certCriticalError, 118 | } = await validateCertificates(domain, currentIps, domainState); 119 | 120 | if (certCriticalError) { 121 | const message = 122 | `🚨 CRITICAL: Certificate Validation Error\n\n` + 123 | `Domain: ${domain}\n` + 124 | `Time: ${new Date().toISOString()}\n` + 125 | `Error: ${certCriticalError}\n`; 126 | await sendTelegramMessage(env, message); 127 | console.log( 128 | `[${domain}] CRITICAL: Certificate validation error: ${certCriticalError}` 129 | ); 130 | return; 131 | } 132 | 133 | if (!isExpected && newCertInfo) { 134 | certChanged = newCertChanged; 135 | certInfo = newCertInfo; 136 | domainState.lastCertChange = new Date().toISOString(); 137 | domainState.baselineCert = newCertInfo; 138 | needsUpdate = true; 139 | 140 | if (!domainConfig.suppressCertAlerts) { 141 | const message = 142 | `🚨 Unexpected Certificate Change\n\n` + 143 | `Domain: ${domain}\n` + 144 | `Time: ${new Date().toISOString()}\n\n` + 145 | `Current Certificate:\n` + 146 | `- Issuer: ${newCertInfo.issuer}\n` + 147 | `- Subject: ${newCertInfo.subject}\n` + 148 | `- Valid From: ${newCertInfo.validFrom}\n` + 149 | `- Valid To: ${newCertInfo.validTo}\n` + 150 | `- Fingerprint: ${newCertInfo.fingerprint}\n` + 151 | (domainState.baselineCert 152 | ? `\nPrevious Certificate:\n` + 153 | `- Issuer: ${domainState.baselineCert.issuer}\n` + 154 | `- Subject: ${domainState.baselineCert.subject}\n` + 155 | `- Fingerprint: ${domainState.baselineCert.fingerprint}\n` 156 | : `\nPrevious Certificate: None recorded\n`); 157 | 158 | await sendTelegramMessage(env, message); 159 | console.log(`[${domain}] Certificate changed: ${newCertInfo.issuer}`); 160 | } 161 | } 162 | } 163 | 164 | // Handle IP changes 165 | if (ipChanged) { 166 | domainState.ips = [...currentIps].sort(); 167 | domainState.lastIpChange = new Date().toISOString(); 168 | needsUpdate = true; 169 | 170 | if (!domainConfig.suppressIpChangeAlerts) { 171 | const message = 172 | `⚠️ DNS IP Change Detected\n\n` + 173 | `Domain: ${domain}\n` + 174 | `Previous IPs: ${previousIps.join(", ") || "none"}\n` + 175 | `New IPs: ${currentIps.join(", ")}\n` + 176 | `Time: ${new Date().toISOString()}\n\n` + 177 | `Technical Details:\n` + 178 | `- DNS Status: ${dnsData.Status}\n` + 179 | `- Record Type: A\n` + 180 | `- Number of Records: ${currentIps.length}\n` + 181 | `- SOA Serial: ${serial || "unknown"}`; 182 | 183 | await sendTelegramMessage(env, message); 184 | console.log( 185 | `[${domain}] IPs changed: ${ 186 | previousIps.join(", ") || "none" 187 | } -> ${currentIps.join(", ")}` 188 | ); 189 | } 190 | } 191 | 192 | // Handle SOA changes if IPs haven't changed 193 | if (serial !== domainState.serial && !ipChanged) { 194 | domainState.serial = serial; 195 | needsUpdate = true; 196 | 197 | // Skip SOA alert if suppression is enabled for this domain (default to true) 198 | if (domainConfig.suppressNonIpSoaAlerts !== false) { 199 | return; 200 | } 201 | 202 | // Parse SOA data more carefully 203 | const soaFields = soaData.length >= 7 ? soaData : Array(7).fill("unknown"); 204 | const [primaryNS, adminEmail, serialNum, refresh, retry, expire, minTTL] = 205 | soaFields; 206 | 207 | const message = 208 | `📝 DNS Zone Updated\n\n` + 209 | `Domain: ${domain}\n` + 210 | `Previous Serial: ${domainState.serial || "unknown"}\n` + 211 | `New Serial: ${serialNum || "unknown"}\n` + 212 | `Time: ${new Date().toISOString()}\n\n` + 213 | `Technical Details:\n` + 214 | `- DNS Status: ${dnsData.Status}\n` + 215 | `- Record Type: SOA\n` + 216 | `- Primary NS: ${primaryNS}\n` + 217 | `- Admin Email: ${adminEmail}\n` + 218 | `- Refresh: ${refresh}\n` + 219 | `- Retry: ${retry}\n` + 220 | `- Expire: ${expire}\n` + 221 | `- Min TTL: ${minTTL}`; 222 | 223 | await sendTelegramMessage(env, message); 224 | console.log( 225 | `[${domain}] SOA updated: ${domainState.serial || "unknown"} -> ${ 226 | serialNum || "unknown" 227 | }` 228 | ); 229 | } 230 | 231 | // Check for critical changes (both IP and cert changed within window) 232 | if (ipChanged && certChanged && domainConfig.criticalChangeWindowMinutes) { 233 | const windowMs = domainConfig.criticalChangeWindowMinutes * 60 * 1000; 234 | const lastIpChange = domainState.lastIpChange 235 | ? new Date(domainState.lastIpChange) 236 | : null; 237 | const lastCertChange = domainState.lastCertChange 238 | ? new Date(domainState.lastCertChange) 239 | : null; 240 | const timeSinceLastIpChange = lastIpChange 241 | ? new Date().getTime() - lastIpChange.getTime() 242 | : Infinity; 243 | const timeSinceLastCertChange = lastCertChange 244 | ? new Date().getTime() - lastCertChange.getTime() 245 | : Infinity; 246 | 247 | if ( 248 | timeSinceLastIpChange <= windowMs && 249 | timeSinceLastCertChange <= windowMs 250 | ) { 251 | const message = 252 | `🚨🚨 CRITICAL: Concurrent IP and Certificate Changes\n\n` + 253 | `Domain: ${domain}\n` + 254 | `Time: ${new Date().toISOString()}\n\n` + 255 | `IP Change:\n` + 256 | `- Previous IPs: ${ 257 | domainState.ips.join(", ") || "none" 258 | }\n` + 259 | `- New IPs: ${currentIps.join(", ")}\n\n` + 260 | `Certificate Change:\n` + 261 | `- Current Issuer: ${certInfo?.issuer || "unknown"}\n` + 262 | `- Current Subject: ${certInfo?.subject || "unknown"}\n` + 263 | `- Current Fingerprint: ${ 264 | certInfo?.fingerprint || "unknown" 265 | }\n` + 266 | (domainState.baselineCert 267 | ? `\nPrevious Certificate:\n` + 268 | `- Issuer: ${domainState.baselineCert.issuer}\n` + 269 | `- Subject: ${domainState.baselineCert.subject}\n` + 270 | `- Fingerprint: ${domainState.baselineCert.fingerprint}\n` 271 | : `\nPrevious Certificate: None recorded\n`) + 272 | `\nTechnical Details:\n` + 273 | `- Time Window: ${domainConfig.criticalChangeWindowMinutes} minutes\n` + 274 | `- Last IP Change: ${ 275 | lastIpChange?.toISOString() || "unknown" 276 | }\n` + 277 | `- Last Cert Change: ${ 278 | lastCertChange?.toISOString() || "unknown" 279 | }`; 280 | 281 | await sendTelegramMessage(env, message); 282 | console.log( 283 | `[${domain}] CRITICAL: IP and certificate changed within ${domainConfig.criticalChangeWindowMinutes} minutes` 284 | ); 285 | } 286 | } 287 | 288 | // Save state if there were changes 289 | if (needsUpdate) { 290 | await env.DNS_KV.put(`dns:${domain}`, JSON.stringify(domainState)); 291 | } else { 292 | console.log(`[${domain}] No changes detected`); 293 | } 294 | } 295 | 296 | export default { 297 | async scheduled( 298 | event: ScheduledEvent, 299 | env: Env, 300 | ctx: ExecutionContext 301 | ): Promise { 302 | if (!env.TELEGRAM_BOT_TOKEN || !env.TELEGRAM_CHAT_ID) { 303 | console.error( 304 | "Telegram configuration is missing. Please set TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID" 305 | ); 306 | return; 307 | } 308 | 309 | for (const domainConfig of config.domains) { 310 | await checkDomain(env, domainConfig); 311 | } 312 | }, 313 | 314 | // Add fetch handler for HTTP requests 315 | async fetch( 316 | request: Request, 317 | env: Env, 318 | ctx: ExecutionContext 319 | ): Promise { 320 | return new Response( 321 | "DNS Monitor Worker is running. This worker is triggered by cron.", 322 | { 323 | headers: { "Content-Type": "text/plain" }, 324 | } 325 | ); 326 | }, 327 | }; 328 | -------------------------------------------------------------------------------- /src/test-cert.ts: -------------------------------------------------------------------------------- 1 | import { Env, DNSResponse, CertificateInfo } from "./types"; 2 | import { checkCertificate, validateCertificates } from "./cert-utils"; 3 | 4 | interface DNSAnswer { 5 | name: string; 6 | type: number; 7 | TTL: number; 8 | data: string; 9 | } 10 | 11 | async function testDomain(domain: string, env: Env) { 12 | console.log(`\n=== Testing domain: ${domain} ===`); 13 | 14 | // First, get the current IPs 15 | const dnsResponse = await fetch( 16 | `https://1.1.1.1/dns-query?name=${domain}&type=A`, 17 | { 18 | headers: { 19 | Accept: "application/dns-json", 20 | }, 21 | } 22 | ); 23 | 24 | const dnsData = (await dnsResponse.json()) as DNSResponse; 25 | const currentIPs = 26 | dnsData.Answer?.filter((a: DNSAnswer) => a.type === 1).map( 27 | (a: DNSAnswer) => a.data 28 | ) || []; 29 | 30 | console.log(`Current IPs: ${currentIPs.join(", ")}`); 31 | 32 | if (currentIPs.length === 0) { 33 | console.log("No IPs found for domain"); 34 | return; 35 | } 36 | 37 | // Test certificate validation using the same logic as index.ts 38 | const { isExpected, certInfo, baselineCert } = await validateCertificates( 39 | domain, 40 | currentIPs, 41 | env 42 | ); 43 | 44 | console.log("\nCertificate Check Results:"); 45 | console.log(`Is Expected: ${isExpected ? "✅" : "❌"}`); 46 | 47 | if (certInfo) { 48 | console.log("\nCurrent Certificate:"); 49 | console.log(`Issuer: ${certInfo.issuer}`); 50 | console.log(`Subject: ${certInfo.subject}`); 51 | console.log(`Valid From: ${certInfo.validFrom}`); 52 | console.log(`Valid To: ${certInfo.validTo}`); 53 | console.log(`Fingerprint: ${certInfo.fingerprint}`); 54 | } else { 55 | console.log("\nNo certificate information available"); 56 | } 57 | 58 | if (baselineCert) { 59 | console.log("\nBaseline Certificate:"); 60 | console.log(`Issuer: ${baselineCert.issuer}`); 61 | console.log(`Subject: ${baselineCert.subject}`); 62 | console.log(`Fingerprint: ${baselineCert.fingerprint}`); 63 | } else { 64 | console.log("\nNo baseline certificate recorded"); 65 | } 66 | } 67 | 68 | // Mock KV namespace for testing 69 | class MockKV { 70 | private store: Map = new Map(); 71 | 72 | async get(key: string): Promise { 73 | return this.store.get(key) || null; 74 | } 75 | 76 | async put(key: string, value: string): Promise { 77 | this.store.set(key, value); 78 | } 79 | } 80 | 81 | async function main() { 82 | // Test domains 83 | const testDomains = ["yearn.fi", "curve.fi", "safe.global"]; 84 | 85 | // Create mock environment 86 | const env: Env = { 87 | DNS_KV: new MockKV() as any, 88 | MONITOR_DOMAINS: testDomains.join(","), 89 | TELEGRAM_BOT_TOKEN: "test-token", 90 | TELEGRAM_CHAT_ID: "test-chat", 91 | }; 92 | 93 | // Test each domain 94 | for (const domain of testDomains) { 95 | await testDomain(domain, env); 96 | } 97 | } 98 | 99 | // Run the tests 100 | main().catch(console.error); 101 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export interface Env { 2 | DNS_KV: KVNamespace; 3 | MONITOR_DOMAINS: string; 4 | TELEGRAM_BOT_TOKEN: string; 5 | TELEGRAM_CHAT_ID: string; 6 | } 7 | 8 | export interface DNSResponse { 9 | Status: number; 10 | TC?: boolean; 11 | RD?: boolean; 12 | RA?: boolean; 13 | AD?: boolean; 14 | CD?: boolean; 15 | Answer?: Array<{ 16 | name: string; 17 | type: number; 18 | TTL: number; 19 | data: string; 20 | }>; 21 | Question?: Array<{ 22 | name: string; 23 | type: number; 24 | }>; 25 | Comment?: string[]; 26 | } 27 | 28 | export interface KVNamespace { 29 | get(key: string): Promise; 30 | put(key: string, value: string): Promise; 31 | } 32 | 33 | export interface CertificateInfo { 34 | issuer: string; 35 | subject: string; 36 | validFrom: string; 37 | validTo: string; 38 | fingerprint: string; 39 | } 40 | 41 | export interface DomainConfig { 42 | name: string; 43 | suppressNonIpSoaAlerts?: boolean; 44 | suppressCertAlerts?: boolean; 45 | suppressIpChangeAlerts?: boolean; 46 | criticalChangeWindowMinutes?: number; 47 | } 48 | 49 | export interface DomainState { 50 | state: string; 51 | ips: string[]; 52 | serial: string | null; 53 | lastIpChange: string | null; 54 | lastCertChange: string | null; 55 | baselineCert: CertificateInfo | null; 56 | } 57 | 58 | export interface Config { 59 | domains: DomainConfig[]; 60 | cron: string; 61 | kvNamespace: { 62 | id: string; 63 | }; 64 | } 65 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "ES2020", 5 | "lib": ["ES2020", "DOM"], 6 | "types": ["@cloudflare/workers-types"], 7 | "moduleResolution": "node", 8 | "strict": true, 9 | "noImplicitAny": true, 10 | "strictNullChecks": true, 11 | "strictFunctionTypes": true, 12 | "strictBindCallApply": true, 13 | "strictPropertyInitialization": true, 14 | "noImplicitThis": true, 15 | "alwaysStrict": true, 16 | "esModuleInterop": true, 17 | "resolveJsonModule": true, 18 | "skipLibCheck": true, 19 | "forceConsistentCasingInFileNames": true, 20 | "outDir": "dist" 21 | }, 22 | "include": ["src/**/*"], 23 | "exclude": ["node_modules", "dist"] 24 | } 25 | -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "dns-bot" 2 | main = "src/index.ts" 3 | compatibility_date = "2024-02-20" 4 | compatibility_flags = ["nodejs_compat"] 5 | 6 | # KV Namespace configuration 7 | kv_namespaces = [ 8 | { binding = "DNS_KV", id = "860d4c5cb9384e1cab56e7e70504d765" } 9 | ] 10 | 11 | # Cron trigger configuration (runs every minute) 12 | [triggers] 13 | crons = ["* * * * *"] --------------------------------------------------------------------------------