learn and share notes on atproto (wip) 🦉 malfestio.stormlightlabs.org/
readability solid axum atproto srs

feat: basic web UI, components, routing, and an Axum server.

+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
··· 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
··· 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 4 edition = "2024" 5 5 6 6 [dependencies] 7 + clap = { version = "4.5.53", features = ["derive"] } 8 + malfestio-core = { version = "0.1.0", path = "../core" } 9 + malfestio-server = { version = "0.1.0", path = "../server" } 10 + tokio = { version = "1.48.0", features = ["full"] }
+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
··· 4 4 edition = "2024" 5 5 6 6 [dependencies] 7 + serde = { version = "1.0.228", features = ["derive"] } 8 + serde_json = "1.0.148" 9 + thiserror = "2.0.17"
+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
··· 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
··· 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
··· 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
··· 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
··· 1 + #[tokio::main] 2 + async fn main() -> malfestio_core::Result<()> { 3 + malfestio_server::start().await 4 + }
+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
··· 1 + max_width = 120 2 + fn_params_layout = "Compressed" 3 + single_line_if_else_max_width = 100 4 + single_line_let_else_max_width = 100 5 + use_field_init_shorthand = true 6 + struct_lit_width = 100
+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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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;