social bookmarking for atproto

[appview] fix up linters and formatters, apply to project

hexmani.ac 738a61fc 0c25bc2b

verified
+1
.idea/dictionaries/project.xml
··· 10 10 <w>jetstream</w> 11 11 <w>multiformats</w> 12 12 <w>rkey</w> 13 + <w>tseslint</w> 13 14 </words> 14 15 </dictionary> 15 16 </component>
+6
.idea/prettier.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <project version="4"> 3 + <component name="PrettierConfiguration"> 4 + <option name="myConfigurationMode" value="AUTOMATIC" /> 5 + </component> 6 + </project>
+2 -1
backend/.gitignore
··· 1 1 # deps 2 - ../../clippr-ts/node_modules/ 2 + node_modules/ 3 3 config.toml 4 4 *.db 5 + dist/
+1
backend/.prettierignore
··· 1 + pnpm-lock.yaml
+29
backend/.prettierrc
··· 1 + { 2 + "trailingComma": "all", 3 + "useTabs": true, 4 + "tabWidth": 2, 5 + "printWidth": 80, 6 + "semi": true, 7 + "singleQuote": false, 8 + "bracketSpacing": true, 9 + "overrides": [ 10 + { 11 + "files": [ 12 + "tsconfig.json", 13 + "jsconfig.json" 14 + ], 15 + "options": { 16 + "parser": "jsonc" 17 + } 18 + }, 19 + { 20 + "files": [ 21 + "*.md" 22 + ], 23 + "options": { 24 + "printWidth": 100, 25 + "proseWrap": "always" 26 + } 27 + } 28 + ] 29 + }
+4
backend/.vscode/settings.json
··· 1 + { 2 + "editor.defaultFormatter": "esbenp.prettier-vscode", 3 + "typescript.tsdk": "node_modules/typescript/lib" 4 + }
+13 -8
backend/README.md
··· 1 1 # clippr-be 2 + 2 3 typescript implementation of clippr appview using ~~bun~~ deno and hono 3 4 4 5 ## run and develop 6 + 5 7 ```sh 6 8 pnpm install 7 9 pnpm run dev ··· 10 12 open http://localhost:9090 and enjoy 11 13 12 14 ## current status 15 + 13 16 right now we're not running on bun because there are 14 - [some issues with the jetstream library](https://github.com/oven-sh/bun/issues/18807), which haven't been fixed yet. 17 + [some issues with the jetstream library](https://github.com/oven-sh/bun/issues/18807), which haven't 18 + been fixed yet. 15 19 16 20 ### checklist before it's usable 17 - * [ ] Ingesting content from the firehose (using Jetstream) 18 - * [ ] Creating the lexicon documents and validating content that comes in from the firehose 19 - * [ ] Indexing valid content from the firehose into a database 20 - * [ ] Handling OAuth authentication (public OAuth for the moment) 21 - * [ ] Creating responses to API calls 22 - * [ ] Create records through the API 23 - * [ ] Interact with the frontend 21 + 22 + - [x] Ingesting content from the firehose (using Jetstream) 23 + - [ ] Creating the lexicon documents and validating content that comes in from the firehose 24 + - [ ] Indexing valid content from the firehose into a database 25 + - [ ] Handling OAuth authentication (public OAuth for the moment) 26 + - [ ] Creating responses to API calls 27 + - [ ] Create records through the API 28 + - [ ] Interact with the frontend
+15 -10
backend/drizzle.config.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import {defineConfig} from 'drizzle-kit'; 8 - import {Config} from "./src/config.ts"; 7 + import { defineConfig } from "drizzle-kit"; 8 + import { Config } from "./src/config.ts"; 9 9 10 10 const config = Config.getInstance(); 11 - const dbname = config.get("database.name"); 11 + let dbname; 12 + 13 + dbname = config.get("database.name"); 14 + if (typeof dbname !== "string") { 15 + dbname = "file:clippr.db"; // Only way to disable linter error 16 + } 12 17 13 18 export default defineConfig({ 14 - out: './drizzle', 15 - schema: './src/db/schema.ts', 16 - dialect: 'sqlite', 17 - dbCredentials: { 18 - url: dbname, 19 - }, 20 - }); 19 + out: "./drizzle", 20 + schema: "./src/db/schema.ts", 21 + dialect: "sqlite", 22 + dbCredentials: { 23 + url: dbname, 24 + }, 25 + });
-12
backend/eslint.config.mjs
··· 1 - import js from "@eslint/js"; 2 - import globals from "globals"; 3 - import tseslint from "typescript-eslint"; 4 - import {defineConfig} from "eslint/config"; 5 - 6 - 7 - export default defineConfig([ 8 - {files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], plugins: {js}, extends: ["js/recommended"]}, 9 - {files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], languageOptions: {globals: globals.browser}}, 10 - tseslint.configs.recommended, 11 - tseslint.configs.stylistic 12 - ]);
+21
backend/eslint.config.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + // @ts-check 8 + 9 + import eslint from "@eslint/js"; 10 + import tseslint from "typescript-eslint"; 11 + import { FlatCompat } from "@eslint/eslintrc"; 12 + import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; 13 + 14 + const compat = new FlatCompat({ baseDirectory: import.meta.dirname }); 15 + 16 + export default tseslint.config( 17 + eslint.configs.recommended, 18 + tseslint.configs.recommended, 19 + eslintPluginPrettierRecommended, 20 + compat.extends("plugin:drizzle/recommended"), 21 + );
+2 -4
backend/lexicons/social/clippr/actor/defs.json
··· 1 1 { 2 2 "lexicon": 1, 3 3 "id": "social.clippr.actor.defs", 4 - "defs": { 5 - 6 - } 7 - } 4 + "defs": {} 5 + }
+9 -3
backend/lexicons/social/clippr/actor/profile.json
··· 24 24 "avatar": { 25 25 "type": "blob", 26 26 "description": "Image to show on user's profiles.", 27 - "accept": ["image/png", "image/jpeg"], 27 + "accept": [ 28 + "image/png", 29 + "image/jpeg" 30 + ], 28 31 "maxSize": 1000000 29 32 }, 30 - "createdAt": { "type": "string", "format": "datetime" } 33 + "createdAt": { 34 + "type": "string", 35 + "format": "datetime" 36 + } 31 37 } 32 38 } 33 39 } 34 40 } 35 - } 41 + }
+2 -4
backend/lexicons/social/clippr/clips/defs.json
··· 1 1 { 2 2 "lexicon": 1, 3 3 "id": "social.clippr.clips.defs", 4 - "defs": { 5 - 6 - } 7 - } 4 + "defs": {} 5 + }
+1 -1
backend/lexicons/social/clippr/clips/item.json
··· 76 76 } 77 77 } 78 78 } 79 - } 79 + }
+1 -1
backend/lexicons/social/clippr/clips/tag.json
··· 34 34 } 35 35 } 36 36 } 37 - } 37 + }
+2 -4
backend/lexicons/social/clippr/feed/defs.json
··· 1 1 { 2 2 "lexicon": 1, 3 3 "id": "social.clippr.feed.defs", 4 - "defs": { 5 - 6 - } 7 - } 4 + "defs": {} 5 + }
+2 -4
backend/lexicons/social/clippr/reacts/defs.json
··· 1 1 { 2 2 "lexicon": 1, 3 3 "id": "social.clippr.reacts.defs", 4 - "defs": { 5 - 6 - } 7 - } 4 + "defs": {} 5 + }
+22 -8
backend/package.json
··· 2 2 "name": "clippr-be", 3 3 "version": "0.1.0", 4 4 "private": "true", 5 - "homepage": "https://tangled.sh/@hexmani.ac/clippr", 5 + "repository": "https://tangled.sh/@hexmani.ac/clippr", 6 6 "license": "AGPL-3.0-only", 7 7 "scripts": { 8 8 "dev": "tsx watch src/main.ts", 9 9 "build": "tsc", 10 - "start": "node dist/index.js" 10 + "start": "node dist/index.js", 11 + "lint": "npx eslint .", 12 + "lint-write": "npx eslint . --fix", 13 + "fmt": "npx prettier --write .", 14 + "drizzle-push": "npx drizzle-kit push" 11 15 }, 12 16 "type": "module", 17 + "main": "src/main.ts", 13 18 "dependencies": { 19 + "@eslint/eslintrc": "^3.3.1", 14 20 "@hono/node-server": "^1.15.0", 15 - "hono": "^4.8.3", 16 - "drizzle-orm": "^0.44.2", 17 21 "@libsql/client": "^0.15.9", 18 22 "@skyware/jetstream": "^0.2.2", 23 + "drizzle-orm": "^0.44.2", 24 + "hono": "^4.8.3", 19 25 "toml": "^3.0.0" 20 26 }, 21 27 "devDependencies": { 22 - "eslint": "^9.30.1", 23 28 "@eslint/js": "^9.30.1", 24 - "typescript-eslint": "^8.35.1", 29 + "@typescript-eslint/eslint-plugin": "^8.35.1", 30 + "@typescript-eslint/parser": "^8.35.1", 25 31 "drizzle-kit": "^0.31.4", 32 + "eslint": "^9.30.1", 33 + "eslint-config-prettier": "^10.1.5", 34 + "eslint-plugin-drizzle": "^0.2.3", 35 + "eslint-plugin-import": "^2.32.0", 36 + "eslint-plugin-prettier": "^5.5.1", 26 37 "globals": "^16.3.0", 38 + "jiti": "^2.4.2", 39 + "prettier": "^3.6.2", 27 40 "tsx": "^4.20.3", 28 - "typescript": "^5.8.3" 41 + "typescript": "^5.8.3", 42 + "typescript-eslint": "^8.35.1" 29 43 } 30 - } 44 + }
+1294 -24
backend/pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 + '@eslint/eslintrc': 12 + specifier: ^3.3.1 13 + version: 3.3.1 11 14 '@hono/node-server': 12 15 specifier: ^1.15.0 13 16 version: 1.15.0(hono@4.8.3) ··· 30 33 '@eslint/js': 31 34 specifier: ^9.30.1 32 35 version: 9.30.1 36 + '@typescript-eslint/eslint-plugin': 37 + specifier: ^8.35.1 38 + version: 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 39 + '@typescript-eslint/parser': 40 + specifier: ^8.35.1 41 + version: 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 33 42 drizzle-kit: 34 43 specifier: ^0.31.4 35 44 version: 0.31.4 36 45 eslint: 37 46 specifier: ^9.30.1 38 - version: 9.30.1 47 + version: 9.30.1(jiti@2.4.2) 48 + eslint-config-prettier: 49 + specifier: ^10.1.5 50 + version: 10.1.5(eslint@9.30.1(jiti@2.4.2)) 51 + eslint-plugin-drizzle: 52 + specifier: ^0.2.3 53 + version: 0.2.3(eslint@9.30.1(jiti@2.4.2)) 54 + eslint-plugin-import: 55 + specifier: ^2.32.0 56 + version: 2.32.0(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)) 57 + eslint-plugin-prettier: 58 + specifier: ^5.5.1 59 + version: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2) 39 60 globals: 40 61 specifier: ^16.3.0 41 62 version: 16.3.0 63 + jiti: 64 + specifier: ^2.4.2 65 + version: 2.4.2 66 + prettier: 67 + specifier: ^3.6.2 68 + version: 3.6.2 42 69 tsx: 43 70 specifier: ^4.20.3 44 71 version: 4.20.3 ··· 47 74 version: 5.8.3 48 75 typescript-eslint: 49 76 specifier: ^8.35.1 50 - version: 8.35.1(eslint@9.30.1)(typescript@5.8.3) 77 + version: 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 51 78 52 79 packages: 53 80 ··· 496 523 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 497 524 engines: {node: '>= 8'} 498 525 526 + '@pkgr/core@0.2.7': 527 + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} 528 + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 529 + 530 + '@rtsao/scc@1.1.0': 531 + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 532 + 499 533 '@skyware/jetstream@0.2.2': 500 534 resolution: {integrity: sha512-d1MtWPTIFEciSzV8OClXZCJoz0DJ7aupt4EZSwpGAASYG0ZIPmZTt7RVJkoFzQyqRPHAMD7CvEwu0ut3MHX1og==} 501 535 ··· 504 538 505 539 '@types/json-schema@7.0.15': 506 540 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 541 + 542 + '@types/json5@0.0.29': 543 + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 507 544 508 545 '@types/node@24.0.10': 509 546 resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} ··· 590 627 argparse@2.0.1: 591 628 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 592 629 630 + array-buffer-byte-length@1.0.2: 631 + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 632 + engines: {node: '>= 0.4'} 633 + 634 + array-includes@3.1.9: 635 + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} 636 + engines: {node: '>= 0.4'} 637 + 638 + array.prototype.findlastindex@1.2.6: 639 + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} 640 + engines: {node: '>= 0.4'} 641 + 642 + array.prototype.flat@1.3.3: 643 + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} 644 + engines: {node: '>= 0.4'} 645 + 646 + array.prototype.flatmap@1.3.3: 647 + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 648 + engines: {node: '>= 0.4'} 649 + 650 + arraybuffer.prototype.slice@1.0.4: 651 + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 652 + engines: {node: '>= 0.4'} 653 + 654 + async-function@1.0.0: 655 + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 656 + engines: {node: '>= 0.4'} 657 + 658 + available-typed-arrays@1.0.7: 659 + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 660 + engines: {node: '>= 0.4'} 661 + 593 662 balanced-match@1.0.2: 594 663 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 595 664 ··· 609 678 bun-types@1.2.17: 610 679 resolution: {integrity: sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ==} 611 680 681 + call-bind-apply-helpers@1.0.2: 682 + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 683 + engines: {node: '>= 0.4'} 684 + 685 + call-bind@1.0.8: 686 + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 687 + engines: {node: '>= 0.4'} 688 + 689 + call-bound@1.0.4: 690 + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 691 + engines: {node: '>= 0.4'} 692 + 612 693 callsites@3.1.0: 613 694 resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 614 695 engines: {node: '>=6'} ··· 635 716 resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 636 717 engines: {node: '>= 12'} 637 718 719 + data-view-buffer@1.0.2: 720 + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 721 + engines: {node: '>= 0.4'} 722 + 723 + data-view-byte-length@1.0.2: 724 + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 725 + engines: {node: '>= 0.4'} 726 + 727 + data-view-byte-offset@1.0.1: 728 + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 729 + engines: {node: '>= 0.4'} 730 + 731 + debug@3.2.7: 732 + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 733 + peerDependencies: 734 + supports-color: '*' 735 + peerDependenciesMeta: 736 + supports-color: 737 + optional: true 738 + 638 739 debug@4.4.1: 639 740 resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 640 741 engines: {node: '>=6.0'} ··· 647 748 deep-is@0.1.4: 648 749 resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 649 750 751 + define-data-property@1.1.4: 752 + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 753 + engines: {node: '>= 0.4'} 754 + 755 + define-properties@1.2.1: 756 + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 757 + engines: {node: '>= 0.4'} 758 + 650 759 detect-libc@2.0.2: 651 760 resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} 652 761 engines: {node: '>=8'} 762 + 763 + doctrine@2.1.0: 764 + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 765 + engines: {node: '>=0.10.0'} 653 766 654 767 drizzle-kit@0.31.4: 655 768 resolution: {integrity: sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA==} ··· 747 860 sqlite3: 748 861 optional: true 749 862 863 + dunder-proto@1.0.1: 864 + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 865 + engines: {node: '>= 0.4'} 866 + 867 + es-abstract@1.24.0: 868 + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} 869 + engines: {node: '>= 0.4'} 870 + 871 + es-define-property@1.0.1: 872 + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 873 + engines: {node: '>= 0.4'} 874 + 875 + es-errors@1.3.0: 876 + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 877 + engines: {node: '>= 0.4'} 878 + 879 + es-object-atoms@1.1.1: 880 + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 881 + engines: {node: '>= 0.4'} 882 + 883 + es-set-tostringtag@2.1.0: 884 + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 885 + engines: {node: '>= 0.4'} 886 + 887 + es-shim-unscopables@1.1.0: 888 + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} 889 + engines: {node: '>= 0.4'} 890 + 891 + es-to-primitive@1.3.0: 892 + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 893 + engines: {node: '>= 0.4'} 894 + 750 895 esbuild-register@3.6.0: 751 896 resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} 752 897 peerDependencies: ··· 766 911 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 767 912 engines: {node: '>=10'} 768 913 914 + eslint-config-prettier@10.1.5: 915 + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} 916 + hasBin: true 917 + peerDependencies: 918 + eslint: '>=7.0.0' 919 + 920 + eslint-import-resolver-node@0.3.9: 921 + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 922 + 923 + eslint-module-utils@2.12.1: 924 + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} 925 + engines: {node: '>=4'} 926 + peerDependencies: 927 + '@typescript-eslint/parser': '*' 928 + eslint: '*' 929 + eslint-import-resolver-node: '*' 930 + eslint-import-resolver-typescript: '*' 931 + eslint-import-resolver-webpack: '*' 932 + peerDependenciesMeta: 933 + '@typescript-eslint/parser': 934 + optional: true 935 + eslint: 936 + optional: true 937 + eslint-import-resolver-node: 938 + optional: true 939 + eslint-import-resolver-typescript: 940 + optional: true 941 + eslint-import-resolver-webpack: 942 + optional: true 943 + 944 + eslint-plugin-drizzle@0.2.3: 945 + resolution: {integrity: sha512-BO+ymHo33IUNoJlC0rbd7HP9EwwpW4VIp49R/tWQF/d2E1K2kgTf0tCXT0v9MSiBr6gGR1LtPwMLapTKEWSg9A==} 946 + peerDependencies: 947 + eslint: '>=8.0.0' 948 + 949 + eslint-plugin-import@2.32.0: 950 + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} 951 + engines: {node: '>=4'} 952 + peerDependencies: 953 + '@typescript-eslint/parser': '*' 954 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 955 + peerDependenciesMeta: 956 + '@typescript-eslint/parser': 957 + optional: true 958 + 959 + eslint-plugin-prettier@5.5.1: 960 + resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} 961 + engines: {node: ^14.18.0 || >=16.0.0} 962 + peerDependencies: 963 + '@types/eslint': '>=8.0.0' 964 + eslint: '>=8.0.0' 965 + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' 966 + prettier: '>=3.0.0' 967 + peerDependenciesMeta: 968 + '@types/eslint': 969 + optional: true 970 + eslint-config-prettier: 971 + optional: true 972 + 769 973 eslint-scope@8.4.0: 770 974 resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 771 975 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} ··· 814 1018 fast-deep-equal@3.1.3: 815 1019 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 816 1020 1021 + fast-diff@1.3.0: 1022 + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 1023 + 817 1024 fast-glob@3.3.3: 818 1025 resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 819 1026 engines: {node: '>=8.6.0'} ··· 850 1057 flatted@3.3.3: 851 1058 resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 852 1059 1060 + for-each@0.3.5: 1061 + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} 1062 + engines: {node: '>= 0.4'} 1063 + 853 1064 formdata-polyfill@4.0.10: 854 1065 resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 855 1066 engines: {node: '>=12.20.0'} ··· 859 1070 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 860 1071 os: [darwin] 861 1072 1073 + function-bind@1.1.2: 1074 + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1075 + 1076 + function.prototype.name@1.1.8: 1077 + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 1078 + engines: {node: '>= 0.4'} 1079 + 1080 + functions-have-names@1.2.3: 1081 + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1082 + 1083 + get-intrinsic@1.3.0: 1084 + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 1085 + engines: {node: '>= 0.4'} 1086 + 1087 + get-proto@1.0.1: 1088 + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 1089 + engines: {node: '>= 0.4'} 1090 + 1091 + get-symbol-description@1.1.0: 1092 + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 1093 + engines: {node: '>= 0.4'} 1094 + 862 1095 get-tsconfig@4.10.1: 863 1096 resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} 864 1097 ··· 878 1111 resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} 879 1112 engines: {node: '>=18'} 880 1113 1114 + globalthis@1.0.4: 1115 + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 1116 + engines: {node: '>= 0.4'} 1117 + 1118 + gopd@1.2.0: 1119 + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 1120 + engines: {node: '>= 0.4'} 1121 + 881 1122 graphemer@1.4.0: 882 1123 resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 883 1124 1125 + has-bigints@1.1.0: 1126 + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 1127 + engines: {node: '>= 0.4'} 1128 + 884 1129 has-flag@4.0.0: 885 1130 resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 886 1131 engines: {node: '>=8'} 887 1132 1133 + has-property-descriptors@1.0.2: 1134 + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 1135 + 1136 + has-proto@1.2.0: 1137 + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 1138 + engines: {node: '>= 0.4'} 1139 + 1140 + has-symbols@1.1.0: 1141 + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 1142 + engines: {node: '>= 0.4'} 1143 + 1144 + has-tostringtag@1.0.2: 1145 + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1146 + engines: {node: '>= 0.4'} 1147 + 1148 + hasown@2.0.2: 1149 + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1150 + engines: {node: '>= 0.4'} 1151 + 888 1152 hono@4.8.3: 889 1153 resolution: {integrity: sha512-jYZ6ZtfWjzBdh8H/0CIFfCBHaFL75k+KMzaM177hrWWm2TWL39YMYaJgB74uK/niRc866NMlH9B8uCvIo284WQ==} 890 1154 engines: {node: '>=16.9.0'} ··· 905 1169 resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 906 1170 engines: {node: '>=0.8.19'} 907 1171 1172 + internal-slot@1.1.0: 1173 + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1174 + engines: {node: '>= 0.4'} 1175 + 1176 + is-array-buffer@3.0.5: 1177 + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 1178 + engines: {node: '>= 0.4'} 1179 + 1180 + is-async-function@2.1.1: 1181 + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} 1182 + engines: {node: '>= 0.4'} 1183 + 1184 + is-bigint@1.1.0: 1185 + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 1186 + engines: {node: '>= 0.4'} 1187 + 1188 + is-boolean-object@1.2.2: 1189 + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} 1190 + engines: {node: '>= 0.4'} 1191 + 1192 + is-callable@1.2.7: 1193 + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1194 + engines: {node: '>= 0.4'} 1195 + 1196 + is-core-module@2.16.1: 1197 + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1198 + engines: {node: '>= 0.4'} 1199 + 1200 + is-data-view@1.0.2: 1201 + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 1202 + engines: {node: '>= 0.4'} 1203 + 1204 + is-date-object@1.1.0: 1205 + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 1206 + engines: {node: '>= 0.4'} 1207 + 908 1208 is-extglob@2.1.1: 909 1209 resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 910 1210 engines: {node: '>=0.10.0'} 911 1211 1212 + is-finalizationregistry@1.1.1: 1213 + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 1214 + engines: {node: '>= 0.4'} 1215 + 1216 + is-generator-function@1.1.0: 1217 + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 1218 + engines: {node: '>= 0.4'} 1219 + 912 1220 is-glob@4.0.3: 913 1221 resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 914 1222 engines: {node: '>=0.10.0'} 915 1223 1224 + is-map@2.0.3: 1225 + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 1226 + engines: {node: '>= 0.4'} 1227 + 1228 + is-negative-zero@2.0.3: 1229 + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} 1230 + engines: {node: '>= 0.4'} 1231 + 1232 + is-number-object@1.1.1: 1233 + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 1234 + engines: {node: '>= 0.4'} 1235 + 916 1236 is-number@7.0.0: 917 1237 resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 918 1238 engines: {node: '>=0.12.0'} 919 1239 1240 + is-regex@1.2.1: 1241 + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1242 + engines: {node: '>= 0.4'} 1243 + 1244 + is-set@2.0.3: 1245 + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 1246 + engines: {node: '>= 0.4'} 1247 + 1248 + is-shared-array-buffer@1.0.4: 1249 + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 1250 + engines: {node: '>= 0.4'} 1251 + 1252 + is-string@1.1.1: 1253 + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 1254 + engines: {node: '>= 0.4'} 1255 + 1256 + is-symbol@1.1.1: 1257 + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 1258 + engines: {node: '>= 0.4'} 1259 + 1260 + is-typed-array@1.1.15: 1261 + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 1262 + engines: {node: '>= 0.4'} 1263 + 1264 + is-weakmap@2.0.2: 1265 + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 1266 + engines: {node: '>= 0.4'} 1267 + 1268 + is-weakref@1.1.1: 1269 + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} 1270 + engines: {node: '>= 0.4'} 1271 + 1272 + is-weakset@2.0.4: 1273 + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 1274 + engines: {node: '>= 0.4'} 1275 + 1276 + isarray@2.0.5: 1277 + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1278 + 920 1279 isexe@2.0.0: 921 1280 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1281 + 1282 + jiti@2.4.2: 1283 + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 1284 + hasBin: true 922 1285 923 1286 js-base64@3.7.7: 924 1287 resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} ··· 936 1299 json-stable-stringify-without-jsonify@1.0.1: 937 1300 resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 938 1301 1302 + json5@1.0.2: 1303 + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1304 + hasBin: true 1305 + 939 1306 keyv@4.5.4: 940 1307 resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 941 1308 ··· 955 1322 lodash.merge@4.6.2: 956 1323 resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 957 1324 1325 + math-intrinsics@1.1.0: 1326 + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1327 + engines: {node: '>= 0.4'} 1328 + 958 1329 merge2@1.4.1: 959 1330 resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 960 1331 engines: {node: '>= 8'} ··· 969 1340 minimatch@9.0.5: 970 1341 resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 971 1342 engines: {node: '>=16 || 14 >=14.17'} 1343 + 1344 + minimist@1.2.8: 1345 + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 972 1346 973 1347 ms@2.1.3: 974 1348 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} ··· 985 1359 resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 986 1360 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 987 1361 1362 + object-inspect@1.13.4: 1363 + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 1364 + engines: {node: '>= 0.4'} 1365 + 1366 + object-keys@1.1.1: 1367 + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1368 + engines: {node: '>= 0.4'} 1369 + 1370 + object.assign@4.1.7: 1371 + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1372 + engines: {node: '>= 0.4'} 1373 + 1374 + object.fromentries@2.0.8: 1375 + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 1376 + engines: {node: '>= 0.4'} 1377 + 1378 + object.groupby@1.0.3: 1379 + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} 1380 + engines: {node: '>= 0.4'} 1381 + 1382 + object.values@1.2.1: 1383 + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 1384 + engines: {node: '>= 0.4'} 1385 + 988 1386 optionator@0.9.4: 989 1387 resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 990 1388 engines: {node: '>= 0.8.0'} 991 1389 1390 + own-keys@1.0.1: 1391 + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1392 + engines: {node: '>= 0.4'} 1393 + 992 1394 p-limit@3.1.0: 993 1395 resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 994 1396 engines: {node: '>=10'} ··· 1012 1414 resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1013 1415 engines: {node: '>=8'} 1014 1416 1417 + path-parse@1.0.7: 1418 + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1419 + 1015 1420 picomatch@2.3.1: 1016 1421 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1017 1422 engines: {node: '>=8.6'} 1423 + 1424 + possible-typed-array-names@1.1.0: 1425 + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1426 + engines: {node: '>= 0.4'} 1018 1427 1019 1428 prelude-ls@1.2.1: 1020 1429 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1021 1430 engines: {node: '>= 0.8.0'} 1022 1431 1432 + prettier-linter-helpers@1.0.0: 1433 + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 1434 + engines: {node: '>=6.0.0'} 1435 + 1436 + prettier@3.6.2: 1437 + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 1438 + engines: {node: '>=14'} 1439 + hasBin: true 1440 + 1023 1441 promise-limit@2.7.0: 1024 1442 resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} 1025 1443 ··· 1030 1448 queue-microtask@1.2.3: 1031 1449 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1032 1450 1451 + reflect.getprototypeof@1.0.10: 1452 + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1453 + engines: {node: '>= 0.4'} 1454 + 1455 + regexp.prototype.flags@1.5.4: 1456 + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1457 + engines: {node: '>= 0.4'} 1458 + 1033 1459 resolve-from@4.0.0: 1034 1460 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1035 1461 engines: {node: '>=4'} ··· 1037 1463 resolve-pkg-maps@1.0.0: 1038 1464 resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1039 1465 1466 + resolve@1.22.10: 1467 + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1468 + engines: {node: '>= 0.4'} 1469 + hasBin: true 1470 + 1040 1471 reusify@1.1.0: 1041 1472 resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1042 1473 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} ··· 1044 1475 run-parallel@1.2.0: 1045 1476 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1046 1477 1478 + safe-array-concat@1.1.3: 1479 + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1480 + engines: {node: '>=0.4'} 1481 + 1482 + safe-push-apply@1.0.0: 1483 + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1484 + engines: {node: '>= 0.4'} 1485 + 1486 + safe-regex-test@1.1.0: 1487 + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1488 + engines: {node: '>= 0.4'} 1489 + 1490 + semver@6.3.1: 1491 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1492 + hasBin: true 1493 + 1047 1494 semver@7.7.2: 1048 1495 resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1049 1496 engines: {node: '>=10'} 1050 1497 hasBin: true 1051 1498 1499 + set-function-length@1.2.2: 1500 + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1501 + engines: {node: '>= 0.4'} 1502 + 1503 + set-function-name@2.0.2: 1504 + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1505 + engines: {node: '>= 0.4'} 1506 + 1507 + set-proto@1.0.0: 1508 + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1509 + engines: {node: '>= 0.4'} 1510 + 1052 1511 shebang-command@2.0.0: 1053 1512 resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1054 1513 engines: {node: '>=8'} ··· 1057 1516 resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1058 1517 engines: {node: '>=8'} 1059 1518 1519 + side-channel-list@1.0.0: 1520 + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1521 + engines: {node: '>= 0.4'} 1522 + 1523 + side-channel-map@1.0.1: 1524 + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1525 + engines: {node: '>= 0.4'} 1526 + 1527 + side-channel-weakmap@1.0.2: 1528 + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1529 + engines: {node: '>= 0.4'} 1530 + 1531 + side-channel@1.1.0: 1532 + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1533 + engines: {node: '>= 0.4'} 1534 + 1060 1535 source-map-support@0.5.21: 1061 1536 resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1062 1537 ··· 1064 1539 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1065 1540 engines: {node: '>=0.10.0'} 1066 1541 1542 + stop-iteration-iterator@1.1.0: 1543 + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} 1544 + engines: {node: '>= 0.4'} 1545 + 1546 + string.prototype.trim@1.2.10: 1547 + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1548 + engines: {node: '>= 0.4'} 1549 + 1550 + string.prototype.trimend@1.0.9: 1551 + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1552 + engines: {node: '>= 0.4'} 1553 + 1554 + string.prototype.trimstart@1.0.8: 1555 + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1556 + engines: {node: '>= 0.4'} 1557 + 1558 + strip-bom@3.0.0: 1559 + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1560 + engines: {node: '>=4'} 1561 + 1067 1562 strip-json-comments@3.1.1: 1068 1563 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1069 1564 engines: {node: '>=8'} ··· 1072 1567 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1073 1568 engines: {node: '>=8'} 1074 1569 1570 + supports-preserve-symlinks-flag@1.0.0: 1571 + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1572 + engines: {node: '>= 0.4'} 1573 + 1574 + synckit@0.11.8: 1575 + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 1576 + engines: {node: ^14.18.0 || >=16.0.0} 1577 + 1075 1578 to-regex-range@5.0.1: 1076 1579 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1077 1580 engines: {node: '>=8.0'} ··· 1085 1588 peerDependencies: 1086 1589 typescript: '>=4.8.4' 1087 1590 1591 + tsconfig-paths@3.15.0: 1592 + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 1593 + 1088 1594 tsx@4.20.3: 1089 1595 resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} 1090 1596 engines: {node: '>=18.0.0'} ··· 1094 1600 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1095 1601 engines: {node: '>= 0.8.0'} 1096 1602 1603 + typed-array-buffer@1.0.3: 1604 + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1605 + engines: {node: '>= 0.4'} 1606 + 1607 + typed-array-byte-length@1.0.3: 1608 + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1609 + engines: {node: '>= 0.4'} 1610 + 1611 + typed-array-byte-offset@1.0.4: 1612 + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1613 + engines: {node: '>= 0.4'} 1614 + 1615 + typed-array-length@1.0.7: 1616 + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1617 + engines: {node: '>= 0.4'} 1618 + 1097 1619 typescript-eslint@8.35.1: 1098 1620 resolution: {integrity: sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==} 1099 1621 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} ··· 1106 1628 engines: {node: '>=14.17'} 1107 1629 hasBin: true 1108 1630 1631 + unbox-primitive@1.1.0: 1632 + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1633 + engines: {node: '>= 0.4'} 1634 + 1109 1635 undici-types@7.8.0: 1110 1636 resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} 1111 1637 ··· 1116 1642 resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 1117 1643 engines: {node: '>= 8'} 1118 1644 1645 + which-boxed-primitive@1.1.1: 1646 + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1647 + engines: {node: '>= 0.4'} 1648 + 1649 + which-builtin-type@1.2.1: 1650 + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1651 + engines: {node: '>= 0.4'} 1652 + 1653 + which-collection@1.0.2: 1654 + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1655 + engines: {node: '>= 0.4'} 1656 + 1657 + which-typed-array@1.1.19: 1658 + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} 1659 + engines: {node: '>= 0.4'} 1660 + 1119 1661 which@2.0.2: 1120 1662 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1121 1663 engines: {node: '>= 8'} ··· 1302 1844 '@esbuild/win32-x64@0.25.5': 1303 1845 optional: true 1304 1846 1305 - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1)': 1847 + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': 1306 1848 dependencies: 1307 - eslint: 9.30.1 1849 + eslint: 9.30.1(jiti@2.4.2) 1308 1850 eslint-visitor-keys: 3.4.3 1309 1851 1310 1852 '@eslint-community/regexpp@4.12.1': {} ··· 1443 1985 '@nodelib/fs.scandir': 2.1.5 1444 1986 fastq: 1.19.1 1445 1987 1988 + '@pkgr/core@0.2.7': {} 1989 + 1990 + '@rtsao/scc@1.1.0': {} 1991 + 1446 1992 '@skyware/jetstream@0.2.2(@atcute/client@2.0.9)': 1447 1993 dependencies: 1448 1994 '@atcute/bluesky': 1.0.15(@atcute/client@2.0.9) ··· 1454 2000 1455 2001 '@types/json-schema@7.0.15': {} 1456 2002 2003 + '@types/json5@0.0.29': {} 2004 + 1457 2005 '@types/node@24.0.10': 1458 2006 dependencies: 1459 2007 undici-types: 7.8.0 ··· 1462 2010 dependencies: 1463 2011 '@types/node': 24.0.10 1464 2012 1465 - '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1)(typescript@5.8.3)': 2013 + '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 1466 2014 dependencies: 1467 2015 '@eslint-community/regexpp': 4.12.1 1468 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1)(typescript@5.8.3) 2016 + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 1469 2017 '@typescript-eslint/scope-manager': 8.35.1 1470 - '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) 1471 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) 2018 + '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2019 + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 1472 2020 '@typescript-eslint/visitor-keys': 8.35.1 1473 - eslint: 9.30.1 2021 + eslint: 9.30.1(jiti@2.4.2) 1474 2022 graphemer: 1.4.0 1475 2023 ignore: 7.0.5 1476 2024 natural-compare: 1.4.0 ··· 1479 2027 transitivePeerDependencies: 1480 2028 - supports-color 1481 2029 1482 - '@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3)': 2030 + '@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 1483 2031 dependencies: 1484 2032 '@typescript-eslint/scope-manager': 8.35.1 1485 2033 '@typescript-eslint/types': 8.35.1 1486 2034 '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 1487 2035 '@typescript-eslint/visitor-keys': 8.35.1 1488 2036 debug: 4.4.1 1489 - eslint: 9.30.1 2037 + eslint: 9.30.1(jiti@2.4.2) 1490 2038 typescript: 5.8.3 1491 2039 transitivePeerDependencies: 1492 2040 - supports-color ··· 1509 2057 dependencies: 1510 2058 typescript: 5.8.3 1511 2059 1512 - '@typescript-eslint/type-utils@8.35.1(eslint@9.30.1)(typescript@5.8.3)': 2060 + '@typescript-eslint/type-utils@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 1513 2061 dependencies: 1514 2062 '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 1515 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) 2063 + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 1516 2064 debug: 4.4.1 1517 - eslint: 9.30.1 2065 + eslint: 9.30.1(jiti@2.4.2) 1518 2066 ts-api-utils: 2.1.0(typescript@5.8.3) 1519 2067 typescript: 5.8.3 1520 2068 transitivePeerDependencies: ··· 1538 2086 transitivePeerDependencies: 1539 2087 - supports-color 1540 2088 1541 - '@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.3)': 2089 + '@typescript-eslint/utils@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 1542 2090 dependencies: 1543 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1) 2091 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) 1544 2092 '@typescript-eslint/scope-manager': 8.35.1 1545 2093 '@typescript-eslint/types': 8.35.1 1546 2094 '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 1547 - eslint: 9.30.1 2095 + eslint: 9.30.1(jiti@2.4.2) 1548 2096 typescript: 5.8.3 1549 2097 transitivePeerDependencies: 1550 2098 - supports-color ··· 1573 2121 1574 2122 argparse@2.0.1: {} 1575 2123 2124 + array-buffer-byte-length@1.0.2: 2125 + dependencies: 2126 + call-bound: 1.0.4 2127 + is-array-buffer: 3.0.5 2128 + 2129 + array-includes@3.1.9: 2130 + dependencies: 2131 + call-bind: 1.0.8 2132 + call-bound: 1.0.4 2133 + define-properties: 1.2.1 2134 + es-abstract: 1.24.0 2135 + es-object-atoms: 1.1.1 2136 + get-intrinsic: 1.3.0 2137 + is-string: 1.1.1 2138 + math-intrinsics: 1.1.0 2139 + 2140 + array.prototype.findlastindex@1.2.6: 2141 + dependencies: 2142 + call-bind: 1.0.8 2143 + call-bound: 1.0.4 2144 + define-properties: 1.2.1 2145 + es-abstract: 1.24.0 2146 + es-errors: 1.3.0 2147 + es-object-atoms: 1.1.1 2148 + es-shim-unscopables: 1.1.0 2149 + 2150 + array.prototype.flat@1.3.3: 2151 + dependencies: 2152 + call-bind: 1.0.8 2153 + define-properties: 1.2.1 2154 + es-abstract: 1.24.0 2155 + es-shim-unscopables: 1.1.0 2156 + 2157 + array.prototype.flatmap@1.3.3: 2158 + dependencies: 2159 + call-bind: 1.0.8 2160 + define-properties: 1.2.1 2161 + es-abstract: 1.24.0 2162 + es-shim-unscopables: 1.1.0 2163 + 2164 + arraybuffer.prototype.slice@1.0.4: 2165 + dependencies: 2166 + array-buffer-byte-length: 1.0.2 2167 + call-bind: 1.0.8 2168 + define-properties: 1.2.1 2169 + es-abstract: 1.24.0 2170 + es-errors: 1.3.0 2171 + get-intrinsic: 1.3.0 2172 + is-array-buffer: 3.0.5 2173 + 2174 + async-function@1.0.0: {} 2175 + 2176 + available-typed-arrays@1.0.7: 2177 + dependencies: 2178 + possible-typed-array-names: 1.1.0 2179 + 1576 2180 balanced-match@1.0.2: {} 1577 2181 1578 2182 brace-expansion@1.1.12: ··· 1595 2199 '@types/node': 24.0.10 1596 2200 optional: true 1597 2201 2202 + call-bind-apply-helpers@1.0.2: 2203 + dependencies: 2204 + es-errors: 1.3.0 2205 + function-bind: 1.1.2 2206 + 2207 + call-bind@1.0.8: 2208 + dependencies: 2209 + call-bind-apply-helpers: 1.0.2 2210 + es-define-property: 1.0.1 2211 + get-intrinsic: 1.3.0 2212 + set-function-length: 1.2.2 2213 + 2214 + call-bound@1.0.4: 2215 + dependencies: 2216 + call-bind-apply-helpers: 1.0.2 2217 + get-intrinsic: 1.3.0 2218 + 1598 2219 callsites@3.1.0: {} 1599 2220 1600 2221 chalk@4.1.2: ··· 1618 2239 1619 2240 data-uri-to-buffer@4.0.1: {} 1620 2241 2242 + data-view-buffer@1.0.2: 2243 + dependencies: 2244 + call-bound: 1.0.4 2245 + es-errors: 1.3.0 2246 + is-data-view: 1.0.2 2247 + 2248 + data-view-byte-length@1.0.2: 2249 + dependencies: 2250 + call-bound: 1.0.4 2251 + es-errors: 1.3.0 2252 + is-data-view: 1.0.2 2253 + 2254 + data-view-byte-offset@1.0.1: 2255 + dependencies: 2256 + call-bound: 1.0.4 2257 + es-errors: 1.3.0 2258 + is-data-view: 1.0.2 2259 + 2260 + debug@3.2.7: 2261 + dependencies: 2262 + ms: 2.1.3 2263 + 1621 2264 debug@4.4.1: 1622 2265 dependencies: 1623 2266 ms: 2.1.3 1624 2267 1625 2268 deep-is@0.1.4: {} 1626 2269 2270 + define-data-property@1.1.4: 2271 + dependencies: 2272 + es-define-property: 1.0.1 2273 + es-errors: 1.3.0 2274 + gopd: 1.2.0 2275 + 2276 + define-properties@1.2.1: 2277 + dependencies: 2278 + define-data-property: 1.1.4 2279 + has-property-descriptors: 1.0.2 2280 + object-keys: 1.1.1 2281 + 1627 2282 detect-libc@2.0.2: {} 1628 2283 2284 + doctrine@2.1.0: 2285 + dependencies: 2286 + esutils: 2.0.3 2287 + 1629 2288 drizzle-kit@0.31.4: 1630 2289 dependencies: 1631 2290 '@drizzle-team/brocli': 0.10.2 ··· 1640 2299 '@libsql/client': 0.15.9 1641 2300 bun-types: 1.2.17 1642 2301 2302 + dunder-proto@1.0.1: 2303 + dependencies: 2304 + call-bind-apply-helpers: 1.0.2 2305 + es-errors: 1.3.0 2306 + gopd: 1.2.0 2307 + 2308 + es-abstract@1.24.0: 2309 + dependencies: 2310 + array-buffer-byte-length: 1.0.2 2311 + arraybuffer.prototype.slice: 1.0.4 2312 + available-typed-arrays: 1.0.7 2313 + call-bind: 1.0.8 2314 + call-bound: 1.0.4 2315 + data-view-buffer: 1.0.2 2316 + data-view-byte-length: 1.0.2 2317 + data-view-byte-offset: 1.0.1 2318 + es-define-property: 1.0.1 2319 + es-errors: 1.3.0 2320 + es-object-atoms: 1.1.1 2321 + es-set-tostringtag: 2.1.0 2322 + es-to-primitive: 1.3.0 2323 + function.prototype.name: 1.1.8 2324 + get-intrinsic: 1.3.0 2325 + get-proto: 1.0.1 2326 + get-symbol-description: 1.1.0 2327 + globalthis: 1.0.4 2328 + gopd: 1.2.0 2329 + has-property-descriptors: 1.0.2 2330 + has-proto: 1.2.0 2331 + has-symbols: 1.1.0 2332 + hasown: 2.0.2 2333 + internal-slot: 1.1.0 2334 + is-array-buffer: 3.0.5 2335 + is-callable: 1.2.7 2336 + is-data-view: 1.0.2 2337 + is-negative-zero: 2.0.3 2338 + is-regex: 1.2.1 2339 + is-set: 2.0.3 2340 + is-shared-array-buffer: 1.0.4 2341 + is-string: 1.1.1 2342 + is-typed-array: 1.1.15 2343 + is-weakref: 1.1.1 2344 + math-intrinsics: 1.1.0 2345 + object-inspect: 1.13.4 2346 + object-keys: 1.1.1 2347 + object.assign: 4.1.7 2348 + own-keys: 1.0.1 2349 + regexp.prototype.flags: 1.5.4 2350 + safe-array-concat: 1.1.3 2351 + safe-push-apply: 1.0.0 2352 + safe-regex-test: 1.1.0 2353 + set-proto: 1.0.0 2354 + stop-iteration-iterator: 1.1.0 2355 + string.prototype.trim: 1.2.10 2356 + string.prototype.trimend: 1.0.9 2357 + string.prototype.trimstart: 1.0.8 2358 + typed-array-buffer: 1.0.3 2359 + typed-array-byte-length: 1.0.3 2360 + typed-array-byte-offset: 1.0.4 2361 + typed-array-length: 1.0.7 2362 + unbox-primitive: 1.1.0 2363 + which-typed-array: 1.1.19 2364 + 2365 + es-define-property@1.0.1: {} 2366 + 2367 + es-errors@1.3.0: {} 2368 + 2369 + es-object-atoms@1.1.1: 2370 + dependencies: 2371 + es-errors: 1.3.0 2372 + 2373 + es-set-tostringtag@2.1.0: 2374 + dependencies: 2375 + es-errors: 1.3.0 2376 + get-intrinsic: 1.3.0 2377 + has-tostringtag: 1.0.2 2378 + hasown: 2.0.2 2379 + 2380 + es-shim-unscopables@1.1.0: 2381 + dependencies: 2382 + hasown: 2.0.2 2383 + 2384 + es-to-primitive@1.3.0: 2385 + dependencies: 2386 + is-callable: 1.2.7 2387 + is-date-object: 1.1.0 2388 + is-symbol: 1.1.1 2389 + 1643 2390 esbuild-register@3.6.0(esbuild@0.25.5): 1644 2391 dependencies: 1645 2392 debug: 4.4.1 ··· 1702 2449 1703 2450 escape-string-regexp@4.0.0: {} 1704 2451 2452 + eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)): 2453 + dependencies: 2454 + eslint: 9.30.1(jiti@2.4.2) 2455 + 2456 + eslint-import-resolver-node@0.3.9: 2457 + dependencies: 2458 + debug: 3.2.7 2459 + is-core-module: 2.16.1 2460 + resolve: 1.22.10 2461 + transitivePeerDependencies: 2462 + - supports-color 2463 + 2464 + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2)): 2465 + dependencies: 2466 + debug: 3.2.7 2467 + optionalDependencies: 2468 + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2469 + eslint: 9.30.1(jiti@2.4.2) 2470 + eslint-import-resolver-node: 0.3.9 2471 + transitivePeerDependencies: 2472 + - supports-color 2473 + 2474 + eslint-plugin-drizzle@0.2.3(eslint@9.30.1(jiti@2.4.2)): 2475 + dependencies: 2476 + eslint: 9.30.1(jiti@2.4.2) 2477 + 2478 + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)): 2479 + dependencies: 2480 + '@rtsao/scc': 1.1.0 2481 + array-includes: 3.1.9 2482 + array.prototype.findlastindex: 1.2.6 2483 + array.prototype.flat: 1.3.3 2484 + array.prototype.flatmap: 1.3.3 2485 + debug: 3.2.7 2486 + doctrine: 2.1.0 2487 + eslint: 9.30.1(jiti@2.4.2) 2488 + eslint-import-resolver-node: 0.3.9 2489 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2)) 2490 + hasown: 2.0.2 2491 + is-core-module: 2.16.1 2492 + is-glob: 4.0.3 2493 + minimatch: 3.1.2 2494 + object.fromentries: 2.0.8 2495 + object.groupby: 1.0.3 2496 + object.values: 1.2.1 2497 + semver: 6.3.1 2498 + string.prototype.trimend: 1.0.9 2499 + tsconfig-paths: 3.15.0 2500 + optionalDependencies: 2501 + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2502 + transitivePeerDependencies: 2503 + - eslint-import-resolver-typescript 2504 + - eslint-import-resolver-webpack 2505 + - supports-color 2506 + 2507 + eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2): 2508 + dependencies: 2509 + eslint: 9.30.1(jiti@2.4.2) 2510 + prettier: 3.6.2 2511 + prettier-linter-helpers: 1.0.0 2512 + synckit: 0.11.8 2513 + optionalDependencies: 2514 + eslint-config-prettier: 10.1.5(eslint@9.30.1(jiti@2.4.2)) 2515 + 1705 2516 eslint-scope@8.4.0: 1706 2517 dependencies: 1707 2518 esrecurse: 4.3.0 ··· 1711 2522 1712 2523 eslint-visitor-keys@4.2.1: {} 1713 2524 1714 - eslint@9.30.1: 2525 + eslint@9.30.1(jiti@2.4.2): 1715 2526 dependencies: 1716 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1) 2527 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) 1717 2528 '@eslint-community/regexpp': 4.12.1 1718 2529 '@eslint/config-array': 0.21.0 1719 2530 '@eslint/config-helpers': 0.3.0 ··· 1748 2559 minimatch: 3.1.2 1749 2560 natural-compare: 1.4.0 1750 2561 optionator: 0.9.4 2562 + optionalDependencies: 2563 + jiti: 2.4.2 1751 2564 transitivePeerDependencies: 1752 2565 - supports-color 1753 2566 ··· 1773 2586 1774 2587 fast-deep-equal@3.1.3: {} 1775 2588 2589 + fast-diff@1.3.0: {} 2590 + 1776 2591 fast-glob@3.3.3: 1777 2592 dependencies: 1778 2593 '@nodelib/fs.stat': 2.0.5 ··· 1814 2629 1815 2630 flatted@3.3.3: {} 1816 2631 2632 + for-each@0.3.5: 2633 + dependencies: 2634 + is-callable: 1.2.7 2635 + 1817 2636 formdata-polyfill@4.0.10: 1818 2637 dependencies: 1819 2638 fetch-blob: 3.2.0 ··· 1821 2640 fsevents@2.3.3: 1822 2641 optional: true 1823 2642 2643 + function-bind@1.1.2: {} 2644 + 2645 + function.prototype.name@1.1.8: 2646 + dependencies: 2647 + call-bind: 1.0.8 2648 + call-bound: 1.0.4 2649 + define-properties: 1.2.1 2650 + functions-have-names: 1.2.3 2651 + hasown: 2.0.2 2652 + is-callable: 1.2.7 2653 + 2654 + functions-have-names@1.2.3: {} 2655 + 2656 + get-intrinsic@1.3.0: 2657 + dependencies: 2658 + call-bind-apply-helpers: 1.0.2 2659 + es-define-property: 1.0.1 2660 + es-errors: 1.3.0 2661 + es-object-atoms: 1.1.1 2662 + function-bind: 1.1.2 2663 + get-proto: 1.0.1 2664 + gopd: 1.2.0 2665 + has-symbols: 1.1.0 2666 + hasown: 2.0.2 2667 + math-intrinsics: 1.1.0 2668 + 2669 + get-proto@1.0.1: 2670 + dependencies: 2671 + dunder-proto: 1.0.1 2672 + es-object-atoms: 1.1.1 2673 + 2674 + get-symbol-description@1.1.0: 2675 + dependencies: 2676 + call-bound: 1.0.4 2677 + es-errors: 1.3.0 2678 + get-intrinsic: 1.3.0 2679 + 1824 2680 get-tsconfig@4.10.1: 1825 2681 dependencies: 1826 2682 resolve-pkg-maps: 1.0.0 ··· 1837 2693 1838 2694 globals@16.3.0: {} 1839 2695 2696 + globalthis@1.0.4: 2697 + dependencies: 2698 + define-properties: 1.2.1 2699 + gopd: 1.2.0 2700 + 2701 + gopd@1.2.0: {} 2702 + 1840 2703 graphemer@1.4.0: {} 1841 2704 2705 + has-bigints@1.1.0: {} 2706 + 1842 2707 has-flag@4.0.0: {} 1843 2708 2709 + has-property-descriptors@1.0.2: 2710 + dependencies: 2711 + es-define-property: 1.0.1 2712 + 2713 + has-proto@1.2.0: 2714 + dependencies: 2715 + dunder-proto: 1.0.1 2716 + 2717 + has-symbols@1.1.0: {} 2718 + 2719 + has-tostringtag@1.0.2: 2720 + dependencies: 2721 + has-symbols: 1.1.0 2722 + 2723 + hasown@2.0.2: 2724 + dependencies: 2725 + function-bind: 1.1.2 2726 + 1844 2727 hono@4.8.3: {} 1845 2728 1846 2729 ignore@5.3.2: {} ··· 1854 2737 1855 2738 imurmurhash@0.1.4: {} 1856 2739 2740 + internal-slot@1.1.0: 2741 + dependencies: 2742 + es-errors: 1.3.0 2743 + hasown: 2.0.2 2744 + side-channel: 1.1.0 2745 + 2746 + is-array-buffer@3.0.5: 2747 + dependencies: 2748 + call-bind: 1.0.8 2749 + call-bound: 1.0.4 2750 + get-intrinsic: 1.3.0 2751 + 2752 + is-async-function@2.1.1: 2753 + dependencies: 2754 + async-function: 1.0.0 2755 + call-bound: 1.0.4 2756 + get-proto: 1.0.1 2757 + has-tostringtag: 1.0.2 2758 + safe-regex-test: 1.1.0 2759 + 2760 + is-bigint@1.1.0: 2761 + dependencies: 2762 + has-bigints: 1.1.0 2763 + 2764 + is-boolean-object@1.2.2: 2765 + dependencies: 2766 + call-bound: 1.0.4 2767 + has-tostringtag: 1.0.2 2768 + 2769 + is-callable@1.2.7: {} 2770 + 2771 + is-core-module@2.16.1: 2772 + dependencies: 2773 + hasown: 2.0.2 2774 + 2775 + is-data-view@1.0.2: 2776 + dependencies: 2777 + call-bound: 1.0.4 2778 + get-intrinsic: 1.3.0 2779 + is-typed-array: 1.1.15 2780 + 2781 + is-date-object@1.1.0: 2782 + dependencies: 2783 + call-bound: 1.0.4 2784 + has-tostringtag: 1.0.2 2785 + 1857 2786 is-extglob@2.1.1: {} 1858 2787 2788 + is-finalizationregistry@1.1.1: 2789 + dependencies: 2790 + call-bound: 1.0.4 2791 + 2792 + is-generator-function@1.1.0: 2793 + dependencies: 2794 + call-bound: 1.0.4 2795 + get-proto: 1.0.1 2796 + has-tostringtag: 1.0.2 2797 + safe-regex-test: 1.1.0 2798 + 1859 2799 is-glob@4.0.3: 1860 2800 dependencies: 1861 2801 is-extglob: 2.1.1 1862 2802 2803 + is-map@2.0.3: {} 2804 + 2805 + is-negative-zero@2.0.3: {} 2806 + 2807 + is-number-object@1.1.1: 2808 + dependencies: 2809 + call-bound: 1.0.4 2810 + has-tostringtag: 1.0.2 2811 + 1863 2812 is-number@7.0.0: {} 1864 2813 2814 + is-regex@1.2.1: 2815 + dependencies: 2816 + call-bound: 1.0.4 2817 + gopd: 1.2.0 2818 + has-tostringtag: 1.0.2 2819 + hasown: 2.0.2 2820 + 2821 + is-set@2.0.3: {} 2822 + 2823 + is-shared-array-buffer@1.0.4: 2824 + dependencies: 2825 + call-bound: 1.0.4 2826 + 2827 + is-string@1.1.1: 2828 + dependencies: 2829 + call-bound: 1.0.4 2830 + has-tostringtag: 1.0.2 2831 + 2832 + is-symbol@1.1.1: 2833 + dependencies: 2834 + call-bound: 1.0.4 2835 + has-symbols: 1.1.0 2836 + safe-regex-test: 1.1.0 2837 + 2838 + is-typed-array@1.1.15: 2839 + dependencies: 2840 + which-typed-array: 1.1.19 2841 + 2842 + is-weakmap@2.0.2: {} 2843 + 2844 + is-weakref@1.1.1: 2845 + dependencies: 2846 + call-bound: 1.0.4 2847 + 2848 + is-weakset@2.0.4: 2849 + dependencies: 2850 + call-bound: 1.0.4 2851 + get-intrinsic: 1.3.0 2852 + 2853 + isarray@2.0.5: {} 2854 + 1865 2855 isexe@2.0.0: {} 2856 + 2857 + jiti@2.4.2: {} 1866 2858 1867 2859 js-base64@3.7.7: {} 1868 2860 ··· 1876 2868 1877 2869 json-stable-stringify-without-jsonify@1.0.1: {} 1878 2870 2871 + json5@1.0.2: 2872 + dependencies: 2873 + minimist: 1.2.8 2874 + 1879 2875 keyv@4.5.4: 1880 2876 dependencies: 1881 2877 json-buffer: 3.0.1 ··· 1906 2902 1907 2903 lodash.merge@4.6.2: {} 1908 2904 2905 + math-intrinsics@1.1.0: {} 2906 + 1909 2907 merge2@1.4.1: {} 1910 2908 1911 2909 micromatch@4.0.8: ··· 1921 2919 dependencies: 1922 2920 brace-expansion: 2.0.2 1923 2921 2922 + minimist@1.2.8: {} 2923 + 1924 2924 ms@2.1.3: {} 1925 2925 1926 2926 natural-compare@1.4.0: {} ··· 1933 2933 fetch-blob: 3.2.0 1934 2934 formdata-polyfill: 4.0.10 1935 2935 2936 + object-inspect@1.13.4: {} 2937 + 2938 + object-keys@1.1.1: {} 2939 + 2940 + object.assign@4.1.7: 2941 + dependencies: 2942 + call-bind: 1.0.8 2943 + call-bound: 1.0.4 2944 + define-properties: 1.2.1 2945 + es-object-atoms: 1.1.1 2946 + has-symbols: 1.1.0 2947 + object-keys: 1.1.1 2948 + 2949 + object.fromentries@2.0.8: 2950 + dependencies: 2951 + call-bind: 1.0.8 2952 + define-properties: 1.2.1 2953 + es-abstract: 1.24.0 2954 + es-object-atoms: 1.1.1 2955 + 2956 + object.groupby@1.0.3: 2957 + dependencies: 2958 + call-bind: 1.0.8 2959 + define-properties: 1.2.1 2960 + es-abstract: 1.24.0 2961 + 2962 + object.values@1.2.1: 2963 + dependencies: 2964 + call-bind: 1.0.8 2965 + call-bound: 1.0.4 2966 + define-properties: 1.2.1 2967 + es-object-atoms: 1.1.1 2968 + 1936 2969 optionator@0.9.4: 1937 2970 dependencies: 1938 2971 deep-is: 0.1.4 ··· 1942 2975 type-check: 0.4.0 1943 2976 word-wrap: 1.2.5 1944 2977 2978 + own-keys@1.0.1: 2979 + dependencies: 2980 + get-intrinsic: 1.3.0 2981 + object-keys: 1.1.1 2982 + safe-push-apply: 1.0.0 2983 + 1945 2984 p-limit@3.1.0: 1946 2985 dependencies: 1947 2986 yocto-queue: 0.1.0 ··· 1962 3001 1963 3002 path-key@3.1.1: {} 1964 3003 3004 + path-parse@1.0.7: {} 3005 + 1965 3006 picomatch@2.3.1: {} 1966 3007 3008 + possible-typed-array-names@1.1.0: {} 3009 + 1967 3010 prelude-ls@1.2.1: {} 1968 3011 3012 + prettier-linter-helpers@1.0.0: 3013 + dependencies: 3014 + fast-diff: 1.3.0 3015 + 3016 + prettier@3.6.2: {} 3017 + 1969 3018 promise-limit@2.7.0: {} 1970 3019 1971 3020 punycode@2.3.1: {} 1972 3021 1973 3022 queue-microtask@1.2.3: {} 1974 3023 3024 + reflect.getprototypeof@1.0.10: 3025 + dependencies: 3026 + call-bind: 1.0.8 3027 + define-properties: 1.2.1 3028 + es-abstract: 1.24.0 3029 + es-errors: 1.3.0 3030 + es-object-atoms: 1.1.1 3031 + get-intrinsic: 1.3.0 3032 + get-proto: 1.0.1 3033 + which-builtin-type: 1.2.1 3034 + 3035 + regexp.prototype.flags@1.5.4: 3036 + dependencies: 3037 + call-bind: 1.0.8 3038 + define-properties: 1.2.1 3039 + es-errors: 1.3.0 3040 + get-proto: 1.0.1 3041 + gopd: 1.2.0 3042 + set-function-name: 2.0.2 3043 + 1975 3044 resolve-from@4.0.0: {} 1976 3045 1977 3046 resolve-pkg-maps@1.0.0: {} 3047 + 3048 + resolve@1.22.10: 3049 + dependencies: 3050 + is-core-module: 2.16.1 3051 + path-parse: 1.0.7 3052 + supports-preserve-symlinks-flag: 1.0.0 1978 3053 1979 3054 reusify@1.1.0: {} 1980 3055 ··· 1982 3057 dependencies: 1983 3058 queue-microtask: 1.2.3 1984 3059 3060 + safe-array-concat@1.1.3: 3061 + dependencies: 3062 + call-bind: 1.0.8 3063 + call-bound: 1.0.4 3064 + get-intrinsic: 1.3.0 3065 + has-symbols: 1.1.0 3066 + isarray: 2.0.5 3067 + 3068 + safe-push-apply@1.0.0: 3069 + dependencies: 3070 + es-errors: 1.3.0 3071 + isarray: 2.0.5 3072 + 3073 + safe-regex-test@1.1.0: 3074 + dependencies: 3075 + call-bound: 1.0.4 3076 + es-errors: 1.3.0 3077 + is-regex: 1.2.1 3078 + 3079 + semver@6.3.1: {} 3080 + 1985 3081 semver@7.7.2: {} 1986 3082 3083 + set-function-length@1.2.2: 3084 + dependencies: 3085 + define-data-property: 1.1.4 3086 + es-errors: 1.3.0 3087 + function-bind: 1.1.2 3088 + get-intrinsic: 1.3.0 3089 + gopd: 1.2.0 3090 + has-property-descriptors: 1.0.2 3091 + 3092 + set-function-name@2.0.2: 3093 + dependencies: 3094 + define-data-property: 1.1.4 3095 + es-errors: 1.3.0 3096 + functions-have-names: 1.2.3 3097 + has-property-descriptors: 1.0.2 3098 + 3099 + set-proto@1.0.0: 3100 + dependencies: 3101 + dunder-proto: 1.0.1 3102 + es-errors: 1.3.0 3103 + es-object-atoms: 1.1.1 3104 + 1987 3105 shebang-command@2.0.0: 1988 3106 dependencies: 1989 3107 shebang-regex: 3.0.0 1990 3108 1991 3109 shebang-regex@3.0.0: {} 1992 3110 3111 + side-channel-list@1.0.0: 3112 + dependencies: 3113 + es-errors: 1.3.0 3114 + object-inspect: 1.13.4 3115 + 3116 + side-channel-map@1.0.1: 3117 + dependencies: 3118 + call-bound: 1.0.4 3119 + es-errors: 1.3.0 3120 + get-intrinsic: 1.3.0 3121 + object-inspect: 1.13.4 3122 + 3123 + side-channel-weakmap@1.0.2: 3124 + dependencies: 3125 + call-bound: 1.0.4 3126 + es-errors: 1.3.0 3127 + get-intrinsic: 1.3.0 3128 + object-inspect: 1.13.4 3129 + side-channel-map: 1.0.1 3130 + 3131 + side-channel@1.1.0: 3132 + dependencies: 3133 + es-errors: 1.3.0 3134 + object-inspect: 1.13.4 3135 + side-channel-list: 1.0.0 3136 + side-channel-map: 1.0.1 3137 + side-channel-weakmap: 1.0.2 3138 + 1993 3139 source-map-support@0.5.21: 1994 3140 dependencies: 1995 3141 buffer-from: 1.1.2 ··· 1997 3143 1998 3144 source-map@0.6.1: {} 1999 3145 3146 + stop-iteration-iterator@1.1.0: 3147 + dependencies: 3148 + es-errors: 1.3.0 3149 + internal-slot: 1.1.0 3150 + 3151 + string.prototype.trim@1.2.10: 3152 + dependencies: 3153 + call-bind: 1.0.8 3154 + call-bound: 1.0.4 3155 + define-data-property: 1.1.4 3156 + define-properties: 1.2.1 3157 + es-abstract: 1.24.0 3158 + es-object-atoms: 1.1.1 3159 + has-property-descriptors: 1.0.2 3160 + 3161 + string.prototype.trimend@1.0.9: 3162 + dependencies: 3163 + call-bind: 1.0.8 3164 + call-bound: 1.0.4 3165 + define-properties: 1.2.1 3166 + es-object-atoms: 1.1.1 3167 + 3168 + string.prototype.trimstart@1.0.8: 3169 + dependencies: 3170 + call-bind: 1.0.8 3171 + define-properties: 1.2.1 3172 + es-object-atoms: 1.1.1 3173 + 3174 + strip-bom@3.0.0: {} 3175 + 2000 3176 strip-json-comments@3.1.1: {} 2001 3177 2002 3178 supports-color@7.2.0: 2003 3179 dependencies: 2004 3180 has-flag: 4.0.0 2005 3181 3182 + supports-preserve-symlinks-flag@1.0.0: {} 3183 + 3184 + synckit@0.11.8: 3185 + dependencies: 3186 + '@pkgr/core': 0.2.7 3187 + 2006 3188 to-regex-range@5.0.1: 2007 3189 dependencies: 2008 3190 is-number: 7.0.0 ··· 2013 3195 dependencies: 2014 3196 typescript: 5.8.3 2015 3197 3198 + tsconfig-paths@3.15.0: 3199 + dependencies: 3200 + '@types/json5': 0.0.29 3201 + json5: 1.0.2 3202 + minimist: 1.2.8 3203 + strip-bom: 3.0.0 3204 + 2016 3205 tsx@4.20.3: 2017 3206 dependencies: 2018 3207 esbuild: 0.25.5 ··· 2024 3213 dependencies: 2025 3214 prelude-ls: 1.2.1 2026 3215 2027 - typescript-eslint@8.35.1(eslint@9.30.1)(typescript@5.8.3): 3216 + typed-array-buffer@1.0.3: 2028 3217 dependencies: 2029 - '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1)(typescript@5.8.3) 2030 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1)(typescript@5.8.3) 2031 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) 2032 - eslint: 9.30.1 3218 + call-bound: 1.0.4 3219 + es-errors: 1.3.0 3220 + is-typed-array: 1.1.15 3221 + 3222 + typed-array-byte-length@1.0.3: 3223 + dependencies: 3224 + call-bind: 1.0.8 3225 + for-each: 0.3.5 3226 + gopd: 1.2.0 3227 + has-proto: 1.2.0 3228 + is-typed-array: 1.1.15 3229 + 3230 + typed-array-byte-offset@1.0.4: 3231 + dependencies: 3232 + available-typed-arrays: 1.0.7 3233 + call-bind: 1.0.8 3234 + for-each: 0.3.5 3235 + gopd: 1.2.0 3236 + has-proto: 1.2.0 3237 + is-typed-array: 1.1.15 3238 + reflect.getprototypeof: 1.0.10 3239 + 3240 + typed-array-length@1.0.7: 3241 + dependencies: 3242 + call-bind: 1.0.8 3243 + for-each: 0.3.5 3244 + gopd: 1.2.0 3245 + is-typed-array: 1.1.15 3246 + possible-typed-array-names: 1.1.0 3247 + reflect.getprototypeof: 1.0.10 3248 + 3249 + typescript-eslint@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): 3250 + dependencies: 3251 + '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3252 + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3253 + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3254 + eslint: 9.30.1(jiti@2.4.2) 2033 3255 typescript: 5.8.3 2034 3256 transitivePeerDependencies: 2035 3257 - supports-color 2036 3258 2037 3259 typescript@5.8.3: {} 3260 + 3261 + unbox-primitive@1.1.0: 3262 + dependencies: 3263 + call-bound: 1.0.4 3264 + has-bigints: 1.1.0 3265 + has-symbols: 1.1.0 3266 + which-boxed-primitive: 1.1.1 2038 3267 2039 3268 undici-types@7.8.0: {} 2040 3269 ··· 2043 3272 punycode: 2.3.1 2044 3273 2045 3274 web-streams-polyfill@3.3.3: {} 3275 + 3276 + which-boxed-primitive@1.1.1: 3277 + dependencies: 3278 + is-bigint: 1.1.0 3279 + is-boolean-object: 1.2.2 3280 + is-number-object: 1.1.1 3281 + is-string: 1.1.1 3282 + is-symbol: 1.1.1 3283 + 3284 + which-builtin-type@1.2.1: 3285 + dependencies: 3286 + call-bound: 1.0.4 3287 + function.prototype.name: 1.1.8 3288 + has-tostringtag: 1.0.2 3289 + is-async-function: 2.1.1 3290 + is-date-object: 1.1.0 3291 + is-finalizationregistry: 1.1.1 3292 + is-generator-function: 1.1.0 3293 + is-regex: 1.2.1 3294 + is-weakref: 1.1.1 3295 + isarray: 2.0.5 3296 + which-boxed-primitive: 1.1.1 3297 + which-collection: 1.0.2 3298 + which-typed-array: 1.1.19 3299 + 3300 + which-collection@1.0.2: 3301 + dependencies: 3302 + is-map: 2.0.3 3303 + is-set: 2.0.3 3304 + is-weakmap: 2.0.2 3305 + is-weakset: 2.0.4 3306 + 3307 + which-typed-array@1.1.19: 3308 + dependencies: 3309 + available-typed-arrays: 1.0.7 3310 + call-bind: 1.0.8 3311 + call-bound: 1.0.4 3312 + for-each: 0.3.5 3313 + get-proto: 1.0.1 3314 + gopd: 1.2.0 3315 + has-tostringtag: 1.0.2 2046 3316 2047 3317 which@2.0.2: 2048 3318 dependencies:
+41 -35
backend/src/config.ts
··· 1 - import {readFileSync} from "fs"; 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { readFileSync } from "fs"; 2 8 import * as toml from "toml"; 3 9 4 10 export class Config { 5 - private static instance: Config; 6 - private readonly configData: any; 11 + private static instance: Config; 12 + private readonly configData; 7 13 8 - private constructor() { 9 - let tomlString; 10 - try { 11 - tomlString = readFileSync("config.toml", "utf-8"); 12 - } catch { 13 - throw new Error("Config file not found"); 14 - } 15 - this.configData = toml.parse(tomlString); 16 - } 14 + private constructor() { 15 + let tomlString; 16 + try { 17 + tomlString = readFileSync("config.toml", "utf-8"); 18 + } catch { 19 + throw new Error("Config file not found"); 20 + } 21 + this.configData = toml.parse(tomlString); 22 + } 17 23 18 - static getInstance(): Config { 19 - if (!Config.instance) { 20 - try { 21 - Config.instance = new Config(); 22 - } catch (e) { 23 - console.error(e); 24 - process.exit(1); 25 - } 26 - } 27 - return Config.instance; 28 - } 24 + static getInstance(): Config { 25 + if (!Config.instance) { 26 + try { 27 + Config.instance = new Config(); 28 + } catch (e) { 29 + console.error(e); 30 + process.exit(1); 31 + } 32 + } 33 + return Config.instance; 34 + } 29 35 30 - get<T = any>(path: string): T | undefined { 31 - const keys = path.split("."); 32 - let value = this.configData; 33 - for (const key of keys) { 34 - if (value == null) return undefined; 35 - value = value[key]; 36 - } 37 - return value; 38 - } 36 + get<T>(path: string): T | undefined { 37 + const keys = path.split("."); 38 + let value = this.configData; 39 + for (const key of keys) { 40 + if (value == null) return undefined; 41 + value = value[key]; 42 + } 43 + return value; 44 + } 39 45 40 - getAll(): any { 41 - return this.configData; 42 - } 46 + getAll() { 47 + return this.configData; 48 + } 43 49 }
+21 -21
backend/src/db/database.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import {drizzle} from 'drizzle-orm/libsql'; 8 - import {Config} from "../config.ts"; 7 + import { drizzle } from "drizzle-orm/libsql"; 8 + import { Config } from "../config.ts"; 9 9 10 10 const config = Config.getInstance(); 11 11 const dbname = config.get("database.name"); 12 12 13 13 export class Database { 14 - private static instance: Database; 15 - private readonly db: any; 14 + private static instance: Database; 15 + private readonly db; 16 16 17 - private constructor() { 18 - this.db = drizzle({connection: {url: `${dbname}`}}); 19 - } 17 + private constructor() { 18 + this.db = drizzle({ connection: { url: `${dbname}` } }); 19 + } 20 20 21 - static getInstance(): Database { 22 - if (!Database.instance) { 23 - try { 24 - Database.instance = new Database(); 25 - } catch (e) { 26 - console.error(e); 27 - process.exit(1); 28 - } 29 - } 30 - return Database.instance; 31 - } 21 + static getInstance(): Database { 22 + if (!Database.instance) { 23 + try { 24 + Database.instance = new Database(); 25 + } catch (e) { 26 + console.error(e); 27 + process.exit(1); 28 + } 29 + } 30 + return Database.instance; 31 + } 32 32 33 - getDb() { 34 - return this.db; 35 - } 33 + getDb() { 34 + return this.db; 35 + } 36 36 }
+37 -23
backend/src/db/schema.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import {int, sqliteTable, text} from "drizzle-orm/sqlite-core"; 8 - import {sql} from "drizzle-orm"; 7 + import { int, sqliteTable, text } from "drizzle-orm/sqlite-core"; 8 + import { sql } from "drizzle-orm"; 9 9 10 + // WebStorm keeps throwing errors with the default statements as it wants 11 + // an actual SQLite query, despite being valid. Oh well. 10 12 export const clipsTable = sqliteTable("clips", { 11 - id: int('id').primaryKey({autoIncrement: true}), 12 - timestamp: int('time_us', {mode: 'timestamp_ms'}).notNull().default(sql`(unixepoch() * 1000)`), 13 - did: text('did').notNull(), 14 - recordKey: text('rkey').notNull(), 15 - url: text('url').notNull(), 16 - title: text('title').notNull(), 17 - description: text('description').notNull(), 18 - unlisted: int('unlisted', {mode: 'boolean'}).notNull(), 19 - notes: text('notes'), 20 - tags: text('tags', {mode: "json"}).$type<string[]>().default(sql`'[]'`), 21 - unread: int('unread', {mode: 'boolean'}), 22 - languages: text('languages', {mode: 'json'}).$type<string[]>().default(sql`'[]'`), 23 - createdAt: int('createdAt', {mode: 'timestamp_ms'}).notNull().default(sql`(unixepoch() * 1000)`), 13 + id: int("id").primaryKey({ autoIncrement: true }), 14 + timestamp: int("time_us", { mode: "timestamp_ms" }) 15 + .notNull() 16 + .default(sql`(unixepoch() * 1000)`), 17 + did: text("did").notNull(), 18 + recordKey: text("rkey").notNull(), 19 + url: text("url").notNull(), 20 + title: text("title").notNull(), 21 + description: text("description").notNull(), 22 + unlisted: int("unlisted", { mode: "boolean" }).notNull(), 23 + notes: text("notes"), 24 + tags: text("tags", { mode: "json" }) 25 + .$type<string[]>() 26 + .default(sql`'[]'`), 27 + unread: int("unread", { mode: "boolean" }), 28 + languages: text("languages", { mode: "json" }) 29 + .$type<string[]>() 30 + .default(sql`'[]'`), 31 + createdAt: int("createdAt", { mode: "timestamp_ms" }) 32 + .notNull() 33 + .default(sql`(unixepoch() * 1000)`), 24 34 }); 25 35 26 36 export const tagsTable = sqliteTable("tags", { 27 - id: int('id').primaryKey({autoIncrement: true}), 28 - timestamp: int('time_us', {mode: 'timestamp_ms'}).notNull().default(sql`(unixepoch() * 1000)`), 29 - did: text('did').notNull(), 30 - recordKey: text('rkey').notNull(), 31 - name: text('name').notNull(), 32 - color: text('color'), 33 - createdAt: int('createdAt', {mode: 'timestamp_ms'}).notNull().default(sql`(unixepoch() * 1000)`), 34 - }); 37 + id: int("id").primaryKey({ autoIncrement: true }), 38 + timestamp: int("time_us", { mode: "timestamp_ms" }) 39 + .notNull() 40 + .default(sql`(unixepoch() * 1000)`), 41 + did: text("did").notNull(), 42 + recordKey: text("rkey").notNull(), 43 + name: text("name").notNull(), 44 + color: text("color"), 45 + createdAt: int("createdAt", { mode: "timestamp_ms" }) 46 + .notNull() 47 + .default(sql`(unixepoch() * 1000)`), 48 + });
-34
backend/src/jetstream.ts
··· 1 - /* 2 - * clippr: a social bookmarking service for the AT Protocol 3 - * Copyright (c) 2025 clippr contributors. 4 - * SPDX-License-Identifier: AGPL-3.0-only 5 - */ 6 - 7 - import {Jetstream} from "@skyware/jetstream"; 8 - import {Config} from "./config.ts"; 9 - 10 - const config = Config.getInstance(); 11 - const hostname = config.get("network.firehose"); 12 - 13 - const jetstream = new Jetstream({ 14 - endpoint: `wss://${hostname}/subscribe`, 15 - wantedCollections: ["social.clippr.*"], 16 - }); 17 - 18 - export function startFirehose() { 19 - jetstream.start(); 20 - } 21 - 22 - export function stopFirehose() { 23 - jetstream.close(); 24 - } 25 - 26 - export function readFromFirehose() { 27 - jetstream.on("account", (e) => { 28 - console.log("account update", e.account.did); 29 - }); 30 - 31 - jetstream.on("identity", (e) => { 32 - console.log("identity update", e.identity.did); 33 - }); 34 - }
+32 -30
backend/src/main.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import {serve, type ServerType} from '@hono/node-server' 8 - import {Config} from "./config.ts"; 9 - import {readFromFirehose, startFirehose, stopFirehose} from "./jetstream.ts"; 7 + import { serve, type ServerType } from "@hono/node-server"; 8 + import { Config } from "./config.ts"; 9 + import { readFromFirehose, startFirehose, stopFirehose } from "./network/jetstream.ts"; 10 10 import app from "./server.ts"; 11 - import {Database} from "./db/database.js"; 11 + import { Database } from "./db/database.js"; 12 12 13 13 function main() { 14 - console.log("clippr-BE starting...") 14 + console.log("clippr-BE starting..."); 15 15 16 - console.log('initializing config') 17 - const config: Config = Config.getInstance(); // Get config from config.toml 16 + console.log("initializing config"); 17 + const config: Config = Config.getInstance(); // Get config from config.toml 18 18 19 - console.log('initializing database') 20 - Database.getInstance(); 19 + console.log("initializing database"); 20 + Database.getInstance(); 21 21 22 - console.log('initializing firehose connection'); 23 - startFirehose(); 24 - readFromFirehose(); 22 + console.log("initializing firehose connection"); 23 + startFirehose(); 24 + readFromFirehose(); 25 25 26 - const server: ServerType = serve({ 27 - port: config.get("port"), 28 - hostname: config.get("hostname"), 29 - fetch: app.fetch, 30 - }); 26 + const server: ServerType = serve({ 27 + port: config.get("port"), 28 + hostname: config.get("hostname"), 29 + fetch: app.fetch, 30 + }); 31 31 32 - console.log(`server started at http://${config.get("hostname")}:${config.get("port")}`); 32 + console.log( 33 + `server started at http://${config.get("hostname")}:${config.get("port")}`, 34 + ); 33 35 34 - process.removeAllListeners('SIGINT'); 35 - process.removeAllListeners('SIGTERM'); 36 + process.removeAllListeners("SIGINT"); 37 + process.removeAllListeners("SIGTERM"); 36 38 37 - process.once('SIGINT', () => gracefulShutdown('SIGINT')); 38 - process.once('SIGTERM', () => gracefulShutdown('SIGTERM')); 39 + process.once("SIGINT", () => gracefulShutdown("SIGINT")); 40 + process.once("SIGTERM", () => gracefulShutdown("SIGTERM")); 39 41 40 - function gracefulShutdown(signal: string) { 41 - console.log(`\nreceived ${signal}, shutting down...`); 42 - stopFirehose(); 43 - server.close(); 44 - console.log('server shut down, bye!'); 45 - process.exit(0); 46 - } 42 + function gracefulShutdown(signal: string) { 43 + console.log(`\nreceived ${signal}, shutting down...`); 44 + stopFirehose(); 45 + server.close(); 46 + console.log("server shut down, bye!"); 47 + process.exit(0); 48 + } 47 49 } 48 50 49 - main(); 51 + main();
+48
backend/src/network/jetstream.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { Jetstream } from "@skyware/jetstream"; 8 + import { Config } from "../config.ts"; 9 + 10 + const config = Config.getInstance(); 11 + const hostname = config.get("network.firehose"); 12 + 13 + const jetstream = new Jetstream({ 14 + endpoint: `wss://${hostname}/subscribe`, 15 + wantedCollections: ["social.clippr.*"], 16 + }); 17 + 18 + export function startFirehose() { 19 + jetstream.start(); 20 + } 21 + 22 + export function stopFirehose() { 23 + jetstream.close(); 24 + } 25 + 26 + export function readFromFirehose() { 27 + jetstream.on("commit", (e) => { 28 + switch (e.commit.collection) { 29 + case "social.clippr.clips.item": 30 + break; 31 + case "social.clippr.clips.tag": 32 + break; 33 + default: 34 + console.log( 35 + `commit for ${e.commit.collection} is not relevant, dropping`, 36 + ); 37 + break; 38 + } 39 + }); 40 + 41 + jetstream.on("account", (e) => { 42 + console.log("account update", e.account.did); 43 + }); 44 + 45 + jetstream.on("identity", (e) => { 46 + console.log("identity update", e.identity.did); 47 + }); 48 + }
+7 -7
backend/src/routes/misc.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import {Hono} from 'hono' 8 - import {serveStatic} from "@hono/node-server/serve-static"; 7 + import { Hono } from "hono"; 8 + import { serveStatic } from "@hono/node-server/serve-static"; 9 9 10 10 const app = new Hono(); 11 11 12 - app.get('/', serveStatic({path: './static/index.html'})); 13 - app.get('/main.css', serveStatic({path: './static/main.css'})); 12 + app.get("/", serveStatic({ path: "./static/index.html" })); 13 + app.get("/main.css", serveStatic({ path: "./static/main.css" })); 14 14 app.notFound((c) => { 15 - return c.text('404 Not Found', 404); 16 - }) 15 + return c.text("404 Not Found", 404); 16 + }); 17 17 18 - export default app; 18 + export default app;
+3 -3
backend/src/server.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import {Hono} from "hono"; 7 + import { Hono } from "hono"; 8 8 import misc from "./routes/misc.ts"; 9 9 10 10 const app = new Hono(); 11 11 12 12 // Link all routes up 13 - app.route('/', misc); 13 + app.route("/", misc); 14 14 15 - export default app; 15 + export default app;
+14 -9
backend/static/index.html
··· 4 4 ~ SPDX-License-Identifier: AGPL-3.0-only 5 5 --> 6 6 7 - <!DOCTYPE html> 7 + <!doctype html> 8 8 <html lang="en"> 9 9 <head> 10 - <meta charset="UTF-8"> 11 - <meta http-equiv="X-UA-Compatible" content="IE=edge"> 12 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 13 - <link href="main.css" rel="stylesheet"> 10 + <meta charset="UTF-8"/> 11 + <meta content="IE=edge" http-equiv="X-UA-Compatible"/> 12 + <meta content="width=device-width, initial-scale=1.0" name="viewport"/> 13 + <link href="main.css" rel="stylesheet"/> 14 14 <title>clippr-BE</title> 15 15 </head> 16 16 <body> ··· 24 24 <a href="http://tangled.sh/@hexmani.ac/clippr-ts">source code</a> 25 25 </main> 26 26 <footer> 27 - <br> 28 - <small>copyright © clippr contributors 2025 | this software is released under the <a 29 - href="https://www.gnu.org/licenses/agpl-3.0.en.html#license-text">AGPL</a></small> 27 + <br/> 28 + <small> 29 + copyright © clippr contributors 2025 | this software is released 30 + under the 31 + <a href="https://www.gnu.org/licenses/agpl-3.0.en.html#license-text" 32 + >AGPL</a 33 + > 34 + </small> 30 35 </footer> 31 36 </div> 32 37 </body> 33 - </html> 38 + </html>
+2 -2
backend/static/main.css
··· 15 15 padding: 1rem; 16 16 border-radius: 0.5rem; 17 17 width: 30%; 18 - margin: auto 18 + margin: auto; 19 19 } 20 20 21 21 header { ··· 53 53 footer { 54 54 border-top: 1px dotted black; 55 55 text-align: center; 56 - } 56 + }
+30 -30
backend/tsconfig.json
··· 1 1 { 2 - "compilerOptions": { 3 - "allowImportingTsExtensions": true, 4 - "esModuleInterop": true, 5 - "skipLibCheck": true, 6 - "target": "ESNext", 7 - "module": "NodeNext", 8 - "moduleResolution": "NodeNext", 9 - "allowJs": true, 10 - "resolveJsonModule": true, 11 - "moduleDetection": "force", 12 - "isolatedModules": true, 13 - "verbatimModuleSyntax": true, 14 - "types": [ 15 - "node" 16 - ], 17 - "strict": true, 18 - "noUncheckedIndexedAccess": true, 19 - "noImplicitOverride": true, 20 - "noEmit": true, 21 - "jsx": "react-jsx", 22 - "jsxImportSource": "hono/jsx", 23 - "outDir": "./dist", 24 - "lib": [ 25 - "ESNext" 26 - ] 27 - }, 28 - "exclude": [ 29 - "node_modules" 30 - ] 31 - } 2 + "compilerOptions": { 3 + "allowImportingTsExtensions": true, 4 + "esModuleInterop": true, 5 + "skipLibCheck": true, 6 + "target": "ESNext", 7 + "module": "NodeNext", 8 + "moduleResolution": "NodeNext", 9 + "allowJs": true, 10 + "resolveJsonModule": true, 11 + "moduleDetection": "force", 12 + "isolatedModules": true, 13 + "verbatimModuleSyntax": true, 14 + "types": [ 15 + "node" 16 + ], 17 + "strict": true, 18 + "noUncheckedIndexedAccess": true, 19 + "noImplicitOverride": true, 20 + "noEmit": true, 21 + "jsx": "react-jsx", 22 + "jsxImportSource": "hono/jsx", 23 + "outDir": "./dist", 24 + "lib": [ 25 + "ESNext" 26 + ] 27 + }, 28 + "exclude": [ 29 + "node_modules" 30 + ] 31 + }