this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

unit tests

+1484 -28
+1279
package-lock.json
··· 9 9 "version": "0.1.0", 10 10 "devDependencies": { 11 11 "@cloudflare/vitest-pool-workers": "^0.11.1", 12 + "@vitest/coverage-istanbul": "~3.2.0", 13 + "@vitest/coverage-v8": "~3.2.0", 12 14 "typescript": "^5.9.3", 13 15 "vitest": "~3.2.0", 14 16 "wrangler": "^4.54.0" 17 + } 18 + }, 19 + "node_modules/@ampproject/remapping": { 20 + "version": "2.3.0", 21 + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 22 + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 23 + "dev": true, 24 + "license": "Apache-2.0", 25 + "dependencies": { 26 + "@jridgewell/gen-mapping": "^0.3.5", 27 + "@jridgewell/trace-mapping": "^0.3.24" 28 + }, 29 + "engines": { 30 + "node": ">=6.0.0" 31 + } 32 + }, 33 + "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { 34 + "version": "0.3.31", 35 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 36 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 37 + "dev": true, 38 + "license": "MIT", 39 + "dependencies": { 40 + "@jridgewell/resolve-uri": "^3.1.0", 41 + "@jridgewell/sourcemap-codec": "^1.4.14" 42 + } 43 + }, 44 + "node_modules/@babel/code-frame": { 45 + "version": "7.27.1", 46 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", 47 + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 48 + "dev": true, 49 + "license": "MIT", 50 + "dependencies": { 51 + "@babel/helper-validator-identifier": "^7.27.1", 52 + "js-tokens": "^4.0.0", 53 + "picocolors": "^1.1.1" 54 + }, 55 + "engines": { 56 + "node": ">=6.9.0" 57 + } 58 + }, 59 + "node_modules/@babel/code-frame/node_modules/js-tokens": { 60 + "version": "4.0.0", 61 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 62 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 63 + "dev": true, 64 + "license": "MIT" 65 + }, 66 + "node_modules/@babel/compat-data": { 67 + "version": "7.28.5", 68 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", 69 + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", 70 + "dev": true, 71 + "license": "MIT", 72 + "engines": { 73 + "node": ">=6.9.0" 74 + } 75 + }, 76 + "node_modules/@babel/core": { 77 + "version": "7.28.5", 78 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", 79 + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", 80 + "dev": true, 81 + "license": "MIT", 82 + "dependencies": { 83 + "@babel/code-frame": "^7.27.1", 84 + "@babel/generator": "^7.28.5", 85 + "@babel/helper-compilation-targets": "^7.27.2", 86 + "@babel/helper-module-transforms": "^7.28.3", 87 + "@babel/helpers": "^7.28.4", 88 + "@babel/parser": "^7.28.5", 89 + "@babel/template": "^7.27.2", 90 + "@babel/traverse": "^7.28.5", 91 + "@babel/types": "^7.28.5", 92 + "@jridgewell/remapping": "^2.3.5", 93 + "convert-source-map": "^2.0.0", 94 + "debug": "^4.1.0", 95 + "gensync": "^1.0.0-beta.2", 96 + "json5": "^2.2.3", 97 + "semver": "^6.3.1" 98 + }, 99 + "engines": { 100 + "node": ">=6.9.0" 101 + }, 102 + "funding": { 103 + "type": "opencollective", 104 + "url": "https://opencollective.com/babel" 105 + } 106 + }, 107 + "node_modules/@babel/core/node_modules/semver": { 108 + "version": "6.3.1", 109 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 110 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 111 + "dev": true, 112 + "license": "ISC", 113 + "bin": { 114 + "semver": "bin/semver.js" 115 + } 116 + }, 117 + "node_modules/@babel/generator": { 118 + "version": "7.28.5", 119 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", 120 + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", 121 + "dev": true, 122 + "license": "MIT", 123 + "dependencies": { 124 + "@babel/parser": "^7.28.5", 125 + "@babel/types": "^7.28.5", 126 + "@jridgewell/gen-mapping": "^0.3.12", 127 + "@jridgewell/trace-mapping": "^0.3.28", 128 + "jsesc": "^3.0.2" 129 + }, 130 + "engines": { 131 + "node": ">=6.9.0" 132 + } 133 + }, 134 + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { 135 + "version": "0.3.31", 136 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 137 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 138 + "dev": true, 139 + "license": "MIT", 140 + "dependencies": { 141 + "@jridgewell/resolve-uri": "^3.1.0", 142 + "@jridgewell/sourcemap-codec": "^1.4.14" 143 + } 144 + }, 145 + "node_modules/@babel/helper-compilation-targets": { 146 + "version": "7.27.2", 147 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", 148 + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", 149 + "dev": true, 150 + "license": "MIT", 151 + "dependencies": { 152 + "@babel/compat-data": "^7.27.2", 153 + "@babel/helper-validator-option": "^7.27.1", 154 + "browserslist": "^4.24.0", 155 + "lru-cache": "^5.1.1", 156 + "semver": "^6.3.1" 157 + }, 158 + "engines": { 159 + "node": ">=6.9.0" 160 + } 161 + }, 162 + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { 163 + "version": "5.1.1", 164 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 165 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 166 + "dev": true, 167 + "license": "ISC", 168 + "dependencies": { 169 + "yallist": "^3.0.2" 170 + } 171 + }, 172 + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { 173 + "version": "6.3.1", 174 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 175 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 176 + "dev": true, 177 + "license": "ISC", 178 + "bin": { 179 + "semver": "bin/semver.js" 180 + } 181 + }, 182 + "node_modules/@babel/helper-globals": { 183 + "version": "7.28.0", 184 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", 185 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", 186 + "dev": true, 187 + "license": "MIT", 188 + "engines": { 189 + "node": ">=6.9.0" 190 + } 191 + }, 192 + "node_modules/@babel/helper-module-imports": { 193 + "version": "7.27.1", 194 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", 195 + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", 196 + "dev": true, 197 + "license": "MIT", 198 + "dependencies": { 199 + "@babel/traverse": "^7.27.1", 200 + "@babel/types": "^7.27.1" 201 + }, 202 + "engines": { 203 + "node": ">=6.9.0" 204 + } 205 + }, 206 + "node_modules/@babel/helper-module-transforms": { 207 + "version": "7.28.3", 208 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", 209 + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", 210 + "dev": true, 211 + "license": "MIT", 212 + "dependencies": { 213 + "@babel/helper-module-imports": "^7.27.1", 214 + "@babel/helper-validator-identifier": "^7.27.1", 215 + "@babel/traverse": "^7.28.3" 216 + }, 217 + "engines": { 218 + "node": ">=6.9.0" 219 + }, 220 + "peerDependencies": { 221 + "@babel/core": "^7.0.0" 222 + } 223 + }, 224 + "node_modules/@babel/helper-string-parser": { 225 + "version": "7.27.1", 226 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 227 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 228 + "dev": true, 229 + "license": "MIT", 230 + "engines": { 231 + "node": ">=6.9.0" 232 + } 233 + }, 234 + "node_modules/@babel/helper-validator-identifier": { 235 + "version": "7.28.5", 236 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 237 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 238 + "dev": true, 239 + "license": "MIT", 240 + "engines": { 241 + "node": ">=6.9.0" 242 + } 243 + }, 244 + "node_modules/@babel/helper-validator-option": { 245 + "version": "7.27.1", 246 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 247 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 248 + "dev": true, 249 + "license": "MIT", 250 + "engines": { 251 + "node": ">=6.9.0" 252 + } 253 + }, 254 + "node_modules/@babel/helpers": { 255 + "version": "7.28.4", 256 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", 257 + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", 258 + "dev": true, 259 + "license": "MIT", 260 + "dependencies": { 261 + "@babel/template": "^7.27.2", 262 + "@babel/types": "^7.28.4" 263 + }, 264 + "engines": { 265 + "node": ">=6.9.0" 266 + } 267 + }, 268 + "node_modules/@babel/parser": { 269 + "version": "7.28.5", 270 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", 271 + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", 272 + "dev": true, 273 + "license": "MIT", 274 + "dependencies": { 275 + "@babel/types": "^7.28.5" 276 + }, 277 + "bin": { 278 + "parser": "bin/babel-parser.js" 279 + }, 280 + "engines": { 281 + "node": ">=6.0.0" 282 + } 283 + }, 284 + "node_modules/@babel/template": { 285 + "version": "7.27.2", 286 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", 287 + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", 288 + "dev": true, 289 + "license": "MIT", 290 + "dependencies": { 291 + "@babel/code-frame": "^7.27.1", 292 + "@babel/parser": "^7.27.2", 293 + "@babel/types": "^7.27.1" 294 + }, 295 + "engines": { 296 + "node": ">=6.9.0" 297 + } 298 + }, 299 + "node_modules/@babel/traverse": { 300 + "version": "7.28.5", 301 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", 302 + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", 303 + "dev": true, 304 + "license": "MIT", 305 + "dependencies": { 306 + "@babel/code-frame": "^7.27.1", 307 + "@babel/generator": "^7.28.5", 308 + "@babel/helper-globals": "^7.28.0", 309 + "@babel/parser": "^7.28.5", 310 + "@babel/template": "^7.27.2", 311 + "@babel/types": "^7.28.5", 312 + "debug": "^4.3.1" 313 + }, 314 + "engines": { 315 + "node": ">=6.9.0" 316 + } 317 + }, 318 + "node_modules/@babel/types": { 319 + "version": "7.28.5", 320 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", 321 + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", 322 + "dev": true, 323 + "license": "MIT", 324 + "dependencies": { 325 + "@babel/helper-string-parser": "^7.27.1", 326 + "@babel/helper-validator-identifier": "^7.28.5" 327 + }, 328 + "engines": { 329 + "node": ">=6.9.0" 330 + } 331 + }, 332 + "node_modules/@bcoe/v8-coverage": { 333 + "version": "1.0.2", 334 + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", 335 + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", 336 + "dev": true, 337 + "license": "MIT", 338 + "engines": { 339 + "node": ">=18" 15 340 } 16 341 }, 17 342 "node_modules/@cloudflare/kv-asset-handler": { ··· 1499 1824 "url": "https://opencollective.com/libvips" 1500 1825 } 1501 1826 }, 1827 + "node_modules/@isaacs/cliui": { 1828 + "version": "8.0.2", 1829 + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 1830 + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 1831 + "dev": true, 1832 + "license": "ISC", 1833 + "dependencies": { 1834 + "string-width": "^5.1.2", 1835 + "string-width-cjs": "npm:string-width@^4.2.0", 1836 + "strip-ansi": "^7.0.1", 1837 + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 1838 + "wrap-ansi": "^8.1.0", 1839 + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 1840 + }, 1841 + "engines": { 1842 + "node": ">=12" 1843 + } 1844 + }, 1845 + "node_modules/@istanbuljs/schema": { 1846 + "version": "0.1.3", 1847 + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 1848 + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 1849 + "dev": true, 1850 + "license": "MIT", 1851 + "engines": { 1852 + "node": ">=8" 1853 + } 1854 + }, 1855 + "node_modules/@jridgewell/gen-mapping": { 1856 + "version": "0.3.13", 1857 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 1858 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 1859 + "dev": true, 1860 + "license": "MIT", 1861 + "dependencies": { 1862 + "@jridgewell/sourcemap-codec": "^1.5.0", 1863 + "@jridgewell/trace-mapping": "^0.3.24" 1864 + } 1865 + }, 1866 + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { 1867 + "version": "0.3.31", 1868 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 1869 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 1870 + "dev": true, 1871 + "license": "MIT", 1872 + "dependencies": { 1873 + "@jridgewell/resolve-uri": "^3.1.0", 1874 + "@jridgewell/sourcemap-codec": "^1.4.14" 1875 + } 1876 + }, 1877 + "node_modules/@jridgewell/remapping": { 1878 + "version": "2.3.5", 1879 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 1880 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 1881 + "dev": true, 1882 + "license": "MIT", 1883 + "dependencies": { 1884 + "@jridgewell/gen-mapping": "^0.3.5", 1885 + "@jridgewell/trace-mapping": "^0.3.24" 1886 + } 1887 + }, 1888 + "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { 1889 + "version": "0.3.31", 1890 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 1891 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 1892 + "dev": true, 1893 + "license": "MIT", 1894 + "dependencies": { 1895 + "@jridgewell/resolve-uri": "^3.1.0", 1896 + "@jridgewell/sourcemap-codec": "^1.4.14" 1897 + } 1898 + }, 1502 1899 "node_modules/@jridgewell/resolve-uri": { 1503 1900 "version": "3.1.2", 1504 1901 "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", ··· 1525 1922 "dependencies": { 1526 1923 "@jridgewell/resolve-uri": "^3.0.3", 1527 1924 "@jridgewell/sourcemap-codec": "^1.4.10" 1925 + } 1926 + }, 1927 + "node_modules/@pkgjs/parseargs": { 1928 + "version": "0.11.0", 1929 + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 1930 + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 1931 + "dev": true, 1932 + "license": "MIT", 1933 + "optional": true, 1934 + "engines": { 1935 + "node": ">=14" 1528 1936 } 1529 1937 }, 1530 1938 "node_modules/@poppinss/colors": { ··· 1880 2288 "dev": true, 1881 2289 "license": "MIT" 1882 2290 }, 2291 + "node_modules/@vitest/coverage-istanbul": { 2292 + "version": "3.2.4", 2293 + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-3.2.4.tgz", 2294 + "integrity": "sha512-IDlpuFJiWU9rhcKLkpzj8mFu/lpe64gVgnV15ZOrYx1iFzxxrxCzbExiUEKtwwXRvEiEMUS6iZeYgnMxgbqbxQ==", 2295 + "dev": true, 2296 + "license": "MIT", 2297 + "dependencies": { 2298 + "@istanbuljs/schema": "^0.1.3", 2299 + "debug": "^4.4.1", 2300 + "istanbul-lib-coverage": "^3.2.2", 2301 + "istanbul-lib-instrument": "^6.0.3", 2302 + "istanbul-lib-report": "^3.0.1", 2303 + "istanbul-lib-source-maps": "^5.0.6", 2304 + "istanbul-reports": "^3.1.7", 2305 + "magicast": "^0.3.5", 2306 + "test-exclude": "^7.0.1", 2307 + "tinyrainbow": "^2.0.0" 2308 + }, 2309 + "funding": { 2310 + "url": "https://opencollective.com/vitest" 2311 + }, 2312 + "peerDependencies": { 2313 + "vitest": "3.2.4" 2314 + } 2315 + }, 2316 + "node_modules/@vitest/coverage-v8": { 2317 + "version": "3.2.4", 2318 + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", 2319 + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", 2320 + "dev": true, 2321 + "license": "MIT", 2322 + "dependencies": { 2323 + "@ampproject/remapping": "^2.3.0", 2324 + "@bcoe/v8-coverage": "^1.0.2", 2325 + "ast-v8-to-istanbul": "^0.3.3", 2326 + "debug": "^4.4.1", 2327 + "istanbul-lib-coverage": "^3.2.2", 2328 + "istanbul-lib-report": "^3.0.1", 2329 + "istanbul-lib-source-maps": "^5.0.6", 2330 + "istanbul-reports": "^3.1.7", 2331 + "magic-string": "^0.30.17", 2332 + "magicast": "^0.3.5", 2333 + "std-env": "^3.9.0", 2334 + "test-exclude": "^7.0.1", 2335 + "tinyrainbow": "^2.0.0" 2336 + }, 2337 + "funding": { 2338 + "url": "https://opencollective.com/vitest" 2339 + }, 2340 + "peerDependencies": { 2341 + "@vitest/browser": "3.2.4", 2342 + "vitest": "3.2.4" 2343 + }, 2344 + "peerDependenciesMeta": { 2345 + "@vitest/browser": { 2346 + "optional": true 2347 + } 2348 + } 2349 + }, 1883 2350 "node_modules/@vitest/expect": { 1884 2351 "version": "3.2.4", 1885 2352 "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", ··· 2018 2485 "node": ">=0.4.0" 2019 2486 } 2020 2487 }, 2488 + "node_modules/ansi-regex": { 2489 + "version": "6.2.2", 2490 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", 2491 + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", 2492 + "dev": true, 2493 + "license": "MIT", 2494 + "engines": { 2495 + "node": ">=12" 2496 + }, 2497 + "funding": { 2498 + "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2499 + } 2500 + }, 2501 + "node_modules/ansi-styles": { 2502 + "version": "6.2.3", 2503 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", 2504 + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", 2505 + "dev": true, 2506 + "license": "MIT", 2507 + "engines": { 2508 + "node": ">=12" 2509 + }, 2510 + "funding": { 2511 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2512 + } 2513 + }, 2021 2514 "node_modules/assertion-error": { 2022 2515 "version": "2.0.1", 2023 2516 "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", ··· 2028 2521 "node": ">=12" 2029 2522 } 2030 2523 }, 2524 + "node_modules/ast-v8-to-istanbul": { 2525 + "version": "0.3.10", 2526 + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.10.tgz", 2527 + "integrity": "sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==", 2528 + "dev": true, 2529 + "license": "MIT", 2530 + "dependencies": { 2531 + "@jridgewell/trace-mapping": "^0.3.31", 2532 + "estree-walker": "^3.0.3", 2533 + "js-tokens": "^9.0.1" 2534 + } 2535 + }, 2536 + "node_modules/ast-v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { 2537 + "version": "0.3.31", 2538 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 2539 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 2540 + "dev": true, 2541 + "license": "MIT", 2542 + "dependencies": { 2543 + "@jridgewell/resolve-uri": "^3.1.0", 2544 + "@jridgewell/sourcemap-codec": "^1.4.14" 2545 + } 2546 + }, 2547 + "node_modules/balanced-match": { 2548 + "version": "1.0.2", 2549 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2550 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2551 + "dev": true, 2552 + "license": "MIT" 2553 + }, 2554 + "node_modules/baseline-browser-mapping": { 2555 + "version": "2.9.11", 2556 + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", 2557 + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", 2558 + "dev": true, 2559 + "license": "Apache-2.0", 2560 + "bin": { 2561 + "baseline-browser-mapping": "dist/cli.js" 2562 + } 2563 + }, 2031 2564 "node_modules/birpc": { 2032 2565 "version": "0.2.14", 2033 2566 "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.14.tgz", ··· 2045 2578 "dev": true, 2046 2579 "license": "MIT" 2047 2580 }, 2581 + "node_modules/brace-expansion": { 2582 + "version": "2.0.2", 2583 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 2584 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 2585 + "dev": true, 2586 + "license": "MIT", 2587 + "dependencies": { 2588 + "balanced-match": "^1.0.0" 2589 + } 2590 + }, 2591 + "node_modules/browserslist": { 2592 + "version": "4.28.1", 2593 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", 2594 + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", 2595 + "dev": true, 2596 + "funding": [ 2597 + { 2598 + "type": "opencollective", 2599 + "url": "https://opencollective.com/browserslist" 2600 + }, 2601 + { 2602 + "type": "tidelift", 2603 + "url": "https://tidelift.com/funding/github/npm/browserslist" 2604 + }, 2605 + { 2606 + "type": "github", 2607 + "url": "https://github.com/sponsors/ai" 2608 + } 2609 + ], 2610 + "license": "MIT", 2611 + "dependencies": { 2612 + "baseline-browser-mapping": "^2.9.0", 2613 + "caniuse-lite": "^1.0.30001759", 2614 + "electron-to-chromium": "^1.5.263", 2615 + "node-releases": "^2.0.27", 2616 + "update-browserslist-db": "^1.2.0" 2617 + }, 2618 + "bin": { 2619 + "browserslist": "cli.js" 2620 + }, 2621 + "engines": { 2622 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2623 + } 2624 + }, 2048 2625 "node_modules/cac": { 2049 2626 "version": "6.7.14", 2050 2627 "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", ··· 2054 2631 "engines": { 2055 2632 "node": ">=8" 2056 2633 } 2634 + }, 2635 + "node_modules/caniuse-lite": { 2636 + "version": "1.0.30001761", 2637 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", 2638 + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", 2639 + "dev": true, 2640 + "funding": [ 2641 + { 2642 + "type": "opencollective", 2643 + "url": "https://opencollective.com/browserslist" 2644 + }, 2645 + { 2646 + "type": "tidelift", 2647 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 2648 + }, 2649 + { 2650 + "type": "github", 2651 + "url": "https://github.com/sponsors/ai" 2652 + } 2653 + ], 2654 + "license": "CC-BY-4.0" 2057 2655 }, 2058 2656 "node_modules/chai": { 2059 2657 "version": "5.2.0", ··· 2134 2732 "simple-swizzle": "^0.2.2" 2135 2733 } 2136 2734 }, 2735 + "node_modules/convert-source-map": { 2736 + "version": "2.0.0", 2737 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 2738 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 2739 + "dev": true, 2740 + "license": "MIT" 2741 + }, 2137 2742 "node_modules/cookie": { 2138 2743 "version": "1.1.1", 2139 2744 "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", ··· 2146 2751 "funding": { 2147 2752 "type": "opencollective", 2148 2753 "url": "https://opencollective.com/express" 2754 + } 2755 + }, 2756 + "node_modules/cross-spawn": { 2757 + "version": "7.0.6", 2758 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 2759 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 2760 + "dev": true, 2761 + "license": "MIT", 2762 + "dependencies": { 2763 + "path-key": "^3.1.0", 2764 + "shebang-command": "^2.0.0", 2765 + "which": "^2.0.1" 2766 + }, 2767 + "engines": { 2768 + "node": ">= 8" 2149 2769 } 2150 2770 }, 2151 2771 "node_modules/debug": { ··· 2193 2813 "dev": true, 2194 2814 "license": "MIT" 2195 2815 }, 2816 + "node_modules/eastasianwidth": { 2817 + "version": "0.2.0", 2818 + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 2819 + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 2820 + "dev": true, 2821 + "license": "MIT" 2822 + }, 2823 + "node_modules/electron-to-chromium": { 2824 + "version": "1.5.267", 2825 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", 2826 + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", 2827 + "dev": true, 2828 + "license": "ISC" 2829 + }, 2830 + "node_modules/emoji-regex": { 2831 + "version": "9.2.2", 2832 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 2833 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 2834 + "dev": true, 2835 + "license": "MIT" 2836 + }, 2196 2837 "node_modules/error-stack-parser-es": { 2197 2838 "version": "1.0.5", 2198 2839 "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", ··· 2269 2910 "node": ">=18" 2270 2911 } 2271 2912 }, 2913 + "node_modules/escalade": { 2914 + "version": "3.2.0", 2915 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 2916 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 2917 + "dev": true, 2918 + "license": "MIT", 2919 + "engines": { 2920 + "node": ">=6" 2921 + } 2922 + }, 2272 2923 "node_modules/estree-walker": { 2273 2924 "version": "3.0.3", 2274 2925 "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", ··· 2320 2971 } 2321 2972 } 2322 2973 }, 2974 + "node_modules/foreground-child": { 2975 + "version": "3.3.1", 2976 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 2977 + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 2978 + "dev": true, 2979 + "license": "ISC", 2980 + "dependencies": { 2981 + "cross-spawn": "^7.0.6", 2982 + "signal-exit": "^4.0.1" 2983 + }, 2984 + "engines": { 2985 + "node": ">=14" 2986 + }, 2987 + "funding": { 2988 + "url": "https://github.com/sponsors/isaacs" 2989 + } 2990 + }, 2323 2991 "node_modules/fsevents": { 2324 2992 "version": "2.3.3", 2325 2993 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", ··· 2335 3003 "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2336 3004 } 2337 3005 }, 3006 + "node_modules/gensync": { 3007 + "version": "1.0.0-beta.2", 3008 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 3009 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 3010 + "dev": true, 3011 + "license": "MIT", 3012 + "engines": { 3013 + "node": ">=6.9.0" 3014 + } 3015 + }, 3016 + "node_modules/glob": { 3017 + "version": "10.5.0", 3018 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", 3019 + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", 3020 + "dev": true, 3021 + "license": "ISC", 3022 + "dependencies": { 3023 + "foreground-child": "^3.1.0", 3024 + "jackspeak": "^3.1.2", 3025 + "minimatch": "^9.0.4", 3026 + "minipass": "^7.1.2", 3027 + "package-json-from-dist": "^1.0.0", 3028 + "path-scurry": "^1.11.1" 3029 + }, 3030 + "bin": { 3031 + "glob": "dist/esm/bin.mjs" 3032 + }, 3033 + "funding": { 3034 + "url": "https://github.com/sponsors/isaacs" 3035 + } 3036 + }, 2338 3037 "node_modules/glob-to-regexp": { 2339 3038 "version": "0.4.1", 2340 3039 "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", ··· 2342 3041 "dev": true, 2343 3042 "license": "BSD-2-Clause" 2344 3043 }, 3044 + "node_modules/has-flag": { 3045 + "version": "4.0.0", 3046 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 3047 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 3048 + "dev": true, 3049 + "license": "MIT", 3050 + "engines": { 3051 + "node": ">=8" 3052 + } 3053 + }, 3054 + "node_modules/html-escaper": { 3055 + "version": "2.0.2", 3056 + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 3057 + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 3058 + "dev": true, 3059 + "license": "MIT" 3060 + }, 2345 3061 "node_modules/is-arrayish": { 2346 3062 "version": "0.3.4", 2347 3063 "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", ··· 2349 3065 "dev": true, 2350 3066 "license": "MIT" 2351 3067 }, 3068 + "node_modules/is-fullwidth-code-point": { 3069 + "version": "3.0.0", 3070 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 3071 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 3072 + "dev": true, 3073 + "license": "MIT", 3074 + "engines": { 3075 + "node": ">=8" 3076 + } 3077 + }, 3078 + "node_modules/isexe": { 3079 + "version": "2.0.0", 3080 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 3081 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 3082 + "dev": true, 3083 + "license": "ISC" 3084 + }, 3085 + "node_modules/istanbul-lib-coverage": { 3086 + "version": "3.2.2", 3087 + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 3088 + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 3089 + "dev": true, 3090 + "license": "BSD-3-Clause", 3091 + "engines": { 3092 + "node": ">=8" 3093 + } 3094 + }, 3095 + "node_modules/istanbul-lib-instrument": { 3096 + "version": "6.0.3", 3097 + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", 3098 + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", 3099 + "dev": true, 3100 + "license": "BSD-3-Clause", 3101 + "dependencies": { 3102 + "@babel/core": "^7.23.9", 3103 + "@babel/parser": "^7.23.9", 3104 + "@istanbuljs/schema": "^0.1.3", 3105 + "istanbul-lib-coverage": "^3.2.0", 3106 + "semver": "^7.5.4" 3107 + }, 3108 + "engines": { 3109 + "node": ">=10" 3110 + } 3111 + }, 3112 + "node_modules/istanbul-lib-report": { 3113 + "version": "3.0.1", 3114 + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 3115 + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 3116 + "dev": true, 3117 + "license": "BSD-3-Clause", 3118 + "dependencies": { 3119 + "istanbul-lib-coverage": "^3.0.0", 3120 + "make-dir": "^4.0.0", 3121 + "supports-color": "^7.1.0" 3122 + }, 3123 + "engines": { 3124 + "node": ">=10" 3125 + } 3126 + }, 3127 + "node_modules/istanbul-lib-report/node_modules/supports-color": { 3128 + "version": "7.2.0", 3129 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3130 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3131 + "dev": true, 3132 + "license": "MIT", 3133 + "dependencies": { 3134 + "has-flag": "^4.0.0" 3135 + }, 3136 + "engines": { 3137 + "node": ">=8" 3138 + } 3139 + }, 3140 + "node_modules/istanbul-lib-source-maps": { 3141 + "version": "5.0.6", 3142 + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", 3143 + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", 3144 + "dev": true, 3145 + "license": "BSD-3-Clause", 3146 + "dependencies": { 3147 + "@jridgewell/trace-mapping": "^0.3.23", 3148 + "debug": "^4.1.1", 3149 + "istanbul-lib-coverage": "^3.0.0" 3150 + }, 3151 + "engines": { 3152 + "node": ">=10" 3153 + } 3154 + }, 3155 + "node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { 3156 + "version": "0.3.31", 3157 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 3158 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 3159 + "dev": true, 3160 + "license": "MIT", 3161 + "dependencies": { 3162 + "@jridgewell/resolve-uri": "^3.1.0", 3163 + "@jridgewell/sourcemap-codec": "^1.4.14" 3164 + } 3165 + }, 3166 + "node_modules/istanbul-reports": { 3167 + "version": "3.2.0", 3168 + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", 3169 + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", 3170 + "dev": true, 3171 + "license": "BSD-3-Clause", 3172 + "dependencies": { 3173 + "html-escaper": "^2.0.0", 3174 + "istanbul-lib-report": "^3.0.0" 3175 + }, 3176 + "engines": { 3177 + "node": ">=8" 3178 + } 3179 + }, 3180 + "node_modules/jackspeak": { 3181 + "version": "3.4.3", 3182 + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 3183 + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 3184 + "dev": true, 3185 + "license": "BlueOak-1.0.0", 3186 + "dependencies": { 3187 + "@isaacs/cliui": "^8.0.2" 3188 + }, 3189 + "funding": { 3190 + "url": "https://github.com/sponsors/isaacs" 3191 + }, 3192 + "optionalDependencies": { 3193 + "@pkgjs/parseargs": "^0.11.0" 3194 + } 3195 + }, 2352 3196 "node_modules/js-tokens": { 2353 3197 "version": "9.0.1", 2354 3198 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", ··· 2356 3200 "dev": true, 2357 3201 "license": "MIT" 2358 3202 }, 3203 + "node_modules/jsesc": { 3204 + "version": "3.1.0", 3205 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 3206 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 3207 + "dev": true, 3208 + "license": "MIT", 3209 + "bin": { 3210 + "jsesc": "bin/jsesc" 3211 + }, 3212 + "engines": { 3213 + "node": ">=6" 3214 + } 3215 + }, 3216 + "node_modules/json5": { 3217 + "version": "2.2.3", 3218 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 3219 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 3220 + "dev": true, 3221 + "license": "MIT", 3222 + "bin": { 3223 + "json5": "lib/cli.js" 3224 + }, 3225 + "engines": { 3226 + "node": ">=6" 3227 + } 3228 + }, 2359 3229 "node_modules/kleur": { 2360 3230 "version": "4.1.5", 2361 3231 "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", ··· 2373 3243 "dev": true, 2374 3244 "license": "MIT" 2375 3245 }, 3246 + "node_modules/lru-cache": { 3247 + "version": "10.4.3", 3248 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 3249 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 3250 + "dev": true, 3251 + "license": "ISC" 3252 + }, 2376 3253 "node_modules/magic-string": { 2377 3254 "version": "0.30.17", 2378 3255 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", ··· 2383 3260 "@jridgewell/sourcemap-codec": "^1.5.0" 2384 3261 } 2385 3262 }, 3263 + "node_modules/magicast": { 3264 + "version": "0.3.5", 3265 + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", 3266 + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", 3267 + "dev": true, 3268 + "license": "MIT", 3269 + "dependencies": { 3270 + "@babel/parser": "^7.25.4", 3271 + "@babel/types": "^7.25.4", 3272 + "source-map-js": "^1.2.0" 3273 + } 3274 + }, 3275 + "node_modules/make-dir": { 3276 + "version": "4.0.0", 3277 + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 3278 + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 3279 + "dev": true, 3280 + "license": "MIT", 3281 + "dependencies": { 3282 + "semver": "^7.5.3" 3283 + }, 3284 + "engines": { 3285 + "node": ">=10" 3286 + }, 3287 + "funding": { 3288 + "url": "https://github.com/sponsors/sindresorhus" 3289 + } 3290 + }, 2386 3291 "node_modules/mime": { 2387 3292 "version": "3.0.0", 2388 3293 "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", ··· 2433 3338 "url": "https://github.com/sponsors/colinhacks" 2434 3339 } 2435 3340 }, 3341 + "node_modules/minimatch": { 3342 + "version": "9.0.5", 3343 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 3344 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 3345 + "dev": true, 3346 + "license": "ISC", 3347 + "dependencies": { 3348 + "brace-expansion": "^2.0.1" 3349 + }, 3350 + "engines": { 3351 + "node": ">=16 || 14 >=14.17" 3352 + }, 3353 + "funding": { 3354 + "url": "https://github.com/sponsors/isaacs" 3355 + } 3356 + }, 3357 + "node_modules/minipass": { 3358 + "version": "7.1.2", 3359 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 3360 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 3361 + "dev": true, 3362 + "license": "ISC", 3363 + "engines": { 3364 + "node": ">=16 || 14 >=14.17" 3365 + } 3366 + }, 2436 3367 "node_modules/ms": { 2437 3368 "version": "2.1.3", 2438 3369 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", ··· 2459 3390 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2460 3391 } 2461 3392 }, 3393 + "node_modules/node-releases": { 3394 + "version": "2.0.27", 3395 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", 3396 + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", 3397 + "dev": true, 3398 + "license": "MIT" 3399 + }, 3400 + "node_modules/package-json-from-dist": { 3401 + "version": "1.0.1", 3402 + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 3403 + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 3404 + "dev": true, 3405 + "license": "BlueOak-1.0.0" 3406 + }, 3407 + "node_modules/path-key": { 3408 + "version": "3.1.1", 3409 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 3410 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 3411 + "dev": true, 3412 + "license": "MIT", 3413 + "engines": { 3414 + "node": ">=8" 3415 + } 3416 + }, 3417 + "node_modules/path-scurry": { 3418 + "version": "1.11.1", 3419 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 3420 + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 3421 + "dev": true, 3422 + "license": "BlueOak-1.0.0", 3423 + "dependencies": { 3424 + "lru-cache": "^10.2.0", 3425 + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 3426 + }, 3427 + "engines": { 3428 + "node": ">=16 || 14 >=14.18" 3429 + }, 3430 + "funding": { 3431 + "url": "https://github.com/sponsors/isaacs" 3432 + } 3433 + }, 2462 3434 "node_modules/path-to-regexp": { 2463 3435 "version": "6.3.0", 2464 3436 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", ··· 2625 3597 "@img/sharp-win32-x64": "0.33.5" 2626 3598 } 2627 3599 }, 3600 + "node_modules/shebang-command": { 3601 + "version": "2.0.0", 3602 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3603 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3604 + "dev": true, 3605 + "license": "MIT", 3606 + "dependencies": { 3607 + "shebang-regex": "^3.0.0" 3608 + }, 3609 + "engines": { 3610 + "node": ">=8" 3611 + } 3612 + }, 3613 + "node_modules/shebang-regex": { 3614 + "version": "3.0.0", 3615 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3616 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3617 + "dev": true, 3618 + "license": "MIT", 3619 + "engines": { 3620 + "node": ">=8" 3621 + } 3622 + }, 2628 3623 "node_modules/siginfo": { 2629 3624 "version": "2.0.0", 2630 3625 "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", ··· 2632 3627 "dev": true, 2633 3628 "license": "ISC" 2634 3629 }, 3630 + "node_modules/signal-exit": { 3631 + "version": "4.1.0", 3632 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 3633 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 3634 + "dev": true, 3635 + "license": "ISC", 3636 + "engines": { 3637 + "node": ">=14" 3638 + }, 3639 + "funding": { 3640 + "url": "https://github.com/sponsors/isaacs" 3641 + } 3642 + }, 2635 3643 "node_modules/simple-swizzle": { 2636 3644 "version": "0.2.4", 2637 3645 "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", ··· 2677 3685 "npm": ">=6" 2678 3686 } 2679 3687 }, 3688 + "node_modules/string-width": { 3689 + "version": "5.1.2", 3690 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 3691 + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 3692 + "dev": true, 3693 + "license": "MIT", 3694 + "dependencies": { 3695 + "eastasianwidth": "^0.2.0", 3696 + "emoji-regex": "^9.2.2", 3697 + "strip-ansi": "^7.0.1" 3698 + }, 3699 + "engines": { 3700 + "node": ">=12" 3701 + }, 3702 + "funding": { 3703 + "url": "https://github.com/sponsors/sindresorhus" 3704 + } 3705 + }, 3706 + "node_modules/string-width-cjs": { 3707 + "name": "string-width", 3708 + "version": "4.2.3", 3709 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3710 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3711 + "dev": true, 3712 + "license": "MIT", 3713 + "dependencies": { 3714 + "emoji-regex": "^8.0.0", 3715 + "is-fullwidth-code-point": "^3.0.0", 3716 + "strip-ansi": "^6.0.1" 3717 + }, 3718 + "engines": { 3719 + "node": ">=8" 3720 + } 3721 + }, 3722 + "node_modules/string-width-cjs/node_modules/ansi-regex": { 3723 + "version": "5.0.1", 3724 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3725 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3726 + "dev": true, 3727 + "license": "MIT", 3728 + "engines": { 3729 + "node": ">=8" 3730 + } 3731 + }, 3732 + "node_modules/string-width-cjs/node_modules/emoji-regex": { 3733 + "version": "8.0.0", 3734 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3735 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3736 + "dev": true, 3737 + "license": "MIT" 3738 + }, 3739 + "node_modules/string-width-cjs/node_modules/strip-ansi": { 3740 + "version": "6.0.1", 3741 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3742 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3743 + "dev": true, 3744 + "license": "MIT", 3745 + "dependencies": { 3746 + "ansi-regex": "^5.0.1" 3747 + }, 3748 + "engines": { 3749 + "node": ">=8" 3750 + } 3751 + }, 3752 + "node_modules/strip-ansi": { 3753 + "version": "7.1.2", 3754 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", 3755 + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", 3756 + "dev": true, 3757 + "license": "MIT", 3758 + "dependencies": { 3759 + "ansi-regex": "^6.0.1" 3760 + }, 3761 + "engines": { 3762 + "node": ">=12" 3763 + }, 3764 + "funding": { 3765 + "url": "https://github.com/chalk/strip-ansi?sponsor=1" 3766 + } 3767 + }, 3768 + "node_modules/strip-ansi-cjs": { 3769 + "name": "strip-ansi", 3770 + "version": "6.0.1", 3771 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3772 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3773 + "dev": true, 3774 + "license": "MIT", 3775 + "dependencies": { 3776 + "ansi-regex": "^5.0.1" 3777 + }, 3778 + "engines": { 3779 + "node": ">=8" 3780 + } 3781 + }, 3782 + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 3783 + "version": "5.0.1", 3784 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3785 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3786 + "dev": true, 3787 + "license": "MIT", 3788 + "engines": { 3789 + "node": ">=8" 3790 + } 3791 + }, 2680 3792 "node_modules/strip-literal": { 2681 3793 "version": "3.0.0", 2682 3794 "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", ··· 2703 3815 "url": "https://github.com/chalk/supports-color?sponsor=1" 2704 3816 } 2705 3817 }, 3818 + "node_modules/test-exclude": { 3819 + "version": "7.0.1", 3820 + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", 3821 + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", 3822 + "dev": true, 3823 + "license": "ISC", 3824 + "dependencies": { 3825 + "@istanbuljs/schema": "^0.1.2", 3826 + "glob": "^10.4.1", 3827 + "minimatch": "^9.0.4" 3828 + }, 3829 + "engines": { 3830 + "node": ">=18" 3831 + } 3832 + }, 2706 3833 "node_modules/tinybench": { 2707 3834 "version": "2.9.0", 2708 3835 "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", ··· 2804 3931 "license": "MIT", 2805 3932 "dependencies": { 2806 3933 "pathe": "^2.0.3" 3934 + } 3935 + }, 3936 + "node_modules/update-browserslist-db": { 3937 + "version": "1.2.3", 3938 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", 3939 + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", 3940 + "dev": true, 3941 + "funding": [ 3942 + { 3943 + "type": "opencollective", 3944 + "url": "https://opencollective.com/browserslist" 3945 + }, 3946 + { 3947 + "type": "tidelift", 3948 + "url": "https://tidelift.com/funding/github/npm/browserslist" 3949 + }, 3950 + { 3951 + "type": "github", 3952 + "url": "https://github.com/sponsors/ai" 3953 + } 3954 + ], 3955 + "license": "MIT", 3956 + "dependencies": { 3957 + "escalade": "^3.2.0", 3958 + "picocolors": "^1.1.1" 3959 + }, 3960 + "bin": { 3961 + "update-browserslist-db": "cli.js" 3962 + }, 3963 + "peerDependencies": { 3964 + "browserslist": ">= 4.21.0" 2807 3965 } 2808 3966 }, 2809 3967 "node_modules/vite": { ··· 2975 4133 "jsdom": { 2976 4134 "optional": true 2977 4135 } 4136 + } 4137 + }, 4138 + "node_modules/which": { 4139 + "version": "2.0.2", 4140 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 4141 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 4142 + "dev": true, 4143 + "license": "ISC", 4144 + "dependencies": { 4145 + "isexe": "^2.0.0" 4146 + }, 4147 + "bin": { 4148 + "node-which": "bin/node-which" 4149 + }, 4150 + "engines": { 4151 + "node": ">= 8" 2978 4152 } 2979 4153 }, 2980 4154 "node_modules/why-is-node-running": { ··· 3660 4834 "url": "https://github.com/sponsors/colinhacks" 3661 4835 } 3662 4836 }, 4837 + "node_modules/wrap-ansi": { 4838 + "version": "8.1.0", 4839 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 4840 + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 4841 + "dev": true, 4842 + "license": "MIT", 4843 + "dependencies": { 4844 + "ansi-styles": "^6.1.0", 4845 + "string-width": "^5.0.1", 4846 + "strip-ansi": "^7.0.1" 4847 + }, 4848 + "engines": { 4849 + "node": ">=12" 4850 + }, 4851 + "funding": { 4852 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 4853 + } 4854 + }, 4855 + "node_modules/wrap-ansi-cjs": { 4856 + "name": "wrap-ansi", 4857 + "version": "7.0.0", 4858 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 4859 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 4860 + "dev": true, 4861 + "license": "MIT", 4862 + "dependencies": { 4863 + "ansi-styles": "^4.0.0", 4864 + "string-width": "^4.1.0", 4865 + "strip-ansi": "^6.0.0" 4866 + }, 4867 + "engines": { 4868 + "node": ">=10" 4869 + }, 4870 + "funding": { 4871 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 4872 + } 4873 + }, 4874 + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 4875 + "version": "5.0.1", 4876 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4877 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4878 + "dev": true, 4879 + "license": "MIT", 4880 + "engines": { 4881 + "node": ">=8" 4882 + } 4883 + }, 4884 + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 4885 + "version": "4.3.0", 4886 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 4887 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 4888 + "dev": true, 4889 + "license": "MIT", 4890 + "dependencies": { 4891 + "color-convert": "^2.0.1" 4892 + }, 4893 + "engines": { 4894 + "node": ">=8" 4895 + }, 4896 + "funding": { 4897 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 4898 + } 4899 + }, 4900 + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 4901 + "version": "8.0.0", 4902 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 4903 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 4904 + "dev": true, 4905 + "license": "MIT" 4906 + }, 4907 + "node_modules/wrap-ansi-cjs/node_modules/string-width": { 4908 + "version": "4.2.3", 4909 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 4910 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 4911 + "dev": true, 4912 + "license": "MIT", 4913 + "dependencies": { 4914 + "emoji-regex": "^8.0.0", 4915 + "is-fullwidth-code-point": "^3.0.0", 4916 + "strip-ansi": "^6.0.1" 4917 + }, 4918 + "engines": { 4919 + "node": ">=8" 4920 + } 4921 + }, 4922 + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 4923 + "version": "6.0.1", 4924 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 4925 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 4926 + "dev": true, 4927 + "license": "MIT", 4928 + "dependencies": { 4929 + "ansi-regex": "^5.0.1" 4930 + }, 4931 + "engines": { 4932 + "node": ">=8" 4933 + } 4934 + }, 3663 4935 "node_modules/ws": { 3664 4936 "version": "8.18.0", 3665 4937 "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", ··· 3681 4953 "optional": true 3682 4954 } 3683 4955 } 4956 + }, 4957 + "node_modules/yallist": { 4958 + "version": "3.1.1", 4959 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 4960 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 4961 + "dev": true, 4962 + "license": "ISC" 3684 4963 }, 3685 4964 "node_modules/youch": { 3686 4965 "version": "4.1.0-beta.10",
+2
package.json
··· 11 11 }, 12 12 "devDependencies": { 13 13 "@cloudflare/vitest-pool-workers": "^0.11.1", 14 + "@vitest/coverage-istanbul": "~3.2.0", 15 + "@vitest/coverage-v8": "~3.2.0", 14 16 "typescript": "^5.9.3", 15 17 "vitest": "~3.2.0", 16 18 "wrangler": "^4.54.0"
+17 -5
src/index.ts
··· 4 4 ASSETS: Fetcher; 5 5 } 6 6 7 + interface SSEConfig { 8 + pollIntervalMs: number; 9 + maxAttempts: number; 10 + } 11 + 12 + const DEFAULT_SSE_CONFIG: SSEConfig = { 13 + pollIntervalMs: 5000, 14 + maxAttempts: 60, 15 + }; 16 + 7 17 export default { 8 18 async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { 9 19 const url = new URL(request.url); ··· 17 27 }, 18 28 } satisfies ExportedHandler<Env>; 19 29 20 - async function handleSSE(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { 30 + async function handleSSE(request: Request, env: Env, ctx: ExecutionContext, config: SSEConfig = DEFAULT_SSE_CONFIG): Promise<Response> { 21 31 const url = new URL(request.url); 22 32 const sessionId = url.searchParams.get('session'); 23 33 ··· 47 57 // Send initial connection message 48 58 await writer.write(encoder.encode(': ping\n\n')); 49 59 50 - // Poll for auth data (max 5 minutes) 51 - const maxAttempts = 60; // 5 minutes with 5-second intervals 60 + // Poll for auth data 61 + const maxAttempts = config.maxAttempts; 52 62 let attempts = 0; 53 63 54 64 while (attempts < maxAttempts) { ··· 72 82 break; 73 83 } 74 84 75 - // Wait 5 seconds before next check 76 - await new Promise(resolve => setTimeout(resolve, 5000)); 85 + // Wait before next check 86 + await new Promise(resolve => setTimeout(resolve, config.pollIntervalMs)); 77 87 78 88 // Send keepalive 79 89 await writer.write(encoder.encode(': keepalive\n\n')); ··· 129 139 // Redirect to success page 130 140 return Response.redirect(new URL('/oauth/success', request.url).toString(), 302); 131 141 } 142 + 143 + export { handleSSE, type SSEConfig };
+186 -23
test/index.spec.ts
··· 1 - import { env, createExecutionContext, waitOnExecutionContext, SELF } from 'cloudflare:test'; 1 + import { env, createExecutionContext, waitOnExecutionContext } from 'cloudflare:test'; 2 2 import { describe, it, expect } from 'vitest'; 3 - import worker from '../src'; 3 + import worker, { handleSSE } from '../src'; 4 + 5 + describe('OAuth Worker', () => { 6 + describe('handleOAuthCallback', () => { 7 + it('returns 400 when code is missing', async () => { 8 + const request = new Request('http://example.com/oauth/callback?state=abc123&iss=https://bsky.social'); 9 + const ctx = createExecutionContext(); 10 + const response = await worker.fetch(request, env, ctx); 11 + await waitOnExecutionContext(ctx); 12 + 13 + expect(response.status).toBe(400); 14 + expect(await response.text()).toBe('Missing required parameters'); 15 + }); 16 + 17 + it('returns 400 when state is missing', async () => { 18 + const request = new Request('http://example.com/oauth/callback?code=authcode&iss=https://bsky.social'); 19 + const ctx = createExecutionContext(); 20 + const response = await worker.fetch(request, env, ctx); 21 + await waitOnExecutionContext(ctx); 22 + 23 + expect(response.status).toBe(400); 24 + expect(await response.text()).toBe('Missing required parameters'); 25 + }); 26 + 27 + it('returns 400 when iss is missing', async () => { 28 + const request = new Request('http://example.com/oauth/callback?code=authcode&state=abc123'); 29 + const ctx = createExecutionContext(); 30 + const response = await worker.fetch(request, env, ctx); 31 + await waitOnExecutionContext(ctx); 32 + 33 + expect(response.status).toBe(400); 34 + expect(await response.text()).toBe('Missing required parameters'); 35 + }); 36 + 37 + it('returns 302 redirect to /oauth/success when all params present', async () => { 38 + const request = new Request('http://example.com/oauth/callback?code=authcode&state=abc123&iss=https://bsky.social'); 39 + const ctx = createExecutionContext(); 40 + const response = await worker.fetch(request, env, ctx); 41 + await waitOnExecutionContext(ctx); 42 + 43 + expect(response.status).toBe(302); 44 + expect(response.headers.get('Location')).toBe('http://example.com/oauth/success'); 45 + }); 46 + 47 + it('stores auth data in KV with correct structure', async () => { 48 + const state = 'test-state-123'; 49 + const request = new Request(`http://example.com/oauth/callback?code=testcode&state=${state}&iss=https://bsky.social`); 50 + const ctx = createExecutionContext(); 51 + await worker.fetch(request, env, ctx); 52 + await waitOnExecutionContext(ctx); 53 + 54 + const storedData = await env.OAUTH_SESSIONS.get(state); 55 + expect(storedData).not.toBeNull(); 4 56 5 - describe('Hello World user worker', () => { 6 - describe('request for /message', () => { 7 - it('/ responds with "Hello, World!" (unit style)', async () => { 8 - const request = new Request<unknown, IncomingRequestCfProperties>('http://example.com/message'); 9 - // Create an empty context to pass to `worker.fetch()`. 57 + const parsed = JSON.parse(storedData!); 58 + expect(parsed.code).toBe('testcode'); 59 + expect(parsed.iss).toBe('https://bsky.social'); 60 + expect(parsed.state).toBe(state); 61 + expect(parsed.timestamp).toBeTypeOf('number'); 62 + }); 63 + }); 64 + 65 + describe('handleSSE', () => { 66 + it('returns 400 when session ID is missing', async () => { 67 + const request = new Request('http://example.com/oauth/events'); 10 68 const ctx = createExecutionContext(); 11 69 const response = await worker.fetch(request, env, ctx); 12 - // Wait for all `Promise`s passed to `ctx.waitUntil()` to settle before running test assertions 13 70 await waitOnExecutionContext(ctx); 14 - expect(await response.text()).toMatchInlineSnapshot(`"Hello, World!"`); 71 + 72 + expect(response.status).toBe(400); 73 + expect(await response.text()).toBe('Missing session ID'); 74 + }); 75 + 76 + it('returns response with correct SSE headers', async () => { 77 + const request = new Request('http://example.com/oauth/events?session=test-session'); 78 + const ctx = createExecutionContext(); 79 + const response = await worker.fetch(request, env, ctx); 80 + // Cancel immediately to avoid lingering async operations 81 + await response.body?.cancel(); 82 + 83 + expect(response.headers.get('Content-Type')).toBe('text/event-stream'); 84 + expect(response.headers.get('Cache-Control')).toBe('no-cache'); 85 + expect(response.headers.get('Connection')).toBe('keep-alive'); 86 + expect(response.headers.get('Access-Control-Allow-Origin')).toBe('*'); 87 + }); 88 + 89 + it('sends auth-complete event when auth data exists in KV', async () => { 90 + const sessionId = 'existing-session'; 91 + const authData = { 92 + code: 'testcode', 93 + iss: 'https://bsky.social', 94 + state: sessionId, 95 + timestamp: Date.now() 96 + }; 97 + 98 + // Pre-populate KV with auth data 99 + await env.OAUTH_SESSIONS.put(sessionId, JSON.stringify(authData)); 100 + 101 + const request = new Request(`http://example.com/oauth/events?session=${sessionId}`); 102 + const ctx = createExecutionContext(); 103 + const response = await worker.fetch(request, env, ctx); 104 + 105 + // Read all output from the stream 106 + const output = await response.text(); 107 + 108 + expect(output).toContain(': ping'); 109 + expect(output).toContain('event: auth-complete'); 110 + expect(output).toContain(`data: ${JSON.stringify(authData)}`); 111 + expect(output).toContain('event: close'); 15 112 }); 16 113 17 - it('responds with "Hello, World!" (integration style)', async () => { 18 - const request = new Request('http://example.com/message'); 19 - const response = await SELF.fetch(request); 20 - expect(await response.text()).toMatchInlineSnapshot(`"Hello, World!"`); 114 + it('deletes session from KV after sending auth-complete', async () => { 115 + const sessionId = 'session-to-delete'; 116 + const authData = { 117 + code: 'testcode', 118 + iss: 'https://bsky.social', 119 + state: sessionId, 120 + timestamp: Date.now() 121 + }; 122 + 123 + await env.OAUTH_SESSIONS.put(sessionId, JSON.stringify(authData)); 124 + 125 + const request = new Request(`http://example.com/oauth/events?session=${sessionId}`); 126 + const ctx = createExecutionContext(); 127 + const response = await worker.fetch(request, env, ctx); 128 + 129 + // Consume the entire stream to let the handler complete 130 + await response.text(); 131 + 132 + // Verify session was deleted 133 + const storedData = await env.OAUTH_SESSIONS.get(sessionId); 134 + expect(storedData).toBeNull(); 135 + }); 136 + 137 + it('sends keepalive while polling for auth data', async () => { 138 + const sessionId = 'keepalive-session'; 139 + const request = new Request(`http://example.com/oauth/events?session=${sessionId}`); 140 + const ctx = createExecutionContext(); 141 + 142 + // Use fast polling config - will poll twice then timeout 143 + const response = await handleSSE(request, env, ctx, { 144 + pollIntervalMs: 1, 145 + maxAttempts: 2 146 + }); 147 + 148 + const output = await response.text(); 149 + 150 + expect(output).toContain(': ping'); 151 + expect(output).toContain(': keepalive'); 152 + }); 153 + 154 + it('sends timeout event after max polling attempts', async () => { 155 + const sessionId = 'timeout-session'; 156 + const request = new Request(`http://example.com/oauth/events?session=${sessionId}`); 157 + const ctx = createExecutionContext(); 158 + 159 + // Use minimal config to trigger timeout quickly 160 + const response = await handleSSE(request, env, ctx, { 161 + pollIntervalMs: 1, 162 + maxAttempts: 1 163 + }); 164 + 165 + const output = await response.text(); 166 + 167 + expect(output).toContain('event: timeout'); 168 + expect(output).toContain('"error": "Authentication timeout"'); 21 169 }); 22 170 }); 23 171 24 - describe('request for /random', () => { 25 - it('/ responds with a random UUID (unit style)', async () => { 26 - const request = new Request<unknown, IncomingRequestCfProperties>('http://example.com/random'); 27 - // Create an empty context to pass to `worker.fetch()`. 172 + describe('main fetch handler routing', () => { 173 + it('routes /oauth/callback to OAuth callback handler', async () => { 174 + const request = new Request('http://example.com/oauth/callback?code=test&state=test&iss=test'); 28 175 const ctx = createExecutionContext(); 29 176 const response = await worker.fetch(request, env, ctx); 30 - // Wait for all `Promise`s passed to `ctx.waitUntil()` to settle before running test assertions 31 177 await waitOnExecutionContext(ctx); 32 - expect(await response.text()).toMatch(/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/); 178 + 179 + // OAuth callback returns redirect 180 + expect(response.status).toBe(302); 33 181 }); 34 182 35 - it('responds with a random UUID (integration style)', async () => { 36 - const request = new Request('http://example.com/random'); 37 - const response = await SELF.fetch(request); 38 - expect(await response.text()).toMatch(/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/); 183 + it('routes /oauth/events to SSE handler', async () => { 184 + const request = new Request('http://example.com/oauth/events?session=test'); 185 + const ctx = createExecutionContext(); 186 + const response = await worker.fetch(request, env, ctx); 187 + // Cancel immediately to avoid lingering async operations 188 + await response.body?.cancel(); 189 + 190 + // SSE handler returns event-stream 191 + expect(response.headers.get('Content-Type')).toBe('text/event-stream'); 192 + }); 193 + 194 + it('falls back to ASSETS for other paths', async () => { 195 + const request = new Request('http://example.com/index.html'); 196 + const ctx = createExecutionContext(); 197 + const response = await worker.fetch(request, env, ctx); 198 + await waitOnExecutionContext(ctx); 199 + 200 + // ASSETS fetcher should handle this - we just verify no 400/404 from our handlers 201 + expect(response.status).not.toBe(400); 39 202 }); 40 203 }); 41 204 });