Procedurally generates a radio weather report

Compare changes

Choose any two refs to compare.

+18 -7
.github/workflows/test.yml
··· 1 - name: NPM Audit Check 1 + name: Unit tests 2 2 3 3 on: 4 4 push: 5 5 branches: [ master ] 6 6 pull_request: 7 7 branches: [ master ] 8 - schedule: 9 - - cron: '15 16 * * 5' 10 8 11 9 jobs: 12 10 13 - npm_audit: 14 - name: Check NPM audit 11 + npm_test: 12 + name: Unit tests 15 13 runs-on: ubuntu-latest 16 14 timeout-minutes: 20 17 15 strategy: 18 16 fail-fast: true 17 + matrix: 18 + nodever: 19 + [ 20 + 'latest', 21 + 'lts/*', 22 + 'lts/hydrogen' 23 + ] 19 24 permissions: 20 25 contents: read 21 26 ··· 25 30 26 31 - name: Setup nodejs 27 32 uses: https://github.com/actions/setup-node@v4 33 + with: 34 + node-version: "${{ matrix.nodever }}" 35 + check-latest: true 28 36 29 37 - name: Install dependencies 30 38 run: npm ci 39 + 40 + - name: Build 41 + run: npm run build 31 42 32 - - run: npm test 33 - name: Run tests 43 + - name: Run tests 44 + run: npm test
+2
.gitignore
··· 103 103 distribution/ 104 104 .env 105 105 test/*.js* 106 + output.wav 107 + output.mp3
+18
.tangled/workflows/audit.yml
··· 1 + when: 2 + - event: ["push"] 3 + branch: ["master"] 4 + 5 + engine: "nixery" 6 + 7 + dependencies: 8 + nixpkgs: 9 + - nodejs 10 + 11 + steps: 12 + - name: "NPM Audit" 13 + command: "npm audit" 14 + 15 + clone: 16 + skip: false 17 + depth: 3 18 + submodules: false
+24
.tangled/workflows/test.yml
··· 1 + when: 2 + - event: ["push"] 3 + branch: ["master"] 4 + 5 + engine: "nixery" 6 + 7 + dependencies: 8 + nixpkgs: 9 + - nodejs 10 + 11 + steps: 12 + - name: "Install dependencies" 13 + command: "npm ci" 14 + 15 + - name: "tsc" 16 + command: "npm run build && echo 'done.'" 17 + 18 + - name: "tests" 19 + command: "npm test" 20 + 21 + clone: 22 + skip: false 23 + depth: 3 24 + submodules: false
+22
.vscode/launch.json
··· 1 + { 2 + // Use IntelliSense to learn about possible attributes. 3 + // Hover to view descriptions of existing attributes. 4 + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 + "version": "0.2.0", 6 + "configurations": [ 7 + 8 + { 9 + "type": "node", 10 + "request": "launch", 11 + "name": "Launch Program", 12 + "skipFiles": [ 13 + "<node_internals>/**" 14 + ], 15 + "program": "${workspaceFolder}/src/index.ts", 16 + "preLaunchTask": "tsc: build - tsconfig.json", 17 + "outFiles": [ 18 + "${workspaceFolder}/distribution/**/*.js" 19 + ] 20 + } 21 + ] 22 + }
+4 -4
config/config.example.json5
··· 49 49 "hilo 1": { 50 50 "tracks": [ 51 51 "audio/hi_01.flac", 52 - "%cory hi", 52 + "%cory weather.temp.max", 53 53 "audio/lo_01.flac", 54 - "%cory lo" 54 + "%cory weather.temp.min" 55 55 ] 56 56 }, 57 57 "hilo 2": { 58 58 "tracks": [ 59 59 "audio/hi_02.flac", 60 - "%cory hi", 60 + "%cory weather.temp.max", 61 61 "audio/lo_02.flac", 62 - "%cory lo" 62 + "%cory weather.temp.min" 63 63 ] 64 64 }, 65 65 "rain 1": {
+1077 -272
package-lock.json
··· 1 1 { 2 2 "name": "morning-report", 3 - "version": "0.0.1", 3 + "version": "0.0.5", 4 4 "lockfileVersion": 3, 5 5 "requires": true, 6 6 "packages": { 7 7 "": { 8 8 "name": "morning-report", 9 - "version": "0.0.1", 9 + "version": "0.0.5", 10 10 "license": "MIT", 11 11 "dependencies": { 12 12 "json5": "2.2.3", 13 - "openweathermap-ts": "1.2.10" 13 + "openweather-api-node": "3.1.5" 14 + }, 15 + "bin": { 16 + "morning-report": "distribution/src/index.js" 14 17 }, 15 18 "devDependencies": { 16 - "@types/node": "24.3.0", 17 - "typescript": "5.9.2", 19 + "@types/node": "24.10.1", 20 + "@vitest/coverage-v8": "3.2.4", 21 + "typescript": "5.9.3", 18 22 "vitest": "3.2.4" 19 23 } 20 24 }, 25 + "node_modules/@ampproject/remapping": { 26 + "version": "2.3.0", 27 + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 28 + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 29 + "dev": true, 30 + "license": "Apache-2.0", 31 + "dependencies": { 32 + "@jridgewell/gen-mapping": "^0.3.5", 33 + "@jridgewell/trace-mapping": "^0.3.24" 34 + }, 35 + "engines": { 36 + "node": ">=6.0.0" 37 + } 38 + }, 39 + "node_modules/@babel/helper-string-parser": { 40 + "version": "7.27.1", 41 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 42 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 43 + "dev": true, 44 + "license": "MIT", 45 + "engines": { 46 + "node": ">=6.9.0" 47 + } 48 + }, 49 + "node_modules/@babel/helper-validator-identifier": { 50 + "version": "7.28.5", 51 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 52 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 53 + "dev": true, 54 + "license": "MIT", 55 + "engines": { 56 + "node": ">=6.9.0" 57 + } 58 + }, 59 + "node_modules/@babel/parser": { 60 + "version": "7.28.5", 61 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", 62 + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", 63 + "dev": true, 64 + "license": "MIT", 65 + "dependencies": { 66 + "@babel/types": "^7.28.5" 67 + }, 68 + "bin": { 69 + "parser": "bin/babel-parser.js" 70 + }, 71 + "engines": { 72 + "node": ">=6.0.0" 73 + } 74 + }, 75 + "node_modules/@babel/types": { 76 + "version": "7.28.5", 77 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", 78 + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", 79 + "dev": true, 80 + "license": "MIT", 81 + "dependencies": { 82 + "@babel/helper-string-parser": "^7.27.1", 83 + "@babel/helper-validator-identifier": "^7.28.5" 84 + }, 85 + "engines": { 86 + "node": ">=6.9.0" 87 + } 88 + }, 89 + "node_modules/@bcoe/v8-coverage": { 90 + "version": "1.0.2", 91 + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", 92 + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", 93 + "dev": true, 94 + "license": "MIT", 95 + "engines": { 96 + "node": ">=18" 97 + } 98 + }, 21 99 "node_modules/@esbuild/aix-ppc64": { 22 - "version": "0.25.9", 23 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", 24 - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", 100 + "version": "0.25.12", 101 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", 102 + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", 25 103 "cpu": [ 26 104 "ppc64" 27 105 ], ··· 36 114 } 37 115 }, 38 116 "node_modules/@esbuild/android-arm": { 39 - "version": "0.25.9", 40 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", 41 - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", 117 + "version": "0.25.12", 118 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", 119 + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", 42 120 "cpu": [ 43 121 "arm" 44 122 ], ··· 53 131 } 54 132 }, 55 133 "node_modules/@esbuild/android-arm64": { 56 - "version": "0.25.9", 57 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", 58 - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", 134 + "version": "0.25.12", 135 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", 136 + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", 59 137 "cpu": [ 60 138 "arm64" 61 139 ], ··· 70 148 } 71 149 }, 72 150 "node_modules/@esbuild/android-x64": { 73 - "version": "0.25.9", 74 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", 75 - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", 151 + "version": "0.25.12", 152 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", 153 + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", 76 154 "cpu": [ 77 155 "x64" 78 156 ], ··· 87 165 } 88 166 }, 89 167 "node_modules/@esbuild/darwin-arm64": { 90 - "version": "0.25.9", 91 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", 92 - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", 168 + "version": "0.25.12", 169 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", 170 + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", 93 171 "cpu": [ 94 172 "arm64" 95 173 ], ··· 104 182 } 105 183 }, 106 184 "node_modules/@esbuild/darwin-x64": { 107 - "version": "0.25.9", 108 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", 109 - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", 185 + "version": "0.25.12", 186 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", 187 + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", 110 188 "cpu": [ 111 189 "x64" 112 190 ], ··· 121 199 } 122 200 }, 123 201 "node_modules/@esbuild/freebsd-arm64": { 124 - "version": "0.25.9", 125 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", 126 - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", 202 + "version": "0.25.12", 203 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", 204 + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", 127 205 "cpu": [ 128 206 "arm64" 129 207 ], ··· 138 216 } 139 217 }, 140 218 "node_modules/@esbuild/freebsd-x64": { 141 - "version": "0.25.9", 142 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", 143 - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", 219 + "version": "0.25.12", 220 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", 221 + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", 144 222 "cpu": [ 145 223 "x64" 146 224 ], ··· 155 233 } 156 234 }, 157 235 "node_modules/@esbuild/linux-arm": { 158 - "version": "0.25.9", 159 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", 160 - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", 236 + "version": "0.25.12", 237 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", 238 + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", 161 239 "cpu": [ 162 240 "arm" 163 241 ], ··· 172 250 } 173 251 }, 174 252 "node_modules/@esbuild/linux-arm64": { 175 - "version": "0.25.9", 176 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", 177 - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", 253 + "version": "0.25.12", 254 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", 255 + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", 178 256 "cpu": [ 179 257 "arm64" 180 258 ], ··· 189 267 } 190 268 }, 191 269 "node_modules/@esbuild/linux-ia32": { 192 - "version": "0.25.9", 193 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", 194 - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", 270 + "version": "0.25.12", 271 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", 272 + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", 195 273 "cpu": [ 196 274 "ia32" 197 275 ], ··· 206 284 } 207 285 }, 208 286 "node_modules/@esbuild/linux-loong64": { 209 - "version": "0.25.9", 210 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", 211 - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", 287 + "version": "0.25.12", 288 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", 289 + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", 212 290 "cpu": [ 213 291 "loong64" 214 292 ], ··· 223 301 } 224 302 }, 225 303 "node_modules/@esbuild/linux-mips64el": { 226 - "version": "0.25.9", 227 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", 228 - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", 304 + "version": "0.25.12", 305 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", 306 + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", 229 307 "cpu": [ 230 308 "mips64el" 231 309 ], ··· 240 318 } 241 319 }, 242 320 "node_modules/@esbuild/linux-ppc64": { 243 - "version": "0.25.9", 244 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", 245 - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", 321 + "version": "0.25.12", 322 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", 323 + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", 246 324 "cpu": [ 247 325 "ppc64" 248 326 ], ··· 257 335 } 258 336 }, 259 337 "node_modules/@esbuild/linux-riscv64": { 260 - "version": "0.25.9", 261 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", 262 - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", 338 + "version": "0.25.12", 339 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", 340 + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", 263 341 "cpu": [ 264 342 "riscv64" 265 343 ], ··· 274 352 } 275 353 }, 276 354 "node_modules/@esbuild/linux-s390x": { 277 - "version": "0.25.9", 278 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", 279 - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", 355 + "version": "0.25.12", 356 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", 357 + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", 280 358 "cpu": [ 281 359 "s390x" 282 360 ], ··· 291 369 } 292 370 }, 293 371 "node_modules/@esbuild/linux-x64": { 294 - "version": "0.25.9", 295 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", 296 - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", 372 + "version": "0.25.12", 373 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", 374 + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", 297 375 "cpu": [ 298 376 "x64" 299 377 ], ··· 308 386 } 309 387 }, 310 388 "node_modules/@esbuild/netbsd-arm64": { 311 - "version": "0.25.9", 312 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", 313 - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", 389 + "version": "0.25.12", 390 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", 391 + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", 314 392 "cpu": [ 315 393 "arm64" 316 394 ], ··· 325 403 } 326 404 }, 327 405 "node_modules/@esbuild/netbsd-x64": { 328 - "version": "0.25.9", 329 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", 330 - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", 406 + "version": "0.25.12", 407 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", 408 + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", 331 409 "cpu": [ 332 410 "x64" 333 411 ], ··· 342 420 } 343 421 }, 344 422 "node_modules/@esbuild/openbsd-arm64": { 345 - "version": "0.25.9", 346 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", 347 - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", 423 + "version": "0.25.12", 424 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", 425 + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", 348 426 "cpu": [ 349 427 "arm64" 350 428 ], ··· 359 437 } 360 438 }, 361 439 "node_modules/@esbuild/openbsd-x64": { 362 - "version": "0.25.9", 363 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", 364 - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", 440 + "version": "0.25.12", 441 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", 442 + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", 365 443 "cpu": [ 366 444 "x64" 367 445 ], ··· 376 454 } 377 455 }, 378 456 "node_modules/@esbuild/openharmony-arm64": { 379 - "version": "0.25.9", 380 - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", 381 - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", 457 + "version": "0.25.12", 458 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", 459 + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", 382 460 "cpu": [ 383 461 "arm64" 384 462 ], ··· 393 471 } 394 472 }, 395 473 "node_modules/@esbuild/sunos-x64": { 396 - "version": "0.25.9", 397 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", 398 - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", 474 + "version": "0.25.12", 475 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", 476 + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", 399 477 "cpu": [ 400 478 "x64" 401 479 ], ··· 410 488 } 411 489 }, 412 490 "node_modules/@esbuild/win32-arm64": { 413 - "version": "0.25.9", 414 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", 415 - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", 491 + "version": "0.25.12", 492 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", 493 + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", 416 494 "cpu": [ 417 495 "arm64" 418 496 ], ··· 427 505 } 428 506 }, 429 507 "node_modules/@esbuild/win32-ia32": { 430 - "version": "0.25.9", 431 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", 432 - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", 508 + "version": "0.25.12", 509 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", 510 + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", 433 511 "cpu": [ 434 512 "ia32" 435 513 ], ··· 444 522 } 445 523 }, 446 524 "node_modules/@esbuild/win32-x64": { 447 - "version": "0.25.9", 448 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", 449 - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", 525 + "version": "0.25.12", 526 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", 527 + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", 450 528 "cpu": [ 451 529 "x64" 452 530 ], ··· 460 538 "node": ">=18" 461 539 } 462 540 }, 541 + "node_modules/@isaacs/cliui": { 542 + "version": "8.0.2", 543 + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 544 + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 545 + "dev": true, 546 + "license": "ISC", 547 + "dependencies": { 548 + "string-width": "^5.1.2", 549 + "string-width-cjs": "npm:string-width@^4.2.0", 550 + "strip-ansi": "^7.0.1", 551 + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 552 + "wrap-ansi": "^8.1.0", 553 + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 554 + }, 555 + "engines": { 556 + "node": ">=12" 557 + } 558 + }, 559 + "node_modules/@istanbuljs/schema": { 560 + "version": "0.1.3", 561 + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 562 + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 563 + "dev": true, 564 + "license": "MIT", 565 + "engines": { 566 + "node": ">=8" 567 + } 568 + }, 569 + "node_modules/@jridgewell/gen-mapping": { 570 + "version": "0.3.13", 571 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 572 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 573 + "dev": true, 574 + "license": "MIT", 575 + "dependencies": { 576 + "@jridgewell/sourcemap-codec": "^1.5.0", 577 + "@jridgewell/trace-mapping": "^0.3.24" 578 + } 579 + }, 580 + "node_modules/@jridgewell/resolve-uri": { 581 + "version": "3.1.2", 582 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 583 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 584 + "dev": true, 585 + "license": "MIT", 586 + "engines": { 587 + "node": ">=6.0.0" 588 + } 589 + }, 463 590 "node_modules/@jridgewell/sourcemap-codec": { 464 591 "version": "1.5.5", 465 592 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", ··· 467 594 "dev": true, 468 595 "license": "MIT" 469 596 }, 597 + "node_modules/@jridgewell/trace-mapping": { 598 + "version": "0.3.31", 599 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 600 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 601 + "dev": true, 602 + "license": "MIT", 603 + "dependencies": { 604 + "@jridgewell/resolve-uri": "^3.1.0", 605 + "@jridgewell/sourcemap-codec": "^1.4.14" 606 + } 607 + }, 608 + "node_modules/@pkgjs/parseargs": { 609 + "version": "0.11.0", 610 + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 611 + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 612 + "dev": true, 613 + "license": "MIT", 614 + "optional": true, 615 + "engines": { 616 + "node": ">=14" 617 + } 618 + }, 470 619 "node_modules/@rollup/rollup-android-arm-eabi": { 471 - "version": "4.48.0", 472 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.48.0.tgz", 473 - "integrity": "sha512-aVzKH922ogVAWkKiyKXorjYymz2084zrhrZRXtLrA5eEx5SO8Dj0c/4FpCHZyn7MKzhW2pW4tK28vVr+5oQ2xw==", 620 + "version": "4.53.3", 621 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", 622 + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", 474 623 "cpu": [ 475 624 "arm" 476 625 ], ··· 482 631 ] 483 632 }, 484 633 "node_modules/@rollup/rollup-android-arm64": { 485 - "version": "4.48.0", 486 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.48.0.tgz", 487 - "integrity": "sha512-diOdQuw43xTa1RddAFbhIA8toirSzFMcnIg8kvlzRbK26xqEnKJ/vqQnghTAajy2Dcy42v+GMPMo6jq67od+Dw==", 634 + "version": "4.53.3", 635 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", 636 + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", 488 637 "cpu": [ 489 638 "arm64" 490 639 ], ··· 496 645 ] 497 646 }, 498 647 "node_modules/@rollup/rollup-darwin-arm64": { 499 - "version": "4.48.0", 500 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.48.0.tgz", 501 - "integrity": "sha512-QhR2KA18fPlJWFefySJPDYZELaVqIUVnYgAOdtJ+B/uH96CFg2l1TQpX19XpUMWUqMyIiyY45wje8K6F4w4/CA==", 648 + "version": "4.53.3", 649 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", 650 + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", 502 651 "cpu": [ 503 652 "arm64" 504 653 ], ··· 510 659 ] 511 660 }, 512 661 "node_modules/@rollup/rollup-darwin-x64": { 513 - "version": "4.48.0", 514 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.48.0.tgz", 515 - "integrity": "sha512-Q9RMXnQVJ5S1SYpNSTwXDpoQLgJ/fbInWOyjbCnnqTElEyeNvLAB3QvG5xmMQMhFN74bB5ZZJYkKaFPcOG8sGg==", 662 + "version": "4.53.3", 663 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", 664 + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", 516 665 "cpu": [ 517 666 "x64" 518 667 ], ··· 524 673 ] 525 674 }, 526 675 "node_modules/@rollup/rollup-freebsd-arm64": { 527 - "version": "4.48.0", 528 - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.48.0.tgz", 529 - "integrity": "sha512-3jzOhHWM8O8PSfyft+ghXZfBkZawQA0PUGtadKYxFqpcYlOYjTi06WsnYBsbMHLawr+4uWirLlbhcYLHDXR16w==", 676 + "version": "4.53.3", 677 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", 678 + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", 530 679 "cpu": [ 531 680 "arm64" 532 681 ], ··· 538 687 ] 539 688 }, 540 689 "node_modules/@rollup/rollup-freebsd-x64": { 541 - "version": "4.48.0", 542 - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.48.0.tgz", 543 - "integrity": "sha512-NcD5uVUmE73C/TPJqf78hInZmiSBsDpz3iD5MF/BuB+qzm4ooF2S1HfeTChj5K4AV3y19FFPgxonsxiEpy8v/A==", 690 + "version": "4.53.3", 691 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", 692 + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", 544 693 "cpu": [ 545 694 "x64" 546 695 ], ··· 552 701 ] 553 702 }, 554 703 "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 555 - "version": "4.48.0", 556 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.48.0.tgz", 557 - "integrity": "sha512-JWnrj8qZgLWRNHr7NbpdnrQ8kcg09EBBq8jVOjmtlB3c8C6IrynAJSMhMVGME4YfTJzIkJqvSUSVJRqkDnu/aA==", 704 + "version": "4.53.3", 705 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", 706 + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", 558 707 "cpu": [ 559 708 "arm" 560 709 ], ··· 566 715 ] 567 716 }, 568 717 "node_modules/@rollup/rollup-linux-arm-musleabihf": { 569 - "version": "4.48.0", 570 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.48.0.tgz", 571 - "integrity": "sha512-9xu92F0TxuMH0tD6tG3+GtngwdgSf8Bnz+YcsPG91/r5Vgh5LNofO48jV55priA95p3c92FLmPM7CvsVlnSbGQ==", 718 + "version": "4.53.3", 719 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", 720 + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", 572 721 "cpu": [ 573 722 "arm" 574 723 ], ··· 580 729 ] 581 730 }, 582 731 "node_modules/@rollup/rollup-linux-arm64-gnu": { 583 - "version": "4.48.0", 584 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.48.0.tgz", 585 - "integrity": "sha512-NLtvJB5YpWn7jlp1rJiY0s+G1Z1IVmkDuiywiqUhh96MIraC0n7XQc2SZ1CZz14shqkM+XN2UrfIo7JB6UufOA==", 732 + "version": "4.53.3", 733 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", 734 + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", 586 735 "cpu": [ 587 736 "arm64" 588 737 ], ··· 594 743 ] 595 744 }, 596 745 "node_modules/@rollup/rollup-linux-arm64-musl": { 597 - "version": "4.48.0", 598 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.48.0.tgz", 599 - "integrity": "sha512-QJ4hCOnz2SXgCh+HmpvZkM+0NSGcZACyYS8DGbWn2PbmA0e5xUk4bIP8eqJyNXLtyB4gZ3/XyvKtQ1IFH671vQ==", 746 + "version": "4.53.3", 747 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", 748 + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", 600 749 "cpu": [ 601 750 "arm64" 602 751 ], ··· 607 756 "linux" 608 757 ] 609 758 }, 610 - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 611 - "version": "4.48.0", 612 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.48.0.tgz", 613 - "integrity": "sha512-Pk0qlGJnhILdIC5zSKQnprFjrGmjfDM7TPZ0FKJxRkoo+kgMRAg4ps1VlTZf8u2vohSicLg7NP+cA5qE96PaFg==", 759 + "node_modules/@rollup/rollup-linux-loong64-gnu": { 760 + "version": "4.53.3", 761 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", 762 + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", 614 763 "cpu": [ 615 764 "loong64" 616 765 ], ··· 622 771 ] 623 772 }, 624 773 "node_modules/@rollup/rollup-linux-ppc64-gnu": { 625 - "version": "4.48.0", 626 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.48.0.tgz", 627 - "integrity": "sha512-/dNFc6rTpoOzgp5GKoYjT6uLo8okR/Chi2ECOmCZiS4oqh3mc95pThWma7Bgyk6/WTEvjDINpiBCuecPLOgBLQ==", 774 + "version": "4.53.3", 775 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", 776 + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", 628 777 "cpu": [ 629 778 "ppc64" 630 779 ], ··· 636 785 ] 637 786 }, 638 787 "node_modules/@rollup/rollup-linux-riscv64-gnu": { 639 - "version": "4.48.0", 640 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.48.0.tgz", 641 - "integrity": "sha512-YBwXsvsFI8CVA4ej+bJF2d9uAeIiSkqKSPQNn0Wyh4eMDY4wxuSp71BauPjQNCKK2tD2/ksJ7uhJ8X/PVY9bHQ==", 788 + "version": "4.53.3", 789 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", 790 + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", 642 791 "cpu": [ 643 792 "riscv64" 644 793 ], ··· 650 799 ] 651 800 }, 652 801 "node_modules/@rollup/rollup-linux-riscv64-musl": { 653 - "version": "4.48.0", 654 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.48.0.tgz", 655 - "integrity": "sha512-FI3Rr2aGAtl1aHzbkBIamsQyuauYtTF9SDUJ8n2wMXuuxwchC3QkumZa1TEXYIv/1AUp1a25Kwy6ONArvnyeVQ==", 802 + "version": "4.53.3", 803 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", 804 + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", 656 805 "cpu": [ 657 806 "riscv64" 658 807 ], ··· 664 813 ] 665 814 }, 666 815 "node_modules/@rollup/rollup-linux-s390x-gnu": { 667 - "version": "4.48.0", 668 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.48.0.tgz", 669 - "integrity": "sha512-Dx7qH0/rvNNFmCcIRe1pyQ9/H0XO4v/f0SDoafwRYwc2J7bJZ5N4CHL/cdjamISZ5Cgnon6iazAVRFlxSoHQnQ==", 816 + "version": "4.53.3", 817 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", 818 + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", 670 819 "cpu": [ 671 820 "s390x" 672 821 ], ··· 678 827 ] 679 828 }, 680 829 "node_modules/@rollup/rollup-linux-x64-gnu": { 681 - "version": "4.48.0", 682 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.48.0.tgz", 683 - "integrity": "sha512-GUdZKTeKBq9WmEBzvFYuC88yk26vT66lQV8D5+9TgkfbewhLaTHRNATyzpQwwbHIfJvDJ3N9WJ90wK/uR3cy3Q==", 830 + "version": "4.53.3", 831 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", 832 + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", 684 833 "cpu": [ 685 834 "x64" 686 835 ], ··· 692 841 ] 693 842 }, 694 843 "node_modules/@rollup/rollup-linux-x64-musl": { 695 - "version": "4.48.0", 696 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.48.0.tgz", 697 - "integrity": "sha512-ao58Adz/v14MWpQgYAb4a4h3fdw73DrDGtaiF7Opds5wNyEQwtO6M9dBh89nke0yoZzzaegq6J/EXs7eBebG8A==", 844 + "version": "4.53.3", 845 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", 846 + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", 698 847 "cpu": [ 699 848 "x64" 700 849 ], ··· 705 854 "linux" 706 855 ] 707 856 }, 857 + "node_modules/@rollup/rollup-openharmony-arm64": { 858 + "version": "4.53.3", 859 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", 860 + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", 861 + "cpu": [ 862 + "arm64" 863 + ], 864 + "dev": true, 865 + "license": "MIT", 866 + "optional": true, 867 + "os": [ 868 + "openharmony" 869 + ] 870 + }, 708 871 "node_modules/@rollup/rollup-win32-arm64-msvc": { 709 - "version": "4.48.0", 710 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.48.0.tgz", 711 - "integrity": "sha512-kpFno46bHtjZVdRIOxqaGeiABiToo2J+st7Yce+aiAoo1H0xPi2keyQIP04n2JjDVuxBN6bSz9R6RdTK5hIppw==", 872 + "version": "4.53.3", 873 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", 874 + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", 712 875 "cpu": [ 713 876 "arm64" 714 877 ], ··· 720 883 ] 721 884 }, 722 885 "node_modules/@rollup/rollup-win32-ia32-msvc": { 723 - "version": "4.48.0", 724 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.48.0.tgz", 725 - "integrity": "sha512-rFYrk4lLk9YUTIeihnQMiwMr6gDhGGSbWThPEDfBoU/HdAtOzPXeexKi7yU8jO+LWRKnmqPN9NviHQf6GDwBcQ==", 886 + "version": "4.53.3", 887 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", 888 + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", 726 889 "cpu": [ 727 890 "ia32" 728 891 ], ··· 733 896 "win32" 734 897 ] 735 898 }, 899 + "node_modules/@rollup/rollup-win32-x64-gnu": { 900 + "version": "4.53.3", 901 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", 902 + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", 903 + "cpu": [ 904 + "x64" 905 + ], 906 + "dev": true, 907 + "license": "MIT", 908 + "optional": true, 909 + "os": [ 910 + "win32" 911 + ] 912 + }, 736 913 "node_modules/@rollup/rollup-win32-x64-msvc": { 737 - "version": "4.48.0", 738 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.48.0.tgz", 739 - "integrity": "sha512-sq0hHLTgdtwOPDB5SJOuaoHyiP1qSwg+71TQWk8iDS04bW1wIE0oQ6otPiRj2ZvLYNASLMaTp8QRGUVZ+5OL5A==", 914 + "version": "4.53.3", 915 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", 916 + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", 740 917 "cpu": [ 741 918 "x64" 742 919 ], ··· 748 925 ] 749 926 }, 750 927 "node_modules/@types/chai": { 751 - "version": "5.2.2", 752 - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", 753 - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", 928 + "version": "5.2.3", 929 + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", 930 + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", 754 931 "dev": true, 755 932 "license": "MIT", 756 933 "dependencies": { 757 - "@types/deep-eql": "*" 934 + "@types/deep-eql": "*", 935 + "assertion-error": "^2.0.1" 758 936 } 759 937 }, 760 938 "node_modules/@types/deep-eql": { ··· 772 950 "license": "MIT" 773 951 }, 774 952 "node_modules/@types/node": { 775 - "version": "24.3.0", 776 - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", 777 - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", 953 + "version": "24.10.1", 954 + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", 955 + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", 778 956 "dev": true, 779 957 "license": "MIT", 780 958 "dependencies": { 781 - "undici-types": "~7.10.0" 959 + "undici-types": "~7.16.0" 960 + } 961 + }, 962 + "node_modules/@vitest/coverage-v8": { 963 + "version": "3.2.4", 964 + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", 965 + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", 966 + "dev": true, 967 + "license": "MIT", 968 + "dependencies": { 969 + "@ampproject/remapping": "^2.3.0", 970 + "@bcoe/v8-coverage": "^1.0.2", 971 + "ast-v8-to-istanbul": "^0.3.3", 972 + "debug": "^4.4.1", 973 + "istanbul-lib-coverage": "^3.2.2", 974 + "istanbul-lib-report": "^3.0.1", 975 + "istanbul-lib-source-maps": "^5.0.6", 976 + "istanbul-reports": "^3.1.7", 977 + "magic-string": "^0.30.17", 978 + "magicast": "^0.3.5", 979 + "std-env": "^3.9.0", 980 + "test-exclude": "^7.0.1", 981 + "tinyrainbow": "^2.0.0" 982 + }, 983 + "funding": { 984 + "url": "https://opencollective.com/vitest" 985 + }, 986 + "peerDependencies": { 987 + "@vitest/browser": "3.2.4", 988 + "vitest": "3.2.4" 989 + }, 990 + "peerDependenciesMeta": { 991 + "@vitest/browser": { 992 + "optional": true 993 + } 782 994 } 783 995 }, 784 996 "node_modules/@vitest/expect": { ··· 896 1108 "url": "https://opencollective.com/vitest" 897 1109 } 898 1110 }, 1111 + "node_modules/ansi-regex": { 1112 + "version": "6.2.2", 1113 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", 1114 + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", 1115 + "dev": true, 1116 + "license": "MIT", 1117 + "engines": { 1118 + "node": ">=12" 1119 + }, 1120 + "funding": { 1121 + "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1122 + } 1123 + }, 1124 + "node_modules/ansi-styles": { 1125 + "version": "6.2.3", 1126 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", 1127 + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", 1128 + "dev": true, 1129 + "license": "MIT", 1130 + "engines": { 1131 + "node": ">=12" 1132 + }, 1133 + "funding": { 1134 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1135 + } 1136 + }, 899 1137 "node_modules/assertion-error": { 900 1138 "version": "2.0.1", 901 1139 "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", ··· 906 1144 "node": ">=12" 907 1145 } 908 1146 }, 1147 + "node_modules/ast-v8-to-istanbul": { 1148 + "version": "0.3.8", 1149 + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", 1150 + "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", 1151 + "dev": true, 1152 + "license": "MIT", 1153 + "dependencies": { 1154 + "@jridgewell/trace-mapping": "^0.3.31", 1155 + "estree-walker": "^3.0.3", 1156 + "js-tokens": "^9.0.1" 1157 + } 1158 + }, 1159 + "node_modules/balanced-match": { 1160 + "version": "1.0.2", 1161 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1162 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1163 + "dev": true, 1164 + "license": "MIT" 1165 + }, 1166 + "node_modules/brace-expansion": { 1167 + "version": "2.0.2", 1168 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 1169 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 1170 + "dev": true, 1171 + "license": "MIT", 1172 + "dependencies": { 1173 + "balanced-match": "^1.0.0" 1174 + } 1175 + }, 909 1176 "node_modules/cac": { 910 1177 "version": "6.7.14", 911 1178 "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", ··· 943 1210 "node": ">= 16" 944 1211 } 945 1212 }, 1213 + "node_modules/color-convert": { 1214 + "version": "2.0.1", 1215 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1216 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1217 + "dev": true, 1218 + "license": "MIT", 1219 + "dependencies": { 1220 + "color-name": "~1.1.4" 1221 + }, 1222 + "engines": { 1223 + "node": ">=7.0.0" 1224 + } 1225 + }, 1226 + "node_modules/color-name": { 1227 + "version": "1.1.4", 1228 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1229 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1230 + "dev": true, 1231 + "license": "MIT" 1232 + }, 1233 + "node_modules/cross-spawn": { 1234 + "version": "7.0.6", 1235 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1236 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1237 + "dev": true, 1238 + "license": "MIT", 1239 + "dependencies": { 1240 + "path-key": "^3.1.0", 1241 + "shebang-command": "^2.0.0", 1242 + "which": "^2.0.1" 1243 + }, 1244 + "engines": { 1245 + "node": ">= 8" 1246 + } 1247 + }, 946 1248 "node_modules/debug": { 947 1249 "version": "4.4.1", 948 1250 "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", ··· 971 1273 "node": ">=6" 972 1274 } 973 1275 }, 1276 + "node_modules/eastasianwidth": { 1277 + "version": "0.2.0", 1278 + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1279 + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1280 + "dev": true, 1281 + "license": "MIT" 1282 + }, 1283 + "node_modules/emoji-regex": { 1284 + "version": "9.2.2", 1285 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1286 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1287 + "dev": true, 1288 + "license": "MIT" 1289 + }, 974 1290 "node_modules/es-module-lexer": { 975 1291 "version": "1.7.0", 976 1292 "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", ··· 979 1295 "license": "MIT" 980 1296 }, 981 1297 "node_modules/esbuild": { 982 - "version": "0.25.9", 983 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", 984 - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", 1298 + "version": "0.25.12", 1299 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", 1300 + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", 985 1301 "dev": true, 986 1302 "hasInstallScript": true, 987 1303 "license": "MIT", ··· 992 1308 "node": ">=18" 993 1309 }, 994 1310 "optionalDependencies": { 995 - "@esbuild/aix-ppc64": "0.25.9", 996 - "@esbuild/android-arm": "0.25.9", 997 - "@esbuild/android-arm64": "0.25.9", 998 - "@esbuild/android-x64": "0.25.9", 999 - "@esbuild/darwin-arm64": "0.25.9", 1000 - "@esbuild/darwin-x64": "0.25.9", 1001 - "@esbuild/freebsd-arm64": "0.25.9", 1002 - "@esbuild/freebsd-x64": "0.25.9", 1003 - "@esbuild/linux-arm": "0.25.9", 1004 - "@esbuild/linux-arm64": "0.25.9", 1005 - "@esbuild/linux-ia32": "0.25.9", 1006 - "@esbuild/linux-loong64": "0.25.9", 1007 - "@esbuild/linux-mips64el": "0.25.9", 1008 - "@esbuild/linux-ppc64": "0.25.9", 1009 - "@esbuild/linux-riscv64": "0.25.9", 1010 - "@esbuild/linux-s390x": "0.25.9", 1011 - "@esbuild/linux-x64": "0.25.9", 1012 - "@esbuild/netbsd-arm64": "0.25.9", 1013 - "@esbuild/netbsd-x64": "0.25.9", 1014 - "@esbuild/openbsd-arm64": "0.25.9", 1015 - "@esbuild/openbsd-x64": "0.25.9", 1016 - "@esbuild/openharmony-arm64": "0.25.9", 1017 - "@esbuild/sunos-x64": "0.25.9", 1018 - "@esbuild/win32-arm64": "0.25.9", 1019 - "@esbuild/win32-ia32": "0.25.9", 1020 - "@esbuild/win32-x64": "0.25.9" 1311 + "@esbuild/aix-ppc64": "0.25.12", 1312 + "@esbuild/android-arm": "0.25.12", 1313 + "@esbuild/android-arm64": "0.25.12", 1314 + "@esbuild/android-x64": "0.25.12", 1315 + "@esbuild/darwin-arm64": "0.25.12", 1316 + "@esbuild/darwin-x64": "0.25.12", 1317 + "@esbuild/freebsd-arm64": "0.25.12", 1318 + "@esbuild/freebsd-x64": "0.25.12", 1319 + "@esbuild/linux-arm": "0.25.12", 1320 + "@esbuild/linux-arm64": "0.25.12", 1321 + "@esbuild/linux-ia32": "0.25.12", 1322 + "@esbuild/linux-loong64": "0.25.12", 1323 + "@esbuild/linux-mips64el": "0.25.12", 1324 + "@esbuild/linux-ppc64": "0.25.12", 1325 + "@esbuild/linux-riscv64": "0.25.12", 1326 + "@esbuild/linux-s390x": "0.25.12", 1327 + "@esbuild/linux-x64": "0.25.12", 1328 + "@esbuild/netbsd-arm64": "0.25.12", 1329 + "@esbuild/netbsd-x64": "0.25.12", 1330 + "@esbuild/openbsd-arm64": "0.25.12", 1331 + "@esbuild/openbsd-x64": "0.25.12", 1332 + "@esbuild/openharmony-arm64": "0.25.12", 1333 + "@esbuild/sunos-x64": "0.25.12", 1334 + "@esbuild/win32-arm64": "0.25.12", 1335 + "@esbuild/win32-ia32": "0.25.12", 1336 + "@esbuild/win32-x64": "0.25.12" 1021 1337 } 1022 1338 }, 1023 1339 "node_modules/estree-walker": { ··· 1058 1374 } 1059 1375 } 1060 1376 }, 1377 + "node_modules/foreground-child": { 1378 + "version": "3.3.1", 1379 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 1380 + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 1381 + "dev": true, 1382 + "license": "ISC", 1383 + "dependencies": { 1384 + "cross-spawn": "^7.0.6", 1385 + "signal-exit": "^4.0.1" 1386 + }, 1387 + "engines": { 1388 + "node": ">=14" 1389 + }, 1390 + "funding": { 1391 + "url": "https://github.com/sponsors/isaacs" 1392 + } 1393 + }, 1061 1394 "node_modules/fsevents": { 1062 1395 "version": "2.3.3", 1063 1396 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", ··· 1073 1406 "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1074 1407 } 1075 1408 }, 1409 + "node_modules/glob": { 1410 + "version": "10.5.0", 1411 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", 1412 + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", 1413 + "dev": true, 1414 + "license": "ISC", 1415 + "dependencies": { 1416 + "foreground-child": "^3.1.0", 1417 + "jackspeak": "^3.1.2", 1418 + "minimatch": "^9.0.4", 1419 + "minipass": "^7.1.2", 1420 + "package-json-from-dist": "^1.0.0", 1421 + "path-scurry": "^1.11.1" 1422 + }, 1423 + "bin": { 1424 + "glob": "dist/esm/bin.mjs" 1425 + }, 1426 + "funding": { 1427 + "url": "https://github.com/sponsors/isaacs" 1428 + } 1429 + }, 1430 + "node_modules/has-flag": { 1431 + "version": "4.0.0", 1432 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1433 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1434 + "dev": true, 1435 + "license": "MIT", 1436 + "engines": { 1437 + "node": ">=8" 1438 + } 1439 + }, 1440 + "node_modules/html-escaper": { 1441 + "version": "2.0.2", 1442 + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1443 + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1444 + "dev": true, 1445 + "license": "MIT" 1446 + }, 1447 + "node_modules/is-fullwidth-code-point": { 1448 + "version": "3.0.0", 1449 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1450 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1451 + "dev": true, 1452 + "license": "MIT", 1453 + "engines": { 1454 + "node": ">=8" 1455 + } 1456 + }, 1457 + "node_modules/isexe": { 1458 + "version": "2.0.0", 1459 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1460 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1461 + "dev": true, 1462 + "license": "ISC" 1463 + }, 1464 + "node_modules/istanbul-lib-coverage": { 1465 + "version": "3.2.2", 1466 + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 1467 + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 1468 + "dev": true, 1469 + "license": "BSD-3-Clause", 1470 + "engines": { 1471 + "node": ">=8" 1472 + } 1473 + }, 1474 + "node_modules/istanbul-lib-report": { 1475 + "version": "3.0.1", 1476 + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 1477 + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 1478 + "dev": true, 1479 + "license": "BSD-3-Clause", 1480 + "dependencies": { 1481 + "istanbul-lib-coverage": "^3.0.0", 1482 + "make-dir": "^4.0.0", 1483 + "supports-color": "^7.1.0" 1484 + }, 1485 + "engines": { 1486 + "node": ">=10" 1487 + } 1488 + }, 1489 + "node_modules/istanbul-lib-source-maps": { 1490 + "version": "5.0.6", 1491 + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", 1492 + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", 1493 + "dev": true, 1494 + "license": "BSD-3-Clause", 1495 + "dependencies": { 1496 + "@jridgewell/trace-mapping": "^0.3.23", 1497 + "debug": "^4.1.1", 1498 + "istanbul-lib-coverage": "^3.0.0" 1499 + }, 1500 + "engines": { 1501 + "node": ">=10" 1502 + } 1503 + }, 1504 + "node_modules/istanbul-reports": { 1505 + "version": "3.2.0", 1506 + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", 1507 + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", 1508 + "dev": true, 1509 + "license": "BSD-3-Clause", 1510 + "dependencies": { 1511 + "html-escaper": "^2.0.0", 1512 + "istanbul-lib-report": "^3.0.0" 1513 + }, 1514 + "engines": { 1515 + "node": ">=8" 1516 + } 1517 + }, 1518 + "node_modules/jackspeak": { 1519 + "version": "3.4.3", 1520 + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1521 + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1522 + "dev": true, 1523 + "license": "BlueOak-1.0.0", 1524 + "dependencies": { 1525 + "@isaacs/cliui": "^8.0.2" 1526 + }, 1527 + "funding": { 1528 + "url": "https://github.com/sponsors/isaacs" 1529 + }, 1530 + "optionalDependencies": { 1531 + "@pkgjs/parseargs": "^0.11.0" 1532 + } 1533 + }, 1076 1534 "node_modules/js-tokens": { 1077 1535 "version": "9.0.1", 1078 1536 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", ··· 1099 1557 "dev": true, 1100 1558 "license": "MIT" 1101 1559 }, 1560 + "node_modules/lru-cache": { 1561 + "version": "10.4.3", 1562 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1563 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1564 + "dev": true, 1565 + "license": "ISC" 1566 + }, 1102 1567 "node_modules/magic-string": { 1103 - "version": "0.30.18", 1104 - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", 1105 - "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", 1568 + "version": "0.30.21", 1569 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", 1570 + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", 1106 1571 "dev": true, 1107 1572 "license": "MIT", 1108 1573 "dependencies": { 1109 1574 "@jridgewell/sourcemap-codec": "^1.5.5" 1110 1575 } 1111 1576 }, 1577 + "node_modules/magicast": { 1578 + "version": "0.3.5", 1579 + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", 1580 + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", 1581 + "dev": true, 1582 + "license": "MIT", 1583 + "dependencies": { 1584 + "@babel/parser": "^7.25.4", 1585 + "@babel/types": "^7.25.4", 1586 + "source-map-js": "^1.2.0" 1587 + } 1588 + }, 1589 + "node_modules/make-dir": { 1590 + "version": "4.0.0", 1591 + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 1592 + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 1593 + "dev": true, 1594 + "license": "MIT", 1595 + "dependencies": { 1596 + "semver": "^7.5.3" 1597 + }, 1598 + "engines": { 1599 + "node": ">=10" 1600 + }, 1601 + "funding": { 1602 + "url": "https://github.com/sponsors/sindresorhus" 1603 + } 1604 + }, 1605 + "node_modules/minimatch": { 1606 + "version": "9.0.5", 1607 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1608 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1609 + "dev": true, 1610 + "license": "ISC", 1611 + "dependencies": { 1612 + "brace-expansion": "^2.0.1" 1613 + }, 1614 + "engines": { 1615 + "node": ">=16 || 14 >=14.17" 1616 + }, 1617 + "funding": { 1618 + "url": "https://github.com/sponsors/isaacs" 1619 + } 1620 + }, 1621 + "node_modules/minipass": { 1622 + "version": "7.1.2", 1623 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1624 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1625 + "dev": true, 1626 + "license": "ISC", 1627 + "engines": { 1628 + "node": ">=16 || 14 >=14.17" 1629 + } 1630 + }, 1112 1631 "node_modules/ms": { 1113 1632 "version": "2.1.3", 1114 1633 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", ··· 1135 1654 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1136 1655 } 1137 1656 }, 1138 - "node_modules/node-fetch": { 1139 - "version": "2.7.0", 1140 - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1141 - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1657 + "node_modules/openweather-api-node": { 1658 + "version": "3.1.5", 1659 + "resolved": "https://registry.npmjs.org/openweather-api-node/-/openweather-api-node-3.1.5.tgz", 1660 + "integrity": "sha512-FGLE0bWOTvp4XHaswmzMfisYMMEtwEwOEJR0vaS07L31OUcutV/UUO5/vRuktkRPoqfk3KZOoqddsRTGTxT7Aw==", 1661 + "license": "MIT" 1662 + }, 1663 + "node_modules/package-json-from-dist": { 1664 + "version": "1.0.1", 1665 + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1666 + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1667 + "dev": true, 1668 + "license": "BlueOak-1.0.0" 1669 + }, 1670 + "node_modules/path-key": { 1671 + "version": "3.1.1", 1672 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1673 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1674 + "dev": true, 1142 1675 "license": "MIT", 1143 - "dependencies": { 1144 - "whatwg-url": "^5.0.0" 1145 - }, 1146 1676 "engines": { 1147 - "node": "4.x || >=6.0.0" 1148 - }, 1149 - "peerDependencies": { 1150 - "encoding": "^0.1.0" 1151 - }, 1152 - "peerDependenciesMeta": { 1153 - "encoding": { 1154 - "optional": true 1155 - } 1677 + "node": ">=8" 1156 1678 } 1157 1679 }, 1158 - "node_modules/openweathermap-ts": { 1159 - "version": "1.2.10", 1160 - "resolved": "https://registry.npmjs.org/openweathermap-ts/-/openweathermap-ts-1.2.10.tgz", 1161 - "integrity": "sha512-Zckv2aXN8ENSeAeroces2jJciLWb6aLNXEmvG6pmF+BcIMw2kwRo6++/AKUNoU5suOp47UWA6lllDV0TNm//OA==", 1162 - "license": "MIT", 1680 + "node_modules/path-scurry": { 1681 + "version": "1.11.1", 1682 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1683 + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1684 + "dev": true, 1685 + "license": "BlueOak-1.0.0", 1163 1686 "dependencies": { 1164 - "node-fetch": "^2.6.0" 1687 + "lru-cache": "^10.2.0", 1688 + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1689 + }, 1690 + "engines": { 1691 + "node": ">=16 || 14 >=14.18" 1692 + }, 1693 + "funding": { 1694 + "url": "https://github.com/sponsors/isaacs" 1165 1695 } 1166 1696 }, 1167 1697 "node_modules/pathe": { ··· 1231 1761 } 1232 1762 }, 1233 1763 "node_modules/rollup": { 1234 - "version": "4.48.0", 1235 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.48.0.tgz", 1236 - "integrity": "sha512-BXHRqK1vyt9XVSEHZ9y7xdYtuYbwVod2mLwOMFP7t/Eqoc1pHRlG/WdV2qNeNvZHRQdLedaFycljaYYM96RqJQ==", 1764 + "version": "4.53.3", 1765 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", 1766 + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", 1237 1767 "dev": true, 1238 1768 "license": "MIT", 1239 1769 "dependencies": { ··· 1247 1777 "npm": ">=8.0.0" 1248 1778 }, 1249 1779 "optionalDependencies": { 1250 - "@rollup/rollup-android-arm-eabi": "4.48.0", 1251 - "@rollup/rollup-android-arm64": "4.48.0", 1252 - "@rollup/rollup-darwin-arm64": "4.48.0", 1253 - "@rollup/rollup-darwin-x64": "4.48.0", 1254 - "@rollup/rollup-freebsd-arm64": "4.48.0", 1255 - "@rollup/rollup-freebsd-x64": "4.48.0", 1256 - "@rollup/rollup-linux-arm-gnueabihf": "4.48.0", 1257 - "@rollup/rollup-linux-arm-musleabihf": "4.48.0", 1258 - "@rollup/rollup-linux-arm64-gnu": "4.48.0", 1259 - "@rollup/rollup-linux-arm64-musl": "4.48.0", 1260 - "@rollup/rollup-linux-loongarch64-gnu": "4.48.0", 1261 - "@rollup/rollup-linux-ppc64-gnu": "4.48.0", 1262 - "@rollup/rollup-linux-riscv64-gnu": "4.48.0", 1263 - "@rollup/rollup-linux-riscv64-musl": "4.48.0", 1264 - "@rollup/rollup-linux-s390x-gnu": "4.48.0", 1265 - "@rollup/rollup-linux-x64-gnu": "4.48.0", 1266 - "@rollup/rollup-linux-x64-musl": "4.48.0", 1267 - "@rollup/rollup-win32-arm64-msvc": "4.48.0", 1268 - "@rollup/rollup-win32-ia32-msvc": "4.48.0", 1269 - "@rollup/rollup-win32-x64-msvc": "4.48.0", 1780 + "@rollup/rollup-android-arm-eabi": "4.53.3", 1781 + "@rollup/rollup-android-arm64": "4.53.3", 1782 + "@rollup/rollup-darwin-arm64": "4.53.3", 1783 + "@rollup/rollup-darwin-x64": "4.53.3", 1784 + "@rollup/rollup-freebsd-arm64": "4.53.3", 1785 + "@rollup/rollup-freebsd-x64": "4.53.3", 1786 + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", 1787 + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", 1788 + "@rollup/rollup-linux-arm64-gnu": "4.53.3", 1789 + "@rollup/rollup-linux-arm64-musl": "4.53.3", 1790 + "@rollup/rollup-linux-loong64-gnu": "4.53.3", 1791 + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", 1792 + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", 1793 + "@rollup/rollup-linux-riscv64-musl": "4.53.3", 1794 + "@rollup/rollup-linux-s390x-gnu": "4.53.3", 1795 + "@rollup/rollup-linux-x64-gnu": "4.53.3", 1796 + "@rollup/rollup-linux-x64-musl": "4.53.3", 1797 + "@rollup/rollup-openharmony-arm64": "4.53.3", 1798 + "@rollup/rollup-win32-arm64-msvc": "4.53.3", 1799 + "@rollup/rollup-win32-ia32-msvc": "4.53.3", 1800 + "@rollup/rollup-win32-x64-gnu": "4.53.3", 1801 + "@rollup/rollup-win32-x64-msvc": "4.53.3", 1270 1802 "fsevents": "~2.3.2" 1271 1803 } 1272 1804 }, 1805 + "node_modules/semver": { 1806 + "version": "7.7.2", 1807 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 1808 + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1809 + "dev": true, 1810 + "license": "ISC", 1811 + "bin": { 1812 + "semver": "bin/semver.js" 1813 + }, 1814 + "engines": { 1815 + "node": ">=10" 1816 + } 1817 + }, 1818 + "node_modules/shebang-command": { 1819 + "version": "2.0.0", 1820 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1821 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1822 + "dev": true, 1823 + "license": "MIT", 1824 + "dependencies": { 1825 + "shebang-regex": "^3.0.0" 1826 + }, 1827 + "engines": { 1828 + "node": ">=8" 1829 + } 1830 + }, 1831 + "node_modules/shebang-regex": { 1832 + "version": "3.0.0", 1833 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1834 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1835 + "dev": true, 1836 + "license": "MIT", 1837 + "engines": { 1838 + "node": ">=8" 1839 + } 1840 + }, 1273 1841 "node_modules/siginfo": { 1274 1842 "version": "2.0.0", 1275 1843 "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", ··· 1277 1845 "dev": true, 1278 1846 "license": "ISC" 1279 1847 }, 1848 + "node_modules/signal-exit": { 1849 + "version": "4.1.0", 1850 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1851 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1852 + "dev": true, 1853 + "license": "ISC", 1854 + "engines": { 1855 + "node": ">=14" 1856 + }, 1857 + "funding": { 1858 + "url": "https://github.com/sponsors/isaacs" 1859 + } 1860 + }, 1280 1861 "node_modules/source-map-js": { 1281 1862 "version": "1.2.1", 1282 1863 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ··· 1295 1876 "license": "MIT" 1296 1877 }, 1297 1878 "node_modules/std-env": { 1298 - "version": "3.9.0", 1299 - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", 1300 - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", 1879 + "version": "3.10.0", 1880 + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", 1881 + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", 1882 + "dev": true, 1883 + "license": "MIT" 1884 + }, 1885 + "node_modules/string-width": { 1886 + "version": "5.1.2", 1887 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1888 + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1889 + "dev": true, 1890 + "license": "MIT", 1891 + "dependencies": { 1892 + "eastasianwidth": "^0.2.0", 1893 + "emoji-regex": "^9.2.2", 1894 + "strip-ansi": "^7.0.1" 1895 + }, 1896 + "engines": { 1897 + "node": ">=12" 1898 + }, 1899 + "funding": { 1900 + "url": "https://github.com/sponsors/sindresorhus" 1901 + } 1902 + }, 1903 + "node_modules/string-width-cjs": { 1904 + "name": "string-width", 1905 + "version": "4.2.3", 1906 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1907 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1908 + "dev": true, 1909 + "license": "MIT", 1910 + "dependencies": { 1911 + "emoji-regex": "^8.0.0", 1912 + "is-fullwidth-code-point": "^3.0.0", 1913 + "strip-ansi": "^6.0.1" 1914 + }, 1915 + "engines": { 1916 + "node": ">=8" 1917 + } 1918 + }, 1919 + "node_modules/string-width-cjs/node_modules/ansi-regex": { 1920 + "version": "5.0.1", 1921 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1922 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1923 + "dev": true, 1924 + "license": "MIT", 1925 + "engines": { 1926 + "node": ">=8" 1927 + } 1928 + }, 1929 + "node_modules/string-width-cjs/node_modules/emoji-regex": { 1930 + "version": "8.0.0", 1931 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1932 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1301 1933 "dev": true, 1302 1934 "license": "MIT" 1303 1935 }, 1936 + "node_modules/string-width-cjs/node_modules/strip-ansi": { 1937 + "version": "6.0.1", 1938 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1939 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1940 + "dev": true, 1941 + "license": "MIT", 1942 + "dependencies": { 1943 + "ansi-regex": "^5.0.1" 1944 + }, 1945 + "engines": { 1946 + "node": ">=8" 1947 + } 1948 + }, 1949 + "node_modules/strip-ansi": { 1950 + "version": "7.1.2", 1951 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", 1952 + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", 1953 + "dev": true, 1954 + "license": "MIT", 1955 + "dependencies": { 1956 + "ansi-regex": "^6.0.1" 1957 + }, 1958 + "engines": { 1959 + "node": ">=12" 1960 + }, 1961 + "funding": { 1962 + "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1963 + } 1964 + }, 1965 + "node_modules/strip-ansi-cjs": { 1966 + "name": "strip-ansi", 1967 + "version": "6.0.1", 1968 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1969 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1970 + "dev": true, 1971 + "license": "MIT", 1972 + "dependencies": { 1973 + "ansi-regex": "^5.0.1" 1974 + }, 1975 + "engines": { 1976 + "node": ">=8" 1977 + } 1978 + }, 1979 + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1980 + "version": "5.0.1", 1981 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1982 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1983 + "dev": true, 1984 + "license": "MIT", 1985 + "engines": { 1986 + "node": ">=8" 1987 + } 1988 + }, 1304 1989 "node_modules/strip-literal": { 1305 - "version": "3.0.0", 1306 - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", 1307 - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", 1990 + "version": "3.1.0", 1991 + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", 1992 + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", 1308 1993 "dev": true, 1309 1994 "license": "MIT", 1310 1995 "dependencies": { ··· 1314 1999 "url": "https://github.com/sponsors/antfu" 1315 2000 } 1316 2001 }, 2002 + "node_modules/supports-color": { 2003 + "version": "7.2.0", 2004 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2005 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2006 + "dev": true, 2007 + "license": "MIT", 2008 + "dependencies": { 2009 + "has-flag": "^4.0.0" 2010 + }, 2011 + "engines": { 2012 + "node": ">=8" 2013 + } 2014 + }, 2015 + "node_modules/test-exclude": { 2016 + "version": "7.0.1", 2017 + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", 2018 + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", 2019 + "dev": true, 2020 + "license": "ISC", 2021 + "dependencies": { 2022 + "@istanbuljs/schema": "^0.1.2", 2023 + "glob": "^10.4.1", 2024 + "minimatch": "^9.0.4" 2025 + }, 2026 + "engines": { 2027 + "node": ">=18" 2028 + } 2029 + }, 1317 2030 "node_modules/tinybench": { 1318 2031 "version": "2.9.0", 1319 2032 "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", ··· 1329 2042 "license": "MIT" 1330 2043 }, 1331 2044 "node_modules/tinyglobby": { 1332 - "version": "0.2.14", 1333 - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", 1334 - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 2045 + "version": "0.2.15", 2046 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", 2047 + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 1335 2048 "dev": true, 1336 2049 "license": "MIT", 1337 2050 "dependencies": { 1338 - "fdir": "^6.4.4", 1339 - "picomatch": "^4.0.2" 2051 + "fdir": "^6.5.0", 2052 + "picomatch": "^4.0.3" 1340 2053 }, 1341 2054 "engines": { 1342 2055 "node": ">=12.0.0" ··· 1366 2079 } 1367 2080 }, 1368 2081 "node_modules/tinyspy": { 1369 - "version": "4.0.3", 1370 - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", 1371 - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", 2082 + "version": "4.0.4", 2083 + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", 2084 + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", 1372 2085 "dev": true, 1373 2086 "license": "MIT", 1374 2087 "engines": { 1375 2088 "node": ">=14.0.0" 1376 2089 } 1377 2090 }, 1378 - "node_modules/tr46": { 1379 - "version": "0.0.3", 1380 - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1381 - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 1382 - "license": "MIT" 1383 - }, 1384 2091 "node_modules/typescript": { 1385 - "version": "5.9.2", 1386 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", 1387 - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", 2092 + "version": "5.9.3", 2093 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", 2094 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", 1388 2095 "dev": true, 1389 2096 "license": "Apache-2.0", 1390 2097 "bin": { ··· 1396 2103 } 1397 2104 }, 1398 2105 "node_modules/undici-types": { 1399 - "version": "7.10.0", 1400 - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", 1401 - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", 2106 + "version": "7.16.0", 2107 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", 2108 + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", 1402 2109 "dev": true, 1403 2110 "license": "MIT" 1404 2111 }, 1405 2112 "node_modules/vite": { 1406 - "version": "7.1.3", 1407 - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", 1408 - "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", 2113 + "version": "7.2.6", 2114 + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz", 2115 + "integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==", 1409 2116 "dev": true, 1410 2117 "license": "MIT", 1411 2118 "dependencies": { ··· 1414 2121 "picomatch": "^4.0.3", 1415 2122 "postcss": "^8.5.6", 1416 2123 "rollup": "^4.43.0", 1417 - "tinyglobby": "^0.2.14" 2124 + "tinyglobby": "^0.2.15" 1418 2125 }, 1419 2126 "bin": { 1420 2127 "vite": "bin/vite.js" ··· 1573 2280 } 1574 2281 } 1575 2282 }, 1576 - "node_modules/webidl-conversions": { 1577 - "version": "3.0.1", 1578 - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1579 - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 1580 - "license": "BSD-2-Clause" 1581 - }, 1582 - "node_modules/whatwg-url": { 1583 - "version": "5.0.0", 1584 - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1585 - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1586 - "license": "MIT", 2283 + "node_modules/which": { 2284 + "version": "2.0.2", 2285 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2286 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2287 + "dev": true, 2288 + "license": "ISC", 1587 2289 "dependencies": { 1588 - "tr46": "~0.0.3", 1589 - "webidl-conversions": "^3.0.0" 2290 + "isexe": "^2.0.0" 2291 + }, 2292 + "bin": { 2293 + "node-which": "bin/node-which" 2294 + }, 2295 + "engines": { 2296 + "node": ">= 8" 1590 2297 } 1591 2298 }, 1592 2299 "node_modules/why-is-node-running": { ··· 1601 2308 }, 1602 2309 "bin": { 1603 2310 "why-is-node-running": "cli.js" 2311 + }, 2312 + "engines": { 2313 + "node": ">=8" 2314 + } 2315 + }, 2316 + "node_modules/wrap-ansi": { 2317 + "version": "8.1.0", 2318 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2319 + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2320 + "dev": true, 2321 + "license": "MIT", 2322 + "dependencies": { 2323 + "ansi-styles": "^6.1.0", 2324 + "string-width": "^5.0.1", 2325 + "strip-ansi": "^7.0.1" 2326 + }, 2327 + "engines": { 2328 + "node": ">=12" 2329 + }, 2330 + "funding": { 2331 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2332 + } 2333 + }, 2334 + "node_modules/wrap-ansi-cjs": { 2335 + "name": "wrap-ansi", 2336 + "version": "7.0.0", 2337 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2338 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2339 + "dev": true, 2340 + "license": "MIT", 2341 + "dependencies": { 2342 + "ansi-styles": "^4.0.0", 2343 + "string-width": "^4.1.0", 2344 + "strip-ansi": "^6.0.0" 2345 + }, 2346 + "engines": { 2347 + "node": ">=10" 2348 + }, 2349 + "funding": { 2350 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2351 + } 2352 + }, 2353 + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 2354 + "version": "5.0.1", 2355 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2356 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2357 + "dev": true, 2358 + "license": "MIT", 2359 + "engines": { 2360 + "node": ">=8" 2361 + } 2362 + }, 2363 + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 2364 + "version": "4.3.0", 2365 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2366 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2367 + "dev": true, 2368 + "license": "MIT", 2369 + "dependencies": { 2370 + "color-convert": "^2.0.1" 2371 + }, 2372 + "engines": { 2373 + "node": ">=8" 2374 + }, 2375 + "funding": { 2376 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2377 + } 2378 + }, 2379 + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2380 + "version": "8.0.0", 2381 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2382 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2383 + "dev": true, 2384 + "license": "MIT" 2385 + }, 2386 + "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2387 + "version": "4.2.3", 2388 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2389 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2390 + "dev": true, 2391 + "license": "MIT", 2392 + "dependencies": { 2393 + "emoji-regex": "^8.0.0", 2394 + "is-fullwidth-code-point": "^3.0.0", 2395 + "strip-ansi": "^6.0.1" 2396 + }, 2397 + "engines": { 2398 + "node": ">=8" 2399 + } 2400 + }, 2401 + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 2402 + "version": "6.0.1", 2403 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2404 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2405 + "dev": true, 2406 + "license": "MIT", 2407 + "dependencies": { 2408 + "ansi-regex": "^5.0.1" 1604 2409 }, 1605 2410 "engines": { 1606 2411 "node": ">=8"
+13 -6
package.json
··· 1 1 { 2 2 "name": "morning-report", 3 - "version": "0.0.1", 3 + "version": "0.0.5", 4 4 "description": "Procedurally generates a radio weather report", 5 5 "keywords": [ 6 6 "weather", ··· 19 19 }, 20 20 "type": "module", 21 21 "main": "distribution/index.js", 22 + "bin": { 23 + "morning-report": "./distribution/src/index.js" 24 + }, 25 + "files": [ 26 + "distribution" 27 + ], 22 28 "scripts": { 23 29 "build": "tsc", 24 - "start": "node distribution/index.js", 30 + "start": "node distribution/src/index.js", 25 31 "test": "vitest" 26 32 }, 27 33 "dependencies": { 28 34 "json5": "2.2.3", 29 - "openweathermap-ts": "1.2.10" 35 + "openweather-api-node": "3.1.5" 30 36 }, 31 37 "devDependencies": { 32 - "typescript": "5.9.2", 33 - "@types/node": "24.3.0", 34 - "vitest": "3.2.4" 38 + "typescript": "5.9.3", 39 + "@types/node": "24.10.1", 40 + "vitest": "3.2.4", 41 + "@vitest/coverage-v8": "3.2.4" 35 42 } 36 43 }
+6 -4
src/index.ts
··· 1 + #!/usr/bin/env node 1 2 import path from 'path'; 2 3 import fsp from 'fs/promises'; 3 4 import json5 from 'json5'; 4 5 import Sequencer from './sequencer.js'; 6 + import { Stitcher } from './stitcher.js'; 5 7 import type {Programs, Segments, Sequences} from './sequencer.js'; 6 8 import type { Voices } from './voice.js'; 7 - import type { WeatherConfig } from './weather.js'; 9 + import type { Options } from 'openweather-api-node'; 8 10 9 11 10 12 interface Config { ··· 12 14 segments: Segments, 13 15 sequences: Sequences, 14 16 voices: Voices, 15 - weather: WeatherConfig 17 + weather: Options 16 18 } 17 19 18 20 console.log('morning-report\nCory Sanin 2025\n'); 19 21 20 22 const config: Config = json5.parse(await fsp.readFile(process.env['CONFIG'] || path.join('config', 'config.json5'), { encoding: 'utf-8' })); 21 - const sequence = Sequencer(config); 23 + const sequence = await Sequencer(config); 22 24 console.log(sequence.join('\n')); 23 - 25 + await Stitcher(sequence); 24 26 25 27 export type { Config };
+72 -14
src/sequencer.ts
··· 1 + import { OpenWeatherAPI, type DailyWeather } from 'openweather-api-node'; 2 + import { voiceLines } from './voice.js'; 1 3 import type { Config } from './index.js'; 4 + import type { Voice } from './voice.js'; 5 + import crypto from 'crypto'; 2 6 3 7 type SegmentName = string; 4 8 type SequenceName = string; 5 9 type Programs = SegmentName[][]; 6 10 type Segments = { [segment: SegmentName]: SequenceName[] }; 7 11 type Sequence = { 8 - condition?: string; 12 + conditions?: string[]; 9 13 tracks: string[]; 10 14 } 11 15 type Sequences = { [sequence: SequenceName]: Sequence }; ··· 13 17 let config: Config = null; 14 18 15 19 function selectOne<T>(arr: T[]): T { 16 - return arr[Math.floor(Math.random() * arr.length)]; 20 + return arr[crypto.randomInt(0, arr.length)]; 21 + } 22 + 23 + function resolveSide(side: string, currentWeather: DailyWeather) { 24 + if (!side.startsWith('weather')) { 25 + return side.includes('.') ? parseFloat(side) : parseInt(side); 26 + } 27 + 28 + const tokens = side.split('.'); 29 + let w = currentWeather; 30 + tokens.forEach(t => w = w[t]); 31 + return typeof w === 'object' ? JSON.stringify(w) : w as (string | number); 32 + } 33 + 34 + function notNotANumber(something: number | string, defaultVal: string) { 35 + if (typeof something === 'string' || !isNaN(something)) { 36 + return something; 37 + } 38 + return defaultVal; 17 39 } 18 40 19 - function conditionIsMet(condition: string | undefined = undefined): boolean { 41 + function conditionIsMet(condition: string | undefined, currentWeather: DailyWeather): boolean { 20 42 if (typeof condition !== 'string') { 21 43 return true; 22 44 } 23 - // TODO: parse condition, return bool 24 - return false; 45 + const [lhs, relational, rhs] = condition.split(' '); 46 + if (lhs === undefined || relational === undefined || rhs === undefined) { 47 + throw new Error(`Condition "${condition}" is not in the correct format`); 48 + } 49 + const lhsResolved = notNotANumber(resolveSide(lhs, currentWeather), lhs); 50 + const rhsResolved = notNotANumber(resolveSide(rhs, currentWeather), rhs); 51 + switch (relational) { 52 + case '=': 53 + case '==': 54 + return lhsResolved == rhsResolved; 55 + case '!=': 56 + return lhsResolved != rhsResolved; 57 + case '<': 58 + return lhsResolved < rhsResolved; 59 + case '<=': 60 + return lhsResolved <= rhsResolved; 61 + case '>': 62 + return lhsResolved > rhsResolved; 63 + case '>=': 64 + return lhsResolved >= rhsResolved; 65 + default: 66 + throw new Error(`Unsupported relational operator: ${relational}`); 67 + } 25 68 } 26 69 27 - function processSequence(sequence: Sequence): string[] { 70 + function resolveMacro(str: string, currentWeather: DailyWeather): string[] { 71 + if (str.startsWith('%')) { 72 + const [profile, subject] = str.substring(1).split(' ', 2); 73 + const voiceProfile: Voice = config.voices[profile]; 74 + let resolvedSubject: any = currentWeather; 75 + subject.split('.').forEach(t => resolvedSubject = resolvedSubject[t]); 76 + return voiceLines(voiceProfile, resolvedSubject); 77 + } 78 + return [str]; 79 + } 80 + 81 + function processSequence(sequence: Sequence, currentWeather: DailyWeather): string[] { 28 82 const tracks = sequence.tracks; 29 - // TODO: process voice macros 30 - return tracks; 83 + return tracks.map(t => resolveMacro(t, currentWeather)).flat().filter(t => t !== null); 31 84 } 32 85 33 - function processSegment(segment: SegmentName): string[] { 86 + function processSegment(segment: SegmentName, currentWeather: DailyWeather): string[] { 34 87 if (!(segment in config.segments)) { 35 - return processSequence(config.sequences[segment]); 88 + return (config.sequences[segment].conditions || []).every(c => conditionIsMet(c, currentWeather)) ? processSequence(config.sequences[segment], currentWeather) : []; 36 89 } 37 - const potentialSequences: SequenceName[] = config.segments[segment].filter(s => conditionIsMet(config.sequences[s].condition)); 90 + const potentialSequences: SequenceName[] = config.segments[segment].filter(s => (config.sequences[s].conditions || []).every(c => conditionIsMet(c, currentWeather))); 38 91 if (potentialSequences.length === 0) { 39 92 return []; 40 93 } 41 - return processSequence(config.sequences[selectOne(potentialSequences)]); 94 + return processSequence(config.sequences[selectOne(potentialSequences)], currentWeather); 42 95 } 43 96 44 - function Sequencer(conf: Config): string[] { 97 + async function Sequencer(conf: Config): Promise<string[]> { 45 98 config = conf; 99 + const weather = new OpenWeatherAPI(conf.weather); 100 + const currentWeather = await weather.getToday(); 46 101 const sequence: string[] = []; 47 102 const program: SegmentName[] = selectOne(conf.programs); 48 - program.forEach(segment => sequence.push(...processSegment(segment))); 103 + for (let i = 0; i < program.length; i++) { 104 + const segment = program[i]; 105 + sequence.push(...(processSegment(segment, currentWeather))); 106 + } 49 107 return sequence; 50 108 } 51 109
+34
src/stitcher.ts
··· 1 + import { spawn } from 'child_process'; 2 + 3 + const ENCTOOL = process.env['ENCTOOL'] || 'ffmpeg'; 4 + 5 + function ffmpeg(args: string[], files: number): Promise<void> { 6 + return new Promise((resolve, reject) => { 7 + console.log(`${ENCTOOL} ${args.join(' ')}`); 8 + const process = spawn(ENCTOOL, args); 9 + const to = setTimeout(async () => { 10 + process.kill(); 11 + reject(new Error('timed out')); 12 + }, 5000 * files); 13 + process.on('exit', async (code) => { 14 + clearTimeout(to); 15 + if (code !== 0) { 16 + reject(new Error(`exited with ${code}`)); 17 + } 18 + else { 19 + resolve(); 20 + } 21 + }); 22 + }); 23 + } 24 + 25 + async function Stitcher(files: string[]) { 26 + const args: string[] = []; 27 + files.forEach(f => args.push('-i', f)); 28 + args.push('-filter_complex', `[0:a][1:a][2:a]concat=n=${files.length}:v=0:a=1[out]`); 29 + args.push('-map', '[out]', '-ar', '44100', '-ac', '2', '-c:a', 'pcm_s16le', 'output.wav', '-y'); 30 + await ffmpeg(args, files.length); 31 + } 32 + 33 + export default Stitcher; 34 + export { Stitcher };
-3
src/voice.ts
··· 130 130 const tokens: string[] = []; 131 131 const numGroups = str.split(','); 132 132 const seperators = [LINES.TRILLION, LINES.BILLION, LINES.MILLION, LINES.THOUSAND]; 133 - if (numGroups.length > 5) { 134 - return digitByDigit(str); 135 - } 136 133 seperators.splice(0, seperators.length - numGroups.length + 1); 137 134 numGroups.forEach(g => { 138 135 if (g !== '000') {
-101
src/weather.ts
··· 1 - import OpenWeatherMap from 'openweathermap-ts'; 2 - import type { ThreeHourResponse, CurrentResponse, CountryCode } from 'openweathermap-ts/dist/types/index.js'; 3 - 4 - interface CityName { 5 - cityName: string; 6 - state: string; 7 - countryCode: CountryCode; 8 - } 9 - 10 - interface WeatherConfig { 11 - key: string; 12 - lang?: string; 13 - coordinates?: number[] | string; 14 - zip?: number; 15 - country?: CountryCode; 16 - cityid?: number; 17 - city?: CityName; 18 - } 19 - 20 - type LocationType = 'coordinates' | 'zip' | 'cityid' | 'city' | null; 21 - 22 - function parseCoords(coords: number[] | string): number[] { 23 - if (typeof coords == 'string') { 24 - return coords.replace(/\s/g, '').split(',').map(Number.parseFloat); 25 - } 26 - return coords; 27 - } 28 - 29 - 30 - class Weather { 31 - private openWeather: OpenWeatherMap.default; 32 - private locationType: LocationType; 33 - private current: CurrentResponse; 34 - private threeDay: ThreeHourResponse; 35 - 36 - constructor(options: WeatherConfig) { 37 - this.locationType = this.current = this.threeDay = null; 38 - this.openWeather = new OpenWeatherMap.default({ 39 - apiKey: options.key 40 - }); 41 - if ('city' in options && 'cityName' in options.city && 'state' in options.city && 'countryCode' in options.city) { 42 - this.openWeather.setCityName(options.city); 43 - this.locationType = 'city'; 44 - } 45 - if ('cityid' in options) { 46 - this.openWeather.setCityId(options.cityid); 47 - this.locationType = 'cityid'; 48 - } 49 - if ('zip' in options && 'country' in options) { 50 - this.openWeather.setZipCode(options.zip, options.country) 51 - this.locationType = 'zip'; 52 - } 53 - if ('coordinates' in options) { 54 - const coords = parseCoords(options.coordinates); 55 - if (coords.length >= 2) { 56 - this.openWeather.setGeoCoordinates(coords[0], coords[1]); 57 - this.locationType = 'coordinates'; 58 - } 59 - } 60 - } 61 - 62 - async getCurrentWeather(): Promise<CurrentResponse> { 63 - if (this.current) { 64 - return this.current; 65 - } 66 - switch (this.locationType) { 67 - case 'city': 68 - return this.current = await this.openWeather.getCurrentWeatherByCityName(); 69 - case 'cityid': 70 - return this.current = await this.openWeather.getCurrentWeatherByCityId(); 71 - case 'zip': 72 - return this.current = await this.openWeather.getCurrentWeatherByZipcode(); 73 - case 'coordinates': 74 - return this.current = await this.openWeather.getCurrentWeatherByGeoCoordinates(); 75 - default: 76 - throw new Error(`Can't fetch weather for location type '${this.locationType}'`); 77 - } 78 - } 79 - 80 - async getThreeHourForecast(): Promise<ThreeHourResponse> { 81 - if (this.threeDay) { 82 - return this.threeDay; 83 - } 84 - switch (this.locationType) { 85 - case 'city': 86 - return this.threeDay = await this.openWeather.getThreeHourForecastByCityName(); 87 - case 'cityid': 88 - return this.threeDay = await this.openWeather.getThreeHourForecastByCityId(); 89 - case 'zip': 90 - return this.threeDay = await this.openWeather.getThreeHourForecastByZipcode(); 91 - case 'coordinates': 92 - return this.threeDay = await this.openWeather.getThreeHourForecastByGeoCoordinates(); 93 - default: 94 - throw new Error(`Can't fetch weather for location type '${this.locationType}'`); 95 - } 96 - } 97 - } 98 - 99 - export default Weather; 100 - export { Weather }; 101 - export type { WeatherConfig, CityName };
+189
test/sequencer.test.ts
··· 1 + import { describe, expect, it, vi } from 'vitest'; 2 + import { type Options } from 'openweather-api-node'; 3 + import { Sequencer } from '../src/sequencer.js'; 4 + 5 + const dummyWeather: Options = { key: 'dummy' }; 6 + 7 + vi.mock('openweather-api-node', () => { 8 + return { 9 + OpenWeatherAPI: vi.fn().mockImplementation((_) => { 10 + return { 11 + getToday: vi.fn(() => { 12 + return { 13 + "lat": 43.0748, 14 + "lon": -89.3838, 15 + "dt": "2025-08-29T06:31:05.000Z", 16 + "dtRaw": 1756449065, 17 + "timezoneOffset": -18000, 18 + "astronomical": { 19 + "sunrise": "2025-08-29T11:19:05.000Z", 20 + "sunriseRaw": 1756466345, 21 + "sunset": "2025-08-30T00:38:08.000Z", 22 + "sunsetRaw": 1756514288 23 + }, 24 + "weather": { 25 + "temp": { 26 + "cur": 55.85, 27 + "min": 52.99, 28 + "max": 58.01 29 + }, 30 + "feelsLike": { 31 + "cur": 55.31 32 + }, 33 + "pressure": 1022, 34 + "humidity": 89, 35 + "clouds": 0, 36 + "visibility": 10000, 37 + "wind": { 38 + "deg": 140, 39 + "speed": 5.75 40 + }, 41 + "rain": 0, 42 + "snow": 0, 43 + "conditionId": 800, 44 + "main": "Clear", 45 + "description": "clear sky", 46 + "icon": { 47 + "url": "http://openweathermap.org/img/wn/01n@2x.png", 48 + "raw": "01n" 49 + } 50 + } 51 + } 52 + }) 53 + } 54 + }) 55 + } 56 + }); 57 + 58 + describe('sequencer', () => { 59 + it('can generate a list from a static config', async () => { 60 + expect(await Sequencer({ 61 + programs: [['sequence 1', 'segment 1', 'segment 2']], 62 + segments: { 63 + 'segment 1': ['sequence 1'], 64 + 'segment 2': ['sequence 2'] 65 + }, 66 + sequences: { 67 + 'sequence 1': { 68 + 'tracks': [ 69 + 'seq1.flac' 70 + ] 71 + }, 72 + 'sequence 2': { 73 + 'tracks': [ 74 + 'seq2.flac' 75 + ] 76 + } 77 + }, 78 + voices: {}, 79 + weather: dummyWeather 80 + })).to.include.ordered.members(['seq1.flac', 'seq1.flac', 'seq2.flac']); 81 + }); 82 + 83 + it('can include tracks conditionally', async () => { 84 + expect(await Sequencer({ 85 + programs: [['segment 1', 'sequence 1', 'segment 2', 'sequence 2']], 86 + segments: { 87 + 'segment 1': ['sequence 1'], 88 + 'segment 2': ['sequence 2'] 89 + }, 90 + sequences: { 91 + 'sequence 1': { 92 + 'conditions': ['1 = 1', '1.1 > 1', '2 >= 1', '1 < 2', '1 <= 1', '-1 != 0', undefined], 93 + 'tracks': [ 94 + 'seq1.flac' 95 + ] 96 + }, 97 + 'sequence 2': { 98 + 'conditions': ['weather.lat = -500'], 99 + 'tracks': [ 100 + 'seq2.flac' 101 + ] 102 + } 103 + }, 104 + voices: {}, 105 + weather: dummyWeather 106 + })).to.be.ordered.members(['seq1.flac', 'seq1.flac']); 107 + }); 108 + 109 + it('throws an error on invalid conditions', async () => { 110 + await expect(Sequencer({ 111 + programs: [['sequence 1']], 112 + segments: { 113 + }, 114 + sequences: { 115 + 'sequence 1': { 116 + 'conditions': ['100'], 117 + 'tracks': [ 118 + 'seq1.flac' 119 + ] 120 + } 121 + }, 122 + voices: {}, 123 + weather: dummyWeather 124 + })).rejects.toThrow(/not in the correct format/); 125 + 126 + await expect(Sequencer({ 127 + programs: [['sequence 1']], 128 + segments: { 129 + }, 130 + sequences: { 131 + 'sequence 1': { 132 + 'conditions': ['1 ~ 2'], 133 + 'tracks': [ 134 + 'seq1.flac' 135 + ] 136 + } 137 + }, 138 + voices: {}, 139 + weather: dummyWeather 140 + })).rejects.toThrow(/Unsupported relational operator/); 141 + }); 142 + 143 + it('can stringify conditions', async () => { 144 + expect(await Sequencer({ 145 + programs: [['sequence 1']], 146 + segments: { 147 + }, 148 + sequences: { 149 + 'sequence 1': { 150 + 'conditions': ['weather.feelsLike = {"cur":55.31}'], 151 + 'tracks': [ 152 + 'seq1.flac' 153 + ] 154 + } 155 + }, 156 + voices: {}, 157 + weather: dummyWeather 158 + })).to.be.ordered.members(['seq1.flac']); 159 + }); 160 + 161 + it('can parse voice macros', async () => { 162 + expect(await Sequencer({ 163 + programs: [['sequence 1']], 164 + segments: { 165 + }, 166 + sequences: { 167 + 'sequence 1': { 168 + 'tracks': [ 169 + '%alice weather.temp.max' 170 + ] 171 + } 172 + }, 173 + voices: { 174 + "alice": { 175 + "directory": "alice/", 176 + "extension": "flac" 177 + } 178 + }, 179 + weather: dummyWeather 180 + })).to.be.ordered.members([ 181 + 'alice/fifty.flac', 182 + 'alice/eight.flac', 183 + 'alice/point.flac', 184 + 'alice/zero.flac', 185 + 'alice/one.flac' 186 + ]); 187 + }); 188 + }); 189 +
+90
test/stitcher.test.ts
··· 1 + import { Stitcher } from '../src/stitcher.js'; 2 + import { describe, expect, it, vi, beforeEach } from 'vitest'; 3 + import { EventEmitter } from 'events'; 4 + import { spawn } from 'child_process'; 5 + 6 + const mockChildProcess = new (class MockChildProcess 7 + extends EventEmitter { 8 + kill = vi.fn(() => { 9 + return true; 10 + }); 11 + })(); 12 + 13 + vi.mock('child_process', () => { 14 + return { 15 + spawn: vi.fn(() => mockChildProcess) 16 + } 17 + }); 18 + 19 + describe('stitcher', () => { 20 + 21 + beforeEach(() => { 22 + vi.clearAllMocks(); 23 + }); 24 + 25 + it('passes the correct arguments to ffmpeg', async () => { 26 + const p = Stitcher(['1.flac', 'dir/2.flac']); 27 + mockChildProcess.emit('exit', 0, null); 28 + await p; 29 + expect(spawn).toBeCalledWith('ffmpeg', [ 30 + "-i", 31 + '1.flac', 32 + '-i', 33 + 'dir/2.flac', 34 + '-filter_complex', 35 + '[0:a][1:a][2:a]concat=n=2:v=0:a=1[out]', 36 + '-map', 37 + '[out]', 38 + '-ar', 39 + '44100', 40 + '-ac', 41 + '2', 42 + '-c:a', 43 + 'pcm_s16le', 44 + 'output.wav', 45 + '-y' 46 + ]); 47 + }); 48 + 49 + it('throws an error when ffmpeg fails', async () => { 50 + const p = Stitcher(['sound.mp3']); 51 + mockChildProcess.emit('exit', 1, null); 52 + await expect(p).rejects.toThrow('exited with 1'); 53 + expect(spawn).toBeCalledWith('ffmpeg', [ 54 + "-i", 55 + 'sound.mp3', 56 + '-filter_complex', 57 + '[0:a][1:a][2:a]concat=n=1:v=0:a=1[out]', 58 + '-map', 59 + '[out]', 60 + '-ar', 61 + '44100', 62 + '-ac', 63 + '2', 64 + '-c:a', 65 + 'pcm_s16le', 66 + 'output.wav', 67 + '-y' 68 + ]); 69 + }); 70 + 71 + it('throws an error when ffmpeg takes longer than expected', { timeout: 6000 }, async () => { 72 + await expect(Stitcher(['in.wav'])).rejects.toThrow('timed out'); 73 + expect(spawn).toBeCalledWith('ffmpeg', [ 74 + "-i", 75 + 'in.wav', 76 + '-filter_complex', 77 + '[0:a][1:a][2:a]concat=n=1:v=0:a=1[out]', 78 + '-map', 79 + '[out]', 80 + '-ar', 81 + '44100', 82 + '-ac', 83 + '2', 84 + '-c:a', 85 + 'pcm_s16le', 86 + 'output.wav', 87 + '-y' 88 + ]); 89 + }); 90 + });
+28 -15
test/voice.test.ts
··· 1 - import { assert, describe, expect, it } from 'vitest' 1 + import path from 'path'; 2 + import { describe, expect, it } from 'vitest'; 2 3 import { voiceLines, LINES } from '../src/voice.js'; 3 4 import type { Voice } from '../src/voice.js'; 4 5 ··· 9 10 10 11 describe('voiceLines', () => { 11 12 it('handles integers', () => { 12 - expect(voiceLines(dummyVoice, 16549872)).to.include.ordered.members( 13 + expect(voiceLines(dummyVoice, 16549872)).to.be.ordered.members( 13 14 [ 14 15 LINES.SIX, LINES.TEEN, LINES.MILLION, LINES.FIVE, LINES.HUNDRED, LINES.FORTY, 15 16 LINES.NINE, LINES.THOUSAND, LINES.EIGHT, LINES.HUNDRED, LINES.SEVENTY, LINES.TWO ··· 18 19 }); 19 20 20 21 it('handles floating point', () => { 21 - expect(voiceLines(dummyVoice, 672.09435)).to.include.ordered.members( 22 + expect(voiceLines(dummyVoice, 672.09435)).to.be.ordered.members( 22 23 [ 23 24 LINES.SIX, LINES.HUNDRED, LINES.SEVENTY, LINES.TWO, LINES.POINT, LINES.ZERO, 24 25 LINES.NINE, LINES.FOUR, LINES.THREE, LINES.FIVE ··· 27 28 }); 28 29 29 30 it('handles the negative', () => { 30 - expect(voiceLines(dummyVoice, -672.09435)).to.include.ordered.members( 31 + expect(voiceLines(dummyVoice, -672.09435)).to.be.ordered.members( 31 32 [ 32 33 LINES.NEGATIVE, LINES.SIX, LINES.HUNDRED, LINES.SEVENTY, LINES.TWO, LINES.POINT, LINES.ZERO, 33 34 LINES.NINE, LINES.FOUR, LINES.THREE, LINES.FIVE ··· 36 37 }); 37 38 38 39 it('handles zero', () => { 39 - expect(voiceLines(dummyVoice, 0)).to.include.ordered.members( 40 + expect(voiceLines(dummyVoice, 0)).to.be.ordered.members( 40 41 [ 41 42 LINES.ZERO 42 43 ] ··· 44 45 }); 45 46 46 47 it('handles large numbers with many zeroes', () => { 47 - expect(voiceLines(dummyVoice, 700000000000001)).to.include.ordered.members( 48 + expect(voiceLines(dummyVoice, 700000000000001)).to.be.ordered.members( 48 49 [ 49 50 LINES.SEVEN, LINES.HUNDRED, LINES.TRILLION, LINES.ONE 50 51 ] 51 52 ); 52 53 53 - expect(voiceLines(dummyVoice, 1000001)).to.include.ordered.members( 54 + expect(voiceLines(dummyVoice, 1000001)).to.be.ordered.members( 54 55 [ 55 56 LINES.ONE, LINES.MILLION, LINES.ONE 56 57 ] 57 58 ); 58 59 59 - expect(voiceLines(dummyVoice, 9000000001000)).to.include.ordered.members( 60 + expect(voiceLines(dummyVoice, 9000000001000)).to.be.ordered.members( 60 61 [ 61 62 LINES.NINE, LINES.TRILLION, LINES.ONE, LINES.THOUSAND 62 63 ] 63 64 ); 64 65 65 - expect(voiceLines(dummyVoice, 60002000000000.12)).to.include.ordered.members( 66 + expect(voiceLines(dummyVoice, 60002000000000.12)).to.be.ordered.members( 66 67 [ 67 68 LINES.SIXTY, LINES.TRILLION, LINES.TWO, LINES.BILLION, LINES.POINT, LINES.ONE, LINES.TWO 68 69 ] 69 70 ); 70 71 71 - expect(voiceLines(dummyVoice, 100010001)).to.include.ordered.members( 72 + expect(voiceLines(dummyVoice, 100010001)).to.be.ordered.members( 72 73 [ 73 74 LINES.ONE, LINES.HUNDRED, LINES.MILLION, LINES.TEN, LINES.THOUSAND, LINES.ONE 74 75 ] ··· 76 77 }); 77 78 78 79 it('handles irregularly named numbers', () => { 79 - expect(voiceLines(dummyVoice, 210)).to.include.ordered.members( 80 + expect(voiceLines(dummyVoice, 210)).to.be.ordered.members( 80 81 [ 81 82 LINES.TWO, LINES.HUNDRED, LINES.TEN 82 83 ] 83 84 ); 84 85 85 - expect(voiceLines(dummyVoice, 311)).to.include.ordered.members( 86 + expect(voiceLines(dummyVoice, 311)).to.be.ordered.members( 86 87 [ 87 88 LINES.THREE, LINES.HUNDRED, LINES.ELEVEN 88 89 ] 89 90 ); 90 91 91 - expect(voiceLines(dummyVoice, 412)).to.include.ordered.members( 92 + expect(voiceLines(dummyVoice, 412)).to.be.ordered.members( 92 93 [ 93 94 LINES.FOUR, LINES.HUNDRED, LINES.TWELVE 94 95 ] 95 96 ); 96 97 97 - expect(voiceLines(dummyVoice, 513)).to.include.ordered.members( 98 + expect(voiceLines(dummyVoice, 513)).to.be.ordered.members( 98 99 [ 99 100 LINES.FIVE, LINES.HUNDRED, LINES.THIRTEEN 100 101 ] 101 102 ); 102 103 103 - expect(voiceLines(dummyVoice, 615)).to.include.ordered.members( 104 + expect(voiceLines(dummyVoice, 615)).to.be.ordered.members( 104 105 [ 105 106 LINES.SIX, LINES.HUNDRED, LINES.FIFTEEN 106 107 ] ··· 112 113 expect(voiceLines(dummyVoice, -Infinity)).length.to.be.empty; 113 114 expect(voiceLines(dummyVoice, NaN)).length.to.be.empty; 114 115 expect(voiceLines(dummyVoice, 1e21)).length.to.be.empty; 116 + }); 117 + 118 + it('returns the results as paths when voice configuration is provided', () => { 119 + const directory = path.join('audio', 'voice', 'someone'); 120 + const v: Voice = { 121 + directory, 122 + extension: 'flac' 123 + } 124 + expect(voiceLines(v, 29)).to.be.ordered.members([ 125 + path.join(directory, `twenty.flac`), 126 + path.join(directory, `nine.flac`), 127 + ]); 115 128 }); 116 129 });