├── .github └── workflows │ ├── build.yaml │ └── publish.yaml ├── .gitignore ├── .npmignore ├── LICENSE.txt ├── README.md ├── fixup ├── package-lock.json ├── package.json ├── src ├── CHANGELOG.md ├── index.test.ts ├── index.ts └── types.ts ├── tsconfig-base.json ├── tsconfig-cjs.json └── tsconfig.json /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Node.js CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | strategy: 10 | matrix: 11 | node-version: ["16.x", "18.x", "20.x"] 12 | 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Use Node.js ${{ matrix.node-version }} 16 | uses: actions/setup-node@v3 17 | with: 18 | node-version: ${{ matrix.node-version }} 19 | - run: npm ci 20 | - run: npm run build --if-present 21 | - run: npm test 22 | -------------------------------------------------------------------------------- /.github/workflows/publish.yaml: -------------------------------------------------------------------------------- 1 | name: Publish Package to npmjs 2 | on: 3 | release: 4 | types: [published] 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v4 10 | # Setup .npmrc file to publish to npm 11 | - uses: actions/setup-node@v3 12 | with: 13 | node-version: "20.x" 14 | registry-url: "https://registry.npmjs.org" 15 | - run: npm ci 16 | - run: npm publish 17 | env: 18 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 Userlist, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # urlbox-node 2 | 3 | Quickly generate screenshots, PDFs and other renders using the urlbox screenshot as a service API. 4 | 5 | Signup at [Urlbox](https://urlbox.com) to get an API key and secret. 6 | 7 | ## Installation 8 | 9 | ``` 10 | npm install urlbox --save 11 | ``` 12 | 13 | ## Example 14 | 15 | ```js 16 | import Urlbox from "urlbox"; 17 | 18 | // Get your API key and secret from urlbox.com 19 | const urlbox = Urlbox(YOUR_API_KEY, YOUR_API_SECRET); 20 | 21 | // See all urlbox screenshot options at urlbox.com/docs 22 | const options = { 23 | url: "github.com", 24 | thumb_width: 600, 25 | format: "jpg", 26 | quality: 80, 27 | }; 28 | 29 | const imgUrl = urlbox.generateRenderLink(options); 30 | // https://api.urlbox.io/v1/YOUR_API_KEY/TOKEN/jpg?url=github.com&thumb_width=600&quality=80 31 | ``` 32 | 33 | Now stick that url in an img tag to render the screenshot! 34 | 35 |  36 | 37 | Available options: 38 | 39 | | Option | Default | Description | 40 | | --------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 41 | | `url` | - | The URL of the website you want to screenshot | 42 | | `width` | 1280 | Viewport width of the browser in pixels | 43 | | `height` | 1024 | Viewport height of the browser in pixels | 44 | | `selector` | - | Take a screenshot of the element that matches this selector | 45 | | `thumb_width` | - | Width in pixels of the generated thumbnail, leave off for full-size screenshot | 46 | | `format` | png | Format of the resulting screenshot image (`png` or `jpg`) | 47 | | `user_agent` | - | User-Agent string used to emulate a particular client. | 48 | | `cookie` | - | Set a cookie value before taking a screenshot. E.g. OptIn=true. Can be set multiple times to set more than one cookie. | 49 | | `delay` | - | Amount of time to wait in milliseconds before urlbox takes the screenshot | 50 | | `wait_for` | - | Waits for the element specified by this selector to be visible on the page before taking a screenshot | 51 | | `timeout` | 30000 | Amount of time to wait in milliseconds for the website at url to respond | 52 | | `full_page` | false | Specify whether to capture the full-length of the website | 53 | | `flash` | false | Enable the flash plugin for flash using websites | 54 | | `force` | false | Take a fresh screenshot instead of getting a cached version | 55 | | `ttl` | 2592000 (30 days) | Short for 'time to live'. Number of seconds to keep a screenshot in the cache. Note the default is also the maximum value for this option. | 56 | | `quality` | 80 | JPEG only - image quality of resulting screenshot (0-100) | 57 | | `disable_js` | false | Turn off javascript on target url to prevent popups | 58 | | `retina` | false | Take a 'retina' or high definition screenshot equivalent to setting a device pixel ratio of 2.0 or @2x. Please note that retina screenshots will be double the normal dimensions and will normally take slightly longer to process due to the much bigger image size. | 59 | | `click` | - | Element selector that is clicked before taking a screenshot e.g. #clickme would click the element with id="clickme" | 60 | | `hover` | - | Element selector that is hovered before taking a screenshot e.g. #hoverme would hover over the element with id="clickme" | 61 | | `bg_color` | - | Hex code or css color string. Some websites don't set a body background colour, and will show up as transparent backgrounds with PNG or black when using JPG. Use this setting to set a background colour. If the website explicitly sets a transparent background on the html or body elements, this setting will be overridden. | 62 | | `crop_width` | - | Crop the width of the screenshot to this size in pixels | 63 | | `hide_selector` | - | Hides all elements that match the element selector by setting their style to `display:none !important;`. Useful for hiding popups. | 64 | | `highlight` | - | Word to highlight on the page before capturing a screenshot | 65 | | `highlightfg` | white | Text color of the highlighted word | 66 | | `highlightbg` | red | Background color of the highlighted word | 67 | | `use_s3` | false | Save the screenshot directly to the S3 bucket configured on your account | 68 | -------------------------------------------------------------------------------- /fixup: -------------------------------------------------------------------------------- 1 | cat >dist/cjs/package.json <dist/mjs/package.json <=12" 36 | } 37 | }, 38 | "node_modules/@esbuild/android-arm": { 39 | "version": "0.20.2", 40 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", 41 | "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", 42 | "cpu": [ 43 | "arm" 44 | ], 45 | "dev": true, 46 | "optional": true, 47 | "os": [ 48 | "android" 49 | ], 50 | "engines": { 51 | "node": ">=12" 52 | } 53 | }, 54 | "node_modules/@esbuild/android-arm64": { 55 | "version": "0.20.2", 56 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", 57 | "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", 58 | "cpu": [ 59 | "arm64" 60 | ], 61 | "dev": true, 62 | "optional": true, 63 | "os": [ 64 | "android" 65 | ], 66 | "engines": { 67 | "node": ">=12" 68 | } 69 | }, 70 | "node_modules/@esbuild/android-x64": { 71 | "version": "0.20.2", 72 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", 73 | "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", 74 | "cpu": [ 75 | "x64" 76 | ], 77 | "dev": true, 78 | "optional": true, 79 | "os": [ 80 | "android" 81 | ], 82 | "engines": { 83 | "node": ">=12" 84 | } 85 | }, 86 | "node_modules/@esbuild/darwin-arm64": { 87 | "version": "0.20.2", 88 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", 89 | "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", 90 | "cpu": [ 91 | "arm64" 92 | ], 93 | "dev": true, 94 | "optional": true, 95 | "os": [ 96 | "darwin" 97 | ], 98 | "engines": { 99 | "node": ">=12" 100 | } 101 | }, 102 | "node_modules/@esbuild/darwin-x64": { 103 | "version": "0.20.2", 104 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", 105 | "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", 106 | "cpu": [ 107 | "x64" 108 | ], 109 | "dev": true, 110 | "optional": true, 111 | "os": [ 112 | "darwin" 113 | ], 114 | "engines": { 115 | "node": ">=12" 116 | } 117 | }, 118 | "node_modules/@esbuild/freebsd-arm64": { 119 | "version": "0.20.2", 120 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", 121 | "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", 122 | "cpu": [ 123 | "arm64" 124 | ], 125 | "dev": true, 126 | "optional": true, 127 | "os": [ 128 | "freebsd" 129 | ], 130 | "engines": { 131 | "node": ">=12" 132 | } 133 | }, 134 | "node_modules/@esbuild/freebsd-x64": { 135 | "version": "0.20.2", 136 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", 137 | "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", 138 | "cpu": [ 139 | "x64" 140 | ], 141 | "dev": true, 142 | "optional": true, 143 | "os": [ 144 | "freebsd" 145 | ], 146 | "engines": { 147 | "node": ">=12" 148 | } 149 | }, 150 | "node_modules/@esbuild/linux-arm": { 151 | "version": "0.20.2", 152 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", 153 | "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", 154 | "cpu": [ 155 | "arm" 156 | ], 157 | "dev": true, 158 | "optional": true, 159 | "os": [ 160 | "linux" 161 | ], 162 | "engines": { 163 | "node": ">=12" 164 | } 165 | }, 166 | "node_modules/@esbuild/linux-arm64": { 167 | "version": "0.20.2", 168 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", 169 | "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", 170 | "cpu": [ 171 | "arm64" 172 | ], 173 | "dev": true, 174 | "optional": true, 175 | "os": [ 176 | "linux" 177 | ], 178 | "engines": { 179 | "node": ">=12" 180 | } 181 | }, 182 | "node_modules/@esbuild/linux-ia32": { 183 | "version": "0.20.2", 184 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", 185 | "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", 186 | "cpu": [ 187 | "ia32" 188 | ], 189 | "dev": true, 190 | "optional": true, 191 | "os": [ 192 | "linux" 193 | ], 194 | "engines": { 195 | "node": ">=12" 196 | } 197 | }, 198 | "node_modules/@esbuild/linux-loong64": { 199 | "version": "0.20.2", 200 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", 201 | "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", 202 | "cpu": [ 203 | "loong64" 204 | ], 205 | "dev": true, 206 | "optional": true, 207 | "os": [ 208 | "linux" 209 | ], 210 | "engines": { 211 | "node": ">=12" 212 | } 213 | }, 214 | "node_modules/@esbuild/linux-mips64el": { 215 | "version": "0.20.2", 216 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", 217 | "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", 218 | "cpu": [ 219 | "mips64el" 220 | ], 221 | "dev": true, 222 | "optional": true, 223 | "os": [ 224 | "linux" 225 | ], 226 | "engines": { 227 | "node": ">=12" 228 | } 229 | }, 230 | "node_modules/@esbuild/linux-ppc64": { 231 | "version": "0.20.2", 232 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", 233 | "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", 234 | "cpu": [ 235 | "ppc64" 236 | ], 237 | "dev": true, 238 | "optional": true, 239 | "os": [ 240 | "linux" 241 | ], 242 | "engines": { 243 | "node": ">=12" 244 | } 245 | }, 246 | "node_modules/@esbuild/linux-riscv64": { 247 | "version": "0.20.2", 248 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", 249 | "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", 250 | "cpu": [ 251 | "riscv64" 252 | ], 253 | "dev": true, 254 | "optional": true, 255 | "os": [ 256 | "linux" 257 | ], 258 | "engines": { 259 | "node": ">=12" 260 | } 261 | }, 262 | "node_modules/@esbuild/linux-s390x": { 263 | "version": "0.20.2", 264 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", 265 | "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", 266 | "cpu": [ 267 | "s390x" 268 | ], 269 | "dev": true, 270 | "optional": true, 271 | "os": [ 272 | "linux" 273 | ], 274 | "engines": { 275 | "node": ">=12" 276 | } 277 | }, 278 | "node_modules/@esbuild/linux-x64": { 279 | "version": "0.20.2", 280 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", 281 | "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", 282 | "cpu": [ 283 | "x64" 284 | ], 285 | "dev": true, 286 | "optional": true, 287 | "os": [ 288 | "linux" 289 | ], 290 | "engines": { 291 | "node": ">=12" 292 | } 293 | }, 294 | "node_modules/@esbuild/netbsd-x64": { 295 | "version": "0.20.2", 296 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", 297 | "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", 298 | "cpu": [ 299 | "x64" 300 | ], 301 | "dev": true, 302 | "optional": true, 303 | "os": [ 304 | "netbsd" 305 | ], 306 | "engines": { 307 | "node": ">=12" 308 | } 309 | }, 310 | "node_modules/@esbuild/openbsd-x64": { 311 | "version": "0.20.2", 312 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", 313 | "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", 314 | "cpu": [ 315 | "x64" 316 | ], 317 | "dev": true, 318 | "optional": true, 319 | "os": [ 320 | "openbsd" 321 | ], 322 | "engines": { 323 | "node": ">=12" 324 | } 325 | }, 326 | "node_modules/@esbuild/sunos-x64": { 327 | "version": "0.20.2", 328 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", 329 | "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", 330 | "cpu": [ 331 | "x64" 332 | ], 333 | "dev": true, 334 | "optional": true, 335 | "os": [ 336 | "sunos" 337 | ], 338 | "engines": { 339 | "node": ">=12" 340 | } 341 | }, 342 | "node_modules/@esbuild/win32-arm64": { 343 | "version": "0.20.2", 344 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", 345 | "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", 346 | "cpu": [ 347 | "arm64" 348 | ], 349 | "dev": true, 350 | "optional": true, 351 | "os": [ 352 | "win32" 353 | ], 354 | "engines": { 355 | "node": ">=12" 356 | } 357 | }, 358 | "node_modules/@esbuild/win32-ia32": { 359 | "version": "0.20.2", 360 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", 361 | "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", 362 | "cpu": [ 363 | "ia32" 364 | ], 365 | "dev": true, 366 | "optional": true, 367 | "os": [ 368 | "win32" 369 | ], 370 | "engines": { 371 | "node": ">=12" 372 | } 373 | }, 374 | "node_modules/@esbuild/win32-x64": { 375 | "version": "0.20.2", 376 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", 377 | "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", 378 | "cpu": [ 379 | "x64" 380 | ], 381 | "dev": true, 382 | "optional": true, 383 | "os": [ 384 | "win32" 385 | ], 386 | "engines": { 387 | "node": ">=12" 388 | } 389 | }, 390 | "node_modules/@jest/schemas": { 391 | "version": "29.6.3", 392 | "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", 393 | "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", 394 | "dev": true, 395 | "dependencies": { 396 | "@sinclair/typebox": "^0.27.8" 397 | }, 398 | "engines": { 399 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 400 | } 401 | }, 402 | "node_modules/@jridgewell/sourcemap-codec": { 403 | "version": "1.4.15", 404 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 405 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 406 | "dev": true 407 | }, 408 | "node_modules/@nodelib/fs.scandir": { 409 | "version": "2.1.5", 410 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 411 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 412 | "dev": true, 413 | "dependencies": { 414 | "@nodelib/fs.stat": "2.0.5", 415 | "run-parallel": "^1.1.9" 416 | }, 417 | "engines": { 418 | "node": ">= 8" 419 | } 420 | }, 421 | "node_modules/@nodelib/fs.stat": { 422 | "version": "2.0.5", 423 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 424 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 425 | "dev": true, 426 | "engines": { 427 | "node": ">= 8" 428 | } 429 | }, 430 | "node_modules/@nodelib/fs.walk": { 431 | "version": "1.2.8", 432 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 433 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 434 | "dev": true, 435 | "dependencies": { 436 | "@nodelib/fs.scandir": "2.1.5", 437 | "fastq": "^1.6.0" 438 | }, 439 | "engines": { 440 | "node": ">= 8" 441 | } 442 | }, 443 | "node_modules/@polka/url": { 444 | "version": "1.0.0-next.25", 445 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", 446 | "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", 447 | "dev": true 448 | }, 449 | "node_modules/@rollup/rollup-android-arm-eabi": { 450 | "version": "4.17.2", 451 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", 452 | "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", 453 | "cpu": [ 454 | "arm" 455 | ], 456 | "dev": true, 457 | "optional": true, 458 | "os": [ 459 | "android" 460 | ] 461 | }, 462 | "node_modules/@rollup/rollup-android-arm64": { 463 | "version": "4.17.2", 464 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", 465 | "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", 466 | "cpu": [ 467 | "arm64" 468 | ], 469 | "dev": true, 470 | "optional": true, 471 | "os": [ 472 | "android" 473 | ] 474 | }, 475 | "node_modules/@rollup/rollup-darwin-arm64": { 476 | "version": "4.17.2", 477 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", 478 | "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", 479 | "cpu": [ 480 | "arm64" 481 | ], 482 | "dev": true, 483 | "optional": true, 484 | "os": [ 485 | "darwin" 486 | ] 487 | }, 488 | "node_modules/@rollup/rollup-darwin-x64": { 489 | "version": "4.17.2", 490 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", 491 | "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", 492 | "cpu": [ 493 | "x64" 494 | ], 495 | "dev": true, 496 | "optional": true, 497 | "os": [ 498 | "darwin" 499 | ] 500 | }, 501 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 502 | "version": "4.17.2", 503 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", 504 | "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", 505 | "cpu": [ 506 | "arm" 507 | ], 508 | "dev": true, 509 | "optional": true, 510 | "os": [ 511 | "linux" 512 | ] 513 | }, 514 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 515 | "version": "4.17.2", 516 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", 517 | "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", 518 | "cpu": [ 519 | "arm" 520 | ], 521 | "dev": true, 522 | "optional": true, 523 | "os": [ 524 | "linux" 525 | ] 526 | }, 527 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 528 | "version": "4.17.2", 529 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", 530 | "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", 531 | "cpu": [ 532 | "arm64" 533 | ], 534 | "dev": true, 535 | "optional": true, 536 | "os": [ 537 | "linux" 538 | ] 539 | }, 540 | "node_modules/@rollup/rollup-linux-arm64-musl": { 541 | "version": "4.17.2", 542 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", 543 | "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", 544 | "cpu": [ 545 | "arm64" 546 | ], 547 | "dev": true, 548 | "optional": true, 549 | "os": [ 550 | "linux" 551 | ] 552 | }, 553 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 554 | "version": "4.17.2", 555 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", 556 | "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", 557 | "cpu": [ 558 | "ppc64" 559 | ], 560 | "dev": true, 561 | "optional": true, 562 | "os": [ 563 | "linux" 564 | ] 565 | }, 566 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 567 | "version": "4.17.2", 568 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", 569 | "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", 570 | "cpu": [ 571 | "riscv64" 572 | ], 573 | "dev": true, 574 | "optional": true, 575 | "os": [ 576 | "linux" 577 | ] 578 | }, 579 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 580 | "version": "4.17.2", 581 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", 582 | "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", 583 | "cpu": [ 584 | "s390x" 585 | ], 586 | "dev": true, 587 | "optional": true, 588 | "os": [ 589 | "linux" 590 | ] 591 | }, 592 | "node_modules/@rollup/rollup-linux-x64-gnu": { 593 | "version": "4.17.2", 594 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", 595 | "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", 596 | "cpu": [ 597 | "x64" 598 | ], 599 | "dev": true, 600 | "optional": true, 601 | "os": [ 602 | "linux" 603 | ] 604 | }, 605 | "node_modules/@rollup/rollup-linux-x64-musl": { 606 | "version": "4.17.2", 607 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", 608 | "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", 609 | "cpu": [ 610 | "x64" 611 | ], 612 | "dev": true, 613 | "optional": true, 614 | "os": [ 615 | "linux" 616 | ] 617 | }, 618 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 619 | "version": "4.17.2", 620 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", 621 | "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", 622 | "cpu": [ 623 | "arm64" 624 | ], 625 | "dev": true, 626 | "optional": true, 627 | "os": [ 628 | "win32" 629 | ] 630 | }, 631 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 632 | "version": "4.17.2", 633 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", 634 | "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", 635 | "cpu": [ 636 | "ia32" 637 | ], 638 | "dev": true, 639 | "optional": true, 640 | "os": [ 641 | "win32" 642 | ] 643 | }, 644 | "node_modules/@rollup/rollup-win32-x64-msvc": { 645 | "version": "4.17.2", 646 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", 647 | "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", 648 | "cpu": [ 649 | "x64" 650 | ], 651 | "dev": true, 652 | "optional": true, 653 | "os": [ 654 | "win32" 655 | ] 656 | }, 657 | "node_modules/@sinclair/typebox": { 658 | "version": "0.27.8", 659 | "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", 660 | "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", 661 | "dev": true 662 | }, 663 | "node_modules/@types/estree": { 664 | "version": "1.0.5", 665 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 666 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 667 | "dev": true 668 | }, 669 | "node_modules/@types/node": { 670 | "version": "20.12.12", 671 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", 672 | "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", 673 | "dev": true, 674 | "dependencies": { 675 | "undici-types": "~5.26.4" 676 | } 677 | }, 678 | "node_modules/@types/qs": { 679 | "version": "6.9.15", 680 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", 681 | "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", 682 | "dev": true 683 | }, 684 | "node_modules/@vitest/expect": { 685 | "version": "1.6.0", 686 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", 687 | "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", 688 | "dev": true, 689 | "dependencies": { 690 | "@vitest/spy": "1.6.0", 691 | "@vitest/utils": "1.6.0", 692 | "chai": "^4.3.10" 693 | }, 694 | "funding": { 695 | "url": "https://opencollective.com/vitest" 696 | } 697 | }, 698 | "node_modules/@vitest/runner": { 699 | "version": "1.6.0", 700 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", 701 | "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", 702 | "dev": true, 703 | "dependencies": { 704 | "@vitest/utils": "1.6.0", 705 | "p-limit": "^5.0.0", 706 | "pathe": "^1.1.1" 707 | }, 708 | "funding": { 709 | "url": "https://opencollective.com/vitest" 710 | } 711 | }, 712 | "node_modules/@vitest/snapshot": { 713 | "version": "1.6.0", 714 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", 715 | "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", 716 | "dev": true, 717 | "dependencies": { 718 | "magic-string": "^0.30.5", 719 | "pathe": "^1.1.1", 720 | "pretty-format": "^29.7.0" 721 | }, 722 | "funding": { 723 | "url": "https://opencollective.com/vitest" 724 | } 725 | }, 726 | "node_modules/@vitest/spy": { 727 | "version": "1.6.0", 728 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", 729 | "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", 730 | "dev": true, 731 | "dependencies": { 732 | "tinyspy": "^2.2.0" 733 | }, 734 | "funding": { 735 | "url": "https://opencollective.com/vitest" 736 | } 737 | }, 738 | "node_modules/@vitest/ui": { 739 | "version": "1.6.0", 740 | "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.0.tgz", 741 | "integrity": "sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==", 742 | "dev": true, 743 | "dependencies": { 744 | "@vitest/utils": "1.6.0", 745 | "fast-glob": "^3.3.2", 746 | "fflate": "^0.8.1", 747 | "flatted": "^3.2.9", 748 | "pathe": "^1.1.1", 749 | "picocolors": "^1.0.0", 750 | "sirv": "^2.0.4" 751 | }, 752 | "funding": { 753 | "url": "https://opencollective.com/vitest" 754 | }, 755 | "peerDependencies": { 756 | "vitest": "1.6.0" 757 | } 758 | }, 759 | "node_modules/@vitest/utils": { 760 | "version": "1.6.0", 761 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", 762 | "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", 763 | "dev": true, 764 | "dependencies": { 765 | "diff-sequences": "^29.6.3", 766 | "estree-walker": "^3.0.3", 767 | "loupe": "^2.3.7", 768 | "pretty-format": "^29.7.0" 769 | }, 770 | "funding": { 771 | "url": "https://opencollective.com/vitest" 772 | } 773 | }, 774 | "node_modules/acorn": { 775 | "version": "8.11.3", 776 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", 777 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", 778 | "dev": true, 779 | "bin": { 780 | "acorn": "bin/acorn" 781 | }, 782 | "engines": { 783 | "node": ">=0.4.0" 784 | } 785 | }, 786 | "node_modules/acorn-walk": { 787 | "version": "8.3.2", 788 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 789 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 790 | "dev": true, 791 | "engines": { 792 | "node": ">=0.4.0" 793 | } 794 | }, 795 | "node_modules/ansi-styles": { 796 | "version": "5.2.0", 797 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 798 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 799 | "dev": true, 800 | "engines": { 801 | "node": ">=10" 802 | }, 803 | "funding": { 804 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 805 | } 806 | }, 807 | "node_modules/assertion-error": { 808 | "version": "1.1.0", 809 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 810 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 811 | "dev": true, 812 | "engines": { 813 | "node": "*" 814 | } 815 | }, 816 | "node_modules/braces": { 817 | "version": "3.0.2", 818 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 819 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 820 | "dev": true, 821 | "dependencies": { 822 | "fill-range": "^7.0.1" 823 | }, 824 | "engines": { 825 | "node": ">=8" 826 | } 827 | }, 828 | "node_modules/cac": { 829 | "version": "6.7.14", 830 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 831 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 832 | "dev": true, 833 | "engines": { 834 | "node": ">=8" 835 | } 836 | }, 837 | "node_modules/call-bind": { 838 | "version": "1.0.7", 839 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 840 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 841 | "dependencies": { 842 | "es-define-property": "^1.0.0", 843 | "es-errors": "^1.3.0", 844 | "function-bind": "^1.1.2", 845 | "get-intrinsic": "^1.2.4", 846 | "set-function-length": "^1.2.1" 847 | }, 848 | "engines": { 849 | "node": ">= 0.4" 850 | }, 851 | "funding": { 852 | "url": "https://github.com/sponsors/ljharb" 853 | } 854 | }, 855 | "node_modules/chai": { 856 | "version": "4.4.1", 857 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", 858 | "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", 859 | "dev": true, 860 | "dependencies": { 861 | "assertion-error": "^1.1.0", 862 | "check-error": "^1.0.3", 863 | "deep-eql": "^4.1.3", 864 | "get-func-name": "^2.0.2", 865 | "loupe": "^2.3.6", 866 | "pathval": "^1.1.1", 867 | "type-detect": "^4.0.8" 868 | }, 869 | "engines": { 870 | "node": ">=4" 871 | } 872 | }, 873 | "node_modules/check-error": { 874 | "version": "1.0.3", 875 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", 876 | "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", 877 | "dev": true, 878 | "dependencies": { 879 | "get-func-name": "^2.0.2" 880 | }, 881 | "engines": { 882 | "node": "*" 883 | } 884 | }, 885 | "node_modules/cross-spawn": { 886 | "version": "7.0.3", 887 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 888 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 889 | "dev": true, 890 | "dependencies": { 891 | "path-key": "^3.1.0", 892 | "shebang-command": "^2.0.0", 893 | "which": "^2.0.1" 894 | }, 895 | "engines": { 896 | "node": ">= 8" 897 | } 898 | }, 899 | "node_modules/debug": { 900 | "version": "4.3.4", 901 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 902 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 903 | "dev": true, 904 | "dependencies": { 905 | "ms": "2.1.2" 906 | }, 907 | "engines": { 908 | "node": ">=6.0" 909 | }, 910 | "peerDependenciesMeta": { 911 | "supports-color": { 912 | "optional": true 913 | } 914 | } 915 | }, 916 | "node_modules/deep-eql": { 917 | "version": "4.1.3", 918 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 919 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 920 | "dev": true, 921 | "dependencies": { 922 | "type-detect": "^4.0.0" 923 | }, 924 | "engines": { 925 | "node": ">=6" 926 | } 927 | }, 928 | "node_modules/define-data-property": { 929 | "version": "1.1.4", 930 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 931 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 932 | "dependencies": { 933 | "es-define-property": "^1.0.0", 934 | "es-errors": "^1.3.0", 935 | "gopd": "^1.0.1" 936 | }, 937 | "engines": { 938 | "node": ">= 0.4" 939 | }, 940 | "funding": { 941 | "url": "https://github.com/sponsors/ljharb" 942 | } 943 | }, 944 | "node_modules/diff-sequences": { 945 | "version": "29.6.3", 946 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", 947 | "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", 948 | "dev": true, 949 | "engines": { 950 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 951 | } 952 | }, 953 | "node_modules/es-define-property": { 954 | "version": "1.0.0", 955 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 956 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 957 | "dependencies": { 958 | "get-intrinsic": "^1.2.4" 959 | }, 960 | "engines": { 961 | "node": ">= 0.4" 962 | } 963 | }, 964 | "node_modules/es-errors": { 965 | "version": "1.3.0", 966 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 967 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 968 | "engines": { 969 | "node": ">= 0.4" 970 | } 971 | }, 972 | "node_modules/esbuild": { 973 | "version": "0.20.2", 974 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", 975 | "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", 976 | "dev": true, 977 | "hasInstallScript": true, 978 | "bin": { 979 | "esbuild": "bin/esbuild" 980 | }, 981 | "engines": { 982 | "node": ">=12" 983 | }, 984 | "optionalDependencies": { 985 | "@esbuild/aix-ppc64": "0.20.2", 986 | "@esbuild/android-arm": "0.20.2", 987 | "@esbuild/android-arm64": "0.20.2", 988 | "@esbuild/android-x64": "0.20.2", 989 | "@esbuild/darwin-arm64": "0.20.2", 990 | "@esbuild/darwin-x64": "0.20.2", 991 | "@esbuild/freebsd-arm64": "0.20.2", 992 | "@esbuild/freebsd-x64": "0.20.2", 993 | "@esbuild/linux-arm": "0.20.2", 994 | "@esbuild/linux-arm64": "0.20.2", 995 | "@esbuild/linux-ia32": "0.20.2", 996 | "@esbuild/linux-loong64": "0.20.2", 997 | "@esbuild/linux-mips64el": "0.20.2", 998 | "@esbuild/linux-ppc64": "0.20.2", 999 | "@esbuild/linux-riscv64": "0.20.2", 1000 | "@esbuild/linux-s390x": "0.20.2", 1001 | "@esbuild/linux-x64": "0.20.2", 1002 | "@esbuild/netbsd-x64": "0.20.2", 1003 | "@esbuild/openbsd-x64": "0.20.2", 1004 | "@esbuild/sunos-x64": "0.20.2", 1005 | "@esbuild/win32-arm64": "0.20.2", 1006 | "@esbuild/win32-ia32": "0.20.2", 1007 | "@esbuild/win32-x64": "0.20.2" 1008 | } 1009 | }, 1010 | "node_modules/estree-walker": { 1011 | "version": "3.0.3", 1012 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 1013 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "@types/estree": "^1.0.0" 1017 | } 1018 | }, 1019 | "node_modules/execa": { 1020 | "version": "8.0.1", 1021 | "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", 1022 | "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", 1023 | "dev": true, 1024 | "dependencies": { 1025 | "cross-spawn": "^7.0.3", 1026 | "get-stream": "^8.0.1", 1027 | "human-signals": "^5.0.0", 1028 | "is-stream": "^3.0.0", 1029 | "merge-stream": "^2.0.0", 1030 | "npm-run-path": "^5.1.0", 1031 | "onetime": "^6.0.0", 1032 | "signal-exit": "^4.1.0", 1033 | "strip-final-newline": "^3.0.0" 1034 | }, 1035 | "engines": { 1036 | "node": ">=16.17" 1037 | }, 1038 | "funding": { 1039 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 1040 | } 1041 | }, 1042 | "node_modules/fast-glob": { 1043 | "version": "3.3.2", 1044 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1045 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1046 | "dev": true, 1047 | "dependencies": { 1048 | "@nodelib/fs.stat": "^2.0.2", 1049 | "@nodelib/fs.walk": "^1.2.3", 1050 | "glob-parent": "^5.1.2", 1051 | "merge2": "^1.3.0", 1052 | "micromatch": "^4.0.4" 1053 | }, 1054 | "engines": { 1055 | "node": ">=8.6.0" 1056 | } 1057 | }, 1058 | "node_modules/fastq": { 1059 | "version": "1.17.1", 1060 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 1061 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 1062 | "dev": true, 1063 | "dependencies": { 1064 | "reusify": "^1.0.4" 1065 | } 1066 | }, 1067 | "node_modules/fflate": { 1068 | "version": "0.8.2", 1069 | "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", 1070 | "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", 1071 | "dev": true 1072 | }, 1073 | "node_modules/fill-range": { 1074 | "version": "7.0.1", 1075 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1076 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1077 | "dev": true, 1078 | "dependencies": { 1079 | "to-regex-range": "^5.0.1" 1080 | }, 1081 | "engines": { 1082 | "node": ">=8" 1083 | } 1084 | }, 1085 | "node_modules/flatted": { 1086 | "version": "3.3.1", 1087 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 1088 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 1089 | "dev": true 1090 | }, 1091 | "node_modules/fsevents": { 1092 | "version": "2.3.3", 1093 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1094 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1095 | "dev": true, 1096 | "hasInstallScript": true, 1097 | "optional": true, 1098 | "os": [ 1099 | "darwin" 1100 | ], 1101 | "engines": { 1102 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1103 | } 1104 | }, 1105 | "node_modules/function-bind": { 1106 | "version": "1.1.2", 1107 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1108 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1109 | "funding": { 1110 | "url": "https://github.com/sponsors/ljharb" 1111 | } 1112 | }, 1113 | "node_modules/get-func-name": { 1114 | "version": "2.0.2", 1115 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", 1116 | "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", 1117 | "dev": true, 1118 | "engines": { 1119 | "node": "*" 1120 | } 1121 | }, 1122 | "node_modules/get-intrinsic": { 1123 | "version": "1.2.4", 1124 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 1125 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 1126 | "dependencies": { 1127 | "es-errors": "^1.3.0", 1128 | "function-bind": "^1.1.2", 1129 | "has-proto": "^1.0.1", 1130 | "has-symbols": "^1.0.3", 1131 | "hasown": "^2.0.0" 1132 | }, 1133 | "engines": { 1134 | "node": ">= 0.4" 1135 | }, 1136 | "funding": { 1137 | "url": "https://github.com/sponsors/ljharb" 1138 | } 1139 | }, 1140 | "node_modules/get-stream": { 1141 | "version": "8.0.1", 1142 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", 1143 | "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", 1144 | "dev": true, 1145 | "engines": { 1146 | "node": ">=16" 1147 | }, 1148 | "funding": { 1149 | "url": "https://github.com/sponsors/sindresorhus" 1150 | } 1151 | }, 1152 | "node_modules/glob-parent": { 1153 | "version": "5.1.2", 1154 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1155 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1156 | "dev": true, 1157 | "dependencies": { 1158 | "is-glob": "^4.0.1" 1159 | }, 1160 | "engines": { 1161 | "node": ">= 6" 1162 | } 1163 | }, 1164 | "node_modules/gopd": { 1165 | "version": "1.0.1", 1166 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1167 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1168 | "dependencies": { 1169 | "get-intrinsic": "^1.1.3" 1170 | }, 1171 | "funding": { 1172 | "url": "https://github.com/sponsors/ljharb" 1173 | } 1174 | }, 1175 | "node_modules/has-property-descriptors": { 1176 | "version": "1.0.2", 1177 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 1178 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 1179 | "dependencies": { 1180 | "es-define-property": "^1.0.0" 1181 | }, 1182 | "funding": { 1183 | "url": "https://github.com/sponsors/ljharb" 1184 | } 1185 | }, 1186 | "node_modules/has-proto": { 1187 | "version": "1.0.3", 1188 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 1189 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1190 | "engines": { 1191 | "node": ">= 0.4" 1192 | }, 1193 | "funding": { 1194 | "url": "https://github.com/sponsors/ljharb" 1195 | } 1196 | }, 1197 | "node_modules/has-symbols": { 1198 | "version": "1.0.3", 1199 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1200 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1201 | "engines": { 1202 | "node": ">= 0.4" 1203 | }, 1204 | "funding": { 1205 | "url": "https://github.com/sponsors/ljharb" 1206 | } 1207 | }, 1208 | "node_modules/hasown": { 1209 | "version": "2.0.2", 1210 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1211 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1212 | "dependencies": { 1213 | "function-bind": "^1.1.2" 1214 | }, 1215 | "engines": { 1216 | "node": ">= 0.4" 1217 | } 1218 | }, 1219 | "node_modules/human-signals": { 1220 | "version": "5.0.0", 1221 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", 1222 | "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", 1223 | "dev": true, 1224 | "engines": { 1225 | "node": ">=16.17.0" 1226 | } 1227 | }, 1228 | "node_modules/is-extglob": { 1229 | "version": "2.1.1", 1230 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1231 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1232 | "dev": true, 1233 | "engines": { 1234 | "node": ">=0.10.0" 1235 | } 1236 | }, 1237 | "node_modules/is-glob": { 1238 | "version": "4.0.3", 1239 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1240 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1241 | "dev": true, 1242 | "dependencies": { 1243 | "is-extglob": "^2.1.1" 1244 | }, 1245 | "engines": { 1246 | "node": ">=0.10.0" 1247 | } 1248 | }, 1249 | "node_modules/is-number": { 1250 | "version": "7.0.0", 1251 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1252 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1253 | "dev": true, 1254 | "engines": { 1255 | "node": ">=0.12.0" 1256 | } 1257 | }, 1258 | "node_modules/is-stream": { 1259 | "version": "3.0.0", 1260 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", 1261 | "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", 1262 | "dev": true, 1263 | "engines": { 1264 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1265 | }, 1266 | "funding": { 1267 | "url": "https://github.com/sponsors/sindresorhus" 1268 | } 1269 | }, 1270 | "node_modules/isexe": { 1271 | "version": "2.0.0", 1272 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1273 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1274 | "dev": true 1275 | }, 1276 | "node_modules/js-tokens": { 1277 | "version": "8.0.3", 1278 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", 1279 | "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", 1280 | "dev": true 1281 | }, 1282 | "node_modules/jsonc-parser": { 1283 | "version": "3.2.0", 1284 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", 1285 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", 1286 | "dev": true 1287 | }, 1288 | "node_modules/local-pkg": { 1289 | "version": "0.5.0", 1290 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", 1291 | "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", 1292 | "dev": true, 1293 | "dependencies": { 1294 | "mlly": "^1.4.2", 1295 | "pkg-types": "^1.0.3" 1296 | }, 1297 | "engines": { 1298 | "node": ">=14" 1299 | }, 1300 | "funding": { 1301 | "url": "https://github.com/sponsors/antfu" 1302 | } 1303 | }, 1304 | "node_modules/loupe": { 1305 | "version": "2.3.7", 1306 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", 1307 | "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", 1308 | "dev": true, 1309 | "dependencies": { 1310 | "get-func-name": "^2.0.1" 1311 | } 1312 | }, 1313 | "node_modules/magic-string": { 1314 | "version": "0.30.10", 1315 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 1316 | "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 1317 | "dev": true, 1318 | "dependencies": { 1319 | "@jridgewell/sourcemap-codec": "^1.4.15" 1320 | } 1321 | }, 1322 | "node_modules/merge-stream": { 1323 | "version": "2.0.0", 1324 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1325 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1326 | "dev": true 1327 | }, 1328 | "node_modules/merge2": { 1329 | "version": "1.4.1", 1330 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1331 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1332 | "dev": true, 1333 | "engines": { 1334 | "node": ">= 8" 1335 | } 1336 | }, 1337 | "node_modules/micromatch": { 1338 | "version": "4.0.5", 1339 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1340 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1341 | "dev": true, 1342 | "dependencies": { 1343 | "braces": "^3.0.2", 1344 | "picomatch": "^2.3.1" 1345 | }, 1346 | "engines": { 1347 | "node": ">=8.6" 1348 | } 1349 | }, 1350 | "node_modules/mimic-fn": { 1351 | "version": "4.0.0", 1352 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", 1353 | "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", 1354 | "dev": true, 1355 | "engines": { 1356 | "node": ">=12" 1357 | }, 1358 | "funding": { 1359 | "url": "https://github.com/sponsors/sindresorhus" 1360 | } 1361 | }, 1362 | "node_modules/mlly": { 1363 | "version": "1.5.0", 1364 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", 1365 | "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", 1366 | "dev": true, 1367 | "dependencies": { 1368 | "acorn": "^8.11.3", 1369 | "pathe": "^1.1.2", 1370 | "pkg-types": "^1.0.3", 1371 | "ufo": "^1.3.2" 1372 | } 1373 | }, 1374 | "node_modules/mrmime": { 1375 | "version": "2.0.0", 1376 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", 1377 | "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", 1378 | "dev": true, 1379 | "engines": { 1380 | "node": ">=10" 1381 | } 1382 | }, 1383 | "node_modules/ms": { 1384 | "version": "2.1.2", 1385 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1386 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1387 | "dev": true 1388 | }, 1389 | "node_modules/nanoid": { 1390 | "version": "3.3.7", 1391 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1392 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1393 | "dev": true, 1394 | "funding": [ 1395 | { 1396 | "type": "github", 1397 | "url": "https://github.com/sponsors/ai" 1398 | } 1399 | ], 1400 | "bin": { 1401 | "nanoid": "bin/nanoid.cjs" 1402 | }, 1403 | "engines": { 1404 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1405 | } 1406 | }, 1407 | "node_modules/npm-run-path": { 1408 | "version": "5.2.0", 1409 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", 1410 | "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", 1411 | "dev": true, 1412 | "dependencies": { 1413 | "path-key": "^4.0.0" 1414 | }, 1415 | "engines": { 1416 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1417 | }, 1418 | "funding": { 1419 | "url": "https://github.com/sponsors/sindresorhus" 1420 | } 1421 | }, 1422 | "node_modules/npm-run-path/node_modules/path-key": { 1423 | "version": "4.0.0", 1424 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", 1425 | "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 1426 | "dev": true, 1427 | "engines": { 1428 | "node": ">=12" 1429 | }, 1430 | "funding": { 1431 | "url": "https://github.com/sponsors/sindresorhus" 1432 | } 1433 | }, 1434 | "node_modules/object-inspect": { 1435 | "version": "1.13.1", 1436 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1437 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1438 | "funding": { 1439 | "url": "https://github.com/sponsors/ljharb" 1440 | } 1441 | }, 1442 | "node_modules/onetime": { 1443 | "version": "6.0.0", 1444 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", 1445 | "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", 1446 | "dev": true, 1447 | "dependencies": { 1448 | "mimic-fn": "^4.0.0" 1449 | }, 1450 | "engines": { 1451 | "node": ">=12" 1452 | }, 1453 | "funding": { 1454 | "url": "https://github.com/sponsors/sindresorhus" 1455 | } 1456 | }, 1457 | "node_modules/p-limit": { 1458 | "version": "5.0.0", 1459 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", 1460 | "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", 1461 | "dev": true, 1462 | "dependencies": { 1463 | "yocto-queue": "^1.0.0" 1464 | }, 1465 | "engines": { 1466 | "node": ">=18" 1467 | }, 1468 | "funding": { 1469 | "url": "https://github.com/sponsors/sindresorhus" 1470 | } 1471 | }, 1472 | "node_modules/path-key": { 1473 | "version": "3.1.1", 1474 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1475 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1476 | "dev": true, 1477 | "engines": { 1478 | "node": ">=8" 1479 | } 1480 | }, 1481 | "node_modules/pathe": { 1482 | "version": "1.1.2", 1483 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", 1484 | "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", 1485 | "dev": true 1486 | }, 1487 | "node_modules/pathval": { 1488 | "version": "1.1.1", 1489 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1490 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 1491 | "dev": true, 1492 | "engines": { 1493 | "node": "*" 1494 | } 1495 | }, 1496 | "node_modules/picocolors": { 1497 | "version": "1.0.1", 1498 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 1499 | "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", 1500 | "dev": true 1501 | }, 1502 | "node_modules/picomatch": { 1503 | "version": "2.3.1", 1504 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1505 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1506 | "dev": true, 1507 | "engines": { 1508 | "node": ">=8.6" 1509 | }, 1510 | "funding": { 1511 | "url": "https://github.com/sponsors/jonschlinkert" 1512 | } 1513 | }, 1514 | "node_modules/pkg-types": { 1515 | "version": "1.0.3", 1516 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", 1517 | "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", 1518 | "dev": true, 1519 | "dependencies": { 1520 | "jsonc-parser": "^3.2.0", 1521 | "mlly": "^1.2.0", 1522 | "pathe": "^1.1.0" 1523 | } 1524 | }, 1525 | "node_modules/postcss": { 1526 | "version": "8.4.38", 1527 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 1528 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 1529 | "dev": true, 1530 | "funding": [ 1531 | { 1532 | "type": "opencollective", 1533 | "url": "https://opencollective.com/postcss/" 1534 | }, 1535 | { 1536 | "type": "tidelift", 1537 | "url": "https://tidelift.com/funding/github/npm/postcss" 1538 | }, 1539 | { 1540 | "type": "github", 1541 | "url": "https://github.com/sponsors/ai" 1542 | } 1543 | ], 1544 | "dependencies": { 1545 | "nanoid": "^3.3.7", 1546 | "picocolors": "^1.0.0", 1547 | "source-map-js": "^1.2.0" 1548 | }, 1549 | "engines": { 1550 | "node": "^10 || ^12 || >=14" 1551 | } 1552 | }, 1553 | "node_modules/pretty-format": { 1554 | "version": "29.7.0", 1555 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", 1556 | "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", 1557 | "dev": true, 1558 | "dependencies": { 1559 | "@jest/schemas": "^29.6.3", 1560 | "ansi-styles": "^5.0.0", 1561 | "react-is": "^18.0.0" 1562 | }, 1563 | "engines": { 1564 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1565 | } 1566 | }, 1567 | "node_modules/qs": { 1568 | "version": "6.12.1", 1569 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", 1570 | "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", 1571 | "dependencies": { 1572 | "side-channel": "^1.0.6" 1573 | }, 1574 | "engines": { 1575 | "node": ">=0.6" 1576 | }, 1577 | "funding": { 1578 | "url": "https://github.com/sponsors/ljharb" 1579 | } 1580 | }, 1581 | "node_modules/queue-microtask": { 1582 | "version": "1.2.3", 1583 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1584 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1585 | "dev": true, 1586 | "funding": [ 1587 | { 1588 | "type": "github", 1589 | "url": "https://github.com/sponsors/feross" 1590 | }, 1591 | { 1592 | "type": "patreon", 1593 | "url": "https://www.patreon.com/feross" 1594 | }, 1595 | { 1596 | "type": "consulting", 1597 | "url": "https://feross.org/support" 1598 | } 1599 | ] 1600 | }, 1601 | "node_modules/react-is": { 1602 | "version": "18.3.1", 1603 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", 1604 | "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", 1605 | "dev": true 1606 | }, 1607 | "node_modules/reusify": { 1608 | "version": "1.0.4", 1609 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1610 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1611 | "dev": true, 1612 | "engines": { 1613 | "iojs": ">=1.0.0", 1614 | "node": ">=0.10.0" 1615 | } 1616 | }, 1617 | "node_modules/rollup": { 1618 | "version": "4.17.2", 1619 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", 1620 | "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", 1621 | "dev": true, 1622 | "dependencies": { 1623 | "@types/estree": "1.0.5" 1624 | }, 1625 | "bin": { 1626 | "rollup": "dist/bin/rollup" 1627 | }, 1628 | "engines": { 1629 | "node": ">=18.0.0", 1630 | "npm": ">=8.0.0" 1631 | }, 1632 | "optionalDependencies": { 1633 | "@rollup/rollup-android-arm-eabi": "4.17.2", 1634 | "@rollup/rollup-android-arm64": "4.17.2", 1635 | "@rollup/rollup-darwin-arm64": "4.17.2", 1636 | "@rollup/rollup-darwin-x64": "4.17.2", 1637 | "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", 1638 | "@rollup/rollup-linux-arm-musleabihf": "4.17.2", 1639 | "@rollup/rollup-linux-arm64-gnu": "4.17.2", 1640 | "@rollup/rollup-linux-arm64-musl": "4.17.2", 1641 | "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", 1642 | "@rollup/rollup-linux-riscv64-gnu": "4.17.2", 1643 | "@rollup/rollup-linux-s390x-gnu": "4.17.2", 1644 | "@rollup/rollup-linux-x64-gnu": "4.17.2", 1645 | "@rollup/rollup-linux-x64-musl": "4.17.2", 1646 | "@rollup/rollup-win32-arm64-msvc": "4.17.2", 1647 | "@rollup/rollup-win32-ia32-msvc": "4.17.2", 1648 | "@rollup/rollup-win32-x64-msvc": "4.17.2", 1649 | "fsevents": "~2.3.2" 1650 | } 1651 | }, 1652 | "node_modules/run-parallel": { 1653 | "version": "1.2.0", 1654 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1655 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1656 | "dev": true, 1657 | "funding": [ 1658 | { 1659 | "type": "github", 1660 | "url": "https://github.com/sponsors/feross" 1661 | }, 1662 | { 1663 | "type": "patreon", 1664 | "url": "https://www.patreon.com/feross" 1665 | }, 1666 | { 1667 | "type": "consulting", 1668 | "url": "https://feross.org/support" 1669 | } 1670 | ], 1671 | "dependencies": { 1672 | "queue-microtask": "^1.2.2" 1673 | } 1674 | }, 1675 | "node_modules/set-function-length": { 1676 | "version": "1.2.2", 1677 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1678 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1679 | "dependencies": { 1680 | "define-data-property": "^1.1.4", 1681 | "es-errors": "^1.3.0", 1682 | "function-bind": "^1.1.2", 1683 | "get-intrinsic": "^1.2.4", 1684 | "gopd": "^1.0.1", 1685 | "has-property-descriptors": "^1.0.2" 1686 | }, 1687 | "engines": { 1688 | "node": ">= 0.4" 1689 | } 1690 | }, 1691 | "node_modules/shebang-command": { 1692 | "version": "2.0.0", 1693 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1694 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1695 | "dev": true, 1696 | "dependencies": { 1697 | "shebang-regex": "^3.0.0" 1698 | }, 1699 | "engines": { 1700 | "node": ">=8" 1701 | } 1702 | }, 1703 | "node_modules/shebang-regex": { 1704 | "version": "3.0.0", 1705 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1706 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1707 | "dev": true, 1708 | "engines": { 1709 | "node": ">=8" 1710 | } 1711 | }, 1712 | "node_modules/side-channel": { 1713 | "version": "1.0.6", 1714 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1715 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1716 | "dependencies": { 1717 | "call-bind": "^1.0.7", 1718 | "es-errors": "^1.3.0", 1719 | "get-intrinsic": "^1.2.4", 1720 | "object-inspect": "^1.13.1" 1721 | }, 1722 | "engines": { 1723 | "node": ">= 0.4" 1724 | }, 1725 | "funding": { 1726 | "url": "https://github.com/sponsors/ljharb" 1727 | } 1728 | }, 1729 | "node_modules/siginfo": { 1730 | "version": "2.0.0", 1731 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 1732 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 1733 | "dev": true 1734 | }, 1735 | "node_modules/signal-exit": { 1736 | "version": "4.1.0", 1737 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1738 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1739 | "dev": true, 1740 | "engines": { 1741 | "node": ">=14" 1742 | }, 1743 | "funding": { 1744 | "url": "https://github.com/sponsors/isaacs" 1745 | } 1746 | }, 1747 | "node_modules/sirv": { 1748 | "version": "2.0.4", 1749 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", 1750 | "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", 1751 | "dev": true, 1752 | "dependencies": { 1753 | "@polka/url": "^1.0.0-next.24", 1754 | "mrmime": "^2.0.0", 1755 | "totalist": "^3.0.0" 1756 | }, 1757 | "engines": { 1758 | "node": ">= 10" 1759 | } 1760 | }, 1761 | "node_modules/source-map-js": { 1762 | "version": "1.2.0", 1763 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 1764 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 1765 | "dev": true, 1766 | "engines": { 1767 | "node": ">=0.10.0" 1768 | } 1769 | }, 1770 | "node_modules/stackback": { 1771 | "version": "0.0.2", 1772 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 1773 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 1774 | "dev": true 1775 | }, 1776 | "node_modules/std-env": { 1777 | "version": "3.7.0", 1778 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", 1779 | "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", 1780 | "dev": true 1781 | }, 1782 | "node_modules/strip-final-newline": { 1783 | "version": "3.0.0", 1784 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", 1785 | "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", 1786 | "dev": true, 1787 | "engines": { 1788 | "node": ">=12" 1789 | }, 1790 | "funding": { 1791 | "url": "https://github.com/sponsors/sindresorhus" 1792 | } 1793 | }, 1794 | "node_modules/strip-literal": { 1795 | "version": "2.0.0", 1796 | "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", 1797 | "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", 1798 | "dev": true, 1799 | "dependencies": { 1800 | "js-tokens": "^8.0.2" 1801 | }, 1802 | "funding": { 1803 | "url": "https://github.com/sponsors/antfu" 1804 | } 1805 | }, 1806 | "node_modules/tinybench": { 1807 | "version": "2.5.1", 1808 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", 1809 | "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", 1810 | "dev": true 1811 | }, 1812 | "node_modules/tinypool": { 1813 | "version": "0.8.4", 1814 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", 1815 | "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", 1816 | "dev": true, 1817 | "engines": { 1818 | "node": ">=14.0.0" 1819 | } 1820 | }, 1821 | "node_modules/tinyspy": { 1822 | "version": "2.2.1", 1823 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", 1824 | "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", 1825 | "dev": true, 1826 | "engines": { 1827 | "node": ">=14.0.0" 1828 | } 1829 | }, 1830 | "node_modules/to-regex-range": { 1831 | "version": "5.0.1", 1832 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1833 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1834 | "dev": true, 1835 | "dependencies": { 1836 | "is-number": "^7.0.0" 1837 | }, 1838 | "engines": { 1839 | "node": ">=8.0" 1840 | } 1841 | }, 1842 | "node_modules/totalist": { 1843 | "version": "3.0.1", 1844 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 1845 | "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 1846 | "dev": true, 1847 | "engines": { 1848 | "node": ">=6" 1849 | } 1850 | }, 1851 | "node_modules/type-detect": { 1852 | "version": "4.0.8", 1853 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1854 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1855 | "dev": true, 1856 | "engines": { 1857 | "node": ">=4" 1858 | } 1859 | }, 1860 | "node_modules/typescript": { 1861 | "version": "5.4.5", 1862 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", 1863 | "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", 1864 | "dev": true, 1865 | "bin": { 1866 | "tsc": "bin/tsc", 1867 | "tsserver": "bin/tsserver" 1868 | }, 1869 | "engines": { 1870 | "node": ">=14.17" 1871 | } 1872 | }, 1873 | "node_modules/ufo": { 1874 | "version": "1.3.2", 1875 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", 1876 | "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", 1877 | "dev": true 1878 | }, 1879 | "node_modules/undici-types": { 1880 | "version": "5.26.5", 1881 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1882 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1883 | "dev": true 1884 | }, 1885 | "node_modules/vite": { 1886 | "version": "5.2.11", 1887 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", 1888 | "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", 1889 | "dev": true, 1890 | "dependencies": { 1891 | "esbuild": "^0.20.1", 1892 | "postcss": "^8.4.38", 1893 | "rollup": "^4.13.0" 1894 | }, 1895 | "bin": { 1896 | "vite": "bin/vite.js" 1897 | }, 1898 | "engines": { 1899 | "node": "^18.0.0 || >=20.0.0" 1900 | }, 1901 | "funding": { 1902 | "url": "https://github.com/vitejs/vite?sponsor=1" 1903 | }, 1904 | "optionalDependencies": { 1905 | "fsevents": "~2.3.3" 1906 | }, 1907 | "peerDependencies": { 1908 | "@types/node": "^18.0.0 || >=20.0.0", 1909 | "less": "*", 1910 | "lightningcss": "^1.21.0", 1911 | "sass": "*", 1912 | "stylus": "*", 1913 | "sugarss": "*", 1914 | "terser": "^5.4.0" 1915 | }, 1916 | "peerDependenciesMeta": { 1917 | "@types/node": { 1918 | "optional": true 1919 | }, 1920 | "less": { 1921 | "optional": true 1922 | }, 1923 | "lightningcss": { 1924 | "optional": true 1925 | }, 1926 | "sass": { 1927 | "optional": true 1928 | }, 1929 | "stylus": { 1930 | "optional": true 1931 | }, 1932 | "sugarss": { 1933 | "optional": true 1934 | }, 1935 | "terser": { 1936 | "optional": true 1937 | } 1938 | } 1939 | }, 1940 | "node_modules/vite-node": { 1941 | "version": "1.6.0", 1942 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", 1943 | "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", 1944 | "dev": true, 1945 | "dependencies": { 1946 | "cac": "^6.7.14", 1947 | "debug": "^4.3.4", 1948 | "pathe": "^1.1.1", 1949 | "picocolors": "^1.0.0", 1950 | "vite": "^5.0.0" 1951 | }, 1952 | "bin": { 1953 | "vite-node": "vite-node.mjs" 1954 | }, 1955 | "engines": { 1956 | "node": "^18.0.0 || >=20.0.0" 1957 | }, 1958 | "funding": { 1959 | "url": "https://opencollective.com/vitest" 1960 | } 1961 | }, 1962 | "node_modules/vitest": { 1963 | "version": "1.6.0", 1964 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", 1965 | "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", 1966 | "dev": true, 1967 | "dependencies": { 1968 | "@vitest/expect": "1.6.0", 1969 | "@vitest/runner": "1.6.0", 1970 | "@vitest/snapshot": "1.6.0", 1971 | "@vitest/spy": "1.6.0", 1972 | "@vitest/utils": "1.6.0", 1973 | "acorn-walk": "^8.3.2", 1974 | "chai": "^4.3.10", 1975 | "debug": "^4.3.4", 1976 | "execa": "^8.0.1", 1977 | "local-pkg": "^0.5.0", 1978 | "magic-string": "^0.30.5", 1979 | "pathe": "^1.1.1", 1980 | "picocolors": "^1.0.0", 1981 | "std-env": "^3.5.0", 1982 | "strip-literal": "^2.0.0", 1983 | "tinybench": "^2.5.1", 1984 | "tinypool": "^0.8.3", 1985 | "vite": "^5.0.0", 1986 | "vite-node": "1.6.0", 1987 | "why-is-node-running": "^2.2.2" 1988 | }, 1989 | "bin": { 1990 | "vitest": "vitest.mjs" 1991 | }, 1992 | "engines": { 1993 | "node": "^18.0.0 || >=20.0.0" 1994 | }, 1995 | "funding": { 1996 | "url": "https://opencollective.com/vitest" 1997 | }, 1998 | "peerDependencies": { 1999 | "@edge-runtime/vm": "*", 2000 | "@types/node": "^18.0.0 || >=20.0.0", 2001 | "@vitest/browser": "1.6.0", 2002 | "@vitest/ui": "1.6.0", 2003 | "happy-dom": "*", 2004 | "jsdom": "*" 2005 | }, 2006 | "peerDependenciesMeta": { 2007 | "@edge-runtime/vm": { 2008 | "optional": true 2009 | }, 2010 | "@types/node": { 2011 | "optional": true 2012 | }, 2013 | "@vitest/browser": { 2014 | "optional": true 2015 | }, 2016 | "@vitest/ui": { 2017 | "optional": true 2018 | }, 2019 | "happy-dom": { 2020 | "optional": true 2021 | }, 2022 | "jsdom": { 2023 | "optional": true 2024 | } 2025 | } 2026 | }, 2027 | "node_modules/which": { 2028 | "version": "2.0.2", 2029 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2030 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2031 | "dev": true, 2032 | "dependencies": { 2033 | "isexe": "^2.0.0" 2034 | }, 2035 | "bin": { 2036 | "node-which": "bin/node-which" 2037 | }, 2038 | "engines": { 2039 | "node": ">= 8" 2040 | } 2041 | }, 2042 | "node_modules/why-is-node-running": { 2043 | "version": "2.2.2", 2044 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", 2045 | "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", 2046 | "dev": true, 2047 | "dependencies": { 2048 | "siginfo": "^2.0.0", 2049 | "stackback": "0.0.2" 2050 | }, 2051 | "bin": { 2052 | "why-is-node-running": "cli.js" 2053 | }, 2054 | "engines": { 2055 | "node": ">=8" 2056 | } 2057 | }, 2058 | "node_modules/yocto-queue": { 2059 | "version": "1.0.0", 2060 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", 2061 | "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", 2062 | "dev": true, 2063 | "engines": { 2064 | "node": ">=12.20" 2065 | }, 2066 | "funding": { 2067 | "url": "https://github.com/sponsors/sindresorhus" 2068 | } 2069 | } 2070 | } 2071 | } 2072 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "urlbox", 3 | "version": "2.2.0", 4 | "description": "Generate website screenshots, PDFs and other renders from URLs or HTML using the urlbox website screenshot API", 5 | "scripts": { 6 | "test": "vitest --run", 7 | "test:watch": "vitest", 8 | "build": "rm -fr dist/* && tsc -p tsconfig.json && tsc -p tsconfig-cjs.json && ./fixup", 9 | "prepublishOnly": "npm run build && npm run test" 10 | }, 11 | "types": "dist/mjs/index.d.ts", 12 | "main": "dist/cjs/index.js", 13 | "module": "dist/mjs/index.js", 14 | "exports": { 15 | ".": { 16 | "import": "./dist/mjs/index.js", 17 | "require": "./dist/cjs/index.js" 18 | } 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/urlbox/urlbox-node.git" 23 | }, 24 | "keywords": [ 25 | "website screenshot", 26 | "website screenshot api", 27 | "website screenshots", 28 | "website snapshot", 29 | "screenshot api", 30 | "screenshot service", 31 | "puppeteer screenshot", 32 | "playwright screenshot", 33 | "screenshot as a service", 34 | "chrome screenshot", 35 | "headless chrome", 36 | "html to pdf", 37 | "screenshots", 38 | "snapshot", 39 | "urlbox", 40 | "urlbox.io", 41 | "urlbox.com", 42 | "phantom", 43 | "phantomjs", 44 | "screenshot", 45 | "website", 46 | "retina", 47 | "headless", 48 | "chrome", 49 | "blink", 50 | "url capture", 51 | "url render", 52 | "render website", 53 | "capture website", 54 | "page capture", 55 | "webkit", 56 | "webkit2png", 57 | "selenium screenshot", 58 | "url2png", 59 | "fullpage screenshot", 60 | "fullheight" 61 | ], 62 | "author": "Chris Roebuck", 63 | "license": "ISC", 64 | "bugs": { 65 | "url": "https://github.com/urlbox/urlbox-node/issues" 66 | }, 67 | "homepage": "https://github.com/urlbox/urlbox-node#readme", 68 | "dependencies": { 69 | "qs": "^6.12.1" 70 | }, 71 | "devDependencies": { 72 | "@types/node": "^20.12.12", 73 | "@types/qs": "^6.9.15", 74 | "@vitest/ui": "^1.6.0", 75 | "typescript": "^5.4.5", 76 | "vitest": "^1.6.0" 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # v2.2.0 2 | 3 | ## Improvements 4 | 5 | - Change `crypto` import to `node:crypto` to be compatible with cloudflare workers, thanks to [drush](https://github.com/drush) in [#21](https://github.com/urlbox/urlbox-node/pull/21) 6 | - Updated dependencies 7 | 8 | # v2.1.0 9 | 10 | ## Improvements 11 | 12 | - Move to nodejs crypto, remove cryptojs 13 | - Remove lodash 14 | 15 | # v2.0.3 16 | 17 | ## Improvements 18 | 19 | - Export `RenderOptions` type, thanks to [DigiPie](https://github.com/DigiPie) in [#17](https://github.com/urlbox/urlbox-node/pull/17) 20 | - Updated dependencies 21 | 22 | # v2.0.2 23 | 24 | ## Improvements 25 | 26 | - Added more options to `RenderOptions` type 27 | - Made hmacSha256 import more explicit 28 | 29 | # v2.0.1 30 | 31 | ## Improvements 32 | 33 | - Add `types` to package.json 34 | 35 | # v2.0.0 36 | 37 | ## Breaking Changes 38 | 39 | - Rename `buildUrl` to `generateRenderLink` 40 | - Remove `buildUrls` method 41 | 42 | ## Improvements 43 | 44 | - Added `generateInsecureRenderLink` method 45 | - Remove babel 46 | - Replace jest with vitest 47 | - Prune unnecessary packages 48 | - Convert to typescript 49 | - Add typescript types 50 | - Publish as both ESM and CJS modules 51 | - Rename repo to `urlbox/urlbox-node` 52 | 53 | ## Fixes 54 | 55 | - Update dependencies 56 | -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | import { expect, test } from "vitest"; 3 | import crypto from "node:crypto"; 4 | import qs from "qs"; 5 | import urlboxFactory from "./"; 6 | import { RenderOptions } from "types"; 7 | 8 | const myapikey = "MY_API_KEY"; 9 | const mysecret = "secret"; 10 | const prefix = "https://api.urlbox.io/v1/"; 11 | const urlbox = urlboxFactory(myapikey, mysecret); 12 | 13 | const toQuery = (options: RenderOptions) => 14 | qs.stringify(options, { 15 | filter: (key, value) => (key == "format" ? undefined : value), 16 | }); 17 | 18 | test("should return a url with a valid token and query string", () => { 19 | const options: RenderOptions = { 20 | url: "bbc.co.uk", 21 | width: 1024, 22 | height: 768, 23 | delay: 1000, 24 | }; 25 | const query = toQuery(options); 26 | const renderLink = urlbox.generateRenderLink(options); 27 | const token = crypto 28 | .createHmac("sha256", mysecret) 29 | .update(query) 30 | .digest("hex"); 31 | expect(renderLink).toEqual( 32 | "https://api.urlbox.io/v1/" + myapikey + "/" + token + "/png?" + query 33 | ); 34 | }); 35 | test("should return a url with a valid token and query string with width param", () => { 36 | const options = { 37 | url: "bbc.co.uk", 38 | width: 100, 39 | }; 40 | const query = toQuery(options); 41 | const token = crypto 42 | .createHmac("sha256", mysecret) 43 | .update(query) 44 | .digest("hex"); 45 | const renderLink = urlbox.generateRenderLink(options); 46 | 47 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 48 | }); 49 | test("should return a url with a valid token and query string with height param", () => { 50 | const options = { 51 | url: "google.com", 52 | height: 100, 53 | }; 54 | const query = toQuery(options); 55 | const token = crypto 56 | .createHmac("sha256", mysecret) 57 | .update(query) 58 | .digest("hex"); 59 | const renderLink = urlbox.generateRenderLink(options); 60 | 61 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 62 | }); 63 | test("should return a url with a valid token and query string with full_page param", () => { 64 | const options = { 65 | url: "google.com", 66 | full_page: true, 67 | }; 68 | const query = toQuery(options); 69 | const token = crypto 70 | .createHmac("sha256", mysecret) 71 | .update(query) 72 | .digest("hex"); 73 | const renderLink = urlbox.generateRenderLink(options); 74 | 75 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 76 | }); 77 | test("should return a url with a valid token and query string with delay param", () => { 78 | const options = { 79 | url: "google.com", 80 | delay: 4000, 81 | }; 82 | const query = toQuery(options); 83 | const token = crypto 84 | .createHmac("sha256", mysecret) 85 | .update(query) 86 | .digest("hex"); 87 | const renderLink = urlbox.generateRenderLink(options); 88 | 89 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 90 | }); 91 | test("should return a url with a valid token and query string with width and height params", () => { 92 | const options = { 93 | url: "bbc.co.uk", 94 | width: 100, 95 | height: 200, 96 | }; 97 | const query = toQuery(options); 98 | const token = crypto 99 | .createHmac("sha256", mysecret) 100 | .update(query) 101 | .digest("hex"); 102 | const renderLink = urlbox.generateRenderLink(options); 103 | 104 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 105 | }); 106 | test("should return a url with a valid token and query string with width and height and full_page params", () => { 107 | const options = { 108 | url: "bbc.co.uk", 109 | width: 100, 110 | height: 200, 111 | full_page: true, 112 | }; 113 | const query = toQuery(options); 114 | const token = crypto 115 | .createHmac("sha256", mysecret) 116 | .update(query) 117 | .digest("hex"); 118 | const renderLink = urlbox.generateRenderLink(options); 119 | 120 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 121 | }); 122 | test("should return a url with a valid token and query string with width and height and full_page and delay params", () => { 123 | const options = { 124 | url: "bbc.co.uk", 125 | width: 100, 126 | height: 200, 127 | full_page: true, 128 | }; 129 | const query = toQuery(options); 130 | const token = crypto 131 | .createHmac("sha256", mysecret) 132 | .update(query) 133 | .digest("hex"); 134 | const renderLink = urlbox.generateRenderLink(options); 135 | 136 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 137 | }); 138 | test("user_agent and url are url-encoded", () => { 139 | const options = { 140 | url: "https://bbc.co.uk", 141 | user_agent: 142 | "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25 (3B92C18B-D9DE-4CB7-A02A-22FD2AF17C8F)", 143 | }; 144 | const query = toQuery(options); 145 | const token = crypto 146 | .createHmac("sha256", mysecret) 147 | .update(query) 148 | .digest("hex"); 149 | const renderLink = urlbox.generateRenderLink(options); 150 | 151 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 152 | }); 153 | test("removes false values from query", () => { 154 | let options: RenderOptions = { 155 | url: "bbc.co.uk", 156 | width: 1024, 157 | height: 768, 158 | delay: 1000, 159 | }; 160 | const query = toQuery(options); 161 | options.force = false; 162 | options.full_page = false; 163 | options.disable_js = false; 164 | options.retina = false; 165 | const renderLink = urlbox.generateRenderLink(options); 166 | const token = crypto 167 | .createHmac("sha256", mysecret) 168 | .update(query) 169 | .digest("hex"); 170 | 171 | expect(renderLink).toEqual( 172 | "https://api.urlbox.io/v1/" + myapikey + "/" + token + "/png?" + query 173 | ); 174 | }); 175 | test("removes 0 values from query", () => { 176 | let options: RenderOptions = { 177 | url: "bbc.co.uk", 178 | }; 179 | const query = toQuery(options); 180 | options.width = 0; 181 | options.height = 0; 182 | options.delay = undefined; 183 | options.thumb_width = undefined; 184 | const renderLink = urlbox.generateRenderLink(options); 185 | const token = crypto 186 | .createHmac("sha256", mysecret) 187 | .update(query) 188 | .digest("hex"); 189 | 190 | expect(renderLink).toEqual( 191 | "https://api.urlbox.io/v1/" + myapikey + "/" + token + "/png?" + query 192 | ); 193 | }); 194 | test("kitchen sink", () => { 195 | const options: RenderOptions = { 196 | url: "https://www.mysite.com/?video=funny cat plays piano", 197 | width: 100, 198 | height: 200, 199 | thumb_width: 300, 200 | full_page: true, 201 | retina: true, 202 | disable_js: true, 203 | delay: 4000, 204 | user_agent: 205 | "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25 (3B92C18B-D9DE-4CB7-A02A-22FD2AF17C8F)", 206 | force: true, 207 | quality: 80, 208 | }; 209 | const query = toQuery(options); 210 | // don't want format in the query string... 211 | options.format = "jpg"; 212 | const token = crypto 213 | .createHmac("sha256", mysecret) 214 | .update(query) 215 | .digest("hex"); 216 | const renderLink = urlbox.generateRenderLink(options); 217 | 218 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/jpg?" + query); 219 | }); 220 | 221 | test("cookies", () => { 222 | const options: RenderOptions = { 223 | url: "bbc.co.uk", 224 | cookie: [ 225 | "CookieOptIn=true;Path=/;Domain=.marktplaats.nl;Expires=Fri, 01-Jan-2027 15:19:58 GMT", 226 | "LoggedIn=true;Path=/;Domain=.urlbox.com;Max-Age=10000", 227 | ], 228 | }; 229 | const query = 230 | "url=bbc.co.uk&" + 231 | (Array.isArray(options.cookie) 232 | ? options.cookie.map((c) => "cookie=" + encodeURIComponent(c)).join("&") 233 | : "cookie=" + encodeURIComponent(options.cookie!)); 234 | options.format = "png"; 235 | const token = crypto 236 | .createHmac("sha256", mysecret) 237 | .update(query) 238 | .digest("hex"); 239 | const renderLink = urlbox.generateRenderLink(options); 240 | 241 | expect(renderLink).toEqual(prefix + myapikey + "/" + token + "/png?" + query); 242 | }); 243 | 244 | test("should error if no url", () => { 245 | //@ts-expect-error 246 | expect(() => urlbox.generateRenderLink()).toThrow("no options object passed"); 247 | }); 248 | 249 | test("should error if url is wrong type", () => { 250 | let options = { url: 2 }; 251 | //@ts-expect-error 252 | expect(() => urlbox.generateRenderLink(options)).toThrow( 253 | "url should be of type string (something like www.google.com)" 254 | ); 255 | }); 256 | 257 | test("without secret, should throw exception", () => { 258 | const urlbox = urlboxFactory(myapikey); 259 | const options: RenderOptions = { 260 | url: "https://www.mysite.com/?video=funny cat plays piano", 261 | width: 100, 262 | height: 200, 263 | thumb_width: 300, 264 | full_page: true, 265 | retina: true, 266 | disable_js: true, 267 | delay: 4000, 268 | user_agent: 269 | "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25 (3B92C18B-D9DE-4CB7-A02A-22FD2AF17C8F)", 270 | force: true, 271 | quality: 80, 272 | }; 273 | options.format = "jpg"; 274 | expect(() => urlbox.generateRenderLink(options)).toThrow( 275 | "your secret is required" 276 | ); 277 | }); 278 | test("without secret", () => { 279 | const urlbox = urlboxFactory(myapikey); 280 | const options: RenderOptions = { 281 | url: "https://www.mysite.com/?video=funny cat plays piano", 282 | width: 100, 283 | height: 200, 284 | thumb_width: 300, 285 | full_page: true, 286 | retina: true, 287 | disable_js: true, 288 | delay: 4000, 289 | user_agent: 290 | "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25 (3B92C18B-D9DE-4CB7-A02A-22FD2AF17C8F)", 291 | force: true, 292 | format: "mp4", 293 | quality: 80, 294 | }; 295 | const query = toQuery(options); 296 | const renderLink = urlbox.generateInsecureRenderLink(options); 297 | expect(renderLink).toEqual(prefix + myapikey + "/mp4?" + query); 298 | }); 299 | 300 | test("asterisk", () => { 301 | const urlbox = urlboxFactory(myapikey); 302 | const options: RenderOptions = { 303 | html: "