+18
-7
.github/workflows/test.yml
+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
+2
.gitignore
+18
.tangled/workflows/audit.yml
+18
.tangled/workflows/audit.yml
+24
.tangled/workflows/test.yml
+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
+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
+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
+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
+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
+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
+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
+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
-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
-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
+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
+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
+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
});