+12
-3
.vscode/settings.json
+12
-3
.vscode/settings.json
···
1
1
{
2
2
"[json]": { "editor.defaultFormatter": "dprint.dprint", "editor.formatOnSave": true },
3
3
"[jsonc]": { "editor.defaultFormatter": "dprint.dprint", "editor.formatOnSave": true },
4
-
"[typescript]": { "editor.defaultFormatter": "dprint.dprint", "editor.formatOnSave": true },
5
-
"[typescriptreact]": { "editor.defaultFormatter": "dprint.dprint", "editor.formatOnSave": true },
4
+
"[typescript]": {
5
+
"editor.defaultFormatter": "dprint.dprint",
6
+
"editor.formatOnSave": true,
7
+
"editor.codeActionsOnSave": { "source.fixAll": "always" }
8
+
},
9
+
"[typescriptreact]": {
10
+
"editor.defaultFormatter": "dprint.dprint",
11
+
"editor.formatOnSave": true,
12
+
"editor.codeActionsOnSave": { "source.fixAll": "always" }
13
+
},
6
14
"[javascript]": { "editor.defaultFormatter": "dprint.dprint", "editor.formatOnSave": true },
7
-
"[javascriptreact]": { "editor.defaultFormatter": "dprint.dprint", "editor.formatOnSave": true }
15
+
"[javascriptreact]": { "editor.defaultFormatter": "dprint.dprint", "editor.formatOnSave": true },
16
+
"rust-analyzer.check.command": "clippy"
8
17
}
+959
Cargo.lock
+959
Cargo.lock
···
1
+
# This file is automatically @generated by Cargo.
2
+
# It is not intended for manual editing.
3
+
version = 4
4
+
5
+
[[package]]
6
+
name = "aho-corasick"
7
+
version = "1.1.4"
8
+
source = "registry+https://github.com/rust-lang/crates.io-index"
9
+
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
10
+
dependencies = [
11
+
"memchr",
12
+
]
13
+
14
+
[[package]]
15
+
name = "anstream"
16
+
version = "0.6.21"
17
+
source = "registry+https://github.com/rust-lang/crates.io-index"
18
+
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
19
+
dependencies = [
20
+
"anstyle",
21
+
"anstyle-parse",
22
+
"anstyle-query",
23
+
"anstyle-wincon",
24
+
"colorchoice",
25
+
"is_terminal_polyfill",
26
+
"utf8parse",
27
+
]
28
+
29
+
[[package]]
30
+
name = "anstyle"
31
+
version = "1.0.13"
32
+
source = "registry+https://github.com/rust-lang/crates.io-index"
33
+
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
34
+
35
+
[[package]]
36
+
name = "anstyle-parse"
37
+
version = "0.2.7"
38
+
source = "registry+https://github.com/rust-lang/crates.io-index"
39
+
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
40
+
dependencies = [
41
+
"utf8parse",
42
+
]
43
+
44
+
[[package]]
45
+
name = "anstyle-query"
46
+
version = "1.1.5"
47
+
source = "registry+https://github.com/rust-lang/crates.io-index"
48
+
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
49
+
dependencies = [
50
+
"windows-sys 0.61.2",
51
+
]
52
+
53
+
[[package]]
54
+
name = "anstyle-wincon"
55
+
version = "3.0.11"
56
+
source = "registry+https://github.com/rust-lang/crates.io-index"
57
+
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
58
+
dependencies = [
59
+
"anstyle",
60
+
"once_cell_polyfill",
61
+
"windows-sys 0.61.2",
62
+
]
63
+
64
+
[[package]]
65
+
name = "atomic-waker"
66
+
version = "1.1.2"
67
+
source = "registry+https://github.com/rust-lang/crates.io-index"
68
+
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
69
+
70
+
[[package]]
71
+
name = "axum"
72
+
version = "0.8.8"
73
+
source = "registry+https://github.com/rust-lang/crates.io-index"
74
+
checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8"
75
+
dependencies = [
76
+
"axum-core",
77
+
"bytes",
78
+
"form_urlencoded",
79
+
"futures-util",
80
+
"http",
81
+
"http-body",
82
+
"http-body-util",
83
+
"hyper",
84
+
"hyper-util",
85
+
"itoa",
86
+
"matchit",
87
+
"memchr",
88
+
"mime",
89
+
"percent-encoding",
90
+
"pin-project-lite",
91
+
"serde_core",
92
+
"serde_json",
93
+
"serde_path_to_error",
94
+
"serde_urlencoded",
95
+
"sync_wrapper",
96
+
"tokio",
97
+
"tower",
98
+
"tower-layer",
99
+
"tower-service",
100
+
"tracing",
101
+
]
102
+
103
+
[[package]]
104
+
name = "axum-core"
105
+
version = "0.5.6"
106
+
source = "registry+https://github.com/rust-lang/crates.io-index"
107
+
checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
108
+
dependencies = [
109
+
"bytes",
110
+
"futures-core",
111
+
"http",
112
+
"http-body",
113
+
"http-body-util",
114
+
"mime",
115
+
"pin-project-lite",
116
+
"sync_wrapper",
117
+
"tower-layer",
118
+
"tower-service",
119
+
"tracing",
120
+
]
121
+
122
+
[[package]]
123
+
name = "bitflags"
124
+
version = "2.10.0"
125
+
source = "registry+https://github.com/rust-lang/crates.io-index"
126
+
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
127
+
128
+
[[package]]
129
+
name = "bytes"
130
+
version = "1.11.0"
131
+
source = "registry+https://github.com/rust-lang/crates.io-index"
132
+
checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
133
+
134
+
[[package]]
135
+
name = "cfg-if"
136
+
version = "1.0.4"
137
+
source = "registry+https://github.com/rust-lang/crates.io-index"
138
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
139
+
140
+
[[package]]
141
+
name = "clap"
142
+
version = "4.5.53"
143
+
source = "registry+https://github.com/rust-lang/crates.io-index"
144
+
checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8"
145
+
dependencies = [
146
+
"clap_builder",
147
+
"clap_derive",
148
+
]
149
+
150
+
[[package]]
151
+
name = "clap_builder"
152
+
version = "4.5.53"
153
+
source = "registry+https://github.com/rust-lang/crates.io-index"
154
+
checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
155
+
dependencies = [
156
+
"anstream",
157
+
"anstyle",
158
+
"clap_lex",
159
+
"strsim",
160
+
]
161
+
162
+
[[package]]
163
+
name = "clap_derive"
164
+
version = "4.5.49"
165
+
source = "registry+https://github.com/rust-lang/crates.io-index"
166
+
checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
167
+
dependencies = [
168
+
"heck",
169
+
"proc-macro2",
170
+
"quote",
171
+
"syn",
172
+
]
173
+
174
+
[[package]]
175
+
name = "clap_lex"
176
+
version = "0.7.6"
177
+
source = "registry+https://github.com/rust-lang/crates.io-index"
178
+
checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
179
+
180
+
[[package]]
181
+
name = "colorchoice"
182
+
version = "1.0.4"
183
+
source = "registry+https://github.com/rust-lang/crates.io-index"
184
+
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
185
+
186
+
[[package]]
187
+
name = "errno"
188
+
version = "0.3.14"
189
+
source = "registry+https://github.com/rust-lang/crates.io-index"
190
+
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
191
+
dependencies = [
192
+
"libc",
193
+
"windows-sys 0.61.2",
194
+
]
195
+
196
+
[[package]]
197
+
name = "form_urlencoded"
198
+
version = "1.2.2"
199
+
source = "registry+https://github.com/rust-lang/crates.io-index"
200
+
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
201
+
dependencies = [
202
+
"percent-encoding",
203
+
]
204
+
205
+
[[package]]
206
+
name = "futures-channel"
207
+
version = "0.3.31"
208
+
source = "registry+https://github.com/rust-lang/crates.io-index"
209
+
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
210
+
dependencies = [
211
+
"futures-core",
212
+
]
213
+
214
+
[[package]]
215
+
name = "futures-core"
216
+
version = "0.3.31"
217
+
source = "registry+https://github.com/rust-lang/crates.io-index"
218
+
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
219
+
220
+
[[package]]
221
+
name = "futures-task"
222
+
version = "0.3.31"
223
+
source = "registry+https://github.com/rust-lang/crates.io-index"
224
+
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
225
+
226
+
[[package]]
227
+
name = "futures-util"
228
+
version = "0.3.31"
229
+
source = "registry+https://github.com/rust-lang/crates.io-index"
230
+
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
231
+
dependencies = [
232
+
"futures-core",
233
+
"futures-task",
234
+
"pin-project-lite",
235
+
"pin-utils",
236
+
]
237
+
238
+
[[package]]
239
+
name = "heck"
240
+
version = "0.5.0"
241
+
source = "registry+https://github.com/rust-lang/crates.io-index"
242
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
243
+
244
+
[[package]]
245
+
name = "http"
246
+
version = "1.4.0"
247
+
source = "registry+https://github.com/rust-lang/crates.io-index"
248
+
checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
249
+
dependencies = [
250
+
"bytes",
251
+
"itoa",
252
+
]
253
+
254
+
[[package]]
255
+
name = "http-body"
256
+
version = "1.0.1"
257
+
source = "registry+https://github.com/rust-lang/crates.io-index"
258
+
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
259
+
dependencies = [
260
+
"bytes",
261
+
"http",
262
+
]
263
+
264
+
[[package]]
265
+
name = "http-body-util"
266
+
version = "0.1.3"
267
+
source = "registry+https://github.com/rust-lang/crates.io-index"
268
+
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
269
+
dependencies = [
270
+
"bytes",
271
+
"futures-core",
272
+
"http",
273
+
"http-body",
274
+
"pin-project-lite",
275
+
]
276
+
277
+
[[package]]
278
+
name = "httparse"
279
+
version = "1.10.1"
280
+
source = "registry+https://github.com/rust-lang/crates.io-index"
281
+
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
282
+
283
+
[[package]]
284
+
name = "httpdate"
285
+
version = "1.0.3"
286
+
source = "registry+https://github.com/rust-lang/crates.io-index"
287
+
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
288
+
289
+
[[package]]
290
+
name = "hyper"
291
+
version = "1.8.1"
292
+
source = "registry+https://github.com/rust-lang/crates.io-index"
293
+
checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"
294
+
dependencies = [
295
+
"atomic-waker",
296
+
"bytes",
297
+
"futures-channel",
298
+
"futures-core",
299
+
"http",
300
+
"http-body",
301
+
"httparse",
302
+
"httpdate",
303
+
"itoa",
304
+
"pin-project-lite",
305
+
"pin-utils",
306
+
"smallvec",
307
+
"tokio",
308
+
]
309
+
310
+
[[package]]
311
+
name = "hyper-util"
312
+
version = "0.1.19"
313
+
source = "registry+https://github.com/rust-lang/crates.io-index"
314
+
checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f"
315
+
dependencies = [
316
+
"bytes",
317
+
"futures-core",
318
+
"http",
319
+
"http-body",
320
+
"hyper",
321
+
"pin-project-lite",
322
+
"tokio",
323
+
"tower-service",
324
+
]
325
+
326
+
[[package]]
327
+
name = "is_terminal_polyfill"
328
+
version = "1.70.2"
329
+
source = "registry+https://github.com/rust-lang/crates.io-index"
330
+
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
331
+
332
+
[[package]]
333
+
name = "itoa"
334
+
version = "1.0.17"
335
+
source = "registry+https://github.com/rust-lang/crates.io-index"
336
+
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
337
+
338
+
[[package]]
339
+
name = "lazy_static"
340
+
version = "1.5.0"
341
+
source = "registry+https://github.com/rust-lang/crates.io-index"
342
+
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
343
+
344
+
[[package]]
345
+
name = "libc"
346
+
version = "0.2.178"
347
+
source = "registry+https://github.com/rust-lang/crates.io-index"
348
+
checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091"
349
+
350
+
[[package]]
351
+
name = "lock_api"
352
+
version = "0.4.14"
353
+
source = "registry+https://github.com/rust-lang/crates.io-index"
354
+
checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
355
+
dependencies = [
356
+
"scopeguard",
357
+
]
358
+
359
+
[[package]]
360
+
name = "log"
361
+
version = "0.4.29"
362
+
source = "registry+https://github.com/rust-lang/crates.io-index"
363
+
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
364
+
365
+
[[package]]
366
+
name = "malfestio-cli"
367
+
version = "0.1.0"
368
+
dependencies = [
369
+
"clap",
370
+
"malfestio-core",
371
+
"malfestio-server",
372
+
"tokio",
373
+
]
374
+
375
+
[[package]]
376
+
name = "malfestio-core"
377
+
version = "0.1.0"
378
+
dependencies = [
379
+
"serde",
380
+
"serde_json",
381
+
"thiserror",
382
+
]
383
+
384
+
[[package]]
385
+
name = "malfestio-server"
386
+
version = "0.1.0"
387
+
dependencies = [
388
+
"axum",
389
+
"malfestio-core",
390
+
"serde",
391
+
"serde_json",
392
+
"tokio",
393
+
"tower",
394
+
"tower-http",
395
+
"tracing",
396
+
"tracing-subscriber",
397
+
]
398
+
399
+
[[package]]
400
+
name = "matchers"
401
+
version = "0.2.0"
402
+
source = "registry+https://github.com/rust-lang/crates.io-index"
403
+
checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
404
+
dependencies = [
405
+
"regex-automata",
406
+
]
407
+
408
+
[[package]]
409
+
name = "matchit"
410
+
version = "0.8.4"
411
+
source = "registry+https://github.com/rust-lang/crates.io-index"
412
+
checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
413
+
414
+
[[package]]
415
+
name = "memchr"
416
+
version = "2.7.6"
417
+
source = "registry+https://github.com/rust-lang/crates.io-index"
418
+
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
419
+
420
+
[[package]]
421
+
name = "mime"
422
+
version = "0.3.17"
423
+
source = "registry+https://github.com/rust-lang/crates.io-index"
424
+
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
425
+
426
+
[[package]]
427
+
name = "mio"
428
+
version = "1.1.1"
429
+
source = "registry+https://github.com/rust-lang/crates.io-index"
430
+
checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"
431
+
dependencies = [
432
+
"libc",
433
+
"wasi",
434
+
"windows-sys 0.61.2",
435
+
]
436
+
437
+
[[package]]
438
+
name = "nu-ansi-term"
439
+
version = "0.50.3"
440
+
source = "registry+https://github.com/rust-lang/crates.io-index"
441
+
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
442
+
dependencies = [
443
+
"windows-sys 0.61.2",
444
+
]
445
+
446
+
[[package]]
447
+
name = "once_cell"
448
+
version = "1.21.3"
449
+
source = "registry+https://github.com/rust-lang/crates.io-index"
450
+
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
451
+
452
+
[[package]]
453
+
name = "once_cell_polyfill"
454
+
version = "1.70.2"
455
+
source = "registry+https://github.com/rust-lang/crates.io-index"
456
+
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
457
+
458
+
[[package]]
459
+
name = "parking_lot"
460
+
version = "0.12.5"
461
+
source = "registry+https://github.com/rust-lang/crates.io-index"
462
+
checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
463
+
dependencies = [
464
+
"lock_api",
465
+
"parking_lot_core",
466
+
]
467
+
468
+
[[package]]
469
+
name = "parking_lot_core"
470
+
version = "0.9.12"
471
+
source = "registry+https://github.com/rust-lang/crates.io-index"
472
+
checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
473
+
dependencies = [
474
+
"cfg-if",
475
+
"libc",
476
+
"redox_syscall",
477
+
"smallvec",
478
+
"windows-link",
479
+
]
480
+
481
+
[[package]]
482
+
name = "percent-encoding"
483
+
version = "2.3.2"
484
+
source = "registry+https://github.com/rust-lang/crates.io-index"
485
+
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
486
+
487
+
[[package]]
488
+
name = "pin-project-lite"
489
+
version = "0.2.16"
490
+
source = "registry+https://github.com/rust-lang/crates.io-index"
491
+
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
492
+
493
+
[[package]]
494
+
name = "pin-utils"
495
+
version = "0.1.0"
496
+
source = "registry+https://github.com/rust-lang/crates.io-index"
497
+
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
498
+
499
+
[[package]]
500
+
name = "proc-macro2"
501
+
version = "1.0.104"
502
+
source = "registry+https://github.com/rust-lang/crates.io-index"
503
+
checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0"
504
+
dependencies = [
505
+
"unicode-ident",
506
+
]
507
+
508
+
[[package]]
509
+
name = "quote"
510
+
version = "1.0.42"
511
+
source = "registry+https://github.com/rust-lang/crates.io-index"
512
+
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
513
+
dependencies = [
514
+
"proc-macro2",
515
+
]
516
+
517
+
[[package]]
518
+
name = "redox_syscall"
519
+
version = "0.5.18"
520
+
source = "registry+https://github.com/rust-lang/crates.io-index"
521
+
checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
522
+
dependencies = [
523
+
"bitflags",
524
+
]
525
+
526
+
[[package]]
527
+
name = "regex-automata"
528
+
version = "0.4.13"
529
+
source = "registry+https://github.com/rust-lang/crates.io-index"
530
+
checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
531
+
dependencies = [
532
+
"aho-corasick",
533
+
"memchr",
534
+
"regex-syntax",
535
+
]
536
+
537
+
[[package]]
538
+
name = "regex-syntax"
539
+
version = "0.8.8"
540
+
source = "registry+https://github.com/rust-lang/crates.io-index"
541
+
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
542
+
543
+
[[package]]
544
+
name = "ryu"
545
+
version = "1.0.22"
546
+
source = "registry+https://github.com/rust-lang/crates.io-index"
547
+
checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"
548
+
549
+
[[package]]
550
+
name = "scopeguard"
551
+
version = "1.2.0"
552
+
source = "registry+https://github.com/rust-lang/crates.io-index"
553
+
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
554
+
555
+
[[package]]
556
+
name = "serde"
557
+
version = "1.0.228"
558
+
source = "registry+https://github.com/rust-lang/crates.io-index"
559
+
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
560
+
dependencies = [
561
+
"serde_core",
562
+
"serde_derive",
563
+
]
564
+
565
+
[[package]]
566
+
name = "serde_core"
567
+
version = "1.0.228"
568
+
source = "registry+https://github.com/rust-lang/crates.io-index"
569
+
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
570
+
dependencies = [
571
+
"serde_derive",
572
+
]
573
+
574
+
[[package]]
575
+
name = "serde_derive"
576
+
version = "1.0.228"
577
+
source = "registry+https://github.com/rust-lang/crates.io-index"
578
+
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
579
+
dependencies = [
580
+
"proc-macro2",
581
+
"quote",
582
+
"syn",
583
+
]
584
+
585
+
[[package]]
586
+
name = "serde_json"
587
+
version = "1.0.148"
588
+
source = "registry+https://github.com/rust-lang/crates.io-index"
589
+
checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da"
590
+
dependencies = [
591
+
"itoa",
592
+
"memchr",
593
+
"serde",
594
+
"serde_core",
595
+
"zmij",
596
+
]
597
+
598
+
[[package]]
599
+
name = "serde_path_to_error"
600
+
version = "0.1.20"
601
+
source = "registry+https://github.com/rust-lang/crates.io-index"
602
+
checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
603
+
dependencies = [
604
+
"itoa",
605
+
"serde",
606
+
"serde_core",
607
+
]
608
+
609
+
[[package]]
610
+
name = "serde_urlencoded"
611
+
version = "0.7.1"
612
+
source = "registry+https://github.com/rust-lang/crates.io-index"
613
+
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
614
+
dependencies = [
615
+
"form_urlencoded",
616
+
"itoa",
617
+
"ryu",
618
+
"serde",
619
+
]
620
+
621
+
[[package]]
622
+
name = "sharded-slab"
623
+
version = "0.1.7"
624
+
source = "registry+https://github.com/rust-lang/crates.io-index"
625
+
checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
626
+
dependencies = [
627
+
"lazy_static",
628
+
]
629
+
630
+
[[package]]
631
+
name = "signal-hook-registry"
632
+
version = "1.4.8"
633
+
source = "registry+https://github.com/rust-lang/crates.io-index"
634
+
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
635
+
dependencies = [
636
+
"errno",
637
+
"libc",
638
+
]
639
+
640
+
[[package]]
641
+
name = "smallvec"
642
+
version = "1.15.1"
643
+
source = "registry+https://github.com/rust-lang/crates.io-index"
644
+
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
645
+
646
+
[[package]]
647
+
name = "socket2"
648
+
version = "0.6.1"
649
+
source = "registry+https://github.com/rust-lang/crates.io-index"
650
+
checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
651
+
dependencies = [
652
+
"libc",
653
+
"windows-sys 0.60.2",
654
+
]
655
+
656
+
[[package]]
657
+
name = "strsim"
658
+
version = "0.11.1"
659
+
source = "registry+https://github.com/rust-lang/crates.io-index"
660
+
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
661
+
662
+
[[package]]
663
+
name = "syn"
664
+
version = "2.0.111"
665
+
source = "registry+https://github.com/rust-lang/crates.io-index"
666
+
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
667
+
dependencies = [
668
+
"proc-macro2",
669
+
"quote",
670
+
"unicode-ident",
671
+
]
672
+
673
+
[[package]]
674
+
name = "sync_wrapper"
675
+
version = "1.0.2"
676
+
source = "registry+https://github.com/rust-lang/crates.io-index"
677
+
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
678
+
679
+
[[package]]
680
+
name = "thiserror"
681
+
version = "2.0.17"
682
+
source = "registry+https://github.com/rust-lang/crates.io-index"
683
+
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
684
+
dependencies = [
685
+
"thiserror-impl",
686
+
]
687
+
688
+
[[package]]
689
+
name = "thiserror-impl"
690
+
version = "2.0.17"
691
+
source = "registry+https://github.com/rust-lang/crates.io-index"
692
+
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
693
+
dependencies = [
694
+
"proc-macro2",
695
+
"quote",
696
+
"syn",
697
+
]
698
+
699
+
[[package]]
700
+
name = "thread_local"
701
+
version = "1.1.9"
702
+
source = "registry+https://github.com/rust-lang/crates.io-index"
703
+
checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
704
+
dependencies = [
705
+
"cfg-if",
706
+
]
707
+
708
+
[[package]]
709
+
name = "tokio"
710
+
version = "1.48.0"
711
+
source = "registry+https://github.com/rust-lang/crates.io-index"
712
+
checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408"
713
+
dependencies = [
714
+
"bytes",
715
+
"libc",
716
+
"mio",
717
+
"parking_lot",
718
+
"pin-project-lite",
719
+
"signal-hook-registry",
720
+
"socket2",
721
+
"tokio-macros",
722
+
"windows-sys 0.61.2",
723
+
]
724
+
725
+
[[package]]
726
+
name = "tokio-macros"
727
+
version = "2.6.0"
728
+
source = "registry+https://github.com/rust-lang/crates.io-index"
729
+
checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
730
+
dependencies = [
731
+
"proc-macro2",
732
+
"quote",
733
+
"syn",
734
+
]
735
+
736
+
[[package]]
737
+
name = "tower"
738
+
version = "0.5.2"
739
+
source = "registry+https://github.com/rust-lang/crates.io-index"
740
+
checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
741
+
dependencies = [
742
+
"futures-core",
743
+
"futures-util",
744
+
"pin-project-lite",
745
+
"sync_wrapper",
746
+
"tokio",
747
+
"tower-layer",
748
+
"tower-service",
749
+
"tracing",
750
+
]
751
+
752
+
[[package]]
753
+
name = "tower-http"
754
+
version = "0.6.8"
755
+
source = "registry+https://github.com/rust-lang/crates.io-index"
756
+
checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
757
+
dependencies = [
758
+
"bitflags",
759
+
"bytes",
760
+
"http",
761
+
"http-body",
762
+
"pin-project-lite",
763
+
"tower-layer",
764
+
"tower-service",
765
+
"tracing",
766
+
]
767
+
768
+
[[package]]
769
+
name = "tower-layer"
770
+
version = "0.3.3"
771
+
source = "registry+https://github.com/rust-lang/crates.io-index"
772
+
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
773
+
774
+
[[package]]
775
+
name = "tower-service"
776
+
version = "0.3.3"
777
+
source = "registry+https://github.com/rust-lang/crates.io-index"
778
+
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
779
+
780
+
[[package]]
781
+
name = "tracing"
782
+
version = "0.1.44"
783
+
source = "registry+https://github.com/rust-lang/crates.io-index"
784
+
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
785
+
dependencies = [
786
+
"log",
787
+
"pin-project-lite",
788
+
"tracing-attributes",
789
+
"tracing-core",
790
+
]
791
+
792
+
[[package]]
793
+
name = "tracing-attributes"
794
+
version = "0.1.31"
795
+
source = "registry+https://github.com/rust-lang/crates.io-index"
796
+
checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
797
+
dependencies = [
798
+
"proc-macro2",
799
+
"quote",
800
+
"syn",
801
+
]
802
+
803
+
[[package]]
804
+
name = "tracing-core"
805
+
version = "0.1.36"
806
+
source = "registry+https://github.com/rust-lang/crates.io-index"
807
+
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
808
+
dependencies = [
809
+
"once_cell",
810
+
"valuable",
811
+
]
812
+
813
+
[[package]]
814
+
name = "tracing-log"
815
+
version = "0.2.0"
816
+
source = "registry+https://github.com/rust-lang/crates.io-index"
817
+
checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
818
+
dependencies = [
819
+
"log",
820
+
"once_cell",
821
+
"tracing-core",
822
+
]
823
+
824
+
[[package]]
825
+
name = "tracing-subscriber"
826
+
version = "0.3.22"
827
+
source = "registry+https://github.com/rust-lang/crates.io-index"
828
+
checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e"
829
+
dependencies = [
830
+
"matchers",
831
+
"nu-ansi-term",
832
+
"once_cell",
833
+
"regex-automata",
834
+
"sharded-slab",
835
+
"smallvec",
836
+
"thread_local",
837
+
"tracing",
838
+
"tracing-core",
839
+
"tracing-log",
840
+
]
841
+
842
+
[[package]]
843
+
name = "unicode-ident"
844
+
version = "1.0.22"
845
+
source = "registry+https://github.com/rust-lang/crates.io-index"
846
+
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
847
+
848
+
[[package]]
849
+
name = "utf8parse"
850
+
version = "0.2.2"
851
+
source = "registry+https://github.com/rust-lang/crates.io-index"
852
+
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
853
+
854
+
[[package]]
855
+
name = "valuable"
856
+
version = "0.1.1"
857
+
source = "registry+https://github.com/rust-lang/crates.io-index"
858
+
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
859
+
860
+
[[package]]
861
+
name = "wasi"
862
+
version = "0.11.1+wasi-snapshot-preview1"
863
+
source = "registry+https://github.com/rust-lang/crates.io-index"
864
+
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
865
+
866
+
[[package]]
867
+
name = "windows-link"
868
+
version = "0.2.1"
869
+
source = "registry+https://github.com/rust-lang/crates.io-index"
870
+
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
871
+
872
+
[[package]]
873
+
name = "windows-sys"
874
+
version = "0.60.2"
875
+
source = "registry+https://github.com/rust-lang/crates.io-index"
876
+
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
877
+
dependencies = [
878
+
"windows-targets",
879
+
]
880
+
881
+
[[package]]
882
+
name = "windows-sys"
883
+
version = "0.61.2"
884
+
source = "registry+https://github.com/rust-lang/crates.io-index"
885
+
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
886
+
dependencies = [
887
+
"windows-link",
888
+
]
889
+
890
+
[[package]]
891
+
name = "windows-targets"
892
+
version = "0.53.5"
893
+
source = "registry+https://github.com/rust-lang/crates.io-index"
894
+
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
895
+
dependencies = [
896
+
"windows-link",
897
+
"windows_aarch64_gnullvm",
898
+
"windows_aarch64_msvc",
899
+
"windows_i686_gnu",
900
+
"windows_i686_gnullvm",
901
+
"windows_i686_msvc",
902
+
"windows_x86_64_gnu",
903
+
"windows_x86_64_gnullvm",
904
+
"windows_x86_64_msvc",
905
+
]
906
+
907
+
[[package]]
908
+
name = "windows_aarch64_gnullvm"
909
+
version = "0.53.1"
910
+
source = "registry+https://github.com/rust-lang/crates.io-index"
911
+
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
912
+
913
+
[[package]]
914
+
name = "windows_aarch64_msvc"
915
+
version = "0.53.1"
916
+
source = "registry+https://github.com/rust-lang/crates.io-index"
917
+
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
918
+
919
+
[[package]]
920
+
name = "windows_i686_gnu"
921
+
version = "0.53.1"
922
+
source = "registry+https://github.com/rust-lang/crates.io-index"
923
+
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
924
+
925
+
[[package]]
926
+
name = "windows_i686_gnullvm"
927
+
version = "0.53.1"
928
+
source = "registry+https://github.com/rust-lang/crates.io-index"
929
+
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
930
+
931
+
[[package]]
932
+
name = "windows_i686_msvc"
933
+
version = "0.53.1"
934
+
source = "registry+https://github.com/rust-lang/crates.io-index"
935
+
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
936
+
937
+
[[package]]
938
+
name = "windows_x86_64_gnu"
939
+
version = "0.53.1"
940
+
source = "registry+https://github.com/rust-lang/crates.io-index"
941
+
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
942
+
943
+
[[package]]
944
+
name = "windows_x86_64_gnullvm"
945
+
version = "0.53.1"
946
+
source = "registry+https://github.com/rust-lang/crates.io-index"
947
+
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
948
+
949
+
[[package]]
950
+
name = "windows_x86_64_msvc"
951
+
version = "0.53.1"
952
+
source = "registry+https://github.com/rust-lang/crates.io-index"
953
+
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
954
+
955
+
[[package]]
956
+
name = "zmij"
957
+
version = "1.0.0"
958
+
source = "registry+https://github.com/rust-lang/crates.io-index"
959
+
checksum = "e6d6085d62852e35540689d1f97ad663e3971fc19cf5eceab364d62c646ea167"
+35
Cargo.toml
+35
Cargo.toml
···
1
1
[workspace]
2
2
resolver = "2"
3
3
members = ["crates/cli", "crates/core", "crates/server"]
4
+
5
+
[workspace.lints.clippy]
6
+
bool_comparison = "deny"
7
+
duplicate_mod = "deny"
8
+
inconsistent_struct_constructor = "deny"
9
+
invalid_regex = "deny"
10
+
mem_forget = "deny"
11
+
mixed_case_hex_literals = "deny"
12
+
suspicious_arithmetic_impl = "deny"
13
+
uninit_assumed_init = "deny"
14
+
suspicious_else_formatting = "deny"
15
+
suspicious_op_assign_impl = "deny"
16
+
suspicious_to_owned = "deny"
17
+
cmp_owned = "deny"
18
+
cmp_null = "deny"
19
+
manual_map = "deny"
20
+
21
+
too_many_arguments = "warn"
22
+
cognitive_complexity = "warn"
23
+
large_enum_variant = "warn"
24
+
needless_borrow = "warn"
25
+
needless_pass_by_value = "warn"
26
+
redundant_clone = "warn"
27
+
unnecessary_cast = "warn"
28
+
inefficient_to_string = "warn"
29
+
or_fun_call = "warn"
30
+
unnecessary_to_owned = "warn"
31
+
map_clone = "warn"
32
+
flat_map_identity = "warn"
33
+
needless_collect = "warn"
34
+
vec_init_then_push = "warn"
35
+
36
+
len_zero = "allow"
37
+
range_plus_one = "allow"
38
+
manual_range_contains = "allow"
+4
crates/cli/Cargo.toml
+4
crates/cli/Cargo.toml
+29
-2
crates/cli/src/main.rs
+29
-2
crates/cli/src/main.rs
···
1
-
fn main() {
2
-
println!("Hello, world!");
1
+
use clap::{Parser, Subcommand};
2
+
3
+
#[derive(Parser)]
4
+
#[command(name = "malfestio")]
5
+
#[command(author = "Author <author@example.com>")]
6
+
#[command(version = "0.1.0")]
7
+
#[command(about = "Malfestio CLI", long_about = None)]
8
+
struct Cli {
9
+
#[command(subcommand)]
10
+
command: Commands,
11
+
}
12
+
13
+
#[derive(Subcommand)]
14
+
enum Commands {
15
+
/// Start the backend server
16
+
Start,
17
+
}
18
+
19
+
#[tokio::main]
20
+
async fn main() -> malfestio_core::Result<()> {
21
+
let cli = Cli::parse();
22
+
23
+
match &cli.command {
24
+
Commands::Start => {
25
+
malfestio_server::start().await?;
26
+
}
27
+
}
28
+
29
+
Ok(())
3
30
}
+3
crates/core/Cargo.toml
+3
crates/core/Cargo.toml
+25
crates/core/src/error.rs
+25
crates/core/src/error.rs
···
1
+
use thiserror::Error;
2
+
3
+
#[derive(Error, Debug)]
4
+
pub enum Error {
5
+
#[error("IO error: {0}")]
6
+
Io(#[from] std::io::Error),
7
+
8
+
#[error("Serialization error: {0}")]
9
+
Serialization(#[from] serde_json::Error),
10
+
11
+
/// TODO: Replace with database error type
12
+
#[error("Database error: {0}")]
13
+
Database(String),
14
+
15
+
#[error("Not found: {0}")]
16
+
NotFound(String),
17
+
18
+
#[error("Invalid argument: {0}")]
19
+
InvalidArgument(String),
20
+
21
+
#[error("Other: {0}")]
22
+
Other(String),
23
+
}
24
+
25
+
pub type Result<T> = std::result::Result<T, Error>;
+4
-13
crates/core/src/lib.rs
+4
-13
crates/core/src/lib.rs
···
1
-
pub fn add(left: u64, right: u64) -> u64 {
2
-
left + right
3
-
}
1
+
pub mod error;
2
+
pub mod model;
4
3
5
-
#[cfg(test)]
6
-
mod tests {
7
-
use super::*;
8
-
9
-
#[test]
10
-
fn it_works() {
11
-
let result = add(2, 2);
12
-
assert_eq!(result, 4);
13
-
}
14
-
}
4
+
pub use error::{Error, Result};
5
+
pub use model::{Card, Deck, Note};
+22
crates/core/src/model.rs
+22
crates/core/src/model.rs
···
1
+
use serde::{Deserialize, Serialize};
2
+
3
+
#[derive(Debug, Clone, Serialize, Deserialize)]
4
+
pub struct Note {
5
+
pub title: String,
6
+
pub body: String,
7
+
pub tags: Vec<String>,
8
+
}
9
+
10
+
#[derive(Debug, Clone, Serialize, Deserialize)]
11
+
pub struct Card {
12
+
pub front: String,
13
+
pub back: String,
14
+
pub deck_ref: Option<String>,
15
+
}
16
+
17
+
#[derive(Debug, Clone, Serialize, Deserialize)]
18
+
pub struct Deck {
19
+
pub title: String,
20
+
pub description: String,
21
+
pub tags: Vec<String>,
22
+
}
+9
crates/server/Cargo.toml
+9
crates/server/Cargo.toml
···
4
4
edition = "2024"
5
5
6
6
[dependencies]
7
+
axum = "0.8.8"
8
+
malfestio-core = { version = "0.1.0", path = "../core" }
9
+
serde = "1.0.228"
10
+
serde_json = "1.0.148"
11
+
tokio = { version = "1.48.0", features = ["full"] }
12
+
tower = "0.5.2"
13
+
tower-http = { version = "0.6.8", features = ["cors", "trace"] }
14
+
tracing = "0.1.44"
15
+
tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
+51
-9
crates/server/src/lib.rs
+51
-9
crates/server/src/lib.rs
···
1
-
pub fn add(left: u64, right: u64) -> u64 {
2
-
left + right
1
+
use axum::{
2
+
Json, Router,
3
+
http::StatusCode,
4
+
response::{IntoResponse, Response},
5
+
routing::get,
6
+
};
7
+
use serde_json::json;
8
+
use std::net::SocketAddr;
9
+
use tokio::net::TcpListener;
10
+
use tower_http::trace::TraceLayer;
11
+
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
12
+
13
+
pub async fn start() -> malfestio_core::Result<()> {
14
+
tracing_subscriber::registry()
15
+
.with(
16
+
tracing_subscriber::EnvFilter::try_from_default_env()
17
+
.unwrap_or_else(|_| "malfestio_server=debug,tower_http=debug".into()),
18
+
)
19
+
.with(tracing_subscriber::fmt::layer())
20
+
.init();
21
+
22
+
tracing::info!("Starting Malfestio Server...");
23
+
24
+
let app = Router::new()
25
+
.route("/health", get(health_check))
26
+
.layer(TraceLayer::new_for_http());
27
+
let addr = SocketAddr::from(([127, 0, 0, 1], 8080));
28
+
29
+
tracing::info!("Listening on {}", addr);
30
+
31
+
let listener = TcpListener::bind(addr).await.unwrap();
32
+
axum::serve(listener, app).await.unwrap();
33
+
Ok(())
3
34
}
4
35
5
-
#[cfg(test)]
6
-
mod tests {
7
-
use super::*;
36
+
async fn health_check() -> impl IntoResponse {
37
+
Json(json!({ "status": "ok", "version": env!("CARGO_PKG_VERSION") }))
38
+
}
8
39
9
-
#[test]
10
-
fn it_works() {
11
-
let result = add(2, 2);
12
-
assert_eq!(result, 4);
40
+
pub struct AppError(malfestio_core::Error);
41
+
42
+
impl IntoResponse for AppError {
43
+
fn into_response(self) -> Response {
44
+
let (status, error_message) = match &self.0 {
45
+
malfestio_core::Error::NotFound(_) => (StatusCode::NOT_FOUND, self.0.to_string()),
46
+
malfestio_core::Error::InvalidArgument(_) => (StatusCode::BAD_REQUEST, self.0.to_string()),
47
+
_ => (StatusCode::INTERNAL_SERVER_ERROR, "Internal Server Error".to_string()),
48
+
};
49
+
50
+
let body = Json(json!({
51
+
"error": error_message,
52
+
}));
53
+
54
+
(status, body).into_response()
13
55
}
14
56
}
+4
crates/server/src/main.rs
+4
crates/server/src/main.rs
+3
-18
docs/todo.md
+3
-18
docs/todo.md
···
41
41
42
42
- **(Done) Milestone B**: Designed AT Protocol Lexicons for all core types and documented data model mapping + publishing pipeline.
43
43
44
-
### Milestone C - Foundations: Repo, CI, Axum API Skeleton, Solid Shell
45
-
46
-
#### Deliverables
47
-
48
-
- Monorepo layout (crates/server/, web/, lexicons/, crates/cli/, crates/core/)
49
-
- core: domain logic, data models
50
-
- server: axum, postgres, search, eventing, auth (tokio, deadpool-postgres, tokio-postgres)
51
-
- cli: entry point for local dev, PDS sync, Db migrations (clap, owo-colors)
52
-
- web: vite, solidjs app, tailwindcss
53
-
- CI: format/lint/test + schema validation + typegen
54
-
- Axum:
55
-
- health, auth stub, error model, request IDs, structured logging
56
-
- Solid:
57
-
- router shell, auth gate, initial pages + layout system (IBM Carbon inspired design)
58
-
59
-
#### Acceptance
60
-
61
-
- End-to-end "hello world" for create/read deck locally.
44
+
- **(Done) Milestone C**: Foundations: Repo, CI, Axum API Skeleton, Solid Shell.
45
+
- Monorepo layout, CI, Axum/Solid skeletons implemented.
46
+
- Backend running on 8080, Frontend on 3000.
62
47
63
48
### Milestone D - Identity + Permissions + Publishing Model
64
49
+6
rustfmt.toml
+6
rustfmt.toml
+9
web/eslint.config.js
+9
web/eslint.config.js
···
1
+
import js from "@eslint/js";
2
+
import * as tsParser from "@typescript-eslint/parser";
3
+
import solid from "eslint-plugin-solid/configs/typescript";
4
+
5
+
export default [js.configs.recommended, {
6
+
files: ["**/*.{ts,tsx}"],
7
+
...solid,
8
+
languageOptions: { parser: tsParser, parserOptions: { project: "./tsconfig.app.json" } },
9
+
}];
+17
-2
web/package.json
+17
-2
web/package.json
···
3
3
"private": true,
4
4
"version": "0.0.0",
5
5
"type": "module",
6
-
"scripts": { "dev": "vite", "build": "tsc -b && vite build", "preview": "vite preview", "test": "vitest" },
7
-
"dependencies": { "@tailwindcss/vite": "^4.1.18", "solid-js": "^1.9.10", "tailwindcss": "^4.1.18" },
6
+
"scripts": {
7
+
"dev": "vite",
8
+
"build": "tsc -b && vite build",
9
+
"preview": "vite preview",
10
+
"test": "vitest",
11
+
"check": "tsc --noEmit"
12
+
},
13
+
"dependencies": {
14
+
"@solidjs/router": "^0.15.4",
15
+
"@tailwindcss/vite": "^4.1.18",
16
+
"solid-js": "^1.9.10",
17
+
"tailwindcss": "^4.1.18"
18
+
},
8
19
"devDependencies": {
20
+
"@eslint/js": "^9.39.2",
9
21
"@solidjs/testing-library": "^0.8.10",
10
22
"@testing-library/jest-dom": "^6.9.1",
11
23
"@testing-library/user-event": "^14.6.1",
12
24
"@types/node": "^24.10.1",
25
+
"@typescript-eslint/parser": "^8.50.1",
26
+
"eslint": "^9.39.2",
27
+
"eslint-plugin-solid": "^0.14.5",
13
28
"jsdom": "^27.4.0",
14
29
"typescript": "~5.9.3",
15
30
"vite": "npm:rolldown-vite@7.2.5",
+850
-2
web/pnpm-lock.yaml
+850
-2
web/pnpm-lock.yaml
···
11
11
12
12
.:
13
13
dependencies:
14
+
'@solidjs/router':
15
+
specifier: ^0.15.4
16
+
version: 0.15.4(solid-js@1.9.10)
14
17
'@tailwindcss/vite':
15
18
specifier: ^4.1.18
16
19
version: 4.1.18(rolldown-vite@7.2.5(@types/node@24.10.4)(jiti@2.6.1))
···
21
24
specifier: ^4.1.18
22
25
version: 4.1.18
23
26
devDependencies:
27
+
'@eslint/js':
28
+
specifier: ^9.39.2
29
+
version: 9.39.2
24
30
'@solidjs/testing-library':
25
31
specifier: ^0.8.10
26
-
version: 0.8.10(solid-js@1.9.10)
32
+
version: 0.8.10(@solidjs/router@0.15.4(solid-js@1.9.10))(solid-js@1.9.10)
27
33
'@testing-library/jest-dom':
28
34
specifier: ^6.9.1
29
35
version: 6.9.1
···
33
39
'@types/node':
34
40
specifier: ^24.10.1
35
41
version: 24.10.4
42
+
'@typescript-eslint/parser':
43
+
specifier: ^8.50.1
44
+
version: 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
45
+
eslint:
46
+
specifier: ^9.39.2
47
+
version: 9.39.2(jiti@2.6.1)
48
+
eslint-plugin-solid:
49
+
specifier: ^0.14.5
50
+
version: 0.14.5(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
36
51
jsdom:
37
52
specifier: ^27.4.0
38
53
version: 27.4.0
···
192
207
'@emnapi/wasi-threads@1.1.0':
193
208
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
194
209
210
+
'@eslint-community/eslint-utils@4.9.0':
211
+
resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
212
+
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
213
+
peerDependencies:
214
+
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
215
+
216
+
'@eslint-community/regexpp@4.12.2':
217
+
resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
218
+
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
219
+
220
+
'@eslint/config-array@0.21.1':
221
+
resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
222
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
223
+
224
+
'@eslint/config-helpers@0.4.2':
225
+
resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
226
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
227
+
228
+
'@eslint/core@0.17.0':
229
+
resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
230
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
231
+
232
+
'@eslint/eslintrc@3.3.3':
233
+
resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
234
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
235
+
236
+
'@eslint/js@9.39.2':
237
+
resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==}
238
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
239
+
240
+
'@eslint/object-schema@2.1.7':
241
+
resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
242
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
243
+
244
+
'@eslint/plugin-kit@0.4.1':
245
+
resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
246
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
247
+
195
248
'@exodus/bytes@1.6.0':
196
249
resolution: {integrity: sha512-y32mI9627q5LR/L8fLc4YyDRJQOi+jK0D9okzLilAdiU3F9we3zC7Y7CFrR/8vAvUyv7FgBAYcNHtvbmhKCFcw==}
197
250
engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
···
201
254
'@exodus/crypto':
202
255
optional: true
203
256
257
+
'@humanfs/core@0.19.1':
258
+
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
259
+
engines: {node: '>=18.18.0'}
260
+
261
+
'@humanfs/node@0.16.7':
262
+
resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
263
+
engines: {node: '>=18.18.0'}
264
+
265
+
'@humanwhocodes/module-importer@1.0.1':
266
+
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
267
+
engines: {node: '>=12.22'}
268
+
269
+
'@humanwhocodes/retry@0.4.3':
270
+
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
271
+
engines: {node: '>=18.18'}
272
+
204
273
'@jridgewell/gen-mapping@0.3.13':
205
274
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
206
275
···
312
381
313
382
'@rolldown/pluginutils@1.0.0-beta.50':
314
383
resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==}
384
+
385
+
'@solidjs/router@0.15.4':
386
+
resolution: {integrity: sha512-WOpgg9a9T638cR+5FGbFi/IV4l2FpmBs1GpIMSPa0Ce9vyJN7Wts+X2PqMf9IYn0zUj2MlSJtm1gp7/HI/n5TQ==}
387
+
peerDependencies:
388
+
solid-js: ^1.8.6
315
389
316
390
'@solidjs/testing-library@0.8.10':
317
391
resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==}
···
457
531
'@types/estree@1.0.8':
458
532
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
459
533
534
+
'@types/json-schema@7.0.15':
535
+
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
536
+
460
537
'@types/node@24.10.4':
461
538
resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==}
462
539
540
+
'@typescript-eslint/parser@8.50.1':
541
+
resolution: {integrity: sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==}
542
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
543
+
peerDependencies:
544
+
eslint: ^8.57.0 || ^9.0.0
545
+
typescript: '>=4.8.4 <6.0.0'
546
+
547
+
'@typescript-eslint/project-service@8.50.1':
548
+
resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==}
549
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
550
+
peerDependencies:
551
+
typescript: '>=4.8.4 <6.0.0'
552
+
553
+
'@typescript-eslint/scope-manager@8.50.1':
554
+
resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==}
555
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
556
+
557
+
'@typescript-eslint/tsconfig-utils@8.50.1':
558
+
resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==}
559
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
560
+
peerDependencies:
561
+
typescript: '>=4.8.4 <6.0.0'
562
+
563
+
'@typescript-eslint/types@8.50.1':
564
+
resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==}
565
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
566
+
567
+
'@typescript-eslint/typescript-estree@8.50.1':
568
+
resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==}
569
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
570
+
peerDependencies:
571
+
typescript: '>=4.8.4 <6.0.0'
572
+
573
+
'@typescript-eslint/utils@8.50.1':
574
+
resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==}
575
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
576
+
peerDependencies:
577
+
eslint: ^8.57.0 || ^9.0.0
578
+
typescript: '>=4.8.4 <6.0.0'
579
+
580
+
'@typescript-eslint/visitor-keys@8.50.1':
581
+
resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==}
582
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
583
+
463
584
'@vitest/expect@4.0.16':
464
585
resolution: {integrity: sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA==}
465
586
···
489
610
'@vitest/utils@4.0.16':
490
611
resolution: {integrity: sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA==}
491
612
613
+
acorn-jsx@5.3.2:
614
+
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
615
+
peerDependencies:
616
+
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
617
+
618
+
acorn@8.15.0:
619
+
resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
620
+
engines: {node: '>=0.4.0'}
621
+
hasBin: true
622
+
492
623
agent-base@7.1.4:
493
624
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
494
625
engines: {node: '>= 14'}
495
626
627
+
ajv@6.12.6:
628
+
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
629
+
496
630
ansi-regex@5.0.1:
497
631
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
498
632
engines: {node: '>=8'}
499
633
634
+
ansi-styles@4.3.0:
635
+
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
636
+
engines: {node: '>=8'}
637
+
500
638
ansi-styles@5.2.0:
501
639
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
502
640
engines: {node: '>=10'}
503
641
642
+
argparse@2.0.1:
643
+
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
644
+
504
645
aria-query@5.3.0:
505
646
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
506
647
···
526
667
solid-js:
527
668
optional: true
528
669
670
+
balanced-match@1.0.2:
671
+
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
672
+
529
673
baseline-browser-mapping@2.9.11:
530
674
resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
531
675
hasBin: true
···
533
677
bidi-js@1.0.3:
534
678
resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
535
679
680
+
brace-expansion@1.1.12:
681
+
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
682
+
683
+
brace-expansion@2.0.2:
684
+
resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
685
+
536
686
browserslist@4.28.1:
537
687
resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
538
688
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
539
689
hasBin: true
540
690
691
+
callsites@3.1.0:
692
+
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
693
+
engines: {node: '>=6'}
694
+
541
695
caniuse-lite@1.0.30001761:
542
696
resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==}
543
697
···
545
699
resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
546
700
engines: {node: '>=18'}
547
701
702
+
chalk@4.1.2:
703
+
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
704
+
engines: {node: '>=10'}
705
+
706
+
color-convert@2.0.1:
707
+
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
708
+
engines: {node: '>=7.0.0'}
709
+
710
+
color-name@1.1.4:
711
+
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
712
+
713
+
concat-map@0.0.1:
714
+
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
715
+
548
716
convert-source-map@2.0.0:
549
717
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
718
+
719
+
cross-spawn@7.0.6:
720
+
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
721
+
engines: {node: '>= 8'}
550
722
551
723
css-tree@3.1.0:
552
724
resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
···
578
750
decimal.js@10.6.0:
579
751
resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
580
752
753
+
deep-is@0.1.4:
754
+
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
755
+
581
756
dequal@2.0.3:
582
757
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
583
758
engines: {node: '>=6'}
···
610
785
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
611
786
engines: {node: '>=6'}
612
787
788
+
escape-string-regexp@4.0.0:
789
+
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
790
+
engines: {node: '>=10'}
791
+
792
+
eslint-plugin-solid@0.14.5:
793
+
resolution: {integrity: sha512-nfuYK09ah5aJG/oEN6P1qziy1zLgW4PDWe75VNPi4CEFYk1x2AEqwFeQfEPR7gNn0F2jOeqKhx2E+5oNCOBYWQ==}
794
+
engines: {node: '>=18.0.0'}
795
+
peerDependencies:
796
+
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
797
+
typescript: '>=4.8.4'
798
+
799
+
eslint-scope@8.4.0:
800
+
resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
801
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
802
+
803
+
eslint-visitor-keys@3.4.3:
804
+
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
805
+
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
806
+
807
+
eslint-visitor-keys@4.2.1:
808
+
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
809
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
810
+
811
+
eslint@9.39.2:
812
+
resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
813
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
814
+
hasBin: true
815
+
peerDependencies:
816
+
jiti: '*'
817
+
peerDependenciesMeta:
818
+
jiti:
819
+
optional: true
820
+
821
+
espree@10.4.0:
822
+
resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
823
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
824
+
825
+
esquery@1.6.0:
826
+
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
827
+
engines: {node: '>=0.10'}
828
+
829
+
esrecurse@4.3.0:
830
+
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
831
+
engines: {node: '>=4.0'}
832
+
833
+
estraverse@5.3.0:
834
+
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
835
+
engines: {node: '>=4.0'}
836
+
613
837
estree-walker@3.0.3:
614
838
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
615
839
840
+
esutils@2.0.3:
841
+
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
842
+
engines: {node: '>=0.10.0'}
843
+
616
844
expect-type@1.3.0:
617
845
resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
618
846
engines: {node: '>=12.0.0'}
619
847
848
+
fast-deep-equal@3.1.3:
849
+
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
850
+
851
+
fast-json-stable-stringify@2.1.0:
852
+
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
853
+
854
+
fast-levenshtein@2.0.6:
855
+
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
856
+
620
857
fdir@6.5.0:
621
858
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
622
859
engines: {node: '>=12.0.0'}
···
626
863
picomatch:
627
864
optional: true
628
865
866
+
file-entry-cache@8.0.0:
867
+
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
868
+
engines: {node: '>=16.0.0'}
869
+
870
+
find-up@5.0.0:
871
+
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
872
+
engines: {node: '>=10'}
873
+
874
+
flat-cache@4.0.1:
875
+
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
876
+
engines: {node: '>=16'}
877
+
878
+
flatted@3.3.3:
879
+
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
880
+
629
881
fsevents@2.3.3:
630
882
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
631
883
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
···
635
887
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
636
888
engines: {node: '>=6.9.0'}
637
889
890
+
glob-parent@6.0.2:
891
+
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
892
+
engines: {node: '>=10.13.0'}
893
+
894
+
globals@14.0.0:
895
+
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
896
+
engines: {node: '>=18'}
897
+
638
898
graceful-fs@4.2.11:
639
899
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
900
+
901
+
has-flag@4.0.0:
902
+
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
903
+
engines: {node: '>=8'}
640
904
641
905
html-encoding-sniffer@6.0.0:
642
906
resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==}
···
645
909
html-entities@2.3.3:
646
910
resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
647
911
912
+
html-tags@3.3.1:
913
+
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
914
+
engines: {node: '>=8'}
915
+
648
916
http-proxy-agent@7.0.2:
649
917
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
650
918
engines: {node: '>= 14'}
···
653
921
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
654
922
engines: {node: '>= 14'}
655
923
924
+
ignore@5.3.2:
925
+
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
926
+
engines: {node: '>= 4'}
927
+
928
+
import-fresh@3.3.1:
929
+
resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
930
+
engines: {node: '>=6'}
931
+
932
+
imurmurhash@0.1.4:
933
+
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
934
+
engines: {node: '>=0.8.19'}
935
+
656
936
indent-string@4.0.0:
657
937
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
658
938
engines: {node: '>=8'}
659
939
940
+
inline-style-parser@0.2.7:
941
+
resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==}
942
+
943
+
is-extglob@2.1.1:
944
+
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
945
+
engines: {node: '>=0.10.0'}
946
+
947
+
is-glob@4.0.3:
948
+
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
949
+
engines: {node: '>=0.10.0'}
950
+
951
+
is-html@2.0.0:
952
+
resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==}
953
+
engines: {node: '>=8'}
954
+
660
955
is-potential-custom-element-name@1.0.1:
661
956
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
662
957
···
664
959
resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
665
960
engines: {node: '>=12.13'}
666
961
962
+
isexe@2.0.0:
963
+
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
964
+
667
965
jiti@2.6.1:
668
966
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
669
967
hasBin: true
···
671
969
js-tokens@4.0.0:
672
970
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
673
971
972
+
js-yaml@4.1.1:
973
+
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
974
+
hasBin: true
975
+
674
976
jsdom@27.4.0:
675
977
resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==}
676
978
engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
···
685
987
engines: {node: '>=6'}
686
988
hasBin: true
687
989
990
+
json-buffer@3.0.1:
991
+
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
992
+
993
+
json-schema-traverse@0.4.1:
994
+
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
995
+
996
+
json-stable-stringify-without-jsonify@1.0.1:
997
+
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
998
+
688
999
json5@2.2.3:
689
1000
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
690
1001
engines: {node: '>=6'}
691
1002
hasBin: true
692
1003
1004
+
kebab-case@1.0.2:
1005
+
resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==}
1006
+
1007
+
keyv@4.5.4:
1008
+
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1009
+
1010
+
known-css-properties@0.30.0:
1011
+
resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==}
1012
+
1013
+
levn@0.4.1:
1014
+
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1015
+
engines: {node: '>= 0.8.0'}
1016
+
693
1017
lightningcss-android-arm64@1.30.2:
694
1018
resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
695
1019
engines: {node: '>= 12.0.0'}
···
760
1084
resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
761
1085
engines: {node: '>= 12.0.0'}
762
1086
1087
+
locate-path@6.0.0:
1088
+
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1089
+
engines: {node: '>=10'}
1090
+
1091
+
lodash.merge@4.6.2:
1092
+
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1093
+
763
1094
lru-cache@11.2.4:
764
1095
resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==}
765
1096
engines: {node: 20 || >=22}
···
785
1116
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
786
1117
engines: {node: '>=4'}
787
1118
1119
+
minimatch@3.1.2:
1120
+
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1121
+
1122
+
minimatch@9.0.5:
1123
+
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
1124
+
engines: {node: '>=16 || 14 >=14.17'}
1125
+
788
1126
ms@2.1.3:
789
1127
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
790
1128
···
793
1131
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
794
1132
hasBin: true
795
1133
1134
+
natural-compare@1.4.0:
1135
+
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1136
+
796
1137
node-releases@2.0.27:
797
1138
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
798
1139
799
1140
obug@2.1.1:
800
1141
resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
801
1142
1143
+
optionator@0.9.4:
1144
+
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
1145
+
engines: {node: '>= 0.8.0'}
1146
+
1147
+
p-limit@3.1.0:
1148
+
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1149
+
engines: {node: '>=10'}
1150
+
1151
+
p-locate@5.0.0:
1152
+
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1153
+
engines: {node: '>=10'}
1154
+
1155
+
parent-module@1.0.1:
1156
+
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1157
+
engines: {node: '>=6'}
1158
+
802
1159
parse5@7.3.0:
803
1160
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
804
1161
805
1162
parse5@8.0.0:
806
1163
resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==}
807
1164
1165
+
path-exists@4.0.0:
1166
+
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1167
+
engines: {node: '>=8'}
1168
+
1169
+
path-key@3.1.1:
1170
+
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1171
+
engines: {node: '>=8'}
1172
+
808
1173
pathe@2.0.3:
809
1174
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
810
1175
···
819
1184
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
820
1185
engines: {node: ^10 || ^12 || >=14}
821
1186
1187
+
prelude-ls@1.2.1:
1188
+
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1189
+
engines: {node: '>= 0.8.0'}
1190
+
822
1191
pretty-format@27.5.1:
823
1192
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
824
1193
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
···
838
1207
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
839
1208
engines: {node: '>=0.10.0'}
840
1209
1210
+
resolve-from@4.0.0:
1211
+
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1212
+
engines: {node: '>=4'}
1213
+
841
1214
rolldown-vite@7.2.5:
842
1215
resolution: {integrity: sha512-u09tdk/huMiN8xwoiBbig197jKdCamQTtOruSalOzbqGje3jdHiV0njQlAW0YvzoahkirFePNQ4RYlfnRQpXZA==}
843
1216
engines: {node: ^20.19.0 || >=22.12.0}
···
891
1264
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
892
1265
hasBin: true
893
1266
1267
+
semver@7.7.3:
1268
+
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
1269
+
engines: {node: '>=10'}
1270
+
hasBin: true
1271
+
894
1272
seroval-plugins@1.3.3:
895
1273
resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==}
896
1274
engines: {node: '>=10'}
···
901
1279
resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==}
902
1280
engines: {node: '>=10'}
903
1281
1282
+
shebang-command@2.0.0:
1283
+
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1284
+
engines: {node: '>=8'}
1285
+
1286
+
shebang-regex@3.0.0:
1287
+
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1288
+
engines: {node: '>=8'}
1289
+
904
1290
siginfo@2.0.0:
905
1291
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
906
1292
···
924
1310
925
1311
strip-indent@3.0.0:
926
1312
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
1313
+
engines: {node: '>=8'}
1314
+
1315
+
strip-json-comments@3.1.1:
1316
+
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1317
+
engines: {node: '>=8'}
1318
+
1319
+
style-to-object@1.0.14:
1320
+
resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==}
1321
+
1322
+
supports-color@7.2.0:
1323
+
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
927
1324
engines: {node: '>=8'}
928
1325
929
1326
symbol-tree@3.2.4:
···
966
1363
resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
967
1364
engines: {node: '>=20'}
968
1365
1366
+
ts-api-utils@2.2.0:
1367
+
resolution: {integrity: sha512-L6f5oQRAoLU1RwXz0Ab9mxsE7LtxeVB6AIR1lpkZMsOyg/JXeaxBaXa/FVCBZyNr9S9I4wkHrlZTklX+im+WMw==}
1368
+
engines: {node: '>=18.12'}
1369
+
peerDependencies:
1370
+
typescript: '>=4.8.4'
1371
+
969
1372
tslib@2.8.1:
970
1373
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
1374
+
1375
+
type-check@0.4.0:
1376
+
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1377
+
engines: {node: '>= 0.8.0'}
971
1378
972
1379
typescript@5.9.3:
973
1380
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
···
982
1389
hasBin: true
983
1390
peerDependencies:
984
1391
browserslist: '>= 4.21.0'
1392
+
1393
+
uri-js@4.4.1:
1394
+
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
985
1395
986
1396
vite-plugin-solid@2.11.10:
987
1397
resolution: {integrity: sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==}
···
1051
1461
resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==}
1052
1462
engines: {node: '>=20'}
1053
1463
1464
+
which@2.0.2:
1465
+
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1466
+
engines: {node: '>= 8'}
1467
+
hasBin: true
1468
+
1054
1469
why-is-node-running@2.3.0:
1055
1470
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
1056
1471
engines: {node: '>=8'}
1057
1472
hasBin: true
1473
+
1474
+
word-wrap@1.2.5:
1475
+
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1476
+
engines: {node: '>=0.10.0'}
1058
1477
1059
1478
ws@8.18.3:
1060
1479
resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
···
1077
1496
1078
1497
yallist@3.1.1:
1079
1498
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1499
+
1500
+
yocto-queue@0.1.0:
1501
+
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
1502
+
engines: {node: '>=10'}
1080
1503
1081
1504
snapshots:
1082
1505
···
1253
1676
tslib: 2.8.1
1254
1677
optional: true
1255
1678
1679
+
'@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))':
1680
+
dependencies:
1681
+
eslint: 9.39.2(jiti@2.6.1)
1682
+
eslint-visitor-keys: 3.4.3
1683
+
1684
+
'@eslint-community/regexpp@4.12.2': {}
1685
+
1686
+
'@eslint/config-array@0.21.1':
1687
+
dependencies:
1688
+
'@eslint/object-schema': 2.1.7
1689
+
debug: 4.4.3
1690
+
minimatch: 3.1.2
1691
+
transitivePeerDependencies:
1692
+
- supports-color
1693
+
1694
+
'@eslint/config-helpers@0.4.2':
1695
+
dependencies:
1696
+
'@eslint/core': 0.17.0
1697
+
1698
+
'@eslint/core@0.17.0':
1699
+
dependencies:
1700
+
'@types/json-schema': 7.0.15
1701
+
1702
+
'@eslint/eslintrc@3.3.3':
1703
+
dependencies:
1704
+
ajv: 6.12.6
1705
+
debug: 4.4.3
1706
+
espree: 10.4.0
1707
+
globals: 14.0.0
1708
+
ignore: 5.3.2
1709
+
import-fresh: 3.3.1
1710
+
js-yaml: 4.1.1
1711
+
minimatch: 3.1.2
1712
+
strip-json-comments: 3.1.1
1713
+
transitivePeerDependencies:
1714
+
- supports-color
1715
+
1716
+
'@eslint/js@9.39.2': {}
1717
+
1718
+
'@eslint/object-schema@2.1.7': {}
1719
+
1720
+
'@eslint/plugin-kit@0.4.1':
1721
+
dependencies:
1722
+
'@eslint/core': 0.17.0
1723
+
levn: 0.4.1
1724
+
1256
1725
'@exodus/bytes@1.6.0': {}
1257
1726
1727
+
'@humanfs/core@0.19.1': {}
1728
+
1729
+
'@humanfs/node@0.16.7':
1730
+
dependencies:
1731
+
'@humanfs/core': 0.19.1
1732
+
'@humanwhocodes/retry': 0.4.3
1733
+
1734
+
'@humanwhocodes/module-importer@1.0.1': {}
1735
+
1736
+
'@humanwhocodes/retry@0.4.3': {}
1737
+
1258
1738
'@jridgewell/gen-mapping@0.3.13':
1259
1739
dependencies:
1260
1740
'@jridgewell/sourcemap-codec': 1.5.5
···
1331
1811
1332
1812
'@rolldown/pluginutils@1.0.0-beta.50': {}
1333
1813
1334
-
'@solidjs/testing-library@0.8.10(solid-js@1.9.10)':
1814
+
'@solidjs/router@0.15.4(solid-js@1.9.10)':
1815
+
dependencies:
1816
+
solid-js: 1.9.10
1817
+
1818
+
'@solidjs/testing-library@0.8.10(@solidjs/router@0.15.4(solid-js@1.9.10))(solid-js@1.9.10)':
1335
1819
dependencies:
1336
1820
'@testing-library/dom': 10.4.1
1337
1821
solid-js: 1.9.10
1822
+
optionalDependencies:
1823
+
'@solidjs/router': 0.15.4(solid-js@1.9.10)
1338
1824
1339
1825
'@standard-schema/spec@1.1.0': {}
1340
1826
···
1467
1953
1468
1954
'@types/estree@1.0.8': {}
1469
1955
1956
+
'@types/json-schema@7.0.15': {}
1957
+
1470
1958
'@types/node@24.10.4':
1471
1959
dependencies:
1472
1960
undici-types: 7.16.0
1473
1961
1962
+
'@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
1963
+
dependencies:
1964
+
'@typescript-eslint/scope-manager': 8.50.1
1965
+
'@typescript-eslint/types': 8.50.1
1966
+
'@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3)
1967
+
'@typescript-eslint/visitor-keys': 8.50.1
1968
+
debug: 4.4.3
1969
+
eslint: 9.39.2(jiti@2.6.1)
1970
+
typescript: 5.9.3
1971
+
transitivePeerDependencies:
1972
+
- supports-color
1973
+
1974
+
'@typescript-eslint/project-service@8.50.1(typescript@5.9.3)':
1975
+
dependencies:
1976
+
'@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3)
1977
+
'@typescript-eslint/types': 8.50.1
1978
+
debug: 4.4.3
1979
+
typescript: 5.9.3
1980
+
transitivePeerDependencies:
1981
+
- supports-color
1982
+
1983
+
'@typescript-eslint/scope-manager@8.50.1':
1984
+
dependencies:
1985
+
'@typescript-eslint/types': 8.50.1
1986
+
'@typescript-eslint/visitor-keys': 8.50.1
1987
+
1988
+
'@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)':
1989
+
dependencies:
1990
+
typescript: 5.9.3
1991
+
1992
+
'@typescript-eslint/types@8.50.1': {}
1993
+
1994
+
'@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)':
1995
+
dependencies:
1996
+
'@typescript-eslint/project-service': 8.50.1(typescript@5.9.3)
1997
+
'@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3)
1998
+
'@typescript-eslint/types': 8.50.1
1999
+
'@typescript-eslint/visitor-keys': 8.50.1
2000
+
debug: 4.4.3
2001
+
minimatch: 9.0.5
2002
+
semver: 7.7.3
2003
+
tinyglobby: 0.2.15
2004
+
ts-api-utils: 2.2.0(typescript@5.9.3)
2005
+
typescript: 5.9.3
2006
+
transitivePeerDependencies:
2007
+
- supports-color
2008
+
2009
+
'@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
2010
+
dependencies:
2011
+
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1))
2012
+
'@typescript-eslint/scope-manager': 8.50.1
2013
+
'@typescript-eslint/types': 8.50.1
2014
+
'@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3)
2015
+
eslint: 9.39.2(jiti@2.6.1)
2016
+
typescript: 5.9.3
2017
+
transitivePeerDependencies:
2018
+
- supports-color
2019
+
2020
+
'@typescript-eslint/visitor-keys@8.50.1':
2021
+
dependencies:
2022
+
'@typescript-eslint/types': 8.50.1
2023
+
eslint-visitor-keys: 4.2.1
2024
+
1474
2025
'@vitest/expect@4.0.16':
1475
2026
dependencies:
1476
2027
'@standard-schema/spec': 1.1.0
···
1510
2061
'@vitest/pretty-format': 4.0.16
1511
2062
tinyrainbow: 3.0.3
1512
2063
2064
+
acorn-jsx@5.3.2(acorn@8.15.0):
2065
+
dependencies:
2066
+
acorn: 8.15.0
2067
+
2068
+
acorn@8.15.0: {}
2069
+
1513
2070
agent-base@7.1.4: {}
1514
2071
2072
+
ajv@6.12.6:
2073
+
dependencies:
2074
+
fast-deep-equal: 3.1.3
2075
+
fast-json-stable-stringify: 2.1.0
2076
+
json-schema-traverse: 0.4.1
2077
+
uri-js: 4.4.1
2078
+
1515
2079
ansi-regex@5.0.1: {}
1516
2080
2081
+
ansi-styles@4.3.0:
2082
+
dependencies:
2083
+
color-convert: 2.0.1
2084
+
1517
2085
ansi-styles@5.2.0: {}
1518
2086
2087
+
argparse@2.0.1: {}
2088
+
1519
2089
aria-query@5.3.0:
1520
2090
dependencies:
1521
2091
dequal: 2.0.3
···
1540
2110
optionalDependencies:
1541
2111
solid-js: 1.9.10
1542
2112
2113
+
balanced-match@1.0.2: {}
2114
+
1543
2115
baseline-browser-mapping@2.9.11: {}
1544
2116
1545
2117
bidi-js@1.0.3:
1546
2118
dependencies:
1547
2119
require-from-string: 2.0.2
1548
2120
2121
+
brace-expansion@1.1.12:
2122
+
dependencies:
2123
+
balanced-match: 1.0.2
2124
+
concat-map: 0.0.1
2125
+
2126
+
brace-expansion@2.0.2:
2127
+
dependencies:
2128
+
balanced-match: 1.0.2
2129
+
1549
2130
browserslist@4.28.1:
1550
2131
dependencies:
1551
2132
baseline-browser-mapping: 2.9.11
···
1554
2135
node-releases: 2.0.27
1555
2136
update-browserslist-db: 1.2.3(browserslist@4.28.1)
1556
2137
2138
+
callsites@3.1.0: {}
2139
+
1557
2140
caniuse-lite@1.0.30001761: {}
1558
2141
1559
2142
chai@6.2.2: {}
2143
+
2144
+
chalk@4.1.2:
2145
+
dependencies:
2146
+
ansi-styles: 4.3.0
2147
+
supports-color: 7.2.0
2148
+
2149
+
color-convert@2.0.1:
2150
+
dependencies:
2151
+
color-name: 1.1.4
2152
+
2153
+
color-name@1.1.4: {}
2154
+
2155
+
concat-map@0.0.1: {}
1560
2156
1561
2157
convert-source-map@2.0.0: {}
1562
2158
2159
+
cross-spawn@7.0.6:
2160
+
dependencies:
2161
+
path-key: 3.1.1
2162
+
shebang-command: 2.0.0
2163
+
which: 2.0.2
2164
+
1563
2165
css-tree@3.1.0:
1564
2166
dependencies:
1565
2167
mdn-data: 2.12.2
···
1586
2188
1587
2189
decimal.js@10.6.0: {}
1588
2190
2191
+
deep-is@0.1.4: {}
2192
+
1589
2193
dequal@2.0.3: {}
1590
2194
1591
2195
detect-libc@2.1.2: {}
···
1607
2211
1608
2212
escalade@3.2.0: {}
1609
2213
2214
+
escape-string-regexp@4.0.0: {}
2215
+
2216
+
eslint-plugin-solid@0.14.5(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
2217
+
dependencies:
2218
+
'@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
2219
+
eslint: 9.39.2(jiti@2.6.1)
2220
+
estraverse: 5.3.0
2221
+
is-html: 2.0.0
2222
+
kebab-case: 1.0.2
2223
+
known-css-properties: 0.30.0
2224
+
style-to-object: 1.0.14
2225
+
typescript: 5.9.3
2226
+
transitivePeerDependencies:
2227
+
- supports-color
2228
+
2229
+
eslint-scope@8.4.0:
2230
+
dependencies:
2231
+
esrecurse: 4.3.0
2232
+
estraverse: 5.3.0
2233
+
2234
+
eslint-visitor-keys@3.4.3: {}
2235
+
2236
+
eslint-visitor-keys@4.2.1: {}
2237
+
2238
+
eslint@9.39.2(jiti@2.6.1):
2239
+
dependencies:
2240
+
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1))
2241
+
'@eslint-community/regexpp': 4.12.2
2242
+
'@eslint/config-array': 0.21.1
2243
+
'@eslint/config-helpers': 0.4.2
2244
+
'@eslint/core': 0.17.0
2245
+
'@eslint/eslintrc': 3.3.3
2246
+
'@eslint/js': 9.39.2
2247
+
'@eslint/plugin-kit': 0.4.1
2248
+
'@humanfs/node': 0.16.7
2249
+
'@humanwhocodes/module-importer': 1.0.1
2250
+
'@humanwhocodes/retry': 0.4.3
2251
+
'@types/estree': 1.0.8
2252
+
ajv: 6.12.6
2253
+
chalk: 4.1.2
2254
+
cross-spawn: 7.0.6
2255
+
debug: 4.4.3
2256
+
escape-string-regexp: 4.0.0
2257
+
eslint-scope: 8.4.0
2258
+
eslint-visitor-keys: 4.2.1
2259
+
espree: 10.4.0
2260
+
esquery: 1.6.0
2261
+
esutils: 2.0.3
2262
+
fast-deep-equal: 3.1.3
2263
+
file-entry-cache: 8.0.0
2264
+
find-up: 5.0.0
2265
+
glob-parent: 6.0.2
2266
+
ignore: 5.3.2
2267
+
imurmurhash: 0.1.4
2268
+
is-glob: 4.0.3
2269
+
json-stable-stringify-without-jsonify: 1.0.1
2270
+
lodash.merge: 4.6.2
2271
+
minimatch: 3.1.2
2272
+
natural-compare: 1.4.0
2273
+
optionator: 0.9.4
2274
+
optionalDependencies:
2275
+
jiti: 2.6.1
2276
+
transitivePeerDependencies:
2277
+
- supports-color
2278
+
2279
+
espree@10.4.0:
2280
+
dependencies:
2281
+
acorn: 8.15.0
2282
+
acorn-jsx: 5.3.2(acorn@8.15.0)
2283
+
eslint-visitor-keys: 4.2.1
2284
+
2285
+
esquery@1.6.0:
2286
+
dependencies:
2287
+
estraverse: 5.3.0
2288
+
2289
+
esrecurse@4.3.0:
2290
+
dependencies:
2291
+
estraverse: 5.3.0
2292
+
2293
+
estraverse@5.3.0: {}
2294
+
1610
2295
estree-walker@3.0.3:
1611
2296
dependencies:
1612
2297
'@types/estree': 1.0.8
1613
2298
2299
+
esutils@2.0.3: {}
2300
+
1614
2301
expect-type@1.3.0: {}
1615
2302
2303
+
fast-deep-equal@3.1.3: {}
2304
+
2305
+
fast-json-stable-stringify@2.1.0: {}
2306
+
2307
+
fast-levenshtein@2.0.6: {}
2308
+
1616
2309
fdir@6.5.0(picomatch@4.0.3):
1617
2310
optionalDependencies:
1618
2311
picomatch: 4.0.3
1619
2312
2313
+
file-entry-cache@8.0.0:
2314
+
dependencies:
2315
+
flat-cache: 4.0.1
2316
+
2317
+
find-up@5.0.0:
2318
+
dependencies:
2319
+
locate-path: 6.0.0
2320
+
path-exists: 4.0.0
2321
+
2322
+
flat-cache@4.0.1:
2323
+
dependencies:
2324
+
flatted: 3.3.3
2325
+
keyv: 4.5.4
2326
+
2327
+
flatted@3.3.3: {}
2328
+
1620
2329
fsevents@2.3.3:
1621
2330
optional: true
1622
2331
1623
2332
gensync@1.0.0-beta.2: {}
1624
2333
2334
+
glob-parent@6.0.2:
2335
+
dependencies:
2336
+
is-glob: 4.0.3
2337
+
2338
+
globals@14.0.0: {}
2339
+
1625
2340
graceful-fs@4.2.11: {}
1626
2341
2342
+
has-flag@4.0.0: {}
2343
+
1627
2344
html-encoding-sniffer@6.0.0:
1628
2345
dependencies:
1629
2346
'@exodus/bytes': 1.6.0
···
1631
2348
- '@exodus/crypto'
1632
2349
1633
2350
html-entities@2.3.3: {}
2351
+
2352
+
html-tags@3.3.1: {}
1634
2353
1635
2354
http-proxy-agent@7.0.2:
1636
2355
dependencies:
···
1646
2365
transitivePeerDependencies:
1647
2366
- supports-color
1648
2367
2368
+
ignore@5.3.2: {}
2369
+
2370
+
import-fresh@3.3.1:
2371
+
dependencies:
2372
+
parent-module: 1.0.1
2373
+
resolve-from: 4.0.0
2374
+
2375
+
imurmurhash@0.1.4: {}
2376
+
1649
2377
indent-string@4.0.0: {}
1650
2378
2379
+
inline-style-parser@0.2.7: {}
2380
+
2381
+
is-extglob@2.1.1: {}
2382
+
2383
+
is-glob@4.0.3:
2384
+
dependencies:
2385
+
is-extglob: 2.1.1
2386
+
2387
+
is-html@2.0.0:
2388
+
dependencies:
2389
+
html-tags: 3.3.1
2390
+
1651
2391
is-potential-custom-element-name@1.0.1: {}
1652
2392
1653
2393
is-what@4.1.16: {}
2394
+
2395
+
isexe@2.0.0: {}
1654
2396
1655
2397
jiti@2.6.1: {}
1656
2398
1657
2399
js-tokens@4.0.0: {}
1658
2400
2401
+
js-yaml@4.1.1:
2402
+
dependencies:
2403
+
argparse: 2.0.1
2404
+
1659
2405
jsdom@27.4.0:
1660
2406
dependencies:
1661
2407
'@acemir/cssom': 0.9.30
···
1686
2432
1687
2433
jsesc@3.1.0: {}
1688
2434
2435
+
json-buffer@3.0.1: {}
2436
+
2437
+
json-schema-traverse@0.4.1: {}
2438
+
2439
+
json-stable-stringify-without-jsonify@1.0.1: {}
2440
+
1689
2441
json5@2.2.3: {}
1690
2442
2443
+
kebab-case@1.0.2: {}
2444
+
2445
+
keyv@4.5.4:
2446
+
dependencies:
2447
+
json-buffer: 3.0.1
2448
+
2449
+
known-css-properties@0.30.0: {}
2450
+
2451
+
levn@0.4.1:
2452
+
dependencies:
2453
+
prelude-ls: 1.2.1
2454
+
type-check: 0.4.0
2455
+
1691
2456
lightningcss-android-arm64@1.30.2:
1692
2457
optional: true
1693
2458
···
1737
2502
lightningcss-win32-arm64-msvc: 1.30.2
1738
2503
lightningcss-win32-x64-msvc: 1.30.2
1739
2504
2505
+
locate-path@6.0.0:
2506
+
dependencies:
2507
+
p-locate: 5.0.0
2508
+
2509
+
lodash.merge@4.6.2: {}
2510
+
1740
2511
lru-cache@11.2.4: {}
1741
2512
1742
2513
lru-cache@5.1.1:
···
1757
2528
1758
2529
min-indent@1.0.1: {}
1759
2530
2531
+
minimatch@3.1.2:
2532
+
dependencies:
2533
+
brace-expansion: 1.1.12
2534
+
2535
+
minimatch@9.0.5:
2536
+
dependencies:
2537
+
brace-expansion: 2.0.2
2538
+
1760
2539
ms@2.1.3: {}
1761
2540
1762
2541
nanoid@3.3.11: {}
1763
2542
2543
+
natural-compare@1.4.0: {}
2544
+
1764
2545
node-releases@2.0.27: {}
1765
2546
1766
2547
obug@2.1.1: {}
1767
2548
2549
+
optionator@0.9.4:
2550
+
dependencies:
2551
+
deep-is: 0.1.4
2552
+
fast-levenshtein: 2.0.6
2553
+
levn: 0.4.1
2554
+
prelude-ls: 1.2.1
2555
+
type-check: 0.4.0
2556
+
word-wrap: 1.2.5
2557
+
2558
+
p-limit@3.1.0:
2559
+
dependencies:
2560
+
yocto-queue: 0.1.0
2561
+
2562
+
p-locate@5.0.0:
2563
+
dependencies:
2564
+
p-limit: 3.1.0
2565
+
2566
+
parent-module@1.0.1:
2567
+
dependencies:
2568
+
callsites: 3.1.0
2569
+
1768
2570
parse5@7.3.0:
1769
2571
dependencies:
1770
2572
entities: 6.0.1
···
1773
2575
dependencies:
1774
2576
entities: 6.0.1
1775
2577
2578
+
path-exists@4.0.0: {}
2579
+
2580
+
path-key@3.1.1: {}
2581
+
1776
2582
pathe@2.0.3: {}
1777
2583
1778
2584
picocolors@1.1.1: {}
···
1784
2590
nanoid: 3.3.11
1785
2591
picocolors: 1.1.1
1786
2592
source-map-js: 1.2.1
2593
+
2594
+
prelude-ls@1.2.1: {}
1787
2595
1788
2596
pretty-format@27.5.1:
1789
2597
dependencies:
···
1802
2610
1803
2611
require-from-string@2.0.2: {}
1804
2612
2613
+
resolve-from@4.0.0: {}
2614
+
1805
2615
rolldown-vite@7.2.5(@types/node@24.10.4)(jiti@2.6.1):
1806
2616
dependencies:
1807
2617
'@oxc-project/runtime': 0.97.0
···
1842
2652
1843
2653
semver@6.3.1: {}
1844
2654
2655
+
semver@7.7.3: {}
2656
+
1845
2657
seroval-plugins@1.3.3(seroval@1.3.2):
1846
2658
dependencies:
1847
2659
seroval: 1.3.2
1848
2660
1849
2661
seroval@1.3.2: {}
1850
2662
2663
+
shebang-command@2.0.0:
2664
+
dependencies:
2665
+
shebang-regex: 3.0.0
2666
+
2667
+
shebang-regex@3.0.0: {}
2668
+
1851
2669
siginfo@2.0.0: {}
1852
2670
1853
2671
solid-js@1.9.10:
···
1875
2693
dependencies:
1876
2694
min-indent: 1.0.1
1877
2695
2696
+
strip-json-comments@3.1.1: {}
2697
+
2698
+
style-to-object@1.0.14:
2699
+
dependencies:
2700
+
inline-style-parser: 0.2.7
2701
+
2702
+
supports-color@7.2.0:
2703
+
dependencies:
2704
+
has-flag: 4.0.0
2705
+
1878
2706
symbol-tree@3.2.4: {}
1879
2707
1880
2708
tailwindcss@4.1.18: {}
···
1906
2734
dependencies:
1907
2735
punycode: 2.3.1
1908
2736
2737
+
ts-api-utils@2.2.0(typescript@5.9.3):
2738
+
dependencies:
2739
+
typescript: 5.9.3
2740
+
1909
2741
tslib@2.8.1:
1910
2742
optional: true
1911
2743
2744
+
type-check@0.4.0:
2745
+
dependencies:
2746
+
prelude-ls: 1.2.1
2747
+
1912
2748
typescript@5.9.3: {}
1913
2749
1914
2750
undici-types@7.16.0: {}
···
1918
2754
browserslist: 4.28.1
1919
2755
escalade: 3.2.0
1920
2756
picocolors: 1.1.1
2757
+
2758
+
uri-js@4.4.1:
2759
+
dependencies:
2760
+
punycode: 2.3.1
1921
2761
1922
2762
vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(rolldown-vite@7.2.5(@types/node@24.10.4)(jiti@2.6.1))(solid-js@1.9.10):
1923
2763
dependencies:
···
1989
2829
tr46: 6.0.0
1990
2830
webidl-conversions: 8.0.0
1991
2831
2832
+
which@2.0.2:
2833
+
dependencies:
2834
+
isexe: 2.0.0
2835
+
1992
2836
why-is-node-running@2.3.0:
1993
2837
dependencies:
1994
2838
siginfo: 2.0.0
1995
2839
stackback: 0.0.2
1996
2840
2841
+
word-wrap@1.2.5: {}
2842
+
1997
2843
ws@8.18.3: {}
1998
2844
1999
2845
xml-name-validator@5.0.0: {}
···
2001
2847
xmlchars@2.2.0: {}
2002
2848
2003
2849
yallist@3.1.1: {}
2850
+
2851
+
yocto-queue@0.1.0: {}
+10
-5
web/src/App.tsx
+10
-5
web/src/App.tsx
···
1
-
function App() {
1
+
import { Route, Router } from "@solidjs/router";
2
+
import type { Component } from "solid-js";
3
+
import { AppLayout } from "./components/layout/AppLayout";
4
+
import Home from "./pages/Home";
5
+
6
+
const App: Component = () => {
2
7
return (
3
-
<>
4
-
<main>Hello World</main>
5
-
</>
8
+
<Router root={AppLayout}>
9
+
<Route path="/" component={Home} />
10
+
</Router>
6
11
);
7
-
}
12
+
};
8
13
9
14
export default App;
+15
web/src/components/layout/AppLayout.tsx
+15
web/src/components/layout/AppLayout.tsx
···
1
+
import type { Component, JSX } from "solid-js";
2
+
import { Header } from "./Header";
3
+
4
+
interface AppLayoutProps {
5
+
children?: JSX.Element;
6
+
}
7
+
8
+
export const AppLayout: Component<AppLayoutProps> = (props) => {
9
+
return (
10
+
<div class="min-h-screen bg-black text-gray-100 font-sans selection:bg-blue-500/30">
11
+
<Header />
12
+
<main class="container mx-auto px-4 py-8 md:px-6 lg:px-8 max-w-7xl">{props.children}</main>
13
+
</div>
14
+
);
15
+
};
+20
web/src/components/layout/Header.tsx
+20
web/src/components/layout/Header.tsx
···
1
+
import { A } from "@solidjs/router";
2
+
import type { Component } from "solid-js";
3
+
4
+
export const Header: Component = () => {
5
+
return (
6
+
<header class="h-16 border-b border-gray-800 bg-gray-900 flex items-center justify-between px-6 sticky top-0 z-50">
7
+
<div class="flex items-center gap-6">
8
+
<A href="/" class="text-xl font-bold text-white tracking-tight">Malfestio</A>
9
+
<nav class="hidden md:flex items-center gap-4 text-sm font-medium text-gray-400">
10
+
<A href="/decks" activeClass="text-blue-500" class="hover:text-white transition-colors">Decks</A>
11
+
<A href="/review" activeClass="text-blue-500" class="hover:text-white transition-colors">Review</A>
12
+
</nav>
13
+
</div>
14
+
<div class="flex items-center gap-4">
15
+
{/* Placeholder for Auth/User menu */}
16
+
<div class="w-8 h-8 rounded-full bg-gray-700" />
17
+
</div>
18
+
</header>
19
+
);
20
+
};
+34
web/src/components/ui/Button.test.tsx
+34
web/src/components/ui/Button.test.tsx
···
1
+
import { cleanup, fireEvent, render, screen } from "@solidjs/testing-library";
2
+
import { afterEach, describe, expect, it, vi } from "vitest";
3
+
import { Button } from "./Button";
4
+
5
+
describe("Button", () => {
6
+
afterEach(cleanup);
7
+
8
+
it("renders with default props", () => {
9
+
render(() => <Button>Click me</Button>);
10
+
const button = screen.getByRole("button", { name: /click me/i });
11
+
expect(button).toBeInTheDocument();
12
+
});
13
+
14
+
it("renders with correct variant", () => {
15
+
render(() => <Button variant="secondary">Secondary</Button>);
16
+
const button = screen.getByRole("button", { name: /secondary/i });
17
+
expect(button).toHaveClass("bg-gray-800");
18
+
});
19
+
20
+
it("renders with correct size", () => {
21
+
render(() => <Button size="lg">Large</Button>);
22
+
const button = screen.getByRole("button", { name: /large/i });
23
+
expect(button).toHaveClass("px-6 py-3");
24
+
});
25
+
26
+
it("handles click events", () => {
27
+
const handleClick = vi.fn();
28
+
render(() => <Button onClick={handleClick}>Click me</Button>);
29
+
const button = screen.getByRole("button", { name: /click me/i });
30
+
31
+
fireEvent.click(button);
32
+
expect(handleClick).toHaveBeenCalled();
33
+
});
34
+
});
+50
web/src/components/ui/Button.tsx
+50
web/src/components/ui/Button.tsx
···
1
+
import { splitProps } from "solid-js";
2
+
import type { Component, JSX } from "solid-js";
3
+
4
+
interface ButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
5
+
variant?: "primary" | "secondary" | "danger" | "ghost";
6
+
size?: "sm" | "md" | "lg";
7
+
}
8
+
9
+
export const Button: Component<ButtonProps> = (props) => {
10
+
const [local, others] = splitProps(props, ["variant", "size", "class", "children"]);
11
+
12
+
const variantClass = () => {
13
+
switch (local.variant) {
14
+
case "secondary":
15
+
return "bg-gray-800 text-white hover:bg-gray-700";
16
+
case "danger":
17
+
return "bg-red-600 text-white hover:bg-red-500";
18
+
case "ghost":
19
+
return "bg-transparent text-gray-300 hover:bg-gray-800 hover:text-white";
20
+
case "primary":
21
+
default:
22
+
return "bg-blue-600 text-white hover:bg-blue-500";
23
+
}
24
+
};
25
+
26
+
const sizeClass = () => {
27
+
switch (local.size) {
28
+
case "sm":
29
+
return "px-3 py-1.5 text-sm";
30
+
case "lg":
31
+
return "px-6 py-3 text-lg";
32
+
case "md":
33
+
default:
34
+
return "px-4 py-2";
35
+
}
36
+
};
37
+
38
+
return (
39
+
<button
40
+
class={`
41
+
inline-flex items-center justify-center rounded-sm transition-colors duration-200 font-medium focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed
42
+
${variantClass()}
43
+
${sizeClass()}
44
+
${local.class || ""}
45
+
`}
46
+
{...others}>
47
+
{local.children}
48
+
</button>
49
+
);
50
+
};
+23
web/src/components/ui/Card.test.tsx
+23
web/src/components/ui/Card.test.tsx
···
1
+
import { cleanup, render, screen } from "@solidjs/testing-library";
2
+
import { afterEach, describe, expect, it } from "vitest";
3
+
import { Card } from "./Card";
4
+
5
+
describe("Card", () => {
6
+
afterEach(cleanup);
7
+
8
+
it("renders children content", () => {
9
+
render(() => <Card>Test Content</Card>);
10
+
expect(screen.getByText("Test Content")).toBeInTheDocument();
11
+
});
12
+
13
+
it("renders title when provided", () => {
14
+
render(() => <Card title="Card Title">Content</Card>);
15
+
expect(screen.getByText("Card Title")).toBeInTheDocument();
16
+
expect(screen.getByText("Content")).toBeInTheDocument();
17
+
});
18
+
19
+
it("does not render title area if no title provided", () => {
20
+
render(() => <Card>Content</Card>);
21
+
expect(screen.queryByRole("heading")).not.toBeInTheDocument();
22
+
});
23
+
});
+21
web/src/components/ui/Card.tsx
+21
web/src/components/ui/Card.tsx
···
1
+
import { Show, splitProps } from "solid-js";
2
+
import type { Component, JSX } from "solid-js";
3
+
4
+
interface CardProps extends JSX.HTMLAttributes<HTMLDivElement> {
5
+
title?: string;
6
+
}
7
+
8
+
export const Card: Component<CardProps> = (props) => {
9
+
const [local, others] = splitProps(props, ["title", "class", "children"]);
10
+
11
+
return (
12
+
<div class={`bg-gray-900 border border-gray-800 rounded-lg overflow-hidden ${local.class || ""}`} {...others}>
13
+
<Show when={local.title}>
14
+
<div class="px-6 py-4 border-b border-gray-800">
15
+
<h3 class="text-lg font-semibold text-white">{local.title}</h3>
16
+
</div>
17
+
</Show>
18
+
<div class="p-6 text-gray-300">{local.children}</div>
19
+
</div>
20
+
);
21
+
};
+39
web/src/pages/Home.tsx
+39
web/src/pages/Home.tsx
···
1
+
import type { Component } from "solid-js";
2
+
import { Button } from "../components/ui/Button";
3
+
import { Card } from "../components/ui/Card";
4
+
5
+
const Home: Component = () => {
6
+
return (
7
+
<div class="space-y-8">
8
+
<section class="text-center py-16 space-y-6">
9
+
<h1 class="text-5xl font-extrabold tracking-tight text-white sm:text-6xl bg-clip-text text-transparent bg-gradient-to-r from-blue-400 to-emerald-400">
10
+
Learn Together
11
+
</h1>
12
+
<p class="text-xl text-gray-400 max-w-2xl mx-auto">
13
+
Malfestio is a social learning platform built on the AT Protocol.
14
+
</p>
15
+
<div class="flex items-center justify-center gap-4 pt-4">
16
+
<Button size="lg" variant="primary">Get Started</Button>
17
+
<Button size="lg" variant="ghost">Learn More</Button>
18
+
</div>
19
+
</section>
20
+
21
+
<section class="grid grid-cols-1 md:grid-cols-3 gap-6">
22
+
<Card title="Decks">
23
+
<p class="mb-4">Create and manage your flashcard decks. Import from articles and lectures.</p>
24
+
<Button variant="secondary" size="sm">View Decks</Button>
25
+
</Card>
26
+
<Card title="Review">
27
+
<p class="mb-4">Daily review sessions optimized by the SM-2 algorithm to maximize retention.</p>
28
+
<Button variant="secondary" size="sm">Start Review</Button>
29
+
</Card>
30
+
<Card title="Community">
31
+
<p class="mb-4">Discover shared decks and follow other learners in the network.</p>
32
+
<Button variant="secondary" size="sm">Explore</Button>
33
+
</Card>
34
+
</section>
35
+
</div>
36
+
);
37
+
};
38
+
39
+
export default Home;