🌿 Collaborative wiki on ATProto lichen.wiki
atproto
14
fork

Configure Feed

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

Add knip and tsgo: Solve errors for these

juprodh eef71395 b39e0bb6

+466 -212
+7
.pre-commit-config.yaml
··· 15 15 pass_filenames: false 16 16 types: [ts] 17 17 18 + - id: knip 19 + name: knip 20 + entry: bun run knip 21 + language: system 22 + pass_filenames: false 23 + types: [ts] 24 + 18 25 - id: test 19 26 name: unit tests 20 27 entry: bun run test:unit
+2
.tangled/workflows/ci.yml
··· 17 17 command: "biome check src/" 18 18 - name: "Type check" 19 19 command: "bun run typecheck" 20 + - name: "Dead code check" 21 + command: "bun run knip" 20 22 - name: "Unit tests" 21 23 command: "bun run test:unit --coverage" 22 24 - name: "Integration tests"
+4 -1
biome.json
··· 15 15 "linter": { 16 16 "enabled": true, 17 17 "rules": { 18 - "recommended": true 18 + "recommended": true, 19 + "complexity": { 20 + "useLiteralKeys": "off" 21 + } 19 22 } 20 23 }, 21 24 "css": {
+239 -8
bun.lock
··· 11 11 "@atproto/oauth-client-node": "^0.1.0", 12 12 "@atproto/sync": "^0.1.40", 13 13 "@codemirror/lang-markdown": "^6.5.0", 14 + "@codemirror/state": "^6.0.0", 14 15 "@elysiajs/static": "^1.4.7", 15 16 "@sindresorhus/slugify": "^3.0.0", 16 17 "codemirror": "^6.0.2", ··· 18 19 "elysia": "^1.4.27", 19 20 "markdown-it": "^14.1.1", 20 21 "sharp": "^0.34.5", 22 + "ws": "^8.0.0", 21 23 }, 22 24 "devDependencies": { 23 25 "@atproto/dev-env": "0.3.213", 24 26 "@biomejs/biome": "^2.4.4", 25 - "@parcel/watcher": "^2.5.6", 26 27 "@tailwindcss/cli": "^4.2.1", 27 28 "@tailwindcss/typography": "^0.5.16", 28 29 "@types/bun": "latest", 29 30 "@types/d3": "^7.4.3", 30 31 "@types/diff-match-patch": "^1.0.36", 31 32 "@types/markdown-it": "^14.1.2", 33 + "@typescript/native-preview": "^7.0.0-dev.20260322.1", 32 34 "better-sqlite3": "12.8.0", 35 + "knip": "^6.0.2", 33 36 "tailwindcss": "^4.2.1", 34 37 }, 35 38 "peerDependencies": { 36 39 "typescript": "^5", 37 40 }, 38 41 }, 42 + }, 43 + "overrides": { 44 + "@atproto-labs/did-resolver/zod": "3.23.8", 45 + "@atproto-labs/fetch/zod": "3.23.8", 46 + "@atproto-labs/handle-resolver/zod": "3.23.8", 47 + "@atproto/api/zod": "3.23.8", 48 + "@atproto/common-web/zod": "3.23.8", 49 + "@atproto/did/zod": "3.23.8", 39 50 }, 40 51 "packages": { 41 52 "@atproto-labs/did-resolver": ["@atproto-labs/did-resolver@0.1.4", "", { "dependencies": { "@atproto-labs/fetch": "0.1.1", "@atproto-labs/pipe": "0.1.0", "@atproto-labs/simple-store": "0.1.1", "@atproto-labs/simple-store-memory": "0.1.1", "@atproto/did": "0.1.2", "zod": "^3.23.8" } }, "sha512-5d+LHScS2ueYsFRjMOC3c1EwM2ui1yBVbBA0yY3MH7aydbljm5D28scsOVuymIhHwPFwcGvZbMON4PVSfpBbbQ=="], ··· 276 287 277 288 "@elysiajs/static": ["@elysiajs/static@1.4.7", "", { "peerDependencies": { "elysia": ">= 1.4.0" } }, "sha512-Go4kIXZ0G3iWfkAld07HmLglqIDMVXdyRKBQK/sVEjtpDdjHNb+rUIje73aDTWpZYg4PEVHUpi9v4AlNEwrQug=="], 278 289 290 + "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], 291 + 279 292 "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], 293 + 294 + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], 280 295 281 296 "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], 282 297 ··· 382 397 383 398 "@marijn/find-cluster-break": ["@marijn/find-cluster-break@1.0.2", "", {}, "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g=="], 384 399 400 + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], 401 + 385 402 "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], 386 403 387 404 "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], 388 405 389 406 "@noble/secp256k1": ["@noble/secp256k1@1.7.2", "", {}, "sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ=="], 390 407 408 + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 409 + 410 + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 411 + 412 + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 413 + 414 + "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.120.0", "", { "os": "android", "cpu": "arm" }, "sha512-WU3qtINx802wOl8RxAF1v0VvmC2O4D9M8Sv486nLeQ7iPHVmncYZrtBhB4SYyX+XZxj2PNnCcN+PW21jHgiOxg=="], 415 + 416 + "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.120.0", "", { "os": "android", "cpu": "arm64" }, "sha512-SEf80EHdhlbjZEgzeWm0ZA/br4GKMenDW3QB/gtyeTV1gStvvZeFi40ioHDZvds2m4Z9J1bUAUL8yn1/+A6iGg=="], 417 + 418 + "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.120.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xVrrbCai8R8CUIBu3CjryutQnEYhZqs1maIqDvtUCFZb8vY33H7uh9mHpL3a0JBIKoBUKjPH8+rzyAeXnS2d6A=="], 419 + 420 + "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.120.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-xyHBbnJ6mydnQUH7MAcafOkkrNzQC6T+LXgDH/3InEq2BWl/g424IMRiJVSpVqGjB+p2bd0h0WRR8iIwzjU7rw=="], 421 + 422 + "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.120.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMnVRllquXUYTeNfFKmxTTEdZ/ix1nLl0ducDzMSREoWYGVIHnOOxoKMWlCOvRr9Wk/HZqo2rh1jeumbPGPV9A=="], 423 + 424 + "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.120.0", "", { "os": "linux", "cpu": "arm" }, "sha512-tkvn2CQ7QdcsMnpfiX3fd3wA3EFsWKYlcQzq9cFw/xc89Al7W6Y4O0FgLVkVQpo0Tnq/qtE1XfkJOnRRA9S/NA=="], 425 + 426 + "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.120.0", "", { "os": "linux", "cpu": "arm" }, "sha512-WN5y135Ic42gQDk9grbwY9++fDhqf8knN6fnP+0WALlAUh4odY/BDK1nfTJRSfpJD9P3r1BwU0m3pW2DU89whQ=="], 427 + 428 + "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.120.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-1GgQBCcXvFMw99EPdMy+4NZ3aYyXsxjf9kbUUg8HuAy3ZBXzOry5KfFEzT9nqmgZI1cuetvApkiJBZLAPo8uaw=="], 429 + 430 + "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.120.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gmMQ70gsPdDBgpcErvJEoWNBr7bJooSLlvOBVBSGfOzlP5NvJ3bFvnUeZZ9d+dPrqSngtonf7nyzWUTUj/U+lw=="], 431 + 432 + "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.120.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-T/kZuU0ajop0xhzVMwH5r3srC9Nqup5HaIo+3uFjIN5uPxa0LvSxC1ZqP4aQGJVW5G0z8/nCkjIfSMS91P/wzw=="], 433 + 434 + "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.120.0", "", { "os": "linux", "cpu": "none" }, "sha512-vn21KXLAXzaI3N5CZWlBr1iWeXLl9QFIMor7S1hUjUGTeUuWCoE6JZB040/ZNDwf+JXPX8Ao9KbmJq9FMC2iGw=="], 435 + 436 + "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.120.0", "", { "os": "linux", "cpu": "none" }, "sha512-SUbUxlar007LTGmSLGIC5x/WJvwhdX+PwNzFJ9f/nOzZOrCFbOT4ikt7pJIRg1tXVsEfzk5mWpGO1NFiSs4PIw=="], 437 + 438 + "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.120.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hYiPJTxyfJY2+lMBFk3p2bo0R9GN+TtpPFlRqVchL1qvLG+pznstramHNvJlw9AjaoRUHwp9IKR7UZQnRPGjgQ=="], 439 + 440 + "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.120.0", "", { "os": "linux", "cpu": "x64" }, "sha512-q+5jSVZkprJCIy3dzJpApat0InJaoxQLsJuD6DkX8hrUS61z2lHQ1Fe9L2+TYbKHXCLWbL0zXe7ovkIdopBGMQ=="], 441 + 442 + "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.120.0", "", { "os": "linux", "cpu": "x64" }, "sha512-D9QDDZNnH24e7X4ftSa6ar/2hCavETfW3uk0zgcMIrZNy459O5deTbWrjGzZiVrSWigGtlQwzs2McBP0QsfV1w=="], 443 + 444 + "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.120.0", "", { "os": "none", "cpu": "arm64" }, "sha512-TBU8ZwOUWAOUWVfmI16CYWbvh4uQb9zHnGBHsw5Cp2JUVG044OIY1CSHODLifqzQIMTXvDvLzcL89GGdUIqNrA=="], 445 + 446 + "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.120.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-WG/FOZgDJCpJnuF3ToG/K28rcOmSY7FmFmfBKYb2fmLyhDzPpUldFGV7/Fz4ru0Iz/v4KPmf8xVgO8N3lO4KHA=="], 447 + 448 + "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.120.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1T0HKGcsz/BKo77t7+89L8Qvu4f9DoleKWHp3C5sJEcbCjDOLx3m9m722bWZTY+hANlUEs+yjlK+lBFsA+vrVQ=="], 449 + 450 + "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.120.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-L7vfLzbOXsjBXV0rv/6Y3Jd9BRjPeCivINZAqrSyAOZN3moCopDN+Psq9ZrGNZtJzP8946MtlRFZ0Als0wBCOw=="], 451 + 452 + "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.120.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ys+upfqNtSu58huAhJMBKl3XCkGzyVFBlMlGPzHeFKgpFF/OdgNs1MMf8oaJIbgMH8ZxgGF7qfue39eJohmKIg=="], 453 + 454 + "@oxc-project/types": ["@oxc-project/types@0.120.0", "", {}, "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg=="], 455 + 456 + "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.19.1", "", { "os": "android", "cpu": "arm" }, "sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg=="], 457 + 458 + "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.19.1", "", { "os": "android", "cpu": "arm64" }, "sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA=="], 459 + 460 + "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.19.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ=="], 461 + 462 + "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.19.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ=="], 463 + 464 + "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.19.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw=="], 465 + 466 + "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A=="], 467 + 468 + "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ=="], 469 + 470 + "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig=="], 471 + 472 + "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew=="], 473 + 474 + "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.19.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ=="], 475 + 476 + "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w=="], 477 + 478 + "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw=="], 479 + 480 + "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.19.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA=="], 481 + 482 + "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ=="], 483 + 484 + "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw=="], 485 + 486 + "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.19.1", "", { "os": "none", "cpu": "arm64" }, "sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA=="], 487 + 488 + "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.19.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg=="], 489 + 490 + "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.19.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ=="], 491 + 492 + "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.19.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA=="], 493 + 494 + "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="], 495 + 391 496 "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], 392 497 393 498 "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="], ··· 582 687 583 688 "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], 584 689 690 + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], 691 + 585 692 "@types/bn.js": ["@types/bn.js@5.2.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q=="], 586 693 587 694 "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="], ··· 664 771 665 772 "@types/node": ["@types/node@25.3.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ=="], 666 773 774 + "@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20260322.1", "", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260322.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260322.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20260322.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260322.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20260322.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260322.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20260322.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-CmzQTKvesYHmz3g92G+XPDis25ocvHqa/gK8m98w+bML99KJLEWQKVlvkLrYA85JiJEK+XBIiz+6lCgUqRkWXA=="], 775 + 776 + "@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20260322.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5wSilxwLGX5fMKJgsUkCBwOfW9GMG3WF5j77CVBOdFI7miFaR3JQaPzTA+uyHDMNIIeSDo1KtV77GT48Y/d0Xg=="], 777 + 778 + "@typescript/native-preview-darwin-x64": ["@typescript/native-preview-darwin-x64@7.0.0-dev.20260322.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-G806SrfxkYNAgZ9Xk53+OvbmIg9iD5hjaiD2QhDQL2aZjzy10D4MhcdaZEOoMfw0OI/PoJPYOiPD+9/x2kw3Lg=="], 779 + 780 + "@typescript/native-preview-linux-arm": ["@typescript/native-preview-linux-arm@7.0.0-dev.20260322.1", "", { "os": "linux", "cpu": "arm" }, "sha512-0a12pp19ELiNHMqTglfQQQNMsxvtzpjAa4qf12oMJoGyy+UnguKEmaaaCHdp75KvBXGDzlssfDAdiy+NirN19A=="], 781 + 782 + "@typescript/native-preview-linux-arm64": ["@typescript/native-preview-linux-arm64@7.0.0-dev.20260322.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+FyomEEt3K8TBO//n3Ijr61SDM2F7cxZCVqGt+Wk3rLcOCQ2i+8+p64gdsZCmImy3CyP0hBnxPydEbyNkZLtvg=="], 783 + 784 + "@typescript/native-preview-linux-x64": ["@typescript/native-preview-linux-x64@7.0.0-dev.20260322.1", "", { "os": "linux", "cpu": "x64" }, "sha512-MviQe5x4WqQGv/Vhu4hcv2A0qTW/BTaZPbOLYCtvhuovNFO6D++ZmJAbHvA0h/bJEaNTgxKZdZPHMpCfSEKfjA=="], 785 + 786 + "@typescript/native-preview-win32-arm64": ["@typescript/native-preview-win32-arm64@7.0.0-dev.20260322.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-ibnMaXDJPSgMXKC61NHiFlww/xjAEINgc1mcn2ntTfuGHwduU4P9Bi038TxXg95Wmu3v6xIPIorXXsBOdE+p3Q=="], 787 + 788 + "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20260322.1", "", { "os": "win32", "cpu": "x64" }, "sha512-O+r1RToWBbGkK7NXC7DpraLObSWyxvSqRiSfr/BlZ351Cdq1q3121zCGzVtqERGeRtVoEMRrzS5ITOd6On/pCw=="], 789 + 667 790 "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], 668 791 669 792 "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], ··· 707 830 "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], 708 831 709 832 "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], 833 + 834 + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 710 835 711 836 "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], 712 837 ··· 854 979 855 980 "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], 856 981 982 + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 983 + 857 984 "fast-printf": ["fast-printf@1.6.10", "", {}, "sha512-GwTgG9O4FVIdShhbVF3JxOgSBY2+ePGsu2V/UONgoCPzF9VY6ZdBMKsHKCYQHZwNk3qNouUolRDsgVxcVA5G1w=="], 858 985 859 986 "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], ··· 862 989 863 990 "fast-xml-parser": ["fast-xml-parser@5.4.1", "", { "dependencies": { "fast-xml-builder": "^1.0.0", "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A=="], 864 991 992 + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], 993 + 994 + "fd-package-json": ["fd-package-json@2.0.0", "", { "dependencies": { "walk-up-path": "^4.0.0" } }, "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ=="], 995 + 865 996 "file-type": ["file-type@21.3.0", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA=="], 866 997 867 998 "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], 868 999 1000 + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 1001 + 869 1002 "finalhandler": ["finalhandler@1.3.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], 870 1003 871 1004 "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], ··· 873 1006 "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], 874 1007 875 1008 "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], 1009 + 1010 + "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="], 876 1011 877 1012 "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], 878 1013 ··· 892 1027 893 1028 "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], 894 1029 1030 + "get-tsconfig": ["get-tsconfig@4.13.7", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q=="], 1031 + 895 1032 "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], 896 1033 897 1034 "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], 898 1035 1036 + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 1037 + 899 1038 "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], 900 1039 901 1040 "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], ··· 942 1081 943 1082 "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 944 1083 1084 + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 1085 + 945 1086 "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 946 1087 947 1088 "iso-datestring-validator": ["iso-datestring-validator@2.2.2", "", {}, "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA=="], ··· 954 1095 955 1096 "key-encoder": ["key-encoder@2.0.3", "", { "dependencies": { "@types/elliptic": "^6.4.9", "asn1.js": "^5.0.1", "bn.js": "^4.11.8", "elliptic": "^6.4.1" } }, "sha512-fgBtpAGIr/Fy5/+ZLQZIPPhsZEcbSlYu/Wu96tNDFNSjSACw5lEIOFeaVdQ/iwrb8oxjlWi6wmWdH76hV6GZjg=="], 956 1097 1098 + "knip": ["knip@6.0.2", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "get-tsconfig": "4.13.7", "jiti": "^2.6.0", "minimist": "^1.2.8", "oxc-parser": "^0.120.0", "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "unbash": "^2.2.0", "yaml": "^2.8.2", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-W17Bo5N9AYn0ZkgWHGBmK/01SrSmr3B6iStr3zudDa2eqi+Kc8VmPjSpTYKDV2Uy/kojrlcH/gS1wypAXfXRRA=="], 1099 + 957 1100 "kysely": ["kysely@0.22.0", "", {}, "sha512-ZE3qWtnqLOalodzfK5QUEcm7AEulhxsPNuKaGFsC3XiqO92vMLm+mAHk/NnbSIOtC4RmGm0nsv700i8KDp1gfQ=="], 958 1101 959 1102 "lande": ["lande@1.0.10", "", { "dependencies": { "toygrad": "^2.6.0" } }, "sha512-yT52DQh+UV2pEp08jOYrA4drDv0DbjpiRyZYgl25ak9G2cVR2AimzrqkYQWrD9a7Ud+qkAcaiDDoNH9DXfHPmw=="], ··· 1010 1153 1011 1154 "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], 1012 1155 1156 + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 1157 + 1013 1158 "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], 1014 1159 1160 + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 1161 + 1015 1162 "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], 1016 1163 1017 1164 "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], ··· 1069 1216 "one-webcrypto": ["one-webcrypto@1.0.3", "", {}, "sha512-fu9ywBVBPx0gS9K0etIROTiCkvI5S1TDjFsYFb3rC1ewFxeOqsbzq7aIMBHsYfrTHBcGXJaONXXjTl8B01cW1Q=="], 1070 1217 1071 1218 "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], 1219 + 1220 + "oxc-parser": ["oxc-parser@0.120.0", "", { "dependencies": { "@oxc-project/types": "^0.120.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.120.0", "@oxc-parser/binding-android-arm64": "0.120.0", "@oxc-parser/binding-darwin-arm64": "0.120.0", "@oxc-parser/binding-darwin-x64": "0.120.0", "@oxc-parser/binding-freebsd-x64": "0.120.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.120.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.120.0", "@oxc-parser/binding-linux-arm64-gnu": "0.120.0", "@oxc-parser/binding-linux-arm64-musl": "0.120.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.120.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.120.0", "@oxc-parser/binding-linux-riscv64-musl": "0.120.0", "@oxc-parser/binding-linux-s390x-gnu": "0.120.0", "@oxc-parser/binding-linux-x64-gnu": "0.120.0", "@oxc-parser/binding-linux-x64-musl": "0.120.0", "@oxc-parser/binding-openharmony-arm64": "0.120.0", "@oxc-parser/binding-wasm32-wasi": "0.120.0", "@oxc-parser/binding-win32-arm64-msvc": "0.120.0", "@oxc-parser/binding-win32-ia32-msvc": "0.120.0", "@oxc-parser/binding-win32-x64-msvc": "0.120.0" } }, "sha512-WyPWZlcIm+Fkte63FGfgFB8mAAk33aH9h5N9lphXVOHSXEBFFsmYdOBedVKly363aWABjZdaj/m9lBfEY4wt+w=="], 1221 + 1222 + "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="], 1072 1223 1073 1224 "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], 1074 1225 ··· 1151 1302 "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], 1152 1303 1153 1304 "qs": ["qs@6.14.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q=="], 1305 + 1306 + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 1154 1307 1155 1308 "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], 1156 1309 ··· 1174 1327 1175 1328 "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 1176 1329 1330 + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], 1331 + 1332 + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], 1333 + 1177 1334 "roarr": ["roarr@7.21.4", "", { "dependencies": { "fast-printf": "^1.6.9", "safe-stable-stringify": "^2.4.3", "semver-compare": "^1.0.0" } }, "sha512-qvfUKCrpPzhWmQ4NxRYnuwhkI5lwmObhBU06BCK/lpj6PID9nL4Hk6XDwek2foKI+TMaV+Yw//XZshGF2Lox/Q=="], 1335 + 1336 + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 1178 1337 1179 1338 "russian-bad-words": ["russian-bad-words@0.5.0", "", {}, "sha512-euNvEYki6iYYpkNbeudW+lEMMYGEmN7EBwVF8ezlbv0bZoQpVYB7W10cCeUIGV7Ed50sJynLQ0c559q5iI0ejQ=="], 1180 1339 ··· 1217 1376 "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], 1218 1377 1219 1378 "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="], 1379 + 1380 + "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], 1220 1381 1221 1382 "sonic-boom": ["sonic-boom@3.8.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg=="], 1222 1383 ··· 1242 1403 1243 1404 "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1244 1405 1245 - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], 1406 + "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], 1246 1407 1247 1408 "strnum": ["strnum@2.2.0", "", {}, "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg=="], 1248 1409 ··· 1263 1424 "thread-stream": ["thread-stream@2.7.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw=="], 1264 1425 1265 1426 "tlds": ["tlds@1.261.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA=="], 1427 + 1428 + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 1266 1429 1267 1430 "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], 1268 1431 ··· 1290 1453 1291 1454 "uint8arrays": ["uint8arrays@3.0.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA=="], 1292 1455 1456 + "unbash": ["unbash@2.2.0", "", {}, "sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w=="], 1457 + 1293 1458 "undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], 1294 1459 1295 1460 "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], ··· 1307 1472 "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], 1308 1473 1309 1474 "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], 1475 + 1476 + "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], 1310 1477 1311 1478 "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 1312 1479 ··· 1318 1485 1319 1486 "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 1320 1487 1321 - "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], 1488 + "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], 1322 1489 1323 1490 "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], 1324 1491 1325 1492 "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], 1493 + 1494 + "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], 1326 1495 1327 1496 "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], 1328 1497 1329 1498 "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], 1330 1499 1331 - "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], 1500 + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], 1332 1501 1333 1502 "@atproto-labs/did-resolver/@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.1", "", { "dependencies": { "@atproto-labs/simple-store": "0.1.1", "lru-cache": "^10.2.0" } }, "sha512-PCRqhnZ8NBNBvLku53O56T0lsVOtclfIrQU/rwLCc4+p45/SBPrRYNBi6YFq5rxZbK6Njos9MCmILV/KLQxrWA=="], 1334 1503 1504 + "@atproto-labs/did-resolver/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1505 + 1506 + "@atproto-labs/fetch/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1507 + 1335 1508 "@atproto-labs/fetch-node/@atproto-labs/fetch": ["@atproto-labs/fetch@0.2.3", "", { "dependencies": { "@atproto-labs/pipe": "0.1.1" } }, "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw=="], 1336 1509 1337 1510 "@atproto-labs/fetch-node/@atproto-labs/pipe": ["@atproto-labs/pipe@0.1.1", "", {}, "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg=="], 1338 1511 1339 1512 "@atproto-labs/handle-resolver/@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.1", "", { "dependencies": { "@atproto-labs/simple-store": "0.1.1", "lru-cache": "^10.2.0" } }, "sha512-PCRqhnZ8NBNBvLku53O56T0lsVOtclfIrQU/rwLCc4+p45/SBPrRYNBi6YFq5rxZbK6Njos9MCmILV/KLQxrWA=="], 1513 + 1514 + "@atproto-labs/handle-resolver/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1340 1515 1341 1516 "@atproto-labs/handle-resolver-node/@atproto-labs/fetch-node": ["@atproto-labs/fetch-node@0.1.3", "", { "dependencies": { "@atproto-labs/fetch": "0.1.1", "@atproto-labs/pipe": "0.1.0", "ipaddr.js": "^2.1.0", "psl": "^1.9.0", "undici": "^6.14.1" } }, "sha512-KX3ogPJt6dXNppWImQ9omfhrc8t73WrJaxHMphRAqQL8jXxKW5NBCTjSuwroBkJ1pj1aValBrc5NpdYu+H/9Qg=="], 1342 1517 ··· 1354 1529 1355 1530 "@atproto/api/@atproto/syntax": ["@atproto/syntax@0.3.4", "", {}, "sha512-8CNmi5DipOLaVeSMPggMe7FCksVag0aO6XZy9WflbduTKM4dFZVCs4686UeMLfGRXX+X966XgwECHoLYrovMMg=="], 1356 1531 1532 + "@atproto/api/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1533 + 1357 1534 "@atproto/bsky/@atproto/api": ["@atproto/api@0.19.3", "", { "dependencies": { "@atproto/common-web": "^0.4.18", "@atproto/lexicon": "^0.6.2", "@atproto/syntax": "^0.5.0", "@atproto/xrpc": "^0.7.7", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-G8YpBpRouHdTAIagi/QQIUZOhGd1jfBQWkJy9QfxAzjjEpPvaVOSk4e1S85QzGLm/xbzVONzGkmdtiOSfP6wVg=="], 1358 1535 1359 1536 "@atproto/bsky/@atproto/did": ["@atproto/did@0.3.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-raUPzUGegtW/6OxwCmM8bhZvuIMzxG5t9oWsth6Tp91Kb5fTnHV2h/KKNF1C82doeA4BdXCErTyg7ISwLbQkzA=="], ··· 1362 1539 1363 1540 "@atproto/bsky/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1364 1541 1542 + "@atproto/common-web/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1543 + 1365 1544 "@atproto/dev-env/@atproto/api": ["@atproto/api@0.19.3", "", { "dependencies": { "@atproto/common-web": "^0.4.18", "@atproto/lexicon": "^0.6.2", "@atproto/syntax": "^0.5.0", "@atproto/xrpc": "^0.7.7", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-G8YpBpRouHdTAIagi/QQIUZOhGd1jfBQWkJy9QfxAzjjEpPvaVOSk4e1S85QzGLm/xbzVONzGkmdtiOSfP6wVg=="], 1366 1545 1546 + "@atproto/did/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1547 + 1367 1548 "@atproto/identity/@atproto/common-web": ["@atproto/common-web@0.4.17", "", { "dependencies": { "@atproto/lex-data": "^0.0.12", "@atproto/lex-json": "^0.0.12", "@atproto/syntax": "^0.4.3", "zod": "^3.23.8" } }, "sha512-sfxD8NGxyoxhxmM9EUshEFbWcJ3+JHEOZF4Quk6HsCh1UxpHBmLabT/vEsAkDWl+C/8U0ine0+c/gHyE/OZiQQ=="], 1368 1549 1550 + "@atproto/jwk/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1551 + 1369 1552 "@atproto/jwk-webcrypto/@atproto/jwk": ["@atproto/jwk@0.1.1", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-6h/bj1APUk7QcV9t/oA6+9DB5NZx9SZru9x+/pV5oHFI9Xz4ZuM5+dq1PfsJV54pZyqdnZ6W6M717cxoC7q7og=="], 1370 1553 1371 1554 "@atproto/jwk-webcrypto/@atproto/jwk-jose": ["@atproto/jwk-jose@0.1.2", "", { "dependencies": { "@atproto/jwk": "0.1.1", "jose": "^5.2.0" } }, "sha512-lDwc/6lLn2aZ/JpyyggyjLFsJPMntrVzryyGUx5aNpuTS8SIuc4Ky0REhxqfLopQXJJZCuRRjagHG3uP05/moQ=="], 1372 1555 1373 1556 "@atproto/lex-resolver/@atproto-labs/did-resolver": ["@atproto-labs/did-resolver@0.2.6", "", { "dependencies": { "@atproto-labs/fetch": "0.2.3", "@atproto-labs/pipe": "0.1.1", "@atproto-labs/simple-store": "0.3.0", "@atproto-labs/simple-store-memory": "0.1.4", "@atproto/did": "0.3.0", "zod": "^3.23.8" } }, "sha512-2K1bC04nI2fmgNcvof+yA28IhGlpWn2JKYlPa7To9JTKI45FINCGkQSGiL2nyXlyzDJJ34fZ1aq6/IRFIOIiqg=="], 1374 1557 1558 + "@atproto/lexicon/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1559 + 1375 1560 "@atproto/oauth-client/@atproto-labs/simple-store-memory": ["@atproto-labs/simple-store-memory@0.1.1", "", { "dependencies": { "@atproto-labs/simple-store": "0.1.1", "lru-cache": "^10.2.0" } }, "sha512-PCRqhnZ8NBNBvLku53O56T0lsVOtclfIrQU/rwLCc4+p45/SBPrRYNBi6YFq5rxZbK6Njos9MCmILV/KLQxrWA=="], 1376 1561 1377 1562 "@atproto/oauth-client/@atproto/jwk": ["@atproto/jwk@0.1.1", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-6h/bj1APUk7QcV9t/oA6+9DB5NZx9SZru9x+/pV5oHFI9Xz4ZuM5+dq1PfsJV54pZyqdnZ6W6M717cxoC7q7og=="], 1378 1563 1379 1564 "@atproto/oauth-client/@atproto/xrpc": ["@atproto/xrpc@0.6.3", "", { "dependencies": { "@atproto/lexicon": "^0.4.2", "zod": "^3.23.8" } }, "sha512-S3tRvOdA9amPkKLll3rc4vphlDitLrkN5TwWh5Tu/jzk7mnobVVE3akYgICV9XCNHKjWM+IAPxFFI2qi+VW6nQ=="], 1380 1565 1566 + "@atproto/oauth-client/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1567 + 1381 1568 "@atproto/oauth-client-node/@atproto/jwk": ["@atproto/jwk@0.1.1", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-6h/bj1APUk7QcV9t/oA6+9DB5NZx9SZru9x+/pV5oHFI9Xz4ZuM5+dq1PfsJV54pZyqdnZ6W6M717cxoC7q7og=="], 1382 1569 1383 1570 "@atproto/oauth-client-node/@atproto/jwk-jose": ["@atproto/jwk-jose@0.1.2", "", { "dependencies": { "@atproto/jwk": "0.1.1", "jose": "^5.2.0" } }, "sha512-lDwc/6lLn2aZ/JpyyggyjLFsJPMntrVzryyGUx5aNpuTS8SIuc4Ky0REhxqfLopQXJJZCuRRjagHG3uP05/moQ=="], ··· 1394 1581 1395 1582 "@atproto/oauth-provider/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], 1396 1583 1584 + "@atproto/oauth-provider/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1585 + 1397 1586 "@atproto/oauth-provider-api/@atproto/oauth-types": ["@atproto/oauth-types@0.6.2", "", { "dependencies": { "@atproto/did": "0.3.0", "@atproto/jwk": "0.6.0", "zod": "^3.23.8" } }, "sha512-2cuboM4RQBCYR8NQC5uGRkW6KgCgKyq/B5/+tnMmWZYtZGVUQvsUWQHK/ZiMCnVXbcDNtc/RIEJQJDZ8FXMoxg=="], 1398 1587 1399 1588 "@atproto/oauth-scopes/@atproto/did": ["@atproto/did@0.3.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-raUPzUGegtW/6OxwCmM8bhZvuIMzxG5t9oWsth6Tp91Kb5fTnHV2h/KKNF1C82doeA4BdXCErTyg7ISwLbQkzA=="], 1400 1589 1401 1590 "@atproto/oauth-types/@atproto/jwk": ["@atproto/jwk@0.1.1", "", { "dependencies": { "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-6h/bj1APUk7QcV9t/oA6+9DB5NZx9SZru9x+/pV5oHFI9Xz4ZuM5+dq1PfsJV54pZyqdnZ6W6M717cxoC7q7og=="], 1402 1591 1592 + "@atproto/oauth-types/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1593 + 1403 1594 "@atproto/ozone/@atproto/api": ["@atproto/api@0.19.3", "", { "dependencies": { "@atproto/common-web": "^0.4.18", "@atproto/lexicon": "^0.6.2", "@atproto/syntax": "^0.5.0", "@atproto/xrpc": "^0.7.7", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-G8YpBpRouHdTAIagi/QQIUZOhGd1jfBQWkJy9QfxAzjjEpPvaVOSk4e1S85QzGLm/xbzVONzGkmdtiOSfP6wVg=="], 1404 1595 1405 1596 "@atproto/ozone/@atproto/xrpc": ["@atproto/xrpc@0.7.7", "", { "dependencies": { "@atproto/lexicon": "^0.6.0", "zod": "^3.23.8" } }, "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA=="], 1597 + 1598 + "@atproto/ozone/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], 1406 1599 1407 1600 "@atproto/pds/@atproto-labs/simple-store": ["@atproto-labs/simple-store@0.3.0", "", {}, "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ=="], 1408 1601 ··· 1416 1609 1417 1610 "@atproto/pds/file-type": ["file-type@16.5.4", "", { "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" } }, "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw=="], 1418 1611 1612 + "@atproto/pds/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1613 + 1419 1614 "@atproto/repo/@atproto/common-web": ["@atproto/common-web@0.4.17", "", { "dependencies": { "@atproto/lex-data": "^0.0.12", "@atproto/lex-json": "^0.0.12", "@atproto/syntax": "^0.4.3", "zod": "^3.23.8" } }, "sha512-sfxD8NGxyoxhxmM9EUshEFbWcJ3+JHEOZF4Quk6HsCh1UxpHBmLabT/vEsAkDWl+C/8U0ine0+c/gHyE/OZiQQ=="], 1615 + 1616 + "@atproto/repo/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1617 + 1618 + "@atproto/sync/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], 1619 + 1620 + "@atproto/ws-client/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], 1420 1621 1421 1622 "@atproto/xrpc/@atproto/lexicon": ["@atproto/lexicon@0.4.14", "", { "dependencies": { "@atproto/common-web": "^0.4.2", "@atproto/syntax": "^0.4.0", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ=="], 1422 1623 1624 + "@atproto/xrpc/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1625 + 1423 1626 "@atproto/xrpc-server/@atproto/xrpc": ["@atproto/xrpc@0.7.7", "", { "dependencies": { "@atproto/lexicon": "^0.6.0", "zod": "^3.23.8" } }, "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA=="], 1627 + 1628 + "@atproto/xrpc-server/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], 1424 1629 1425 1630 "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], 1426 1631 ··· 1433 1638 "@did-plc/lib/@atproto/common": ["@atproto/common@0.1.0", "", { "dependencies": { "@ipld/dag-cbor": "^7.0.3", "multiformats": "^9.6.4", "pino": "^8.6.1", "zod": "^3.14.2" } }, "sha512-OB5tWE2R19jwiMIs2IjQieH5KTUuMb98XGCn9h3xuu6NanwjlmbCYMv08fMYwIp3UQ6jcq//84cDT3Bu6fJD+A=="], 1434 1639 1435 1640 "@did-plc/lib/@atproto/crypto": ["@atproto/crypto@0.1.0", "", { "dependencies": { "@noble/secp256k1": "^1.7.0", "big-integer": "^1.6.51", "multiformats": "^9.6.4", "one-webcrypto": "^1.0.3", "uint8arrays": "3.0.0" } }, "sha512-9xgFEPtsCiJEPt9o3HtJT30IdFTGw5cQRSJVIy5CFhqBA4vDLcdXiRDLCjkzHEVbtNCsHUW6CrlfOgbeLPcmcg=="], 1641 + 1642 + "@did-plc/lib/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1436 1643 1437 1644 "@did-plc/server/@atproto/common": ["@atproto/common@0.1.0", "", { "dependencies": { "@ipld/dag-cbor": "^7.0.3", "multiformats": "^9.6.4", "pino": "^8.6.1", "zod": "^3.14.2" } }, "sha512-OB5tWE2R19jwiMIs2IjQieH5KTUuMb98XGCn9h3xuu6NanwjlmbCYMv08fMYwIp3UQ6jcq//84cDT3Bu6fJD+A=="], 1438 1645 ··· 1473 1680 "htmlparser2/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], 1474 1681 1475 1682 "ioredis/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], 1683 + 1684 + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 1476 1685 1477 1686 "proxy-addr/ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], 1478 1687 1688 + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], 1689 + 1479 1690 "readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], 1480 1691 1481 1692 "send/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], ··· 1496 1707 1497 1708 "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1498 1709 1710 + "@atproto-labs/xrpc-utils/@atproto/xrpc/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1711 + 1499 1712 "@atproto/api/@atproto/common-web/@atproto/lex-data": ["@atproto/lex-data@0.0.12", "", { "dependencies": { "multiformats": "^9.9.0", "tslib": "^2.8.1", "uint8arrays": "3.0.0", "unicode-segmenter": "^0.14.0" } }, "sha512-aekJudcK1p6sbTqUv2bJMJBAGZaOJS0mgDclpK3U6VuBREK/au4B6ffunBFWgrDfg0Vwj2JGyEA7E51WZkJcRw=="], 1500 1713 1501 1714 "@atproto/api/@atproto/common-web/@atproto/lex-json": ["@atproto/lex-json@0.0.12", "", { "dependencies": { "@atproto/lex-data": "^0.0.12", "tslib": "^2.8.1" } }, "sha512-XlEpnWWZdDJ5BIgG25GyH+6iBfyrFL18BI5JSE6rUfMObbFMrQRaCuRLQfryRXNysVz3L3U+Qb9y8KcXbE8AcA=="], ··· 1505 1718 "@atproto/api/@atproto/lexicon/@atproto/syntax": ["@atproto/syntax@0.4.3", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA=="], 1506 1719 1507 1720 "@atproto/bsky/@atproto/api/@atproto/xrpc": ["@atproto/xrpc@0.7.7", "", { "dependencies": { "@atproto/lexicon": "^0.6.0", "zod": "^3.23.8" } }, "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA=="], 1508 - 1509 - "@atproto/bsky/@atproto/api/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], 1510 - 1511 - "@atproto/bsky/@atproto/did/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], 1512 1721 1513 1722 "@atproto/bsky/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], 1514 1723 ··· 1550 1759 1551 1760 "@atproto/dev-env/@atproto/api/@atproto/xrpc": ["@atproto/xrpc@0.7.7", "", { "dependencies": { "@atproto/lexicon": "^0.6.0", "zod": "^3.23.8" } }, "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA=="], 1552 1761 1762 + "@atproto/dev-env/@atproto/api/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1763 + 1553 1764 "@atproto/identity/@atproto/common-web/@atproto/lex-data": ["@atproto/lex-data@0.0.12", "", { "dependencies": { "multiformats": "^9.9.0", "tslib": "^2.8.1", "uint8arrays": "3.0.0", "unicode-segmenter": "^0.14.0" } }, "sha512-aekJudcK1p6sbTqUv2bJMJBAGZaOJS0mgDclpK3U6VuBREK/au4B6ffunBFWgrDfg0Vwj2JGyEA7E51WZkJcRw=="], 1554 1765 1555 1766 "@atproto/identity/@atproto/common-web/@atproto/lex-json": ["@atproto/lex-json@0.0.12", "", { "dependencies": { "@atproto/lex-data": "^0.0.12", "tslib": "^2.8.1" } }, "sha512-XlEpnWWZdDJ5BIgG25GyH+6iBfyrFL18BI5JSE6rUfMObbFMrQRaCuRLQfryRXNysVz3L3U+Qb9y8KcXbE8AcA=="], 1556 1767 1557 1768 "@atproto/identity/@atproto/common-web/@atproto/syntax": ["@atproto/syntax@0.4.3", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA=="], 1558 1769 1770 + "@atproto/identity/@atproto/common-web/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1771 + 1772 + "@atproto/jwk-webcrypto/@atproto/jwk/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1773 + 1559 1774 "@atproto/lex-resolver/@atproto-labs/did-resolver/@atproto-labs/fetch": ["@atproto-labs/fetch@0.2.3", "", { "dependencies": { "@atproto-labs/pipe": "0.1.1" } }, "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw=="], 1560 1775 1561 1776 "@atproto/lex-resolver/@atproto-labs/did-resolver/@atproto-labs/pipe": ["@atproto-labs/pipe@0.1.1", "", {}, "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg=="], ··· 1564 1779 1565 1780 "@atproto/lex-resolver/@atproto-labs/did-resolver/@atproto/did": ["@atproto/did@0.3.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-raUPzUGegtW/6OxwCmM8bhZvuIMzxG5t9oWsth6Tp91Kb5fTnHV2h/KKNF1C82doeA4BdXCErTyg7ISwLbQkzA=="], 1566 1781 1782 + "@atproto/lex-resolver/@atproto-labs/did-resolver/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1783 + 1784 + "@atproto/oauth-client-node/@atproto/jwk/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1785 + 1567 1786 "@atproto/oauth-client/@atproto/xrpc/@atproto/lexicon": ["@atproto/lexicon@0.4.14", "", { "dependencies": { "@atproto/common-web": "^0.4.2", "@atproto/syntax": "^0.4.0", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ=="], 1568 1787 1569 1788 "@atproto/oauth-provider-api/@atproto/oauth-types/@atproto/did": ["@atproto/did@0.3.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-raUPzUGegtW/6OxwCmM8bhZvuIMzxG5t9oWsth6Tp91Kb5fTnHV2h/KKNF1C82doeA4BdXCErTyg7ISwLbQkzA=="], 1570 1789 1790 + "@atproto/oauth-provider-api/@atproto/oauth-types/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1791 + 1792 + "@atproto/oauth-scopes/@atproto/did/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1793 + 1794 + "@atproto/ozone/@atproto/api/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1795 + 1796 + "@atproto/ozone/@atproto/xrpc/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1797 + 1571 1798 "@atproto/pds/@did-plc/lib/@atproto/common": ["@atproto/common@0.1.1", "", { "dependencies": { "@ipld/dag-cbor": "^7.0.3", "multiformats": "^9.6.4", "pino": "^8.6.1", "zod": "^3.14.2" } }, "sha512-GYwot5wF/z8iYGSPjrLHuratLc0CVgovmwfJss7+BUOB6y2/Vw8+1Vw0n9DDI0gb5vmx3UI8z0uJgC8aa8yuJg=="], 1572 1799 1573 1800 "@atproto/pds/@did-plc/lib/@atproto/crypto": ["@atproto/crypto@0.1.0", "", { "dependencies": { "@noble/secp256k1": "^1.7.0", "big-integer": "^1.6.51", "multiformats": "^9.6.4", "one-webcrypto": "^1.0.3", "uint8arrays": "3.0.0" } }, "sha512-9xgFEPtsCiJEPt9o3HtJT30IdFTGw5cQRSJVIy5CFhqBA4vDLcdXiRDLCjkzHEVbtNCsHUW6CrlfOgbeLPcmcg=="], ··· 1582 1809 1583 1810 "@atproto/repo/@atproto/common-web/@atproto/syntax": ["@atproto/syntax@0.4.3", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA=="], 1584 1811 1812 + "@atproto/xrpc-server/@atproto/xrpc/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1813 + 1585 1814 "@atproto/xrpc/@atproto/lexicon/@atproto/common-web": ["@atproto/common-web@0.4.17", "", { "dependencies": { "@atproto/lex-data": "^0.0.12", "@atproto/lex-json": "^0.0.12", "@atproto/syntax": "^0.4.3", "zod": "^3.23.8" } }, "sha512-sfxD8NGxyoxhxmM9EUshEFbWcJ3+JHEOZF4Quk6HsCh1UxpHBmLabT/vEsAkDWl+C/8U0ine0+c/gHyE/OZiQQ=="], 1586 1815 1587 1816 "@atproto/xrpc/@atproto/lexicon/@atproto/syntax": ["@atproto/syntax@0.4.3", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA=="], ··· 1591 1820 "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], 1592 1821 1593 1822 "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], 1823 + 1824 + "@did-plc/server/@atproto/common/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], 1594 1825 1595 1826 "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], 1596 1827
+20
knip.config.ts
··· 1 + import type { KnipConfig } from "knip"; 2 + 3 + const config: KnipConfig = { 4 + entry: [ 5 + "src/**/index.ts", 6 + "public/editor/editor.ts", 7 + "public/viz/viz-hydrate.ts", 8 + "scripts/**/*.{ts,mjs}", 9 + ], 10 + project: ["**/*.{ts,tsx,mjs}!"], 11 + ignoreDependencies: [ 12 + "better-sqlite3", 13 + "tailwindcss", 14 + "@tailwindcss/typography", 15 + ], 16 + includeEntryExports: true, 17 + treatConfigHintsAsErrors: true, 18 + }; 19 + 20 + export default config;
+15 -3
package.json
··· 15 15 "lint": "biome check src/ public/ tests/", 16 16 "lint:fix": "biome check --write src/ public/ tests/", 17 17 "format": "biome format --write src/ public/ tests/", 18 - "typecheck": "tsc --noEmit && tsc --noEmit -p public/tsconfig.json", 18 + "typecheck": "tsgo --noEmit && tsgo --noEmit -p public/tsconfig.json", 19 + "knip": "knip", 19 20 "build:viz": "bun build public/viz/viz-hydrate.ts --outfile public/viz/dist.js --minify", 20 21 "dev:viz": "bun build public/viz/viz-hydrate.ts --outfile public/viz/dist.js --watch", 21 22 "build:editor": "bun build public/editor/editor.ts --outfile public/editor/dist.js --minify", ··· 24 25 "devDependencies": { 25 26 "@atproto/dev-env": "0.3.213", 26 27 "@biomejs/biome": "^2.4.4", 27 - "@parcel/watcher": "^2.5.6", 28 28 "@tailwindcss/cli": "^4.2.1", 29 29 "@tailwindcss/typography": "^0.5.16", 30 30 "@types/bun": "latest", 31 31 "@types/d3": "^7.4.3", 32 32 "@types/diff-match-patch": "^1.0.36", 33 33 "@types/markdown-it": "^14.1.2", 34 + "@typescript/native-preview": "^7.0.0-dev.20260322.1", 34 35 "better-sqlite3": "12.8.0", 36 + "knip": "^6.0.2", 35 37 "tailwindcss": "^4.2.1" 36 38 }, 37 39 "peerDependencies": { 38 40 "typescript": "^5" 39 41 }, 42 + "overrides": { 43 + "@atproto/api/zod": "3.23.8", 44 + "@atproto/common-web/zod": "3.23.8", 45 + "@atproto/did/zod": "3.23.8", 46 + "@atproto-labs/did-resolver/zod": "3.23.8", 47 + "@atproto-labs/fetch/zod": "3.23.8", 48 + "@atproto-labs/handle-resolver/zod": "3.23.8" 49 + }, 40 50 "dependencies": { 41 51 "@atproto/api": "^0.13.0", 42 52 "@atproto/identity": "^0.4.12", ··· 44 54 "@atproto/oauth-client-node": "^0.1.0", 45 55 "@atproto/sync": "^0.1.40", 46 56 "@codemirror/lang-markdown": "^6.5.0", 57 + "@codemirror/state": "^6.0.0", 47 58 "@elysiajs/static": "^1.4.7", 48 59 "@sindresorhus/slugify": "^3.0.0", 49 60 "codemirror": "^6.0.2", 50 61 "diff-match-patch": "^1.0.5", 51 62 "elysia": "^1.4.27", 52 63 "markdown-it": "^14.1.1", 53 - "sharp": "^0.34.5" 64 + "sharp": "^0.34.5", 65 + "ws": "^8.0.0" 54 66 } 55 67 }
+1 -1
public/viz/renderers/index.ts
··· 1 1 import { renderForceGraph } from "./force-graph.ts"; 2 2 import { renderSunburst } from "./sunburst.ts"; 3 3 4 - export type VizRenderer = (container: HTMLElement, data: unknown) => void; 4 + type VizRenderer = (container: HTMLElement, data: unknown) => void; 5 5 6 6 export const renderers: Record<string, VizRenderer> = { 7 7 graph: renderForceGraph as VizRenderer,
+2 -2
public/viz/viz-hydrate.ts
··· 8 8 for (const container of containers) { 9 9 if (container.children.length > 0) continue; // already rendered 10 10 11 - const vizType = container.dataset.vizType; 12 - const encoded = container.dataset.viz; 11 + const vizType = container.dataset["vizType"]; 12 + const encoded = container.dataset["viz"]; 13 13 14 14 if (!vizType || !encoded) continue; 15 15
+8 -8
src/atproto/env.ts
··· 4 4 } 5 5 6 6 export function getAtprotoEnv(): AtprotoEnv | null { 7 - const publicUrl = process.env.PUBLIC_URL; 8 - const privateKeyPath = process.env.OAUTH_PRIVATE_KEY_PATH; 7 + const publicUrl = process.env["PUBLIC_URL"]; 8 + const privateKeyPath = process.env["OAUTH_PRIVATE_KEY_PATH"]; 9 9 10 10 if (!publicUrl || !privateKeyPath) { 11 11 return null; ··· 19 19 } 20 20 21 21 export function getRelayUrl(): string { 22 - return process.env.RELAY_URL ?? "wss://bsky.network"; 22 + return process.env["RELAY_URL"] ?? "wss://bsky.network"; 23 23 } 24 24 25 25 export function getHandleResolverUrl(): string { 26 - return process.env.HANDLE_RESOLVER_URL ?? "https://bsky.social"; 26 + return process.env["HANDLE_RESOLVER_URL"] ?? "https://bsky.social"; 27 27 } 28 28 29 29 export function getDevPdsUrl(): string | null { 30 - return process.env.DEV_PDS_URL ?? null; 30 + return process.env["DEV_PDS_URL"] ?? null; 31 31 } 32 32 33 33 export function getDevPlcUrl(): string | null { 34 - return process.env.DEV_PLC_URL ?? null; 34 + return process.env["DEV_PLC_URL"] ?? null; 35 35 } 36 36 37 - export interface DevAccount { 37 + interface DevAccount { 38 38 did: string; 39 39 handle: string; 40 40 password: string; 41 41 } 42 42 43 43 export function getDevAccounts(): Record<string, DevAccount> | null { 44 - const raw = process.env.DEV_ACCOUNTS; 44 + const raw = process.env["DEV_ACCOUNTS"]; 45 45 if (!raw) return null; 46 46 try { 47 47 return JSON.parse(raw) as Record<string, DevAccount>;
+5 -5
src/atproto/pds.ts
··· 1 1 import type { Agent } from "@atproto/api"; 2 2 import { COLLECTIONS } from "../lib/constants.ts"; 3 3 4 - export interface PdsWriteResult { 4 + interface PdsWriteResult { 5 5 uri: string; 6 6 cid: string; 7 7 } ··· 43 43 language, 44 44 createdAt, 45 45 }; 46 - if (description) fields.description = description; 46 + if (description) fields["description"] = description; 47 47 return putRecord(agent, did, COLLECTIONS.wiki, slug, fields); 48 48 } 49 49 ··· 81 81 diffFormat: "diff-match-patch", 82 82 createdAt, 83 83 }; 84 - if (parentRevision) fields.parentRevision = parentRevision; 85 - if (message) fields.message = message; 86 - if (blobs && blobs.length > 0) fields.blobs = blobs; 84 + if (parentRevision) fields["parentRevision"] = parentRevision; 85 + if (message) fields["message"] = message; 86 + if (blobs && blobs.length > 0) fields["blobs"] = blobs; 87 87 88 88 return putRecord(agent, did, COLLECTIONS.noteRevision, tid, fields); 89 89 }
+2 -2
src/atproto/session.ts
··· 85 85 * Create and log in a dev-mode agent. Use this instead of createAgent() 86 86 * when in dev mode (session.oauthSession is undefined). 87 87 */ 88 - export async function loginDevAgent(session: Session): Promise<Agent> { 88 + async function loginDevAgent(session: Session): Promise<Agent> { 89 89 const devPdsUrl = getDevPdsUrl(); 90 90 if (!devPdsUrl) { 91 91 throw new Error("DEV_PDS_URL not configured"); ··· 106 106 identifier: account.handle, 107 107 password: account.password, 108 108 }); 109 - return agent; 109 + return agent as unknown as Agent; 110 110 } 111 111 112 112 export const DEV_DID = "did:plc:mock123";
+3 -3
src/firehose/index.ts
··· 18 18 console.log(`Resuming from cursor ${savedCursor}`); 19 19 } 20 20 21 - const plcUrl = getDevPlcUrl() ?? undefined; 22 - const idResolver = new IdResolver({ plcUrl }); 21 + const plcUrl = getDevPlcUrl(); 22 + const idResolver = new IdResolver(plcUrl ? { plcUrl } : {}); 23 23 24 24 const runner = new MemoryRunner({ 25 - startCursor: savedCursor ?? undefined, 25 + ...(savedCursor != null && { startCursor: savedCursor }), 26 26 setCursor: async (cursor: number) => { 27 27 if (!isDevMode) setCursor(cursor); 28 28 },
+1 -1
src/lib/at-uri.ts
··· 1 - export interface ParsedAtUri { 1 + interface ParsedAtUri { 2 2 did: string; 3 3 collection: string; 4 4 rkey: string;
+1 -1
src/lib/blob.ts
··· 3 3 4 4 const BLOB_URL_RE = /!\[[^\]]*\]\(\/blob\/(did:[^/]+)\/([^)\s]+)\)/g; 5 5 6 - export interface BlobRef { 6 + interface BlobRef { 7 7 did: string; 8 8 cid: string; 9 9 }
+1 -1
src/lib/i18n/index.ts
··· 140 140 141 141 const resolved: Record<Locale, Messages> = { 142 142 en, 143 - fr: mergeWithFallback(translations.fr), 143 + fr: mergeWithFallback(translations["fr"]), 144 144 }; 145 145 146 146 export function t(locale: Locale): Messages {
+3 -3
src/lib/image.ts
··· 5 5 "image/webp", 6 6 ] as const; 7 7 8 - export type AllowedMimeType = (typeof ALLOWED_MIME_TYPES)[number]; 8 + type AllowedMimeType = (typeof ALLOWED_MIME_TYPES)[number]; 9 9 10 - export const MAX_IMAGE_SIZE = 10 * 1024 * 1024; // 10MB 10 + const MAX_IMAGE_SIZE = 10 * 1024 * 1024; // 10MB 11 11 12 - export class ImageValidationError extends Error { 12 + class ImageValidationError extends Error { 13 13 constructor(message: string) { 14 14 super(message); 15 15 this.name = "ImageValidationError";
+3 -5
src/lib/markdown.ts
··· 3 3 import { escapeHtml } from "./html.ts"; 4 4 import { type VizPluginEnv, vizPlugin } from "./viz/plugin.ts"; 5 5 6 - export interface RenderResult { 6 + interface RenderResult { 7 7 html: string; 8 8 hasViz: boolean; 9 9 } 10 10 11 - export interface MarkdownEnv extends VizPluginEnv { 11 + interface MarkdownEnv extends VizPluginEnv { 12 12 wikiSlug?: string; 13 13 } 14 14 ··· 96 96 source: string, 97 97 wikiSlug?: string, 98 98 ): RenderResult { 99 - const env: MarkdownEnv = { wikiSlug }; 99 + const env: MarkdownEnv = wikiSlug ? { wikiSlug } : {}; 100 100 const html = md.render(source, env); 101 101 return { html, hasViz: env.hasViz === true }; 102 102 } ··· 124 124 } 125 125 return [...seen]; 126 126 } 127 - 128 - export { md };
+5 -2
src/lib/orchestrators/note.ts
··· 26 26 import { currentTimestamp, generateTid } from "../tid.ts"; 27 27 import { withPdsError } from "./helpers.ts"; 28 28 29 - export interface NoteFormFields { 29 + interface NoteFormFields { 30 30 title: string; 31 31 content: string; 32 32 message?: string; ··· 42 42 const blobMeta = parseBlobMetadata( 43 43 (formData.get("blob_metadata") as string | null) ?? null, 44 44 ); 45 - return { title, content, message: message || undefined, blobMeta }; 45 + const trimmedMessage = message || undefined; 46 + return trimmedMessage 47 + ? { title, content, message: trimmedMessage, blobMeta } 48 + : { title, content, blobMeta }; 46 49 } 47 50 48 51 /**
+1 -1
src/lib/orchestrators/wiki.ts
··· 25 25 import { currentTimestamp, generateTid } from "../tid.ts"; 26 26 import { withPdsError } from "./helpers.ts"; 27 27 28 - export interface WikiFormFields { 28 + interface WikiFormFields { 29 29 name: string; 30 30 language: string; 31 31 visibility: string;
+27 -33
src/lib/viz/schemas.ts
··· 1 - export type { 2 - ForceGraphData, 3 - ForceGraphLink, 4 - ForceGraphNode, 5 - SunburstData, 6 - SunburstNode, 7 - } from "../../shared/viz-types.ts"; 8 - 9 1 import type { 10 2 ForceGraphData, 11 3 ForceGraphNode, ··· 19 11 20 12 export type VizType = "graph" | "sunburst"; 21 13 22 - export interface ValidationResult<T> { 14 + interface ValidationResult<T> { 23 15 ok: boolean; 24 16 data?: T; 25 17 error?: string; ··· 32 24 function validateSunburstNode(node: unknown, depth: number): string | null { 33 25 if (depth > MAX_DEPTH) return `Tree exceeds max depth of ${MAX_DEPTH}`; 34 26 if (!isObject(node)) return "Node must be an object"; 35 - if (typeof node.name !== "string" || node.name.length === 0) 27 + if (typeof node["name"] !== "string" || node["name"].length === 0) 36 28 return "Node must have a non-empty 'name' string"; 37 - if (node.value !== undefined && typeof node.value !== "number") 29 + if (node["value"] !== undefined && typeof node["value"] !== "number") 38 30 return "Node 'value' must be a number"; 39 - if (node.children !== undefined) { 40 - if (!Array.isArray(node.children)) 31 + if (node["children"] !== undefined) { 32 + if (!Array.isArray(node["children"])) 41 33 return "Node 'children' must be an array"; 42 - for (const child of node.children) { 34 + for (const child of node["children"]) { 43 35 const err = validateSunburstNode(child, depth + 1); 44 36 if (err) return err; 45 37 } ··· 66 58 67 59 if (!isObject(parsed)) return { ok: false, error: "Data must be an object" }; 68 60 69 - if (!Array.isArray(parsed.nodes)) 61 + if (!Array.isArray(parsed["nodes"])) 70 62 return { ok: false, error: "'nodes' must be an array" }; 71 - if (!Array.isArray(parsed.links)) 63 + if (!Array.isArray(parsed["links"])) 72 64 return { ok: false, error: "'links' must be an array" }; 73 65 74 - if (parsed.nodes.length > MAX_NODES) 66 + if (parsed["nodes"].length > MAX_NODES) 75 67 return { ok: false, error: `Exceeds max of ${MAX_NODES} nodes` }; 76 - if (parsed.links.length > MAX_LINKS) 68 + if (parsed["links"].length > MAX_LINKS) 77 69 return { ok: false, error: `Exceeds max of ${MAX_LINKS} links` }; 78 70 79 - for (const node of parsed.nodes) { 71 + for (const node of parsed["nodes"]) { 80 72 if (!isObject(node)) 81 73 return { ok: false, error: "Each node must be an object" }; 82 - if (typeof node.id !== "string" || node.id.length === 0) 74 + if (typeof node["id"] !== "string" || node["id"].length === 0) 83 75 return { 84 76 ok: false, 85 77 error: "Each node must have a non-empty 'id' string", 86 78 }; 87 - if (node.label !== undefined && typeof node.label !== "string") 79 + if (node["label"] !== undefined && typeof node["label"] !== "string") 88 80 return { ok: false, error: "Node 'label' must be a string" }; 89 - if (node.group !== undefined && typeof node.group !== "string") 81 + if (node["group"] !== undefined && typeof node["group"] !== "string") 90 82 return { ok: false, error: "Node 'group' must be a string" }; 91 83 } 92 84 93 - const nodeIds = new Set((parsed.nodes as ForceGraphNode[]).map((n) => n.id)); 85 + const nodeIds = new Set( 86 + (parsed["nodes"] as ForceGraphNode[]).map((n) => n.id), 87 + ); 94 88 95 - for (const link of parsed.links) { 89 + for (const link of parsed["links"]) { 96 90 if (!isObject(link)) 97 91 return { ok: false, error: "Each link must be an object" }; 98 - if (typeof link.source !== "string" || link.source.length === 0) 92 + if (typeof link["source"] !== "string" || link["source"].length === 0) 99 93 return { 100 94 ok: false, 101 95 error: "Each link must have a non-empty 'source' string", 102 96 }; 103 - if (typeof link.target !== "string" || link.target.length === 0) 97 + if (typeof link["target"] !== "string" || link["target"].length === 0) 104 98 return { 105 99 ok: false, 106 100 error: "Each link must have a non-empty 'target' string", 107 101 }; 108 - if (link.label !== undefined && typeof link.label !== "string") 102 + if (link["label"] !== undefined && typeof link["label"] !== "string") 109 103 return { ok: false, error: "Link 'label' must be a string" }; 110 - if (!nodeIds.has(link.source as string)) 104 + if (!nodeIds.has(link["source"] as string)) 111 105 return { 112 106 ok: false, 113 - error: `Link source '${link.source}' not found in nodes`, 107 + error: `Link source '${link["source"]}' not found in nodes`, 114 108 }; 115 - if (!nodeIds.has(link.target as string)) 109 + if (!nodeIds.has(link["target"] as string)) 116 110 return { 117 111 ok: false, 118 - error: `Link target '${link.target}' not found in nodes`, 112 + error: `Link target '${link["target"]}' not found in nodes`, 119 113 }; 120 114 } 121 115 ··· 138 132 } 139 133 140 134 if (!isObject(parsed)) return { ok: false, error: "Data must be an object" }; 141 - if (!isObject(parsed.root)) 135 + if (!isObject(parsed["root"])) 142 136 return { ok: false, error: "'root' must be an object" }; 143 137 144 - const err = validateSunburstNode(parsed.root, 1); 138 + const err = validateSunburstNode(parsed["root"], 1); 145 139 if (err) return { ok: false, error: err }; 146 140 147 141 return { ok: true, data: parsed as unknown as SunburstData };
+1 -1
src/server/db/index.ts
··· 2 2 import { initSchema } from "./schema.ts"; 3 3 import { seedIfEmpty } from "./seed.ts"; 4 4 5 - const DB_PATH = process.env.DB_PATH ?? "lichen.db"; 5 + const DB_PATH = process.env["DB_PATH"] ?? "lichen.db"; 6 6 7 7 let db: Database | null = null; 8 8
+3 -13
src/server/db/queries/index.ts
··· 1 1 // Barrel re-export — all query functions accessible from "db/queries" 2 - export type { 3 - BacklinkRow, 4 - BlobRow, 5 - BookmarkRow, 6 - CurrentNoteRow, 7 - MembershipRow, 8 - NoteRow, 9 - RequestRow, 10 - SnapshotRow, 11 - WikiRow, 12 - } from "../types.ts"; 13 - export { getBlobsByCids, insertBlob } from "./blob.ts"; 2 + export type { MembershipRow, RequestRow, WikiRow } from "../types.ts"; 3 + export { insertBlob } from "./blob.ts"; 14 4 export { 15 5 deleteBookmarkByUri, 16 6 deleteBookmarkByWiki, ··· 32 22 upsertMembership, 33 23 upsertRequest, 34 24 } from "./membership.ts"; 35 - export type { NoteSearchResult, NoteWithCurrent } from "./note.ts"; 25 + export type { NoteSearchResult } from "./note.ts"; 36 26 export { 37 27 createNote, 38 28 deleteNoteByAtUri,
+1 -1
src/server/db/queries/note.ts
··· 18 18 return prefix + content.slice(start, end).replace(/\n/g, " ") + suffix; 19 19 } 20 20 21 - export interface NoteWithCurrent { 21 + interface NoteWithCurrent { 22 22 note: NoteRow; 23 23 current: CurrentNoteRow; 24 24 }
-8
src/server/db/types.ts
··· 48 48 created_at: string; 49 49 } 50 50 51 - export interface BookmarkRow { 52 - id: number; 53 - did: string; 54 - wiki_at_uri: string; 55 - at_uri: string; 56 - created_at: string; 57 - } 58 - 59 51 export interface MembershipRow { 60 52 id: number; 61 53 wiki_slug: string;
+1 -6
src/server/routes/blob.ts
··· 8 8 9 9 const LOCAL_BLOB_DIR = "data/blobs"; 10 10 11 - let idResolver = new IdResolver(); 12 - 13 - /** Replace the IdResolver instance (useful for testing). */ 14 - export function setIdResolver(resolver: IdResolver): void { 15 - idResolver = resolver; 16 - } 11 + const idResolver = new IdResolver(); 17 12 18 13 const MIME_TO_EXT: Record<string, string> = { 19 14 "image/jpeg": "jpg",
+4 -4
src/server/routes/explore.ts
··· 22 22 export const exploreRoutes = new Elysia() 23 23 .get("/explore", async ({ query, request }) => { 24 24 const ctx = await resolveRequestContext(request); 25 - const sort = parseSort(query.sort); 26 - const page = parsePage(query.page); 27 - const lang = (query.lang as string | undefined) || undefined; 25 + const sort = parseSort(query["sort"]); 26 + const page = parsePage(query["page"]); 27 + const lang = (query["lang"] as string | undefined) || undefined; 28 28 29 29 const { wikis, total } = listPublicWikisPaginated({ 30 30 sort, 31 31 limit: EXPLORE_LIMIT, 32 32 offset: (page - 1) * EXPLORE_LIMIT, 33 - language: lang, 33 + ...(lang && { language: lang }), 34 34 }); 35 35 36 36 const languages = getWikiLanguages();
+1 -1
src/server/routes/note.ts
··· 131 131 data.note.title, 132 132 html, 133 133 { 134 - scripts: hasViz ? VIZ_SCRIPTS : undefined, 134 + ...(hasViz && { scripts: VIZ_SCRIPTS }), 135 135 session: ctx.session, 136 136 sidebarNotes, 137 137 currentNoteSlug: params.noteSlug,
+10 -9
src/server/routes/search.ts
··· 30 30 export const searchRoutes = new Elysia().get( 31 31 "/search", 32 32 async ({ query, request }) => { 33 - const q = (query.q as string | undefined) ?? ""; 34 - const wikiSlug = (query.wiki as string | undefined) || undefined; 35 - const lang = (query.lang as string | undefined) || undefined; 33 + const q = (query["q"] as string | undefined) ?? ""; 34 + const wikiSlug = (query["wiki"] as string | undefined) || null; 35 + const lang = (query["lang"] as string | undefined) || null; 36 36 37 - const ctx = await resolveRequestContext(request, wikiSlug); 37 + const ctx = await resolveRequestContext(request, wikiSlug ?? undefined); 38 38 39 39 // Inside a wiki: search notes within that wiki 40 40 if (wikiSlug) { ··· 50 50 } 51 51 52 52 // Home/explore: filter public wikis 53 - const sort = parseSort(query.sort); 54 - const page = parsePage(query.page); 55 - const limit = parseLimit(query.limit); 53 + const sort = parseSort(query["sort"]); 54 + const page = parsePage(query["page"]); 55 + const limit = parseLimit(query["limit"]); 56 56 57 + const trimmedQ = q.trim(); 57 58 const { wikis, total } = listPublicWikisPaginated({ 58 - query: q.trim() || undefined, 59 - language: lang, 59 + ...(trimmedQ && { query: trimmedQ }), 60 + ...(lang && { language: lang }), 60 61 sort, 61 62 limit, 62 63 offset: (page - 1) * limit,
+1 -1
src/server/routes/wiki.ts
··· 168 168 homeData.note.title, 169 169 html, 170 170 { 171 - scripts: hasViz ? VIZ_SCRIPTS : undefined, 171 + ...(hasViz && { scripts: VIZ_SCRIPTS }), 172 172 session: ctx.session, 173 173 sidebarNotes, 174 174 currentNoteSlug: "home",
+1 -1
src/views/settings.ts
··· 10 10 THEME, 11 11 } from "./theme.ts"; 12 12 13 - export interface SettingsPageOptions extends LayoutOptions { 13 + interface SettingsPageOptions extends LayoutOptions { 14 14 wikiDid: string; 15 15 error?: string; 16 16 }
+1 -1
src/views/wiki-list.ts
··· 7 7 import { THEME } from "./theme.ts"; 8 8 import { wikiCard } from "./wiki-card.ts"; 9 9 10 - export interface WikiToolbarOptions { 10 + interface WikiToolbarOptions { 11 11 sort: WikiSort; 12 12 gridTargetId: string; 13 13 limit: number;
+22 -22
tests/atproto/env.test.ts
··· 39 39 40 40 describe("getAtprotoEnv", () => { 41 41 test("returns null when PUBLIC_URL is missing", () => { 42 - delete process.env.PUBLIC_URL; 43 - delete process.env.OAUTH_PRIVATE_KEY_PATH; 42 + delete process.env["PUBLIC_URL"]; 43 + delete process.env["OAUTH_PRIVATE_KEY_PATH"]; 44 44 expect(getAtprotoEnv()).toBeNull(); 45 45 }); 46 46 47 47 test("returns null when OAUTH_PRIVATE_KEY_PATH is missing", () => { 48 - process.env.PUBLIC_URL = "https://lichen.wiki"; 49 - delete process.env.OAUTH_PRIVATE_KEY_PATH; 48 + process.env["PUBLIC_URL"] = "https://lichen.wiki"; 49 + delete process.env["OAUTH_PRIVATE_KEY_PATH"]; 50 50 expect(getAtprotoEnv()).toBeNull(); 51 51 }); 52 52 53 53 test("returns env when both are set", () => { 54 - process.env.PUBLIC_URL = "https://lichen.wiki"; 55 - process.env.OAUTH_PRIVATE_KEY_PATH = "/path/to/key.pem"; 54 + process.env["PUBLIC_URL"] = "https://lichen.wiki"; 55 + process.env["OAUTH_PRIVATE_KEY_PATH"] = "/path/to/key.pem"; 56 56 const env = getAtprotoEnv(); 57 57 expect(env).toEqual({ 58 58 publicUrl: "https://lichen.wiki", ··· 63 63 64 64 describe("isAuthEnabled", () => { 65 65 test("returns false when env vars missing", () => { 66 - delete process.env.PUBLIC_URL; 67 - delete process.env.OAUTH_PRIVATE_KEY_PATH; 66 + delete process.env["PUBLIC_URL"]; 67 + delete process.env["OAUTH_PRIVATE_KEY_PATH"]; 68 68 expect(isAuthEnabled()).toBe(false); 69 69 }); 70 70 71 71 test("returns true when env vars set", () => { 72 - process.env.PUBLIC_URL = "https://lichen.wiki"; 73 - process.env.OAUTH_PRIVATE_KEY_PATH = "/path/to/key.pem"; 72 + process.env["PUBLIC_URL"] = "https://lichen.wiki"; 73 + process.env["OAUTH_PRIVATE_KEY_PATH"] = "/path/to/key.pem"; 74 74 expect(isAuthEnabled()).toBe(true); 75 75 }); 76 76 }); 77 77 78 78 describe("getRelayUrl", () => { 79 79 test("defaults to bsky.network", () => { 80 - delete process.env.RELAY_URL; 80 + delete process.env["RELAY_URL"]; 81 81 expect(getRelayUrl()).toBe("wss://bsky.network"); 82 82 }); 83 83 84 84 test("reads from env", () => { 85 - process.env.RELAY_URL = "wss://custom.relay"; 85 + process.env["RELAY_URL"] = "wss://custom.relay"; 86 86 expect(getRelayUrl()).toBe("wss://custom.relay"); 87 87 }); 88 88 }); 89 89 90 90 describe("getHandleResolverUrl", () => { 91 91 test("defaults to bsky.social", () => { 92 - delete process.env.HANDLE_RESOLVER_URL; 92 + delete process.env["HANDLE_RESOLVER_URL"]; 93 93 expect(getHandleResolverUrl()).toBe("https://bsky.social"); 94 94 }); 95 95 96 96 test("reads from env", () => { 97 - process.env.HANDLE_RESOLVER_URL = "https://custom.resolver"; 97 + process.env["HANDLE_RESOLVER_URL"] = "https://custom.resolver"; 98 98 expect(getHandleResolverUrl()).toBe("https://custom.resolver"); 99 99 }); 100 100 }); 101 101 102 102 describe("getDevPdsUrl", () => { 103 103 test("returns null when not set", () => { 104 - delete process.env.DEV_PDS_URL; 104 + delete process.env["DEV_PDS_URL"]; 105 105 expect(getDevPdsUrl()).toBeNull(); 106 106 }); 107 107 108 108 test("reads from env", () => { 109 - process.env.DEV_PDS_URL = "http://localhost:2583"; 109 + process.env["DEV_PDS_URL"] = "http://localhost:2583"; 110 110 expect(getDevPdsUrl()).toBe("http://localhost:2583"); 111 111 }); 112 112 }); 113 113 114 114 describe("getDevPlcUrl", () => { 115 115 test("returns null when not set", () => { 116 - delete process.env.DEV_PLC_URL; 116 + delete process.env["DEV_PLC_URL"]; 117 117 expect(getDevPlcUrl()).toBeNull(); 118 118 }); 119 119 120 120 test("reads from env", () => { 121 - process.env.DEV_PLC_URL = "http://localhost:2582"; 121 + process.env["DEV_PLC_URL"] = "http://localhost:2582"; 122 122 expect(getDevPlcUrl()).toBe("http://localhost:2582"); 123 123 }); 124 124 }); 125 125 126 126 describe("getDevAccounts", () => { 127 127 test("returns null when not set", () => { 128 - delete process.env.DEV_ACCOUNTS; 128 + delete process.env["DEV_ACCOUNTS"]; 129 129 expect(getDevAccounts()).toBeNull(); 130 130 }); 131 131 132 132 test("parses valid JSON", () => { 133 - process.env.DEV_ACCOUNTS = JSON.stringify({ 133 + process.env["DEV_ACCOUNTS"] = JSON.stringify({ 134 134 alice: { 135 135 did: "did:plc:alice", 136 136 handle: "alice.test", ··· 138 138 }, 139 139 }); 140 140 const accounts = getDevAccounts(); 141 - expect(accounts?.alice?.did).toBe("did:plc:alice"); 141 + expect(accounts?.["alice"]?.did).toBe("did:plc:alice"); 142 142 }); 143 143 144 144 test("returns null for malformed JSON", () => { 145 - process.env.DEV_ACCOUNTS = "{not json}"; 145 + process.env["DEV_ACCOUNTS"] = "{not json}"; 146 146 expect(getDevAccounts()).toBeNull(); 147 147 }); 148 148 });
+54 -44
tests/atproto/pds.test.ts
··· 66 66 }); 67 67 68 68 const call = putRecordCalls[0]?.[0] as Record<string, unknown>; 69 - expect(call.repo).toBe(DID); 70 - expect(call.collection).toBe(COLLECTIONS.wiki); 71 - expect(call.rkey).toBe("my-wiki"); 69 + expect(call["repo"]).toBe(DID); 70 + expect(call["collection"]).toBe(COLLECTIONS.wiki); 71 + expect(call["rkey"]).toBe("my-wiki"); 72 72 73 - const record = call.record as Record<string, unknown>; 74 - expect(record.$type).toBe(COLLECTIONS.wiki); 75 - expect(record.name).toBe("My Wiki"); 76 - expect(record.visibility).toBe("public"); 77 - expect(record.language).toBe("en"); 78 - expect(record.description).toBe("A test wiki"); 73 + const record = call["record"] as Record<string, unknown>; 74 + expect(record["$type"]).toBe(COLLECTIONS.wiki); 75 + expect(record["name"]).toBe("My Wiki"); 76 + expect(record["visibility"]).toBe("public"); 77 + expect(record["language"]).toBe("en"); 78 + expect(record["description"]).toBe("A test wiki"); 79 79 }); 80 80 81 81 test("writeWikiRecord omits description when not provided", async () => { ··· 91 91 "fr", 92 92 ); 93 93 94 - const record = (putRecordCalls[0]?.[0] as Record<string, unknown>) 95 - .record as Record<string, unknown>; 96 - expect(record.description).toBeUndefined(); 94 + const record = (putRecordCalls[0]?.[0] as Record<string, unknown>)[ 95 + "record" 96 + ] as Record<string, unknown>; 97 + expect(record["description"]).toBeUndefined(); 97 98 }); 98 99 99 100 test("writeNoteRecord passes correct collection and fields", async () => { ··· 110 111 ); 111 112 112 113 const call = putRecordCalls[0]?.[0] as Record<string, unknown>; 113 - expect(call.collection).toBe(COLLECTIONS.note); 114 - expect(call.rkey).toBe("tid123"); 114 + expect(call["collection"]).toBe(COLLECTIONS.note); 115 + expect(call["rkey"]).toBe("tid123"); 115 116 116 - const record = call.record as Record<string, unknown>; 117 - expect(record.slug).toBe("my-note"); 118 - expect(record.title).toBe("My Note"); 119 - expect(record.wikiRef).toBe("at://did:plc:test/wiki.lichen.wiki/my-wiki"); 117 + const record = call["record"] as Record<string, unknown>; 118 + expect(record["slug"]).toBe("my-note"); 119 + expect(record["title"]).toBe("My Note"); 120 + expect(record["wikiRef"]).toBe( 121 + "at://did:plc:test/wiki.lichen.wiki/my-wiki", 122 + ); 120 123 }); 121 124 122 125 test("writeRevisionRecord passes correct fields", async () => { ··· 135 138 ); 136 139 137 140 const call = putRecordCalls[0]?.[0] as Record<string, unknown>; 138 - expect(call.collection).toBe(COLLECTIONS.noteRevision); 141 + expect(call["collection"]).toBe(COLLECTIONS.noteRevision); 139 142 140 - const record = call.record as Record<string, unknown>; 141 - expect(record.noteRef).toBe("at://did:plc:test/wiki.lichen.note/tid123"); 142 - expect(record.parentRevision).toBe( 143 + const record = call["record"] as Record<string, unknown>; 144 + expect(record["noteRef"]).toBe("at://did:plc:test/wiki.lichen.note/tid123"); 145 + expect(record["parentRevision"]).toBe( 143 146 "at://did:plc:test/wiki.lichen.noteRevision/prev", 144 147 ); 145 - expect(record.diff).toBeDefined(); 146 - expect(record.diffFormat).toBe("diff-match-patch"); 147 - expect(record.message).toBe("fix typo"); 148 - expect(record.blobs).toEqual([{ cid: "bafyblob1", mimeType: "image/png" }]); 148 + expect(record["diff"]).toBeDefined(); 149 + expect(record["diffFormat"]).toBe("diff-match-patch"); 150 + expect(record["message"]).toBe("fix typo"); 151 + expect(record["blobs"]).toEqual([ 152 + { cid: "bafyblob1", mimeType: "image/png" }, 153 + ]); 149 154 }); 150 155 151 156 test("writeRevisionRecord omits optional fields when null/undefined", async () => { ··· 162 167 TIMESTAMP, 163 168 ); 164 169 165 - const record = (putRecordCalls[0]?.[0] as Record<string, unknown>) 166 - .record as Record<string, unknown>; 167 - expect(record.parentRevision).toBeUndefined(); 168 - expect(record.message).toBeUndefined(); 169 - expect(record.blobs).toBeUndefined(); 170 + const record = (putRecordCalls[0]?.[0] as Record<string, unknown>)[ 171 + "record" 172 + ] as Record<string, unknown>; 173 + expect(record["parentRevision"]).toBeUndefined(); 174 + expect(record["message"]).toBeUndefined(); 175 + expect(record["blobs"]).toBeUndefined(); 170 176 }); 171 177 172 178 test("writeMembershipRecord passes correct fields", async () => { ··· 183 189 ); 184 190 185 191 const call = putRecordCalls[0]?.[0] as Record<string, unknown>; 186 - expect(call.collection).toBe(COLLECTIONS.membership); 192 + expect(call["collection"]).toBe(COLLECTIONS.membership); 187 193 188 - const record = call.record as Record<string, unknown>; 189 - expect(record.memberDid).toBe("did:plc:member"); 190 - expect(record.role).toBe("contributor"); 194 + const record = call["record"] as Record<string, unknown>; 195 + expect(record["memberDid"]).toBe("did:plc:member"); 196 + expect(record["role"]).toBe("contributor"); 191 197 }); 192 198 193 199 test("writeMemberRequestRecord passes correct fields", async () => { ··· 202 208 ); 203 209 204 210 const call = putRecordCalls[0]?.[0] as Record<string, unknown>; 205 - expect(call.collection).toBe(COLLECTIONS.memberRequest); 211 + expect(call["collection"]).toBe(COLLECTIONS.memberRequest); 206 212 207 - const record = call.record as Record<string, unknown>; 208 - expect(record.wikiRef).toBe("at://did:plc:test/wiki.lichen.wiki/my-wiki"); 213 + const record = call["record"] as Record<string, unknown>; 214 + expect(record["wikiRef"]).toBe( 215 + "at://did:plc:test/wiki.lichen.wiki/my-wiki", 216 + ); 209 217 }); 210 218 211 219 test("writeBookmarkRecord passes correct fields", async () => { ··· 220 228 ); 221 229 222 230 const call = putRecordCalls[0]?.[0] as Record<string, unknown>; 223 - expect(call.collection).toBe(COLLECTIONS.bookmark); 231 + expect(call["collection"]).toBe(COLLECTIONS.bookmark); 224 232 225 - const record = call.record as Record<string, unknown>; 226 - expect(record.wikiRef).toBe("at://did:plc:test/wiki.lichen.wiki/my-wiki"); 233 + const record = call["record"] as Record<string, unknown>; 234 + expect(record["wikiRef"]).toBe( 235 + "at://did:plc:test/wiki.lichen.wiki/my-wiki", 236 + ); 227 237 }); 228 238 229 239 test("deleteRecord passes correct arguments", async () => { ··· 232 242 await deleteRecord(agent, DID, COLLECTIONS.membership, "rkey123"); 233 243 234 244 const call = deleteRecordCalls[0]?.[0] as Record<string, unknown>; 235 - expect(call.repo).toBe(DID); 236 - expect(call.collection).toBe(COLLECTIONS.membership); 237 - expect(call.rkey).toBe("rkey123"); 245 + expect(call["repo"]).toBe(DID); 246 + expect(call["collection"]).toBe(COLLECTIONS.membership); 247 + expect(call["rkey"]).toBe("rkey123"); 238 248 }); 239 249 });
+4 -4
tests/atproto/session.test.ts
··· 82 82 }); 83 83 84 84 describe("getDevSession", () => { 85 - const origAccounts = process.env.DEV_ACCOUNTS; 85 + const origAccounts = process.env["DEV_ACCOUNTS"]; 86 86 87 87 beforeAll(() => { 88 - process.env.DEV_ACCOUNTS = JSON.stringify({ 88 + process.env["DEV_ACCOUNTS"] = JSON.stringify({ 89 89 alice: { 90 90 did: "did:plc:devalice", 91 91 handle: "alice.test", ··· 96 96 97 97 afterAll(() => { 98 98 if (origAccounts === undefined) { 99 - delete process.env.DEV_ACCOUNTS; 99 + delete process.env["DEV_ACCOUNTS"]; 100 100 } else { 101 - process.env.DEV_ACCOUNTS = origAccounts; 101 + process.env["DEV_ACCOUNTS"] = origAccounts; 102 102 } 103 103 }); 104 104
+1 -1
tests/integration/helpers.ts
··· 182 182 createdAt: new Date().toISOString(), 183 183 }; 184 184 if (parentRevision) { 185 - record.parentRevision = parentRevision; 185 + record["parentRevision"] = parentRevision; 186 186 } 187 187 const result = await agent.com.atproto.repo.putRecord({ 188 188 repo: did,
+1 -1
tests/preload.ts
··· 1 - process.env.DB_PATH = ":memory:"; 1 + process.env["DB_PATH"] = ":memory:";
+4 -4
tests/server/db/queries/blob.test.ts
··· 33 33 .query("SELECT * FROM blobs WHERE cid = ?") 34 34 .get("bafytest-blob-1") as Record<string, unknown> | null; 35 35 expect(row).not.toBeNull(); 36 - expect(row?.mime_type).toBe("image/png"); 37 - expect(row?.storage_key).toBe("data/blobs/test1.png"); 36 + expect(row?.["mime_type"]).toBe("image/png"); 37 + expect(row?.["storage_key"]).toBe("data/blobs/test1.png"); 38 38 }); 39 39 40 40 test("INSERT OR IGNORE on duplicate CID", () => { ··· 56 56 .query("SELECT * FROM blobs WHERE cid = ?") 57 57 .get("bafytest-blob-dup") as Record<string, unknown> | null; 58 58 // Original values preserved 59 - expect(row?.mime_type).toBe("image/jpeg"); 60 - expect(row?.storage_key).toBe("data/blobs/first.jpg"); 59 + expect(row?.["mime_type"]).toBe("image/jpeg"); 60 + expect(row?.["storage_key"]).toBe("data/blobs/first.jpg"); 61 61 }); 62 62 }); 63 63
+6 -10
tsconfig.json
··· 1 1 { 2 2 "compilerOptions": { 3 - // Environment setup & latest features 4 3 "lib": ["ESNext"], 5 4 "target": "ESNext", 6 5 "module": "Preserve", 7 - "moduleDetection": "force", 8 - "jsx": "react-jsx", 9 - "allowJs": true, 10 6 11 7 // Bundler mode 12 8 "moduleResolution": "bundler", ··· 14 10 "verbatimModuleSyntax": true, 15 11 "noEmit": true, 16 12 17 - // Best practices 13 + // Strict 18 14 "strict": true, 19 15 "skipLibCheck": true, 20 16 "noFallthroughCasesInSwitch": true, 21 17 "noUncheckedIndexedAccess": true, 22 18 "noImplicitOverride": true, 23 - 24 - // Some stricter flags (disabled by default) 25 - "noUnusedLocals": false, 26 - "noUnusedParameters": false, 27 - "noPropertyAccessFromIndexSignature": false 19 + "noUnusedLocals": true, 20 + "noUnusedParameters": true, 21 + "noPropertyAccessFromIndexSignature": true, 22 + "exactOptionalPropertyTypes": true, 23 + "isolatedModules": true 28 24 }, 29 25 "exclude": ["public"] 30 26 }