├── .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 |
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 = ["* * * * *"]
--------------------------------------------------------------------------------