social bookmarking for atproto

Compare changes

Choose any two refs to compare.

Changed files
+8700 -3965
.idea
.tangled
backend
frontend
lexdocs
lexicons
+1
.idea/clippr.iml
··· 10 10 <excludeFolder url="file://$MODULE_DIR$/backend/build" /> 11 11 <excludeFolder url="file://$MODULE_DIR$/.idea/dataSources" /> 12 12 <excludeFolder url="file://$MODULE_DIR$/lexicons/dist" /> 13 + <excludeFolder url="file://$MODULE_DIR$/backend/logs" /> 13 14 </content> 14 15 <orderEntry type="inheritedJdk" /> 15 16 <orderEntry type="sourceFolder" forTests="false" />
+1 -1
.idea/dataSources.xml
··· 1 1 <?xml version="1.0" encoding="UTF-8"?> 2 2 <project version="4"> 3 3 <component name="DataSourceManagerImpl" format="xml" multifile-model="true"> 4 - <data-source source="LOCAL" name="Backend DB" read-only="true" uuid="befffb07-c652-4b9d-8f1c-31a01590f686"> 4 + <data-source source="LOCAL" name="Backend DB" uuid="befffb07-c652-4b9d-8f1c-31a01590f686"> 5 5 <driver-ref>sqlite.xerial</driver-ref> 6 6 <synchronize>true</synchronize> 7 7 <jdbc-driver>org.sqlite.JDBC</jdbc-driver>
+7
.idea/dictionaries/project.xml
··· 1 1 <component name="ProjectDictionaryState"> 2 2 <dictionary name="project"> 3 3 <words> 4 + <w>affero</w> 4 5 <w>agpl</w> 5 6 <w>appview</w> 6 7 <w>atcute</w> 7 8 <w>atproto</w> 9 + <w>bluesky</w> 8 10 <w>bsky</w> 9 11 <w>clippr</w> 10 12 <w>clipprjs</w> 11 13 <w>dids</w> 12 14 <w>hono</w> 13 15 <w>jetstream</w> 16 + <w>lexdocs</w> 17 + <w>llms</w> 18 + <w>llmstxt</w> 14 19 <w>multiformats</w> 20 + <w>nsid</w> 21 + <w>outdir</w> 15 22 <w>rkey</w> 16 23 <w>tseslint</w> 17 24 <w>xrpc</w>
+27
.idea/jsonSchemas.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <project version="4"> 3 + <component name="JsonSchemaMappingsProjectConfiguration"> 4 + <state> 5 + <map> 6 + <entry key="Lexicon Schema"> 7 + <value> 8 + <SchemaInfo> 9 + <option name="generatedName" value="New Schema" /> 10 + <option name="name" value="Lexicon Schema" /> 11 + <option name="relativePathToSchema" value="https://cdn.justdavi.dev/lexiconschema.json" /> 12 + <option name="patterns"> 13 + <list> 14 + <Item> 15 + <option name="directory" value="true" /> 16 + <option name="path" value="lexdocs" /> 17 + <option name="mappingKind" value="Directory" /> 18 + </Item> 19 + </list> 20 + </option> 21 + </SchemaInfo> 22 + </value> 23 + </entry> 24 + </map> 25 + </state> 26 + </component> 27 + </project>
+5 -6
.tangled/workflows/build_backend.yaml
··· 6 6 dependencies: 7 7 nixpkgs: 8 8 - nodejs 9 + - pnpm 10 + - gnused 9 11 10 12 steps: 11 - - name: "Move to backend folder" 12 - command: "cd /tangled/workspace/backend" 13 - 14 13 - name: "Install dependencies" 15 - command: "npm install backend/package.json" 14 + command: "pnpm install -C ./backend/" 16 15 environment: 17 16 NODE_ENV: "development" 18 17 CI: true 19 18 20 19 - name: "Run linter" 21 - command: "npm run lint" 20 + command: "pnpm run --dir ./backend/ lint" 22 21 23 22 - name: "Build application" 24 - command: "npm run build" 23 + command: "pnpm run --dir ./backend/ build" 25 24 environment: 26 25 NODE_ENV: "production" 27 26
+9 -5
.tangled/workflows/build_frontend.yaml
··· 6 6 dependencies: 7 7 nixpkgs: 8 8 - nodejs 9 + - pnpm 10 + - gnused 9 11 10 12 steps: 11 - - name: "Move to frontend folder" 12 - command: "cd /tangled/workspace/frontend" 13 - 14 13 - name: "Install dependencies" 15 - command: "npm install frontend/package.json" 14 + command: "pnpm install --dir ./frontend/" 16 15 environment: 17 16 NODE_ENV: "development" 18 17 CI: true 19 18 20 19 - name: "Build frontend" 21 - command: "npm run build" 20 + command: "pnpm run --dir ./frontend/ build" 21 + 22 + clone: 23 + skip: false 24 + depth: 50 25 + submodules: true
+11 -7
.tangled/workflows/build_lexicons.yaml
··· 6 6 dependencies: 7 7 nixpkgs: 8 8 - nodejs 9 + - pnpm 10 + - gnused 9 11 10 12 steps: 11 - - name: "Move to lexicons folder" 12 - command: "cd /tangled/workspace/lexicons" 13 - 14 13 - name: "Install dependencies" 15 - command: "npm install lexicons/package.json" 14 + command: "pnpm install -C ./lexicons/" 16 15 environment: 17 16 NODE_ENV: "development" 18 17 CI: true 19 18 20 19 - name: "Generate lexicons" 21 - command: "npm run generate" 20 + command: "pnpm run --dir ./lexicons/ generate" 22 21 23 22 - name: "Build package" 24 - command: "npm run prepublish" 23 + command: "pnpm run --dir ./lexicons/ prepublish" 25 24 environment: 26 - NODE_ENV: "production" 25 + NODE_ENV: "production" 26 + 27 + clone: 28 + skip: false 29 + depth: 50 30 + submodules: true
+23 -5
README.md
··· 2 2 3 3 social bookmarking for atproto 4 4 5 + ## current status 6 + 7 + we are currently working on completing the appview first before moving on to the frontend or any other packages. 8 + 9 + a lexicon package is available for those using atcute, however, it is still under heavy development. we do not recommend 10 + using it in any way until the appview is ready. 11 + 12 + the frontend has no interactivity and is basically just a mockup. 13 + 5 14 ## what's in here? 6 15 7 - the project is sorted into four directories, comprised of: 16 + the project is sorted into different sections, with each root-level folder signifying a package. 8 17 9 - * ``backend`` - the reference appview written using node and hono 10 - * ``frontend`` - the reference frontend written in astro and typescript 11 - * ``lex-src`` - the original lexicon files 12 - * ``lexicons`` - an atcute package for the clippr lexicon 18 + each section will usually contain its own README.md file dedicated to it, going into more detail about that specific 19 + package. 20 + 21 + | package | description | 22 + |--------------------------------------------------------------------------|---------------------------------------------------| 23 + | [``backend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/backend) | the reference appview written using node and hono | 24 + | [``frontend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/frontend) | the reference client written in solid | 25 + | [``lexdocs``](https://tangled.sh/@hexmani.ac/clippr/tree/main/lexdocs) | the original lexicon files | 26 + | [``lexicons``](https://tangled.sh/@hexmani.ac/clippr/tree/main/lexicons) | an atcute package for the clippr lexicons | 27 + 28 + ## roadmap 29 + 30 + soonโ„ข๏ธ
+2 -7
backend/.prettierrc
··· 8 8 "bracketSpacing": true, 9 9 "overrides": [ 10 10 { 11 - "files": [ 12 - "tsconfig.json", 13 - "jsconfig.json" 14 - ], 11 + "files": ["tsconfig.json", "jsconfig.json"], 15 12 "options": { 16 13 "parser": "jsonc" 17 14 } 18 15 }, 19 16 { 20 - "files": [ 21 - "*.md" 22 - ], 17 + "files": ["*.md"], 23 18 "options": { 24 19 "printWidth": 100, 25 20 "proseWrap": "always"
+22 -11
backend/README.md
··· 1 - # clippr-be 1 + # @clipprjs/server 2 2 3 3 typescript implementation of clippr appview using ~~bun~~ deno and hono 4 4 5 5 ## run and develop 6 6 7 - ```sh 7 + ```shell 8 8 pnpm install 9 + pnpm run db:push 9 10 pnpm run dev 10 11 ``` 11 12 12 13 open http://localhost:9090 and enjoy 13 14 15 + ## build for production 16 + 17 + ```shell 18 + pnpm install 19 + pnpm run db:push 20 + pnpm run build 21 + pnpm run start 22 + ``` 23 + 14 24 ## current status 15 25 16 26 right now we're not running on bun because there are 17 - [some issues with the jetstream library](https://github.com/oven-sh/bun/issues/18807), which haven't 18 - been fixed yet. 27 + [some issues with partysocket](https://github.com/oven-sh/bun/issues/18807), which haven't been 28 + fixed yet and which the jetstream library we use depends on for the moment. once it has been fixed, 29 + we do plan to use bun over node in the future. 19 30 20 31 ### checklist before it's usable 21 32 22 - - [x] Ingesting content from the firehose (using Jetstream) 23 - - [x] Creating the lexicon documents and validating content that comes in from the firehose 24 - - [x] 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 33 + - โœ… Ingesting content from the firehose (using Jetstream) 34 + - โœ… Creating the lexicon documents and validating content that comes in from the firehose 35 + - โœ… Indexing valid content from the firehose into a database 36 + - Handling OAuth authentication (public OAuth for the moment) 37 + - Creating responses to API calls 38 + - Create records through the API 39 + - Interact with the frontend
+5
backend/eslint.config.ts
··· 22 22 eslint.configs.recommended, 23 23 { 24 24 languageOptions: { 25 + sourceType: "module", 25 26 globals: { 26 27 ...globals.node, 27 28 }, 29 + }, 30 + files: ["**/*.ts"], 31 + rules: { 32 + "no-undef": "off", 28 33 }, 29 34 }, 30 35 );
+25 -19
backend/package.json
··· 5 5 "license": "AGPL-3.0-only", 6 6 "scripts": { 7 7 "dev": "tsx watch src/main.ts", 8 - "build": "rm -r dist/; tsc", 8 + "build": "tsc", 9 9 "start": "node dist/src/main.js", 10 10 "lint": "npx eslint .", 11 11 "lint-write": "npx eslint . --fix", ··· 15 15 "type": "module", 16 16 "main": "src/main.ts", 17 17 "engines": { 18 - "node": ">=24" 18 + "node": ">=22.16.0" 19 19 }, 20 20 "dependencies": { 21 - "@atcute/atproto": "^3.1.0", 21 + "@atcute/atproto": "^3.1.1", 22 + "@atcute/client": "^4.0.3", 23 + "@atcute/identity": "^1.0.3", 24 + "@atcute/identity-resolver": "^1.1.3", 22 25 "@atcute/lexicon-doc": "^1.0.3", 23 26 "@atcute/lexicons": "^1.1.0", 24 - "@clipprjs/lexicons": "^0.1.3", 27 + "@clipprjs/lexicons": "^1.0.2", 25 28 "@eslint/eslintrc": "^3.3.1", 26 - "@hono/node-server": "^1.15.0", 27 - "@libsql/client": "^0.15.9", 28 - "@skyware/jetstream": "^0.2.2", 29 - "drizzle-orm": "^0.44.2", 30 - "hono": "^4.8.4", 29 + "@hono/node-server": "^1.19.0", 30 + "@libsql/client": "^0.15.12", 31 + "@scalar/hono-api-reference": "^0.9.13", 32 + "@scalar/openapi-to-markdown": "^0.2.26", 33 + "@skyware/jetstream": "^0.2.5", 34 + "drizzle-orm": "^0.44.4", 35 + "hono": "^4.9.2", 31 36 "toml": "^3.0.0", 32 37 "winston": "^3.17.0", 33 38 "xxhash-wasm": "^1.1.0" 34 39 }, 35 40 "devDependencies": { 36 41 "@atcute/lex-cli": "^2.1.1", 37 - "@eslint/js": "^9.30.1", 38 - "@typescript-eslint/eslint-plugin": "^8.35.1", 39 - "@typescript-eslint/parser": "^8.35.1", 42 + "@eslint/js": "^9.33.0", 43 + "@types/node": "^24.3.0", 44 + "@typescript-eslint/eslint-plugin": "^8.40.0", 45 + "@typescript-eslint/parser": "^8.40.0", 40 46 "drizzle-kit": "^0.31.4", 41 - "eslint": "^9.30.1", 42 - "eslint-config-prettier": "^10.1.5", 47 + "eslint": "^9.33.0", 48 + "eslint-config-prettier": "^10.1.8", 43 49 "eslint-plugin-drizzle": "^0.2.3", 44 50 "eslint-plugin-import": "^2.32.0", 45 - "eslint-plugin-prettier": "^5.5.1", 51 + "eslint-plugin-prettier": "^5.5.4", 46 52 "globals": "^16.3.0", 47 - "jiti": "^2.4.2", 53 + "jiti": "^2.5.1", 48 54 "prettier": "^3.6.2", 49 - "tsx": "^4.20.3", 50 - "typescript": "^5.8.3", 51 - "typescript-eslint": "^8.35.1" 55 + "tsx": "^4.20.4", 56 + "typescript": "^5.9.2", 57 + "typescript-eslint": "^8.40.0" 52 58 } 53 59 }
+2574 -403
backend/pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@atcute/atproto': 12 - specifier: ^3.1.0 13 - version: 3.1.0 12 + specifier: ^3.1.1 13 + version: 3.1.1 14 + '@atcute/client': 15 + specifier: ^4.0.3 16 + version: 4.0.3 17 + '@atcute/identity': 18 + specifier: ^1.0.3 19 + version: 1.0.3 20 + '@atcute/identity-resolver': 21 + specifier: ^1.1.3 22 + version: 1.1.3(@atcute/identity@1.0.3) 14 23 '@atcute/lexicon-doc': 15 24 specifier: ^1.0.3 16 25 version: 1.0.3 ··· 18 27 specifier: ^1.1.0 19 28 version: 1.1.0 20 29 '@clipprjs/lexicons': 21 - specifier: ^0.1.3 22 - version: 0.1.3 30 + specifier: ^1.0.2 31 + version: 1.0.2 23 32 '@eslint/eslintrc': 24 33 specifier: ^3.3.1 25 34 version: 3.3.1 26 35 '@hono/node-server': 27 - specifier: ^1.15.0 28 - version: 1.15.0(hono@4.8.4) 36 + specifier: ^1.19.0 37 + version: 1.19.0(hono@4.9.2) 29 38 '@libsql/client': 30 - specifier: ^0.15.9 31 - version: 0.15.9 39 + specifier: ^0.15.12 40 + version: 0.15.12 41 + '@scalar/hono-api-reference': 42 + specifier: ^0.9.13 43 + version: 0.9.13(hono@4.9.2) 44 + '@scalar/openapi-to-markdown': 45 + specifier: ^0.2.26 46 + version: 0.2.26(typescript@5.9.2) 32 47 '@skyware/jetstream': 33 - specifier: ^0.2.2 34 - version: 0.2.2(@atcute/client@2.0.9) 48 + specifier: ^0.2.5 49 + version: 0.2.5 35 50 drizzle-orm: 36 - specifier: ^0.44.2 37 - version: 0.44.2(@libsql/client@0.15.9)(bun-types@1.2.17) 51 + specifier: ^0.44.4 52 + version: 0.44.4(@libsql/client@0.15.12)(bun-types@1.2.17) 38 53 hono: 39 - specifier: ^4.8.4 40 - version: 4.8.4 54 + specifier: ^4.9.2 55 + version: 4.9.2 41 56 toml: 42 57 specifier: ^3.0.0 43 58 version: 3.0.0 ··· 52 67 specifier: ^2.1.1 53 68 version: 2.1.1 54 69 '@eslint/js': 55 - specifier: ^9.30.1 56 - version: 9.30.1 70 + specifier: ^9.33.0 71 + version: 9.33.0 72 + '@types/node': 73 + specifier: ^24.3.0 74 + version: 24.3.0 57 75 '@typescript-eslint/eslint-plugin': 58 - specifier: ^8.35.1 59 - 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) 76 + specifier: ^8.40.0 77 + version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 60 78 '@typescript-eslint/parser': 61 - specifier: ^8.35.1 62 - version: 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 79 + specifier: ^8.40.0 80 + version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 63 81 drizzle-kit: 64 82 specifier: ^0.31.4 65 83 version: 0.31.4 66 84 eslint: 67 - specifier: ^9.30.1 68 - version: 9.30.1(jiti@2.4.2) 85 + specifier: ^9.33.0 86 + version: 9.33.0(jiti@2.5.1) 69 87 eslint-config-prettier: 70 - specifier: ^10.1.5 71 - version: 10.1.5(eslint@9.30.1(jiti@2.4.2)) 88 + specifier: ^10.1.8 89 + version: 10.1.8(eslint@9.33.0(jiti@2.5.1)) 72 90 eslint-plugin-drizzle: 73 91 specifier: ^0.2.3 74 - version: 0.2.3(eslint@9.30.1(jiti@2.4.2)) 92 + version: 0.2.3(eslint@9.33.0(jiti@2.5.1)) 75 93 eslint-plugin-import: 76 94 specifier: ^2.32.0 77 - 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)) 95 + version: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) 78 96 eslint-plugin-prettier: 79 - specifier: ^5.5.1 80 - 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) 97 + specifier: ^5.5.4 98 + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(prettier@3.6.2) 81 99 globals: 82 100 specifier: ^16.3.0 83 101 version: 16.3.0 84 102 jiti: 85 - specifier: ^2.4.2 86 - version: 2.4.2 103 + specifier: ^2.5.1 104 + version: 2.5.1 87 105 prettier: 88 106 specifier: ^3.6.2 89 107 version: 3.6.2 90 108 tsx: 91 - specifier: ^4.20.3 92 - version: 4.20.3 109 + specifier: ^4.20.4 110 + version: 4.20.4 93 111 typescript: 94 - specifier: ^5.8.3 95 - version: 5.8.3 112 + specifier: ^5.9.2 113 + version: 5.9.2 96 114 typescript-eslint: 97 - specifier: ^8.35.1 98 - version: 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 115 + specifier: ^8.40.0 116 + version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 99 117 100 118 packages: 101 119 102 - '@atcute/atproto@3.1.0': 103 - resolution: {integrity: sha512-aJbDsY7FcIh8APWKAimBtshPwqoRE056tc0UV6vw4TW4e3nYaHedoJmKhlh/k8KQWxyw64MQThNGMaC89HNoTg==} 120 + '@atcute/atproto@3.1.1': 121 + resolution: {integrity: sha512-D+RLTIPF0xLu7BPZY8KSewAPemJFh+3n3zeQ3ROsLxbTtCHbrTDMAmAFexaVRAPGcPYrwXaBUlv7yZjScJolMg==} 122 + 123 + '@atcute/bluesky@3.2.0': 124 + resolution: {integrity: sha512-OqPLqUNjXcgQ25MaPdU7H0QcWmZrx6QQk7d5B22A5U4xy+hZJ954kQ5mSAn24Bt0DEm4j/isq1WZovr3vaPTUA==} 104 125 105 - '@atcute/bluesky@1.0.15': 106 - resolution: {integrity: sha512-+EFiybmKQ97aBAgtaD+cKRJER5AMn3cZMkEwEg/pDdWyzxYJ9m1UgemmLdTgI8VrxPufKqdXS2nl7uO7TY6BPA==} 126 + '@atcute/client@4.0.3': 127 + resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 128 + 129 + '@atcute/identity-resolver@1.1.3': 130 + resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==} 107 131 peerDependencies: 108 - '@atcute/client': ^1.0.0 || ^2.0.0 132 + '@atcute/identity': ^1.0.0 109 133 110 - '@atcute/client@2.0.9': 111 - resolution: {integrity: sha512-QNDm9gMP6x9LY77ArwY+urQOBtQW74/onEAz42c40JxRm6Rl9K9cU4ROvNKJ+5cpVmEm1sthEWVRmDr5CSZENA==} 134 + '@atcute/identity@1.0.3': 135 + resolution: {integrity: sha512-mNMxbKHFGys03A8JXKk0KfMBzdd0vrYMzZZWjpw1nYTs0+ea6bo5S1hwqVUZxHdo1gFHSe/t63jxQIF4yL9aKw==} 112 136 113 137 '@atcute/lex-cli@2.1.1': 114 138 resolution: {integrity: sha512-QaR0sOP8Z24opGHKsSfleDbP/ahUb6HECkVaOqSwG7ORZzbLK1w0265o1BRjCVr2dT6FxlsMUa2Ge85JMA9bxg==} ··· 120 144 '@atcute/lexicons@1.1.0': 121 145 resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 122 146 123 - '@badrap/valita@0.4.5': 124 - resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==} 147 + '@atcute/util-fetch@1.0.1': 148 + resolution: {integrity: sha512-Clc0E/5ufyGBVfYBUwWNlHONlZCoblSr4Ho50l1LhmRPGB1Wu/AQ9Sz+rsBg7fdaW/auve8ulmwhRhnX2cGRow==} 149 + 150 + '@babel/helper-string-parser@7.27.1': 151 + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 152 + engines: {node: '>=6.9.0'} 153 + 154 + '@babel/helper-validator-identifier@7.27.1': 155 + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 156 + engines: {node: '>=6.9.0'} 157 + 158 + '@babel/parser@7.28.3': 159 + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} 160 + engines: {node: '>=6.0.0'} 161 + hasBin: true 162 + 163 + '@babel/types@7.28.2': 164 + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 165 + engines: {node: '>=6.9.0'} 166 + 167 + '@badrap/valita@0.4.6': 168 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 125 169 engines: {node: '>= 18'} 126 170 127 - '@clipprjs/lexicons@0.1.3': 128 - resolution: {integrity: sha512-jv52Ib/E4hhoD/rXntZgBmVcCqBJe1EY7+WOLBqCyVvkdajMzpYHDHMFxALU61z7Gc6ducYJK3S5Ki7EnBywCw==} 171 + '@clipprjs/lexicons@1.0.2': 172 + resolution: {integrity: sha512-AIof/RWAtwq/8ygMSNS5KzElbPdXWD9WEX4uGCgAb0RQ/FJUe41X7gIpL0MYOrVtLmOwH+A5rHxq8o3Tn3b8Sg==} 129 173 130 174 '@colors/colors@1.6.0': 131 175 resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} ··· 145 189 resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} 146 190 deprecated: 'Merged into tsx: https://tsx.is' 147 191 148 - '@esbuild/aix-ppc64@0.25.5': 149 - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 192 + '@esbuild/aix-ppc64@0.25.9': 193 + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} 150 194 engines: {node: '>=18'} 151 195 cpu: [ppc64] 152 196 os: [aix] ··· 157 201 cpu: [arm64] 158 202 os: [android] 159 203 160 - '@esbuild/android-arm64@0.25.5': 161 - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 204 + '@esbuild/android-arm64@0.25.9': 205 + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} 162 206 engines: {node: '>=18'} 163 207 cpu: [arm64] 164 208 os: [android] ··· 169 213 cpu: [arm] 170 214 os: [android] 171 215 172 - '@esbuild/android-arm@0.25.5': 173 - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 216 + '@esbuild/android-arm@0.25.9': 217 + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} 174 218 engines: {node: '>=18'} 175 219 cpu: [arm] 176 220 os: [android] ··· 181 225 cpu: [x64] 182 226 os: [android] 183 227 184 - '@esbuild/android-x64@0.25.5': 185 - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 228 + '@esbuild/android-x64@0.25.9': 229 + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} 186 230 engines: {node: '>=18'} 187 231 cpu: [x64] 188 232 os: [android] ··· 193 237 cpu: [arm64] 194 238 os: [darwin] 195 239 196 - '@esbuild/darwin-arm64@0.25.5': 197 - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 240 + '@esbuild/darwin-arm64@0.25.9': 241 + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} 198 242 engines: {node: '>=18'} 199 243 cpu: [arm64] 200 244 os: [darwin] ··· 205 249 cpu: [x64] 206 250 os: [darwin] 207 251 208 - '@esbuild/darwin-x64@0.25.5': 209 - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 252 + '@esbuild/darwin-x64@0.25.9': 253 + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} 210 254 engines: {node: '>=18'} 211 255 cpu: [x64] 212 256 os: [darwin] ··· 217 261 cpu: [arm64] 218 262 os: [freebsd] 219 263 220 - '@esbuild/freebsd-arm64@0.25.5': 221 - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 264 + '@esbuild/freebsd-arm64@0.25.9': 265 + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} 222 266 engines: {node: '>=18'} 223 267 cpu: [arm64] 224 268 os: [freebsd] ··· 229 273 cpu: [x64] 230 274 os: [freebsd] 231 275 232 - '@esbuild/freebsd-x64@0.25.5': 233 - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 276 + '@esbuild/freebsd-x64@0.25.9': 277 + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} 234 278 engines: {node: '>=18'} 235 279 cpu: [x64] 236 280 os: [freebsd] ··· 241 285 cpu: [arm64] 242 286 os: [linux] 243 287 244 - '@esbuild/linux-arm64@0.25.5': 245 - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 288 + '@esbuild/linux-arm64@0.25.9': 289 + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} 246 290 engines: {node: '>=18'} 247 291 cpu: [arm64] 248 292 os: [linux] ··· 253 297 cpu: [arm] 254 298 os: [linux] 255 299 256 - '@esbuild/linux-arm@0.25.5': 257 - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 300 + '@esbuild/linux-arm@0.25.9': 301 + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} 258 302 engines: {node: '>=18'} 259 303 cpu: [arm] 260 304 os: [linux] ··· 265 309 cpu: [ia32] 266 310 os: [linux] 267 311 268 - '@esbuild/linux-ia32@0.25.5': 269 - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 312 + '@esbuild/linux-ia32@0.25.9': 313 + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} 270 314 engines: {node: '>=18'} 271 315 cpu: [ia32] 272 316 os: [linux] ··· 277 321 cpu: [loong64] 278 322 os: [linux] 279 323 280 - '@esbuild/linux-loong64@0.25.5': 281 - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 324 + '@esbuild/linux-loong64@0.25.9': 325 + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} 282 326 engines: {node: '>=18'} 283 327 cpu: [loong64] 284 328 os: [linux] ··· 289 333 cpu: [mips64el] 290 334 os: [linux] 291 335 292 - '@esbuild/linux-mips64el@0.25.5': 293 - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 336 + '@esbuild/linux-mips64el@0.25.9': 337 + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} 294 338 engines: {node: '>=18'} 295 339 cpu: [mips64el] 296 340 os: [linux] ··· 301 345 cpu: [ppc64] 302 346 os: [linux] 303 347 304 - '@esbuild/linux-ppc64@0.25.5': 305 - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 348 + '@esbuild/linux-ppc64@0.25.9': 349 + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} 306 350 engines: {node: '>=18'} 307 351 cpu: [ppc64] 308 352 os: [linux] ··· 313 357 cpu: [riscv64] 314 358 os: [linux] 315 359 316 - '@esbuild/linux-riscv64@0.25.5': 317 - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 360 + '@esbuild/linux-riscv64@0.25.9': 361 + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} 318 362 engines: {node: '>=18'} 319 363 cpu: [riscv64] 320 364 os: [linux] ··· 325 369 cpu: [s390x] 326 370 os: [linux] 327 371 328 - '@esbuild/linux-s390x@0.25.5': 329 - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 372 + '@esbuild/linux-s390x@0.25.9': 373 + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} 330 374 engines: {node: '>=18'} 331 375 cpu: [s390x] 332 376 os: [linux] ··· 337 381 cpu: [x64] 338 382 os: [linux] 339 383 340 - '@esbuild/linux-x64@0.25.5': 341 - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 384 + '@esbuild/linux-x64@0.25.9': 385 + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} 342 386 engines: {node: '>=18'} 343 387 cpu: [x64] 344 388 os: [linux] 345 389 346 - '@esbuild/netbsd-arm64@0.25.5': 347 - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 390 + '@esbuild/netbsd-arm64@0.25.9': 391 + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} 348 392 engines: {node: '>=18'} 349 393 cpu: [arm64] 350 394 os: [netbsd] ··· 355 399 cpu: [x64] 356 400 os: [netbsd] 357 401 358 - '@esbuild/netbsd-x64@0.25.5': 359 - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 402 + '@esbuild/netbsd-x64@0.25.9': 403 + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} 360 404 engines: {node: '>=18'} 361 405 cpu: [x64] 362 406 os: [netbsd] 363 407 364 - '@esbuild/openbsd-arm64@0.25.5': 365 - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 408 + '@esbuild/openbsd-arm64@0.25.9': 409 + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} 366 410 engines: {node: '>=18'} 367 411 cpu: [arm64] 368 412 os: [openbsd] ··· 373 417 cpu: [x64] 374 418 os: [openbsd] 375 419 376 - '@esbuild/openbsd-x64@0.25.5': 377 - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 420 + '@esbuild/openbsd-x64@0.25.9': 421 + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} 378 422 engines: {node: '>=18'} 379 423 cpu: [x64] 380 424 os: [openbsd] 381 425 426 + '@esbuild/openharmony-arm64@0.25.9': 427 + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} 428 + engines: {node: '>=18'} 429 + cpu: [arm64] 430 + os: [openharmony] 431 + 382 432 '@esbuild/sunos-x64@0.18.20': 383 433 resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 384 434 engines: {node: '>=12'} 385 435 cpu: [x64] 386 436 os: [sunos] 387 437 388 - '@esbuild/sunos-x64@0.25.5': 389 - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 438 + '@esbuild/sunos-x64@0.25.9': 439 + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} 390 440 engines: {node: '>=18'} 391 441 cpu: [x64] 392 442 os: [sunos] ··· 397 447 cpu: [arm64] 398 448 os: [win32] 399 449 400 - '@esbuild/win32-arm64@0.25.5': 401 - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 450 + '@esbuild/win32-arm64@0.25.9': 451 + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} 402 452 engines: {node: '>=18'} 403 453 cpu: [arm64] 404 454 os: [win32] ··· 409 459 cpu: [ia32] 410 460 os: [win32] 411 461 412 - '@esbuild/win32-ia32@0.25.5': 413 - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 462 + '@esbuild/win32-ia32@0.25.9': 463 + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} 414 464 engines: {node: '>=18'} 415 465 cpu: [ia32] 416 466 os: [win32] ··· 421 471 cpu: [x64] 422 472 os: [win32] 423 473 424 - '@esbuild/win32-x64@0.25.5': 425 - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 474 + '@esbuild/win32-x64@0.25.9': 475 + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} 426 476 engines: {node: '>=18'} 427 477 cpu: [x64] 428 478 os: [win32] ··· 441 491 resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} 442 492 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 443 493 444 - '@eslint/config-helpers@0.3.0': 445 - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} 494 + '@eslint/config-helpers@0.3.1': 495 + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} 446 496 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 447 497 448 - '@eslint/core@0.14.0': 449 - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 450 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 451 - 452 - '@eslint/core@0.15.1': 453 - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} 498 + '@eslint/core@0.15.2': 499 + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} 454 500 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 455 501 456 502 '@eslint/eslintrc@3.3.1': 457 503 resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 458 504 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 459 505 460 - '@eslint/js@9.30.1': 461 - resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} 506 + '@eslint/js@9.33.0': 507 + resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} 462 508 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 463 509 464 510 '@eslint/object-schema@2.1.6': 465 511 resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 466 512 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 467 513 468 - '@eslint/plugin-kit@0.3.3': 469 - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} 514 + '@eslint/plugin-kit@0.3.5': 515 + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} 470 516 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 471 517 472 518 '@externdefs/collider@0.3.0': ··· 474 520 peerDependencies: 475 521 '@badrap/valita': ^0.4.4 476 522 477 - '@hono/node-server@1.15.0': 478 - resolution: {integrity: sha512-MjmK4l5N4dQpZ9OSWN0tCj7ejuc7WvuWMzSKtc89bnknJykAeHxzRigXBTYZk85H6Awrii6RM59iUiUluApu2A==} 523 + '@floating-ui/core@1.7.3': 524 + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} 525 + 526 + '@floating-ui/dom@1.7.3': 527 + resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} 528 + 529 + '@floating-ui/utils@0.2.10': 530 + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} 531 + 532 + '@floating-ui/vue@1.1.8': 533 + resolution: {integrity: sha512-SNJAa1jbT8Gh1LvWw2uIIViLL0saV2bCY59ISCvJzhbut5DSb2H3LKUK49Xkd7SixTNHKX4LFu59nbwIXt9jjQ==} 534 + 535 + '@headlessui/vue@1.7.23': 536 + resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} 537 + engines: {node: '>=10'} 538 + peerDependencies: 539 + vue: ^3.2.0 540 + 541 + '@hono/node-server@1.19.0': 542 + resolution: {integrity: sha512-1k8/8OHf5VIymJEcJyVksFpT+AQ5euY0VA5hUkCnlKpD4mr8FSbvXaHblxeTTEr90OaqWzAkQaqD80qHZQKxBA==} 479 543 engines: {node: '>=18.14.1'} 480 544 peerDependencies: 481 545 hono: ^4 ··· 500 564 resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 501 565 engines: {node: '>=18.18'} 502 566 503 - '@libsql/client@0.15.9': 504 - resolution: {integrity: sha512-VT3do0a0vwYVaNcp/y05ikkKS3OrFR5UeEf5SUuYZVgKVl1Nc1k9ajoYSsOid8AD/vlhLDB5yFQaV4HmT/OB9w==} 567 + '@hyperjump/browser@1.3.1': 568 + resolution: {integrity: sha512-Le5XZUjnVqVjkgLYv6yyWgALat/0HpB1XaCPuCZ+GCFki9NvXloSZITIJ0H+wRW7mb9At1SxvohKBbNQbrr/cw==} 569 + engines: {node: '>=18.0.0'} 570 + 571 + '@hyperjump/json-pointer@1.1.1': 572 + resolution: {integrity: sha512-M0T3s7TC2JepoWPMZQn1W6eYhFh06OXwpMqL+8c5wMVpvnCKNsPgpu9u7WyCI03xVQti8JAeAy4RzUa6SYlJLA==} 573 + 574 + '@hyperjump/json-schema@1.16.2': 575 + resolution: {integrity: sha512-MJNvaEFc79+h5rvBPgAJK4OHEUr0RqsKcLC5rc3V9FEsJyQAjnP910deRFoZCE068kX/NrAPPhunMgUMwonPtg==} 576 + peerDependencies: 577 + '@hyperjump/browser': ^1.1.0 578 + 579 + '@hyperjump/pact@1.4.0': 580 + resolution: {integrity: sha512-01Q7VY6BcAkp9W31Fv+ciiZycxZHGlR2N6ba9BifgyclHYHdbaZgITo0U6QMhYRlem4k8pf8J31/tApxvqAz8A==} 581 + 582 + '@hyperjump/uri@1.3.1': 583 + resolution: {integrity: sha512-2ecKymxf6prQMgrNpAvlx4RhsuM5+PFT6oh6uUTZdv5qmBv0RZvxv8LJ7oR30ZxGhdPdZAl4We/1NFc0nqHeAw==} 584 + 585 + '@internationalized/date@3.8.2': 586 + resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} 587 + 588 + '@internationalized/number@3.6.4': 589 + resolution: {integrity: sha512-P+/h+RDaiX8EGt3shB9AYM1+QgkvHmJ5rKi4/59k4sg9g58k9rqsRW0WxRO7jCoHyvVbFRRFKmVTdFYdehrxHg==} 590 + 591 + '@jridgewell/gen-mapping@0.3.13': 592 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 593 + 594 + '@jridgewell/resolve-uri@3.1.2': 595 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 596 + engines: {node: '>=6.0.0'} 597 + 598 + '@jridgewell/source-map@0.3.11': 599 + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} 600 + 601 + '@jridgewell/sourcemap-codec@1.5.5': 602 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 603 + 604 + '@jridgewell/trace-mapping@0.3.30': 605 + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} 606 + 607 + '@libsql/client@0.15.12': 608 + resolution: {integrity: sha512-JIqB0XsNrqYqBQZuhcgZdTcQoNOoQ5AMF+1yxc7vcZrLtm42QJwRazmTuBfyDwtWASEmVgjxeaLF4NT1iyVX8g==} 505 609 506 - '@libsql/core@0.15.9': 507 - resolution: {integrity: sha512-4OVdeAmuaCUq5hYT8NNn0nxlO9AcA/eTjXfUZ+QK8MT3Dz7Z76m73x7KxjU6I64WyXX98dauVH2b9XM+d84npw==} 610 + '@libsql/core@0.15.12': 611 + resolution: {integrity: sha512-S3tF6885ZizVjfym7f8SevL2VId/+DzxiKmP5zFbrhA8oMLh2XH8bYXChmhab7o9qUSHx+XjK4jCFpUwR5g+Ig==} 508 612 509 - '@libsql/darwin-arm64@0.5.13': 510 - resolution: {integrity: sha512-ASz/EAMLDLx3oq9PVvZ4zBXXHbz2TxtxUwX2xpTRFR4V4uSHAN07+jpLu3aK5HUBLuv58z7+GjaL5w/cyjR28Q==} 613 + '@libsql/darwin-arm64@0.5.17': 614 + resolution: {integrity: sha512-WTYG2skZsUnZmfZ2v7WFj7s3/5s2PfrYBZOWBKOnxHA8g4XCDc/4bFDaqob9Q2e88+GC7cWeJ8VNkVBFpD2Xxg==} 511 615 cpu: [arm64] 512 616 os: [darwin] 513 617 514 - '@libsql/darwin-x64@0.5.13': 515 - resolution: {integrity: sha512-kzglniv1difkq8opusSXM7u9H0WoEPeKxw0ixIfcGfvlCVMJ+t9UNtXmyNHW68ljdllje6a4C6c94iPmIYafYA==} 618 + '@libsql/darwin-x64@0.5.17': 619 + resolution: {integrity: sha512-ab0RlTR4KYrxgjNrZhAhY/10GibKoq6G0W4oi0kdm+eYiAv/Ip8GDMpSaZdAcoKA4T+iKR/ehczKHnMEB8MFxA==} 516 620 cpu: [x64] 517 621 os: [darwin] 518 622 ··· 526 630 '@libsql/isomorphic-ws@0.1.5': 527 631 resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} 528 632 529 - '@libsql/linux-arm-gnueabihf@0.5.13': 530 - resolution: {integrity: sha512-UEW+VZN2r0mFkfztKOS7cqfS8IemuekbjUXbXCwULHtusww2QNCXvM5KU9eJCNE419SZCb0qaEWYytcfka8qeA==} 633 + '@libsql/linux-arm-gnueabihf@0.5.17': 634 + resolution: {integrity: sha512-PcASh4k47RqC+kMWAbLUKf1y6Do0q8vnUGi0yhKY4ghJcimMExViBimjbjYRSa+WIb/zh3QxNoXOhQAXx3tiuw==} 531 635 cpu: [arm] 532 636 os: [linux] 533 637 534 - '@libsql/linux-arm-musleabihf@0.5.13': 535 - resolution: {integrity: sha512-NMDgLqryYBv4Sr3WoO/m++XDjR5KLlw9r/JK4Ym6A1XBv2bxQQNhH0Lxx3bjLW8qqhBD4+0xfms4d2cOlexPyA==} 638 + '@libsql/linux-arm-musleabihf@0.5.17': 639 + resolution: {integrity: sha512-vxOkSLG9Wspit+SNle84nuIzMtr2G2qaxFzW7BhsZBjlZ8+kErf9RXcT2YJQdJYxmBYRbsOrc91gg0jLEQVCqg==} 536 640 cpu: [arm] 537 641 os: [linux] 538 642 539 - '@libsql/linux-arm64-gnu@0.5.13': 540 - resolution: {integrity: sha512-/wCxVdrwl1ee6D6LEjwl+w4SxuLm5UL9Kb1LD5n0bBGs0q+49ChdPPh7tp175iRgkcrTgl23emymvt1yj3KxVQ==} 643 + '@libsql/linux-arm64-gnu@0.5.17': 644 + resolution: {integrity: sha512-L8jnaN01TxjBJlDuDTX2W2BKzBkAOhcnKfCOf3xzvvygblxnDOK0whkYwIXeTfwtd/rr4jN/d6dZD/bcHiDxEQ==} 541 645 cpu: [arm64] 542 646 os: [linux] 543 647 544 - '@libsql/linux-arm64-musl@0.5.13': 545 - resolution: {integrity: sha512-xnVAbZIanUgX57XqeI5sNaDnVilp0Di5syCLSEo+bRyBobe/1IAeehNZpyVbCy91U2N6rH1C/mZU7jicVI9x+A==} 648 + '@libsql/linux-arm64-musl@0.5.17': 649 + resolution: {integrity: sha512-HfFD7TzQtmmTwyQsuiHhWZdMRtdNpKJ1p4tbMMTMRECk+971NFHrj69D64cc2ClVTAmn7fA9XibKPil7WN/Q7w==} 546 650 cpu: [arm64] 547 651 os: [linux] 548 652 549 - '@libsql/linux-x64-gnu@0.5.13': 550 - resolution: {integrity: sha512-/mfMRxcQAI9f8t7tU3QZyh25lXgXKzgin9B9TOSnchD73PWtsVhlyfA6qOCfjQl5kr4sHscdXD5Yb3KIoUgrpQ==} 653 + '@libsql/linux-x64-gnu@0.5.17': 654 + resolution: {integrity: sha512-5l3XxWqUPVFrtX0xnZaXwqsXs0BFbP4w6ahRFTPSdXU50YBfUOajFznJRB6bJTMsCvraDSD0IkHhjSNfrE1CuQ==} 551 655 cpu: [x64] 552 656 os: [linux] 553 657 554 - '@libsql/linux-x64-musl@0.5.13': 555 - resolution: {integrity: sha512-rdefPTpQCVwUjIQYbDLMv3qpd5MdrT0IeD0UZPGqhT9AWU8nJSQoj2lfyIDAWEz7PPOVCY4jHuEn7FS2sw9kRA==} 658 + '@libsql/linux-x64-musl@0.5.17': 659 + resolution: {integrity: sha512-FvSpWlwc+dIeYIFYlsSv+UdQ/NiZWr+SstwVji+QZ//8NnvzwWQU9cgP+Vpps6Qiq4jyYQm9chJhTYOVT9Y3BA==} 556 660 cpu: [x64] 557 661 os: [linux] 558 662 559 - '@libsql/win32-x64-msvc@0.5.13': 560 - resolution: {integrity: sha512-aNcmDrD1Ws+dNZIv9ECbxBQumqB9MlSVEykwfXJpqv/593nABb8Ttg5nAGUPtnADyaGDTrGvPPP81d/KsKho4Q==} 663 + '@libsql/win32-x64-msvc@0.5.17': 664 + resolution: {integrity: sha512-f5bGH8+3A5sn6Lrqg8FsQ09a1pYXPnKGXGTFiAYlfQXVst1tUTxDTugnuWcJYKXyzDe/T7ccxyIZXeSmPOhq8A==} 561 665 cpu: [x64] 562 666 os: [win32] 563 667 ··· 576 680 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 577 681 engines: {node: '>= 8'} 578 682 579 - '@pkgr/core@0.2.7': 580 - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} 683 + '@phosphor-icons/core@2.1.1': 684 + resolution: {integrity: sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==} 685 + 686 + '@pkgr/core@0.2.9': 687 + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} 581 688 engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 582 689 583 690 '@rtsao/scc@1.1.0': 584 691 resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 585 692 586 - '@skyware/jetstream@0.2.2': 587 - resolution: {integrity: sha512-d1MtWPTIFEciSzV8OClXZCJoz0DJ7aupt4EZSwpGAASYG0ZIPmZTt7RVJkoFzQyqRPHAMD7CvEwu0ut3MHX1og==} 693 + '@scalar/code-highlight@0.1.9': 694 + resolution: {integrity: sha512-WUUVDd1Wk7QJVKWXl/Zdn/VINc2pc1NlWW8VJFYZRm3/hKJwBhi0on7+HjVQNKgUaRy7+zluru5Ckl1gcTHHEg==} 695 + engines: {node: '>=20'} 696 + 697 + '@scalar/components@0.14.23': 698 + resolution: {integrity: sha512-rmIMRrlqOWlXAJaVbr9DArrKKp95P2fllNM69VrEAHtwMReambBRKuC02cQPwOZcbZCtPx4dZsv2aUB5QdtecQ==} 699 + engines: {node: '>=20'} 700 + 701 + '@scalar/core@0.3.11': 702 + resolution: {integrity: sha512-4O3mC29k2STz4quBHrpsl6czxi94F3dy8Ej/OPbELS2myKO4GoxromT0BiKSLPAThCnmJ0rqMZ7k9NsgzVjEgA==} 703 + engines: {node: '>=20'} 704 + 705 + '@scalar/helpers@0.0.7': 706 + resolution: {integrity: sha512-ieexJgofs0PPAp3yxz+0S2tI/GWvo9btxplHE5KxUiWwq2bksYnrhrt+gwe4DoGPRaajzutzJuD1u4VnJd9bNA==} 707 + engines: {node: '>=20'} 708 + 709 + '@scalar/hono-api-reference@0.9.13': 710 + resolution: {integrity: sha512-79Gs+/2/FcqwZ3Lp0lsv3pFKHY1qBF2ONkfgh/gxRsd8Z+RZRTDBZafe7OConj+c4tHm0Zz3bKTKEV0OMQi/aA==} 711 + engines: {node: '>=20'} 712 + peerDependencies: 713 + hono: ^4.0.0 714 + 715 + '@scalar/icons@0.4.6': 716 + resolution: {integrity: sha512-ho9ee29Ik+Jv17bSaQEXvGn1e2ydNEyc7Sv8A8hqPq084aIOiTBtVFISPPt+k/O6z0SIRayfL8FEZqr93GyZPg==} 717 + engines: {node: '>=20'} 718 + 719 + '@scalar/json-magic@0.1.0': 720 + resolution: {integrity: sha512-Slq3nheaAzbhLMdjgKHsJBNyEYv2ekDnWaOagOflo6K5XOx6UTmCLclaj26z89ihpTgWWtQJIRDC8bsRIJwpAg==} 721 + engines: {node: '>=20'} 722 + 723 + '@scalar/oas-utils@0.4.18': 724 + resolution: {integrity: sha512-1VsTZLIEThZ7vwa3Fych4Ks1VTf8JetCuP8LA1VlamAhl/+qpLn9mgvxKSAdTyiLzM8ST5jtDi/Pg/2qWbTlzw==} 725 + engines: {node: '>=20'} 726 + 727 + '@scalar/object-utils@1.2.3': 728 + resolution: {integrity: sha512-1LW2pHs2jp5ixyK+NdpAyuUlOL+iJ8wQ0P2EgV45vLJ8YeZo5DtxQbKuFyqoaviTYjg2MWs1exavYP/qAaSqyQ==} 729 + engines: {node: '>=20'} 730 + 731 + '@scalar/openapi-parser@0.19.0': 732 + resolution: {integrity: sha512-U1FDug4NFK+o1ib93L2MerW13s61sEDPDgrmO14mp5qAV5iYkC2l0KqKQLMIbt3sWw6fDy900eXNKIgUuge4BA==} 733 + engines: {node: '>=20'} 734 + 735 + '@scalar/openapi-to-markdown@0.2.26': 736 + resolution: {integrity: sha512-GqA1aItKQoTz6r36ClCSPqLCPHFDvMT4f7oNeg0mdzcNzN7/EE9DdMqNQFihkg5OPtl32nQFxL+r/XFwgGXDlQ==} 737 + engines: {node: '>=20'} 738 + 739 + '@scalar/openapi-types@0.3.7': 740 + resolution: {integrity: sha512-QHSvHBVDze3+dUwAhIGq6l1iOev4jdoqdBK7QpfeN1Q4h+6qpVEw3EEqBiH0AXUSh/iWwObBv4uMgfIx0aNZ5g==} 741 + engines: {node: '>=20'} 742 + 743 + '@scalar/snippetz@0.4.4': 744 + resolution: {integrity: sha512-Vml82Jhzr10lLj4bUrwZAcn4ym63pzfH+fOkrJ0Ig/dM9dP1bAHmwHkEDaUQkiGM6x2KIhe2eMsJtO7Y+VgHOQ==} 745 + engines: {node: '>=20'} 746 + 747 + '@scalar/themes@0.13.12': 748 + resolution: {integrity: sha512-fM010t8npZ8XqGle7ZjoAFGEfzkJ1XjEk1W3OJ5nLzSLq3hXXp72f4wHp6eaKoDWw8rFq+ZeOZk1GP7PgSr/Jw==} 749 + engines: {node: '>=20'} 750 + 751 + '@scalar/types@0.2.11': 752 + resolution: {integrity: sha512-SUZzGmoisWsYv33LmmT/ajvSlcl9ZDj9d5RncJ+wB9ZQ2l018xlfpDIH9Kdfo+6KCKQOe3LYLXfH4Lzm891Mag==} 753 + engines: {node: '>=20'} 754 + 755 + '@scalar/use-hooks@0.2.4': 756 + resolution: {integrity: sha512-TXviVV9Cfmei6g24QadnfuFj2r1YkZY56ufsSnwHgLNbtDRd9U9jXGIswXAuA+k7whaEVEgcoZ3Zmq2v5ZLF8w==} 757 + engines: {node: '>=20'} 758 + 759 + '@scalar/use-toasts@0.8.0': 760 + resolution: {integrity: sha512-u+o77cdTNZ5ePqHPu8ZcFw1BLlISv+cthN0bR1zJHXmqBjvanFTy2kL+Gmv3eW9HxZiHdqycKVETlYd0mWiqJQ==} 761 + engines: {node: '>=20'} 762 + 763 + '@scalar/workspace-store@0.12.0': 764 + resolution: {integrity: sha512-e0OMEYTrQ6D/8gg4lAIim5lL5utK+8zLH5mdriYY34L9UszLTbzGTesZBfNA15Eao1mo7f3hbyRJPPBydwo0rw==} 765 + engines: {node: '>=18'} 766 + 767 + '@sinclair/typebox@0.34.37': 768 + resolution: {integrity: sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==} 769 + 770 + '@skyware/jetstream@0.2.5': 771 + resolution: {integrity: sha512-fM/zs03DLwqRyzZZJFWN20e76KrdqIp97Tlm8Cek+vxn96+tu5d/fx79V6H85L0QN6HvGiX2l9A8hWFqHvYlOA==} 772 + 773 + '@swc/helpers@0.5.17': 774 + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} 775 + 776 + '@tanstack/virtual-core@3.13.12': 777 + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} 778 + 779 + '@tanstack/vue-virtual@3.13.12': 780 + resolution: {integrity: sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==} 781 + peerDependencies: 782 + vue: ^2.7.0 || ^3.0.0 783 + 784 + '@types/debug@4.1.12': 785 + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 588 786 589 787 '@types/estree@1.0.8': 590 788 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 789 + 790 + '@types/har-format@1.2.16': 791 + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} 792 + 793 + '@types/hast@3.0.4': 794 + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 591 795 592 796 '@types/json-schema@7.0.15': 593 797 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} ··· 595 799 '@types/json5@0.0.29': 596 800 resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 597 801 598 - '@types/node@24.0.10': 599 - resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} 802 + '@types/mdast@4.0.4': 803 + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 804 + 805 + '@types/ms@2.1.0': 806 + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 807 + 808 + '@types/node@22.17.2': 809 + resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} 810 + 811 + '@types/node@24.3.0': 812 + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} 600 813 601 814 '@types/triple-beam@1.3.5': 602 815 resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} 603 816 817 + '@types/unist@3.0.3': 818 + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 819 + 820 + '@types/web-bluetooth@0.0.20': 821 + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} 822 + 604 823 '@types/ws@8.18.1': 605 824 resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} 606 825 607 - '@typescript-eslint/eslint-plugin@8.35.1': 608 - resolution: {integrity: sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==} 826 + '@typescript-eslint/eslint-plugin@8.40.0': 827 + resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} 609 828 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 610 829 peerDependencies: 611 - '@typescript-eslint/parser': ^8.35.1 830 + '@typescript-eslint/parser': ^8.40.0 612 831 eslint: ^8.57.0 || ^9.0.0 613 - typescript: '>=4.8.4 <5.9.0' 832 + typescript: '>=4.8.4 <6.0.0' 614 833 615 - '@typescript-eslint/parser@8.35.1': 616 - resolution: {integrity: sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==} 834 + '@typescript-eslint/parser@8.40.0': 835 + resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} 617 836 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 618 837 peerDependencies: 619 838 eslint: ^8.57.0 || ^9.0.0 620 - typescript: '>=4.8.4 <5.9.0' 839 + typescript: '>=4.8.4 <6.0.0' 621 840 622 - '@typescript-eslint/project-service@8.35.1': 623 - resolution: {integrity: sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==} 841 + '@typescript-eslint/project-service@8.40.0': 842 + resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} 624 843 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 625 844 peerDependencies: 626 - typescript: '>=4.8.4 <5.9.0' 845 + typescript: '>=4.8.4 <6.0.0' 627 846 628 - '@typescript-eslint/scope-manager@8.35.1': 629 - resolution: {integrity: sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==} 847 + '@typescript-eslint/scope-manager@8.40.0': 848 + resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} 630 849 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 631 850 632 - '@typescript-eslint/tsconfig-utils@8.35.1': 633 - resolution: {integrity: sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==} 851 + '@typescript-eslint/tsconfig-utils@8.40.0': 852 + resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} 634 853 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 635 854 peerDependencies: 636 - typescript: '>=4.8.4 <5.9.0' 855 + typescript: '>=4.8.4 <6.0.0' 637 856 638 - '@typescript-eslint/type-utils@8.35.1': 639 - resolution: {integrity: sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==} 857 + '@typescript-eslint/type-utils@8.40.0': 858 + resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} 640 859 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 641 860 peerDependencies: 642 861 eslint: ^8.57.0 || ^9.0.0 643 - typescript: '>=4.8.4 <5.9.0' 862 + typescript: '>=4.8.4 <6.0.0' 644 863 645 - '@typescript-eslint/types@8.35.1': 646 - resolution: {integrity: sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==} 864 + '@typescript-eslint/types@8.40.0': 865 + resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} 647 866 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 648 867 649 - '@typescript-eslint/typescript-estree@8.35.1': 650 - resolution: {integrity: sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==} 868 + '@typescript-eslint/typescript-estree@8.40.0': 869 + resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} 651 870 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 652 871 peerDependencies: 653 - typescript: '>=4.8.4 <5.9.0' 872 + typescript: '>=4.8.4 <6.0.0' 654 873 655 - '@typescript-eslint/utils@8.35.1': 656 - resolution: {integrity: sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==} 874 + '@typescript-eslint/utils@8.40.0': 875 + resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} 657 876 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 658 877 peerDependencies: 659 878 eslint: ^8.57.0 || ^9.0.0 660 - typescript: '>=4.8.4 <5.9.0' 879 + typescript: '>=4.8.4 <6.0.0' 661 880 662 - '@typescript-eslint/visitor-keys@8.35.1': 663 - resolution: {integrity: sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==} 881 + '@typescript-eslint/visitor-keys@8.40.0': 882 + resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} 664 883 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 665 884 885 + '@ungap/structured-clone@1.3.0': 886 + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 887 + 888 + '@vue/compiler-core@3.5.18': 889 + resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} 890 + 891 + '@vue/compiler-dom@3.5.18': 892 + resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} 893 + 894 + '@vue/compiler-sfc@3.5.18': 895 + resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==} 896 + 897 + '@vue/compiler-ssr@3.5.18': 898 + resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==} 899 + 900 + '@vue/reactivity@3.5.18': 901 + resolution: {integrity: sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==} 902 + 903 + '@vue/runtime-core@3.5.18': 904 + resolution: {integrity: sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==} 905 + 906 + '@vue/runtime-dom@3.5.18': 907 + resolution: {integrity: sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==} 908 + 909 + '@vue/server-renderer@3.5.18': 910 + resolution: {integrity: sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==} 911 + peerDependencies: 912 + vue: 3.5.18 913 + 914 + '@vue/shared@3.5.18': 915 + resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} 916 + 917 + '@vueuse/core@10.11.1': 918 + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} 919 + 920 + '@vueuse/core@11.3.0': 921 + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} 922 + 923 + '@vueuse/metadata@10.11.1': 924 + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} 925 + 926 + '@vueuse/metadata@11.3.0': 927 + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} 928 + 929 + '@vueuse/shared@10.11.1': 930 + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} 931 + 932 + '@vueuse/shared@11.3.0': 933 + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} 934 + 666 935 acorn-jsx@5.3.2: 667 936 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 668 937 peerDependencies: ··· 673 942 engines: {node: '>=0.4.0'} 674 943 hasBin: true 675 944 945 + ajv-draft-04@1.0.0: 946 + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} 947 + peerDependencies: 948 + ajv: ^8.5.0 949 + peerDependenciesMeta: 950 + ajv: 951 + optional: true 952 + 953 + ajv-formats@3.0.1: 954 + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} 955 + peerDependencies: 956 + ajv: ^8.0.0 957 + peerDependenciesMeta: 958 + ajv: 959 + optional: true 960 + 676 961 ajv@6.12.6: 677 962 resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 678 963 964 + ajv@8.17.1: 965 + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 966 + 679 967 ansi-styles@4.3.0: 680 968 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 681 969 engines: {node: '>=8'} 682 970 683 971 argparse@2.0.1: 684 972 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 973 + 974 + aria-hidden@1.2.6: 975 + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} 976 + engines: {node: '>=10'} 685 977 686 978 array-buffer-byte-length@1.0.2: 687 979 resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} ··· 717 1009 available-typed-arrays@1.0.7: 718 1010 resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 719 1011 engines: {node: '>= 0.4'} 1012 + 1013 + bail@2.0.2: 1014 + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 720 1015 721 1016 balanced-match@1.0.2: 722 1017 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} ··· 753 1048 resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 754 1049 engines: {node: '>=6'} 755 1050 1051 + camel-case@4.1.2: 1052 + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} 1053 + 1054 + ccount@2.0.1: 1055 + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 1056 + 756 1057 chalk@4.1.2: 757 1058 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 758 1059 engines: {node: '>=10'} 759 1060 1061 + chalk@5.6.0: 1062 + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} 1063 + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 1064 + 1065 + character-entities-html4@2.1.0: 1066 + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 1067 + 1068 + character-entities-legacy@3.0.0: 1069 + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 1070 + 1071 + character-entities@2.0.2: 1072 + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 1073 + 1074 + clean-css@5.3.3: 1075 + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} 1076 + engines: {node: '>= 10.0'} 1077 + 1078 + clsx@2.1.1: 1079 + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 1080 + engines: {node: '>=6'} 1081 + 760 1082 color-convert@1.9.3: 761 1083 resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 762 1084 ··· 779 1101 colorspace@1.1.4: 780 1102 resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} 781 1103 1104 + comma-separated-tokens@2.0.3: 1105 + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 1106 + 1107 + commander@10.0.1: 1108 + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 1109 + engines: {node: '>=14'} 1110 + 1111 + commander@2.20.3: 1112 + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 1113 + 782 1114 concat-map@0.0.1: 783 1115 resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1116 + 1117 + content-type@1.0.5: 1118 + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 1119 + engines: {node: '>= 0.6'} 784 1120 785 1121 cross-spawn@7.0.6: 786 1122 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 787 1123 engines: {node: '>= 8'} 788 1124 1125 + csstype@3.1.3: 1126 + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1127 + 1128 + cva@1.0.0-beta.2: 1129 + resolution: {integrity: sha512-dqcOFe247I5pKxfuzqfq3seLL5iMYsTgo40Uw7+pKZAntPgFtR7Tmy59P5IVIq/XgB0NQWoIvYDt9TwHkuK8Cg==} 1130 + peerDependencies: 1131 + typescript: '>= 4.5.5 < 6' 1132 + peerDependenciesMeta: 1133 + typescript: 1134 + optional: true 1135 + 1136 + dank-each@1.0.0: 1137 + resolution: {integrity: sha512-gMDy24y+3LlnAaHq4WFwRKliMZRkGp41Gy9JVsD1BO5tprb/lEh4afJlkankcTqRoppSaHRwgFQX61QjJ5ClfQ==} 1138 + 1139 + dank-map@0.1.0: 1140 + resolution: {integrity: sha512-mQoLySkWc5bQM8XKXz0rIuISX/+12rSSfPojYlTVT6KPj3LsvfLURtrv0w+QEt1gRIKwp9mxnwOcL5nsOTkk2Q==} 1141 + 789 1142 data-uri-to-buffer@4.0.1: 790 1143 resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 791 1144 engines: {node: '>= 12'} ··· 819 1172 supports-color: 820 1173 optional: true 821 1174 1175 + decode-named-character-reference@1.2.0: 1176 + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} 1177 + 822 1178 deep-is@0.1.4: 823 1179 resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 824 1180 ··· 830 1186 resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 831 1187 engines: {node: '>= 0.4'} 832 1188 1189 + defu@6.1.4: 1190 + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 1191 + 1192 + dequal@2.0.3: 1193 + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 1194 + engines: {node: '>=6'} 1195 + 833 1196 detect-libc@2.0.2: 834 1197 resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} 835 1198 engines: {node: '>=8'} 836 1199 1200 + devlop@1.1.0: 1201 + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 1202 + 837 1203 doctrine@2.1.0: 838 1204 resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 839 1205 engines: {node: '>=0.10.0'} 1206 + 1207 + dot-case@3.0.4: 1208 + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 840 1209 841 1210 drizzle-kit@0.31.4: 842 1211 resolution: {integrity: sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA==} 843 1212 hasBin: true 844 1213 845 - drizzle-orm@0.44.2: 846 - resolution: {integrity: sha512-zGAqBzWWkVSFjZpwPOrmCrgO++1kZ5H/rZ4qTGeGOe18iXGVJWf3WPfHOVwFIbmi8kHjfJstC6rJomzGx8g/dQ==} 1214 + drizzle-orm@0.44.4: 1215 + resolution: {integrity: sha512-ZyzKFpTC/Ut3fIqc2c0dPZ6nhchQXriTsqTNs4ayRgl6sZcFlMs9QZKPSHXK4bdOf41GHGWf+FrpcDDYwW+W6Q==} 847 1216 peerDependencies: 848 1217 '@aws-sdk/client-rds-data': '>=3' 849 1218 '@cloudflare/workers-types': '>=4' ··· 941 1310 enabled@2.0.0: 942 1311 resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} 943 1312 1313 + entities@4.5.0: 1314 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1315 + engines: {node: '>=0.12'} 1316 + 1317 + entities@6.0.1: 1318 + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 1319 + engines: {node: '>=0.12'} 1320 + 944 1321 es-abstract@1.24.0: 945 1322 resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} 946 1323 engines: {node: '>= 0.4'} ··· 979 1356 engines: {node: '>=12'} 980 1357 hasBin: true 981 1358 982 - esbuild@0.25.5: 983 - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 1359 + esbuild@0.25.9: 1360 + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} 984 1361 engines: {node: '>=18'} 985 1362 hasBin: true 986 1363 ··· 988 1365 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 989 1366 engines: {node: '>=10'} 990 1367 991 - eslint-config-prettier@10.1.5: 992 - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} 1368 + escape-string-regexp@5.0.0: 1369 + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 1370 + engines: {node: '>=12'} 1371 + 1372 + eslint-config-prettier@10.1.8: 1373 + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} 993 1374 hasBin: true 994 1375 peerDependencies: 995 1376 eslint: '>=7.0.0' ··· 1033 1414 '@typescript-eslint/parser': 1034 1415 optional: true 1035 1416 1036 - eslint-plugin-prettier@5.5.1: 1037 - resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} 1417 + eslint-plugin-prettier@5.5.4: 1418 + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} 1038 1419 engines: {node: ^14.18.0 || >=16.0.0} 1039 1420 peerDependencies: 1040 1421 '@types/eslint': '>=8.0.0' ··· 1059 1440 resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 1060 1441 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1061 1442 1062 - eslint@9.30.1: 1063 - resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} 1443 + eslint@9.33.0: 1444 + resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} 1064 1445 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1065 1446 hasBin: true 1066 1447 peerDependencies: ··· 1088 1469 resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1089 1470 engines: {node: '>=4.0'} 1090 1471 1472 + estree-walker@2.0.2: 1473 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1474 + 1091 1475 esutils@2.0.3: 1092 1476 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1093 1477 engines: {node: '>=0.10.0'} ··· 1095 1479 event-target-polyfill@0.0.4: 1096 1480 resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} 1097 1481 1482 + extend@3.0.2: 1483 + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 1484 + 1098 1485 fast-deep-equal@3.1.3: 1099 1486 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1100 1487 ··· 1110 1497 1111 1498 fast-levenshtein@2.0.6: 1112 1499 resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1500 + 1501 + fast-uri@3.0.6: 1502 + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} 1113 1503 1114 1504 fastq@1.19.1: 1115 1505 resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} ··· 1170 1560 resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 1171 1561 engines: {node: '>= 0.4'} 1172 1562 1563 + get-own-enumerable-keys@1.0.0: 1564 + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} 1565 + engines: {node: '>=14.16'} 1566 + 1173 1567 get-proto@1.0.1: 1174 1568 resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 1175 1569 engines: {node: '>= 0.4'} ··· 1180 1574 1181 1575 get-tsconfig@4.10.1: 1182 1576 resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} 1577 + 1578 + github-slugger@2.0.0: 1579 + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} 1183 1580 1184 1581 glob-parent@5.1.2: 1185 1582 resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} ··· 1235 1632 resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1236 1633 engines: {node: '>= 0.4'} 1237 1634 1238 - hono@4.8.4: 1239 - resolution: {integrity: sha512-KOIBp1+iUs0HrKztM4EHiB2UtzZDTBihDtOF5K6+WaJjCPeaW4Q92R8j63jOhvJI5+tZSMuKD9REVEXXY9illg==} 1635 + hast-util-embedded@3.0.0: 1636 + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} 1637 + 1638 + hast-util-format@1.1.0: 1639 + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} 1640 + 1641 + hast-util-from-html@2.0.3: 1642 + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} 1643 + 1644 + hast-util-from-parse5@8.0.3: 1645 + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} 1646 + 1647 + hast-util-has-property@3.0.0: 1648 + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} 1649 + 1650 + hast-util-is-body-ok-link@3.0.1: 1651 + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} 1652 + 1653 + hast-util-is-element@3.0.0: 1654 + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} 1655 + 1656 + hast-util-minify-whitespace@1.0.1: 1657 + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} 1658 + 1659 + hast-util-parse-selector@4.0.0: 1660 + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 1661 + 1662 + hast-util-phrasing@3.0.1: 1663 + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} 1664 + 1665 + hast-util-raw@9.1.0: 1666 + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} 1667 + 1668 + hast-util-sanitize@5.0.2: 1669 + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} 1670 + 1671 + hast-util-to-html@9.0.5: 1672 + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} 1673 + 1674 + hast-util-to-mdast@10.1.2: 1675 + resolution: {integrity: sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==} 1676 + 1677 + hast-util-to-parse5@8.0.0: 1678 + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} 1679 + 1680 + hast-util-to-text@4.0.2: 1681 + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} 1682 + 1683 + hast-util-whitespace@3.0.0: 1684 + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 1685 + 1686 + hastscript@9.0.1: 1687 + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} 1688 + 1689 + highlight.js@11.11.1: 1690 + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} 1691 + engines: {node: '>=12.0.0'} 1692 + 1693 + highlightjs-curl@1.3.0: 1694 + resolution: {integrity: sha512-50UEfZq1KR0Lfk2Tr6xb/MUIZH3h10oNC0OTy9g7WELcs5Fgy/mKN1vEhuKTkKbdo8vr5F9GXstu2eLhApfQ3A==} 1695 + 1696 + highlightjs-vue@1.0.0: 1697 + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} 1698 + 1699 + hono@4.9.2: 1700 + resolution: {integrity: sha512-UG2jXGS/gkLH42l/1uROnwXpkjvvxkl3kpopL3LBo27NuaDPI6xHNfuUSilIHcrBkPfl4y0z6y2ByI455TjNRw==} 1240 1701 engines: {node: '>=16.9.0'} 1702 + 1703 + html-minifier-terser@7.2.0: 1704 + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} 1705 + engines: {node: ^14.13.1 || >=16.0.0} 1706 + hasBin: true 1707 + 1708 + html-void-elements@3.0.0: 1709 + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 1710 + 1711 + html-whitespace-sensitive-tag-names@3.0.1: 1712 + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} 1241 1713 1242 1714 ignore@5.3.2: 1243 1715 resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} ··· 1261 1733 internal-slot@1.1.0: 1262 1734 resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1263 1735 engines: {node: '>= 0.4'} 1736 + 1737 + is-absolute-url@4.0.1: 1738 + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} 1739 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1264 1740 1265 1741 is-array-buffer@3.0.5: 1266 1742 resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} ··· 1329 1805 resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1330 1806 engines: {node: '>=0.12.0'} 1331 1807 1808 + is-obj@3.0.0: 1809 + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} 1810 + engines: {node: '>=12'} 1811 + 1812 + is-plain-obj@4.1.0: 1813 + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 1814 + engines: {node: '>=12'} 1815 + 1332 1816 is-regex@1.2.1: 1333 1817 resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1334 1818 engines: {node: '>= 0.4'} 1819 + 1820 + is-regexp@3.1.0: 1821 + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} 1822 + engines: {node: '>=12'} 1335 1823 1336 1824 is-set@2.0.3: 1337 1825 resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} ··· 1375 1863 isexe@2.0.0: 1376 1864 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1377 1865 1378 - jiti@2.4.2: 1379 - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 1866 + jiti@2.5.1: 1867 + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} 1380 1868 hasBin: true 1381 1869 1382 - js-base64@3.7.7: 1383 - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} 1870 + js-base64@3.7.8: 1871 + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} 1384 1872 1385 1873 js-yaml@4.1.0: 1386 1874 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} ··· 1392 1880 json-schema-traverse@0.4.1: 1393 1881 resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1394 1882 1883 + json-schema-traverse@1.0.0: 1884 + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1885 + 1395 1886 json-stable-stringify-without-jsonify@1.0.1: 1396 1887 resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1397 1888 1889 + json-stringify-deterministic@1.0.12: 1890 + resolution: {integrity: sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==} 1891 + engines: {node: '>= 4'} 1892 + 1398 1893 json5@1.0.2: 1399 1894 resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1400 1895 hasBin: true 1401 1896 1897 + jsonpointer@5.0.1: 1898 + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} 1899 + engines: {node: '>=0.10.0'} 1900 + 1901 + just-clone@6.2.0: 1902 + resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} 1903 + 1904 + just-curry-it@5.3.0: 1905 + resolution: {integrity: sha512-silMIRiFjUWlfaDhkgSzpuAyQ6EX/o09Eu8ZBfmFwQMbax7+LQzeIU2CBrICT6Ne4l86ITCGvUCBpCubWYy0Yw==} 1906 + 1402 1907 keyv@4.5.4: 1403 1908 resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1404 1909 1405 1910 kuler@2.0.0: 1406 1911 resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} 1407 1912 1913 + leven@4.0.0: 1914 + resolution: {integrity: sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==} 1915 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1916 + 1408 1917 levn@0.4.1: 1409 1918 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1410 1919 engines: {node: '>= 0.8.0'} 1411 1920 1412 - libsql@0.5.13: 1413 - resolution: {integrity: sha512-5Bwoa/CqzgkTwySgqHA5TsaUDRrdLIbdM4egdPcaAnqO3aC+qAgS6BwdzuZwARA5digXwiskogZ8H7Yy4XfdOg==} 1921 + libsql@0.5.17: 1922 + resolution: {integrity: sha512-RRlj5XQI9+Wq+/5UY8EnugSWfRmHEw4hn3DKlPrkUgZONsge1PwTtHcpStP6MSNi8ohcbsRgEHJaymA33a8cBw==} 1414 1923 cpu: [x64, arm64, wasm32, arm] 1415 1924 os: [darwin, linux, win32] 1416 1925 ··· 1425 1934 resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} 1426 1935 engines: {node: '>= 12.0.0'} 1427 1936 1937 + longest-streak@3.1.0: 1938 + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 1939 + 1940 + lower-case@2.0.2: 1941 + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1942 + 1943 + lowlight@3.3.0: 1944 + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} 1945 + 1946 + magic-string@0.30.17: 1947 + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1948 + 1949 + markdown-table@3.0.4: 1950 + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} 1951 + 1428 1952 math-intrinsics@1.1.0: 1429 1953 resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1430 1954 engines: {node: '>= 0.4'} 1431 1955 1956 + mdast-util-find-and-replace@3.0.2: 1957 + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} 1958 + 1959 + mdast-util-from-markdown@2.0.2: 1960 + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} 1961 + 1962 + mdast-util-gfm-autolink-literal@2.0.1: 1963 + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} 1964 + 1965 + mdast-util-gfm-footnote@2.1.0: 1966 + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} 1967 + 1968 + mdast-util-gfm-strikethrough@2.0.0: 1969 + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} 1970 + 1971 + mdast-util-gfm-table@2.0.0: 1972 + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} 1973 + 1974 + mdast-util-gfm-task-list-item@2.0.0: 1975 + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} 1976 + 1977 + mdast-util-gfm@3.1.0: 1978 + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} 1979 + 1980 + mdast-util-phrasing@4.1.0: 1981 + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} 1982 + 1983 + mdast-util-to-hast@13.2.0: 1984 + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} 1985 + 1986 + mdast-util-to-markdown@2.1.2: 1987 + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} 1988 + 1989 + mdast-util-to-string@4.0.0: 1990 + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} 1991 + 1432 1992 merge2@1.4.1: 1433 1993 resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1434 1994 engines: {node: '>= 8'} 1435 1995 1996 + microdiff@1.5.0: 1997 + resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==} 1998 + 1999 + micromark-core-commonmark@2.0.3: 2000 + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} 2001 + 2002 + micromark-extension-gfm-autolink-literal@2.1.0: 2003 + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} 2004 + 2005 + micromark-extension-gfm-footnote@2.1.0: 2006 + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} 2007 + 2008 + micromark-extension-gfm-strikethrough@2.1.0: 2009 + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} 2010 + 2011 + micromark-extension-gfm-table@2.1.1: 2012 + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} 2013 + 2014 + micromark-extension-gfm-tagfilter@2.0.0: 2015 + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} 2016 + 2017 + micromark-extension-gfm-task-list-item@2.1.0: 2018 + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} 2019 + 2020 + micromark-extension-gfm@3.0.0: 2021 + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} 2022 + 2023 + micromark-factory-destination@2.0.1: 2024 + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} 2025 + 2026 + micromark-factory-label@2.0.1: 2027 + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} 2028 + 2029 + micromark-factory-space@2.0.1: 2030 + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} 2031 + 2032 + micromark-factory-title@2.0.1: 2033 + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} 2034 + 2035 + micromark-factory-whitespace@2.0.1: 2036 + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} 2037 + 2038 + micromark-util-character@2.1.1: 2039 + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 2040 + 2041 + micromark-util-chunked@2.0.1: 2042 + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} 2043 + 2044 + micromark-util-classify-character@2.0.1: 2045 + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} 2046 + 2047 + micromark-util-combine-extensions@2.0.1: 2048 + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} 2049 + 2050 + micromark-util-decode-numeric-character-reference@2.0.2: 2051 + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} 2052 + 2053 + micromark-util-decode-string@2.0.1: 2054 + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} 2055 + 2056 + micromark-util-encode@2.0.1: 2057 + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 2058 + 2059 + micromark-util-html-tag-name@2.0.1: 2060 + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} 2061 + 2062 + micromark-util-normalize-identifier@2.0.1: 2063 + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} 2064 + 2065 + micromark-util-resolve-all@2.0.1: 2066 + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} 2067 + 2068 + micromark-util-sanitize-uri@2.0.1: 2069 + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 2070 + 2071 + micromark-util-subtokenize@2.1.0: 2072 + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} 2073 + 2074 + micromark-util-symbol@2.0.1: 2075 + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 2076 + 2077 + micromark-util-types@2.0.2: 2078 + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 2079 + 2080 + micromark@4.0.2: 2081 + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} 2082 + 1436 2083 micromatch@4.0.8: 1437 2084 resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1438 2085 engines: {node: '>=8.6'} ··· 1450 2097 ms@2.1.3: 1451 2098 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1452 2099 2100 + nanoid@3.3.11: 2101 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 2102 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2103 + hasBin: true 2104 + 2105 + nanoid@5.1.5: 2106 + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} 2107 + engines: {node: ^18 || >=20} 2108 + hasBin: true 2109 + 1453 2110 natural-compare@1.4.0: 1454 2111 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2112 + 2113 + no-case@3.0.4: 2114 + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1455 2115 1456 2116 node-domexception@1.0.0: 1457 2117 resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} ··· 1469 2129 object-keys@1.1.1: 1470 2130 resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1471 2131 engines: {node: '>= 0.4'} 2132 + 2133 + object-to-xml@2.0.0: 2134 + resolution: {integrity: sha512-bArXy7WCF1V9R88/zF9adSZSeFQnFmmKhMqNuNLAxqrbkvzcWP8HgnaRCcVJsfvIgvpdHiYd0qzJi7LM7QFfcQ==} 1472 2135 1473 2136 object.assign@4.1.7: 1474 2137 resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} ··· 1504 2167 p-locate@5.0.0: 1505 2168 resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1506 2169 engines: {node: '>=10'} 2170 + 2171 + param-case@3.0.4: 2172 + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} 1507 2173 1508 2174 parent-module@1.0.1: 1509 2175 resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1510 2176 engines: {node: '>=6'} 1511 2177 1512 - partysocket@1.1.4: 1513 - resolution: {integrity: sha512-jXP7PFj2h5/v4UjDS8P7MZy6NJUQ7sspiFyxL4uc/+oKOL+KdtXzHnTV8INPGxBrLTXgalyG3kd12Qm7WrYc3A==} 2178 + parse5@7.3.0: 2179 + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 2180 + 2181 + partysocket@1.1.5: 2182 + resolution: {integrity: sha512-8uw9foq9bij4sKLCtTSHvyqMrMTQ5FJjrHc7BjoM2s95Vu7xYCN63ABpI7OZHC7ZMP5xaom/A+SsoFPXmTV6ZQ==} 2183 + 2184 + pascal-case@3.1.2: 2185 + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 1514 2186 1515 2187 path-exists@4.0.0: 1516 2188 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} ··· 1534 2206 resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1535 2207 engines: {node: '>= 0.4'} 1536 2208 2209 + postcss@8.5.6: 2210 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 2211 + engines: {node: ^10 || ^12 || >=14} 2212 + 1537 2213 prelude-ls@1.2.1: 1538 2214 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1539 2215 engines: {node: '>= 0.8.0'} ··· 1546 2222 resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 1547 2223 engines: {node: '>=14'} 1548 2224 hasBin: true 2225 + 2226 + pretty-bytes@6.1.1: 2227 + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} 2228 + engines: {node: ^14.13.1 || >=16.0.0} 1549 2229 1550 2230 promise-limit@2.7.0: 1551 2231 resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} 2232 + 2233 + property-information@6.5.0: 2234 + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} 2235 + 2236 + property-information@7.1.0: 2237 + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} 1552 2238 1553 2239 punycode@2.3.1: 1554 2240 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} ··· 1557 2243 queue-microtask@1.2.3: 1558 2244 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1559 2245 2246 + radix-vue@1.9.17: 2247 + resolution: {integrity: sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==} 2248 + peerDependencies: 2249 + vue: '>= 3.2.0' 2250 + 1560 2251 readable-stream@3.6.2: 1561 2252 resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1562 2253 engines: {node: '>= 6'} ··· 1569 2260 resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1570 2261 engines: {node: '>= 0.4'} 1571 2262 2263 + rehype-external-links@3.0.0: 2264 + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} 2265 + 2266 + rehype-format@5.0.1: 2267 + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} 2268 + 2269 + rehype-minify-whitespace@6.0.2: 2270 + resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==} 2271 + 2272 + rehype-parse@9.0.1: 2273 + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} 2274 + 2275 + rehype-raw@7.0.0: 2276 + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} 2277 + 2278 + rehype-remark@10.0.1: 2279 + resolution: {integrity: sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==} 2280 + 2281 + rehype-sanitize@6.0.0: 2282 + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} 2283 + 2284 + rehype-stringify@10.0.1: 2285 + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} 2286 + 2287 + relateurl@0.2.7: 2288 + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} 2289 + engines: {node: '>= 0.10'} 2290 + 2291 + remark-gfm@4.0.1: 2292 + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} 2293 + 2294 + remark-parse@11.0.0: 2295 + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} 2296 + 2297 + remark-rehype@11.1.2: 2298 + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} 2299 + 2300 + remark-stringify@11.0.0: 2301 + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} 2302 + 2303 + require-from-string@2.0.2: 2304 + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 2305 + engines: {node: '>=0.10.0'} 2306 + 1572 2307 resolve-from@4.0.0: 1573 2308 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1574 2309 engines: {node: '>=4'} ··· 1606 2341 safe-stable-stringify@2.5.0: 1607 2342 resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 1608 2343 engines: {node: '>=10'} 2344 + 2345 + sanitizer@0.1.3: 2346 + resolution: {integrity: sha512-j05vL56tR90rsYqm9ZD05v6K4HI7t4yMDEvvU0x4f+IADXM9Jx1x9mzatxOs5drJq6dGhugxDW99mcPvXVLl+Q==} 1609 2347 1610 2348 semver@6.3.1: 1611 2349 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} ··· 1655 2393 simple-swizzle@0.2.2: 1656 2394 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1657 2395 2396 + source-map-js@1.2.1: 2397 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 2398 + engines: {node: '>=0.10.0'} 2399 + 1658 2400 source-map-support@0.5.21: 1659 2401 resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1660 2402 ··· 1662 2404 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1663 2405 engines: {node: '>=0.10.0'} 1664 2406 2407 + space-separated-tokens@2.0.2: 2408 + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 2409 + 1665 2410 stack-trace@0.0.10: 1666 2411 resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 1667 2412 ··· 1684 2429 string_decoder@1.3.0: 1685 2430 resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1686 2431 2432 + stringify-entities@4.0.4: 2433 + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 2434 + 2435 + stringify-object@5.0.0: 2436 + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} 2437 + engines: {node: '>=14.16'} 2438 + 1687 2439 strip-bom@3.0.0: 1688 2440 resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1689 2441 engines: {node: '>=4'} ··· 1700 2452 resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1701 2453 engines: {node: '>= 0.4'} 1702 2454 1703 - synckit@0.11.8: 1704 - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 2455 + synckit@0.11.11: 2456 + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} 1705 2457 engines: {node: ^14.18.0 || >=16.0.0} 1706 2458 2459 + tailwind-merge@2.6.0: 2460 + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} 2461 + 2462 + terser@5.43.1: 2463 + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} 2464 + engines: {node: '>=10'} 2465 + hasBin: true 2466 + 1707 2467 text-hex@1.0.0: 1708 2468 resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} 2469 + 2470 + tiny-emitter@2.1.0: 2471 + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} 1709 2472 1710 2473 to-regex-range@5.0.1: 1711 2474 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} ··· 1714 2477 toml@3.0.0: 1715 2478 resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} 1716 2479 2480 + trim-lines@3.0.1: 2481 + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 2482 + 2483 + trim-trailing-lines@2.1.0: 2484 + resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==} 2485 + 1717 2486 triple-beam@1.4.1: 1718 2487 resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} 1719 2488 engines: {node: '>= 14.0.0'} 1720 2489 2490 + trough@2.2.0: 2491 + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} 2492 + 1721 2493 ts-api-utils@2.1.0: 1722 2494 resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1723 2495 engines: {node: '>=18.12'} 1724 2496 peerDependencies: 1725 2497 typescript: '>=4.8.4' 1726 2498 2499 + ts-deepmerge@7.0.3: 2500 + resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} 2501 + engines: {node: '>=14.13.1'} 2502 + 1727 2503 tsconfig-paths@3.15.0: 1728 2504 resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 1729 2505 1730 - tsx@4.20.3: 1731 - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} 2506 + tslib@2.8.1: 2507 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2508 + 2509 + tsx@4.20.4: 2510 + resolution: {integrity: sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==} 1732 2511 engines: {node: '>=18.0.0'} 1733 2512 hasBin: true 1734 2513 ··· 1736 2515 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1737 2516 engines: {node: '>= 0.8.0'} 1738 2517 2518 + type-fest@4.41.0: 2519 + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 2520 + engines: {node: '>=16'} 2521 + 1739 2522 typed-array-buffer@1.0.3: 1740 2523 resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1741 2524 engines: {node: '>= 0.4'} ··· 1752 2535 resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1753 2536 engines: {node: '>= 0.4'} 1754 2537 1755 - typescript-eslint@8.35.1: 1756 - resolution: {integrity: sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==} 2538 + typescript-eslint@8.40.0: 2539 + resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} 1757 2540 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1758 2541 peerDependencies: 1759 2542 eslint: ^8.57.0 || ^9.0.0 1760 - typescript: '>=4.8.4 <5.9.0' 2543 + typescript: '>=4.8.4 <6.0.0' 1761 2544 1762 - typescript@5.8.3: 1763 - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 2545 + typescript@5.9.2: 2546 + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 1764 2547 engines: {node: '>=14.17'} 1765 2548 hasBin: true 1766 2549 ··· 1768 2551 resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1769 2552 engines: {node: '>= 0.4'} 1770 2553 1771 - undici-types@7.8.0: 1772 - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} 2554 + undici-types@6.21.0: 2555 + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 2556 + 2557 + undici-types@7.10.0: 2558 + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} 2559 + 2560 + unified@11.0.5: 2561 + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} 2562 + 2563 + unist-util-find-after@5.0.0: 2564 + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} 2565 + 2566 + unist-util-is@6.0.0: 2567 + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 2568 + 2569 + unist-util-position@5.0.0: 2570 + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 2571 + 2572 + unist-util-stringify-position@4.0.0: 2573 + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 2574 + 2575 + unist-util-visit-parents@6.0.1: 2576 + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 2577 + 2578 + unist-util-visit@5.0.0: 2579 + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1773 2580 1774 2581 uri-js@4.4.1: 1775 2582 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} ··· 1777 2584 util-deprecate@1.0.2: 1778 2585 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1779 2586 2587 + uuid@9.0.1: 2588 + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} 2589 + hasBin: true 2590 + 2591 + vfile-location@5.0.3: 2592 + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 2593 + 2594 + vfile-message@4.0.3: 2595 + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} 2596 + 2597 + vfile@6.0.3: 2598 + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 2599 + 2600 + vue-component-type-helpers@3.0.5: 2601 + resolution: {integrity: sha512-uoNZaJ+a1/zppa/Vgmi8zIOP2PHXDN2rT8NyF+zQRK6ZG94lNB9prcV0GdLJbY9i9lrD47JOVIH92SaiA7oJ1A==} 2602 + 2603 + vue-demi@0.14.10: 2604 + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} 2605 + engines: {node: '>=12'} 2606 + hasBin: true 2607 + peerDependencies: 2608 + '@vue/composition-api': ^1.0.0-rc.1 2609 + vue: ^3.0.0-0 || ^2.6.0 2610 + peerDependenciesMeta: 2611 + '@vue/composition-api': 2612 + optional: true 2613 + 2614 + vue-sonner@1.3.2: 2615 + resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} 2616 + 2617 + vue@3.5.18: 2618 + resolution: {integrity: sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==} 2619 + peerDependencies: 2620 + typescript: '*' 2621 + peerDependenciesMeta: 2622 + typescript: 2623 + optional: true 2624 + 2625 + web-namespaces@2.0.1: 2626 + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 2627 + 1780 2628 web-streams-polyfill@3.3.3: 1781 2629 resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 1782 2630 engines: {node: '>= 8'} ··· 1829 2677 xxhash-wasm@1.1.0: 1830 2678 resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 1831 2679 2680 + yaml@2.8.0: 2681 + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} 2682 + engines: {node: '>= 14.6'} 2683 + hasBin: true 2684 + 1832 2685 yocto-queue@0.1.0: 1833 2686 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1834 2687 engines: {node: '>=10'} 1835 2688 2689 + zod@3.24.1: 2690 + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} 2691 + 2692 + zwitch@2.0.4: 2693 + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 2694 + 1836 2695 snapshots: 1837 2696 1838 - '@atcute/atproto@3.1.0': 2697 + '@atcute/atproto@3.1.1': 2698 + dependencies: 2699 + '@atcute/lexicons': 1.1.0 2700 + 2701 + '@atcute/bluesky@3.2.0': 1839 2702 dependencies: 2703 + '@atcute/atproto': 3.1.1 1840 2704 '@atcute/lexicons': 1.1.0 1841 2705 1842 - '@atcute/bluesky@1.0.15(@atcute/client@2.0.9)': 2706 + '@atcute/client@4.0.3': 2707 + dependencies: 2708 + '@atcute/identity': 1.0.3 2709 + '@atcute/lexicons': 1.1.0 2710 + 2711 + '@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)': 1843 2712 dependencies: 1844 - '@atcute/client': 2.0.9 2713 + '@atcute/identity': 1.0.3 2714 + '@atcute/lexicons': 1.1.0 2715 + '@atcute/util-fetch': 1.0.1 2716 + '@badrap/valita': 0.4.6 1845 2717 1846 - '@atcute/client@2.0.9': {} 2718 + '@atcute/identity@1.0.3': 2719 + dependencies: 2720 + '@atcute/lexicons': 1.1.0 2721 + '@badrap/valita': 0.4.6 1847 2722 1848 2723 '@atcute/lex-cli@2.1.1': 1849 2724 dependencies: 1850 2725 '@atcute/lexicon-doc': 1.0.3 1851 - '@badrap/valita': 0.4.5 1852 - '@externdefs/collider': 0.3.0(@badrap/valita@0.4.5) 2726 + '@badrap/valita': 0.4.6 2727 + '@externdefs/collider': 0.3.0(@badrap/valita@0.4.6) 1853 2728 picocolors: 1.1.1 1854 2729 prettier: 3.6.2 1855 2730 1856 2731 '@atcute/lexicon-doc@1.0.3': 1857 2732 dependencies: 1858 - '@badrap/valita': 0.4.5 2733 + '@badrap/valita': 0.4.6 1859 2734 1860 2735 '@atcute/lexicons@1.1.0': 1861 2736 dependencies: 1862 2737 esm-env: 1.2.2 1863 2738 1864 - '@badrap/valita@0.4.5': {} 2739 + '@atcute/util-fetch@1.0.1': 2740 + dependencies: 2741 + '@badrap/valita': 0.4.6 2742 + 2743 + '@babel/helper-string-parser@7.27.1': {} 2744 + 2745 + '@babel/helper-validator-identifier@7.27.1': {} 1865 2746 1866 - '@clipprjs/lexicons@0.1.3': 2747 + '@babel/parser@7.28.3': 2748 + dependencies: 2749 + '@babel/types': 7.28.2 2750 + 2751 + '@babel/types@7.28.2': 1867 2752 dependencies: 1868 - '@atcute/atproto': 3.1.0 2753 + '@babel/helper-string-parser': 7.27.1 2754 + '@babel/helper-validator-identifier': 7.27.1 2755 + 2756 + '@badrap/valita@0.4.6': {} 2757 + 2758 + '@clipprjs/lexicons@1.0.2': 2759 + dependencies: 2760 + '@atcute/atproto': 3.1.1 1869 2761 '@atcute/lexicons': 1.1.0 1870 2762 1871 2763 '@colors/colors@1.6.0': {} ··· 1888 2780 '@esbuild-kit/core-utils': 3.3.2 1889 2781 get-tsconfig: 4.10.1 1890 2782 1891 - '@esbuild/aix-ppc64@0.25.5': 2783 + '@esbuild/aix-ppc64@0.25.9': 1892 2784 optional: true 1893 2785 1894 2786 '@esbuild/android-arm64@0.18.20': 1895 2787 optional: true 1896 2788 1897 - '@esbuild/android-arm64@0.25.5': 2789 + '@esbuild/android-arm64@0.25.9': 1898 2790 optional: true 1899 2791 1900 2792 '@esbuild/android-arm@0.18.20': 1901 2793 optional: true 1902 2794 1903 - '@esbuild/android-arm@0.25.5': 2795 + '@esbuild/android-arm@0.25.9': 1904 2796 optional: true 1905 2797 1906 2798 '@esbuild/android-x64@0.18.20': 1907 2799 optional: true 1908 2800 1909 - '@esbuild/android-x64@0.25.5': 2801 + '@esbuild/android-x64@0.25.9': 1910 2802 optional: true 1911 2803 1912 2804 '@esbuild/darwin-arm64@0.18.20': 1913 2805 optional: true 1914 2806 1915 - '@esbuild/darwin-arm64@0.25.5': 2807 + '@esbuild/darwin-arm64@0.25.9': 1916 2808 optional: true 1917 2809 1918 2810 '@esbuild/darwin-x64@0.18.20': 1919 2811 optional: true 1920 2812 1921 - '@esbuild/darwin-x64@0.25.5': 2813 + '@esbuild/darwin-x64@0.25.9': 1922 2814 optional: true 1923 2815 1924 2816 '@esbuild/freebsd-arm64@0.18.20': 1925 2817 optional: true 1926 2818 1927 - '@esbuild/freebsd-arm64@0.25.5': 2819 + '@esbuild/freebsd-arm64@0.25.9': 1928 2820 optional: true 1929 2821 1930 2822 '@esbuild/freebsd-x64@0.18.20': 1931 2823 optional: true 1932 2824 1933 - '@esbuild/freebsd-x64@0.25.5': 2825 + '@esbuild/freebsd-x64@0.25.9': 1934 2826 optional: true 1935 2827 1936 2828 '@esbuild/linux-arm64@0.18.20': 1937 2829 optional: true 1938 2830 1939 - '@esbuild/linux-arm64@0.25.5': 2831 + '@esbuild/linux-arm64@0.25.9': 1940 2832 optional: true 1941 2833 1942 2834 '@esbuild/linux-arm@0.18.20': 1943 2835 optional: true 1944 2836 1945 - '@esbuild/linux-arm@0.25.5': 2837 + '@esbuild/linux-arm@0.25.9': 1946 2838 optional: true 1947 2839 1948 2840 '@esbuild/linux-ia32@0.18.20': 1949 2841 optional: true 1950 2842 1951 - '@esbuild/linux-ia32@0.25.5': 2843 + '@esbuild/linux-ia32@0.25.9': 1952 2844 optional: true 1953 2845 1954 2846 '@esbuild/linux-loong64@0.18.20': 1955 2847 optional: true 1956 2848 1957 - '@esbuild/linux-loong64@0.25.5': 2849 + '@esbuild/linux-loong64@0.25.9': 1958 2850 optional: true 1959 2851 1960 2852 '@esbuild/linux-mips64el@0.18.20': 1961 2853 optional: true 1962 2854 1963 - '@esbuild/linux-mips64el@0.25.5': 2855 + '@esbuild/linux-mips64el@0.25.9': 1964 2856 optional: true 1965 2857 1966 2858 '@esbuild/linux-ppc64@0.18.20': 1967 2859 optional: true 1968 2860 1969 - '@esbuild/linux-ppc64@0.25.5': 2861 + '@esbuild/linux-ppc64@0.25.9': 1970 2862 optional: true 1971 2863 1972 2864 '@esbuild/linux-riscv64@0.18.20': 1973 2865 optional: true 1974 2866 1975 - '@esbuild/linux-riscv64@0.25.5': 2867 + '@esbuild/linux-riscv64@0.25.9': 1976 2868 optional: true 1977 2869 1978 2870 '@esbuild/linux-s390x@0.18.20': 1979 2871 optional: true 1980 2872 1981 - '@esbuild/linux-s390x@0.25.5': 2873 + '@esbuild/linux-s390x@0.25.9': 1982 2874 optional: true 1983 2875 1984 2876 '@esbuild/linux-x64@0.18.20': 1985 2877 optional: true 1986 2878 1987 - '@esbuild/linux-x64@0.25.5': 2879 + '@esbuild/linux-x64@0.25.9': 1988 2880 optional: true 1989 2881 1990 - '@esbuild/netbsd-arm64@0.25.5': 2882 + '@esbuild/netbsd-arm64@0.25.9': 1991 2883 optional: true 1992 2884 1993 2885 '@esbuild/netbsd-x64@0.18.20': 1994 2886 optional: true 1995 2887 1996 - '@esbuild/netbsd-x64@0.25.5': 2888 + '@esbuild/netbsd-x64@0.25.9': 1997 2889 optional: true 1998 2890 1999 - '@esbuild/openbsd-arm64@0.25.5': 2891 + '@esbuild/openbsd-arm64@0.25.9': 2000 2892 optional: true 2001 2893 2002 2894 '@esbuild/openbsd-x64@0.18.20': 2003 2895 optional: true 2004 2896 2005 - '@esbuild/openbsd-x64@0.25.5': 2897 + '@esbuild/openbsd-x64@0.25.9': 2898 + optional: true 2899 + 2900 + '@esbuild/openharmony-arm64@0.25.9': 2006 2901 optional: true 2007 2902 2008 2903 '@esbuild/sunos-x64@0.18.20': 2009 2904 optional: true 2010 2905 2011 - '@esbuild/sunos-x64@0.25.5': 2906 + '@esbuild/sunos-x64@0.25.9': 2012 2907 optional: true 2013 2908 2014 2909 '@esbuild/win32-arm64@0.18.20': 2015 2910 optional: true 2016 2911 2017 - '@esbuild/win32-arm64@0.25.5': 2912 + '@esbuild/win32-arm64@0.25.9': 2018 2913 optional: true 2019 2914 2020 2915 '@esbuild/win32-ia32@0.18.20': 2021 2916 optional: true 2022 2917 2023 - '@esbuild/win32-ia32@0.25.5': 2918 + '@esbuild/win32-ia32@0.25.9': 2024 2919 optional: true 2025 2920 2026 2921 '@esbuild/win32-x64@0.18.20': 2027 2922 optional: true 2028 2923 2029 - '@esbuild/win32-x64@0.25.5': 2924 + '@esbuild/win32-x64@0.25.9': 2030 2925 optional: true 2031 2926 2032 - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': 2927 + '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.5.1))': 2033 2928 dependencies: 2034 - eslint: 9.30.1(jiti@2.4.2) 2929 + eslint: 9.33.0(jiti@2.5.1) 2035 2930 eslint-visitor-keys: 3.4.3 2036 2931 2037 2932 '@eslint-community/regexpp@4.12.1': {} ··· 2044 2939 transitivePeerDependencies: 2045 2940 - supports-color 2046 2941 2047 - '@eslint/config-helpers@0.3.0': {} 2048 - 2049 - '@eslint/core@0.14.0': 2050 - dependencies: 2051 - '@types/json-schema': 7.0.15 2942 + '@eslint/config-helpers@0.3.1': {} 2052 2943 2053 - '@eslint/core@0.15.1': 2944 + '@eslint/core@0.15.2': 2054 2945 dependencies: 2055 2946 '@types/json-schema': 7.0.15 2056 2947 ··· 2068 2959 transitivePeerDependencies: 2069 2960 - supports-color 2070 2961 2071 - '@eslint/js@9.30.1': {} 2962 + '@eslint/js@9.33.0': {} 2072 2963 2073 2964 '@eslint/object-schema@2.1.6': {} 2074 2965 2075 - '@eslint/plugin-kit@0.3.3': 2966 + '@eslint/plugin-kit@0.3.5': 2076 2967 dependencies: 2077 - '@eslint/core': 0.15.1 2968 + '@eslint/core': 0.15.2 2078 2969 levn: 0.4.1 2079 2970 2080 - '@externdefs/collider@0.3.0(@badrap/valita@0.4.5)': 2971 + '@externdefs/collider@0.3.0(@badrap/valita@0.4.6)': 2972 + dependencies: 2973 + '@badrap/valita': 0.4.6 2974 + 2975 + '@floating-ui/core@1.7.3': 2081 2976 dependencies: 2082 - '@badrap/valita': 0.4.5 2977 + '@floating-ui/utils': 0.2.10 2083 2978 2084 - '@hono/node-server@1.15.0(hono@4.8.4)': 2979 + '@floating-ui/dom@1.7.3': 2085 2980 dependencies: 2086 - hono: 4.8.4 2981 + '@floating-ui/core': 1.7.3 2982 + '@floating-ui/utils': 0.2.10 2983 + 2984 + '@floating-ui/utils@0.2.10': {} 2985 + 2986 + '@floating-ui/vue@1.1.8(vue@3.5.18(typescript@5.9.2))': 2987 + dependencies: 2988 + '@floating-ui/dom': 1.7.3 2989 + '@floating-ui/utils': 0.2.10 2990 + vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) 2991 + transitivePeerDependencies: 2992 + - '@vue/composition-api' 2993 + - vue 2994 + 2995 + '@headlessui/vue@1.7.23(vue@3.5.18(typescript@5.9.2))': 2996 + dependencies: 2997 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.18(typescript@5.9.2)) 2998 + vue: 3.5.18(typescript@5.9.2) 2999 + 3000 + '@hono/node-server@1.19.0(hono@4.9.2)': 3001 + dependencies: 3002 + hono: 4.9.2 2087 3003 2088 3004 '@humanfs/core@0.19.1': {} 2089 3005 ··· 2098 3014 2099 3015 '@humanwhocodes/retry@0.4.3': {} 2100 3016 2101 - '@libsql/client@0.15.9': 3017 + '@hyperjump/browser@1.3.1': 3018 + dependencies: 3019 + '@hyperjump/json-pointer': 1.1.1 3020 + '@hyperjump/uri': 1.3.1 3021 + content-type: 1.0.5 3022 + just-curry-it: 5.3.0 3023 + 3024 + '@hyperjump/json-pointer@1.1.1': {} 3025 + 3026 + '@hyperjump/json-schema@1.16.2(@hyperjump/browser@1.3.1)': 3027 + dependencies: 3028 + '@hyperjump/browser': 1.3.1 3029 + '@hyperjump/json-pointer': 1.1.1 3030 + '@hyperjump/pact': 1.4.0 3031 + '@hyperjump/uri': 1.3.1 3032 + content-type: 1.0.5 3033 + json-stringify-deterministic: 1.0.12 3034 + just-curry-it: 5.3.0 3035 + uuid: 9.0.1 3036 + 3037 + '@hyperjump/pact@1.4.0': {} 3038 + 3039 + '@hyperjump/uri@1.3.1': {} 3040 + 3041 + '@internationalized/date@3.8.2': 3042 + dependencies: 3043 + '@swc/helpers': 0.5.17 3044 + 3045 + '@internationalized/number@3.6.4': 3046 + dependencies: 3047 + '@swc/helpers': 0.5.17 3048 + 3049 + '@jridgewell/gen-mapping@0.3.13': 3050 + dependencies: 3051 + '@jridgewell/sourcemap-codec': 1.5.5 3052 + '@jridgewell/trace-mapping': 0.3.30 3053 + 3054 + '@jridgewell/resolve-uri@3.1.2': {} 3055 + 3056 + '@jridgewell/source-map@0.3.11': 3057 + dependencies: 3058 + '@jridgewell/gen-mapping': 0.3.13 3059 + '@jridgewell/trace-mapping': 0.3.30 3060 + 3061 + '@jridgewell/sourcemap-codec@1.5.5': {} 3062 + 3063 + '@jridgewell/trace-mapping@0.3.30': 3064 + dependencies: 3065 + '@jridgewell/resolve-uri': 3.1.2 3066 + '@jridgewell/sourcemap-codec': 1.5.5 3067 + 3068 + '@libsql/client@0.15.12': 2102 3069 dependencies: 2103 - '@libsql/core': 0.15.9 3070 + '@libsql/core': 0.15.12 2104 3071 '@libsql/hrana-client': 0.7.0 2105 - js-base64: 3.7.7 2106 - libsql: 0.5.13 3072 + js-base64: 3.7.8 3073 + libsql: 0.5.17 2107 3074 promise-limit: 2.7.0 2108 3075 transitivePeerDependencies: 2109 3076 - bufferutil 2110 3077 - utf-8-validate 2111 3078 2112 - '@libsql/core@0.15.9': 3079 + '@libsql/core@0.15.12': 2113 3080 dependencies: 2114 - js-base64: 3.7.7 3081 + js-base64: 3.7.8 2115 3082 2116 - '@libsql/darwin-arm64@0.5.13': 3083 + '@libsql/darwin-arm64@0.5.17': 2117 3084 optional: true 2118 3085 2119 - '@libsql/darwin-x64@0.5.13': 3086 + '@libsql/darwin-x64@0.5.17': 2120 3087 optional: true 2121 3088 2122 3089 '@libsql/hrana-client@0.7.0': 2123 3090 dependencies: 2124 3091 '@libsql/isomorphic-fetch': 0.3.1 2125 3092 '@libsql/isomorphic-ws': 0.1.5 2126 - js-base64: 3.7.7 3093 + js-base64: 3.7.8 2127 3094 node-fetch: 3.3.2 2128 3095 transitivePeerDependencies: 2129 3096 - bufferutil ··· 2139 3106 - bufferutil 2140 3107 - utf-8-validate 2141 3108 2142 - '@libsql/linux-arm-gnueabihf@0.5.13': 3109 + '@libsql/linux-arm-gnueabihf@0.5.17': 2143 3110 optional: true 2144 3111 2145 - '@libsql/linux-arm-musleabihf@0.5.13': 3112 + '@libsql/linux-arm-musleabihf@0.5.17': 2146 3113 optional: true 2147 3114 2148 - '@libsql/linux-arm64-gnu@0.5.13': 3115 + '@libsql/linux-arm64-gnu@0.5.17': 2149 3116 optional: true 2150 3117 2151 - '@libsql/linux-arm64-musl@0.5.13': 3118 + '@libsql/linux-arm64-musl@0.5.17': 2152 3119 optional: true 2153 3120 2154 - '@libsql/linux-x64-gnu@0.5.13': 3121 + '@libsql/linux-x64-gnu@0.5.17': 2155 3122 optional: true 2156 3123 2157 - '@libsql/linux-x64-musl@0.5.13': 3124 + '@libsql/linux-x64-musl@0.5.17': 2158 3125 optional: true 2159 3126 2160 - '@libsql/win32-x64-msvc@0.5.13': 3127 + '@libsql/win32-x64-msvc@0.5.17': 2161 3128 optional: true 2162 3129 2163 3130 '@neon-rs/load@0.0.4': {} ··· 2174 3141 '@nodelib/fs.scandir': 2.1.5 2175 3142 fastq: 1.19.1 2176 3143 2177 - '@pkgr/core@0.2.7': {} 3144 + '@phosphor-icons/core@2.1.1': {} 3145 + 3146 + '@pkgr/core@0.2.9': {} 2178 3147 2179 3148 '@rtsao/scc@1.1.0': {} 2180 3149 2181 - '@skyware/jetstream@0.2.2(@atcute/client@2.0.9)': 3150 + '@scalar/code-highlight@0.1.9': 3151 + dependencies: 3152 + hast-util-to-text: 4.0.2 3153 + highlight.js: 11.11.1 3154 + highlightjs-curl: 1.3.0 3155 + highlightjs-vue: 1.0.0 3156 + lowlight: 3.3.0 3157 + rehype-external-links: 3.0.0 3158 + rehype-format: 5.0.1 3159 + rehype-parse: 9.0.1 3160 + rehype-raw: 7.0.0 3161 + rehype-sanitize: 6.0.0 3162 + rehype-stringify: 10.0.1 3163 + remark-gfm: 4.0.1 3164 + remark-parse: 11.0.0 3165 + remark-rehype: 11.1.2 3166 + remark-stringify: 11.0.0 3167 + unified: 11.0.5 3168 + unist-util-visit: 5.0.0 3169 + transitivePeerDependencies: 3170 + - supports-color 3171 + 3172 + '@scalar/components@0.14.23(typescript@5.9.2)': 3173 + dependencies: 3174 + '@floating-ui/utils': 0.2.10 3175 + '@floating-ui/vue': 1.1.8(vue@3.5.18(typescript@5.9.2)) 3176 + '@headlessui/vue': 1.7.23(vue@3.5.18(typescript@5.9.2)) 3177 + '@scalar/code-highlight': 0.1.9 3178 + '@scalar/icons': 0.4.6(typescript@5.9.2) 3179 + '@scalar/oas-utils': 0.4.18(typescript@5.9.2) 3180 + '@scalar/themes': 0.13.12 3181 + '@scalar/use-hooks': 0.2.4(typescript@5.9.2) 3182 + '@scalar/use-toasts': 0.8.0(typescript@5.9.2) 3183 + '@vueuse/core': 11.3.0(vue@3.5.18(typescript@5.9.2)) 3184 + cva: 1.0.0-beta.2(typescript@5.9.2) 3185 + nanoid: 5.1.5 3186 + pretty-bytes: 6.1.1 3187 + radix-vue: 1.9.17(vue@3.5.18(typescript@5.9.2)) 3188 + vue: 3.5.18(typescript@5.9.2) 3189 + vue-component-type-helpers: 3.0.5 3190 + transitivePeerDependencies: 3191 + - '@vue/composition-api' 3192 + - supports-color 3193 + - typescript 3194 + 3195 + '@scalar/core@0.3.11': 3196 + dependencies: 3197 + '@scalar/types': 0.2.11 3198 + 3199 + '@scalar/helpers@0.0.7': {} 3200 + 3201 + '@scalar/hono-api-reference@0.9.13(hono@4.9.2)': 3202 + dependencies: 3203 + '@scalar/core': 0.3.11 3204 + hono: 4.9.2 3205 + 3206 + '@scalar/icons@0.4.6(typescript@5.9.2)': 2182 3207 dependencies: 2183 - '@atcute/bluesky': 1.0.15(@atcute/client@2.0.9) 2184 - partysocket: 1.1.4 3208 + '@phosphor-icons/core': 2.1.1 3209 + '@types/node': 22.17.2 3210 + chalk: 5.6.0 3211 + vue: 3.5.18(typescript@5.9.2) 2185 3212 transitivePeerDependencies: 2186 - - '@atcute/client' 3213 + - typescript 3214 + 3215 + '@scalar/json-magic@0.1.0(typescript@5.9.2)': 3216 + dependencies: 3217 + vue: 3.5.18(typescript@5.9.2) 3218 + yaml: 2.8.0 3219 + transitivePeerDependencies: 3220 + - typescript 3221 + 3222 + '@scalar/oas-utils@0.4.18(typescript@5.9.2)': 3223 + dependencies: 3224 + '@hyperjump/browser': 1.3.1 3225 + '@hyperjump/json-schema': 1.16.2(@hyperjump/browser@1.3.1) 3226 + '@scalar/helpers': 0.0.7 3227 + '@scalar/object-utils': 1.2.3 3228 + '@scalar/openapi-types': 0.3.7 3229 + '@scalar/themes': 0.13.12 3230 + '@scalar/types': 0.2.11 3231 + '@scalar/workspace-store': 0.12.0(typescript@5.9.2) 3232 + '@types/har-format': 1.2.16 3233 + flatted: 3.3.3 3234 + microdiff: 1.5.0 3235 + nanoid: 5.1.5 3236 + type-fest: 4.41.0 3237 + yaml: 2.8.0 3238 + zod: 3.24.1 3239 + transitivePeerDependencies: 3240 + - supports-color 3241 + - typescript 3242 + 3243 + '@scalar/object-utils@1.2.3': 3244 + dependencies: 3245 + '@scalar/helpers': 0.0.7 3246 + flatted: 3.3.3 3247 + just-clone: 6.2.0 3248 + ts-deepmerge: 7.0.3 3249 + type-fest: 4.41.0 3250 + 3251 + '@scalar/openapi-parser@0.19.0': 3252 + dependencies: 3253 + '@scalar/openapi-types': 0.3.7 3254 + ajv: 8.17.1 3255 + ajv-draft-04: 1.0.0(ajv@8.17.1) 3256 + ajv-formats: 3.0.1(ajv@8.17.1) 3257 + jsonpointer: 5.0.1 3258 + leven: 4.0.0 3259 + yaml: 2.8.0 3260 + 3261 + '@scalar/openapi-to-markdown@0.2.26(typescript@5.9.2)': 3262 + dependencies: 3263 + '@scalar/components': 0.14.23(typescript@5.9.2) 3264 + '@scalar/oas-utils': 0.4.18(typescript@5.9.2) 3265 + '@scalar/openapi-parser': 0.19.0 3266 + '@scalar/openapi-types': 0.3.7 3267 + '@scalar/snippetz': 0.4.4 3268 + '@scalar/types': 0.2.11 3269 + html-minifier-terser: 7.2.0 3270 + object-to-xml: 2.0.0 3271 + rehype-parse: 9.0.1 3272 + rehype-remark: 10.0.1 3273 + rehype-sanitize: 6.0.0 3274 + rehype-stringify: 10.0.1 3275 + remark-gfm: 4.0.1 3276 + remark-stringify: 11.0.0 3277 + unified: 11.0.5 3278 + vue: 3.5.18(typescript@5.9.2) 3279 + transitivePeerDependencies: 3280 + - '@vue/composition-api' 3281 + - supports-color 3282 + - typescript 3283 + 3284 + '@scalar/openapi-types@0.3.7': 3285 + dependencies: 3286 + zod: 3.24.1 3287 + 3288 + '@scalar/snippetz@0.4.4': 3289 + dependencies: 3290 + '@scalar/types': 0.2.11 3291 + stringify-object: 5.0.0 3292 + 3293 + '@scalar/themes@0.13.12': 3294 + dependencies: 3295 + '@scalar/types': 0.2.11 3296 + nanoid: 5.1.5 3297 + 3298 + '@scalar/types@0.2.11': 3299 + dependencies: 3300 + '@scalar/openapi-types': 0.3.7 3301 + nanoid: 5.1.5 3302 + zod: 3.24.1 3303 + 3304 + '@scalar/use-hooks@0.2.4(typescript@5.9.2)': 3305 + dependencies: 3306 + '@scalar/use-toasts': 0.8.0(typescript@5.9.2) 3307 + '@vueuse/core': 10.11.1(vue@3.5.18(typescript@5.9.2)) 3308 + cva: 1.0.0-beta.2(typescript@5.9.2) 3309 + tailwind-merge: 2.6.0 3310 + vue: 3.5.18(typescript@5.9.2) 3311 + zod: 3.24.1 3312 + transitivePeerDependencies: 3313 + - '@vue/composition-api' 3314 + - typescript 3315 + 3316 + '@scalar/use-toasts@0.8.0(typescript@5.9.2)': 3317 + dependencies: 3318 + nanoid: 5.1.5 3319 + vue: 3.5.18(typescript@5.9.2) 3320 + vue-sonner: 1.3.2 3321 + transitivePeerDependencies: 3322 + - typescript 3323 + 3324 + '@scalar/workspace-store@0.12.0(typescript@5.9.2)': 3325 + dependencies: 3326 + '@scalar/code-highlight': 0.1.9 3327 + '@scalar/helpers': 0.0.7 3328 + '@scalar/json-magic': 0.1.0(typescript@5.9.2) 3329 + '@scalar/openapi-parser': 0.19.0 3330 + '@scalar/types': 0.2.11 3331 + '@sinclair/typebox': 0.34.37 3332 + github-slugger: 2.0.0 3333 + vue: 3.5.18(typescript@5.9.2) 3334 + yaml: 2.8.0 3335 + transitivePeerDependencies: 3336 + - supports-color 3337 + - typescript 3338 + 3339 + '@sinclair/typebox@0.34.37': {} 3340 + 3341 + '@skyware/jetstream@0.2.5': 3342 + dependencies: 3343 + '@atcute/atproto': 3.1.1 3344 + '@atcute/bluesky': 3.2.0 3345 + '@atcute/lexicons': 1.1.0 3346 + partysocket: 1.1.5 3347 + tiny-emitter: 2.1.0 3348 + 3349 + '@swc/helpers@0.5.17': 3350 + dependencies: 3351 + tslib: 2.8.1 3352 + 3353 + '@tanstack/virtual-core@3.13.12': {} 3354 + 3355 + '@tanstack/vue-virtual@3.13.12(vue@3.5.18(typescript@5.9.2))': 3356 + dependencies: 3357 + '@tanstack/virtual-core': 3.13.12 3358 + vue: 3.5.18(typescript@5.9.2) 3359 + 3360 + '@types/debug@4.1.12': 3361 + dependencies: 3362 + '@types/ms': 2.1.0 2187 3363 2188 3364 '@types/estree@1.0.8': {} 2189 3365 3366 + '@types/har-format@1.2.16': {} 3367 + 3368 + '@types/hast@3.0.4': 3369 + dependencies: 3370 + '@types/unist': 3.0.3 3371 + 2190 3372 '@types/json-schema@7.0.15': {} 2191 3373 2192 3374 '@types/json5@0.0.29': {} 2193 3375 2194 - '@types/node@24.0.10': 3376 + '@types/mdast@4.0.4': 3377 + dependencies: 3378 + '@types/unist': 3.0.3 3379 + 3380 + '@types/ms@2.1.0': {} 3381 + 3382 + '@types/node@22.17.2': 2195 3383 dependencies: 2196 - undici-types: 7.8.0 3384 + undici-types: 6.21.0 3385 + 3386 + '@types/node@24.3.0': 3387 + dependencies: 3388 + undici-types: 7.10.0 2197 3389 2198 3390 '@types/triple-beam@1.3.5': {} 2199 3391 3392 + '@types/unist@3.0.3': {} 3393 + 3394 + '@types/web-bluetooth@0.0.20': {} 3395 + 2200 3396 '@types/ws@8.18.1': 2201 3397 dependencies: 2202 - '@types/node': 24.0.10 3398 + '@types/node': 24.3.0 2203 3399 2204 - '@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)': 3400 + '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': 2205 3401 dependencies: 2206 3402 '@eslint-community/regexpp': 4.12.1 2207 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2208 - '@typescript-eslint/scope-manager': 8.35.1 2209 - '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2210 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2211 - '@typescript-eslint/visitor-keys': 8.35.1 2212 - eslint: 9.30.1(jiti@2.4.2) 3403 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 3404 + '@typescript-eslint/scope-manager': 8.40.0 3405 + '@typescript-eslint/type-utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 3406 + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 3407 + '@typescript-eslint/visitor-keys': 8.40.0 3408 + eslint: 9.33.0(jiti@2.5.1) 2213 3409 graphemer: 1.4.0 2214 3410 ignore: 7.0.5 2215 3411 natural-compare: 1.4.0 2216 - ts-api-utils: 2.1.0(typescript@5.8.3) 2217 - typescript: 5.8.3 3412 + ts-api-utils: 2.1.0(typescript@5.9.2) 3413 + typescript: 5.9.2 2218 3414 transitivePeerDependencies: 2219 3415 - supports-color 2220 3416 2221 - '@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 3417 + '@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': 2222 3418 dependencies: 2223 - '@typescript-eslint/scope-manager': 8.35.1 2224 - '@typescript-eslint/types': 8.35.1 2225 - '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 2226 - '@typescript-eslint/visitor-keys': 8.35.1 3419 + '@typescript-eslint/scope-manager': 8.40.0 3420 + '@typescript-eslint/types': 8.40.0 3421 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) 3422 + '@typescript-eslint/visitor-keys': 8.40.0 2227 3423 debug: 4.4.1 2228 - eslint: 9.30.1(jiti@2.4.2) 2229 - typescript: 5.8.3 3424 + eslint: 9.33.0(jiti@2.5.1) 3425 + typescript: 5.9.2 2230 3426 transitivePeerDependencies: 2231 3427 - supports-color 2232 3428 2233 - '@typescript-eslint/project-service@8.35.1(typescript@5.8.3)': 3429 + '@typescript-eslint/project-service@8.40.0(typescript@5.9.2)': 2234 3430 dependencies: 2235 - '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) 2236 - '@typescript-eslint/types': 8.35.1 3431 + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) 3432 + '@typescript-eslint/types': 8.40.0 2237 3433 debug: 4.4.1 2238 - typescript: 5.8.3 3434 + typescript: 5.9.2 2239 3435 transitivePeerDependencies: 2240 3436 - supports-color 2241 3437 2242 - '@typescript-eslint/scope-manager@8.35.1': 3438 + '@typescript-eslint/scope-manager@8.40.0': 2243 3439 dependencies: 2244 - '@typescript-eslint/types': 8.35.1 2245 - '@typescript-eslint/visitor-keys': 8.35.1 3440 + '@typescript-eslint/types': 8.40.0 3441 + '@typescript-eslint/visitor-keys': 8.40.0 2246 3442 2247 - '@typescript-eslint/tsconfig-utils@8.35.1(typescript@5.8.3)': 3443 + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)': 2248 3444 dependencies: 2249 - typescript: 5.8.3 3445 + typescript: 5.9.2 2250 3446 2251 - '@typescript-eslint/type-utils@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 3447 + '@typescript-eslint/type-utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': 2252 3448 dependencies: 2253 - '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 2254 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3449 + '@typescript-eslint/types': 8.40.0 3450 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) 3451 + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 2255 3452 debug: 4.4.1 2256 - eslint: 9.30.1(jiti@2.4.2) 2257 - ts-api-utils: 2.1.0(typescript@5.8.3) 2258 - typescript: 5.8.3 3453 + eslint: 9.33.0(jiti@2.5.1) 3454 + ts-api-utils: 2.1.0(typescript@5.9.2) 3455 + typescript: 5.9.2 2259 3456 transitivePeerDependencies: 2260 3457 - supports-color 2261 3458 2262 - '@typescript-eslint/types@8.35.1': {} 3459 + '@typescript-eslint/types@8.40.0': {} 2263 3460 2264 - '@typescript-eslint/typescript-estree@8.35.1(typescript@5.8.3)': 3461 + '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)': 2265 3462 dependencies: 2266 - '@typescript-eslint/project-service': 8.35.1(typescript@5.8.3) 2267 - '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) 2268 - '@typescript-eslint/types': 8.35.1 2269 - '@typescript-eslint/visitor-keys': 8.35.1 3463 + '@typescript-eslint/project-service': 8.40.0(typescript@5.9.2) 3464 + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) 3465 + '@typescript-eslint/types': 8.40.0 3466 + '@typescript-eslint/visitor-keys': 8.40.0 2270 3467 debug: 4.4.1 2271 3468 fast-glob: 3.3.3 2272 3469 is-glob: 4.0.3 2273 3470 minimatch: 9.0.5 2274 3471 semver: 7.7.2 2275 - ts-api-utils: 2.1.0(typescript@5.8.3) 2276 - typescript: 5.8.3 3472 + ts-api-utils: 2.1.0(typescript@5.9.2) 3473 + typescript: 5.9.2 2277 3474 transitivePeerDependencies: 2278 3475 - supports-color 2279 3476 2280 - '@typescript-eslint/utils@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 3477 + '@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': 2281 3478 dependencies: 2282 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) 2283 - '@typescript-eslint/scope-manager': 8.35.1 2284 - '@typescript-eslint/types': 8.35.1 2285 - '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 2286 - eslint: 9.30.1(jiti@2.4.2) 2287 - typescript: 5.8.3 3479 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) 3480 + '@typescript-eslint/scope-manager': 8.40.0 3481 + '@typescript-eslint/types': 8.40.0 3482 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) 3483 + eslint: 9.33.0(jiti@2.5.1) 3484 + typescript: 5.9.2 2288 3485 transitivePeerDependencies: 2289 3486 - supports-color 2290 3487 2291 - '@typescript-eslint/visitor-keys@8.35.1': 3488 + '@typescript-eslint/visitor-keys@8.40.0': 2292 3489 dependencies: 2293 - '@typescript-eslint/types': 8.35.1 3490 + '@typescript-eslint/types': 8.40.0 2294 3491 eslint-visitor-keys: 4.2.1 2295 3492 3493 + '@ungap/structured-clone@1.3.0': {} 3494 + 3495 + '@vue/compiler-core@3.5.18': 3496 + dependencies: 3497 + '@babel/parser': 7.28.3 3498 + '@vue/shared': 3.5.18 3499 + entities: 4.5.0 3500 + estree-walker: 2.0.2 3501 + source-map-js: 1.2.1 3502 + 3503 + '@vue/compiler-dom@3.5.18': 3504 + dependencies: 3505 + '@vue/compiler-core': 3.5.18 3506 + '@vue/shared': 3.5.18 3507 + 3508 + '@vue/compiler-sfc@3.5.18': 3509 + dependencies: 3510 + '@babel/parser': 7.28.3 3511 + '@vue/compiler-core': 3.5.18 3512 + '@vue/compiler-dom': 3.5.18 3513 + '@vue/compiler-ssr': 3.5.18 3514 + '@vue/shared': 3.5.18 3515 + estree-walker: 2.0.2 3516 + magic-string: 0.30.17 3517 + postcss: 8.5.6 3518 + source-map-js: 1.2.1 3519 + 3520 + '@vue/compiler-ssr@3.5.18': 3521 + dependencies: 3522 + '@vue/compiler-dom': 3.5.18 3523 + '@vue/shared': 3.5.18 3524 + 3525 + '@vue/reactivity@3.5.18': 3526 + dependencies: 3527 + '@vue/shared': 3.5.18 3528 + 3529 + '@vue/runtime-core@3.5.18': 3530 + dependencies: 3531 + '@vue/reactivity': 3.5.18 3532 + '@vue/shared': 3.5.18 3533 + 3534 + '@vue/runtime-dom@3.5.18': 3535 + dependencies: 3536 + '@vue/reactivity': 3.5.18 3537 + '@vue/runtime-core': 3.5.18 3538 + '@vue/shared': 3.5.18 3539 + csstype: 3.1.3 3540 + 3541 + '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.9.2))': 3542 + dependencies: 3543 + '@vue/compiler-ssr': 3.5.18 3544 + '@vue/shared': 3.5.18 3545 + vue: 3.5.18(typescript@5.9.2) 3546 + 3547 + '@vue/shared@3.5.18': {} 3548 + 3549 + '@vueuse/core@10.11.1(vue@3.5.18(typescript@5.9.2))': 3550 + dependencies: 3551 + '@types/web-bluetooth': 0.0.20 3552 + '@vueuse/metadata': 10.11.1 3553 + '@vueuse/shared': 10.11.1(vue@3.5.18(typescript@5.9.2)) 3554 + vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) 3555 + transitivePeerDependencies: 3556 + - '@vue/composition-api' 3557 + - vue 3558 + 3559 + '@vueuse/core@11.3.0(vue@3.5.18(typescript@5.9.2))': 3560 + dependencies: 3561 + '@types/web-bluetooth': 0.0.20 3562 + '@vueuse/metadata': 11.3.0 3563 + '@vueuse/shared': 11.3.0(vue@3.5.18(typescript@5.9.2)) 3564 + vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) 3565 + transitivePeerDependencies: 3566 + - '@vue/composition-api' 3567 + - vue 3568 + 3569 + '@vueuse/metadata@10.11.1': {} 3570 + 3571 + '@vueuse/metadata@11.3.0': {} 3572 + 3573 + '@vueuse/shared@10.11.1(vue@3.5.18(typescript@5.9.2))': 3574 + dependencies: 3575 + vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) 3576 + transitivePeerDependencies: 3577 + - '@vue/composition-api' 3578 + - vue 3579 + 3580 + '@vueuse/shared@11.3.0(vue@3.5.18(typescript@5.9.2))': 3581 + dependencies: 3582 + vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) 3583 + transitivePeerDependencies: 3584 + - '@vue/composition-api' 3585 + - vue 3586 + 2296 3587 acorn-jsx@5.3.2(acorn@8.15.0): 2297 3588 dependencies: 2298 3589 acorn: 8.15.0 2299 3590 2300 3591 acorn@8.15.0: {} 2301 3592 3593 + ajv-draft-04@1.0.0(ajv@8.17.1): 3594 + optionalDependencies: 3595 + ajv: 8.17.1 3596 + 3597 + ajv-formats@3.0.1(ajv@8.17.1): 3598 + optionalDependencies: 3599 + ajv: 8.17.1 3600 + 2302 3601 ajv@6.12.6: 2303 3602 dependencies: 2304 3603 fast-deep-equal: 3.1.3 ··· 2306 3605 json-schema-traverse: 0.4.1 2307 3606 uri-js: 4.4.1 2308 3607 3608 + ajv@8.17.1: 3609 + dependencies: 3610 + fast-deep-equal: 3.1.3 3611 + fast-uri: 3.0.6 3612 + json-schema-traverse: 1.0.0 3613 + require-from-string: 2.0.2 3614 + 2309 3615 ansi-styles@4.3.0: 2310 3616 dependencies: 2311 3617 color-convert: 2.0.1 2312 3618 2313 3619 argparse@2.0.1: {} 3620 + 3621 + aria-hidden@1.2.6: 3622 + dependencies: 3623 + tslib: 2.8.1 2314 3624 2315 3625 array-buffer-byte-length@1.0.2: 2316 3626 dependencies: ··· 2370 3680 dependencies: 2371 3681 possible-typed-array-names: 1.1.0 2372 3682 3683 + bail@2.0.2: {} 3684 + 2373 3685 balanced-match@1.0.2: {} 2374 3686 2375 3687 brace-expansion@1.1.12: ··· 2389 3701 2390 3702 bun-types@1.2.17: 2391 3703 dependencies: 2392 - '@types/node': 24.0.10 3704 + '@types/node': 24.3.0 2393 3705 optional: true 2394 3706 2395 3707 call-bind-apply-helpers@1.0.2: ··· 2411 3723 2412 3724 callsites@3.1.0: {} 2413 3725 3726 + camel-case@4.1.2: 3727 + dependencies: 3728 + pascal-case: 3.1.2 3729 + tslib: 2.8.1 3730 + 3731 + ccount@2.0.1: {} 3732 + 2414 3733 chalk@4.1.2: 2415 3734 dependencies: 2416 3735 ansi-styles: 4.3.0 2417 3736 supports-color: 7.2.0 3737 + 3738 + chalk@5.6.0: {} 3739 + 3740 + character-entities-html4@2.1.0: {} 3741 + 3742 + character-entities-legacy@3.0.0: {} 3743 + 3744 + character-entities@2.0.2: {} 3745 + 3746 + clean-css@5.3.3: 3747 + dependencies: 3748 + source-map: 0.6.1 3749 + 3750 + clsx@2.1.1: {} 2418 3751 2419 3752 color-convert@1.9.3: 2420 3753 dependencies: ··· 2443 3776 color: 3.2.1 2444 3777 text-hex: 1.0.0 2445 3778 3779 + comma-separated-tokens@2.0.3: {} 3780 + 3781 + commander@10.0.1: {} 3782 + 3783 + commander@2.20.3: {} 3784 + 2446 3785 concat-map@0.0.1: {} 3786 + 3787 + content-type@1.0.5: {} 2447 3788 2448 3789 cross-spawn@7.0.6: 2449 3790 dependencies: ··· 2451 3792 shebang-command: 2.0.0 2452 3793 which: 2.0.2 2453 3794 3795 + csstype@3.1.3: {} 3796 + 3797 + cva@1.0.0-beta.2(typescript@5.9.2): 3798 + dependencies: 3799 + clsx: 2.1.1 3800 + optionalDependencies: 3801 + typescript: 5.9.2 3802 + 3803 + dank-each@1.0.0: {} 3804 + 3805 + dank-map@0.1.0: {} 3806 + 2454 3807 data-uri-to-buffer@4.0.1: {} 2455 3808 2456 3809 data-view-buffer@1.0.2: ··· 2479 3832 dependencies: 2480 3833 ms: 2.1.3 2481 3834 3835 + decode-named-character-reference@1.2.0: 3836 + dependencies: 3837 + character-entities: 2.0.2 3838 + 2482 3839 deep-is@0.1.4: {} 2483 3840 2484 3841 define-data-property@1.1.4: ··· 2493 3850 has-property-descriptors: 1.0.2 2494 3851 object-keys: 1.1.1 2495 3852 3853 + defu@6.1.4: {} 3854 + 3855 + dequal@2.0.3: {} 3856 + 2496 3857 detect-libc@2.0.2: {} 3858 + 3859 + devlop@1.1.0: 3860 + dependencies: 3861 + dequal: 2.0.3 2497 3862 2498 3863 doctrine@2.1.0: 2499 3864 dependencies: 2500 3865 esutils: 2.0.3 2501 3866 3867 + dot-case@3.0.4: 3868 + dependencies: 3869 + no-case: 3.0.4 3870 + tslib: 2.8.1 3871 + 2502 3872 drizzle-kit@0.31.4: 2503 3873 dependencies: 2504 3874 '@drizzle-team/brocli': 0.10.2 2505 3875 '@esbuild-kit/esm-loader': 2.6.5 2506 - esbuild: 0.25.5 2507 - esbuild-register: 3.6.0(esbuild@0.25.5) 3876 + esbuild: 0.25.9 3877 + esbuild-register: 3.6.0(esbuild@0.25.9) 2508 3878 transitivePeerDependencies: 2509 3879 - supports-color 2510 3880 2511 - drizzle-orm@0.44.2(@libsql/client@0.15.9)(bun-types@1.2.17): 3881 + drizzle-orm@0.44.4(@libsql/client@0.15.12)(bun-types@1.2.17): 2512 3882 optionalDependencies: 2513 - '@libsql/client': 0.15.9 3883 + '@libsql/client': 0.15.12 2514 3884 bun-types: 1.2.17 2515 3885 2516 3886 dunder-proto@1.0.1: ··· 2520 3890 gopd: 1.2.0 2521 3891 2522 3892 enabled@2.0.0: {} 3893 + 3894 + entities@4.5.0: {} 3895 + 3896 + entities@6.0.1: {} 2523 3897 2524 3898 es-abstract@1.24.0: 2525 3899 dependencies: ··· 2603 3977 is-date-object: 1.1.0 2604 3978 is-symbol: 1.1.1 2605 3979 2606 - esbuild-register@3.6.0(esbuild@0.25.5): 3980 + esbuild-register@3.6.0(esbuild@0.25.9): 2607 3981 dependencies: 2608 3982 debug: 4.4.1 2609 - esbuild: 0.25.5 3983 + esbuild: 0.25.9 2610 3984 transitivePeerDependencies: 2611 3985 - supports-color 2612 3986 ··· 2635 4009 '@esbuild/win32-ia32': 0.18.20 2636 4010 '@esbuild/win32-x64': 0.18.20 2637 4011 2638 - esbuild@0.25.5: 4012 + esbuild@0.25.9: 2639 4013 optionalDependencies: 2640 - '@esbuild/aix-ppc64': 0.25.5 2641 - '@esbuild/android-arm': 0.25.5 2642 - '@esbuild/android-arm64': 0.25.5 2643 - '@esbuild/android-x64': 0.25.5 2644 - '@esbuild/darwin-arm64': 0.25.5 2645 - '@esbuild/darwin-x64': 0.25.5 2646 - '@esbuild/freebsd-arm64': 0.25.5 2647 - '@esbuild/freebsd-x64': 0.25.5 2648 - '@esbuild/linux-arm': 0.25.5 2649 - '@esbuild/linux-arm64': 0.25.5 2650 - '@esbuild/linux-ia32': 0.25.5 2651 - '@esbuild/linux-loong64': 0.25.5 2652 - '@esbuild/linux-mips64el': 0.25.5 2653 - '@esbuild/linux-ppc64': 0.25.5 2654 - '@esbuild/linux-riscv64': 0.25.5 2655 - '@esbuild/linux-s390x': 0.25.5 2656 - '@esbuild/linux-x64': 0.25.5 2657 - '@esbuild/netbsd-arm64': 0.25.5 2658 - '@esbuild/netbsd-x64': 0.25.5 2659 - '@esbuild/openbsd-arm64': 0.25.5 2660 - '@esbuild/openbsd-x64': 0.25.5 2661 - '@esbuild/sunos-x64': 0.25.5 2662 - '@esbuild/win32-arm64': 0.25.5 2663 - '@esbuild/win32-ia32': 0.25.5 2664 - '@esbuild/win32-x64': 0.25.5 4014 + '@esbuild/aix-ppc64': 0.25.9 4015 + '@esbuild/android-arm': 0.25.9 4016 + '@esbuild/android-arm64': 0.25.9 4017 + '@esbuild/android-x64': 0.25.9 4018 + '@esbuild/darwin-arm64': 0.25.9 4019 + '@esbuild/darwin-x64': 0.25.9 4020 + '@esbuild/freebsd-arm64': 0.25.9 4021 + '@esbuild/freebsd-x64': 0.25.9 4022 + '@esbuild/linux-arm': 0.25.9 4023 + '@esbuild/linux-arm64': 0.25.9 4024 + '@esbuild/linux-ia32': 0.25.9 4025 + '@esbuild/linux-loong64': 0.25.9 4026 + '@esbuild/linux-mips64el': 0.25.9 4027 + '@esbuild/linux-ppc64': 0.25.9 4028 + '@esbuild/linux-riscv64': 0.25.9 4029 + '@esbuild/linux-s390x': 0.25.9 4030 + '@esbuild/linux-x64': 0.25.9 4031 + '@esbuild/netbsd-arm64': 0.25.9 4032 + '@esbuild/netbsd-x64': 0.25.9 4033 + '@esbuild/openbsd-arm64': 0.25.9 4034 + '@esbuild/openbsd-x64': 0.25.9 4035 + '@esbuild/openharmony-arm64': 0.25.9 4036 + '@esbuild/sunos-x64': 0.25.9 4037 + '@esbuild/win32-arm64': 0.25.9 4038 + '@esbuild/win32-ia32': 0.25.9 4039 + '@esbuild/win32-x64': 0.25.9 2665 4040 2666 4041 escape-string-regexp@4.0.0: {} 2667 4042 2668 - eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)): 4043 + escape-string-regexp@5.0.0: {} 4044 + 4045 + eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)): 2669 4046 dependencies: 2670 - eslint: 9.30.1(jiti@2.4.2) 4047 + eslint: 9.33.0(jiti@2.5.1) 2671 4048 2672 4049 eslint-import-resolver-node@0.3.9: 2673 4050 dependencies: ··· 2677 4054 transitivePeerDependencies: 2678 4055 - supports-color 2679 4056 2680 - 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)): 4057 + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): 2681 4058 dependencies: 2682 4059 debug: 3.2.7 2683 4060 optionalDependencies: 2684 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2685 - eslint: 9.30.1(jiti@2.4.2) 4061 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 4062 + eslint: 9.33.0(jiti@2.5.1) 2686 4063 eslint-import-resolver-node: 0.3.9 2687 4064 transitivePeerDependencies: 2688 4065 - supports-color 2689 4066 2690 - eslint-plugin-drizzle@0.2.3(eslint@9.30.1(jiti@2.4.2)): 4067 + eslint-plugin-drizzle@0.2.3(eslint@9.33.0(jiti@2.5.1)): 2691 4068 dependencies: 2692 - eslint: 9.30.1(jiti@2.4.2) 4069 + eslint: 9.33.0(jiti@2.5.1) 2693 4070 2694 - 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)): 4071 + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)): 2695 4072 dependencies: 2696 4073 '@rtsao/scc': 1.1.0 2697 4074 array-includes: 3.1.9 ··· 2700 4077 array.prototype.flatmap: 1.3.3 2701 4078 debug: 3.2.7 2702 4079 doctrine: 2.1.0 2703 - eslint: 9.30.1(jiti@2.4.2) 4080 + eslint: 9.33.0(jiti@2.5.1) 2704 4081 eslint-import-resolver-node: 0.3.9 2705 - 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)) 4082 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) 2706 4083 hasown: 2.0.2 2707 4084 is-core-module: 2.16.1 2708 4085 is-glob: 4.0.3 ··· 2714 4091 string.prototype.trimend: 1.0.9 2715 4092 tsconfig-paths: 3.15.0 2716 4093 optionalDependencies: 2717 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 4094 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 2718 4095 transitivePeerDependencies: 2719 4096 - eslint-import-resolver-typescript 2720 4097 - eslint-import-resolver-webpack 2721 4098 - supports-color 2722 4099 2723 - 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): 4100 + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(prettier@3.6.2): 2724 4101 dependencies: 2725 - eslint: 9.30.1(jiti@2.4.2) 4102 + eslint: 9.33.0(jiti@2.5.1) 2726 4103 prettier: 3.6.2 2727 4104 prettier-linter-helpers: 1.0.0 2728 - synckit: 0.11.8 4105 + synckit: 0.11.11 2729 4106 optionalDependencies: 2730 - eslint-config-prettier: 10.1.5(eslint@9.30.1(jiti@2.4.2)) 4107 + eslint-config-prettier: 10.1.8(eslint@9.33.0(jiti@2.5.1)) 2731 4108 2732 4109 eslint-scope@8.4.0: 2733 4110 dependencies: ··· 2738 4115 2739 4116 eslint-visitor-keys@4.2.1: {} 2740 4117 2741 - eslint@9.30.1(jiti@2.4.2): 4118 + eslint@9.33.0(jiti@2.5.1): 2742 4119 dependencies: 2743 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) 4120 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) 2744 4121 '@eslint-community/regexpp': 4.12.1 2745 4122 '@eslint/config-array': 0.21.0 2746 - '@eslint/config-helpers': 0.3.0 2747 - '@eslint/core': 0.14.0 4123 + '@eslint/config-helpers': 0.3.1 4124 + '@eslint/core': 0.15.2 2748 4125 '@eslint/eslintrc': 3.3.1 2749 - '@eslint/js': 9.30.1 2750 - '@eslint/plugin-kit': 0.3.3 4126 + '@eslint/js': 9.33.0 4127 + '@eslint/plugin-kit': 0.3.5 2751 4128 '@humanfs/node': 0.16.6 2752 4129 '@humanwhocodes/module-importer': 1.0.1 2753 4130 '@humanwhocodes/retry': 0.4.3 ··· 2776 4153 natural-compare: 1.4.0 2777 4154 optionator: 0.9.4 2778 4155 optionalDependencies: 2779 - jiti: 2.4.2 4156 + jiti: 2.5.1 2780 4157 transitivePeerDependencies: 2781 4158 - supports-color 2782 4159 ··· 2797 4174 estraverse: 5.3.0 2798 4175 2799 4176 estraverse@5.3.0: {} 4177 + 4178 + estree-walker@2.0.2: {} 2800 4179 2801 4180 esutils@2.0.3: {} 2802 4181 2803 4182 event-target-polyfill@0.0.4: {} 2804 4183 4184 + extend@3.0.2: {} 4185 + 2805 4186 fast-deep-equal@3.1.3: {} 2806 4187 2807 4188 fast-diff@1.3.0: {} ··· 2817 4198 fast-json-stable-stringify@2.1.0: {} 2818 4199 2819 4200 fast-levenshtein@2.0.6: {} 4201 + 4202 + fast-uri@3.0.6: {} 2820 4203 2821 4204 fastq@1.19.1: 2822 4205 dependencies: ··· 2887 4270 has-symbols: 1.1.0 2888 4271 hasown: 2.0.2 2889 4272 math-intrinsics: 1.1.0 4273 + 4274 + get-own-enumerable-keys@1.0.0: {} 2890 4275 2891 4276 get-proto@1.0.1: 2892 4277 dependencies: ··· 2903 4288 dependencies: 2904 4289 resolve-pkg-maps: 1.0.0 2905 4290 4291 + github-slugger@2.0.0: {} 4292 + 2906 4293 glob-parent@5.1.2: 2907 4294 dependencies: 2908 4295 is-glob: 4.0.3 ··· 2946 4333 dependencies: 2947 4334 function-bind: 1.1.2 2948 4335 2949 - hono@4.8.4: {} 4336 + hast-util-embedded@3.0.0: 4337 + dependencies: 4338 + '@types/hast': 3.0.4 4339 + hast-util-is-element: 3.0.0 4340 + 4341 + hast-util-format@1.1.0: 4342 + dependencies: 4343 + '@types/hast': 3.0.4 4344 + hast-util-embedded: 3.0.0 4345 + hast-util-minify-whitespace: 1.0.1 4346 + hast-util-phrasing: 3.0.1 4347 + hast-util-whitespace: 3.0.0 4348 + html-whitespace-sensitive-tag-names: 3.0.1 4349 + unist-util-visit-parents: 6.0.1 4350 + 4351 + hast-util-from-html@2.0.3: 4352 + dependencies: 4353 + '@types/hast': 3.0.4 4354 + devlop: 1.1.0 4355 + hast-util-from-parse5: 8.0.3 4356 + parse5: 7.3.0 4357 + vfile: 6.0.3 4358 + vfile-message: 4.0.3 4359 + 4360 + hast-util-from-parse5@8.0.3: 4361 + dependencies: 4362 + '@types/hast': 3.0.4 4363 + '@types/unist': 3.0.3 4364 + devlop: 1.1.0 4365 + hastscript: 9.0.1 4366 + property-information: 7.1.0 4367 + vfile: 6.0.3 4368 + vfile-location: 5.0.3 4369 + web-namespaces: 2.0.1 4370 + 4371 + hast-util-has-property@3.0.0: 4372 + dependencies: 4373 + '@types/hast': 3.0.4 4374 + 4375 + hast-util-is-body-ok-link@3.0.1: 4376 + dependencies: 4377 + '@types/hast': 3.0.4 4378 + 4379 + hast-util-is-element@3.0.0: 4380 + dependencies: 4381 + '@types/hast': 3.0.4 4382 + 4383 + hast-util-minify-whitespace@1.0.1: 4384 + dependencies: 4385 + '@types/hast': 3.0.4 4386 + hast-util-embedded: 3.0.0 4387 + hast-util-is-element: 3.0.0 4388 + hast-util-whitespace: 3.0.0 4389 + unist-util-is: 6.0.0 4390 + 4391 + hast-util-parse-selector@4.0.0: 4392 + dependencies: 4393 + '@types/hast': 3.0.4 4394 + 4395 + hast-util-phrasing@3.0.1: 4396 + dependencies: 4397 + '@types/hast': 3.0.4 4398 + hast-util-embedded: 3.0.0 4399 + hast-util-has-property: 3.0.0 4400 + hast-util-is-body-ok-link: 3.0.1 4401 + hast-util-is-element: 3.0.0 4402 + 4403 + hast-util-raw@9.1.0: 4404 + dependencies: 4405 + '@types/hast': 3.0.4 4406 + '@types/unist': 3.0.3 4407 + '@ungap/structured-clone': 1.3.0 4408 + hast-util-from-parse5: 8.0.3 4409 + hast-util-to-parse5: 8.0.0 4410 + html-void-elements: 3.0.0 4411 + mdast-util-to-hast: 13.2.0 4412 + parse5: 7.3.0 4413 + unist-util-position: 5.0.0 4414 + unist-util-visit: 5.0.0 4415 + vfile: 6.0.3 4416 + web-namespaces: 2.0.1 4417 + zwitch: 2.0.4 4418 + 4419 + hast-util-sanitize@5.0.2: 4420 + dependencies: 4421 + '@types/hast': 3.0.4 4422 + '@ungap/structured-clone': 1.3.0 4423 + unist-util-position: 5.0.0 4424 + 4425 + hast-util-to-html@9.0.5: 4426 + dependencies: 4427 + '@types/hast': 3.0.4 4428 + '@types/unist': 3.0.3 4429 + ccount: 2.0.1 4430 + comma-separated-tokens: 2.0.3 4431 + hast-util-whitespace: 3.0.0 4432 + html-void-elements: 3.0.0 4433 + mdast-util-to-hast: 13.2.0 4434 + property-information: 7.1.0 4435 + space-separated-tokens: 2.0.2 4436 + stringify-entities: 4.0.4 4437 + zwitch: 2.0.4 4438 + 4439 + hast-util-to-mdast@10.1.2: 4440 + dependencies: 4441 + '@types/hast': 3.0.4 4442 + '@types/mdast': 4.0.4 4443 + '@ungap/structured-clone': 1.3.0 4444 + hast-util-phrasing: 3.0.1 4445 + hast-util-to-html: 9.0.5 4446 + hast-util-to-text: 4.0.2 4447 + hast-util-whitespace: 3.0.0 4448 + mdast-util-phrasing: 4.1.0 4449 + mdast-util-to-hast: 13.2.0 4450 + mdast-util-to-string: 4.0.0 4451 + rehype-minify-whitespace: 6.0.2 4452 + trim-trailing-lines: 2.1.0 4453 + unist-util-position: 5.0.0 4454 + unist-util-visit: 5.0.0 4455 + 4456 + hast-util-to-parse5@8.0.0: 4457 + dependencies: 4458 + '@types/hast': 3.0.4 4459 + comma-separated-tokens: 2.0.3 4460 + devlop: 1.1.0 4461 + property-information: 6.5.0 4462 + space-separated-tokens: 2.0.2 4463 + web-namespaces: 2.0.1 4464 + zwitch: 2.0.4 4465 + 4466 + hast-util-to-text@4.0.2: 4467 + dependencies: 4468 + '@types/hast': 3.0.4 4469 + '@types/unist': 3.0.3 4470 + hast-util-is-element: 3.0.0 4471 + unist-util-find-after: 5.0.0 4472 + 4473 + hast-util-whitespace@3.0.0: 4474 + dependencies: 4475 + '@types/hast': 3.0.4 4476 + 4477 + hastscript@9.0.1: 4478 + dependencies: 4479 + '@types/hast': 3.0.4 4480 + comma-separated-tokens: 2.0.3 4481 + hast-util-parse-selector: 4.0.0 4482 + property-information: 7.1.0 4483 + space-separated-tokens: 2.0.2 4484 + 4485 + highlight.js@11.11.1: {} 4486 + 4487 + highlightjs-curl@1.3.0: {} 4488 + 4489 + highlightjs-vue@1.0.0: {} 4490 + 4491 + hono@4.9.2: {} 4492 + 4493 + html-minifier-terser@7.2.0: 4494 + dependencies: 4495 + camel-case: 4.1.2 4496 + clean-css: 5.3.3 4497 + commander: 10.0.1 4498 + entities: 4.5.0 4499 + param-case: 3.0.4 4500 + relateurl: 0.2.7 4501 + terser: 5.43.1 4502 + 4503 + html-void-elements@3.0.0: {} 4504 + 4505 + html-whitespace-sensitive-tag-names@3.0.1: {} 2950 4506 2951 4507 ignore@5.3.2: {} 2952 4508 ··· 2966 4522 es-errors: 1.3.0 2967 4523 hasown: 2.0.2 2968 4524 side-channel: 1.1.0 4525 + 4526 + is-absolute-url@4.0.1: {} 2969 4527 2970 4528 is-array-buffer@3.0.5: 2971 4529 dependencies: ··· 3037 4595 3038 4596 is-number@7.0.0: {} 3039 4597 4598 + is-obj@3.0.0: {} 4599 + 4600 + is-plain-obj@4.1.0: {} 4601 + 3040 4602 is-regex@1.2.1: 3041 4603 dependencies: 3042 4604 call-bound: 1.0.4 ··· 3044 4606 has-tostringtag: 1.0.2 3045 4607 hasown: 2.0.2 3046 4608 4609 + is-regexp@3.1.0: {} 4610 + 3047 4611 is-set@2.0.3: {} 3048 4612 3049 4613 is-shared-array-buffer@1.0.4: ··· 3082 4646 3083 4647 isexe@2.0.0: {} 3084 4648 3085 - jiti@2.4.2: {} 4649 + jiti@2.5.1: {} 3086 4650 3087 - js-base64@3.7.7: {} 4651 + js-base64@3.7.8: {} 3088 4652 3089 4653 js-yaml@4.1.0: 3090 4654 dependencies: ··· 3094 4658 3095 4659 json-schema-traverse@0.4.1: {} 3096 4660 4661 + json-schema-traverse@1.0.0: {} 4662 + 3097 4663 json-stable-stringify-without-jsonify@1.0.1: {} 4664 + 4665 + json-stringify-deterministic@1.0.12: {} 3098 4666 3099 4667 json5@1.0.2: 3100 4668 dependencies: 3101 4669 minimist: 1.2.8 3102 4670 4671 + jsonpointer@5.0.1: {} 4672 + 4673 + just-clone@6.2.0: {} 4674 + 4675 + just-curry-it@5.3.0: {} 4676 + 3103 4677 keyv@4.5.4: 3104 4678 dependencies: 3105 4679 json-buffer: 3.0.1 3106 4680 3107 4681 kuler@2.0.0: {} 4682 + 4683 + leven@4.0.0: {} 3108 4684 3109 4685 levn@0.4.1: 3110 4686 dependencies: 3111 4687 prelude-ls: 1.2.1 3112 4688 type-check: 0.4.0 3113 4689 3114 - libsql@0.5.13: 4690 + libsql@0.5.17: 3115 4691 dependencies: 3116 4692 '@neon-rs/load': 0.0.4 3117 4693 detect-libc: 2.0.2 3118 4694 optionalDependencies: 3119 - '@libsql/darwin-arm64': 0.5.13 3120 - '@libsql/darwin-x64': 0.5.13 3121 - '@libsql/linux-arm-gnueabihf': 0.5.13 3122 - '@libsql/linux-arm-musleabihf': 0.5.13 3123 - '@libsql/linux-arm64-gnu': 0.5.13 3124 - '@libsql/linux-arm64-musl': 0.5.13 3125 - '@libsql/linux-x64-gnu': 0.5.13 3126 - '@libsql/linux-x64-musl': 0.5.13 3127 - '@libsql/win32-x64-msvc': 0.5.13 4695 + '@libsql/darwin-arm64': 0.5.17 4696 + '@libsql/darwin-x64': 0.5.17 4697 + '@libsql/linux-arm-gnueabihf': 0.5.17 4698 + '@libsql/linux-arm-musleabihf': 0.5.17 4699 + '@libsql/linux-arm64-gnu': 0.5.17 4700 + '@libsql/linux-arm64-musl': 0.5.17 4701 + '@libsql/linux-x64-gnu': 0.5.17 4702 + '@libsql/linux-x64-musl': 0.5.17 4703 + '@libsql/win32-x64-msvc': 0.5.17 3128 4704 3129 4705 locate-path@6.0.0: 3130 4706 dependencies: ··· 3141 4717 safe-stable-stringify: 2.5.0 3142 4718 triple-beam: 1.4.1 3143 4719 4720 + longest-streak@3.1.0: {} 4721 + 4722 + lower-case@2.0.2: 4723 + dependencies: 4724 + tslib: 2.8.1 4725 + 4726 + lowlight@3.3.0: 4727 + dependencies: 4728 + '@types/hast': 3.0.4 4729 + devlop: 1.1.0 4730 + highlight.js: 11.11.1 4731 + 4732 + magic-string@0.30.17: 4733 + dependencies: 4734 + '@jridgewell/sourcemap-codec': 1.5.5 4735 + 4736 + markdown-table@3.0.4: {} 4737 + 3144 4738 math-intrinsics@1.1.0: {} 3145 4739 4740 + mdast-util-find-and-replace@3.0.2: 4741 + dependencies: 4742 + '@types/mdast': 4.0.4 4743 + escape-string-regexp: 5.0.0 4744 + unist-util-is: 6.0.0 4745 + unist-util-visit-parents: 6.0.1 4746 + 4747 + mdast-util-from-markdown@2.0.2: 4748 + dependencies: 4749 + '@types/mdast': 4.0.4 4750 + '@types/unist': 3.0.3 4751 + decode-named-character-reference: 1.2.0 4752 + devlop: 1.1.0 4753 + mdast-util-to-string: 4.0.0 4754 + micromark: 4.0.2 4755 + micromark-util-decode-numeric-character-reference: 2.0.2 4756 + micromark-util-decode-string: 2.0.1 4757 + micromark-util-normalize-identifier: 2.0.1 4758 + micromark-util-symbol: 2.0.1 4759 + micromark-util-types: 2.0.2 4760 + unist-util-stringify-position: 4.0.0 4761 + transitivePeerDependencies: 4762 + - supports-color 4763 + 4764 + mdast-util-gfm-autolink-literal@2.0.1: 4765 + dependencies: 4766 + '@types/mdast': 4.0.4 4767 + ccount: 2.0.1 4768 + devlop: 1.1.0 4769 + mdast-util-find-and-replace: 3.0.2 4770 + micromark-util-character: 2.1.1 4771 + 4772 + mdast-util-gfm-footnote@2.1.0: 4773 + dependencies: 4774 + '@types/mdast': 4.0.4 4775 + devlop: 1.1.0 4776 + mdast-util-from-markdown: 2.0.2 4777 + mdast-util-to-markdown: 2.1.2 4778 + micromark-util-normalize-identifier: 2.0.1 4779 + transitivePeerDependencies: 4780 + - supports-color 4781 + 4782 + mdast-util-gfm-strikethrough@2.0.0: 4783 + dependencies: 4784 + '@types/mdast': 4.0.4 4785 + mdast-util-from-markdown: 2.0.2 4786 + mdast-util-to-markdown: 2.1.2 4787 + transitivePeerDependencies: 4788 + - supports-color 4789 + 4790 + mdast-util-gfm-table@2.0.0: 4791 + dependencies: 4792 + '@types/mdast': 4.0.4 4793 + devlop: 1.1.0 4794 + markdown-table: 3.0.4 4795 + mdast-util-from-markdown: 2.0.2 4796 + mdast-util-to-markdown: 2.1.2 4797 + transitivePeerDependencies: 4798 + - supports-color 4799 + 4800 + mdast-util-gfm-task-list-item@2.0.0: 4801 + dependencies: 4802 + '@types/mdast': 4.0.4 4803 + devlop: 1.1.0 4804 + mdast-util-from-markdown: 2.0.2 4805 + mdast-util-to-markdown: 2.1.2 4806 + transitivePeerDependencies: 4807 + - supports-color 4808 + 4809 + mdast-util-gfm@3.1.0: 4810 + dependencies: 4811 + mdast-util-from-markdown: 2.0.2 4812 + mdast-util-gfm-autolink-literal: 2.0.1 4813 + mdast-util-gfm-footnote: 2.1.0 4814 + mdast-util-gfm-strikethrough: 2.0.0 4815 + mdast-util-gfm-table: 2.0.0 4816 + mdast-util-gfm-task-list-item: 2.0.0 4817 + mdast-util-to-markdown: 2.1.2 4818 + transitivePeerDependencies: 4819 + - supports-color 4820 + 4821 + mdast-util-phrasing@4.1.0: 4822 + dependencies: 4823 + '@types/mdast': 4.0.4 4824 + unist-util-is: 6.0.0 4825 + 4826 + mdast-util-to-hast@13.2.0: 4827 + dependencies: 4828 + '@types/hast': 3.0.4 4829 + '@types/mdast': 4.0.4 4830 + '@ungap/structured-clone': 1.3.0 4831 + devlop: 1.1.0 4832 + micromark-util-sanitize-uri: 2.0.1 4833 + trim-lines: 3.0.1 4834 + unist-util-position: 5.0.0 4835 + unist-util-visit: 5.0.0 4836 + vfile: 6.0.3 4837 + 4838 + mdast-util-to-markdown@2.1.2: 4839 + dependencies: 4840 + '@types/mdast': 4.0.4 4841 + '@types/unist': 3.0.3 4842 + longest-streak: 3.1.0 4843 + mdast-util-phrasing: 4.1.0 4844 + mdast-util-to-string: 4.0.0 4845 + micromark-util-classify-character: 2.0.1 4846 + micromark-util-decode-string: 2.0.1 4847 + unist-util-visit: 5.0.0 4848 + zwitch: 2.0.4 4849 + 4850 + mdast-util-to-string@4.0.0: 4851 + dependencies: 4852 + '@types/mdast': 4.0.4 4853 + 3146 4854 merge2@1.4.1: {} 3147 4855 4856 + microdiff@1.5.0: {} 4857 + 4858 + micromark-core-commonmark@2.0.3: 4859 + dependencies: 4860 + decode-named-character-reference: 1.2.0 4861 + devlop: 1.1.0 4862 + micromark-factory-destination: 2.0.1 4863 + micromark-factory-label: 2.0.1 4864 + micromark-factory-space: 2.0.1 4865 + micromark-factory-title: 2.0.1 4866 + micromark-factory-whitespace: 2.0.1 4867 + micromark-util-character: 2.1.1 4868 + micromark-util-chunked: 2.0.1 4869 + micromark-util-classify-character: 2.0.1 4870 + micromark-util-html-tag-name: 2.0.1 4871 + micromark-util-normalize-identifier: 2.0.1 4872 + micromark-util-resolve-all: 2.0.1 4873 + micromark-util-subtokenize: 2.1.0 4874 + micromark-util-symbol: 2.0.1 4875 + micromark-util-types: 2.0.2 4876 + 4877 + micromark-extension-gfm-autolink-literal@2.1.0: 4878 + dependencies: 4879 + micromark-util-character: 2.1.1 4880 + micromark-util-sanitize-uri: 2.0.1 4881 + micromark-util-symbol: 2.0.1 4882 + micromark-util-types: 2.0.2 4883 + 4884 + micromark-extension-gfm-footnote@2.1.0: 4885 + dependencies: 4886 + devlop: 1.1.0 4887 + micromark-core-commonmark: 2.0.3 4888 + micromark-factory-space: 2.0.1 4889 + micromark-util-character: 2.1.1 4890 + micromark-util-normalize-identifier: 2.0.1 4891 + micromark-util-sanitize-uri: 2.0.1 4892 + micromark-util-symbol: 2.0.1 4893 + micromark-util-types: 2.0.2 4894 + 4895 + micromark-extension-gfm-strikethrough@2.1.0: 4896 + dependencies: 4897 + devlop: 1.1.0 4898 + micromark-util-chunked: 2.0.1 4899 + micromark-util-classify-character: 2.0.1 4900 + micromark-util-resolve-all: 2.0.1 4901 + micromark-util-symbol: 2.0.1 4902 + micromark-util-types: 2.0.2 4903 + 4904 + micromark-extension-gfm-table@2.1.1: 4905 + dependencies: 4906 + devlop: 1.1.0 4907 + micromark-factory-space: 2.0.1 4908 + micromark-util-character: 2.1.1 4909 + micromark-util-symbol: 2.0.1 4910 + micromark-util-types: 2.0.2 4911 + 4912 + micromark-extension-gfm-tagfilter@2.0.0: 4913 + dependencies: 4914 + micromark-util-types: 2.0.2 4915 + 4916 + micromark-extension-gfm-task-list-item@2.1.0: 4917 + dependencies: 4918 + devlop: 1.1.0 4919 + micromark-factory-space: 2.0.1 4920 + micromark-util-character: 2.1.1 4921 + micromark-util-symbol: 2.0.1 4922 + micromark-util-types: 2.0.2 4923 + 4924 + micromark-extension-gfm@3.0.0: 4925 + dependencies: 4926 + micromark-extension-gfm-autolink-literal: 2.1.0 4927 + micromark-extension-gfm-footnote: 2.1.0 4928 + micromark-extension-gfm-strikethrough: 2.1.0 4929 + micromark-extension-gfm-table: 2.1.1 4930 + micromark-extension-gfm-tagfilter: 2.0.0 4931 + micromark-extension-gfm-task-list-item: 2.1.0 4932 + micromark-util-combine-extensions: 2.0.1 4933 + micromark-util-types: 2.0.2 4934 + 4935 + micromark-factory-destination@2.0.1: 4936 + dependencies: 4937 + micromark-util-character: 2.1.1 4938 + micromark-util-symbol: 2.0.1 4939 + micromark-util-types: 2.0.2 4940 + 4941 + micromark-factory-label@2.0.1: 4942 + dependencies: 4943 + devlop: 1.1.0 4944 + micromark-util-character: 2.1.1 4945 + micromark-util-symbol: 2.0.1 4946 + micromark-util-types: 2.0.2 4947 + 4948 + micromark-factory-space@2.0.1: 4949 + dependencies: 4950 + micromark-util-character: 2.1.1 4951 + micromark-util-types: 2.0.2 4952 + 4953 + micromark-factory-title@2.0.1: 4954 + dependencies: 4955 + micromark-factory-space: 2.0.1 4956 + micromark-util-character: 2.1.1 4957 + micromark-util-symbol: 2.0.1 4958 + micromark-util-types: 2.0.2 4959 + 4960 + micromark-factory-whitespace@2.0.1: 4961 + dependencies: 4962 + micromark-factory-space: 2.0.1 4963 + micromark-util-character: 2.1.1 4964 + micromark-util-symbol: 2.0.1 4965 + micromark-util-types: 2.0.2 4966 + 4967 + micromark-util-character@2.1.1: 4968 + dependencies: 4969 + micromark-util-symbol: 2.0.1 4970 + micromark-util-types: 2.0.2 4971 + 4972 + micromark-util-chunked@2.0.1: 4973 + dependencies: 4974 + micromark-util-symbol: 2.0.1 4975 + 4976 + micromark-util-classify-character@2.0.1: 4977 + dependencies: 4978 + micromark-util-character: 2.1.1 4979 + micromark-util-symbol: 2.0.1 4980 + micromark-util-types: 2.0.2 4981 + 4982 + micromark-util-combine-extensions@2.0.1: 4983 + dependencies: 4984 + micromark-util-chunked: 2.0.1 4985 + micromark-util-types: 2.0.2 4986 + 4987 + micromark-util-decode-numeric-character-reference@2.0.2: 4988 + dependencies: 4989 + micromark-util-symbol: 2.0.1 4990 + 4991 + micromark-util-decode-string@2.0.1: 4992 + dependencies: 4993 + decode-named-character-reference: 1.2.0 4994 + micromark-util-character: 2.1.1 4995 + micromark-util-decode-numeric-character-reference: 2.0.2 4996 + micromark-util-symbol: 2.0.1 4997 + 4998 + micromark-util-encode@2.0.1: {} 4999 + 5000 + micromark-util-html-tag-name@2.0.1: {} 5001 + 5002 + micromark-util-normalize-identifier@2.0.1: 5003 + dependencies: 5004 + micromark-util-symbol: 2.0.1 5005 + 5006 + micromark-util-resolve-all@2.0.1: 5007 + dependencies: 5008 + micromark-util-types: 2.0.2 5009 + 5010 + micromark-util-sanitize-uri@2.0.1: 5011 + dependencies: 5012 + micromark-util-character: 2.1.1 5013 + micromark-util-encode: 2.0.1 5014 + micromark-util-symbol: 2.0.1 5015 + 5016 + micromark-util-subtokenize@2.1.0: 5017 + dependencies: 5018 + devlop: 1.1.0 5019 + micromark-util-chunked: 2.0.1 5020 + micromark-util-symbol: 2.0.1 5021 + micromark-util-types: 2.0.2 5022 + 5023 + micromark-util-symbol@2.0.1: {} 5024 + 5025 + micromark-util-types@2.0.2: {} 5026 + 5027 + micromark@4.0.2: 5028 + dependencies: 5029 + '@types/debug': 4.1.12 5030 + debug: 4.4.1 5031 + decode-named-character-reference: 1.2.0 5032 + devlop: 1.1.0 5033 + micromark-core-commonmark: 2.0.3 5034 + micromark-factory-space: 2.0.1 5035 + micromark-util-character: 2.1.1 5036 + micromark-util-chunked: 2.0.1 5037 + micromark-util-combine-extensions: 2.0.1 5038 + micromark-util-decode-numeric-character-reference: 2.0.2 5039 + micromark-util-encode: 2.0.1 5040 + micromark-util-normalize-identifier: 2.0.1 5041 + micromark-util-resolve-all: 2.0.1 5042 + micromark-util-sanitize-uri: 2.0.1 5043 + micromark-util-subtokenize: 2.1.0 5044 + micromark-util-symbol: 2.0.1 5045 + micromark-util-types: 2.0.2 5046 + transitivePeerDependencies: 5047 + - supports-color 5048 + 3148 5049 micromatch@4.0.8: 3149 5050 dependencies: 3150 5051 braces: 3.0.3 ··· 3162 5063 3163 5064 ms@2.1.3: {} 3164 5065 5066 + nanoid@3.3.11: {} 5067 + 5068 + nanoid@5.1.5: {} 5069 + 3165 5070 natural-compare@1.4.0: {} 3166 5071 5072 + no-case@3.0.4: 5073 + dependencies: 5074 + lower-case: 2.0.2 5075 + tslib: 2.8.1 5076 + 3167 5077 node-domexception@1.0.0: {} 3168 5078 3169 5079 node-fetch@3.3.2: ··· 3175 5085 object-inspect@1.13.4: {} 3176 5086 3177 5087 object-keys@1.1.1: {} 5088 + 5089 + object-to-xml@2.0.0: 5090 + dependencies: 5091 + dank-each: 1.0.0 5092 + dank-map: 0.1.0 5093 + sanitizer: 0.1.3 3178 5094 3179 5095 object.assign@4.1.7: 3180 5096 dependencies: ··· 3232 5148 dependencies: 3233 5149 p-limit: 3.1.0 3234 5150 5151 + param-case@3.0.4: 5152 + dependencies: 5153 + dot-case: 3.0.4 5154 + tslib: 2.8.1 5155 + 3235 5156 parent-module@1.0.1: 3236 5157 dependencies: 3237 5158 callsites: 3.1.0 3238 5159 3239 - partysocket@1.1.4: 5160 + parse5@7.3.0: 5161 + dependencies: 5162 + entities: 6.0.1 5163 + 5164 + partysocket@1.1.5: 3240 5165 dependencies: 3241 5166 event-target-polyfill: 0.0.4 3242 5167 5168 + pascal-case@3.1.2: 5169 + dependencies: 5170 + no-case: 3.0.4 5171 + tslib: 2.8.1 5172 + 3243 5173 path-exists@4.0.0: {} 3244 5174 3245 5175 path-key@3.1.1: {} ··· 3252 5182 3253 5183 possible-typed-array-names@1.1.0: {} 3254 5184 5185 + postcss@8.5.6: 5186 + dependencies: 5187 + nanoid: 3.3.11 5188 + picocolors: 1.1.1 5189 + source-map-js: 1.2.1 5190 + 3255 5191 prelude-ls@1.2.1: {} 3256 5192 3257 5193 prettier-linter-helpers@1.0.0: ··· 3259 5195 fast-diff: 1.3.0 3260 5196 3261 5197 prettier@3.6.2: {} 5198 + 5199 + pretty-bytes@6.1.1: {} 3262 5200 3263 5201 promise-limit@2.7.0: {} 3264 5202 5203 + property-information@6.5.0: {} 5204 + 5205 + property-information@7.1.0: {} 5206 + 3265 5207 punycode@2.3.1: {} 3266 5208 3267 5209 queue-microtask@1.2.3: {} 3268 5210 5211 + radix-vue@1.9.17(vue@3.5.18(typescript@5.9.2)): 5212 + dependencies: 5213 + '@floating-ui/dom': 1.7.3 5214 + '@floating-ui/vue': 1.1.8(vue@3.5.18(typescript@5.9.2)) 5215 + '@internationalized/date': 3.8.2 5216 + '@internationalized/number': 3.6.4 5217 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.18(typescript@5.9.2)) 5218 + '@vueuse/core': 10.11.1(vue@3.5.18(typescript@5.9.2)) 5219 + '@vueuse/shared': 10.11.1(vue@3.5.18(typescript@5.9.2)) 5220 + aria-hidden: 1.2.6 5221 + defu: 6.1.4 5222 + fast-deep-equal: 3.1.3 5223 + nanoid: 5.1.5 5224 + vue: 3.5.18(typescript@5.9.2) 5225 + transitivePeerDependencies: 5226 + - '@vue/composition-api' 5227 + 3269 5228 readable-stream@3.6.2: 3270 5229 dependencies: 3271 5230 inherits: 2.0.4 ··· 3292 5251 gopd: 1.2.0 3293 5252 set-function-name: 2.0.2 3294 5253 5254 + rehype-external-links@3.0.0: 5255 + dependencies: 5256 + '@types/hast': 3.0.4 5257 + '@ungap/structured-clone': 1.3.0 5258 + hast-util-is-element: 3.0.0 5259 + is-absolute-url: 4.0.1 5260 + space-separated-tokens: 2.0.2 5261 + unist-util-visit: 5.0.0 5262 + 5263 + rehype-format@5.0.1: 5264 + dependencies: 5265 + '@types/hast': 3.0.4 5266 + hast-util-format: 1.1.0 5267 + 5268 + rehype-minify-whitespace@6.0.2: 5269 + dependencies: 5270 + '@types/hast': 3.0.4 5271 + hast-util-minify-whitespace: 1.0.1 5272 + 5273 + rehype-parse@9.0.1: 5274 + dependencies: 5275 + '@types/hast': 3.0.4 5276 + hast-util-from-html: 2.0.3 5277 + unified: 11.0.5 5278 + 5279 + rehype-raw@7.0.0: 5280 + dependencies: 5281 + '@types/hast': 3.0.4 5282 + hast-util-raw: 9.1.0 5283 + vfile: 6.0.3 5284 + 5285 + rehype-remark@10.0.1: 5286 + dependencies: 5287 + '@types/hast': 3.0.4 5288 + '@types/mdast': 4.0.4 5289 + hast-util-to-mdast: 10.1.2 5290 + unified: 11.0.5 5291 + vfile: 6.0.3 5292 + 5293 + rehype-sanitize@6.0.0: 5294 + dependencies: 5295 + '@types/hast': 3.0.4 5296 + hast-util-sanitize: 5.0.2 5297 + 5298 + rehype-stringify@10.0.1: 5299 + dependencies: 5300 + '@types/hast': 3.0.4 5301 + hast-util-to-html: 9.0.5 5302 + unified: 11.0.5 5303 + 5304 + relateurl@0.2.7: {} 5305 + 5306 + remark-gfm@4.0.1: 5307 + dependencies: 5308 + '@types/mdast': 4.0.4 5309 + mdast-util-gfm: 3.1.0 5310 + micromark-extension-gfm: 3.0.0 5311 + remark-parse: 11.0.0 5312 + remark-stringify: 11.0.0 5313 + unified: 11.0.5 5314 + transitivePeerDependencies: 5315 + - supports-color 5316 + 5317 + remark-parse@11.0.0: 5318 + dependencies: 5319 + '@types/mdast': 4.0.4 5320 + mdast-util-from-markdown: 2.0.2 5321 + micromark-util-types: 2.0.2 5322 + unified: 11.0.5 5323 + transitivePeerDependencies: 5324 + - supports-color 5325 + 5326 + remark-rehype@11.1.2: 5327 + dependencies: 5328 + '@types/hast': 3.0.4 5329 + '@types/mdast': 4.0.4 5330 + mdast-util-to-hast: 13.2.0 5331 + unified: 11.0.5 5332 + vfile: 6.0.3 5333 + 5334 + remark-stringify@11.0.0: 5335 + dependencies: 5336 + '@types/mdast': 4.0.4 5337 + mdast-util-to-markdown: 2.1.2 5338 + unified: 11.0.5 5339 + 5340 + require-from-string@2.0.2: {} 5341 + 3295 5342 resolve-from@4.0.0: {} 3296 5343 3297 5344 resolve-pkg-maps@1.0.0: {} ··· 3330 5377 is-regex: 1.2.1 3331 5378 3332 5379 safe-stable-stringify@2.5.0: {} 5380 + 5381 + sanitizer@0.1.3: {} 3333 5382 3334 5383 semver@6.3.1: {} 3335 5384 ··· 3395 5444 dependencies: 3396 5445 is-arrayish: 0.3.2 3397 5446 5447 + source-map-js@1.2.1: {} 5448 + 3398 5449 source-map-support@0.5.21: 3399 5450 dependencies: 3400 5451 buffer-from: 1.1.2 3401 5452 source-map: 0.6.1 3402 5453 3403 5454 source-map@0.6.1: {} 5455 + 5456 + space-separated-tokens@2.0.2: {} 3404 5457 3405 5458 stack-trace@0.0.10: {} 3406 5459 ··· 3436 5489 dependencies: 3437 5490 safe-buffer: 5.2.1 3438 5491 5492 + stringify-entities@4.0.4: 5493 + dependencies: 5494 + character-entities-html4: 2.1.0 5495 + character-entities-legacy: 3.0.0 5496 + 5497 + stringify-object@5.0.0: 5498 + dependencies: 5499 + get-own-enumerable-keys: 1.0.0 5500 + is-obj: 3.0.0 5501 + is-regexp: 3.1.0 5502 + 3439 5503 strip-bom@3.0.0: {} 3440 5504 3441 5505 strip-json-comments@3.1.1: {} ··· 3446 5510 3447 5511 supports-preserve-symlinks-flag@1.0.0: {} 3448 5512 3449 - synckit@0.11.8: 5513 + synckit@0.11.11: 5514 + dependencies: 5515 + '@pkgr/core': 0.2.9 5516 + 5517 + tailwind-merge@2.6.0: {} 5518 + 5519 + terser@5.43.1: 3450 5520 dependencies: 3451 - '@pkgr/core': 0.2.7 5521 + '@jridgewell/source-map': 0.3.11 5522 + acorn: 8.15.0 5523 + commander: 2.20.3 5524 + source-map-support: 0.5.21 3452 5525 3453 5526 text-hex@1.0.0: {} 3454 5527 5528 + tiny-emitter@2.1.0: {} 5529 + 3455 5530 to-regex-range@5.0.1: 3456 5531 dependencies: 3457 5532 is-number: 7.0.0 3458 5533 3459 5534 toml@3.0.0: {} 5535 + 5536 + trim-lines@3.0.1: {} 5537 + 5538 + trim-trailing-lines@2.1.0: {} 3460 5539 3461 5540 triple-beam@1.4.1: {} 3462 5541 3463 - ts-api-utils@2.1.0(typescript@5.8.3): 5542 + trough@2.2.0: {} 5543 + 5544 + ts-api-utils@2.1.0(typescript@5.9.2): 3464 5545 dependencies: 3465 - typescript: 5.8.3 5546 + typescript: 5.9.2 5547 + 5548 + ts-deepmerge@7.0.3: {} 3466 5549 3467 5550 tsconfig-paths@3.15.0: 3468 5551 dependencies: ··· 3471 5554 minimist: 1.2.8 3472 5555 strip-bom: 3.0.0 3473 5556 3474 - tsx@4.20.3: 5557 + tslib@2.8.1: {} 5558 + 5559 + tsx@4.20.4: 3475 5560 dependencies: 3476 - esbuild: 0.25.5 5561 + esbuild: 0.25.9 3477 5562 get-tsconfig: 4.10.1 3478 5563 optionalDependencies: 3479 5564 fsevents: 2.3.3 ··· 3481 5566 type-check@0.4.0: 3482 5567 dependencies: 3483 5568 prelude-ls: 1.2.1 5569 + 5570 + type-fest@4.41.0: {} 3484 5571 3485 5572 typed-array-buffer@1.0.3: 3486 5573 dependencies: ··· 3515 5602 possible-typed-array-names: 1.1.0 3516 5603 reflect.getprototypeof: 1.0.10 3517 5604 3518 - typescript-eslint@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): 5605 + typescript-eslint@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): 3519 5606 dependencies: 3520 - '@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) 3521 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3522 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3523 - eslint: 9.30.1(jiti@2.4.2) 3524 - typescript: 5.8.3 5607 + '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 5608 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 5609 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) 5610 + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 5611 + eslint: 9.33.0(jiti@2.5.1) 5612 + typescript: 5.9.2 3525 5613 transitivePeerDependencies: 3526 5614 - supports-color 3527 5615 3528 - typescript@5.8.3: {} 5616 + typescript@5.9.2: {} 3529 5617 3530 5618 unbox-primitive@1.1.0: 3531 5619 dependencies: ··· 3534 5622 has-symbols: 1.1.0 3535 5623 which-boxed-primitive: 1.1.1 3536 5624 3537 - undici-types@7.8.0: {} 5625 + undici-types@6.21.0: {} 5626 + 5627 + undici-types@7.10.0: {} 5628 + 5629 + unified@11.0.5: 5630 + dependencies: 5631 + '@types/unist': 3.0.3 5632 + bail: 2.0.2 5633 + devlop: 1.1.0 5634 + extend: 3.0.2 5635 + is-plain-obj: 4.1.0 5636 + trough: 2.2.0 5637 + vfile: 6.0.3 5638 + 5639 + unist-util-find-after@5.0.0: 5640 + dependencies: 5641 + '@types/unist': 3.0.3 5642 + unist-util-is: 6.0.0 5643 + 5644 + unist-util-is@6.0.0: 5645 + dependencies: 5646 + '@types/unist': 3.0.3 5647 + 5648 + unist-util-position@5.0.0: 5649 + dependencies: 5650 + '@types/unist': 3.0.3 5651 + 5652 + unist-util-stringify-position@4.0.0: 5653 + dependencies: 5654 + '@types/unist': 3.0.3 5655 + 5656 + unist-util-visit-parents@6.0.1: 5657 + dependencies: 5658 + '@types/unist': 3.0.3 5659 + unist-util-is: 6.0.0 5660 + 5661 + unist-util-visit@5.0.0: 5662 + dependencies: 5663 + '@types/unist': 3.0.3 5664 + unist-util-is: 6.0.0 5665 + unist-util-visit-parents: 6.0.1 3538 5666 3539 5667 uri-js@4.4.1: 3540 5668 dependencies: 3541 5669 punycode: 2.3.1 3542 5670 3543 5671 util-deprecate@1.0.2: {} 5672 + 5673 + uuid@9.0.1: {} 5674 + 5675 + vfile-location@5.0.3: 5676 + dependencies: 5677 + '@types/unist': 3.0.3 5678 + vfile: 6.0.3 5679 + 5680 + vfile-message@4.0.3: 5681 + dependencies: 5682 + '@types/unist': 3.0.3 5683 + unist-util-stringify-position: 4.0.0 5684 + 5685 + vfile@6.0.3: 5686 + dependencies: 5687 + '@types/unist': 3.0.3 5688 + vfile-message: 4.0.3 5689 + 5690 + vue-component-type-helpers@3.0.5: {} 5691 + 5692 + vue-demi@0.14.10(vue@3.5.18(typescript@5.9.2)): 5693 + dependencies: 5694 + vue: 3.5.18(typescript@5.9.2) 5695 + 5696 + vue-sonner@1.3.2: {} 5697 + 5698 + vue@3.5.18(typescript@5.9.2): 5699 + dependencies: 5700 + '@vue/compiler-dom': 3.5.18 5701 + '@vue/compiler-sfc': 3.5.18 5702 + '@vue/runtime-dom': 3.5.18 5703 + '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.9.2)) 5704 + '@vue/shared': 3.5.18 5705 + optionalDependencies: 5706 + typescript: 5.9.2 5707 + 5708 + web-namespaces@2.0.1: {} 3544 5709 3545 5710 web-streams-polyfill@3.3.3: {} 3546 5711 ··· 3615 5780 3616 5781 xxhash-wasm@1.1.0: {} 3617 5782 5783 + yaml@2.8.0: {} 5784 + 3618 5785 yocto-queue@0.1.0: {} 5786 + 5787 + zod@3.24.1: {} 5788 + 5789 + zwitch@2.0.4: {}
+1
backend/pnpm-workspace.yaml
··· 1 1 onlyBuiltDependencies: 2 2 - esbuild 3 + - vue-demi
+123
backend/src/api/feed.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 { 8 + SocialClipprActorDefs, 9 + SocialClipprFeedClip, 10 + SocialClipprFeedDefs, 11 + } from "@clipprjs/lexicons"; 12 + import type { ClipViewQuery, ErrorResponse, TagRef } from "./types.js"; 13 + import { getHandleFromDid } from "../network/converters.js"; 14 + import { Database } from "../db/database.js"; 15 + import { clipsTable } from "../db/schema.js"; 16 + import { and, eq } from "drizzle-orm"; 17 + import { createProfileView } from "./profile.js"; 18 + import { is } from "@atcute/lexicons"; 19 + import { validateHash } from "../hasher.js"; 20 + 21 + const db = Database.getInstance().getDb(); 22 + 23 + export async function createClipView( 24 + query: ClipViewQuery, 25 + ): Promise<SocialClipprFeedDefs.ClipView | ErrorResponse> { 26 + if (!query.did.startsWith("did:")) { 27 + let did; 28 + try { 29 + did = await getHandleFromDid(query.did); 30 + } catch (e: unknown) { 31 + if (e instanceof Error) { 32 + return { 33 + error: "InvalidRequest", 34 + message: `Error: A queried URI does not have a valid DID or handle: ${e.message}`, 35 + }; 36 + } else { 37 + return { 38 + error: "InvalidRequest", 39 + message: 40 + "Error: A queried URI does not have a valid DID or handle: unknown error", 41 + }; 42 + } 43 + } 44 + query.did = did; 45 + } 46 + 47 + if (query.collection !== "social.clippr.feed.clip") { 48 + return { 49 + error: "InvalidRequest", 50 + message: "Error: A queried URI is not a proper clip", 51 + }; 52 + } 53 + 54 + const dbQuery = await db 55 + .selectDistinct() 56 + .from(clipsTable) 57 + .where( 58 + and( 59 + eq(clipsTable.did, query.did), 60 + eq(clipsTable.recordKey, query.recordKey), 61 + ), 62 + ); 63 + 64 + if (dbQuery.length === 0) { 65 + return { 66 + error: "InvalidRequest", 67 + message: "Could not find a given URI", 68 + }; 69 + } 70 + 71 + // Yes, the array thing is not ideal. 72 + if (!dbQuery[0]?.cid) { 73 + return { 74 + error: "InvalidRequest", 75 + message: "Could not find a given URI", 76 + }; 77 + } 78 + 79 + if (!(await validateHash(dbQuery[0]?.url, query.recordKey))) { 80 + return { 81 + error: "InvalidRequest", 82 + message: "Could not find a given URI", 83 + }; 84 + } 85 + 86 + const authorView: ErrorResponse | SocialClipprActorDefs.ProfileView = 87 + await createProfileView(query.did); 88 + 89 + if (!is(SocialClipprActorDefs.profileViewSchema, authorView)) { 90 + console.log(authorView); 91 + return { 92 + error: "InvalidRequest", 93 + message: "Could not validate profile view", // I can't get the error message, it seems to always assume the type is the ProfileView 94 + } as ErrorResponse; 95 + } 96 + 97 + let clipTags: TagRef[] | undefined; 98 + 99 + if (dbQuery[0]?.tags === null) { 100 + clipTags = undefined; 101 + } 102 + 103 + const clipRecord: SocialClipprFeedClip.Main = { 104 + $type: "social.clippr.feed.clip", 105 + url: dbQuery[0]?.url as `${string}:${string}`, 106 + title: dbQuery[0]?.title, 107 + description: dbQuery[0]?.description, 108 + tags: clipTags || undefined, 109 + unlisted: dbQuery[0]?.unlisted, 110 + unread: dbQuery[0]?.unread || undefined, 111 + notes: dbQuery[0]?.notes || undefined, 112 + languages: dbQuery[0]?.languages || undefined, 113 + createdAt: dbQuery[0]?.createdAt.toISOString(), 114 + }; 115 + 116 + return { 117 + cid: dbQuery[0]?.cid, 118 + uri: `at://${query.did}/${query.collection}/${query.recordKey}`, 119 + author: authorView, 120 + record: clipRecord, 121 + indexedAt: dbQuery[0]?.indexedAt.toISOString(), 122 + }; 123 + }
+101
backend/src/api/profile.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 { SocialClipprActorDefs } from "@clipprjs/lexicons"; 8 + import type { ErrorResponse } from "./types.js"; 9 + import { getDidFromHandle, getHandleFromDid } from "../network/converters.js"; 10 + import { Database } from "../db/database.js"; 11 + import { usersTable } from "../db/schema.js"; 12 + import { eq } from "drizzle-orm"; 13 + 14 + const db = Database.getInstance().getDb(); 15 + 16 + // TODO: Stop leeching off the Bluesky CDN and get the blob directly from the user's PDS 17 + // 18 + // Get a CDN URI from a blob's CID 19 + export async function createAvatarLink( 20 + did: string, 21 + cid: string, 22 + ): Promise<string> { 23 + return `https://cdn.bsky.app/img/avatar/plain/${did}/${cid}`; 24 + } 25 + 26 + export async function createProfileView( 27 + actor: string, 28 + ): Promise<SocialClipprActorDefs.ProfileView | ErrorResponse> { 29 + let viewHandle; 30 + let viewDid; 31 + 32 + if (actor.startsWith("did:")) { 33 + viewDid = actor; 34 + try { 35 + viewHandle = await getHandleFromDid(viewDid); 36 + viewHandle = viewHandle.replace("at://", ""); 37 + } catch (e: unknown) { 38 + if (e instanceof Error) { 39 + return { 40 + error: "InvalidRequest", 41 + message: `Error: A queried URI does not have a valid DID or handle: ${e.message}`, 42 + }; 43 + } else { 44 + return { 45 + error: "InvalidRequest", 46 + message: 47 + "Error: A queried URI does not have a valid DID or handle: unknown error", 48 + }; 49 + } 50 + } 51 + } else { 52 + viewHandle = actor; 53 + viewHandle = viewHandle.replace("at://", ""); 54 + try { 55 + viewDid = await getDidFromHandle(viewHandle); 56 + } catch (e: unknown) { 57 + if (e instanceof Error) { 58 + return { 59 + error: "InvalidRequest", 60 + message: `Error: A queried URI does not have a valid DID or handle: ${e.message}`, 61 + }; 62 + } else { 63 + return { 64 + error: "InvalidRequest", 65 + message: 66 + "Error: A queried URI does not have a valid DID or handle: unknown error", 67 + }; 68 + } 69 + } 70 + } 71 + 72 + const dbQuery = await db 73 + .selectDistinct() 74 + .from(usersTable) 75 + .where(eq(usersTable.did, viewDid)); 76 + 77 + if (dbQuery.length === 0) { 78 + return { 79 + error: "InvalidRequest", 80 + message: "Could not find a queried URI's profile", 81 + } as ErrorResponse; 82 + } 83 + 84 + const avatarCid = dbQuery[0]?.avatar; 85 + 86 + let viewAvatar; 87 + 88 + if (avatarCid === undefined || avatarCid === null) { 89 + viewAvatar = "https://missing.avatar"; 90 + } else viewAvatar = await createAvatarLink(viewDid, avatarCid); 91 + 92 + return { 93 + $type: "social.clippr.actor.defs#profileView", 94 + did: viewDid as `did:${string}:${string}`, 95 + handle: viewHandle as `${string}.${string}`, 96 + avatar: (viewAvatar as `${string}:${string}`) || undefined, 97 + createdAt: dbQuery[0]?.createdAt.toISOString(), 98 + description: dbQuery[0]?.description || undefined, 99 + displayName: dbQuery[0]?.displayName || viewHandle, 100 + }; 101 + }
+38
backend/src/api/types.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 type { ResourceUri } from "@atcute/lexicons"; 8 + 9 + export interface ErrorResponse { 10 + error: string; 11 + message: string; 12 + } 13 + 14 + export interface ProfileViewQuery { 15 + actor: string; 16 + } 17 + 18 + export interface ClipViewQuery { 19 + did: string; 20 + collection: string; 21 + recordKey: string; 22 + } 23 + 24 + export const isClipViewQuery = (query: unknown): query is ClipViewQuery => { 25 + return typeof query === "object" && query !== null && "did" in query; 26 + }; 27 + 28 + export interface TagRef { 29 + $type: "com.atproto.repo.strongRef"; 30 + cid: string; 31 + uri: ResourceUri; 32 + } 33 + 34 + export interface TagViewQuery { 35 + did: string; 36 + collection: string; 37 + recordKey: string; 38 + }
+26 -5
backend/src/db/schema.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - // noinspection Annotator 8 - 9 7 import { int, sqliteTable, text } from "drizzle-orm/sqlite-core"; 10 8 import { sql } from "drizzle-orm"; 9 + import type { TagRef } from "../api/types.js"; 11 10 12 11 // WebStorm keeps throwing errors with the default statements as it wants 13 12 // an actual SQLite query, despite being valid. Sucks. ··· 18 17 .default(sql`(unixepoch() * 1000)`), 19 18 did: text("did").notNull(), 20 19 recordKey: text("rkey").notNull(), 20 + cid: text("cid").notNull(), 21 21 url: text("url").notNull(), 22 22 title: text("title").notNull(), 23 23 description: text("description").notNull(), 24 24 unlisted: int("unlisted", { mode: "boolean" }).notNull(), 25 25 notes: text("notes"), 26 26 tags: text("tags", { mode: "json" }) 27 - .$type<string[]>() 27 + .$type<TagRef[]>() 28 28 .default(sql`'[]'`), 29 29 unread: int("unread", { mode: "boolean" }), 30 30 languages: text("languages", { mode: "json" }) ··· 33 33 createdAt: int("createdAt", { mode: "timestamp_ms" }) 34 34 .notNull() 35 35 .default(sql`(unixepoch() * 1000)`), 36 + indexedAt: int("indexedAt", { mode: "timestamp_ms" }) 37 + .notNull() 38 + .default(sql`(unixepoch() * 1000)`), 36 39 }); 37 40 38 41 export const tagsTable = sqliteTable("tags", { ··· 42 45 .default(sql`(unixepoch() * 1000)`), 43 46 did: text("did").notNull(), 44 47 recordKey: text("rkey").notNull(), 48 + cid: text("cid").notNull(), 45 49 name: text("name").notNull(), 50 + description: text("description"), 46 51 color: text("color"), 47 52 createdAt: int("createdAt", { mode: "timestamp_ms" }) 48 53 .notNull() 49 54 .default(sql`(unixepoch() * 1000)`), 55 + indexedAt: int("indexedAt", { mode: "timestamp_ms" }) 56 + .notNull() 57 + .default(sql`(unixepoch() * 1000)`), 50 58 }); 51 59 52 60 export const usersTable = sqliteTable("profiles", { ··· 54 62 timestamp: int("time_us", { mode: "timestamp_ms" }) 55 63 .notNull() 56 64 .default(sql`(unixepoch() * 1000)`), 57 - did: text("did").notNull(), 58 - displayName: text("displayName"), 65 + did: text("did").notNull().unique(), 66 + cid: text("cid").notNull(), 67 + displayName: text("displayName").notNull(), 59 68 description: text("description"), 60 69 avatar: text("avatar"), 61 70 createdAt: int("createdAt", { mode: "timestamp_ms" }) 62 71 .notNull() 63 72 .default(sql`(unixepoch() * 1000)`), 64 73 }); 74 + 75 + export const preferencesTable = sqliteTable("preferences", { 76 + id: int("id").primaryKey({ autoIncrement: true }), 77 + did: text("did").notNull().unique(), 78 + handle: text("handle").notNull(), 79 + publishingScopesPref: text("publishingScopesPref", { mode: "json" }) 80 + .$type<string[]>() 81 + .default(sql`'[]'`), 82 + lastModified: int("lastModified", { mode: "timestamp_ms" }) 83 + .notNull() 84 + .default(sql`(unixepoch() * 1000)`), 85 + });
+21
backend/src/hasher.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 xxhash from "xxhash-wasm"; 8 + 9 + /// Hash a given string into a hexadecimal xxh64 string. 10 + export async function hashString(data: string): Promise<string> { 11 + const { h64 } = await xxhash(); 12 + return h64(data).toString(16); 13 + } 14 + 15 + /// Check if a string is equivalent to a given hash. 16 + export async function validateHash( 17 + data: string, 18 + hash: string, 19 + ): Promise<boolean> { 20 + return hash === (await hashString(data)); 21 + }
+6 -2
backend/src/main.ts
··· 6 6 7 7 import { serve, type ServerType } from "@hono/node-server"; 8 8 import { Config } from "./config.js"; 9 - import { readFromFirehose, startFirehose, stopFirehose } from "./network/jetstream.js"; 9 + import { 10 + readFromFirehose, 11 + startFirehose, 12 + stopFirehose, 13 + } from "./network/jetstream.js"; 10 14 import app from "./server.js"; 11 15 import { Database } from "./db/database.js"; 12 16 import Logger from "./logger.js"; ··· 43 47 44 48 function gracefulShutdown(signal: string) { 45 49 logger.info(`Received ${signal}, shutting down...`); 46 - stopFirehose(); 47 50 server.close(); 51 + stopFirehose(); 48 52 logger.info("Bye!"); 49 53 process.exit(0); 50 54 }
+68 -30
backend/src/network/commit.ts
··· 8 8 import { Database } from "../db/database.js"; 9 9 import { clipsTable, tagsTable, usersTable } from "../db/schema.js"; 10 10 import { is } from "@atcute/lexicons"; 11 - import { SocialClipprActorProfile, SocialClipprFeedClip, SocialClipprFeedTag } from "@clipprjs/lexicons"; 12 - import type { At } from "@atcute/client/lexicons"; 11 + import { 12 + SocialClipprActorProfile, 13 + SocialClipprFeedClip, 14 + SocialClipprFeedTag, 15 + } from "@clipprjs/lexicons"; 13 16 import Logger from "../logger.js"; 14 17 import { isBlob } from "@atcute/lexicons/interfaces"; 15 18 import { validateClip, validateProfile, validateTag } from "./validator.js"; 16 - import xxhash from "xxhash-wasm"; 19 + import { convertDidToString } from "./converters.js"; 20 + import { hashString } from "../hasher.js"; 21 + import { eq } from "drizzle-orm"; 17 22 18 23 const db = Database.getInstance().getDb(); 19 24 20 - /// Converts an ``At.DID`` type to a proper string, for type reasons. 21 - function convertDidToString(did: At.DID): string { 22 - return did.toString(); 23 - } 24 - 25 25 /// Converts a microsecond Unix date to a Date object, for type reasons. 26 26 function convertMicroToDate(micro: number): Date { 27 27 return new Date(micro / 1000); ··· 39 39 40 40 if (event.commit.record.$type !== "social.clippr.feed.clip") { 41 41 Logger.verbose( 42 - "Invalid type for incoming clip record", 42 + `Mismatched type for incoming clip record (${event.did}/${event.commit.rkey})`, 43 43 event.commit.record, 44 44 ); 45 45 } 46 46 47 47 if (!is(SocialClipprFeedClip.mainSchema, event.commit.record)) { 48 48 Logger.verbose( 49 - "Invalid schema for incoming clip record", 49 + `Invalid schema for incoming clip record (${event.did}/${event.commit.rkey})`, 50 50 event.commit.record, 51 51 ); 52 52 return; ··· 66 66 }; 67 67 68 68 // xxh64, NOT xxh3 learned that the hard way 69 - const { h64 } = await xxhash(); 70 - const urlHash = h64(record.url).toString(16); 69 + const urlHash: string = await hashString(record.url); 71 70 72 71 if (urlHash !== event.commit.rkey) { 73 72 Logger.verbose( 74 - `Record key hash (${event.commit.rkey}) does not match hash of URL (${urlHash}) in incoming clip record`, 73 + `Record key hash (${event.commit.rkey}) does not match hash of URL (${urlHash}) in incoming clip record (${event.did})`, 75 74 event.commit.record, 76 75 ); 77 76 return; ··· 84 83 await db.insert(clipsTable).values({ 85 84 // @ts-expect-error Weird type error despite being a normal string. 86 85 did: convertDidToString(event.did), 86 + cid: event.commit.cid, 87 87 timestamp: convertMicroToDate(event.time_us), 88 88 recordKey: event.commit.rkey, 89 89 createdAt: new Date(record.createdAt), 90 + indexedAt: new Date(), 90 91 url: record.url, 91 92 title: record.title, 92 93 description: record.description, ··· 97 98 languages: record.languages, 98 99 }); 99 100 100 - Logger.verbose("Indexed new clip:", event.did, event.commit.rkey); 101 + Logger.verbose(`Indexed new clip: ${event.did}/${event.commit.rkey}`, event); 101 102 } 102 103 103 104 export async function handleTag( ··· 111 112 } // We currently do not handle these. 112 113 113 114 if (event.commit.record.$type !== "social.clippr.feed.tag") { 114 - Logger.verbose("Invalid type for incoming tag record", event.commit.record); 115 + Logger.verbose( 116 + `Mismatched type for incoming tag record (${event.did}/${event.commit.rkey})`, 117 + event.commit.record, 118 + ); 115 119 return; 116 120 } 117 121 118 122 if (!is(SocialClipprFeedTag.mainSchema, event.commit.record)) { 119 123 Logger.verbose( 120 - "Invalid schema for incoming tag record", 124 + `Invalid schema for incoming tag record (${event.did}/${event.commit.rkey})`, 121 125 event.commit.record, 122 126 ); 123 127 return; ··· 128 132 createdAt: event.commit.record.createdAt, 129 133 name: event.commit.record.name, 130 134 color: event.commit.record.color, 135 + description: event.commit.record.description, 131 136 }; 132 137 133 138 if (record.name !== event.commit.rkey) { 134 139 Logger.verbose( 135 - "Record key does not match name of incoming tag record", 140 + `Record key does not match name of incoming tag record (${event.did}/${event.commit.rkey})`, 136 141 event.commit.record, 137 142 ); 138 143 return; ··· 144 149 } 145 150 146 151 await db.insert(tagsTable).values({ 147 - did: convertDidToString(event.did), 148 152 timestamp: convertMicroToDate(event.time_us), 153 + did: convertDidToString(event.did), 154 + cid: event.commit.cid, 149 155 recordKey: event.commit.rkey, 150 - createdAt: new Date(record.createdAt), 151 156 name: record.name, 157 + description: record.description, 152 158 color: record.color, 159 + createdAt: new Date(record.createdAt), 160 + indexedAt: new Date(), 153 161 }); 154 162 155 - Logger.verbose("Indexed new tag:", event.did, event.commit.rkey); 163 + Logger.verbose(`Indexed new tag: ${event.did}/${event.commit.rkey}`, event); 156 164 } 157 165 158 166 export async function handleProfile( 159 167 event: CommitEvent<`social.clippr.${string}`>, 160 168 ): Promise<void> { 161 - if (event.commit.operation !== "create") { 169 + if (event.commit.operation === "delete") { 162 170 Logger.warn( 163 171 `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 164 172 ); 165 173 return; 166 - } // We currently do not handle these. 174 + } // We currently do not handle deletes. 167 175 168 176 if (event.commit.record.$type !== "social.clippr.actor.profile") { 169 177 Logger.verbose( 170 - "Invalid type for incoming profile record", 178 + `Mismatched type for incoming profile record (${event.did})`, 171 179 event.commit.record, 172 180 ); 173 181 return; ··· 175 183 176 184 if (!is(SocialClipprActorProfile.mainSchema, event.commit.record)) { 177 185 Logger.verbose( 178 - "Invalid schema for incoming profile record", 186 + `Invalid schema for incoming profile record (${event.did})`, 179 187 event.commit.record, 180 188 ); 181 189 return; ··· 191 199 192 200 if (event.commit.rkey !== "self") { 193 201 Logger.verbose( 194 - "Record key of incoming profile record does not match 'self'", 202 + `Record key of incoming profile record does not match 'self' (${event.did})`, 195 203 event.commit.record, 196 204 ); 197 205 return; ··· 200 208 // This needs to be here so the avatar can be recognized as a proper blob. 201 209 if (record.avatar) { 202 210 if (!isBlob(record.avatar)) { 203 - Logger.verbose("Avatar in incoming profile record is not a blob", record); 211 + Logger.verbose( 212 + `Avatar in incoming profile record is not a blob (${event.did})`, 213 + record, 214 + ); 204 215 return; 205 216 } 206 217 207 218 if (record.avatar.mimeType.match(/^image\/(png|jpeg)$/i) === null) { 208 219 Logger.verbose( 209 - "Avatar in incoming profile record is not a PNG or JPEG", 220 + `Avatar in incoming profile record is not a PNG or JPEG (${event.did})`, 210 221 record, 211 222 ); 212 223 return; ··· 214 225 215 226 if (record.avatar.ref?.$link === undefined) { 216 227 Logger.verbose( 217 - "Avatar in incoming profile record has no link to blob", 228 + `Avatar in incoming profile record has no link to blob (${event.did})`, 218 229 record, 219 230 ); 220 231 return; 221 232 } 222 233 223 234 if (record.avatar.size > 1000000) { 224 - Logger.verbose("Avatar in incoming profile record is too large", record); 235 + Logger.verbose( 236 + `Avatar in incoming profile record is too large (${event.did})`, 237 + record, 238 + ); 225 239 return; 226 240 } 227 241 } ··· 231 245 return; 232 246 } 233 247 248 + if (event.commit.operation === "update") { 249 + await db 250 + .update(usersTable) 251 + .set({ 252 + did: convertDidToString(event.did), 253 + cid: event.commit.cid, 254 + timestamp: convertMicroToDate(event.time_us), 255 + createdAt: new Date(record.createdAt), 256 + displayName: record.displayName, 257 + avatar: record.avatar?.ref.$link, 258 + description: record.description, 259 + }) 260 + .where(eq(usersTable.did, convertDidToString(event.did))) 261 + .execute(); 262 + 263 + Logger.verbose(`Updated profile: ${convertDidToString(event.did)}`, event); 264 + 265 + return; 266 + } 267 + 234 268 await db.insert(usersTable).values({ 235 269 did: convertDidToString(event.did), 270 + cid: event.commit.cid, 236 271 timestamp: convertMicroToDate(event.time_us), 237 272 createdAt: new Date(record.createdAt), 238 273 displayName: record.displayName, ··· 240 275 description: record.description, 241 276 }); 242 277 243 - Logger.verbose("Indexed new profile for:", convertDidToString(event.did)); 278 + Logger.verbose( 279 + `Indexed new profile: ${convertDidToString(event.did)}`, 280 + event, 281 + ); 244 282 }
+118
backend/src/network/converters.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 { 8 + CompositeDidDocumentResolver, 9 + DocumentNotFoundError, 10 + FailedDocumentResolutionError, 11 + HandleResolutionError, 12 + ImproperDidError, 13 + PlcDidDocumentResolver, 14 + UnsupportedDidMethodError, 15 + WebDidDocumentResolver, 16 + } from "@atcute/identity-resolver"; 17 + import { Client, simpleFetchHandler } from "@atcute/client"; 18 + 19 + /// Converts an ``At.DID`` type to a proper string, for type reasons. 20 + export function convertDidToString(did: `did:${string}`): string { 21 + return did.toString(); 22 + } 23 + 24 + export function convertStringToTypedDid(did: string) { 25 + if (did.startsWith("did:plc:")) { 26 + return did as `did:plc:${string}`; 27 + } else if (did.startsWith("did:web:")) { 28 + return did as `did:web:${string}`; 29 + } else { 30 + return did as `did:plc:${string}`; 31 + } 32 + } 33 + 34 + // Get a user's handle from their DID. DID method agnostic. 35 + export async function getHandleFromDid(did: string): Promise<string> { 36 + const docResolver = new CompositeDidDocumentResolver({ 37 + methods: { 38 + plc: new PlcDidDocumentResolver(), 39 + web: new WebDidDocumentResolver(), 40 + }, 41 + }); 42 + 43 + let doc; 44 + try { 45 + doc = await docResolver.resolve(convertStringToTypedDid(did)); 46 + } catch (err) { 47 + if (err instanceof DocumentNotFoundError) { 48 + throw new Error("Document not found"); 49 + } 50 + if (err instanceof UnsupportedDidMethodError) { 51 + throw new Error("Unsupported did method"); 52 + } 53 + if (err instanceof ImproperDidError) { 54 + throw new Error("Improper did"); 55 + } 56 + if (err instanceof FailedDocumentResolutionError) { 57 + throw new Error("Failed document resolution"); 58 + } 59 + if (err instanceof HandleResolutionError) { 60 + throw new Error("Generic handle resolution error"); 61 + } 62 + } 63 + 64 + if (!doc?.alsoKnownAs) { 65 + throw new Error("No handles found"); 66 + } 67 + 68 + if (doc?.alsoKnownAs[0] === undefined) { 69 + throw new Error("No handles found"); 70 + } 71 + 72 + return doc?.alsoKnownAs[0].substring( 73 + doc?.alsoKnownAs[0].lastIndexOf("/" + 1), 74 + ); 75 + } 76 + 77 + // Get a user's DID from their handle. 78 + export async function getDidFromHandle(handle: string): Promise<string> { 79 + const handler = simpleFetchHandler({ 80 + service: "https://public.api.bsky.app", 81 + }); 82 + const rpc = new Client({ handler }); 83 + 84 + const { ok, data } = await rpc.get("com.atproto.identity.resolveHandle", { 85 + params: { 86 + handle: handle as `${string}.${string}`, 87 + }, 88 + }); 89 + 90 + if (!ok) { 91 + switch (data.error) { 92 + case "InvalidRequest": { 93 + throw new Error("InvalidRequest", { cause: data.message }); 94 + } 95 + case "AccountTakedown": { 96 + throw new Error("AccountTakedown", { cause: data.message }); 97 + } 98 + case "AccountDeactivated": { 99 + throw new Error("AccountDeactivated", { cause: data.message }); 100 + } 101 + default: { 102 + throw new Error(data.error, { cause: data.message }); 103 + } 104 + } 105 + } 106 + 107 + let actorDid; 108 + 109 + if (ok) { 110 + actorDid = data.did as string; 111 + } 112 + 113 + if (actorDid === undefined) { 114 + throw new Error("InvalidRequest"); 115 + } 116 + 117 + return actorDid; 118 + }
+64 -7
backend/src/network/validator.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import {SocialClipprActorProfile, SocialClipprFeedClip, SocialClipprFeedTag,} from "@clipprjs/lexicons"; 8 - import {isDatetime, isLanguageCode} from "@atcute/lexicons/syntax"; 7 + import { 8 + SocialClipprActorProfile, 9 + SocialClipprFeedClip, 10 + SocialClipprFeedTag, 11 + } from "@clipprjs/lexicons"; 12 + import { 13 + isDatetime, 14 + isGenericUri, 15 + isLanguageCode, 16 + } from "@atcute/lexicons/syntax"; 9 17 import Logger from "../logger.js"; 18 + import { ComAtprotoRepoStrongRef } from "@atcute/atproto"; 19 + import { is } from "@atcute/lexicons"; 10 20 11 21 export async function validateProfile( 12 22 record: SocialClipprActorProfile.Main, ··· 27 37 ); 28 38 return false; 29 39 } 40 + 41 + if (record.displayName.length < 1) { 42 + Logger.verbose( 43 + "Too short displayName from incoming profile record", 44 + record, 45 + ); 46 + return false; 47 + } 30 48 } else { 31 49 Logger.verbose("No displayName from incoming profile record", record); 32 50 return false; ··· 40 58 ); 41 59 return false; 42 60 } 61 + 62 + if (record.description.length < 1) { 63 + Logger.verbose( 64 + "Too short description from incoming profile record", 65 + record, 66 + ); 67 + return false; 68 + } 43 69 } 44 70 45 71 return true; ··· 57 83 } 58 84 59 85 if (record.name.length > 64) { 60 - Logger.verbose("Invalid name length for incoming tag record", record); 86 + Logger.verbose("Name from incoming tag record is too long", record); 61 87 return false; 62 88 } 63 89 64 90 if (record.color) { 65 91 if (record.color.length > 7) { 66 - Logger.verbose("Invalid color length for incoming tag record", record); 92 + Logger.verbose("Color from incoming tag record is too long", record); 67 93 return false; 68 94 } 69 95 ··· 76 102 } 77 103 } 78 104 105 + if (record.description) { 106 + if (record.description.length > 500) { 107 + Logger.verbose( 108 + "Description from incoming tag record is too long", 109 + record, 110 + ); 111 + return false; 112 + } 113 + } 114 + 79 115 return true; 80 116 } 81 117 82 118 export async function validateClip( 83 119 record: SocialClipprFeedClip.Main, 84 120 ): Promise<boolean> { 121 + if (!isGenericUri(record.url)) { 122 + Logger.verbose("Invalid url from incoming clip record", record); 123 + return false; 124 + } 125 + 85 126 if (record.url.length > 2000) { 86 127 Logger.verbose("Too long url from incoming clip record", record); 87 128 return false; ··· 105 146 } 106 147 107 148 if (record.tags) { 108 - if (record.tags.some((tag) => tag.$type !== "com.atproto.repo.strongRef")) { 149 + if ( 150 + record.tags.some((tag) => { 151 + return tag.$type !== "com.atproto.repo.strongRef"; 152 + }) 153 + ) { 154 + Logger.verbose( 155 + "A tag from incoming clip record is not typed as strongRef", 156 + record, 157 + ); 158 + return false; 159 + } 160 + 161 + if ( 162 + record.tags.some((tag) => { 163 + return !is(ComAtprotoRepoStrongRef.mainSchema, tag); 164 + }) 165 + ) { 109 166 Logger.verbose( 110 - "A tag ref from incoming clip record is not a strongRef", 167 + "A tag from incoming clip record is not a valid strongRef", 111 168 record, 112 169 ); 113 170 return false; 114 171 } 115 172 116 - // There should be more tests here, but I'm not exactly sure what to add... 173 + // There should definitely be more tests here, but I'm not exactly sure what to add... 117 174 } 118 175 119 176 if (typeof record.unlisted !== "boolean") {
+44
backend/src/routes/openapi.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 { Hono } from "hono"; 8 + import { Scalar } from "@scalar/hono-api-reference"; 9 + import { createMarkdownFromOpenApi } from "@scalar/openapi-to-markdown"; 10 + import { serveStatic } from "@hono/node-server/serve-static"; 11 + import { readFileSync } from "fs"; 12 + 13 + const app = new Hono(); 14 + 15 + app.get( 16 + "/api.json", 17 + serveStatic({ 18 + path: "./static/api.json", 19 + }), 20 + ); 21 + 22 + app.on( 23 + "GET", 24 + ["/scalar", "/docs"], 25 + Scalar({ 26 + url: "/api.json", 27 + theme: "bluePlanet", 28 + pageTitle: "Clippr AppView API documentation", 29 + layout: "modern", 30 + hideClientButton: true, 31 + forceDarkModeState: "dark", 32 + }), 33 + ); 34 + 35 + /** 36 + * Create a Markdown document for LLMs to read 37 + * @see https://llmstxt.org/ 38 + */ 39 + const markdown = await createMarkdownFromOpenApi( 40 + readFileSync("./static/api.json", "utf-8"), 41 + ); 42 + app.get("/llms.txt", (c) => c.text(markdown)); 43 + 44 + export default app;
+237
backend/src/routes/xrpc.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 { Hono } from "hono"; 8 + import { Database } from "../db/database.js"; 9 + import { usersTable } from "../db/schema.js"; 10 + import { eq } from "drizzle-orm"; 11 + import { getDidFromHandle, getHandleFromDid } from "../network/converters.js"; 12 + import { createClipView } from "../api/feed.js"; 13 + import { type ClipViewQuery, type ErrorResponse } from "../api/types.js"; 14 + import { createAvatarLink } from "../api/profile.js"; 15 + import { SocialClipprFeedDefs } from "@clipprjs/lexicons"; 16 + import { is } from "@atcute/lexicons"; 17 + 18 + const app = new Hono(); 19 + const db = Database.getInstance().getDb(); 20 + 21 + app.get("/social.clippr.actor.getProfile", async (c) => { 22 + const actor = c.req.query("actor"); 23 + if (actor === undefined || actor.trim().length === 0) { 24 + return c.json( 25 + { 26 + error: "InvalidRequest", 27 + message: "Error: Parameters must have the actor property included", 28 + }, 29 + 400, 30 + ); 31 + } 32 + 33 + let actorDid = actor; 34 + 35 + if (!actor.startsWith("did:")) { 36 + try { 37 + actorDid = await getDidFromHandle(actor); 38 + } catch (e: unknown) { 39 + if (e instanceof Error) { 40 + return c.json( 41 + { 42 + error: e.message, 43 + message: e.cause, 44 + }, 45 + 400, 46 + ); 47 + } else { 48 + return c.json( 49 + { 50 + error: "InvalidRequest" as string, 51 + message: "Unknown error while resolving DID from handle" as string, 52 + }, 53 + 400, 54 + ); 55 + } 56 + } 57 + } 58 + 59 + const profileSearch = await db 60 + .selectDistinct() 61 + .from(usersTable) 62 + .where(eq(usersTable.did, actorDid)); 63 + 64 + if (profileSearch.length === 0) { 65 + return c.json( 66 + { 67 + error: "InvalidRequest", 68 + message: "Profile not found", 69 + }, 70 + 400, 71 + ); 72 + } 73 + 74 + let actorHandle; 75 + 76 + if (actor.startsWith("did:")) { 77 + try { 78 + actorHandle = await getHandleFromDid(actor); 79 + } catch (e: unknown) { 80 + if (e instanceof Error) { 81 + return c.json( 82 + { 83 + error: "InvalidRequest", 84 + message: `${e.message}`, 85 + }, 86 + 400, 87 + ); 88 + } else { 89 + return c.json( 90 + { 91 + error: "InvalidRequest" as string, 92 + message: "Unknown error while resolving handle from DID" as string, 93 + }, 94 + 400, 95 + ); 96 + } 97 + } 98 + 99 + if (actorHandle === undefined) { 100 + actorHandle = "invalid.handle"; 101 + } 102 + } else actorHandle = actor; 103 + 104 + // TODO: Add placeholder avatar 105 + // This is a mess and should be replaced with a real solution! 106 + const avatarCid: string = 107 + profileSearch[0]?.avatar || "https://missing.avatar"; 108 + let actorAvatar; 109 + if (avatarCid !== "https://missing.avatar") { 110 + actorAvatar = await createAvatarLink(actorDid, avatarCid); 111 + } else actorAvatar = avatarCid; 112 + 113 + // Right now we don't do de-duplication in the database, so we just take the 114 + // first result and use that for our return call. 115 + return c.json({ 116 + did: actorDid, 117 + handle: actorHandle, 118 + displayName: profileSearch[0]?.displayName, 119 + avatar: actorAvatar, 120 + description: profileSearch[0]?.description || null, 121 + createdAt: profileSearch[0]?.createdAt, 122 + }); 123 + }); 124 + 125 + app.get("/social.clippr.feed.getClips", async (c) => { 126 + const uris = c.req.query("uris"); 127 + if (uris === undefined || uris.trim().length === 0) { 128 + return c.json( 129 + { 130 + error: "InvalidRequest", 131 + message: "Error: Parameters must have the uris property included", 132 + }, 133 + 400, 134 + ); 135 + } 136 + 137 + const rawUriArray: string[] = uris.split(","); 138 + 139 + if (rawUriArray.length > 25) { 140 + return c.json( 141 + { 142 + error: "InvalidRequest", 143 + message: "Error: More than 25 URIs have been provided", 144 + }, 145 + 400, 146 + ); 147 + } 148 + 149 + if ( 150 + rawUriArray.some((value) => { 151 + return !value.startsWith("at://"); 152 + }) 153 + ) { 154 + return c.json( 155 + { 156 + error: "InvalidRequest", 157 + message: "Error: A queried URI is missing the at:// identifier", 158 + }, 159 + 400, 160 + ); 161 + } 162 + 163 + const parsedUriArray: object[] = []; 164 + 165 + for (let value of rawUriArray) { 166 + value = value.replace("at://", ""); 167 + const splitUri: string[] = value.split("/"); 168 + 169 + if (splitUri.length !== 3) { 170 + c.json( 171 + { 172 + error: "InvalidRequest", 173 + message: "Error: A queried URI is not a proper clip", 174 + }, 175 + 400, 176 + ); 177 + } 178 + 179 + let splitUriObject: ClipViewQuery = { 180 + did: "", 181 + collection: "", 182 + recordKey: "", 183 + }; 184 + 185 + // validate type 186 + if ( 187 + !splitUri[0] || 188 + !splitUri[1] || 189 + !splitUri[2] || 190 + typeof splitUri[0] !== "string" || 191 + typeof splitUri[1] !== "string" || 192 + typeof splitUri[2] !== "string" 193 + ) { 194 + c.json( 195 + { 196 + error: "InvalidRequest", 197 + message: "Error: A queried URI is not a proper clip", 198 + }, 199 + 400, 200 + ); 201 + } else { 202 + splitUriObject = { 203 + did: splitUri[0], 204 + collection: splitUri[1], 205 + recordKey: splitUri[2], 206 + }; 207 + } 208 + 209 + const clipView = await createClipView(splitUriObject); 210 + 211 + if (!is(SocialClipprFeedDefs.clipViewSchema, value)) { 212 + c.json(clipView, 400); 213 + } 214 + 215 + parsedUriArray.push(clipView); 216 + } 217 + 218 + if (parsedUriArray.length === 0) { 219 + return c.json( 220 + { 221 + error: "InvalidRequest", 222 + message: "No queried URIs exist", 223 + } as ErrorResponse, 224 + 400, 225 + ); 226 + } 227 + 228 + return c.json(parsedUriArray, 200); 229 + }); 230 + 231 + app.get("/_health", async (c) => { 232 + return c.json({ 233 + version: process.env.npm_package_version, 234 + }); 235 + }); 236 + 237 + export default app;
+6
backend/src/server.ts
··· 6 6 7 7 import { Hono } from "hono"; 8 8 import misc from "./routes/misc.js"; 9 + import xrpc from "./routes/xrpc.js"; 9 10 import Logger from "./logger.js"; 10 11 import { logger } from "hono/logger"; 12 + import openapi from "./routes/openapi.js"; 13 + import { cors } from "hono/cors"; 11 14 12 15 export function winstonLogger(message: string, ...rest: unknown[]) { 13 16 Logger.http(message, ...rest); ··· 15 18 16 19 const app = new Hono(); 17 20 app.use(logger(winstonLogger)); 21 + app.use(cors()); 18 22 19 23 // Link all routes up 20 24 app.route("/", misc); 25 + app.route("/", openapi); 26 + app.route("/xrpc", xrpc); 21 27 22 28 export default app;
+1228
backend/static/api.json
··· 1 + { 2 + "openapi": "3.1.1", 3 + "info": { 4 + "title": "Clippr AppView API", 5 + "version": "1.0.1", 6 + "description": "API reference documentation for Clippr's backend.", 7 + "license": { 8 + "name": "GNU Affero General Public License v3.0 only", 9 + "identifier": "AGPL-3.0-only" 10 + } 11 + }, 12 + "servers": [ 13 + { 14 + "url": "http://localhost:9090", 15 + "description": "Development server" 16 + }, 17 + { 18 + "url": "https://api.clippr.social", 19 + "description": "Production server" 20 + } 21 + ], 22 + "tags": [ 23 + { 24 + "name": "Clips", 25 + "description": "API paths that relate to user bookmarks, or 'clips'." 26 + }, 27 + { 28 + "name": "Tags", 29 + "description": "API paths that relate to user tags." 30 + }, 31 + { 32 + "name": "Profile", 33 + "description": "API paths that relate to user profiles." 34 + }, 35 + { 36 + "name": "Misc", 37 + "description": "API paths that don't fit into any other category." 38 + } 39 + ], 40 + "paths": { 41 + "/xrpc/social.clippr.actor.getPreferences": { 42 + "get": { 43 + "tags": ["Profile"], 44 + "summary": "Get a user's preferences", 45 + "operationId": "social.clippr.actor.getPreferences", 46 + "description": "Get a user's private preferences. Requires authentication.", 47 + "security": [ 48 + { 49 + "Bearer": [] 50 + } 51 + ], 52 + "responses": { 53 + "200": { 54 + "description": "OK", 55 + "content": { 56 + "application/json": { 57 + "schema": { 58 + "$ref": "#/components/schemas/social.clippr.actor.defs.preferences" 59 + } 60 + } 61 + } 62 + }, 63 + "400": { 64 + "description": "Bad Request", 65 + "content": { 66 + "application/json": { 67 + "schema": { 68 + "type": "object", 69 + "properties": { 70 + "error": { 71 + "type": "string", 72 + "description": "A general error code", 73 + "oneOf": [ 74 + { 75 + "const": "InvalidRequest" 76 + }, 77 + { 78 + "const": "ExpiredToken" 79 + }, 80 + { 81 + "const": "InvalidToken" 82 + } 83 + ] 84 + }, 85 + "message": { 86 + "type": "string", 87 + "description": "A detailed description of the error" 88 + } 89 + } 90 + } 91 + } 92 + } 93 + }, 94 + "401": { 95 + "description": "Unauthorized", 96 + "content": { 97 + "application/json": { 98 + "schema": { 99 + "type": "object", 100 + "properties": { 101 + "error": { 102 + "type": "string", 103 + "description": "A general error code", 104 + "oneOf": [ 105 + { 106 + "const": "AuthMissing" 107 + } 108 + ] 109 + }, 110 + "message": { 111 + "type": "string", 112 + "description": "A detailed description of the error" 113 + } 114 + } 115 + } 116 + } 117 + } 118 + } 119 + } 120 + } 121 + }, 122 + "/xrpc/social.clippr.actor.getProfile": { 123 + "get": { 124 + "tags": ["Profile"], 125 + "summary": "Get a profile", 126 + "operationId": "social.clippr.actor.getProfile", 127 + "description": "Get a user's profile based on a given DID or handle.", 128 + "parameters": [ 129 + { 130 + "name": "actor", 131 + "in": "query", 132 + "description": "Handle or DID of account to fetch profile of", 133 + "required": true, 134 + "content": { 135 + "schema": { 136 + "type": "string", 137 + "description": "Handle or DID of account to fetch profile of", 138 + "format": "at-identifier" 139 + } 140 + }, 141 + "deprecated": false, 142 + "allowEmptyValue": false 143 + } 144 + ], 145 + "responses": { 146 + "200": { 147 + "description": "OK", 148 + "content": { 149 + "application/json": { 150 + "schema": { 151 + "type": "object", 152 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 153 + } 154 + } 155 + } 156 + }, 157 + "400": { 158 + "description": "Bad Request", 159 + "content": { 160 + "application/json": { 161 + "schema": { 162 + "type": "object", 163 + "properties": { 164 + "error": { 165 + "type": "string", 166 + "description": "A general error code", 167 + "oneOf": [ 168 + { 169 + "const": "InvalidRequest" 170 + } 171 + ] 172 + }, 173 + "message": { 174 + "type": "string", 175 + "description": "A detailed description of the error" 176 + } 177 + } 178 + } 179 + } 180 + } 181 + } 182 + } 183 + } 184 + }, 185 + "/xrpc/social.clippr.actor.putPreferences": { 186 + "post": { 187 + "tags": ["Profile"], 188 + "summary": "Set a user's preferences", 189 + "operationId": "social.clippr.actor.putPreferences", 190 + "description": "Sets the private preferences attached to the account. Requires authentication.", 191 + "security": [ 192 + { 193 + "Bearer": [] 194 + } 195 + ], 196 + "requestBody": { 197 + "required": true, 198 + "content": { 199 + "application/json": { 200 + "schema": { 201 + "type": "object", 202 + "properties": { 203 + "preferences": { 204 + "$ref": "#/components/schemas/social.clippr.actor.defs.preferences" 205 + } 206 + } 207 + } 208 + } 209 + } 210 + }, 211 + "responses": { 212 + "200": { 213 + "description": "OK" 214 + }, 215 + "400": { 216 + "description": "Bad Request", 217 + "content": { 218 + "application/json": { 219 + "schema": { 220 + "type": "object", 221 + "properties": { 222 + "error": { 223 + "type": "string", 224 + "oneOf": [ 225 + { 226 + "const": "InvalidRequest" 227 + }, 228 + { 229 + "const": "ExpiredToken" 230 + }, 231 + { 232 + "const": "InvalidToken" 233 + } 234 + ], 235 + "description": "A general error code" 236 + }, 237 + "message": { 238 + "type": "string", 239 + "description": "A detailed description of the error" 240 + } 241 + } 242 + } 243 + } 244 + } 245 + }, 246 + "401": { 247 + "description": "Unauthorized", 248 + "content": { 249 + "application/json": { 250 + "schema": { 251 + "type": "object", 252 + "properties": { 253 + "error": { 254 + "type": "string", 255 + "description": "A general error code", 256 + "oneOf": [ 257 + { 258 + "const": "AuthMissing" 259 + } 260 + ] 261 + }, 262 + "message": { 263 + "type": "string", 264 + "description": "A detailed description of the error" 265 + } 266 + } 267 + } 268 + } 269 + } 270 + } 271 + } 272 + } 273 + }, 274 + "/xrpc/social.clippr.actor.searchClips": { 275 + "get": { 276 + "tags": ["Clips"], 277 + "summary": "Search clips", 278 + "operationId": "social.clippr.actor.searchClips", 279 + "description": "Find clips matching search criteria.", 280 + "parameters": [ 281 + { 282 + "name": "q", 283 + "in": "query", 284 + "description": "Search query string", 285 + "required": true, 286 + "schema": { 287 + "type": "string", 288 + "description": "Search query string" 289 + } 290 + }, 291 + { 292 + "name": "limit", 293 + "in": "query", 294 + "description": "How many clips to return in the query output", 295 + "required": false, 296 + "schema": { 297 + "type": "integer", 298 + "minimum": 1, 299 + "maximum": 100, 300 + "default": 25 301 + } 302 + }, 303 + { 304 + "name": "actor", 305 + "in": "query", 306 + "description": "An actor to filter results to", 307 + "required": false, 308 + "schema": { 309 + "type": "string", 310 + "description": "An actor to filter results to", 311 + "format": "at-identifier" 312 + } 313 + }, 314 + { 315 + "name": "cursor", 316 + "in": "query", 317 + "description": "A parameter to paginate results", 318 + "required": false, 319 + "schema": { 320 + "type": "string", 321 + "description": "A parameter to paginate results" 322 + } 323 + } 324 + ], 325 + "responses": { 326 + "200": { 327 + "description": "OK", 328 + "content": { 329 + "application/json": { 330 + "schema": { 331 + "type": "object", 332 + "properties": { 333 + "cursor": { 334 + "type": "string", 335 + "description": "A parameter to paginate results" 336 + }, 337 + "clips": { 338 + "type": "array", 339 + "items": { 340 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 341 + } 342 + } 343 + } 344 + } 345 + } 346 + } 347 + }, 348 + "400": { 349 + "description": "Bad Request", 350 + "content": { 351 + "application/json": { 352 + "schema": { 353 + "type": "object", 354 + "properties": { 355 + "error": { 356 + "type": "string", 357 + "description": "A general error code", 358 + "oneOf": [ 359 + { 360 + "const": "InvalidRequest" 361 + } 362 + ] 363 + }, 364 + "message": { 365 + "type": "string", 366 + "description": "A detailed description of the error" 367 + } 368 + } 369 + } 370 + } 371 + } 372 + } 373 + } 374 + } 375 + }, 376 + "/xrpc/social.clippr.actor.searchProfiles": { 377 + "get": { 378 + "tags": ["Profile"], 379 + "summary": "Search profiles", 380 + "operationId": "social.clippr.actor.searchProfiles", 381 + "description": "Find profiles matching search criteria.", 382 + "parameters": [ 383 + { 384 + "name": "q", 385 + "in": "query", 386 + "description": "Search query string", 387 + "required": false, 388 + "schema": { 389 + "type": "string", 390 + "description": "Search query string" 391 + } 392 + }, 393 + { 394 + "name": "limit", 395 + "in": "query", 396 + "description": "The number of profiles to be returned in the query", 397 + "required": false, 398 + "schema": { 399 + "type": "integer", 400 + "minimum": 1, 401 + "maximum": 100, 402 + "default": 25 403 + } 404 + }, 405 + { 406 + "name": "cursor", 407 + "in": "query", 408 + "description": "A parameter used for pagination", 409 + "required": false, 410 + "schema": { 411 + "type": "string", 412 + "description": "A parameter used for pagination" 413 + } 414 + } 415 + ], 416 + "responses": { 417 + "200": { 418 + "description": "OK", 419 + "content": { 420 + "application/json": { 421 + "schema": { 422 + "type": "object", 423 + "properties": { 424 + "cursor": { 425 + "type": "string", 426 + "description": "A parameter used for pagination" 427 + }, 428 + "actors": { 429 + "type": "array", 430 + "items": { 431 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 432 + } 433 + } 434 + } 435 + } 436 + } 437 + } 438 + }, 439 + "400": { 440 + "description": "Bad Request", 441 + "content": { 442 + "application/json": { 443 + "schema": { 444 + "type": "object", 445 + "properties": { 446 + "error": { 447 + "type": "string", 448 + "description": "A general error code", 449 + "oneOf": [ 450 + { 451 + "const": "InvalidRequest" 452 + } 453 + ] 454 + }, 455 + "message": { 456 + "type": "string", 457 + "description": "A detailed description of the error" 458 + } 459 + } 460 + } 461 + } 462 + } 463 + } 464 + } 465 + } 466 + }, 467 + "/xrpc/social.clippr.actor.searchTags": { 468 + "get": { 469 + "tags": ["Tags"], 470 + "summary": "Search tags", 471 + "operationId": "social.clippr.actor.searchTags", 472 + "description": "Find tags matching search criteria.", 473 + "parameters": [ 474 + { 475 + "name": "q", 476 + "in": "query", 477 + "description": "Search query string", 478 + "required": true, 479 + "schema": { 480 + "type": "string", 481 + "description": "Search query string" 482 + } 483 + }, 484 + { 485 + "name": "limit", 486 + "in": "query", 487 + "description": "How many tags to return in the query output", 488 + "required": false, 489 + "schema": { 490 + "type": "integer", 491 + "minimum": 1, 492 + "maximum": 100, 493 + "default": 25 494 + } 495 + }, 496 + { 497 + "name": "actor", 498 + "in": "query", 499 + "description": "An actor to filter results to", 500 + "required": false, 501 + "schema": { 502 + "type": "string", 503 + "description": "An actor to filter results to", 504 + "format": "at-identifier" 505 + } 506 + }, 507 + { 508 + "name": "cursor", 509 + "in": "query", 510 + "description": "A parameter to paginate results", 511 + "required": false, 512 + "schema": { 513 + "type": "string", 514 + "description": "A parameter to paginate results" 515 + } 516 + } 517 + ], 518 + "responses": { 519 + "200": { 520 + "description": "OK", 521 + "content": { 522 + "application/json": { 523 + "schema": { 524 + "type": "object", 525 + "properties": { 526 + "cursor": { 527 + "type": "string", 528 + "description": "A parameter to paginate results" 529 + }, 530 + "tags": { 531 + "type": "array", 532 + "items": { 533 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 534 + } 535 + } 536 + } 537 + } 538 + } 539 + } 540 + }, 541 + "400": { 542 + "description": "Bad Request", 543 + "content": { 544 + "application/json": { 545 + "schema": { 546 + "type": "object", 547 + "properties": { 548 + "error": { 549 + "type": "string", 550 + "description": "A general error code", 551 + "oneOf": [ 552 + { 553 + "const": "InvalidRequest" 554 + } 555 + ] 556 + }, 557 + "message": { 558 + "type": "string", 559 + "description": "A detailed description of the error" 560 + } 561 + } 562 + } 563 + } 564 + } 565 + } 566 + } 567 + } 568 + }, 569 + "/xrpc/social.clippr.feed.getClips": { 570 + "get": { 571 + "tags": ["Clips"], 572 + "summary": "Get clips", 573 + "operationId": "social.clippr.feed.getClips", 574 + "description": "Get the hydrated views of a list of clips from their AT URIs.", 575 + "parameters": [ 576 + { 577 + "name": "uris", 578 + "in": "query", 579 + "description": "List of tag AT-URIs to return hydrated views for", 580 + "required": true, 581 + "schema": { 582 + "type": "array", 583 + "items": { 584 + "type": "string", 585 + "format": "at-uri" 586 + }, 587 + "maxItems": 25 588 + } 589 + } 590 + ], 591 + "responses": { 592 + "200": { 593 + "description": "OK", 594 + "content": { 595 + "application/json": { 596 + "schema": { 597 + "type": "array", 598 + "items": { 599 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 600 + } 601 + } 602 + } 603 + } 604 + }, 605 + "400": { 606 + "description": "Bad Request", 607 + "content": { 608 + "application/json": { 609 + "schema": { 610 + "type": "object", 611 + "properties": { 612 + "error": { 613 + "type": "string", 614 + "description": "A general error code", 615 + "oneOf": [ 616 + { 617 + "const": "InvalidRequest" 618 + } 619 + ] 620 + }, 621 + "message": { 622 + "type": "string", 623 + "description": "A detailed description of the error" 624 + } 625 + } 626 + } 627 + } 628 + } 629 + } 630 + } 631 + } 632 + }, 633 + "/xrpc/social.clippr.feed.getTags": { 634 + "get": { 635 + "tags": ["Tags"], 636 + "summary": "Get tags", 637 + "operationId": "social.clippr.feed.getTags", 638 + "description": "Get a the hydrated views of a list of tags from their AT URIs.", 639 + "parameters": [ 640 + { 641 + "name": "uris", 642 + "in": "query", 643 + "description": "List of tag AT-URIs to return hydrated views for", 644 + "required": true, 645 + "schema": { 646 + "type": "array", 647 + "items": { 648 + "type": "string", 649 + "format": "at-uri" 650 + }, 651 + "maxItems": 25 652 + } 653 + } 654 + ], 655 + "responses": { 656 + "200": { 657 + "description": "OK", 658 + "content": { 659 + "application/json": { 660 + "schema": { 661 + "type": "array", 662 + "items": { 663 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 664 + } 665 + } 666 + } 667 + } 668 + }, 669 + "400": { 670 + "description": "Bad Request", 671 + "content": { 672 + "application/json": { 673 + "schema": { 674 + "type": "object", 675 + "properties": { 676 + "error": { 677 + "type": "string", 678 + "description": "A general error code", 679 + "oneOf": [ 680 + { 681 + "const": "InvalidRequest" 682 + } 683 + ] 684 + }, 685 + "message": { 686 + "type": "string", 687 + "description": "A detailed description of the error" 688 + } 689 + } 690 + } 691 + } 692 + } 693 + } 694 + } 695 + } 696 + }, 697 + "/xrpc/social.clippr.feed.getProfileClips": { 698 + "get": { 699 + "tags": ["Clips"], 700 + "summary": "Get a profile's clip feed", 701 + "operationId": "social.clippr.feed.getProfileClips", 702 + "description": "Get a view of a profile's reverse-chronological clips feed.", 703 + "parameters": [ 704 + { 705 + "name": "actor", 706 + "in": "query", 707 + "description": "An actor to get feed data from", 708 + "required": true, 709 + "schema": { 710 + "type": "string", 711 + "description": "An actor to get feed data from", 712 + "format": "at-identifier" 713 + } 714 + }, 715 + { 716 + "name": "limit", 717 + "in": "query", 718 + "description": "How many results to return with the query", 719 + "required": false, 720 + "schema": { 721 + "type": "integer", 722 + "minimum": 1, 723 + "maximum": 100, 724 + "default": 50 725 + } 726 + }, 727 + { 728 + "name": "cursor", 729 + "in": "query", 730 + "description": "A parameter to paginate results", 731 + "required": false, 732 + "schema": { 733 + "type": "string", 734 + "description": "A parameter to paginate results" 735 + } 736 + }, 737 + { 738 + "name": "filter", 739 + "in": "query", 740 + "description": "What types to include in response", 741 + "required": false, 742 + "schema": { 743 + "type": "string", 744 + "description": "What types of clips to include in response", 745 + "default": "all_clips", 746 + "enum": ["all_clips", "tagged_clips", "untagged_clips"] 747 + } 748 + } 749 + ], 750 + "responses": { 751 + "200": { 752 + "description": "OK", 753 + "content": { 754 + "application/json": { 755 + "schema": { 756 + "type": "object", 757 + "properties": { 758 + "cursor": { 759 + "type": "string" 760 + }, 761 + "feed": { 762 + "type": "array", 763 + "items": { 764 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 765 + } 766 + } 767 + } 768 + } 769 + } 770 + } 771 + }, 772 + "400": { 773 + "description": "Bad Request", 774 + "content": { 775 + "application/json": { 776 + "schema": { 777 + "type": "object", 778 + "properties": { 779 + "error": { 780 + "type": "string", 781 + "description": "A general error code", 782 + "oneOf": [ 783 + { 784 + "const": "InvalidRequest" 785 + } 786 + ] 787 + }, 788 + "message": { 789 + "type": "string", 790 + "description": "A detailed description of the error" 791 + } 792 + } 793 + } 794 + } 795 + } 796 + } 797 + } 798 + } 799 + }, 800 + "/xrpc/social.clippr.feed.getProfileTags": { 801 + "get": { 802 + "tags": ["Tags"], 803 + "summary": "Get a profile's tag feed", 804 + "operationId": "social.clippr.feed.getProfileTags", 805 + "description": "Get a view of a profile's reverse-chronological clips feed.", 806 + "parameters": [ 807 + { 808 + "name": "actor", 809 + "in": "query", 810 + "description": "An actor to get feed data from", 811 + "required": true, 812 + "schema": { 813 + "type": "string", 814 + "description": "An actor to get feed data from", 815 + "format": "at-identifier" 816 + } 817 + }, 818 + { 819 + "name": "limit", 820 + "in": "query", 821 + "description": "How many results to return with the query", 822 + "required": false, 823 + "schema": { 824 + "type": "integer", 825 + "minimum": 1, 826 + "maximum": 100, 827 + "default": 50 828 + } 829 + }, 830 + { 831 + "name": "cursor", 832 + "in": "query", 833 + "description": "A parameter to paginate results", 834 + "required": false, 835 + "schema": { 836 + "type": "string", 837 + "description": "A parameter to paginate results" 838 + } 839 + } 840 + ], 841 + "responses": { 842 + "200": { 843 + "description": "OK", 844 + "content": { 845 + "application/json": { 846 + "schema": { 847 + "type": "object", 848 + "properties": { 849 + "cursor": { 850 + "type": "string" 851 + }, 852 + "feed": { 853 + "type": "array", 854 + "items": { 855 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 856 + } 857 + } 858 + } 859 + } 860 + } 861 + } 862 + }, 863 + "400": { 864 + "description": "Bad Request", 865 + "content": { 866 + "application/json": { 867 + "schema": { 868 + "type": "object", 869 + "properties": { 870 + "error": { 871 + "type": "string", 872 + "description": "A general error code", 873 + "oneOf": [ 874 + { 875 + "const": "InvalidRequest" 876 + } 877 + ] 878 + }, 879 + "message": { 880 + "type": "string", 881 + "description": "A detailed description of the error" 882 + } 883 + } 884 + } 885 + } 886 + } 887 + } 888 + } 889 + } 890 + }, 891 + "/xrpc/social.clippr.feed.getTagList": { 892 + "get": { 893 + "tags": ["Tags"], 894 + "summary": "Get a profile's tag list", 895 + "operationId": "social.clippr.feed.getProfileTags", 896 + "description": "Get a profile's complete list of tags.", 897 + "parameters": [ 898 + { 899 + "name": "actor", 900 + "in": "query", 901 + "description": "An actor to fetch the tag list from", 902 + "required": false, 903 + "schema": { 904 + "type": "string", 905 + "description": "An actor to fetch the tag list from", 906 + "format": "at-identifier" 907 + } 908 + } 909 + ], 910 + "responses": { 911 + "200": { 912 + "description": "OK", 913 + "content": { 914 + "application/json": { 915 + "schema": { 916 + "type": "object", 917 + "properties": { 918 + "tags": { 919 + "type": "array", 920 + "items": { 921 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 922 + } 923 + } 924 + } 925 + } 926 + } 927 + } 928 + }, 929 + "400": { 930 + "description": "Bad Request", 931 + "content": { 932 + "application/json": { 933 + "schema": { 934 + "type": "object", 935 + "properties": { 936 + "error": { 937 + "type": "string", 938 + "description": "A general error code", 939 + "oneOf": [ 940 + { 941 + "error": "InvalidRequest" 942 + } 943 + ] 944 + }, 945 + "message": { 946 + "type": "string", 947 + "description": "A detailed description of the error" 948 + } 949 + } 950 + } 951 + } 952 + } 953 + } 954 + } 955 + } 956 + }, 957 + "/xrpc/_health": { 958 + "get": { 959 + "summary": "Health check", 960 + "description": "Check the health of the server. If it is functioning properly, you will receive the server's version number.", 961 + "responses": { 962 + "200": { 963 + "description": "OK", 964 + "content": { 965 + "application/json": { 966 + "schema": { 967 + "type": "object", 968 + "properties": { 969 + "version": { 970 + "type": "string", 971 + "description": "The version number of the AppView." 972 + } 973 + } 974 + } 975 + } 976 + } 977 + } 978 + }, 979 + "tags": ["Misc"] 980 + } 981 + } 982 + }, 983 + "components": { 984 + "schemas": { 985 + "com.atproto.repo.strongRef": { 986 + "type": "object", 987 + "required": ["uri", "cid"], 988 + "properties": { 989 + "uri": { 990 + "type": "string", 991 + "format": "at-uri" 992 + }, 993 + "cid": { 994 + "type": "string", 995 + "format": "cid" 996 + } 997 + } 998 + }, 999 + "social.clippr.actor.defs.profileView": { 1000 + "type": "object", 1001 + "description": "A view of an actor's profile", 1002 + "required": ["did", "handle", "displayName"], 1003 + "properties": { 1004 + "did": { 1005 + "type": "string", 1006 + "description": "The DID of the profile", 1007 + "format": "did" 1008 + }, 1009 + "handle": { 1010 + "type": "string", 1011 + "description": "The handle of the profile", 1012 + "format": "handle" 1013 + }, 1014 + "displayName": { 1015 + "type": "string", 1016 + "description": "The display name associated to the profile", 1017 + "maxLength": 64 1018 + }, 1019 + "description": { 1020 + "type": "string", 1021 + "description": "The biography associated to the profile", 1022 + "maxLength": 500 1023 + }, 1024 + "avatar": { 1025 + "type": "string", 1026 + "description": "A link to the profile's avatar", 1027 + "format": "uri" 1028 + }, 1029 + "createdAt": { 1030 + "type": "string", 1031 + "description": "When the profile record was first created", 1032 + "format": "date-time" 1033 + } 1034 + } 1035 + }, 1036 + "social.clippr.actor.defs.preferences": { 1037 + "type": "array", 1038 + "items": { 1039 + "oneOf": [ 1040 + { 1041 + "$ref": "#/components/schemas/social.clippr.actor.defs.publishingScopesPref" 1042 + } 1043 + ] 1044 + } 1045 + }, 1046 + "social.clippr.actor.defs.publishingScopesPref": { 1047 + "type": "object", 1048 + "description": "Preferences for a user's publishing scopes", 1049 + "required": ["defaultScope"], 1050 + "properties": { 1051 + "defaultScope": { 1052 + "type": "string", 1053 + "description": "What publishing scope to mark a clip as by default", 1054 + "enum": ["public", "unlisted"] 1055 + } 1056 + } 1057 + }, 1058 + "social.clippr.feed.defs.clipView": { 1059 + "type": "object", 1060 + "description": "A view of a single bookmark (or 'clip')", 1061 + "required": ["uri", "cid", "author", "record", "indexedAt"], 1062 + "properties": { 1063 + "uri": { 1064 + "type": "string", 1065 + "description": "The AT-URI of the clip", 1066 + "format": "at-uri" 1067 + }, 1068 + "cid": { 1069 + "type": "string", 1070 + "description": "The CID of the clip", 1071 + "format": "cid" 1072 + }, 1073 + "author": { 1074 + "description": "A reference to the actor's profile", 1075 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 1076 + }, 1077 + "record": { 1078 + "type": "object", 1079 + "description": "The raw record of the clip" 1080 + }, 1081 + "indexedAt": { 1082 + "type": "string", 1083 + "description": "The time in which the clip's record was indexed by the AppView", 1084 + "format": "date-time" 1085 + } 1086 + } 1087 + }, 1088 + "social.clippr.feed.defs.tagView": { 1089 + "type": "object", 1090 + "description": "A view of a single tag", 1091 + "required": ["uri", "cid", "author", "record", "indexedAt"], 1092 + "properties": { 1093 + "uri": { 1094 + "type": "string", 1095 + "description": "The AT-URI to the tag", 1096 + "format": "at-uri" 1097 + }, 1098 + "cid": { 1099 + "type": "string", 1100 + "description": "The CID of the tag", 1101 + "format": "cid" 1102 + }, 1103 + "author": { 1104 + "description": "A reference to the actor's profile", 1105 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 1106 + }, 1107 + "record": { 1108 + "type": "object", 1109 + "description": "The raw record of the clip" 1110 + }, 1111 + "indexedAt": { 1112 + "type": "string", 1113 + "description": "The time in which the tag's record was indexed by the AppView", 1114 + "format": "date-time" 1115 + } 1116 + } 1117 + }, 1118 + "social.clippr.actor.profile": { 1119 + "type": "object", 1120 + "required": ["createdAt", "displayName"], 1121 + "properties": { 1122 + "displayName": { 1123 + "type": "string", 1124 + "description": "A display name to be shown on a profile", 1125 + "maxLength": 64 1126 + }, 1127 + "description": { 1128 + "type": "string", 1129 + "description": "Text for user to describe themselves", 1130 + "maxLength": 500 1131 + }, 1132 + "avatar": { 1133 + "type": "blob", 1134 + "maxSize": 1000000, 1135 + "description": "Image to show on user's profiles" 1136 + }, 1137 + "createdAt": { 1138 + "type": "string", 1139 + "description": "The creation date of the profile", 1140 + "format": "date-time" 1141 + } 1142 + } 1143 + }, 1144 + "social.clippr.feed.clip": { 1145 + "type": "object", 1146 + "required": ["url", "title", "description", "unlisted", "createdAt"], 1147 + "properties": { 1148 + "url": { 1149 + "type": "string", 1150 + "description": "The URL of the bookmark. Cannot be left empty or be modified after creation.", 1151 + "format": "uri", 1152 + "maxLength": 2000 1153 + }, 1154 + "title": { 1155 + "type": "string", 1156 + "description": "The title of the bookmark. If left empty, reuse the URL.", 1157 + "maxLength": 2048 1158 + }, 1159 + "description": { 1160 + "type": "string", 1161 + "description": "A description of the bookmark's content. This should be ripped from the URL metadata and be static for all records using the URL.", 1162 + "maxLength": 4096 1163 + }, 1164 + "notes": { 1165 + "type": "string", 1166 + "description": "User-written notes for the bookmark. Public and personal.", 1167 + "maxLength": 10000 1168 + }, 1169 + "tags": { 1170 + "type": "array", 1171 + "description": "An array of tags. A format of solely alphanumeric characters and dashes should be used.", 1172 + "items": { 1173 + "$ref": "#/components/schemas/com.atproto.repo.strongRef" 1174 + } 1175 + }, 1176 + "unlisted": { 1177 + "type": "boolean", 1178 + "description": "Whether the bookmark can be used for feed indexing and aggregation" 1179 + }, 1180 + "unread": { 1181 + "type": "boolean", 1182 + "description": "Whether the bookmark has been read by the user", 1183 + "default": true 1184 + }, 1185 + "languages": { 1186 + "type": "array", 1187 + "items": { 1188 + "type": "string", 1189 + "format": "language" 1190 + }, 1191 + "maxItems": 5 1192 + }, 1193 + "createdAt": { 1194 + "type": "string", 1195 + "description": "Client-declared timestamp when the bookmark is created", 1196 + "format": "date-time" 1197 + } 1198 + } 1199 + }, 1200 + "social.clippr.feed.tag": { 1201 + "type": "object", 1202 + "required": ["name", "createdAt"], 1203 + "properties": { 1204 + "name": { 1205 + "type": "string", 1206 + "description": "A de-duplicated string containing the name of the tag", 1207 + "maxLength": 64 1208 + }, 1209 + "color": { 1210 + "type": "string", 1211 + "description": "A hexadecimal color code", 1212 + "maxLength": 7 1213 + }, 1214 + "description": { 1215 + "type": "string", 1216 + "description": "A description of the tag for additional context", 1217 + "maxLength": 5000 1218 + }, 1219 + "createdAt": { 1220 + "type": "string", 1221 + "description": "A client-defined timestamp for the creation of the tag", 1222 + "format": "date-time" 1223 + } 1224 + } 1225 + } 1226 + } 1227 + } 1228 + }
+39 -29
backend/static/index.html
··· 6 6 7 7 <!doctype html> 8 8 <html lang="en"> 9 - <head> 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 - <title>clippr-BE</title> 15 - </head> 16 - <body> 17 - <div id="container"> 18 - <header> 19 - <p>clippr-BE</p> 20 - </header> 21 - <main> 22 - <p>welcome to the <b>clippr</b> appview!</p> 23 - <p>the API routes live under <code>/xrpc</code></p> 24 - <a href="http://tangled.sh/@hexmani.ac/clippr-ts">source code</a> 25 - </main> 26 - <footer> 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> 35 - </footer> 36 - </div> 37 - </body> 9 + <head> 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 + <title>clippr-BE</title> 15 + </head> 16 + <body> 17 + <div id="container"> 18 + <header> 19 + <p>clippr-BE</p> 20 + </header> 21 + <main> 22 + <p>Welcome to the <b>clippr</b> appview!</p> 23 + <h3>Links</h3> 24 + <ul> 25 + <li> 26 + <a href="/docs">API Documentation</a> 27 + </li> 28 + <li> 29 + <a href="/llms.txt">LLMs.txt</a> 30 + </li> 31 + <li> 32 + <a href="http://tangled.sh/@hexmani.ac/clippr">Source Code</a> 33 + </li> 34 + </ul> 35 + </main> 36 + <footer> 37 + <br /> 38 + <small> 39 + Copyright ยฉ clippr contributors 2025 | This software is released 40 + under the 41 + <a href="https://www.gnu.org/licenses/agpl-3.0.en.html#license-text" 42 + >AGPL</a 43 + > 44 + </small> 45 + </footer> 46 + </div> 47 + </body> 38 48 </html>
+21 -29
backend/tsconfig.json
··· 1 1 { 2 - "compilerOptions": { 3 - "esModuleInterop": true, 4 - "skipLibCheck": true, 5 - "target": "ESNext", 6 - "module": "NodeNext", 7 - "moduleResolution": "NodeNext", 8 - "allowJs": true, 9 - "resolveJsonModule": true, 10 - "moduleDetection": "force", 11 - "isolatedModules": true, 12 - "verbatimModuleSyntax": true, 13 - "types": [ 14 - "node", 15 - "@atcute/atproto", 16 - "@clipprjs/lexicons" 17 - ], 18 - "strict": true, 19 - "noUncheckedIndexedAccess": true, 20 - "noImplicitOverride": true, 21 - "jsx": "react-jsx", 22 - "jsxImportSource": "hono/jsx", 23 - "outDir": "dist/", 24 - "lib": [ 25 - "ESNext" 26 - ] 27 - }, 28 - "exclude": [ 29 - "node_modules" 30 - ] 2 + "compilerOptions": { 3 + "esModuleInterop": true, 4 + "skipLibCheck": true, 5 + "target": "ESNext", 6 + "module": "NodeNext", 7 + "moduleResolution": "NodeNext", 8 + "allowJs": true, 9 + "resolveJsonModule": true, 10 + "moduleDetection": "force", 11 + "isolatedModules": true, 12 + "verbatimModuleSyntax": true, 13 + "types": ["node", "@atcute/atproto", "@clipprjs/lexicons"], 14 + "strict": true, 15 + "noUncheckedIndexedAccess": true, 16 + "noImplicitOverride": true, 17 + "jsx": "react-jsx", 18 + "jsxImportSource": "hono/jsx", 19 + "outDir": "dist/", 20 + "lib": ["ESNext"], 21 + }, 22 + "exclude": ["node_modules", "dist/"], 31 23 }
+2 -23
frontend/.gitignore
··· 1 - # build output 1 + node_modules/ 2 2 dist/ 3 - # generated types 4 - .astro/ 5 - 6 - # dependencies 7 - node_modules/ 8 - 9 - # logs 10 - npm-debug.log* 11 - yarn-debug.log* 12 - yarn-error.log* 13 - pnpm-debug.log* 14 - 15 - 16 - # environment variables 17 - .env 18 - .env.production 19 - 20 - # macOS-specific files 21 - .DS_Store 22 - 23 - # jetbrains setting folder 24 - .idea/ 3 + did.json
+2
frontend/.prettierignore
··· 1 + pnpm-lock.yaml 2 + dist/*
+24
frontend/.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": ["tsconfig.json", "jsconfig.json"], 12 + "options": { 13 + "parser": "jsonc" 14 + } 15 + }, 16 + { 17 + "files": ["*.md"], 18 + "options": { 19 + "printWidth": 100, 20 + "proseWrap": "always" 21 + } 22 + } 23 + ] 24 + }
-4
frontend/.vscode/extensions.json
··· 1 - { 2 - "recommendations": ["astro-build.astro-vscode"], 3 - "unwantedRecommendations": [] 4 - }
-11
frontend/.vscode/launch.json
··· 1 - { 2 - "version": "0.2.0", 3 - "configurations": [ 4 - { 5 - "command": "./node_modules/.bin/astro dev", 6 - "name": "Development server", 7 - "request": "launch", 8 - "type": "node-terminal" 9 - } 10 - ] 11 - }
+14 -6
frontend/README.md
··· 1 - # clippr-fe 2 - Astro-based reference frontend for clippr 1 + # @clipprjs/client 3 2 4 - ## run 5 - ```bash 3 + This is a reference implementation for the Clippr frontend using Solid. 4 + 5 + ## development 6 + 7 + ```shell 6 8 pnpm install 9 + cp .env.example .env # Modify this if necessary 7 10 pnpm run dev 8 - # pnpm run build 9 - ``` 11 + ``` 12 + 13 + ## deployment 14 + 15 + ```shell 16 + pnpm run build 17 + ```
-11
frontend/astro.config.mts
··· 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 - import { defineConfig } from 'astro/config'; 9 - 10 - // https://astro.build/config 11 - export default defineConfig({});
+34
frontend/index.html
··· 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 + <!doctype html> 8 + <html lang="en"> 9 + <head> 10 + <meta charset="utf-8" /> 11 + <meta name="viewport" content="width=device-width, initial-scale=1" /> 12 + <link rel="icon" type="image/ico" href="src/assets/favicon.ico" /> 13 + <link rel="stylesheet" href="src/styles/index.css" /> 14 + <meta property="og:title" content="clippr" /> 15 + <meta property="og:type" content="website" /> 16 + <meta property="og:url" content="https://clippr.social" /> 17 + <meta 18 + property="og:description" 19 + content="A social bookmarking service for the AT Protocol." 20 + /> 21 + <meta 22 + property="description" 23 + content="A social bookmarking service for the AT Protocol." 24 + /> 25 + <title>clippr</title> 26 + <script src="src/index.tsx" type="module"></script> 27 + </head> 28 + <body id="root"> 29 + <noscript 30 + >You need to enable JavaScript to run this app. Yes, we know this is 31 + inconvenient.</noscript 32 + > 33 + </body> 34 + </html>
+30 -13
frontend/package.json
··· 1 1 { 2 - "name": "@clipprjs/client", 3 - "type": "module", 4 - "version": "0.1.0", 5 - "scripts": { 6 - "dev": "astro dev", 7 - "build": "astro build", 8 - "preview": "astro preview", 9 - "astro": "astro" 10 - }, 11 - "dependencies": { 12 - "astro": "^5.9.1" 13 - } 14 - } 2 + "name": "@clipprjs/client", 3 + "version": "0.1.0", 4 + "description": "Reference implementation frontend for Clippr", 5 + "type": "module", 6 + "scripts": { 7 + "start": "vite", 8 + "dev": "vite", 9 + "build": "vite build", 10 + "serve": "vite preview", 11 + "fmt": "pnpm exec prettier --write ." 12 + }, 13 + "license": "AGPL-3.0-only", 14 + "devDependencies": { 15 + "@types/node": "^24.3.0", 16 + "prettier": "^3.6.2", 17 + "solid-devtools": "^0.34.3", 18 + "typescript": "^5.9.2", 19 + "vite": "^6.3.5", 20 + "vite-plugin-solid": "^2.11.8" 21 + }, 22 + "dependencies": { 23 + "@atcute/client": "^4.0.3", 24 + "@atcute/identity-resolver": "^1.1.3", 25 + "@atcute/lexicons": "^1.1.0", 26 + "@atcute/oauth-browser-client": "^1.0.26", 27 + "@mary/exif-rm": "jsr:^0.2.2", 28 + "@solidjs/router": "^0.15.3", 29 + "solid-js": "^1.9.9" 30 + } 31 + }
+844 -2472
frontend/pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 - astro: 12 - specifier: ^5.9.1 13 - version: 5.9.1(@types/node@22.15.30)(rollup@4.42.0)(typescript@5.8.3) 11 + '@atcute/client': 12 + specifier: ^4.0.3 13 + version: 4.0.3 14 + '@atcute/identity-resolver': 15 + specifier: ^1.1.3 16 + version: 1.1.3(@atcute/identity@1.0.3) 17 + '@atcute/lexicons': 18 + specifier: ^1.1.0 19 + version: 1.1.0 20 + '@atcute/oauth-browser-client': 21 + specifier: ^1.0.26 22 + version: 1.0.26 23 + '@mary/exif-rm': 24 + specifier: jsr:^0.2.2 25 + version: '@jsr/mary__exif-rm@0.2.2' 26 + '@solidjs/router': 27 + specifier: ^0.15.3 28 + version: 0.15.3(solid-js@1.9.9) 29 + solid-js: 30 + specifier: ^1.9.9 31 + version: 1.9.9 32 + devDependencies: 33 + '@types/node': 34 + specifier: ^24.3.0 35 + version: 24.3.0 36 + prettier: 37 + specifier: ^3.6.2 38 + version: 3.6.2 39 + solid-devtools: 40 + specifier: ^0.34.3 41 + version: 0.34.3(solid-js@1.9.9)(vite@6.3.5(@types/node@24.3.0)) 42 + typescript: 43 + specifier: ^5.9.2 44 + version: 5.9.2 45 + vite: 46 + specifier: ^6.3.5 47 + version: 6.3.5(@types/node@24.3.0) 48 + vite-plugin-solid: 49 + specifier: ^2.11.8 50 + version: 2.11.8(solid-js@1.9.9)(vite@6.3.5(@types/node@24.3.0)) 14 51 15 52 packages: 16 53 17 - '@astrojs/compiler@2.12.1': 18 - resolution: {integrity: sha512-WDSyVIiz7sNcJcCJxJFITu6XjfGhJ50Z0auyaWsrM+xb07IlhBLFtQuDkNy0caVHWNcKTM2LISAaHhgkRqGAVg==} 54 + '@ampproject/remapping@2.3.0': 55 + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 56 + engines: {node: '>=6.0.0'} 19 57 20 - '@astrojs/internal-helpers@0.6.1': 21 - resolution: {integrity: sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==} 58 + '@atcute/client@4.0.3': 59 + resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 22 60 23 - '@astrojs/markdown-remark@6.3.2': 24 - resolution: {integrity: sha512-bO35JbWpVvyKRl7cmSJD822e8YA8ThR/YbUsciWNA7yTcqpIAL2hJDToWP5KcZBWxGT6IOdOkHSXARSNZc4l/Q==} 61 + '@atcute/identity-resolver@1.1.3': 62 + resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==} 63 + peerDependencies: 64 + '@atcute/identity': ^1.0.0 25 65 26 - '@astrojs/prism@3.3.0': 27 - resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} 28 - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} 66 + '@atcute/identity@1.0.3': 67 + resolution: {integrity: sha512-mNMxbKHFGys03A8JXKk0KfMBzdd0vrYMzZZWjpw1nYTs0+ea6bo5S1hwqVUZxHdo1gFHSe/t63jxQIF4yL9aKw==} 29 68 30 - '@astrojs/telemetry@3.3.0': 31 - resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} 32 - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} 69 + '@atcute/lexicons@1.1.0': 70 + resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 71 + 72 + '@atcute/multibase@1.1.4': 73 + resolution: {integrity: sha512-NUf5AeeSOmuZHGU+4GAaMtISJoG+ZHtW/vUVA4lK/YDt/7LODAW0Fd0NNIIUPVUoW0xJS6zSEIWvwLLuxmEHhA==} 74 + 75 + '@atcute/oauth-browser-client@1.0.26': 76 + resolution: {integrity: sha512-z8VUmwRO1sFu5Dq1qYQOQLenkTSNaOyzlUZhVwFR41ru+AP84MS5UHHW/NsdC1xJAq1v6mlLySJ+pjxdDW8IYA==} 77 + 78 + '@atcute/uint8array@1.0.3': 79 + resolution: {integrity: sha512-M/K+ihiVW8Pl2PFLzaC4E3l4JaZ1IH05Q0AbPWUC4cVHnd/gZ/1kAF5ngdtGvJeDMirHZ2VAy7OmAsPwR/2nlA==} 80 + 81 + '@atcute/util-fetch@1.0.1': 82 + resolution: {integrity: sha512-Clc0E/5ufyGBVfYBUwWNlHONlZCoblSr4Ho50l1LhmRPGB1Wu/AQ9Sz+rsBg7fdaW/auve8ulmwhRhnX2cGRow==} 83 + 84 + '@babel/code-frame@7.27.1': 85 + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 86 + engines: {node: '>=6.9.0'} 87 + 88 + '@babel/compat-data@7.28.0': 89 + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 90 + engines: {node: '>=6.9.0'} 91 + 92 + '@babel/core@7.28.3': 93 + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} 94 + engines: {node: '>=6.9.0'} 95 + 96 + '@babel/generator@7.28.3': 97 + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} 98 + engines: {node: '>=6.9.0'} 99 + 100 + '@babel/helper-compilation-targets@7.27.2': 101 + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 102 + engines: {node: '>=6.9.0'} 103 + 104 + '@babel/helper-globals@7.28.0': 105 + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 106 + engines: {node: '>=6.9.0'} 107 + 108 + '@babel/helper-module-imports@7.18.6': 109 + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 110 + engines: {node: '>=6.9.0'} 111 + 112 + '@babel/helper-module-imports@7.27.1': 113 + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 114 + engines: {node: '>=6.9.0'} 115 + 116 + '@babel/helper-module-transforms@7.28.3': 117 + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 118 + engines: {node: '>=6.9.0'} 119 + peerDependencies: 120 + '@babel/core': ^7.0.0 121 + 122 + '@babel/helper-plugin-utils@7.27.1': 123 + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 124 + engines: {node: '>=6.9.0'} 33 125 34 126 '@babel/helper-string-parser@7.27.1': 35 127 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} ··· 39 131 resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 40 132 engines: {node: '>=6.9.0'} 41 133 42 - '@babel/parser@7.27.5': 43 - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} 134 + '@babel/helper-validator-option@7.27.1': 135 + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 136 + engines: {node: '>=6.9.0'} 137 + 138 + '@babel/helpers@7.28.3': 139 + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} 140 + engines: {node: '>=6.9.0'} 141 + 142 + '@babel/parser@7.28.3': 143 + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} 44 144 engines: {node: '>=6.0.0'} 45 145 hasBin: true 46 146 47 - '@babel/types@7.27.6': 48 - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} 147 + '@babel/plugin-syntax-jsx@7.27.1': 148 + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} 49 149 engines: {node: '>=6.9.0'} 150 + peerDependencies: 151 + '@babel/core': ^7.0.0-0 50 152 51 - '@capsizecss/unpack@2.4.0': 52 - resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} 153 + '@babel/plugin-syntax-typescript@7.27.1': 154 + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} 155 + engines: {node: '>=6.9.0'} 156 + peerDependencies: 157 + '@babel/core': ^7.0.0-0 53 158 54 - '@emnapi/runtime@1.4.3': 55 - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} 159 + '@babel/template@7.27.2': 160 + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 161 + engines: {node: '>=6.9.0'} 56 162 57 - '@esbuild/aix-ppc64@0.25.5': 58 - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 163 + '@babel/traverse@7.28.3': 164 + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} 165 + engines: {node: '>=6.9.0'} 166 + 167 + '@babel/types@7.28.2': 168 + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 169 + engines: {node: '>=6.9.0'} 170 + 171 + '@badrap/valita@0.4.6': 172 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 173 + engines: {node: '>= 18'} 174 + 175 + '@esbuild/aix-ppc64@0.25.9': 176 + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} 59 177 engines: {node: '>=18'} 60 178 cpu: [ppc64] 61 179 os: [aix] 62 180 63 - '@esbuild/android-arm64@0.25.5': 64 - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 181 + '@esbuild/android-arm64@0.25.9': 182 + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} 65 183 engines: {node: '>=18'} 66 184 cpu: [arm64] 67 185 os: [android] 68 186 69 - '@esbuild/android-arm@0.25.5': 70 - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 187 + '@esbuild/android-arm@0.25.9': 188 + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} 71 189 engines: {node: '>=18'} 72 190 cpu: [arm] 73 191 os: [android] 74 192 75 - '@esbuild/android-x64@0.25.5': 76 - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 193 + '@esbuild/android-x64@0.25.9': 194 + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} 77 195 engines: {node: '>=18'} 78 196 cpu: [x64] 79 197 os: [android] 80 198 81 - '@esbuild/darwin-arm64@0.25.5': 82 - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 199 + '@esbuild/darwin-arm64@0.25.9': 200 + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} 83 201 engines: {node: '>=18'} 84 202 cpu: [arm64] 85 203 os: [darwin] 86 204 87 - '@esbuild/darwin-x64@0.25.5': 88 - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 205 + '@esbuild/darwin-x64@0.25.9': 206 + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} 89 207 engines: {node: '>=18'} 90 208 cpu: [x64] 91 209 os: [darwin] 92 210 93 - '@esbuild/freebsd-arm64@0.25.5': 94 - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 211 + '@esbuild/freebsd-arm64@0.25.9': 212 + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} 95 213 engines: {node: '>=18'} 96 214 cpu: [arm64] 97 215 os: [freebsd] 98 216 99 - '@esbuild/freebsd-x64@0.25.5': 100 - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 217 + '@esbuild/freebsd-x64@0.25.9': 218 + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} 101 219 engines: {node: '>=18'} 102 220 cpu: [x64] 103 221 os: [freebsd] 104 222 105 - '@esbuild/linux-arm64@0.25.5': 106 - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 223 + '@esbuild/linux-arm64@0.25.9': 224 + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} 107 225 engines: {node: '>=18'} 108 226 cpu: [arm64] 109 227 os: [linux] 110 228 111 - '@esbuild/linux-arm@0.25.5': 112 - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 229 + '@esbuild/linux-arm@0.25.9': 230 + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} 113 231 engines: {node: '>=18'} 114 232 cpu: [arm] 115 233 os: [linux] 116 234 117 - '@esbuild/linux-ia32@0.25.5': 118 - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 235 + '@esbuild/linux-ia32@0.25.9': 236 + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} 119 237 engines: {node: '>=18'} 120 238 cpu: [ia32] 121 239 os: [linux] 122 240 123 - '@esbuild/linux-loong64@0.25.5': 124 - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 241 + '@esbuild/linux-loong64@0.25.9': 242 + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} 125 243 engines: {node: '>=18'} 126 244 cpu: [loong64] 127 245 os: [linux] 128 246 129 - '@esbuild/linux-mips64el@0.25.5': 130 - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 247 + '@esbuild/linux-mips64el@0.25.9': 248 + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} 131 249 engines: {node: '>=18'} 132 250 cpu: [mips64el] 133 251 os: [linux] 134 252 135 - '@esbuild/linux-ppc64@0.25.5': 136 - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 253 + '@esbuild/linux-ppc64@0.25.9': 254 + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} 137 255 engines: {node: '>=18'} 138 256 cpu: [ppc64] 139 257 os: [linux] 140 258 141 - '@esbuild/linux-riscv64@0.25.5': 142 - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 259 + '@esbuild/linux-riscv64@0.25.9': 260 + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} 143 261 engines: {node: '>=18'} 144 262 cpu: [riscv64] 145 263 os: [linux] 146 264 147 - '@esbuild/linux-s390x@0.25.5': 148 - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 265 + '@esbuild/linux-s390x@0.25.9': 266 + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} 149 267 engines: {node: '>=18'} 150 268 cpu: [s390x] 151 269 os: [linux] 152 270 153 - '@esbuild/linux-x64@0.25.5': 154 - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 271 + '@esbuild/linux-x64@0.25.9': 272 + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} 155 273 engines: {node: '>=18'} 156 274 cpu: [x64] 157 275 os: [linux] 158 276 159 - '@esbuild/netbsd-arm64@0.25.5': 160 - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 277 + '@esbuild/netbsd-arm64@0.25.9': 278 + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} 161 279 engines: {node: '>=18'} 162 280 cpu: [arm64] 163 281 os: [netbsd] 164 282 165 - '@esbuild/netbsd-x64@0.25.5': 166 - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 283 + '@esbuild/netbsd-x64@0.25.9': 284 + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} 167 285 engines: {node: '>=18'} 168 286 cpu: [x64] 169 287 os: [netbsd] 170 288 171 - '@esbuild/openbsd-arm64@0.25.5': 172 - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 289 + '@esbuild/openbsd-arm64@0.25.9': 290 + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} 173 291 engines: {node: '>=18'} 174 292 cpu: [arm64] 175 293 os: [openbsd] 176 294 177 - '@esbuild/openbsd-x64@0.25.5': 178 - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 295 + '@esbuild/openbsd-x64@0.25.9': 296 + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} 179 297 engines: {node: '>=18'} 180 298 cpu: [x64] 181 299 os: [openbsd] 182 300 183 - '@esbuild/sunos-x64@0.25.5': 184 - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 301 + '@esbuild/openharmony-arm64@0.25.9': 302 + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} 303 + engines: {node: '>=18'} 304 + cpu: [arm64] 305 + os: [openharmony] 306 + 307 + '@esbuild/sunos-x64@0.25.9': 308 + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} 185 309 engines: {node: '>=18'} 186 310 cpu: [x64] 187 311 os: [sunos] 188 312 189 - '@esbuild/win32-arm64@0.25.5': 190 - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 313 + '@esbuild/win32-arm64@0.25.9': 314 + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} 191 315 engines: {node: '>=18'} 192 316 cpu: [arm64] 193 317 os: [win32] 194 318 195 - '@esbuild/win32-ia32@0.25.5': 196 - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 319 + '@esbuild/win32-ia32@0.25.9': 320 + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} 197 321 engines: {node: '>=18'} 198 322 cpu: [ia32] 199 323 os: [win32] 200 324 201 - '@esbuild/win32-x64@0.25.5': 202 - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 325 + '@esbuild/win32-x64@0.25.9': 326 + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} 203 327 engines: {node: '>=18'} 204 328 cpu: [x64] 205 329 os: [win32] 206 330 207 - '@img/sharp-darwin-arm64@0.33.5': 208 - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} 209 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 210 - cpu: [arm64] 211 - os: [darwin] 331 + '@jridgewell/gen-mapping@0.3.13': 332 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 212 333 213 - '@img/sharp-darwin-x64@0.33.5': 214 - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} 215 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 216 - cpu: [x64] 217 - os: [darwin] 334 + '@jridgewell/resolve-uri@3.1.2': 335 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 336 + engines: {node: '>=6.0.0'} 218 337 219 - '@img/sharp-libvips-darwin-arm64@1.0.4': 220 - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} 221 - cpu: [arm64] 222 - os: [darwin] 338 + '@jridgewell/sourcemap-codec@1.5.5': 339 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 223 340 224 - '@img/sharp-libvips-darwin-x64@1.0.4': 225 - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} 226 - cpu: [x64] 227 - os: [darwin] 341 + '@jridgewell/trace-mapping@0.3.30': 342 + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} 228 343 229 - '@img/sharp-libvips-linux-arm64@1.0.4': 230 - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} 231 - cpu: [arm64] 232 - os: [linux] 344 + '@jsr/mary__exif-rm@0.2.2': 345 + resolution: {integrity: sha512-+ZpLaC+1CyqWhH608Sqd6/yTG0pOlokn2tCXha7s1SMQ+GLKo4Nn/PskTeeP9Pt+6gNYSu6ednoSlRvXb2ZGxg==, tarball: https://npm.jsr.io/~/11/@jsr/mary__exif-rm/0.2.2.tgz} 233 346 234 - '@img/sharp-libvips-linux-arm@1.0.5': 235 - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} 236 - cpu: [arm] 237 - os: [linux] 347 + '@nothing-but/utils@0.17.0': 348 + resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} 238 349 239 - '@img/sharp-libvips-linux-s390x@1.0.4': 240 - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} 241 - cpu: [s390x] 242 - os: [linux] 243 - 244 - '@img/sharp-libvips-linux-x64@1.0.4': 245 - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} 246 - cpu: [x64] 247 - os: [linux] 248 - 249 - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': 250 - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} 251 - cpu: [arm64] 252 - os: [linux] 253 - 254 - '@img/sharp-libvips-linuxmusl-x64@1.0.4': 255 - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} 256 - cpu: [x64] 257 - os: [linux] 258 - 259 - '@img/sharp-linux-arm64@0.33.5': 260 - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} 261 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 262 - cpu: [arm64] 263 - os: [linux] 264 - 265 - '@img/sharp-linux-arm@0.33.5': 266 - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} 267 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 268 - cpu: [arm] 269 - os: [linux] 270 - 271 - '@img/sharp-linux-s390x@0.33.5': 272 - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} 273 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 274 - cpu: [s390x] 275 - os: [linux] 276 - 277 - '@img/sharp-linux-x64@0.33.5': 278 - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} 279 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 280 - cpu: [x64] 281 - os: [linux] 282 - 283 - '@img/sharp-linuxmusl-arm64@0.33.5': 284 - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} 285 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 286 - cpu: [arm64] 287 - os: [linux] 288 - 289 - '@img/sharp-linuxmusl-x64@0.33.5': 290 - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} 291 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 292 - cpu: [x64] 293 - os: [linux] 294 - 295 - '@img/sharp-wasm32@0.33.5': 296 - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} 297 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 298 - cpu: [wasm32] 299 - 300 - '@img/sharp-win32-ia32@0.33.5': 301 - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} 302 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 303 - cpu: [ia32] 304 - os: [win32] 305 - 306 - '@img/sharp-win32-x64@0.33.5': 307 - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} 308 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 309 - cpu: [x64] 310 - os: [win32] 311 - 312 - '@jridgewell/sourcemap-codec@1.5.0': 313 - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 314 - 315 - '@oslojs/encoding@1.1.0': 316 - resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} 317 - 318 - '@rollup/pluginutils@5.1.4': 319 - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 320 - engines: {node: '>=14.0.0'} 321 - peerDependencies: 322 - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 323 - peerDependenciesMeta: 324 - rollup: 325 - optional: true 326 - 327 - '@rollup/rollup-android-arm-eabi@4.42.0': 328 - resolution: {integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==} 350 + '@rollup/rollup-android-arm-eabi@4.46.3': 351 + resolution: {integrity: sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==} 329 352 cpu: [arm] 330 353 os: [android] 331 354 332 - '@rollup/rollup-android-arm64@4.42.0': 333 - resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} 355 + '@rollup/rollup-android-arm64@4.46.3': 356 + resolution: {integrity: sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==} 334 357 cpu: [arm64] 335 358 os: [android] 336 359 337 - '@rollup/rollup-darwin-arm64@4.42.0': 338 - resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} 360 + '@rollup/rollup-darwin-arm64@4.46.3': 361 + resolution: {integrity: sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==} 339 362 cpu: [arm64] 340 363 os: [darwin] 341 364 342 - '@rollup/rollup-darwin-x64@4.42.0': 343 - resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} 365 + '@rollup/rollup-darwin-x64@4.46.3': 366 + resolution: {integrity: sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==} 344 367 cpu: [x64] 345 368 os: [darwin] 346 369 347 - '@rollup/rollup-freebsd-arm64@4.42.0': 348 - resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} 370 + '@rollup/rollup-freebsd-arm64@4.46.3': 371 + resolution: {integrity: sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==} 349 372 cpu: [arm64] 350 373 os: [freebsd] 351 374 352 - '@rollup/rollup-freebsd-x64@4.42.0': 353 - resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} 375 + '@rollup/rollup-freebsd-x64@4.46.3': 376 + resolution: {integrity: sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==} 354 377 cpu: [x64] 355 378 os: [freebsd] 356 379 357 - '@rollup/rollup-linux-arm-gnueabihf@4.42.0': 358 - resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} 380 + '@rollup/rollup-linux-arm-gnueabihf@4.46.3': 381 + resolution: {integrity: sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==} 359 382 cpu: [arm] 360 383 os: [linux] 361 384 362 - '@rollup/rollup-linux-arm-musleabihf@4.42.0': 363 - resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} 385 + '@rollup/rollup-linux-arm-musleabihf@4.46.3': 386 + resolution: {integrity: sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==} 364 387 cpu: [arm] 365 388 os: [linux] 366 389 367 - '@rollup/rollup-linux-arm64-gnu@4.42.0': 368 - resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} 390 + '@rollup/rollup-linux-arm64-gnu@4.46.3': 391 + resolution: {integrity: sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==} 369 392 cpu: [arm64] 370 393 os: [linux] 371 394 372 - '@rollup/rollup-linux-arm64-musl@4.42.0': 373 - resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} 395 + '@rollup/rollup-linux-arm64-musl@4.46.3': 396 + resolution: {integrity: sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==} 374 397 cpu: [arm64] 375 398 os: [linux] 376 399 377 - '@rollup/rollup-linux-loongarch64-gnu@4.42.0': 378 - resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} 400 + '@rollup/rollup-linux-loongarch64-gnu@4.46.3': 401 + resolution: {integrity: sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==} 379 402 cpu: [loong64] 380 403 os: [linux] 381 404 382 - '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': 383 - resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} 405 + '@rollup/rollup-linux-ppc64-gnu@4.46.3': 406 + resolution: {integrity: sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==} 384 407 cpu: [ppc64] 385 408 os: [linux] 386 409 387 - '@rollup/rollup-linux-riscv64-gnu@4.42.0': 388 - resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} 410 + '@rollup/rollup-linux-riscv64-gnu@4.46.3': 411 + resolution: {integrity: sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==} 389 412 cpu: [riscv64] 390 413 os: [linux] 391 414 392 - '@rollup/rollup-linux-riscv64-musl@4.42.0': 393 - resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} 415 + '@rollup/rollup-linux-riscv64-musl@4.46.3': 416 + resolution: {integrity: sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==} 394 417 cpu: [riscv64] 395 418 os: [linux] 396 419 397 - '@rollup/rollup-linux-s390x-gnu@4.42.0': 398 - resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} 420 + '@rollup/rollup-linux-s390x-gnu@4.46.3': 421 + resolution: {integrity: sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==} 399 422 cpu: [s390x] 400 423 os: [linux] 401 424 402 - '@rollup/rollup-linux-x64-gnu@4.42.0': 403 - resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} 425 + '@rollup/rollup-linux-x64-gnu@4.46.3': 426 + resolution: {integrity: sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==} 404 427 cpu: [x64] 405 428 os: [linux] 406 429 407 - '@rollup/rollup-linux-x64-musl@4.42.0': 408 - resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} 430 + '@rollup/rollup-linux-x64-musl@4.46.3': 431 + resolution: {integrity: sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==} 409 432 cpu: [x64] 410 433 os: [linux] 411 434 412 - '@rollup/rollup-win32-arm64-msvc@4.42.0': 413 - resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} 435 + '@rollup/rollup-win32-arm64-msvc@4.46.3': 436 + resolution: {integrity: sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==} 414 437 cpu: [arm64] 415 438 os: [win32] 416 439 417 - '@rollup/rollup-win32-ia32-msvc@4.42.0': 418 - resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} 440 + '@rollup/rollup-win32-ia32-msvc@4.46.3': 441 + resolution: {integrity: sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==} 419 442 cpu: [ia32] 420 443 os: [win32] 421 444 422 - '@rollup/rollup-win32-x64-msvc@4.42.0': 423 - resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} 445 + '@rollup/rollup-win32-x64-msvc@4.46.3': 446 + resolution: {integrity: sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==} 424 447 cpu: [x64] 425 448 os: [win32] 426 449 427 - '@shikijs/core@3.6.0': 428 - resolution: {integrity: sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==} 450 + '@solid-devtools/debugger@0.28.1': 451 + resolution: {integrity: sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg==} 452 + peerDependencies: 453 + solid-js: ^1.9.0 429 454 430 - '@shikijs/engine-javascript@3.6.0': 431 - resolution: {integrity: sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==} 455 + '@solid-devtools/shared@0.20.0': 456 + resolution: {integrity: sha512-o5TACmUOQsxpzpOKCjbQqGk8wL8PMi+frXG9WNu4Lh3PQVUB6hs95Kl/S8xc++zwcMguUKZJn8h5URUiMOca6Q==} 457 + peerDependencies: 458 + solid-js: ^1.9.0 432 459 433 - '@shikijs/engine-oniguruma@3.6.0': 434 - resolution: {integrity: sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==} 460 + '@solid-primitives/bounds@0.1.3': 461 + resolution: {integrity: sha512-UbiyKMdSPmtijcEDnYLQL3zzaejpwWDAJJ4Gt5P0hgVs6A72piov0GyNw7V2SroH7NZFwxlYS22YmOr8A5xc1Q==} 462 + peerDependencies: 463 + solid-js: ^1.6.12 435 464 436 - '@shikijs/langs@3.6.0': 437 - resolution: {integrity: sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==} 465 + '@solid-primitives/event-listener@2.4.3': 466 + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} 467 + peerDependencies: 468 + solid-js: ^1.6.12 438 469 439 - '@shikijs/themes@3.6.0': 440 - resolution: {integrity: sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==} 470 + '@solid-primitives/keyboard@1.3.3': 471 + resolution: {integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==} 472 + peerDependencies: 473 + solid-js: ^1.6.12 441 474 442 - '@shikijs/types@3.6.0': 443 - resolution: {integrity: sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==} 475 + '@solid-primitives/media@2.3.3': 476 + resolution: {integrity: sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA==} 477 + peerDependencies: 478 + solid-js: ^1.6.12 444 479 445 - '@shikijs/vscode-textmate@10.0.2': 446 - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} 480 + '@solid-primitives/refs@1.1.2': 481 + resolution: {integrity: sha512-K7tf2thy7L+YJjdqXspXOg5xvNEOH8tgEWsp0+1mQk3obHBRD6hEjYZk7p7FlJphSZImS35je3UfmWuD7MhDfg==} 482 + peerDependencies: 483 + solid-js: ^1.6.12 447 484 448 - '@swc/helpers@0.5.17': 449 - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} 485 + '@solid-primitives/resize-observer@2.1.3': 486 + resolution: {integrity: sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==} 487 + peerDependencies: 488 + solid-js: ^1.6.12 450 489 451 - '@types/debug@4.1.12': 452 - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 490 + '@solid-primitives/rootless@1.5.2': 491 + resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} 492 + peerDependencies: 493 + solid-js: ^1.6.12 453 494 454 - '@types/estree@1.0.7': 455 - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 495 + '@solid-primitives/scheduled@1.5.2': 496 + resolution: {integrity: sha512-/j2igE0xyNaHhj6kMfcUQn5rAVSTLbAX+CDEBm25hSNBmNiHLu2lM7Usj2kJJ5j36D67bE8wR1hBNA8hjtvsQA==} 497 + peerDependencies: 498 + solid-js: ^1.6.12 456 499 457 - '@types/estree@1.0.8': 458 - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 500 + '@solid-primitives/static-store@0.1.2': 501 + resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} 502 + peerDependencies: 503 + solid-js: ^1.6.12 459 504 460 - '@types/fontkit@2.0.8': 461 - resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==} 505 + '@solid-primitives/styles@0.1.2': 506 + resolution: {integrity: sha512-7iX5K+J5b1PRrbgw3Ki92uvU2LgQ0Kd/QMsrAZxDg5dpUBwMyTijZkA3bbs1ikZsT1oQhS41bTyKbjrXeU0Awg==} 507 + peerDependencies: 508 + solid-js: ^1.6.12 462 509 463 - '@types/hast@3.0.4': 464 - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 510 + '@solid-primitives/utils@6.3.2': 511 + resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} 512 + peerDependencies: 513 + solid-js: ^1.6.12 465 514 466 - '@types/mdast@4.0.4': 467 - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 515 + '@solidjs/router@0.15.3': 516 + resolution: {integrity: sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==} 517 + peerDependencies: 518 + solid-js: ^1.8.6 468 519 469 - '@types/ms@2.1.0': 470 - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 520 + '@types/babel__core@7.20.5': 521 + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 471 522 472 - '@types/nlcst@2.0.3': 473 - resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} 523 + '@types/babel__generator@7.27.0': 524 + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 474 525 475 - '@types/node@22.15.30': 476 - resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} 526 + '@types/babel__template@7.4.4': 527 + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 477 528 478 - '@types/unist@3.0.3': 479 - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 529 + '@types/babel__traverse@7.28.0': 530 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 480 531 481 - '@ungap/structured-clone@1.3.0': 482 - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 532 + '@types/estree@1.0.8': 533 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 483 534 484 - acorn@8.15.0: 485 - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 486 - engines: {node: '>=0.4.0'} 487 - hasBin: true 535 + '@types/node@24.3.0': 536 + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} 488 537 489 - ansi-align@3.0.1: 490 - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 538 + babel-plugin-jsx-dom-expressions@0.40.1: 539 + resolution: {integrity: sha512-b4iHuirqK7RgaMzB2Lsl7MqrlDgQtVRSSazyrmx7wB3T759ggGjod5Rkok5MfHjQXhR7tRPmdwoeGPqBnW2KfA==} 540 + peerDependencies: 541 + '@babel/core': ^7.20.12 491 542 492 - ansi-regex@5.0.1: 493 - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 494 - engines: {node: '>=8'} 495 - 496 - ansi-regex@6.1.0: 497 - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 498 - engines: {node: '>=12'} 499 - 500 - ansi-styles@6.2.1: 501 - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 502 - engines: {node: '>=12'} 503 - 504 - anymatch@3.1.3: 505 - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 506 - engines: {node: '>= 8'} 507 - 508 - argparse@2.0.1: 509 - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 510 - 511 - aria-query@5.3.2: 512 - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 513 - engines: {node: '>= 0.4'} 514 - 515 - array-iterate@2.0.1: 516 - resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} 543 + babel-preset-solid@1.9.9: 544 + resolution: {integrity: sha512-pCnxWrciluXCeli/dj5PIEHgbNzim3evtTn12snjqqg8QZWJNMjH1AWIp4iG/tbVjqQ72aBEymMSagvmgxubXw==} 545 + peerDependencies: 546 + '@babel/core': ^7.0.0 547 + solid-js: ^1.9.8 548 + peerDependenciesMeta: 549 + solid-js: 550 + optional: true 517 551 518 - astro@5.9.1: 519 - resolution: {integrity: sha512-wxoJcTbuDZNFSv6EaL0PAlrp0Wx6VnOAULCXvy0scsV70oWMeUkdxuBxfO54JxO5Qgyvwj9h99y6E0elqOpGtA==} 520 - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} 552 + browserslist@4.25.3: 553 + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} 554 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 521 555 hasBin: true 522 556 523 - axobject-query@4.1.0: 524 - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 525 - engines: {node: '>= 0.4'} 526 - 527 - bail@2.0.2: 528 - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 529 - 530 - base-64@1.0.0: 531 - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} 532 - 533 - base64-js@1.5.1: 534 - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 535 - 536 - blob-to-buffer@1.2.9: 537 - resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} 538 - 539 - boxen@8.0.1: 540 - resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} 541 - engines: {node: '>=18'} 542 - 543 - brotli@1.3.3: 544 - resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} 545 - 546 - camelcase@8.0.0: 547 - resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} 548 - engines: {node: '>=16'} 549 - 550 - ccount@2.0.1: 551 - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 552 - 553 - chalk@5.4.1: 554 - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 555 - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 556 - 557 - character-entities-html4@2.1.0: 558 - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 559 - 560 - character-entities-legacy@3.0.0: 561 - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 562 - 563 - character-entities@2.0.2: 564 - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 565 - 566 - chokidar@4.0.3: 567 - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 568 - engines: {node: '>= 14.16.0'} 569 - 570 - ci-info@4.2.0: 571 - resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} 572 - engines: {node: '>=8'} 573 - 574 - cli-boxes@3.0.0: 575 - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 576 - engines: {node: '>=10'} 577 - 578 - clone@2.1.2: 579 - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} 580 - engines: {node: '>=0.8'} 581 - 582 - clsx@2.1.1: 583 - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 584 - engines: {node: '>=6'} 585 - 586 - color-convert@2.0.1: 587 - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 588 - engines: {node: '>=7.0.0'} 589 - 590 - color-name@1.1.4: 591 - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 592 - 593 - color-string@1.9.1: 594 - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 595 - 596 - color@4.2.3: 597 - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 598 - engines: {node: '>=12.5.0'} 599 - 600 - comma-separated-tokens@2.0.3: 601 - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 602 - 603 - common-ancestor-path@1.0.1: 604 - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} 557 + caniuse-lite@1.0.30001735: 558 + resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} 605 559 606 - cookie-es@1.2.2: 607 - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} 560 + convert-source-map@2.0.0: 561 + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 608 562 609 - cookie@1.0.2: 610 - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} 611 - engines: {node: '>=18'} 612 - 613 - cross-fetch@3.2.0: 614 - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} 615 - 616 - crossws@0.3.5: 617 - resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} 618 - 619 - css-tree@3.1.0: 620 - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} 621 - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 622 - 623 - cssesc@3.0.0: 624 - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 625 - engines: {node: '>=4'} 626 - hasBin: true 563 + csstype@3.1.3: 564 + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 627 565 628 566 debug@4.4.1: 629 567 resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} ··· 634 572 supports-color: 635 573 optional: true 636 574 637 - decode-named-character-reference@1.1.0: 638 - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} 639 - 640 - defu@6.1.4: 641 - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 642 - 643 - dequal@2.0.3: 644 - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 645 - engines: {node: '>=6'} 646 - 647 - destr@2.0.5: 648 - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} 649 - 650 - detect-libc@2.0.4: 651 - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 652 - engines: {node: '>=8'} 653 - 654 - deterministic-object-hash@2.0.2: 655 - resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} 656 - engines: {node: '>=18'} 657 - 658 - devalue@5.1.1: 659 - resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} 660 - 661 - devlop@1.1.0: 662 - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 663 - 664 - dfa@1.2.0: 665 - resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} 666 - 667 - diff@5.2.0: 668 - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} 669 - engines: {node: '>=0.3.1'} 670 - 671 - dlv@1.1.3: 672 - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 673 - 674 - dset@3.1.4: 675 - resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} 676 - engines: {node: '>=4'} 677 - 678 - emoji-regex@10.4.0: 679 - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} 680 - 681 - emoji-regex@8.0.0: 682 - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 575 + electron-to-chromium@1.5.207: 576 + resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} 683 577 684 578 entities@6.0.1: 685 579 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 686 580 engines: {node: '>=0.12'} 687 581 688 - es-module-lexer@1.7.0: 689 - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 690 - 691 - esbuild@0.25.5: 692 - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 582 + esbuild@0.25.9: 583 + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} 693 584 engines: {node: '>=18'} 694 585 hasBin: true 695 586 696 - escape-string-regexp@5.0.0: 697 - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 698 - engines: {node: '>=12'} 587 + escalade@3.2.0: 588 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 589 + engines: {node: '>=6'} 699 590 700 - estree-walker@2.0.2: 701 - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 591 + esm-env@1.2.2: 592 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 702 593 703 - estree-walker@3.0.3: 704 - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 705 - 706 - eventemitter3@5.0.1: 707 - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 708 - 709 - extend@3.0.2: 710 - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 711 - 712 - fast-deep-equal@3.1.3: 713 - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 714 - 715 - fdir@6.4.5: 716 - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} 594 + fdir@6.5.0: 595 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 596 + engines: {node: '>=12.0.0'} 717 597 peerDependencies: 718 598 picomatch: ^3 || ^4 719 599 peerDependenciesMeta: 720 600 picomatch: 721 601 optional: true 722 602 723 - flattie@1.1.1: 724 - resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} 725 - engines: {node: '>=8'} 726 - 727 - fontace@0.3.0: 728 - resolution: {integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==} 729 - 730 - fontkit@2.0.4: 731 - resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} 732 - 733 603 fsevents@2.3.3: 734 604 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 735 605 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 736 606 os: [darwin] 737 607 738 - get-east-asian-width@1.3.0: 739 - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} 740 - engines: {node: '>=18'} 741 - 742 - github-slugger@2.0.0: 743 - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} 744 - 745 - h3@1.15.3: 746 - resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} 747 - 748 - hast-util-from-html@2.0.3: 749 - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} 750 - 751 - hast-util-from-parse5@8.0.3: 752 - resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} 753 - 754 - hast-util-is-element@3.0.0: 755 - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} 756 - 757 - hast-util-parse-selector@4.0.0: 758 - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 759 - 760 - hast-util-raw@9.1.0: 761 - resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} 762 - 763 - hast-util-to-html@9.0.5: 764 - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} 765 - 766 - hast-util-to-parse5@8.0.0: 767 - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} 768 - 769 - hast-util-to-text@4.0.2: 770 - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} 771 - 772 - hast-util-whitespace@3.0.0: 773 - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 774 - 775 - hastscript@9.0.1: 776 - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} 777 - 778 - html-escaper@3.0.3: 779 - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} 780 - 781 - html-void-elements@3.0.0: 782 - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 783 - 784 - http-cache-semantics@4.2.0: 785 - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} 786 - 787 - import-meta-resolve@4.1.0: 788 - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 789 - 790 - iron-webcrypto@1.2.1: 791 - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} 792 - 793 - is-arrayish@0.3.2: 794 - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 795 - 796 - is-docker@3.0.0: 797 - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} 798 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 799 - hasBin: true 800 - 801 - is-fullwidth-code-point@3.0.0: 802 - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 803 - engines: {node: '>=8'} 608 + gensync@1.0.0-beta.2: 609 + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 610 + engines: {node: '>=6.9.0'} 804 611 805 - is-inside-container@1.0.0: 806 - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} 807 - engines: {node: '>=14.16'} 808 - hasBin: true 809 - 810 - is-plain-obj@4.1.0: 811 - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 812 - engines: {node: '>=12'} 612 + html-entities@2.3.3: 613 + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} 813 614 814 - is-wsl@3.1.0: 815 - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} 816 - engines: {node: '>=16'} 615 + is-what@4.1.16: 616 + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 617 + engines: {node: '>=12.13'} 817 618 818 - js-yaml@4.1.0: 819 - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 820 - hasBin: true 619 + js-tokens@4.0.0: 620 + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 821 621 822 - kleur@3.0.3: 823 - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 622 + jsesc@3.1.0: 623 + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 824 624 engines: {node: '>=6'} 625 + hasBin: true 825 626 826 - kleur@4.1.5: 827 - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 627 + json5@2.2.3: 628 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 828 629 engines: {node: '>=6'} 829 - 830 - longest-streak@3.1.0: 831 - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 832 - 833 - lru-cache@10.4.3: 834 - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 835 - 836 - magic-string@0.30.17: 837 - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 838 - 839 - magicast@0.3.5: 840 - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} 841 - 842 - markdown-table@3.0.4: 843 - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} 844 - 845 - mdast-util-definitions@6.0.0: 846 - resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} 847 - 848 - mdast-util-find-and-replace@3.0.2: 849 - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} 850 - 851 - mdast-util-from-markdown@2.0.2: 852 - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} 853 - 854 - mdast-util-gfm-autolink-literal@2.0.1: 855 - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} 856 - 857 - mdast-util-gfm-footnote@2.1.0: 858 - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} 859 - 860 - mdast-util-gfm-strikethrough@2.0.0: 861 - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} 862 - 863 - mdast-util-gfm-table@2.0.0: 864 - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} 865 - 866 - mdast-util-gfm-task-list-item@2.0.0: 867 - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} 868 - 869 - mdast-util-gfm@3.1.0: 870 - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} 871 - 872 - mdast-util-phrasing@4.1.0: 873 - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} 874 - 875 - mdast-util-to-hast@13.2.0: 876 - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} 877 - 878 - mdast-util-to-markdown@2.1.2: 879 - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} 880 - 881 - mdast-util-to-string@4.0.0: 882 - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} 883 - 884 - mdn-data@2.12.2: 885 - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} 886 - 887 - micromark-core-commonmark@2.0.3: 888 - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} 889 - 890 - micromark-extension-gfm-autolink-literal@2.1.0: 891 - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} 892 - 893 - micromark-extension-gfm-footnote@2.1.0: 894 - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} 895 - 896 - micromark-extension-gfm-strikethrough@2.1.0: 897 - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} 898 - 899 - micromark-extension-gfm-table@2.1.1: 900 - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} 901 - 902 - micromark-extension-gfm-tagfilter@2.0.0: 903 - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} 904 - 905 - micromark-extension-gfm-task-list-item@2.1.0: 906 - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} 907 - 908 - micromark-extension-gfm@3.0.0: 909 - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} 910 - 911 - micromark-factory-destination@2.0.1: 912 - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} 913 - 914 - micromark-factory-label@2.0.1: 915 - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} 916 - 917 - micromark-factory-space@2.0.1: 918 - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} 919 - 920 - micromark-factory-title@2.0.1: 921 - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} 630 + hasBin: true 922 631 923 - micromark-factory-whitespace@2.0.1: 924 - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} 632 + lru-cache@5.1.1: 633 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 925 634 926 - micromark-util-character@2.1.1: 927 - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 928 - 929 - micromark-util-chunked@2.0.1: 930 - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} 931 - 932 - micromark-util-classify-character@2.0.1: 933 - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} 934 - 935 - micromark-util-combine-extensions@2.0.1: 936 - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} 937 - 938 - micromark-util-decode-numeric-character-reference@2.0.2: 939 - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} 940 - 941 - micromark-util-decode-string@2.0.1: 942 - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} 943 - 944 - micromark-util-encode@2.0.1: 945 - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 946 - 947 - micromark-util-html-tag-name@2.0.1: 948 - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} 949 - 950 - micromark-util-normalize-identifier@2.0.1: 951 - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} 952 - 953 - micromark-util-resolve-all@2.0.1: 954 - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} 955 - 956 - micromark-util-sanitize-uri@2.0.1: 957 - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 958 - 959 - micromark-util-subtokenize@2.1.0: 960 - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} 961 - 962 - micromark-util-symbol@2.0.1: 963 - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 964 - 965 - micromark-util-types@2.0.2: 966 - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 967 - 968 - micromark@4.0.2: 969 - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} 970 - 971 - mrmime@2.0.1: 972 - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 973 - engines: {node: '>=10'} 635 + merge-anything@5.1.7: 636 + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} 637 + engines: {node: '>=12.13'} 974 638 975 639 ms@2.1.3: 976 640 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} ··· 980 644 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 981 645 hasBin: true 982 646 983 - neotraverse@0.6.18: 984 - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} 985 - engines: {node: '>= 10'} 986 - 987 - nlcst-to-string@4.0.0: 988 - resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} 989 - 990 - node-fetch-native@1.6.6: 991 - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} 992 - 993 - node-fetch@2.7.0: 994 - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 995 - engines: {node: 4.x || >=6.0.0} 996 - peerDependencies: 997 - encoding: ^0.1.0 998 - peerDependenciesMeta: 999 - encoding: 1000 - optional: true 1001 - 1002 - node-mock-http@1.0.0: 1003 - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} 1004 - 1005 - normalize-path@3.0.0: 1006 - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1007 - engines: {node: '>=0.10.0'} 1008 - 1009 - ofetch@1.4.1: 1010 - resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} 1011 - 1012 - ohash@2.0.11: 1013 - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} 1014 - 1015 - oniguruma-parser@0.12.1: 1016 - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} 1017 - 1018 - oniguruma-to-es@4.3.3: 1019 - resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} 1020 - 1021 - p-limit@6.2.0: 1022 - resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} 1023 - engines: {node: '>=18'} 1024 - 1025 - p-queue@8.1.0: 1026 - resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==} 1027 - engines: {node: '>=18'} 1028 - 1029 - p-timeout@6.1.4: 1030 - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} 1031 - engines: {node: '>=14.16'} 647 + nanoid@5.1.5: 648 + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} 649 + engines: {node: ^18 || >=20} 650 + hasBin: true 1032 651 1033 - package-manager-detector@1.3.0: 1034 - resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} 1035 - 1036 - pako@0.2.9: 1037 - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} 1038 - 1039 - parse-latin@7.0.0: 1040 - resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} 652 + node-releases@2.0.19: 653 + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1041 654 1042 655 parse5@7.3.0: 1043 656 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 1045 658 picocolors@1.1.1: 1046 659 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1047 660 1048 - picomatch@2.3.1: 1049 - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1050 - engines: {node: '>=8.6'} 1051 - 1052 - picomatch@4.0.2: 1053 - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 661 + picomatch@4.0.3: 662 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1054 663 engines: {node: '>=12'} 1055 664 1056 - postcss@8.5.4: 1057 - resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} 665 + postcss@8.5.6: 666 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1058 667 engines: {node: ^10 || ^12 || >=14} 1059 668 1060 - prismjs@1.30.0: 1061 - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} 1062 - engines: {node: '>=6'} 1063 - 1064 - prompts@2.4.2: 1065 - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1066 - engines: {node: '>= 6'} 1067 - 1068 - property-information@6.5.0: 1069 - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} 1070 - 1071 - property-information@7.1.0: 1072 - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} 1073 - 1074 - radix3@1.1.2: 1075 - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} 1076 - 1077 - readdirp@4.1.2: 1078 - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1079 - engines: {node: '>= 14.18.0'} 1080 - 1081 - regex-recursion@6.0.2: 1082 - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} 1083 - 1084 - regex-utilities@2.3.0: 1085 - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} 669 + prettier@3.6.2: 670 + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 671 + engines: {node: '>=14'} 672 + hasBin: true 1086 673 1087 - regex@6.0.1: 1088 - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} 1089 - 1090 - rehype-parse@9.0.1: 1091 - resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} 1092 - 1093 - rehype-raw@7.0.0: 1094 - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} 1095 - 1096 - rehype-stringify@10.0.1: 1097 - resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} 1098 - 1099 - rehype@13.0.2: 1100 - resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} 1101 - 1102 - remark-gfm@4.0.1: 1103 - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} 1104 - 1105 - remark-parse@11.0.0: 1106 - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} 1107 - 1108 - remark-rehype@11.1.2: 1109 - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} 1110 - 1111 - remark-smartypants@3.0.2: 1112 - resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} 1113 - engines: {node: '>=16.0.0'} 1114 - 1115 - remark-stringify@11.0.0: 1116 - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} 1117 - 1118 - restructure@3.0.2: 1119 - resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} 1120 - 1121 - retext-latin@4.0.0: 1122 - resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} 1123 - 1124 - retext-smartypants@6.2.0: 1125 - resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} 1126 - 1127 - retext-stringify@4.0.0: 1128 - resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} 1129 - 1130 - retext@9.0.0: 1131 - resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} 1132 - 1133 - rollup@4.42.0: 1134 - resolution: {integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==} 674 + rollup@4.46.3: 675 + resolution: {integrity: sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==} 1135 676 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1136 677 hasBin: true 1137 678 1138 - semver@7.7.2: 1139 - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1140 - engines: {node: '>=10'} 679 + semver@6.3.1: 680 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1141 681 hasBin: true 1142 682 1143 - sharp@0.33.5: 1144 - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} 1145 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 683 + seroval-plugins@1.3.2: 684 + resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 685 + engines: {node: '>=10'} 686 + peerDependencies: 687 + seroval: ^1.0 1146 688 1147 - shiki@3.6.0: 1148 - resolution: {integrity: sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==} 689 + seroval@1.3.2: 690 + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 691 + engines: {node: '>=10'} 1149 692 1150 - simple-swizzle@0.2.2: 1151 - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 693 + solid-devtools@0.34.3: 694 + resolution: {integrity: sha512-ZQua959n+Zu3sLbm9g0IRjYUb1YYlYbu83PWLRoKbSsq0a3ItQNhnS2OBU7rQNmOKZiMexNo9Z3izas9BcOKDg==} 695 + peerDependencies: 696 + solid-js: ^1.9.0 697 + vite: ^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 698 + peerDependenciesMeta: 699 + vite: 700 + optional: true 1152 701 1153 - sisteransi@1.0.5: 1154 - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 702 + solid-js@1.9.9: 703 + resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} 1155 704 1156 - smol-toml@1.3.4: 1157 - resolution: {integrity: sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==} 1158 - engines: {node: '>= 18'} 705 + solid-refresh@0.6.3: 706 + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} 707 + peerDependencies: 708 + solid-js: ^1.3 1159 709 1160 710 source-map-js@1.2.1: 1161 711 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1162 712 engines: {node: '>=0.10.0'} 1163 713 1164 - space-separated-tokens@2.0.2: 1165 - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 1166 - 1167 - string-width@4.2.3: 1168 - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1169 - engines: {node: '>=8'} 1170 - 1171 - string-width@7.2.0: 1172 - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 1173 - engines: {node: '>=18'} 1174 - 1175 - stringify-entities@4.0.4: 1176 - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 1177 - 1178 - strip-ansi@6.0.1: 1179 - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1180 - engines: {node: '>=8'} 1181 - 1182 - strip-ansi@7.1.0: 1183 - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1184 - engines: {node: '>=12'} 1185 - 1186 - tiny-inflate@1.0.3: 1187 - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} 1188 - 1189 - tinyexec@0.3.2: 1190 - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1191 - 1192 714 tinyglobby@0.2.14: 1193 715 resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 1194 716 engines: {node: '>=12.0.0'} 1195 717 1196 - tr46@0.0.3: 1197 - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1198 - 1199 - trim-lines@3.0.1: 1200 - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 1201 - 1202 - trough@2.2.0: 1203 - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} 1204 - 1205 - tsconfck@3.1.6: 1206 - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} 1207 - engines: {node: ^18 || >=20} 718 + typescript@5.9.2: 719 + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 720 + engines: {node: '>=14.17'} 1208 721 hasBin: true 1209 - peerDependencies: 1210 - typescript: ^5.0.0 1211 - peerDependenciesMeta: 1212 - typescript: 1213 - optional: true 1214 722 1215 - tslib@2.8.1: 1216 - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 723 + undici-types@7.10.0: 724 + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} 1217 725 1218 - type-fest@4.41.0: 1219 - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 1220 - engines: {node: '>=16'} 1221 - 1222 - typescript@5.8.3: 1223 - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1224 - engines: {node: '>=14.17'} 726 + update-browserslist-db@1.1.3: 727 + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1225 728 hasBin: true 729 + peerDependencies: 730 + browserslist: '>= 4.21.0' 1226 731 1227 - ufo@1.6.1: 1228 - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 732 + validate-html-nesting@1.2.3: 733 + resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} 1229 734 1230 - ultrahtml@1.6.0: 1231 - resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} 1232 - 1233 - uncrypto@0.1.3: 1234 - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} 1235 - 1236 - undici-types@6.21.0: 1237 - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1238 - 1239 - unicode-properties@1.4.1: 1240 - resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} 1241 - 1242 - unicode-trie@2.0.0: 1243 - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} 1244 - 1245 - unified@11.0.5: 1246 - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} 1247 - 1248 - unifont@0.5.0: 1249 - resolution: {integrity: sha512-4DueXMP5Hy4n607sh+vJ+rajoLu778aU3GzqeTCqsD/EaUcvqZT9wPC8kgK6Vjh22ZskrxyRCR71FwNOaYn6jA==} 1250 - 1251 - unist-util-find-after@5.0.0: 1252 - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} 1253 - 1254 - unist-util-is@6.0.0: 1255 - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 1256 - 1257 - unist-util-modify-children@4.0.0: 1258 - resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} 1259 - 1260 - unist-util-position@5.0.0: 1261 - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 1262 - 1263 - unist-util-remove-position@5.0.0: 1264 - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} 1265 - 1266 - unist-util-stringify-position@4.0.0: 1267 - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 1268 - 1269 - unist-util-visit-children@3.0.0: 1270 - resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} 1271 - 1272 - unist-util-visit-parents@6.0.1: 1273 - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 1274 - 1275 - unist-util-visit@5.0.0: 1276 - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1277 - 1278 - unstorage@1.16.0: 1279 - resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} 735 + vite-plugin-solid@2.11.8: 736 + resolution: {integrity: sha512-hFrCxBfv3B1BmFqnJF4JOCYpjrmi/zwyeKjcomQ0khh8HFyQ8SbuBWQ7zGojfrz6HUOBFrJBNySDi/JgAHytWg==} 1280 737 peerDependencies: 1281 - '@azure/app-configuration': ^1.8.0 1282 - '@azure/cosmos': ^4.2.0 1283 - '@azure/data-tables': ^13.3.0 1284 - '@azure/identity': ^4.6.0 1285 - '@azure/keyvault-secrets': ^4.9.0 1286 - '@azure/storage-blob': ^12.26.0 1287 - '@capacitor/preferences': ^6.0.3 || ^7.0.0 1288 - '@deno/kv': '>=0.9.0' 1289 - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 1290 - '@planetscale/database': ^1.19.0 1291 - '@upstash/redis': ^1.34.3 1292 - '@vercel/blob': '>=0.27.1' 1293 - '@vercel/kv': ^1.0.1 1294 - aws4fetch: ^1.0.20 1295 - db0: '>=0.2.1' 1296 - idb-keyval: ^6.2.1 1297 - ioredis: ^5.4.2 1298 - uploadthing: ^7.4.4 738 + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 739 + solid-js: ^1.7.2 740 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 1299 741 peerDependenciesMeta: 1300 - '@azure/app-configuration': 1301 - optional: true 1302 - '@azure/cosmos': 1303 - optional: true 1304 - '@azure/data-tables': 1305 - optional: true 1306 - '@azure/identity': 1307 - optional: true 1308 - '@azure/keyvault-secrets': 1309 - optional: true 1310 - '@azure/storage-blob': 1311 - optional: true 1312 - '@capacitor/preferences': 1313 - optional: true 1314 - '@deno/kv': 1315 - optional: true 1316 - '@netlify/blobs': 1317 - optional: true 1318 - '@planetscale/database': 1319 - optional: true 1320 - '@upstash/redis': 1321 - optional: true 1322 - '@vercel/blob': 1323 - optional: true 1324 - '@vercel/kv': 1325 - optional: true 1326 - aws4fetch: 1327 - optional: true 1328 - db0: 1329 - optional: true 1330 - idb-keyval: 1331 - optional: true 1332 - ioredis: 1333 - optional: true 1334 - uploadthing: 742 + '@testing-library/jest-dom': 1335 743 optional: true 1336 744 1337 - vfile-location@5.0.3: 1338 - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 1339 - 1340 - vfile-message@4.0.2: 1341 - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 1342 - 1343 - vfile@6.0.3: 1344 - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 1345 - 1346 745 vite@6.3.5: 1347 746 resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1348 747 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} ··· 1383 782 yaml: 1384 783 optional: true 1385 784 1386 - vitefu@1.0.6: 1387 - resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} 785 + vitefu@1.1.1: 786 + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} 1388 787 peerDependencies: 1389 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 788 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 1390 789 peerDependenciesMeta: 1391 790 vite: 1392 791 optional: true 1393 792 1394 - web-namespaces@2.0.1: 1395 - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 793 + yallist@3.1.1: 794 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1396 795 1397 - webidl-conversions@3.0.1: 1398 - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 796 + snapshots: 1399 797 1400 - whatwg-url@5.0.0: 1401 - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 798 + '@ampproject/remapping@2.3.0': 799 + dependencies: 800 + '@jridgewell/gen-mapping': 0.3.13 801 + '@jridgewell/trace-mapping': 0.3.30 1402 802 1403 - which-pm-runs@1.1.0: 1404 - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} 1405 - engines: {node: '>=4'} 803 + '@atcute/client@4.0.3': 804 + dependencies: 805 + '@atcute/identity': 1.0.3 806 + '@atcute/lexicons': 1.1.0 1406 807 1407 - widest-line@5.0.0: 1408 - resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} 1409 - engines: {node: '>=18'} 808 + '@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)': 809 + dependencies: 810 + '@atcute/identity': 1.0.3 811 + '@atcute/lexicons': 1.1.0 812 + '@atcute/util-fetch': 1.0.1 813 + '@badrap/valita': 0.4.6 1410 814 1411 - wrap-ansi@9.0.0: 1412 - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} 1413 - engines: {node: '>=18'} 815 + '@atcute/identity@1.0.3': 816 + dependencies: 817 + '@atcute/lexicons': 1.1.0 818 + '@badrap/valita': 0.4.6 1414 819 1415 - xxhash-wasm@1.1.0: 1416 - resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 820 + '@atcute/lexicons@1.1.0': 821 + dependencies: 822 + esm-env: 1.2.2 1417 823 1418 - yargs-parser@21.1.1: 1419 - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1420 - engines: {node: '>=12'} 824 + '@atcute/multibase@1.1.4': 825 + dependencies: 826 + '@atcute/uint8array': 1.0.3 1421 827 1422 - yocto-queue@1.2.1: 1423 - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} 1424 - engines: {node: '>=12.20'} 828 + '@atcute/oauth-browser-client@1.0.26': 829 + dependencies: 830 + '@atcute/client': 4.0.3 831 + '@atcute/identity': 1.0.3 832 + '@atcute/lexicons': 1.1.0 833 + '@atcute/multibase': 1.1.4 834 + '@atcute/uint8array': 1.0.3 835 + nanoid: 5.1.5 1425 836 1426 - yocto-spinner@0.2.3: 1427 - resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} 1428 - engines: {node: '>=18.19'} 837 + '@atcute/uint8array@1.0.3': {} 1429 838 1430 - yoctocolors@2.1.1: 1431 - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} 1432 - engines: {node: '>=18'} 839 + '@atcute/util-fetch@1.0.1': 840 + dependencies: 841 + '@badrap/valita': 0.4.6 1433 842 1434 - zod-to-json-schema@3.24.5: 1435 - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} 1436 - peerDependencies: 1437 - zod: ^3.24.1 843 + '@babel/code-frame@7.27.1': 844 + dependencies: 845 + '@babel/helper-validator-identifier': 7.27.1 846 + js-tokens: 4.0.0 847 + picocolors: 1.1.1 1438 848 1439 - zod-to-ts@1.2.0: 1440 - resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} 1441 - peerDependencies: 1442 - typescript: ^4.9.4 || ^5.0.2 1443 - zod: ^3 849 + '@babel/compat-data@7.28.0': {} 1444 850 1445 - zod@3.25.56: 1446 - resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==} 851 + '@babel/core@7.28.3': 852 + dependencies: 853 + '@ampproject/remapping': 2.3.0 854 + '@babel/code-frame': 7.27.1 855 + '@babel/generator': 7.28.3 856 + '@babel/helper-compilation-targets': 7.27.2 857 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) 858 + '@babel/helpers': 7.28.3 859 + '@babel/parser': 7.28.3 860 + '@babel/template': 7.27.2 861 + '@babel/traverse': 7.28.3 862 + '@babel/types': 7.28.2 863 + convert-source-map: 2.0.0 864 + debug: 4.4.1 865 + gensync: 1.0.0-beta.2 866 + json5: 2.2.3 867 + semver: 6.3.1 868 + transitivePeerDependencies: 869 + - supports-color 1447 870 1448 - zwitch@2.0.4: 1449 - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 871 + '@babel/generator@7.28.3': 872 + dependencies: 873 + '@babel/parser': 7.28.3 874 + '@babel/types': 7.28.2 875 + '@jridgewell/gen-mapping': 0.3.13 876 + '@jridgewell/trace-mapping': 0.3.30 877 + jsesc: 3.1.0 1450 878 1451 - snapshots: 879 + '@babel/helper-compilation-targets@7.27.2': 880 + dependencies: 881 + '@babel/compat-data': 7.28.0 882 + '@babel/helper-validator-option': 7.27.1 883 + browserslist: 4.25.3 884 + lru-cache: 5.1.1 885 + semver: 6.3.1 1452 886 1453 - '@astrojs/compiler@2.12.1': {} 887 + '@babel/helper-globals@7.28.0': {} 1454 888 1455 - '@astrojs/internal-helpers@0.6.1': {} 889 + '@babel/helper-module-imports@7.18.6': 890 + dependencies: 891 + '@babel/types': 7.28.2 1456 892 1457 - '@astrojs/markdown-remark@6.3.2': 893 + '@babel/helper-module-imports@7.27.1': 1458 894 dependencies: 1459 - '@astrojs/internal-helpers': 0.6.1 1460 - '@astrojs/prism': 3.3.0 1461 - github-slugger: 2.0.0 1462 - hast-util-from-html: 2.0.3 1463 - hast-util-to-text: 4.0.2 1464 - import-meta-resolve: 4.1.0 1465 - js-yaml: 4.1.0 1466 - mdast-util-definitions: 6.0.0 1467 - rehype-raw: 7.0.0 1468 - rehype-stringify: 10.0.1 1469 - remark-gfm: 4.0.1 1470 - remark-parse: 11.0.0 1471 - remark-rehype: 11.1.2 1472 - remark-smartypants: 3.0.2 1473 - shiki: 3.6.0 1474 - smol-toml: 1.3.4 1475 - unified: 11.0.5 1476 - unist-util-remove-position: 5.0.0 1477 - unist-util-visit: 5.0.0 1478 - unist-util-visit-parents: 6.0.1 1479 - vfile: 6.0.3 895 + '@babel/traverse': 7.28.3 896 + '@babel/types': 7.28.2 1480 897 transitivePeerDependencies: 1481 898 - supports-color 1482 899 1483 - '@astrojs/prism@3.3.0': 1484 - dependencies: 1485 - prismjs: 1.30.0 1486 - 1487 - '@astrojs/telemetry@3.3.0': 900 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': 1488 901 dependencies: 1489 - ci-info: 4.2.0 1490 - debug: 4.4.1 1491 - dlv: 1.1.3 1492 - dset: 3.1.4 1493 - is-docker: 3.0.0 1494 - is-wsl: 3.1.0 1495 - which-pm-runs: 1.1.0 902 + '@babel/core': 7.28.3 903 + '@babel/helper-module-imports': 7.27.1 904 + '@babel/helper-validator-identifier': 7.27.1 905 + '@babel/traverse': 7.28.3 1496 906 transitivePeerDependencies: 1497 907 - supports-color 908 + 909 + '@babel/helper-plugin-utils@7.27.1': {} 1498 910 1499 911 '@babel/helper-string-parser@7.27.1': {} 1500 912 1501 913 '@babel/helper-validator-identifier@7.27.1': {} 1502 914 1503 - '@babel/parser@7.27.5': 1504 - dependencies: 1505 - '@babel/types': 7.27.6 915 + '@babel/helper-validator-option@7.27.1': {} 1506 916 1507 - '@babel/types@7.27.6': 917 + '@babel/helpers@7.28.3': 1508 918 dependencies: 1509 - '@babel/helper-string-parser': 7.27.1 1510 - '@babel/helper-validator-identifier': 7.27.1 919 + '@babel/template': 7.27.2 920 + '@babel/types': 7.28.2 1511 921 1512 - '@capsizecss/unpack@2.4.0': 922 + '@babel/parser@7.28.3': 1513 923 dependencies: 1514 - blob-to-buffer: 1.2.9 1515 - cross-fetch: 3.2.0 1516 - fontkit: 2.0.4 1517 - transitivePeerDependencies: 1518 - - encoding 924 + '@babel/types': 7.28.2 1519 925 1520 - '@emnapi/runtime@1.4.3': 926 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': 1521 927 dependencies: 1522 - tslib: 2.8.1 1523 - optional: true 1524 - 1525 - '@esbuild/aix-ppc64@0.25.5': 1526 - optional: true 1527 - 1528 - '@esbuild/android-arm64@0.25.5': 1529 - optional: true 1530 - 1531 - '@esbuild/android-arm@0.25.5': 1532 - optional: true 1533 - 1534 - '@esbuild/android-x64@0.25.5': 1535 - optional: true 1536 - 1537 - '@esbuild/darwin-arm64@0.25.5': 1538 - optional: true 1539 - 1540 - '@esbuild/darwin-x64@0.25.5': 1541 - optional: true 1542 - 1543 - '@esbuild/freebsd-arm64@0.25.5': 1544 - optional: true 1545 - 1546 - '@esbuild/freebsd-x64@0.25.5': 1547 - optional: true 1548 - 1549 - '@esbuild/linux-arm64@0.25.5': 1550 - optional: true 928 + '@babel/core': 7.28.3 929 + '@babel/helper-plugin-utils': 7.27.1 1551 930 1552 - '@esbuild/linux-arm@0.25.5': 1553 - optional: true 931 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': 932 + dependencies: 933 + '@babel/core': 7.28.3 934 + '@babel/helper-plugin-utils': 7.27.1 1554 935 1555 - '@esbuild/linux-ia32@0.25.5': 1556 - optional: true 1557 - 1558 - '@esbuild/linux-loong64@0.25.5': 1559 - optional: true 936 + '@babel/template@7.27.2': 937 + dependencies: 938 + '@babel/code-frame': 7.27.1 939 + '@babel/parser': 7.28.3 940 + '@babel/types': 7.28.2 1560 941 1561 - '@esbuild/linux-mips64el@0.25.5': 1562 - optional: true 942 + '@babel/traverse@7.28.3': 943 + dependencies: 944 + '@babel/code-frame': 7.27.1 945 + '@babel/generator': 7.28.3 946 + '@babel/helper-globals': 7.28.0 947 + '@babel/parser': 7.28.3 948 + '@babel/template': 7.27.2 949 + '@babel/types': 7.28.2 950 + debug: 4.4.1 951 + transitivePeerDependencies: 952 + - supports-color 1563 953 1564 - '@esbuild/linux-ppc64@0.25.5': 1565 - optional: true 954 + '@babel/types@7.28.2': 955 + dependencies: 956 + '@babel/helper-string-parser': 7.27.1 957 + '@babel/helper-validator-identifier': 7.27.1 1566 958 1567 - '@esbuild/linux-riscv64@0.25.5': 1568 - optional: true 959 + '@badrap/valita@0.4.6': {} 1569 960 1570 - '@esbuild/linux-s390x@0.25.5': 961 + '@esbuild/aix-ppc64@0.25.9': 1571 962 optional: true 1572 963 1573 - '@esbuild/linux-x64@0.25.5': 964 + '@esbuild/android-arm64@0.25.9': 1574 965 optional: true 1575 966 1576 - '@esbuild/netbsd-arm64@0.25.5': 967 + '@esbuild/android-arm@0.25.9': 1577 968 optional: true 1578 969 1579 - '@esbuild/netbsd-x64@0.25.5': 970 + '@esbuild/android-x64@0.25.9': 1580 971 optional: true 1581 972 1582 - '@esbuild/openbsd-arm64@0.25.5': 973 + '@esbuild/darwin-arm64@0.25.9': 1583 974 optional: true 1584 975 1585 - '@esbuild/openbsd-x64@0.25.5': 976 + '@esbuild/darwin-x64@0.25.9': 1586 977 optional: true 1587 978 1588 - '@esbuild/sunos-x64@0.25.5': 979 + '@esbuild/freebsd-arm64@0.25.9': 1589 980 optional: true 1590 981 1591 - '@esbuild/win32-arm64@0.25.5': 982 + '@esbuild/freebsd-x64@0.25.9': 1592 983 optional: true 1593 984 1594 - '@esbuild/win32-ia32@0.25.5': 985 + '@esbuild/linux-arm64@0.25.9': 1595 986 optional: true 1596 987 1597 - '@esbuild/win32-x64@0.25.5': 988 + '@esbuild/linux-arm@0.25.9': 1598 989 optional: true 1599 990 1600 - '@img/sharp-darwin-arm64@0.33.5': 1601 - optionalDependencies: 1602 - '@img/sharp-libvips-darwin-arm64': 1.0.4 991 + '@esbuild/linux-ia32@0.25.9': 1603 992 optional: true 1604 993 1605 - '@img/sharp-darwin-x64@0.33.5': 1606 - optionalDependencies: 1607 - '@img/sharp-libvips-darwin-x64': 1.0.4 994 + '@esbuild/linux-loong64@0.25.9': 1608 995 optional: true 1609 996 1610 - '@img/sharp-libvips-darwin-arm64@1.0.4': 997 + '@esbuild/linux-mips64el@0.25.9': 1611 998 optional: true 1612 999 1613 - '@img/sharp-libvips-darwin-x64@1.0.4': 1000 + '@esbuild/linux-ppc64@0.25.9': 1614 1001 optional: true 1615 1002 1616 - '@img/sharp-libvips-linux-arm64@1.0.4': 1003 + '@esbuild/linux-riscv64@0.25.9': 1617 1004 optional: true 1618 1005 1619 - '@img/sharp-libvips-linux-arm@1.0.5': 1006 + '@esbuild/linux-s390x@0.25.9': 1620 1007 optional: true 1621 1008 1622 - '@img/sharp-libvips-linux-s390x@1.0.4': 1009 + '@esbuild/linux-x64@0.25.9': 1623 1010 optional: true 1624 1011 1625 - '@img/sharp-libvips-linux-x64@1.0.4': 1012 + '@esbuild/netbsd-arm64@0.25.9': 1626 1013 optional: true 1627 1014 1628 - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': 1015 + '@esbuild/netbsd-x64@0.25.9': 1629 1016 optional: true 1630 1017 1631 - '@img/sharp-libvips-linuxmusl-x64@1.0.4': 1018 + '@esbuild/openbsd-arm64@0.25.9': 1632 1019 optional: true 1633 1020 1634 - '@img/sharp-linux-arm64@0.33.5': 1635 - optionalDependencies: 1636 - '@img/sharp-libvips-linux-arm64': 1.0.4 1021 + '@esbuild/openbsd-x64@0.25.9': 1637 1022 optional: true 1638 1023 1639 - '@img/sharp-linux-arm@0.33.5': 1640 - optionalDependencies: 1641 - '@img/sharp-libvips-linux-arm': 1.0.5 1024 + '@esbuild/openharmony-arm64@0.25.9': 1642 1025 optional: true 1643 1026 1644 - '@img/sharp-linux-s390x@0.33.5': 1645 - optionalDependencies: 1646 - '@img/sharp-libvips-linux-s390x': 1.0.4 1027 + '@esbuild/sunos-x64@0.25.9': 1647 1028 optional: true 1648 1029 1649 - '@img/sharp-linux-x64@0.33.5': 1650 - optionalDependencies: 1651 - '@img/sharp-libvips-linux-x64': 1.0.4 1030 + '@esbuild/win32-arm64@0.25.9': 1652 1031 optional: true 1653 1032 1654 - '@img/sharp-linuxmusl-arm64@0.33.5': 1655 - optionalDependencies: 1656 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 1033 + '@esbuild/win32-ia32@0.25.9': 1657 1034 optional: true 1658 1035 1659 - '@img/sharp-linuxmusl-x64@0.33.5': 1660 - optionalDependencies: 1661 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 1036 + '@esbuild/win32-x64@0.25.9': 1662 1037 optional: true 1663 1038 1664 - '@img/sharp-wasm32@0.33.5': 1039 + '@jridgewell/gen-mapping@0.3.13': 1665 1040 dependencies: 1666 - '@emnapi/runtime': 1.4.3 1667 - optional: true 1041 + '@jridgewell/sourcemap-codec': 1.5.5 1042 + '@jridgewell/trace-mapping': 0.3.30 1668 1043 1669 - '@img/sharp-win32-ia32@0.33.5': 1670 - optional: true 1044 + '@jridgewell/resolve-uri@3.1.2': {} 1671 1045 1672 - '@img/sharp-win32-x64@0.33.5': 1673 - optional: true 1046 + '@jridgewell/sourcemap-codec@1.5.5': {} 1674 1047 1675 - '@jridgewell/sourcemap-codec@1.5.0': {} 1048 + '@jridgewell/trace-mapping@0.3.30': 1049 + dependencies: 1050 + '@jridgewell/resolve-uri': 3.1.2 1051 + '@jridgewell/sourcemap-codec': 1.5.5 1676 1052 1677 - '@oslojs/encoding@1.1.0': {} 1053 + '@jsr/mary__exif-rm@0.2.2': {} 1678 1054 1679 - '@rollup/pluginutils@5.1.4(rollup@4.42.0)': 1680 - dependencies: 1681 - '@types/estree': 1.0.8 1682 - estree-walker: 2.0.2 1683 - picomatch: 4.0.2 1684 - optionalDependencies: 1685 - rollup: 4.42.0 1055 + '@nothing-but/utils@0.17.0': {} 1686 1056 1687 - '@rollup/rollup-android-arm-eabi@4.42.0': 1057 + '@rollup/rollup-android-arm-eabi@4.46.3': 1688 1058 optional: true 1689 1059 1690 - '@rollup/rollup-android-arm64@4.42.0': 1060 + '@rollup/rollup-android-arm64@4.46.3': 1691 1061 optional: true 1692 1062 1693 - '@rollup/rollup-darwin-arm64@4.42.0': 1063 + '@rollup/rollup-darwin-arm64@4.46.3': 1694 1064 optional: true 1695 1065 1696 - '@rollup/rollup-darwin-x64@4.42.0': 1066 + '@rollup/rollup-darwin-x64@4.46.3': 1697 1067 optional: true 1698 1068 1699 - '@rollup/rollup-freebsd-arm64@4.42.0': 1069 + '@rollup/rollup-freebsd-arm64@4.46.3': 1700 1070 optional: true 1701 1071 1702 - '@rollup/rollup-freebsd-x64@4.42.0': 1072 + '@rollup/rollup-freebsd-x64@4.46.3': 1703 1073 optional: true 1704 1074 1705 - '@rollup/rollup-linux-arm-gnueabihf@4.42.0': 1075 + '@rollup/rollup-linux-arm-gnueabihf@4.46.3': 1706 1076 optional: true 1707 1077 1708 - '@rollup/rollup-linux-arm-musleabihf@4.42.0': 1078 + '@rollup/rollup-linux-arm-musleabihf@4.46.3': 1709 1079 optional: true 1710 1080 1711 - '@rollup/rollup-linux-arm64-gnu@4.42.0': 1081 + '@rollup/rollup-linux-arm64-gnu@4.46.3': 1712 1082 optional: true 1713 1083 1714 - '@rollup/rollup-linux-arm64-musl@4.42.0': 1084 + '@rollup/rollup-linux-arm64-musl@4.46.3': 1715 1085 optional: true 1716 1086 1717 - '@rollup/rollup-linux-loongarch64-gnu@4.42.0': 1087 + '@rollup/rollup-linux-loongarch64-gnu@4.46.3': 1718 1088 optional: true 1719 1089 1720 - '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': 1090 + '@rollup/rollup-linux-ppc64-gnu@4.46.3': 1721 1091 optional: true 1722 1092 1723 - '@rollup/rollup-linux-riscv64-gnu@4.42.0': 1093 + '@rollup/rollup-linux-riscv64-gnu@4.46.3': 1724 1094 optional: true 1725 1095 1726 - '@rollup/rollup-linux-riscv64-musl@4.42.0': 1096 + '@rollup/rollup-linux-riscv64-musl@4.46.3': 1727 1097 optional: true 1728 1098 1729 - '@rollup/rollup-linux-s390x-gnu@4.42.0': 1099 + '@rollup/rollup-linux-s390x-gnu@4.46.3': 1730 1100 optional: true 1731 1101 1732 - '@rollup/rollup-linux-x64-gnu@4.42.0': 1102 + '@rollup/rollup-linux-x64-gnu@4.46.3': 1733 1103 optional: true 1734 1104 1735 - '@rollup/rollup-linux-x64-musl@4.42.0': 1105 + '@rollup/rollup-linux-x64-musl@4.46.3': 1736 1106 optional: true 1737 1107 1738 - '@rollup/rollup-win32-arm64-msvc@4.42.0': 1108 + '@rollup/rollup-win32-arm64-msvc@4.46.3': 1739 1109 optional: true 1740 1110 1741 - '@rollup/rollup-win32-ia32-msvc@4.42.0': 1111 + '@rollup/rollup-win32-ia32-msvc@4.46.3': 1742 1112 optional: true 1743 1113 1744 - '@rollup/rollup-win32-x64-msvc@4.42.0': 1114 + '@rollup/rollup-win32-x64-msvc@4.46.3': 1745 1115 optional: true 1746 1116 1747 - '@shikijs/core@3.6.0': 1117 + '@solid-devtools/debugger@0.28.1(solid-js@1.9.9)': 1748 1118 dependencies: 1749 - '@shikijs/types': 3.6.0 1750 - '@shikijs/vscode-textmate': 10.0.2 1751 - '@types/hast': 3.0.4 1752 - hast-util-to-html: 9.0.5 1119 + '@nothing-but/utils': 0.17.0 1120 + '@solid-devtools/shared': 0.20.0(solid-js@1.9.9) 1121 + '@solid-primitives/bounds': 0.1.3(solid-js@1.9.9) 1122 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1123 + '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.9) 1124 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1125 + '@solid-primitives/scheduled': 1.5.2(solid-js@1.9.9) 1126 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1127 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1128 + solid-js: 1.9.9 1753 1129 1754 - '@shikijs/engine-javascript@3.6.0': 1130 + '@solid-devtools/shared@0.20.0(solid-js@1.9.9)': 1755 1131 dependencies: 1756 - '@shikijs/types': 3.6.0 1757 - '@shikijs/vscode-textmate': 10.0.2 1758 - oniguruma-to-es: 4.3.3 1132 + '@nothing-but/utils': 0.17.0 1133 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1134 + '@solid-primitives/media': 2.3.3(solid-js@1.9.9) 1135 + '@solid-primitives/refs': 1.1.2(solid-js@1.9.9) 1136 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1137 + '@solid-primitives/scheduled': 1.5.2(solid-js@1.9.9) 1138 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1139 + '@solid-primitives/styles': 0.1.2(solid-js@1.9.9) 1140 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1141 + solid-js: 1.9.9 1759 1142 1760 - '@shikijs/engine-oniguruma@3.6.0': 1143 + '@solid-primitives/bounds@0.1.3(solid-js@1.9.9)': 1761 1144 dependencies: 1762 - '@shikijs/types': 3.6.0 1763 - '@shikijs/vscode-textmate': 10.0.2 1145 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1146 + '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.9) 1147 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1148 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1149 + solid-js: 1.9.9 1764 1150 1765 - '@shikijs/langs@3.6.0': 1151 + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.9)': 1766 1152 dependencies: 1767 - '@shikijs/types': 3.6.0 1153 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1154 + solid-js: 1.9.9 1768 1155 1769 - '@shikijs/themes@3.6.0': 1156 + '@solid-primitives/keyboard@1.3.3(solid-js@1.9.9)': 1770 1157 dependencies: 1771 - '@shikijs/types': 3.6.0 1158 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1159 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1160 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1161 + solid-js: 1.9.9 1772 1162 1773 - '@shikijs/types@3.6.0': 1163 + '@solid-primitives/media@2.3.3(solid-js@1.9.9)': 1774 1164 dependencies: 1775 - '@shikijs/vscode-textmate': 10.0.2 1776 - '@types/hast': 3.0.4 1777 - 1778 - '@shikijs/vscode-textmate@10.0.2': {} 1165 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1166 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1167 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1168 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1169 + solid-js: 1.9.9 1779 1170 1780 - '@swc/helpers@0.5.17': 1171 + '@solid-primitives/refs@1.1.2(solid-js@1.9.9)': 1781 1172 dependencies: 1782 - tslib: 2.8.1 1173 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1174 + solid-js: 1.9.9 1783 1175 1784 - '@types/debug@4.1.12': 1176 + '@solid-primitives/resize-observer@2.1.3(solid-js@1.9.9)': 1785 1177 dependencies: 1786 - '@types/ms': 2.1.0 1178 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1179 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1180 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1181 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1182 + solid-js: 1.9.9 1787 1183 1788 - '@types/estree@1.0.7': {} 1789 - 1790 - '@types/estree@1.0.8': {} 1791 - 1792 - '@types/fontkit@2.0.8': 1184 + '@solid-primitives/rootless@1.5.2(solid-js@1.9.9)': 1793 1185 dependencies: 1794 - '@types/node': 22.15.30 1186 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1187 + solid-js: 1.9.9 1795 1188 1796 - '@types/hast@3.0.4': 1189 + '@solid-primitives/scheduled@1.5.2(solid-js@1.9.9)': 1797 1190 dependencies: 1798 - '@types/unist': 3.0.3 1191 + solid-js: 1.9.9 1799 1192 1800 - '@types/mdast@4.0.4': 1193 + '@solid-primitives/static-store@0.1.2(solid-js@1.9.9)': 1801 1194 dependencies: 1802 - '@types/unist': 3.0.3 1803 - 1804 - '@types/ms@2.1.0': {} 1195 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1196 + solid-js: 1.9.9 1805 1197 1806 - '@types/nlcst@2.0.3': 1198 + '@solid-primitives/styles@0.1.2(solid-js@1.9.9)': 1807 1199 dependencies: 1808 - '@types/unist': 3.0.3 1200 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1201 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1202 + solid-js: 1.9.9 1809 1203 1810 - '@types/node@22.15.30': 1204 + '@solid-primitives/utils@6.3.2(solid-js@1.9.9)': 1811 1205 dependencies: 1812 - undici-types: 6.21.0 1813 - 1814 - '@types/unist@3.0.3': {} 1206 + solid-js: 1.9.9 1815 1207 1816 - '@ungap/structured-clone@1.3.0': {} 1817 - 1818 - acorn@8.15.0: {} 1819 - 1820 - ansi-align@3.0.1: 1208 + '@solidjs/router@0.15.3(solid-js@1.9.9)': 1821 1209 dependencies: 1822 - string-width: 4.2.3 1210 + solid-js: 1.9.9 1823 1211 1824 - ansi-regex@5.0.1: {} 1825 - 1826 - ansi-regex@6.1.0: {} 1827 - 1828 - ansi-styles@6.2.1: {} 1829 - 1830 - anymatch@3.1.3: 1212 + '@types/babel__core@7.20.5': 1831 1213 dependencies: 1832 - normalize-path: 3.0.0 1833 - picomatch: 2.3.1 1834 - 1835 - argparse@2.0.1: {} 1836 - 1837 - aria-query@5.3.2: {} 1838 - 1839 - array-iterate@2.0.1: {} 1214 + '@babel/parser': 7.28.3 1215 + '@babel/types': 7.28.2 1216 + '@types/babel__generator': 7.27.0 1217 + '@types/babel__template': 7.4.4 1218 + '@types/babel__traverse': 7.28.0 1840 1219 1841 - astro@5.9.1(@types/node@22.15.30)(rollup@4.42.0)(typescript@5.8.3): 1220 + '@types/babel__generator@7.27.0': 1842 1221 dependencies: 1843 - '@astrojs/compiler': 2.12.1 1844 - '@astrojs/internal-helpers': 0.6.1 1845 - '@astrojs/markdown-remark': 6.3.2 1846 - '@astrojs/telemetry': 3.3.0 1847 - '@capsizecss/unpack': 2.4.0 1848 - '@oslojs/encoding': 1.1.0 1849 - '@rollup/pluginutils': 5.1.4(rollup@4.42.0) 1850 - acorn: 8.15.0 1851 - aria-query: 5.3.2 1852 - axobject-query: 4.1.0 1853 - boxen: 8.0.1 1854 - ci-info: 4.2.0 1855 - clsx: 2.1.1 1856 - common-ancestor-path: 1.0.1 1857 - cookie: 1.0.2 1858 - cssesc: 3.0.0 1859 - debug: 4.4.1 1860 - deterministic-object-hash: 2.0.2 1861 - devalue: 5.1.1 1862 - diff: 5.2.0 1863 - dlv: 1.1.3 1864 - dset: 3.1.4 1865 - es-module-lexer: 1.7.0 1866 - esbuild: 0.25.5 1867 - estree-walker: 3.0.3 1868 - flattie: 1.1.1 1869 - fontace: 0.3.0 1870 - github-slugger: 2.0.0 1871 - html-escaper: 3.0.3 1872 - http-cache-semantics: 4.2.0 1873 - import-meta-resolve: 4.1.0 1874 - js-yaml: 4.1.0 1875 - kleur: 4.1.5 1876 - magic-string: 0.30.17 1877 - magicast: 0.3.5 1878 - mrmime: 2.0.1 1879 - neotraverse: 0.6.18 1880 - p-limit: 6.2.0 1881 - p-queue: 8.1.0 1882 - package-manager-detector: 1.3.0 1883 - picomatch: 4.0.2 1884 - prompts: 2.4.2 1885 - rehype: 13.0.2 1886 - semver: 7.7.2 1887 - shiki: 3.6.0 1888 - tinyexec: 0.3.2 1889 - tinyglobby: 0.2.14 1890 - tsconfck: 3.1.6(typescript@5.8.3) 1891 - ultrahtml: 1.6.0 1892 - unifont: 0.5.0 1893 - unist-util-visit: 5.0.0 1894 - unstorage: 1.16.0 1895 - vfile: 6.0.3 1896 - vite: 6.3.5(@types/node@22.15.30) 1897 - vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.30)) 1898 - xxhash-wasm: 1.1.0 1899 - yargs-parser: 21.1.1 1900 - yocto-spinner: 0.2.3 1901 - zod: 3.25.56 1902 - zod-to-json-schema: 3.24.5(zod@3.25.56) 1903 - zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.25.56) 1904 - optionalDependencies: 1905 - sharp: 0.33.5 1906 - transitivePeerDependencies: 1907 - - '@azure/app-configuration' 1908 - - '@azure/cosmos' 1909 - - '@azure/data-tables' 1910 - - '@azure/identity' 1911 - - '@azure/keyvault-secrets' 1912 - - '@azure/storage-blob' 1913 - - '@capacitor/preferences' 1914 - - '@deno/kv' 1915 - - '@netlify/blobs' 1916 - - '@planetscale/database' 1917 - - '@types/node' 1918 - - '@upstash/redis' 1919 - - '@vercel/blob' 1920 - - '@vercel/kv' 1921 - - aws4fetch 1922 - - db0 1923 - - encoding 1924 - - idb-keyval 1925 - - ioredis 1926 - - jiti 1927 - - less 1928 - - lightningcss 1929 - - rollup 1930 - - sass 1931 - - sass-embedded 1932 - - stylus 1933 - - sugarss 1934 - - supports-color 1935 - - terser 1936 - - tsx 1937 - - typescript 1938 - - uploadthing 1939 - - yaml 1940 - 1941 - axobject-query@4.1.0: {} 1222 + '@babel/types': 7.28.2 1942 1223 1943 - bail@2.0.2: {} 1944 - 1945 - base-64@1.0.0: {} 1946 - 1947 - base64-js@1.5.1: {} 1948 - 1949 - blob-to-buffer@1.2.9: {} 1950 - 1951 - boxen@8.0.1: 1224 + '@types/babel__template@7.4.4': 1952 1225 dependencies: 1953 - ansi-align: 3.0.1 1954 - camelcase: 8.0.0 1955 - chalk: 5.4.1 1956 - cli-boxes: 3.0.0 1957 - string-width: 7.2.0 1958 - type-fest: 4.41.0 1959 - widest-line: 5.0.0 1960 - wrap-ansi: 9.0.0 1226 + '@babel/parser': 7.28.3 1227 + '@babel/types': 7.28.2 1961 1228 1962 - brotli@1.3.3: 1229 + '@types/babel__traverse@7.28.0': 1963 1230 dependencies: 1964 - base64-js: 1.5.1 1965 - 1966 - camelcase@8.0.0: {} 1967 - 1968 - ccount@2.0.1: {} 1231 + '@babel/types': 7.28.2 1969 1232 1970 - chalk@5.4.1: {} 1233 + '@types/estree@1.0.8': {} 1971 1234 1972 - character-entities-html4@2.1.0: {} 1973 - 1974 - character-entities-legacy@3.0.0: {} 1975 - 1976 - character-entities@2.0.2: {} 1977 - 1978 - chokidar@4.0.3: 1235 + '@types/node@24.3.0': 1979 1236 dependencies: 1980 - readdirp: 4.1.2 1981 - 1982 - ci-info@4.2.0: {} 1237 + undici-types: 7.10.0 1983 1238 1984 - cli-boxes@3.0.0: {} 1985 - 1986 - clone@2.1.2: {} 1987 - 1988 - clsx@2.1.1: {} 1989 - 1990 - color-convert@2.0.1: 1239 + babel-plugin-jsx-dom-expressions@0.40.1(@babel/core@7.28.3): 1991 1240 dependencies: 1992 - color-name: 1.1.4 1993 - optional: true 1241 + '@babel/core': 7.28.3 1242 + '@babel/helper-module-imports': 7.18.6 1243 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) 1244 + '@babel/types': 7.28.2 1245 + html-entities: 2.3.3 1246 + parse5: 7.3.0 1247 + validate-html-nesting: 1.2.3 1994 1248 1995 - color-name@1.1.4: 1996 - optional: true 1997 - 1998 - color-string@1.9.1: 1249 + babel-preset-solid@1.9.9(@babel/core@7.28.3)(solid-js@1.9.9): 1999 1250 dependencies: 2000 - color-name: 1.1.4 2001 - simple-swizzle: 0.2.2 2002 - optional: true 1251 + '@babel/core': 7.28.3 1252 + babel-plugin-jsx-dom-expressions: 0.40.1(@babel/core@7.28.3) 1253 + optionalDependencies: 1254 + solid-js: 1.9.9 2003 1255 2004 - color@4.2.3: 1256 + browserslist@4.25.3: 2005 1257 dependencies: 2006 - color-convert: 2.0.1 2007 - color-string: 1.9.1 2008 - optional: true 1258 + caniuse-lite: 1.0.30001735 1259 + electron-to-chromium: 1.5.207 1260 + node-releases: 2.0.19 1261 + update-browserslist-db: 1.1.3(browserslist@4.25.3) 2009 1262 2010 - comma-separated-tokens@2.0.3: {} 2011 - 2012 - common-ancestor-path@1.0.1: {} 2013 - 2014 - cookie-es@1.2.2: {} 2015 - 2016 - cookie@1.0.2: {} 2017 - 2018 - cross-fetch@3.2.0: 2019 - dependencies: 2020 - node-fetch: 2.7.0 2021 - transitivePeerDependencies: 2022 - - encoding 1263 + caniuse-lite@1.0.30001735: {} 2023 1264 2024 - crossws@0.3.5: 2025 - dependencies: 2026 - uncrypto: 0.1.3 1265 + convert-source-map@2.0.0: {} 2027 1266 2028 - css-tree@3.1.0: 2029 - dependencies: 2030 - mdn-data: 2.12.2 2031 - source-map-js: 1.2.1 2032 - 2033 - cssesc@3.0.0: {} 1267 + csstype@3.1.3: {} 2034 1268 2035 1269 debug@4.4.1: 2036 1270 dependencies: 2037 1271 ms: 2.1.3 2038 1272 2039 - decode-named-character-reference@1.1.0: 2040 - dependencies: 2041 - character-entities: 2.0.2 2042 - 2043 - defu@6.1.4: {} 2044 - 2045 - dequal@2.0.3: {} 2046 - 2047 - destr@2.0.5: {} 2048 - 2049 - detect-libc@2.0.4: 2050 - optional: true 2051 - 2052 - deterministic-object-hash@2.0.2: 2053 - dependencies: 2054 - base-64: 1.0.0 2055 - 2056 - devalue@5.1.1: {} 2057 - 2058 - devlop@1.1.0: 2059 - dependencies: 2060 - dequal: 2.0.3 2061 - 2062 - dfa@1.2.0: {} 2063 - 2064 - diff@5.2.0: {} 2065 - 2066 - dlv@1.1.3: {} 2067 - 2068 - dset@3.1.4: {} 2069 - 2070 - emoji-regex@10.4.0: {} 2071 - 2072 - emoji-regex@8.0.0: {} 1273 + electron-to-chromium@1.5.207: {} 2073 1274 2074 1275 entities@6.0.1: {} 2075 1276 2076 - es-module-lexer@1.7.0: {} 2077 - 2078 - esbuild@0.25.5: 1277 + esbuild@0.25.9: 2079 1278 optionalDependencies: 2080 - '@esbuild/aix-ppc64': 0.25.5 2081 - '@esbuild/android-arm': 0.25.5 2082 - '@esbuild/android-arm64': 0.25.5 2083 - '@esbuild/android-x64': 0.25.5 2084 - '@esbuild/darwin-arm64': 0.25.5 2085 - '@esbuild/darwin-x64': 0.25.5 2086 - '@esbuild/freebsd-arm64': 0.25.5 2087 - '@esbuild/freebsd-x64': 0.25.5 2088 - '@esbuild/linux-arm': 0.25.5 2089 - '@esbuild/linux-arm64': 0.25.5 2090 - '@esbuild/linux-ia32': 0.25.5 2091 - '@esbuild/linux-loong64': 0.25.5 2092 - '@esbuild/linux-mips64el': 0.25.5 2093 - '@esbuild/linux-ppc64': 0.25.5 2094 - '@esbuild/linux-riscv64': 0.25.5 2095 - '@esbuild/linux-s390x': 0.25.5 2096 - '@esbuild/linux-x64': 0.25.5 2097 - '@esbuild/netbsd-arm64': 0.25.5 2098 - '@esbuild/netbsd-x64': 0.25.5 2099 - '@esbuild/openbsd-arm64': 0.25.5 2100 - '@esbuild/openbsd-x64': 0.25.5 2101 - '@esbuild/sunos-x64': 0.25.5 2102 - '@esbuild/win32-arm64': 0.25.5 2103 - '@esbuild/win32-ia32': 0.25.5 2104 - '@esbuild/win32-x64': 0.25.5 2105 - 2106 - escape-string-regexp@5.0.0: {} 2107 - 2108 - estree-walker@2.0.2: {} 2109 - 2110 - estree-walker@3.0.3: 2111 - dependencies: 2112 - '@types/estree': 1.0.8 2113 - 2114 - eventemitter3@5.0.1: {} 1279 + '@esbuild/aix-ppc64': 0.25.9 1280 + '@esbuild/android-arm': 0.25.9 1281 + '@esbuild/android-arm64': 0.25.9 1282 + '@esbuild/android-x64': 0.25.9 1283 + '@esbuild/darwin-arm64': 0.25.9 1284 + '@esbuild/darwin-x64': 0.25.9 1285 + '@esbuild/freebsd-arm64': 0.25.9 1286 + '@esbuild/freebsd-x64': 0.25.9 1287 + '@esbuild/linux-arm': 0.25.9 1288 + '@esbuild/linux-arm64': 0.25.9 1289 + '@esbuild/linux-ia32': 0.25.9 1290 + '@esbuild/linux-loong64': 0.25.9 1291 + '@esbuild/linux-mips64el': 0.25.9 1292 + '@esbuild/linux-ppc64': 0.25.9 1293 + '@esbuild/linux-riscv64': 0.25.9 1294 + '@esbuild/linux-s390x': 0.25.9 1295 + '@esbuild/linux-x64': 0.25.9 1296 + '@esbuild/netbsd-arm64': 0.25.9 1297 + '@esbuild/netbsd-x64': 0.25.9 1298 + '@esbuild/openbsd-arm64': 0.25.9 1299 + '@esbuild/openbsd-x64': 0.25.9 1300 + '@esbuild/openharmony-arm64': 0.25.9 1301 + '@esbuild/sunos-x64': 0.25.9 1302 + '@esbuild/win32-arm64': 0.25.9 1303 + '@esbuild/win32-ia32': 0.25.9 1304 + '@esbuild/win32-x64': 0.25.9 2115 1305 2116 - extend@3.0.2: {} 1306 + escalade@3.2.0: {} 2117 1307 2118 - fast-deep-equal@3.1.3: {} 1308 + esm-env@1.2.2: {} 2119 1309 2120 - fdir@6.4.5(picomatch@4.0.2): 1310 + fdir@6.5.0(picomatch@4.0.3): 2121 1311 optionalDependencies: 2122 - picomatch: 4.0.2 2123 - 2124 - flattie@1.1.1: {} 2125 - 2126 - fontace@0.3.0: 2127 - dependencies: 2128 - '@types/fontkit': 2.0.8 2129 - fontkit: 2.0.4 2130 - 2131 - fontkit@2.0.4: 2132 - dependencies: 2133 - '@swc/helpers': 0.5.17 2134 - brotli: 1.3.3 2135 - clone: 2.1.2 2136 - dfa: 1.2.0 2137 - fast-deep-equal: 3.1.3 2138 - restructure: 3.0.2 2139 - tiny-inflate: 1.0.3 2140 - unicode-properties: 1.4.1 2141 - unicode-trie: 2.0.0 1312 + picomatch: 4.0.3 2142 1313 2143 1314 fsevents@2.3.3: 2144 1315 optional: true 2145 1316 2146 - get-east-asian-width@1.3.0: {} 2147 - 2148 - github-slugger@2.0.0: {} 2149 - 2150 - h3@1.15.3: 2151 - dependencies: 2152 - cookie-es: 1.2.2 2153 - crossws: 0.3.5 2154 - defu: 6.1.4 2155 - destr: 2.0.5 2156 - iron-webcrypto: 1.2.1 2157 - node-mock-http: 1.0.0 2158 - radix3: 1.1.2 2159 - ufo: 1.6.1 2160 - uncrypto: 0.1.3 2161 - 2162 - hast-util-from-html@2.0.3: 2163 - dependencies: 2164 - '@types/hast': 3.0.4 2165 - devlop: 1.1.0 2166 - hast-util-from-parse5: 8.0.3 2167 - parse5: 7.3.0 2168 - vfile: 6.0.3 2169 - vfile-message: 4.0.2 2170 - 2171 - hast-util-from-parse5@8.0.3: 2172 - dependencies: 2173 - '@types/hast': 3.0.4 2174 - '@types/unist': 3.0.3 2175 - devlop: 1.1.0 2176 - hastscript: 9.0.1 2177 - property-information: 7.1.0 2178 - vfile: 6.0.3 2179 - vfile-location: 5.0.3 2180 - web-namespaces: 2.0.1 2181 - 2182 - hast-util-is-element@3.0.0: 2183 - dependencies: 2184 - '@types/hast': 3.0.4 2185 - 2186 - hast-util-parse-selector@4.0.0: 2187 - dependencies: 2188 - '@types/hast': 3.0.4 2189 - 2190 - hast-util-raw@9.1.0: 2191 - dependencies: 2192 - '@types/hast': 3.0.4 2193 - '@types/unist': 3.0.3 2194 - '@ungap/structured-clone': 1.3.0 2195 - hast-util-from-parse5: 8.0.3 2196 - hast-util-to-parse5: 8.0.0 2197 - html-void-elements: 3.0.0 2198 - mdast-util-to-hast: 13.2.0 2199 - parse5: 7.3.0 2200 - unist-util-position: 5.0.0 2201 - unist-util-visit: 5.0.0 2202 - vfile: 6.0.3 2203 - web-namespaces: 2.0.1 2204 - zwitch: 2.0.4 2205 - 2206 - hast-util-to-html@9.0.5: 2207 - dependencies: 2208 - '@types/hast': 3.0.4 2209 - '@types/unist': 3.0.3 2210 - ccount: 2.0.1 2211 - comma-separated-tokens: 2.0.3 2212 - hast-util-whitespace: 3.0.0 2213 - html-void-elements: 3.0.0 2214 - mdast-util-to-hast: 13.2.0 2215 - property-information: 7.1.0 2216 - space-separated-tokens: 2.0.2 2217 - stringify-entities: 4.0.4 2218 - zwitch: 2.0.4 2219 - 2220 - hast-util-to-parse5@8.0.0: 2221 - dependencies: 2222 - '@types/hast': 3.0.4 2223 - comma-separated-tokens: 2.0.3 2224 - devlop: 1.1.0 2225 - property-information: 6.5.0 2226 - space-separated-tokens: 2.0.2 2227 - web-namespaces: 2.0.1 2228 - zwitch: 2.0.4 2229 - 2230 - hast-util-to-text@4.0.2: 2231 - dependencies: 2232 - '@types/hast': 3.0.4 2233 - '@types/unist': 3.0.3 2234 - hast-util-is-element: 3.0.0 2235 - unist-util-find-after: 5.0.0 2236 - 2237 - hast-util-whitespace@3.0.0: 2238 - dependencies: 2239 - '@types/hast': 3.0.4 2240 - 2241 - hastscript@9.0.1: 2242 - dependencies: 2243 - '@types/hast': 3.0.4 2244 - comma-separated-tokens: 2.0.3 2245 - hast-util-parse-selector: 4.0.0 2246 - property-information: 7.1.0 2247 - space-separated-tokens: 2.0.2 2248 - 2249 - html-escaper@3.0.3: {} 2250 - 2251 - html-void-elements@3.0.0: {} 2252 - 2253 - http-cache-semantics@4.2.0: {} 2254 - 2255 - import-meta-resolve@4.1.0: {} 2256 - 2257 - iron-webcrypto@1.2.1: {} 2258 - 2259 - is-arrayish@0.3.2: 2260 - optional: true 2261 - 2262 - is-docker@3.0.0: {} 2263 - 2264 - is-fullwidth-code-point@3.0.0: {} 2265 - 2266 - is-inside-container@1.0.0: 2267 - dependencies: 2268 - is-docker: 3.0.0 2269 - 2270 - is-plain-obj@4.1.0: {} 2271 - 2272 - is-wsl@3.1.0: 2273 - dependencies: 2274 - is-inside-container: 1.0.0 2275 - 2276 - js-yaml@4.1.0: 2277 - dependencies: 2278 - argparse: 2.0.1 2279 - 2280 - kleur@3.0.3: {} 2281 - 2282 - kleur@4.1.5: {} 2283 - 2284 - longest-streak@3.1.0: {} 2285 - 2286 - lru-cache@10.4.3: {} 2287 - 2288 - magic-string@0.30.17: 2289 - dependencies: 2290 - '@jridgewell/sourcemap-codec': 1.5.0 2291 - 2292 - magicast@0.3.5: 2293 - dependencies: 2294 - '@babel/parser': 7.27.5 2295 - '@babel/types': 7.27.6 2296 - source-map-js: 1.2.1 2297 - 2298 - markdown-table@3.0.4: {} 2299 - 2300 - mdast-util-definitions@6.0.0: 2301 - dependencies: 2302 - '@types/mdast': 4.0.4 2303 - '@types/unist': 3.0.3 2304 - unist-util-visit: 5.0.0 2305 - 2306 - mdast-util-find-and-replace@3.0.2: 2307 - dependencies: 2308 - '@types/mdast': 4.0.4 2309 - escape-string-regexp: 5.0.0 2310 - unist-util-is: 6.0.0 2311 - unist-util-visit-parents: 6.0.1 2312 - 2313 - mdast-util-from-markdown@2.0.2: 2314 - dependencies: 2315 - '@types/mdast': 4.0.4 2316 - '@types/unist': 3.0.3 2317 - decode-named-character-reference: 1.1.0 2318 - devlop: 1.1.0 2319 - mdast-util-to-string: 4.0.0 2320 - micromark: 4.0.2 2321 - micromark-util-decode-numeric-character-reference: 2.0.2 2322 - micromark-util-decode-string: 2.0.1 2323 - micromark-util-normalize-identifier: 2.0.1 2324 - micromark-util-symbol: 2.0.1 2325 - micromark-util-types: 2.0.2 2326 - unist-util-stringify-position: 4.0.0 2327 - transitivePeerDependencies: 2328 - - supports-color 2329 - 2330 - mdast-util-gfm-autolink-literal@2.0.1: 2331 - dependencies: 2332 - '@types/mdast': 4.0.4 2333 - ccount: 2.0.1 2334 - devlop: 1.1.0 2335 - mdast-util-find-and-replace: 3.0.2 2336 - micromark-util-character: 2.1.1 2337 - 2338 - mdast-util-gfm-footnote@2.1.0: 2339 - dependencies: 2340 - '@types/mdast': 4.0.4 2341 - devlop: 1.1.0 2342 - mdast-util-from-markdown: 2.0.2 2343 - mdast-util-to-markdown: 2.1.2 2344 - micromark-util-normalize-identifier: 2.0.1 2345 - transitivePeerDependencies: 2346 - - supports-color 2347 - 2348 - mdast-util-gfm-strikethrough@2.0.0: 2349 - dependencies: 2350 - '@types/mdast': 4.0.4 2351 - mdast-util-from-markdown: 2.0.2 2352 - mdast-util-to-markdown: 2.1.2 2353 - transitivePeerDependencies: 2354 - - supports-color 2355 - 2356 - mdast-util-gfm-table@2.0.0: 2357 - dependencies: 2358 - '@types/mdast': 4.0.4 2359 - devlop: 1.1.0 2360 - markdown-table: 3.0.4 2361 - mdast-util-from-markdown: 2.0.2 2362 - mdast-util-to-markdown: 2.1.2 2363 - transitivePeerDependencies: 2364 - - supports-color 2365 - 2366 - mdast-util-gfm-task-list-item@2.0.0: 2367 - dependencies: 2368 - '@types/mdast': 4.0.4 2369 - devlop: 1.1.0 2370 - mdast-util-from-markdown: 2.0.2 2371 - mdast-util-to-markdown: 2.1.2 2372 - transitivePeerDependencies: 2373 - - supports-color 2374 - 2375 - mdast-util-gfm@3.1.0: 2376 - dependencies: 2377 - mdast-util-from-markdown: 2.0.2 2378 - mdast-util-gfm-autolink-literal: 2.0.1 2379 - mdast-util-gfm-footnote: 2.1.0 2380 - mdast-util-gfm-strikethrough: 2.0.0 2381 - mdast-util-gfm-table: 2.0.0 2382 - mdast-util-gfm-task-list-item: 2.0.0 2383 - mdast-util-to-markdown: 2.1.2 2384 - transitivePeerDependencies: 2385 - - supports-color 2386 - 2387 - mdast-util-phrasing@4.1.0: 2388 - dependencies: 2389 - '@types/mdast': 4.0.4 2390 - unist-util-is: 6.0.0 2391 - 2392 - mdast-util-to-hast@13.2.0: 2393 - dependencies: 2394 - '@types/hast': 3.0.4 2395 - '@types/mdast': 4.0.4 2396 - '@ungap/structured-clone': 1.3.0 2397 - devlop: 1.1.0 2398 - micromark-util-sanitize-uri: 2.0.1 2399 - trim-lines: 3.0.1 2400 - unist-util-position: 5.0.0 2401 - unist-util-visit: 5.0.0 2402 - vfile: 6.0.3 2403 - 2404 - mdast-util-to-markdown@2.1.2: 2405 - dependencies: 2406 - '@types/mdast': 4.0.4 2407 - '@types/unist': 3.0.3 2408 - longest-streak: 3.1.0 2409 - mdast-util-phrasing: 4.1.0 2410 - mdast-util-to-string: 4.0.0 2411 - micromark-util-classify-character: 2.0.1 2412 - micromark-util-decode-string: 2.0.1 2413 - unist-util-visit: 5.0.0 2414 - zwitch: 2.0.4 2415 - 2416 - mdast-util-to-string@4.0.0: 2417 - dependencies: 2418 - '@types/mdast': 4.0.4 2419 - 2420 - mdn-data@2.12.2: {} 2421 - 2422 - micromark-core-commonmark@2.0.3: 2423 - dependencies: 2424 - decode-named-character-reference: 1.1.0 2425 - devlop: 1.1.0 2426 - micromark-factory-destination: 2.0.1 2427 - micromark-factory-label: 2.0.1 2428 - micromark-factory-space: 2.0.1 2429 - micromark-factory-title: 2.0.1 2430 - micromark-factory-whitespace: 2.0.1 2431 - micromark-util-character: 2.1.1 2432 - micromark-util-chunked: 2.0.1 2433 - micromark-util-classify-character: 2.0.1 2434 - micromark-util-html-tag-name: 2.0.1 2435 - micromark-util-normalize-identifier: 2.0.1 2436 - micromark-util-resolve-all: 2.0.1 2437 - micromark-util-subtokenize: 2.1.0 2438 - micromark-util-symbol: 2.0.1 2439 - micromark-util-types: 2.0.2 2440 - 2441 - micromark-extension-gfm-autolink-literal@2.1.0: 2442 - dependencies: 2443 - micromark-util-character: 2.1.1 2444 - micromark-util-sanitize-uri: 2.0.1 2445 - micromark-util-symbol: 2.0.1 2446 - micromark-util-types: 2.0.2 1317 + gensync@1.0.0-beta.2: {} 2447 1318 2448 - micromark-extension-gfm-footnote@2.1.0: 2449 - dependencies: 2450 - devlop: 1.1.0 2451 - micromark-core-commonmark: 2.0.3 2452 - micromark-factory-space: 2.0.1 2453 - micromark-util-character: 2.1.1 2454 - micromark-util-normalize-identifier: 2.0.1 2455 - micromark-util-sanitize-uri: 2.0.1 2456 - micromark-util-symbol: 2.0.1 2457 - micromark-util-types: 2.0.2 1319 + html-entities@2.3.3: {} 2458 1320 2459 - micromark-extension-gfm-strikethrough@2.1.0: 2460 - dependencies: 2461 - devlop: 1.1.0 2462 - micromark-util-chunked: 2.0.1 2463 - micromark-util-classify-character: 2.0.1 2464 - micromark-util-resolve-all: 2.0.1 2465 - micromark-util-symbol: 2.0.1 2466 - micromark-util-types: 2.0.2 1321 + is-what@4.1.16: {} 2467 1322 2468 - micromark-extension-gfm-table@2.1.1: 2469 - dependencies: 2470 - devlop: 1.1.0 2471 - micromark-factory-space: 2.0.1 2472 - micromark-util-character: 2.1.1 2473 - micromark-util-symbol: 2.0.1 2474 - micromark-util-types: 2.0.2 1323 + js-tokens@4.0.0: {} 2475 1324 2476 - micromark-extension-gfm-tagfilter@2.0.0: 2477 - dependencies: 2478 - micromark-util-types: 2.0.2 1325 + jsesc@3.1.0: {} 2479 1326 2480 - micromark-extension-gfm-task-list-item@2.1.0: 2481 - dependencies: 2482 - devlop: 1.1.0 2483 - micromark-factory-space: 2.0.1 2484 - micromark-util-character: 2.1.1 2485 - micromark-util-symbol: 2.0.1 2486 - micromark-util-types: 2.0.2 1327 + json5@2.2.3: {} 2487 1328 2488 - micromark-extension-gfm@3.0.0: 1329 + lru-cache@5.1.1: 2489 1330 dependencies: 2490 - micromark-extension-gfm-autolink-literal: 2.1.0 2491 - micromark-extension-gfm-footnote: 2.1.0 2492 - micromark-extension-gfm-strikethrough: 2.1.0 2493 - micromark-extension-gfm-table: 2.1.1 2494 - micromark-extension-gfm-tagfilter: 2.0.0 2495 - micromark-extension-gfm-task-list-item: 2.1.0 2496 - micromark-util-combine-extensions: 2.0.1 2497 - micromark-util-types: 2.0.2 1331 + yallist: 3.1.1 2498 1332 2499 - micromark-factory-destination@2.0.1: 1333 + merge-anything@5.1.7: 2500 1334 dependencies: 2501 - micromark-util-character: 2.1.1 2502 - micromark-util-symbol: 2.0.1 2503 - micromark-util-types: 2.0.2 2504 - 2505 - micromark-factory-label@2.0.1: 2506 - dependencies: 2507 - devlop: 1.1.0 2508 - micromark-util-character: 2.1.1 2509 - micromark-util-symbol: 2.0.1 2510 - micromark-util-types: 2.0.2 2511 - 2512 - micromark-factory-space@2.0.1: 2513 - dependencies: 2514 - micromark-util-character: 2.1.1 2515 - micromark-util-types: 2.0.2 2516 - 2517 - micromark-factory-title@2.0.1: 2518 - dependencies: 2519 - micromark-factory-space: 2.0.1 2520 - micromark-util-character: 2.1.1 2521 - micromark-util-symbol: 2.0.1 2522 - micromark-util-types: 2.0.2 2523 - 2524 - micromark-factory-whitespace@2.0.1: 2525 - dependencies: 2526 - micromark-factory-space: 2.0.1 2527 - micromark-util-character: 2.1.1 2528 - micromark-util-symbol: 2.0.1 2529 - micromark-util-types: 2.0.2 2530 - 2531 - micromark-util-character@2.1.1: 2532 - dependencies: 2533 - micromark-util-symbol: 2.0.1 2534 - micromark-util-types: 2.0.2 2535 - 2536 - micromark-util-chunked@2.0.1: 2537 - dependencies: 2538 - micromark-util-symbol: 2.0.1 2539 - 2540 - micromark-util-classify-character@2.0.1: 2541 - dependencies: 2542 - micromark-util-character: 2.1.1 2543 - micromark-util-symbol: 2.0.1 2544 - micromark-util-types: 2.0.2 2545 - 2546 - micromark-util-combine-extensions@2.0.1: 2547 - dependencies: 2548 - micromark-util-chunked: 2.0.1 2549 - micromark-util-types: 2.0.2 2550 - 2551 - micromark-util-decode-numeric-character-reference@2.0.2: 2552 - dependencies: 2553 - micromark-util-symbol: 2.0.1 2554 - 2555 - micromark-util-decode-string@2.0.1: 2556 - dependencies: 2557 - decode-named-character-reference: 1.1.0 2558 - micromark-util-character: 2.1.1 2559 - micromark-util-decode-numeric-character-reference: 2.0.2 2560 - micromark-util-symbol: 2.0.1 2561 - 2562 - micromark-util-encode@2.0.1: {} 2563 - 2564 - micromark-util-html-tag-name@2.0.1: {} 2565 - 2566 - micromark-util-normalize-identifier@2.0.1: 2567 - dependencies: 2568 - micromark-util-symbol: 2.0.1 2569 - 2570 - micromark-util-resolve-all@2.0.1: 2571 - dependencies: 2572 - micromark-util-types: 2.0.2 2573 - 2574 - micromark-util-sanitize-uri@2.0.1: 2575 - dependencies: 2576 - micromark-util-character: 2.1.1 2577 - micromark-util-encode: 2.0.1 2578 - micromark-util-symbol: 2.0.1 2579 - 2580 - micromark-util-subtokenize@2.1.0: 2581 - dependencies: 2582 - devlop: 1.1.0 2583 - micromark-util-chunked: 2.0.1 2584 - micromark-util-symbol: 2.0.1 2585 - micromark-util-types: 2.0.2 2586 - 2587 - micromark-util-symbol@2.0.1: {} 2588 - 2589 - micromark-util-types@2.0.2: {} 2590 - 2591 - micromark@4.0.2: 2592 - dependencies: 2593 - '@types/debug': 4.1.12 2594 - debug: 4.4.1 2595 - decode-named-character-reference: 1.1.0 2596 - devlop: 1.1.0 2597 - micromark-core-commonmark: 2.0.3 2598 - micromark-factory-space: 2.0.1 2599 - micromark-util-character: 2.1.1 2600 - micromark-util-chunked: 2.0.1 2601 - micromark-util-combine-extensions: 2.0.1 2602 - micromark-util-decode-numeric-character-reference: 2.0.2 2603 - micromark-util-encode: 2.0.1 2604 - micromark-util-normalize-identifier: 2.0.1 2605 - micromark-util-resolve-all: 2.0.1 2606 - micromark-util-sanitize-uri: 2.0.1 2607 - micromark-util-subtokenize: 2.1.0 2608 - micromark-util-symbol: 2.0.1 2609 - micromark-util-types: 2.0.2 2610 - transitivePeerDependencies: 2611 - - supports-color 2612 - 2613 - mrmime@2.0.1: {} 1335 + is-what: 4.1.16 2614 1336 2615 1337 ms@2.1.3: {} 2616 1338 2617 1339 nanoid@3.3.11: {} 2618 1340 2619 - neotraverse@0.6.18: {} 2620 - 2621 - nlcst-to-string@4.0.0: 2622 - dependencies: 2623 - '@types/nlcst': 2.0.3 2624 - 2625 - node-fetch-native@1.6.6: {} 2626 - 2627 - node-fetch@2.7.0: 2628 - dependencies: 2629 - whatwg-url: 5.0.0 2630 - 2631 - node-mock-http@1.0.0: {} 2632 - 2633 - normalize-path@3.0.0: {} 2634 - 2635 - ofetch@1.4.1: 2636 - dependencies: 2637 - destr: 2.0.5 2638 - node-fetch-native: 1.6.6 2639 - ufo: 1.6.1 2640 - 2641 - ohash@2.0.11: {} 2642 - 2643 - oniguruma-parser@0.12.1: {} 2644 - 2645 - oniguruma-to-es@4.3.3: 2646 - dependencies: 2647 - oniguruma-parser: 0.12.1 2648 - regex: 6.0.1 2649 - regex-recursion: 6.0.2 2650 - 2651 - p-limit@6.2.0: 2652 - dependencies: 2653 - yocto-queue: 1.2.1 2654 - 2655 - p-queue@8.1.0: 2656 - dependencies: 2657 - eventemitter3: 5.0.1 2658 - p-timeout: 6.1.4 1341 + nanoid@5.1.5: {} 2659 1342 2660 - p-timeout@6.1.4: {} 2661 - 2662 - package-manager-detector@1.3.0: {} 2663 - 2664 - pako@0.2.9: {} 2665 - 2666 - parse-latin@7.0.0: 2667 - dependencies: 2668 - '@types/nlcst': 2.0.3 2669 - '@types/unist': 3.0.3 2670 - nlcst-to-string: 4.0.0 2671 - unist-util-modify-children: 4.0.0 2672 - unist-util-visit-children: 3.0.0 2673 - vfile: 6.0.3 1343 + node-releases@2.0.19: {} 2674 1344 2675 1345 parse5@7.3.0: 2676 1346 dependencies: ··· 2678 1348 2679 1349 picocolors@1.1.1: {} 2680 1350 2681 - picomatch@2.3.1: {} 1351 + picomatch@4.0.3: {} 2682 1352 2683 - picomatch@4.0.2: {} 2684 - 2685 - postcss@8.5.4: 1353 + postcss@8.5.6: 2686 1354 dependencies: 2687 1355 nanoid: 3.3.11 2688 1356 picocolors: 1.1.1 2689 1357 source-map-js: 1.2.1 2690 1358 2691 - prismjs@1.30.0: {} 1359 + prettier@3.6.2: {} 2692 1360 2693 - prompts@2.4.2: 1361 + rollup@4.46.3: 2694 1362 dependencies: 2695 - kleur: 3.0.3 2696 - sisteransi: 1.0.5 1363 + '@types/estree': 1.0.8 1364 + optionalDependencies: 1365 + '@rollup/rollup-android-arm-eabi': 4.46.3 1366 + '@rollup/rollup-android-arm64': 4.46.3 1367 + '@rollup/rollup-darwin-arm64': 4.46.3 1368 + '@rollup/rollup-darwin-x64': 4.46.3 1369 + '@rollup/rollup-freebsd-arm64': 4.46.3 1370 + '@rollup/rollup-freebsd-x64': 4.46.3 1371 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.3 1372 + '@rollup/rollup-linux-arm-musleabihf': 4.46.3 1373 + '@rollup/rollup-linux-arm64-gnu': 4.46.3 1374 + '@rollup/rollup-linux-arm64-musl': 4.46.3 1375 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.3 1376 + '@rollup/rollup-linux-ppc64-gnu': 4.46.3 1377 + '@rollup/rollup-linux-riscv64-gnu': 4.46.3 1378 + '@rollup/rollup-linux-riscv64-musl': 4.46.3 1379 + '@rollup/rollup-linux-s390x-gnu': 4.46.3 1380 + '@rollup/rollup-linux-x64-gnu': 4.46.3 1381 + '@rollup/rollup-linux-x64-musl': 4.46.3 1382 + '@rollup/rollup-win32-arm64-msvc': 4.46.3 1383 + '@rollup/rollup-win32-ia32-msvc': 4.46.3 1384 + '@rollup/rollup-win32-x64-msvc': 4.46.3 1385 + fsevents: 2.3.3 2697 1386 2698 - property-information@6.5.0: {} 2699 - 2700 - property-information@7.1.0: {} 2701 - 2702 - radix3@1.1.2: {} 2703 - 2704 - readdirp@4.1.2: {} 1387 + semver@6.3.1: {} 2705 1388 2706 - regex-recursion@6.0.2: 1389 + seroval-plugins@1.3.2(seroval@1.3.2): 2707 1390 dependencies: 2708 - regex-utilities: 2.3.0 1391 + seroval: 1.3.2 2709 1392 2710 - regex-utilities@2.3.0: {} 2711 - 2712 - regex@6.0.1: 2713 - dependencies: 2714 - regex-utilities: 2.3.0 2715 - 2716 - rehype-parse@9.0.1: 2717 - dependencies: 2718 - '@types/hast': 3.0.4 2719 - hast-util-from-html: 2.0.3 2720 - unified: 11.0.5 2721 - 2722 - rehype-raw@7.0.0: 2723 - dependencies: 2724 - '@types/hast': 3.0.4 2725 - hast-util-raw: 9.1.0 2726 - vfile: 6.0.3 2727 - 2728 - rehype-stringify@10.0.1: 2729 - dependencies: 2730 - '@types/hast': 3.0.4 2731 - hast-util-to-html: 9.0.5 2732 - unified: 11.0.5 2733 - 2734 - rehype@13.0.2: 2735 - dependencies: 2736 - '@types/hast': 3.0.4 2737 - rehype-parse: 9.0.1 2738 - rehype-stringify: 10.0.1 2739 - unified: 11.0.5 2740 - 2741 - remark-gfm@4.0.1: 2742 - dependencies: 2743 - '@types/mdast': 4.0.4 2744 - mdast-util-gfm: 3.1.0 2745 - micromark-extension-gfm: 3.0.0 2746 - remark-parse: 11.0.0 2747 - remark-stringify: 11.0.0 2748 - unified: 11.0.5 2749 - transitivePeerDependencies: 2750 - - supports-color 1393 + seroval@1.3.2: {} 2751 1394 2752 - remark-parse@11.0.0: 1395 + solid-devtools@0.34.3(solid-js@1.9.9)(vite@6.3.5(@types/node@24.3.0)): 2753 1396 dependencies: 2754 - '@types/mdast': 4.0.4 2755 - mdast-util-from-markdown: 2.0.2 2756 - micromark-util-types: 2.0.2 2757 - unified: 11.0.5 1397 + '@babel/core': 7.28.3 1398 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) 1399 + '@babel/types': 7.28.2 1400 + '@solid-devtools/debugger': 0.28.1(solid-js@1.9.9) 1401 + '@solid-devtools/shared': 0.20.0(solid-js@1.9.9) 1402 + solid-js: 1.9.9 1403 + optionalDependencies: 1404 + vite: 6.3.5(@types/node@24.3.0) 2758 1405 transitivePeerDependencies: 2759 1406 - supports-color 2760 1407 2761 - remark-rehype@11.1.2: 2762 - dependencies: 2763 - '@types/hast': 3.0.4 2764 - '@types/mdast': 4.0.4 2765 - mdast-util-to-hast: 13.2.0 2766 - unified: 11.0.5 2767 - vfile: 6.0.3 2768 - 2769 - remark-smartypants@3.0.2: 2770 - dependencies: 2771 - retext: 9.0.0 2772 - retext-smartypants: 6.2.0 2773 - unified: 11.0.5 2774 - unist-util-visit: 5.0.0 2775 - 2776 - remark-stringify@11.0.0: 2777 - dependencies: 2778 - '@types/mdast': 4.0.4 2779 - mdast-util-to-markdown: 2.1.2 2780 - unified: 11.0.5 2781 - 2782 - restructure@3.0.2: {} 2783 - 2784 - retext-latin@4.0.0: 1408 + solid-js@1.9.9: 2785 1409 dependencies: 2786 - '@types/nlcst': 2.0.3 2787 - parse-latin: 7.0.0 2788 - unified: 11.0.5 1410 + csstype: 3.1.3 1411 + seroval: 1.3.2 1412 + seroval-plugins: 1.3.2(seroval@1.3.2) 2789 1413 2790 - retext-smartypants@6.2.0: 1414 + solid-refresh@0.6.3(solid-js@1.9.9): 2791 1415 dependencies: 2792 - '@types/nlcst': 2.0.3 2793 - nlcst-to-string: 4.0.0 2794 - unist-util-visit: 5.0.0 2795 - 2796 - retext-stringify@4.0.0: 2797 - dependencies: 2798 - '@types/nlcst': 2.0.3 2799 - nlcst-to-string: 4.0.0 2800 - unified: 11.0.5 2801 - 2802 - retext@9.0.0: 2803 - dependencies: 2804 - '@types/nlcst': 2.0.3 2805 - retext-latin: 4.0.0 2806 - retext-stringify: 4.0.0 2807 - unified: 11.0.5 2808 - 2809 - rollup@4.42.0: 2810 - dependencies: 2811 - '@types/estree': 1.0.7 2812 - optionalDependencies: 2813 - '@rollup/rollup-android-arm-eabi': 4.42.0 2814 - '@rollup/rollup-android-arm64': 4.42.0 2815 - '@rollup/rollup-darwin-arm64': 4.42.0 2816 - '@rollup/rollup-darwin-x64': 4.42.0 2817 - '@rollup/rollup-freebsd-arm64': 4.42.0 2818 - '@rollup/rollup-freebsd-x64': 4.42.0 2819 - '@rollup/rollup-linux-arm-gnueabihf': 4.42.0 2820 - '@rollup/rollup-linux-arm-musleabihf': 4.42.0 2821 - '@rollup/rollup-linux-arm64-gnu': 4.42.0 2822 - '@rollup/rollup-linux-arm64-musl': 4.42.0 2823 - '@rollup/rollup-linux-loongarch64-gnu': 4.42.0 2824 - '@rollup/rollup-linux-powerpc64le-gnu': 4.42.0 2825 - '@rollup/rollup-linux-riscv64-gnu': 4.42.0 2826 - '@rollup/rollup-linux-riscv64-musl': 4.42.0 2827 - '@rollup/rollup-linux-s390x-gnu': 4.42.0 2828 - '@rollup/rollup-linux-x64-gnu': 4.42.0 2829 - '@rollup/rollup-linux-x64-musl': 4.42.0 2830 - '@rollup/rollup-win32-arm64-msvc': 4.42.0 2831 - '@rollup/rollup-win32-ia32-msvc': 4.42.0 2832 - '@rollup/rollup-win32-x64-msvc': 4.42.0 2833 - fsevents: 2.3.3 2834 - 2835 - semver@7.7.2: {} 2836 - 2837 - sharp@0.33.5: 2838 - dependencies: 2839 - color: 4.2.3 2840 - detect-libc: 2.0.4 2841 - semver: 7.7.2 2842 - optionalDependencies: 2843 - '@img/sharp-darwin-arm64': 0.33.5 2844 - '@img/sharp-darwin-x64': 0.33.5 2845 - '@img/sharp-libvips-darwin-arm64': 1.0.4 2846 - '@img/sharp-libvips-darwin-x64': 1.0.4 2847 - '@img/sharp-libvips-linux-arm': 1.0.5 2848 - '@img/sharp-libvips-linux-arm64': 1.0.4 2849 - '@img/sharp-libvips-linux-s390x': 1.0.4 2850 - '@img/sharp-libvips-linux-x64': 1.0.4 2851 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 2852 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 2853 - '@img/sharp-linux-arm': 0.33.5 2854 - '@img/sharp-linux-arm64': 0.33.5 2855 - '@img/sharp-linux-s390x': 0.33.5 2856 - '@img/sharp-linux-x64': 0.33.5 2857 - '@img/sharp-linuxmusl-arm64': 0.33.5 2858 - '@img/sharp-linuxmusl-x64': 0.33.5 2859 - '@img/sharp-wasm32': 0.33.5 2860 - '@img/sharp-win32-ia32': 0.33.5 2861 - '@img/sharp-win32-x64': 0.33.5 2862 - optional: true 2863 - 2864 - shiki@3.6.0: 2865 - dependencies: 2866 - '@shikijs/core': 3.6.0 2867 - '@shikijs/engine-javascript': 3.6.0 2868 - '@shikijs/engine-oniguruma': 3.6.0 2869 - '@shikijs/langs': 3.6.0 2870 - '@shikijs/themes': 3.6.0 2871 - '@shikijs/types': 3.6.0 2872 - '@shikijs/vscode-textmate': 10.0.2 2873 - '@types/hast': 3.0.4 2874 - 2875 - simple-swizzle@0.2.2: 2876 - dependencies: 2877 - is-arrayish: 0.3.2 2878 - optional: true 2879 - 2880 - sisteransi@1.0.5: {} 2881 - 2882 - smol-toml@1.3.4: {} 1416 + '@babel/generator': 7.28.3 1417 + '@babel/helper-module-imports': 7.27.1 1418 + '@babel/types': 7.28.2 1419 + solid-js: 1.9.9 1420 + transitivePeerDependencies: 1421 + - supports-color 2883 1422 2884 1423 source-map-js@1.2.1: {} 2885 1424 2886 - space-separated-tokens@2.0.2: {} 2887 - 2888 - string-width@4.2.3: 2889 - dependencies: 2890 - emoji-regex: 8.0.0 2891 - is-fullwidth-code-point: 3.0.0 2892 - strip-ansi: 6.0.1 2893 - 2894 - string-width@7.2.0: 2895 - dependencies: 2896 - emoji-regex: 10.4.0 2897 - get-east-asian-width: 1.3.0 2898 - strip-ansi: 7.1.0 2899 - 2900 - stringify-entities@4.0.4: 2901 - dependencies: 2902 - character-entities-html4: 2.1.0 2903 - character-entities-legacy: 3.0.0 2904 - 2905 - strip-ansi@6.0.1: 2906 - dependencies: 2907 - ansi-regex: 5.0.1 2908 - 2909 - strip-ansi@7.1.0: 2910 - dependencies: 2911 - ansi-regex: 6.1.0 2912 - 2913 - tiny-inflate@1.0.3: {} 2914 - 2915 - tinyexec@0.3.2: {} 2916 - 2917 1425 tinyglobby@0.2.14: 2918 1426 dependencies: 2919 - fdir: 6.4.5(picomatch@4.0.2) 2920 - picomatch: 4.0.2 2921 - 2922 - tr46@0.0.3: {} 2923 - 2924 - trim-lines@3.0.1: {} 2925 - 2926 - trough@2.2.0: {} 2927 - 2928 - tsconfck@3.1.6(typescript@5.8.3): 2929 - optionalDependencies: 2930 - typescript: 5.8.3 2931 - 2932 - tslib@2.8.1: {} 2933 - 2934 - type-fest@4.41.0: {} 2935 - 2936 - typescript@5.8.3: {} 2937 - 2938 - ufo@1.6.1: {} 2939 - 2940 - ultrahtml@1.6.0: {} 2941 - 2942 - uncrypto@0.1.3: {} 2943 - 2944 - undici-types@6.21.0: {} 2945 - 2946 - unicode-properties@1.4.1: 2947 - dependencies: 2948 - base64-js: 1.5.1 2949 - unicode-trie: 2.0.0 2950 - 2951 - unicode-trie@2.0.0: 2952 - dependencies: 2953 - pako: 0.2.9 2954 - tiny-inflate: 1.0.3 2955 - 2956 - unified@11.0.5: 2957 - dependencies: 2958 - '@types/unist': 3.0.3 2959 - bail: 2.0.2 2960 - devlop: 1.1.0 2961 - extend: 3.0.2 2962 - is-plain-obj: 4.1.0 2963 - trough: 2.2.0 2964 - vfile: 6.0.3 1427 + fdir: 6.5.0(picomatch@4.0.3) 1428 + picomatch: 4.0.3 2965 1429 2966 - unifont@0.5.0: 2967 - dependencies: 2968 - css-tree: 3.1.0 2969 - ohash: 2.0.11 1430 + typescript@5.9.2: {} 2970 1431 2971 - unist-util-find-after@5.0.0: 2972 - dependencies: 2973 - '@types/unist': 3.0.3 2974 - unist-util-is: 6.0.0 1432 + undici-types@7.10.0: {} 2975 1433 2976 - unist-util-is@6.0.0: 1434 + update-browserslist-db@1.1.3(browserslist@4.25.3): 2977 1435 dependencies: 2978 - '@types/unist': 3.0.3 1436 + browserslist: 4.25.3 1437 + escalade: 3.2.0 1438 + picocolors: 1.1.1 2979 1439 2980 - unist-util-modify-children@4.0.0: 2981 - dependencies: 2982 - '@types/unist': 3.0.3 2983 - array-iterate: 2.0.1 1440 + validate-html-nesting@1.2.3: {} 2984 1441 2985 - unist-util-position@5.0.0: 1442 + vite-plugin-solid@2.11.8(solid-js@1.9.9)(vite@6.3.5(@types/node@24.3.0)): 2986 1443 dependencies: 2987 - '@types/unist': 3.0.3 1444 + '@babel/core': 7.28.3 1445 + '@types/babel__core': 7.20.5 1446 + babel-preset-solid: 1.9.9(@babel/core@7.28.3)(solid-js@1.9.9) 1447 + merge-anything: 5.1.7 1448 + solid-js: 1.9.9 1449 + solid-refresh: 0.6.3(solid-js@1.9.9) 1450 + vite: 6.3.5(@types/node@24.3.0) 1451 + vitefu: 1.1.1(vite@6.3.5(@types/node@24.3.0)) 1452 + transitivePeerDependencies: 1453 + - supports-color 2988 1454 2989 - unist-util-remove-position@5.0.0: 1455 + vite@6.3.5(@types/node@24.3.0): 2990 1456 dependencies: 2991 - '@types/unist': 3.0.3 2992 - unist-util-visit: 5.0.0 2993 - 2994 - unist-util-stringify-position@4.0.0: 2995 - dependencies: 2996 - '@types/unist': 3.0.3 2997 - 2998 - unist-util-visit-children@3.0.0: 2999 - dependencies: 3000 - '@types/unist': 3.0.3 3001 - 3002 - unist-util-visit-parents@6.0.1: 3003 - dependencies: 3004 - '@types/unist': 3.0.3 3005 - unist-util-is: 6.0.0 3006 - 3007 - unist-util-visit@5.0.0: 3008 - dependencies: 3009 - '@types/unist': 3.0.3 3010 - unist-util-is: 6.0.0 3011 - unist-util-visit-parents: 6.0.1 3012 - 3013 - unstorage@1.16.0: 3014 - dependencies: 3015 - anymatch: 3.1.3 3016 - chokidar: 4.0.3 3017 - destr: 2.0.5 3018 - h3: 1.15.3 3019 - lru-cache: 10.4.3 3020 - node-fetch-native: 1.6.6 3021 - ofetch: 1.4.1 3022 - ufo: 1.6.1 3023 - 3024 - vfile-location@5.0.3: 3025 - dependencies: 3026 - '@types/unist': 3.0.3 3027 - vfile: 6.0.3 3028 - 3029 - vfile-message@4.0.2: 3030 - dependencies: 3031 - '@types/unist': 3.0.3 3032 - unist-util-stringify-position: 4.0.0 3033 - 3034 - vfile@6.0.3: 3035 - dependencies: 3036 - '@types/unist': 3.0.3 3037 - vfile-message: 4.0.2 3038 - 3039 - vite@6.3.5(@types/node@22.15.30): 3040 - dependencies: 3041 - esbuild: 0.25.5 3042 - fdir: 6.4.5(picomatch@4.0.2) 3043 - picomatch: 4.0.2 3044 - postcss: 8.5.4 3045 - rollup: 4.42.0 1457 + esbuild: 0.25.9 1458 + fdir: 6.5.0(picomatch@4.0.3) 1459 + picomatch: 4.0.3 1460 + postcss: 8.5.6 1461 + rollup: 4.46.3 3046 1462 tinyglobby: 0.2.14 3047 1463 optionalDependencies: 3048 - '@types/node': 22.15.30 1464 + '@types/node': 24.3.0 3049 1465 fsevents: 2.3.3 3050 1466 3051 - vitefu@1.0.6(vite@6.3.5(@types/node@22.15.30)): 1467 + vitefu@1.1.1(vite@6.3.5(@types/node@24.3.0)): 3052 1468 optionalDependencies: 3053 - vite: 6.3.5(@types/node@22.15.30) 3054 - 3055 - web-namespaces@2.0.1: {} 3056 - 3057 - webidl-conversions@3.0.1: {} 3058 - 3059 - whatwg-url@5.0.0: 3060 - dependencies: 3061 - tr46: 0.0.3 3062 - webidl-conversions: 3.0.1 3063 - 3064 - which-pm-runs@1.1.0: {} 1469 + vite: 6.3.5(@types/node@24.3.0) 3065 1470 3066 - widest-line@5.0.0: 3067 - dependencies: 3068 - string-width: 7.2.0 3069 - 3070 - wrap-ansi@9.0.0: 3071 - dependencies: 3072 - ansi-styles: 6.2.1 3073 - string-width: 7.2.0 3074 - strip-ansi: 7.1.0 3075 - 3076 - xxhash-wasm@1.1.0: {} 3077 - 3078 - yargs-parser@21.1.1: {} 3079 - 3080 - yocto-queue@1.2.1: {} 3081 - 3082 - yocto-spinner@0.2.3: 3083 - dependencies: 3084 - yoctocolors: 2.1.1 3085 - 3086 - yoctocolors@2.1.1: {} 3087 - 3088 - zod-to-json-schema@3.24.5(zod@3.25.56): 3089 - dependencies: 3090 - zod: 3.25.56 3091 - 3092 - zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.25.56): 3093 - dependencies: 3094 - typescript: 5.8.3 3095 - zod: 3.25.56 3096 - 3097 - zod@3.25.56: {} 3098 - 3099 - zwitch@2.0.4: {} 1471 + yallist@3.1.1: {}
-1
frontend/pnpm-workspace.yaml
··· 1 1 onlyBuiltDependencies: 2 2 - esbuild 3 - - sharp
-9
frontend/public/favicon.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128"> 2 - <path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" /> 3 - <style> 4 - path { fill: #000; } 5 - @media (prefers-color-scheme: dark) { 6 - path { fill: #FFF; } 7 - } 8 - </style> 9 - </svg>
frontend/public/images/404.png

This is a binary file and will not be displayed.

+12
frontend/public/oauth/client-metadata.json
··· 1 + { 2 + "client_id": "https://clippr.social/oauth/client-metadata.json", 3 + "client_name": "Clippr", 4 + "client_uri": "https://clippr.social", 5 + "redirect_uris": ["https://clippr.social/"], 6 + "scope": "atproto blob?accept=image/* repo:social.clippr.actor.profile repo:social.clippr.feed.clip repo:social.clippr.feed.tag", 7 + "grant_types": ["authorization_code", "refresh_token"], 8 + "response_types": ["code"], 9 + "token_endpoint_auth_method": "none", 10 + "application_type": "web", 11 + "dpop_bound_access_tokens": true 12 + }
frontend/src/assets/favicon.ico

This is a binary file and will not be displayed.

-18
frontend/src/components/Clip.astro
··· 1 - --- 2 - import TagList from "./TagList.astro"; 3 - const { title, tagList, link, description, originalClipper, firstClipDate } = Astro.props; 4 - --- 5 - <div class="clip"> 6 - <div class="clip-head"> 7 - <h2 class="clip-title"><a href={link}>{title}</a></h2> 8 - <TagList tags={tagList} /> 9 - </div> 10 - <small class="clip-link"><a href={link}>{link}</a></small> 11 - <p class="clip-description">{description}</p> 12 - <div class="clip-actions"> 13 - <a href="#">clip</a> 14 - <a href="#">respond</a> 15 - <a href="#">hide</a> 16 - <span class="original-clipper">[first clipped by <a href="#">@{originalClipper}</a> {firstClipDate} ago]</span> 17 - </div> 18 - </div>
-9
frontend/src/components/SidebarItem.astro
··· 1 - --- 2 - const {title} = Astro.props; 3 - --- 4 - <div class="sidebar-item"> 5 - <h2>{title}</h2> 6 - <div class="sidebar-content"> 7 - <slot /> 8 - </div> 9 - </div>
-12
frontend/src/components/TagList.astro
··· 1 - --- 2 - const {tags} = Astro.props; 3 - let tags_arr; 4 - if (typeof tags !== 'undefined') { 5 - tags_arr = tags.split(','); 6 - } 7 - --- 8 - <div class="clip-tags"> 9 - { 10 - tags_arr?.map((element: string) => (<small>{element}</small>)) 11 - } 12 - </div>
+24
frontend/src/components/footer.tsx
··· 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 + const Footer = () => { 8 + return ( 9 + <footer> 10 + <div id="footer-left"> 11 + <p>copyright ยฉ 2025 clippr contributors</p> 12 + </div> 13 + <div id="footer-right"> 14 + <nav> 15 + <a href="https://bsky.app/profile/did:web:clippr.social">bluesky</a> 16 + <a href="https://pol.is/8cijewmm37">feedback</a> 17 + <a href="https://tangled.sh/@hexmani.ac/clippr">git</a> 18 + </nav> 19 + </div> 20 + </footer> 21 + ); 22 + }; 23 + 24 + export { Footer };
+34
frontend/src/components/header.tsx
··· 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 { agent, loginState } from "./loginForm.tsx"; 8 + import { A } from "@solidjs/router"; 9 + 10 + const Header = () => { 11 + return ( 12 + <header> 13 + <div id="header-left"> 14 + <A href={loginState() ? "/home" : "/"}> 15 + <p class="silent-link">clippr (beta)</p> 16 + </A> 17 + </div> 18 + <div id="header-right"> 19 + <nav> 20 + {loginState() ? ( 21 + <> 22 + <A href={`/profile/${agent.sub}`}>profile</A> 23 + <A href="/settings">settings</A> 24 + </> 25 + ) : ( 26 + <A href="/login">login</A> 27 + )} 28 + </nav> 29 + </div> 30 + </header> 31 + ); 32 + }; 33 + 34 + export { Header };
+141
frontend/src/components/loginForm.tsx
··· 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 { 8 + configureOAuth, 9 + createAuthorizationUrl, 10 + deleteStoredSession, 11 + finalizeAuthorization, 12 + getSession, 13 + OAuthUserAgent, 14 + resolveFromIdentity, 15 + resolveFromService, 16 + Session, 17 + } from "@atcute/oauth-browser-client"; 18 + import { createSignal } from "solid-js"; 19 + import { Did, isHandle } from "@atcute/lexicons/syntax"; 20 + 21 + configureOAuth({ 22 + metadata: { 23 + client_id: import.meta.env.VITE_OAUTH_CLIENT_ID, 24 + redirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URI, 25 + }, 26 + }); 27 + 28 + export const [loginState, setLoginState] = createSignal(false); 29 + let agent: OAuthUserAgent; 30 + 31 + const LoginForm = () => { 32 + const [notice, setNotice] = createSignal(""); 33 + const [loginInput, setLoginInput] = createSignal(""); 34 + 35 + const login = async (handle: string) => { 36 + try { 37 + if (!handle) return; 38 + let resolved; 39 + document.getElementById("submitDetails")!.removeAttribute("hidden"); 40 + document 41 + .querySelector('button[type="submit"]')! 42 + .setAttribute("disabled", "true"); 43 + if (!isHandle(handle)) { 44 + setNotice(`Resolving your service...`); 45 + resolved = await resolveFromService(handle); 46 + } else { 47 + setNotice(`Resolving your identity...`); 48 + resolved = await resolveFromIdentity(handle); 49 + } 50 + 51 + setNotice(`Contacting your data server...`); 52 + const authUrl = await createAuthorizationUrl({ 53 + scope: import.meta.env.VITE_OAUTH_SCOPE, 54 + ...resolved, 55 + }); 56 + 57 + setNotice(`Redirecting...`); 58 + await new Promise((resolve) => setTimeout(resolve, 500)); 59 + 60 + location.assign(authUrl); 61 + } catch (e: unknown) { 62 + if (e instanceof Error) { 63 + console.error(e); 64 + setNotice(`${e.message}`); 65 + } else { 66 + console.error(e); 67 + setNotice(`Unknown error, check console ยฏ\\_(ใƒ„)_/ยฏ`); 68 + } 69 + } 70 + }; 71 + 72 + return ( 73 + <> 74 + <form onclick={(e) => e.preventDefault()}> 75 + <label for="handle">Bluesky handle or DID</label> 76 + <input 77 + type="text" 78 + name="handle" 79 + id="handle" 80 + placeholder="alice.bsky.social" 81 + onInput={(e) => setLoginInput(e.currentTarget.value)} 82 + /> 83 + <button type="submit" onclick={() => login(loginInput())}> 84 + log in 85 + </button> 86 + </form> 87 + <p id="submitDetails" hidden> 88 + {notice()} 89 + </p> 90 + </> 91 + ); 92 + }; 93 + 94 + const retrieveSession = async (): Promise<void> => { 95 + const init = async (): Promise<Session | undefined> => { 96 + const params = new URLSearchParams(location.hash.slice(1)); 97 + 98 + if (params.has("state") && (params.has("code") || params.has("error"))) { 99 + history.replaceState(null, "", location.pathname + location.search); 100 + 101 + const session = await finalizeAuthorization(params); 102 + console.log("Finalizing authorization...", session); 103 + const agent = new OAuthUserAgent(session); 104 + console.log(await agent.getSession()); 105 + const did = session.info.sub; 106 + 107 + localStorage.setItem("currentUser", did); 108 + return session; 109 + } else { 110 + const currentUser = localStorage.getItem("currentUser"); 111 + 112 + if (currentUser) { 113 + try { 114 + console.log("Retrieving session..."); 115 + return await getSession(currentUser as Did); 116 + } catch (err) { 117 + deleteStoredSession(currentUser as Did); 118 + localStorage.removeItem("currentUser"); 119 + throw err; 120 + } 121 + } 122 + } 123 + }; 124 + 125 + const session = await init().catch(() => {}); 126 + 127 + if (session) { 128 + console.log("Retrieved session!", session); 129 + agent = new OAuthUserAgent(session); 130 + setLoginState(true); 131 + } 132 + }; 133 + 134 + const killSession = async (): Promise<void> => { 135 + await agent.signOut(); 136 + setLoginState(false); 137 + localStorage.removeItem("currentUser"); 138 + location.href = "/"; 139 + }; 140 + 141 + export { LoginForm, retrieveSession, agent, killSession };
+52
frontend/src/components/pageLocation.tsx
··· 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 { splitProps } from "solid-js"; 8 + 9 + // How to define the path because I forgot how to and struggled for half an hour: 10 + // ``` 11 + // [ 12 + // { 13 + // name: "home", 14 + // link: "/" 15 + // } 16 + // ] 17 + // ``` 18 + type PathItem = { 19 + name: string; 20 + link: string; 21 + }; 22 + 23 + const PageLocation = (props: any) => { 24 + const [local, others] = splitProps(props, ["lastLocation", "path"]); 25 + const path = local.path; 26 + 27 + if (typeof path === "undefined") { 28 + return ( 29 + <div id="page-location"> 30 + <p id="page-location-last">{local.lastLocation || "blank"}</p> 31 + </div> 32 + ); 33 + } 34 + 35 + return ( 36 + <div id="page-location"> 37 + {path.map((item: PathItem) => { 38 + return ( 39 + <> 40 + <p class="page-location-parent" {...others}> 41 + <a href={item.link || ""}>{item.name}</a> 42 + </p> 43 + <p>โ†’</p> 44 + </> 45 + ); 46 + })} 47 + <p id="page-location-last">{local.lastLocation || "blank"}</p> 48 + </div> 49 + ); 50 + }; 51 + 52 + export { PageLocation };
+185
frontend/src/components/profileEditor.tsx
··· 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 { createResource, createSignal } from "solid-js"; 8 + import { Client, ClientResponse } from "@atcute/client"; 9 + import { remove } from "@mary/exif-rm"; 10 + import { agent } from "./loginForm.tsx"; 11 + import { fetchProfile } from "../utils/profile.ts"; 12 + 13 + const ProfileEditor = () => { 14 + const [actor, setActor] = createSignal(); 15 + const [avatarPreview, setAvatarPreview] = createSignal(""); 16 + const [notice, setNotice] = createSignal(""); 17 + let formRef: HTMLFormElement = document.createElement("form"); 18 + 19 + setActor(agent.session.info.sub); 20 + const [profile] = createResource(actor, fetchProfile); 21 + 22 + const uploadBlob = async () => { 23 + setNotice(""); 24 + console.log("starting avatar upload..."); 25 + let blob: Blob; 26 + 27 + const file = (document.getElementById("avatar") as HTMLInputElement) 28 + ?.files?.[0]; 29 + if (!file) return; 30 + 31 + if (!file.type.startsWith("image/")) { 32 + setNotice("error: avatar must be an image"); 33 + console.log(file); 34 + return; 35 + } 36 + 37 + if (file.size > 1000000) { 38 + setNotice("error: avatar must be less than 1MB"); 39 + console.log(file); 40 + return; 41 + } 42 + 43 + blob = file; 44 + console.log("removing exif data..."); 45 + const exifRemoved = remove(new Uint8Array(await blob.arrayBuffer())); 46 + if (exifRemoved !== null) { 47 + // @ts-ignore 48 + blob = new Blob([exifRemoved], { type: blob.type }); 49 + } 50 + 51 + console.log(blob); 52 + 53 + const rpc = new Client({ handler: agent! }); 54 + setNotice("uploading avatar..."); 55 + const uploadRes: ClientResponse<any, any> = await rpc.post( 56 + // @ts-ignore 57 + "com.atproto.repo.uploadBlob", 58 + { 59 + input: blob, 60 + }, 61 + ); 62 + (document.getElementById("avatar") as HTMLInputElement).value = ""; 63 + if (!uploadRes.ok) { 64 + setNotice(uploadRes.data.error); 65 + return; 66 + } 67 + setNotice(""); 68 + setAvatarPreview(URL.createObjectURL(blob)); 69 + 70 + console.log(uploadRes.data); 71 + localStorage.setItem("avatar", JSON.stringify(uploadRes.data.blob)); 72 + }; 73 + 74 + const applyProfileChanges = async (formData: FormData) => { 75 + const rpc = new Client({ handler: agent! }); 76 + 77 + const avatar = localStorage.getItem("avatar"); 78 + 79 + if (avatar === null) { 80 + setNotice("error: avatar is missing"); 81 + return; 82 + } 83 + 84 + const displayName = formData.get("displayName") as string; 85 + if (displayName === null || displayName === "") { 86 + setNotice("error: display name is missing"); 87 + return; 88 + } 89 + 90 + if (displayName.length > 64) { 91 + setNotice("error: display name is too long"); 92 + return; 93 + } 94 + 95 + let description = formData.get("description") as string; 96 + if (description === null || description === "") { 97 + description = "This user does not have a bio."; 98 + } 99 + 100 + if (description.length > 500) { 101 + setNotice("error: description is too long"); 102 + return; 103 + } 104 + 105 + try { 106 + // @ts-ignore 107 + const res = await rpc.post("com.atproto.repo.putRecord", { 108 + input: { 109 + repo: agent!.sub, 110 + collection: "social.clippr.actor.profile", 111 + rkey: "self", 112 + record: { 113 + $type: "social.clippr.actor.profile", 114 + avatar: JSON.parse(avatar), 115 + displayName: formData.get("displayName"), 116 + description: formData.get("description") || "", 117 + // TODO: Take 'createdAt' string from previous version if it exists 118 + createdAt: new Date().toISOString(), 119 + }, 120 + }, 121 + }); 122 + 123 + if (!res.ok) { 124 + setNotice(res.data.error); 125 + return; 126 + } 127 + } catch (e: any) { 128 + setNotice(e.message); 129 + return; 130 + } 131 + 132 + setNotice("profile changed!"); 133 + localStorage.removeItem("avatar"); 134 + }; 135 + 136 + return ( 137 + <div> 138 + <form ref={formRef}> 139 + <label for="avatar" class="file-upload"> 140 + upload avatar 141 + </label> 142 + <input 143 + type="file" 144 + name="avatar" 145 + id="avatar" 146 + accept=".jpg,.jpeg,.png,image/jpeg,image/png" 147 + onChange={() => uploadBlob()} 148 + /> 149 + <img class="profile-picture" src={avatarPreview()} alt="The user's uploaded avatar." hidden={avatarPreview() === ""} /> 150 + <label for="displayName">display name</label> 151 + <input 152 + type="text" 153 + name="displayName" 154 + id="displayName" 155 + maxLength="64" 156 + placeholder="Alice" 157 + value={profile()?.displayName || ""} 158 + /> 159 + <label for="description">bio</label> 160 + <textarea 161 + name="description" 162 + id="description" 163 + maxLength="500" 164 + placeholder="describe yourself..." 165 + value={profile()?.description || ""} 166 + ></textarea> 167 + <button 168 + type="submit" 169 + onClick={(e) => { 170 + e.preventDefault(); 171 + // @ts-ignore 172 + applyProfileChanges(new FormData(formRef)).then(); 173 + }} 174 + > 175 + apply changes 176 + </button> 177 + </form> 178 + <p id="submitDetails" hidden={notice() === null}> 179 + {notice()} 180 + </p> 181 + </div> 182 + ); 183 + }; 184 + 185 + export { ProfileEditor };
+60
frontend/src/components/profileWidget.tsx
··· 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 { 8 + createResource, 9 + Match, 10 + Show, 11 + splitProps, 12 + Switch, 13 + } from "solid-js"; 14 + import { agent } from "./loginForm.tsx"; 15 + import { fetchProfile } from "../utils/profile.ts"; 16 + 17 + interface ProfileProps { 18 + actor?: string; 19 + } 20 + 21 + const ProfileWidget = (props: ProfileProps) => { 22 + const [local] = splitProps(props, ["actor"]); 23 + const actor = () => local.actor ?? agent.session.info.sub; 24 + 25 + 26 + const [profile] = createResource(actor, fetchProfile); 27 + 28 + return ( 29 + <div> 30 + <Show when={profile.loading}> 31 + <p>loading...</p> 32 + </Show> 33 + <Switch> 34 + <Match when={profile.error}> 35 + <p>error: {profile.error.message}</p> 36 + </Match> 37 + <Match when={profile()}> 38 + <div id="profile-view"> 39 + <img 40 + src={profile()?.avatar} 41 + class="profile-picture" 42 + alt="The user's avatar." 43 + /> 44 + <div> 45 + <p> 46 + <b>{profile()?.displayName}</b> 47 + </p> 48 + <p title={profile()?.did}> 49 + {profile()?.handle.replace("at://", "@")} 50 + </p> 51 + <p>{profile()?.description}</p> 52 + </div> 53 + </div> 54 + </Match> 55 + </Switch> 56 + </div> 57 + ); 58 + }; 59 + 60 + export { ProfileWidget };
+31
frontend/src/index.tsx
··· 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 + /* @refresh reload */ 8 + import { render } from "solid-js/web"; 9 + import { Route, Router } from "@solidjs/router"; 10 + import { Layout } from "./layout.tsx"; 11 + import { LandingPage } from "./views/landingPage.tsx"; 12 + import { Login } from "./views/login.tsx"; 13 + import { NotFound } from "./views/notFound.tsx"; 14 + import { Home } from "./views/home.tsx"; 15 + import "solid-devtools"; 16 + import { Profile } from "./views/profile.tsx"; 17 + import { Settings } from "./views/settings.tsx"; 18 + 19 + render( 20 + () => ( 21 + <Router root={Layout}> 22 + <Route path="/" component={LandingPage} /> 23 + <Route path="/login" component={Login} /> 24 + <Route path="/home" component={Home} /> 25 + <Route path={["/profile/:id", "/profile"]} component={Profile} /> 26 + <Route path="/settings" component={Settings} /> 27 + <Route path="*paramName" component={NotFound} /> 28 + </Router> 29 + ), 30 + document.getElementById("root") as HTMLElement, 31 + );
+35
frontend/src/layout.tsx
··· 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 { RouteSectionProps } from "@solidjs/router"; 8 + import { Header } from "./components/header.tsx"; 9 + import { Footer } from "./components/footer.tsx"; 10 + import { onMount, createSignal, Show } from "solid-js"; 11 + import { loginState, retrieveSession } from "./components/loginForm.tsx"; 12 + 13 + const Layout = (props: RouteSectionProps<unknown>) => { 14 + const [isLoading, setIsLoading] = createSignal(true); 15 + 16 + onMount(async () => { 17 + await retrieveSession(); 18 + if (loginState() && location.pathname === "/") { 19 + window.location.href = "/home"; 20 + } 21 + setIsLoading(false); 22 + }); 23 + 24 + return ( 25 + <Show when={!isLoading()} fallback={<></>}> 26 + <> 27 + <Header /> 28 + {props.children} 29 + <Footer /> 30 + </> 31 + </Show> 32 + ); 33 + }; 34 + 35 + export { Layout };
-20
frontend/src/layouts/Base.astro
··· 1 - --- 2 - const { title } = Astro.props; 3 - import '../styles/main.css'; 4 - --- 5 - <!doctype html> 6 - <!-- 7 - * clippr: a social bookmarking service for the AT Protocol 8 - * Copyright (c) 2025 clippr contributors. 9 - * SPDX-License-Identifier: AGPL-3.0-only 10 - --> 11 - <html lang="en"> 12 - <head> 13 - <meta charset="UTF-8"/> 14 - <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 15 - <title>{title} | clippr</title> 16 - </head> 17 - <body> 18 - <slot /> 19 - </body> 20 - </html>
-20
frontend/src/layouts/Footer.astro
··· 1 - --- 2 - --- 3 - <footer> 4 - <small> 5 - shoutout popbob! | ยฉ 2025 clippr contributors | <a href="https://tangled.sh/@noob.quest/clippr">source code</a> 6 - </small> 7 - </footer> 8 - 9 - <style> 10 - footer { 11 - background-color: #ddd; 12 - padding: 1em 0; 13 - color: black; 14 - text-align: center; 15 - 16 - a { 17 - color: revert; 18 - } 19 - } 20 - </style>
-10
frontend/src/layouts/Header.astro
··· 1 - --- 2 - --- 3 - <header id="header-navbar"> 4 - <h1>clippr (beta!)</h1> 5 - <ul> 6 - <li><a href="/">home</a></li> 7 - <li><a href="/about">about</a></li> 8 - <li><a href="/login">login</a></li> 9 - </ul> 10 - </header>
-32
frontend/src/pages/404.astro
··· 1 - --- 2 - import Base from "../layouts/Base.astro"; 3 - import Header from "../layouts/Header.astro"; 4 - import Footer from "../layouts/Footer.astro"; 5 - --- 6 - <Base title="404"> 7 - <Header/> 8 - <main class="404-page"> 9 - <h2>404 | page not found</h2> 10 - <p>the party seems to be over...</p> 11 - <a href="/">ยซ go home</a> 12 - </main> 13 - <Footer/> 14 - </Base> 15 - 16 - <style> 17 - main { 18 - display: flex !important; 19 - flex-direction: column !important; 20 - gap: 0.1rem; 21 - align-items: center; 22 - justify-content: center; 23 - } 24 - 25 - h2, p { 26 - margin: 0.5rem 0; 27 - } 28 - 29 - a { 30 - color: revert; 31 - } 32 - </style>
-12
frontend/src/pages/about.astro
··· 1 - --- 2 - import Base from "../layouts/Base.astro"; 3 - import Header from "../layouts/Header.astro"; 4 - import Footer from "../layouts/Footer.astro"; 5 - --- 6 - <Base title="about"> 7 - <Header/> 8 - <main> 9 - <p>Fill in later!</p> 10 - </main> 11 - <Footer/> 12 - </Base>
-36
frontend/src/pages/index.astro
··· 1 - --- 2 - import Base from '../layouts/Base.astro'; 3 - import Header from "../layouts/Header.astro"; 4 - import Footer from "../layouts/Footer.astro"; 5 - import Clip from "../components/Clip.astro"; 6 - import SidebarItem from "../components/SidebarItem.astro"; 7 - --- 8 - <Base title="home"> 9 - <Header/> 10 - <main> 11 - <div id="main-content"> 12 - <div id="clip-list"> 13 - <Clip title="google" link="https://google.com" tagList="technology,search,google" 14 - description="tests woah" 15 - originalClipper="popbob.com" firstClipDate="30m"/> 16 - </div> 17 - </div> 18 - <div id="sidebar"> 19 - <SidebarItem title="what is clippr?"> 20 - <p>clippr is a bookmarking site that doubles as a news aggregator.</p> 21 - <p>using your bookmarks (or "clips") and their associated tags, a constantly updated news feed is 22 - created based on what users are clipping to their collection.</p> 23 - <a href="/about">learn more ยป</a> 24 - </SidebarItem> 25 - <SidebarItem title="stats"> 26 - <h3>clips</h3> 27 - <p class="item-counter">0</p> 28 - <h3>sites</h3> 29 - <p class="item-counter">0</p> 30 - <h3>users</h3> 31 - <p class="item-counter">0</p> 32 - </SidebarItem> 33 - </div> 34 - </main> 35 - <Footer/> 36 - </Base>
-95
frontend/src/pages/login.astro
··· 1 - --- 2 - import Base from '../layouts/Base.astro'; 3 - import Header from "../layouts/Header.astro"; 4 - import Footer from "../layouts/Footer.astro"; 5 - --- 6 - <Base title="login"> 7 - <Header/> 8 - <main> 9 - <div id="oauth-login"> 10 - <h2>log in</h2> 11 - <p>Enter your Bluesky handle.</p> 12 - <form> 13 - <label for="handle">handle</label> 14 - <input type="text" id="handle" name="handle" placeholder="handle"> 15 - <input type="submit" value="Authenticate"> 16 - </form> 17 - </div> 18 - <!--<p id="or">or...</p>--> 19 - <!--<div id="bluesky-login">--> 20 - <!-- <h2>use your bluesky account</h2>--> 21 - <!-- <button id="bluesky-login-button">login to bluesky</button>--> 22 - <!--</div>--> 23 - </main> 24 - <Footer/> 25 - </Base> 26 - 27 - <style> 28 - main { 29 - display: flex !important; 30 - flex-direction: column; 31 - align-items: center; 32 - justify-content: center; 33 - gap: 1rem; 34 - } 35 - 36 - form { 37 - display: flex; 38 - flex-direction: column; 39 - justify-content: center; 40 - 41 - label { 42 - text-align: center; 43 - font-weight: bold; 44 - margin-bottom: 0.5rem; 45 - } 46 - 47 - input[type="submit"] { 48 - margin: 1rem 0 0 0; 49 - padding: 0.5rem 0; 50 - width: 50%; 51 - align-self: center; 52 - } 53 - } 54 - 55 - a { 56 - color: revert; 57 - } 58 - 59 - #or { 60 - border: 2px black solid; 61 - padding: 0.5rem 2rem; 62 - margin: 0; 63 - font-weight: bold; 64 - } 65 - 66 - h2 { 67 - text-align: center; 68 - } 69 - 70 - #bluesky-login { 71 - display: flex; 72 - flex-direction: column; 73 - justify-content: center; 74 - align-items: center; 75 - 76 - h2 { 77 - margin: 1rem 0; 78 - margin-top: 0; 79 - } 80 - } 81 - 82 - #bluesky-login-button { 83 - background: linear-gradient(deepskyblue, lightskyblue); 84 - border: none; 85 - border-radius: 10px; 86 - font-weight: bold; 87 - padding: 1rem 2rem; 88 - } 89 - 90 - #bluesky-login-button:hover { 91 - cursor: pointer; 92 - filter: brightness(90%); 93 - transition: filter 0.3s ease-in-out; 94 - } 95 - </style>
+264
frontend/src/styles/index.css
··· 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 + :root { 8 + color-scheme: dark light; 9 + font-family: Arial, sans-serif; 10 + } 11 + 12 + @media (prefers-color-scheme: dark) { 13 + :root { 14 + --bg: #222 !important; 15 + --fg: #fff !important; 16 + --controls-bg: #2B2A33 !important; 17 + --controls-bg-hover: #52525E !important; 18 + --controls-border: #8F8F9D !important; 19 + } 20 + } 21 + 22 + @media (prefers-color-scheme: light) { 23 + :root { 24 + --bg: #fff !important; 25 + --fg: #222 !important; 26 + --controls-bg: #E9E9ED !important; 27 + --controls-bg-hover: #D0D0D7 !important; 28 + --controls-border: #8F8F9D !important; 29 + } 30 + } 31 + 32 + body { 33 + background-color: var(--bg); 34 + color: var(--fg); 35 + width: 70vw; 36 + margin: 1rem auto; 37 + } 38 + 39 + header { 40 + display: flex; 41 + justify-content: space-between; 42 + align-items: center; 43 + padding: 0 1rem; 44 + border-bottom: 1px solid var(--fg); 45 + 46 + #header-left { 47 + font-weight: bold; 48 + } 49 + 50 + #header-right nav { 51 + display: inline-flex; 52 + align-items: center; 53 + justify-content: space-between; 54 + gap: 1rem; 55 + } 56 + } 57 + 58 + main { 59 + margin: 1rem; 60 + } 61 + 62 + #main-headings { 63 + h1 { 64 + margin: 0; 65 + } 66 + 67 + margin: 1rem 0 1rem 0; 68 + } 69 + 70 + #page-location { 71 + display: flex; 72 + align-items: start; 73 + gap: 0.5rem; 74 + padding: 0 0 0 0.5rem; 75 + border: 1px solid var(--fg); 76 + 77 + p { 78 + margin: 0; 79 + padding: 0.5rem 0; 80 + } 81 + } 82 + 83 + #page-location-last { 84 + font-weight: bold; 85 + } 86 + 87 + #content { 88 + display: flex; 89 + flex-direction: row; 90 + gap: 2rem; 91 + justify-content: space-between; 92 + } 93 + 94 + #main-content { 95 + h3 { 96 + margin: 0; 97 + } 98 + 99 + p { 100 + line-height: 1.5; 101 + } 102 + } 103 + 104 + #sidebar { 105 + display: flex; 106 + flex-direction: column; 107 + gap: 1rem; 108 + } 109 + 110 + .centered { 111 + text-align: center; 112 + margin: 0 auto; 113 + } 114 + 115 + .sidebar-item { 116 + border: 1px solid var(--fg); 117 + display: flex; 118 + flex-direction: column; 119 + align-items: center; 120 + justify-content: space-between; 121 + padding: 0.5rem; 122 + text-align: center; 123 + 124 + h3 { 125 + margin: 0.5rem 0 1rem 0; 126 + } 127 + 128 + h4 { 129 + margin: 0; 130 + } 131 + } 132 + 133 + .stat-counter { 134 + font-weight: bold; 135 + font-size: 1.5rem; 136 + margin: 0.5rem 0; 137 + } 138 + 139 + form { 140 + display: flex; 141 + flex-direction: column; 142 + align-items: center; 143 + gap: 0.5rem; 144 + 145 + input { 146 + padding: 0.25rem; 147 + margin: 0.5rem; 148 + } 149 + } 150 + 151 + button { 152 + padding: 0.25rem 2rem; 153 + margin: 0 0 0.5rem 0; 154 + } 155 + 156 + footer { 157 + display: flex; 158 + justify-content: space-between; 159 + align-items: center; 160 + padding: 0 1rem; 161 + border-top: 1px solid var(--fg); 162 + 163 + #footer-right nav { 164 + display: inline-flex; 165 + align-items: center; 166 + justify-content: space-between; 167 + gap: 1rem; 168 + } 169 + } 170 + 171 + a { 172 + text-decoration: none; 173 + color: #8c8cfe; 174 + } 175 + 176 + a:hover { 177 + font-style: italic; 178 + font-weight: bold; 179 + cursor: pointer; 180 + } 181 + 182 + a:visited { 183 + color: #8c8cfe; 184 + } 185 + 186 + .silent-link { 187 + color: var(--fg); 188 + 189 + &:hover { 190 + font-style: revert; 191 + font-weight: revert; 192 + } 193 + } 194 + 195 + #profile-view { 196 + display: flex; 197 + flex-direction: row; 198 + align-items: center; 199 + gap: 2rem; 200 + 201 + div { 202 + text-align: left; 203 + } 204 + 205 + * { 206 + margin: 0.5rem 0; 207 + } 208 + } 209 + 210 + .profile-picture { 211 + border-radius: 50%; 212 + width: 150px; 213 + height: 150px; 214 + } 215 + 216 + form input[type="file"] { 217 + display: none; 218 + } 219 + 220 + .file-upload { 221 + border: 1px solid var(--controls-border); 222 + display: inline-block; 223 + padding: 6px 12px; 224 + background-color: var(--controls-bg); 225 + border-radius: 6px; 226 + margin: 0.5rem 0; 227 + } 228 + 229 + .file-upload:hover { 230 + background-color: var(--controls-bg-hover); 231 + } 232 + 233 + textarea { 234 + padding: 0.5rem; 235 + width: 275px; 236 + height: 100px; 237 + font-family: Arial, sans-serif; 238 + } 239 + 240 + @media (max-width: 768px) { 241 + body { 242 + width: 90vw; 243 + } 244 + 245 + header { 246 + flex-direction: column; 247 + padding-bottom: 1rem; 248 + } 249 + 250 + #content { 251 + flex-direction: column; 252 + } 253 + 254 + #profile-view { 255 + flex-direction: column; 256 + align-items: center; 257 + gap: 0.1rem; 258 + } 259 + 260 + footer { 261 + flex-direction: column; 262 + text-align: center; 263 + } 264 + }
-184
frontend/src/styles/main.css
··· 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 - body { 8 - margin: 2rem auto; 9 - font-family: Arial, sans-serif; 10 - background-color: #bbb; 11 - width: 63%; 12 - } 13 - 14 - @media (max-width: 768px) { 15 - body { 16 - margin: auto; 17 - width: 100%; 18 - } 19 - } 20 - 21 - header { 22 - background-image: linear-gradient(#455372, #2b3854); 23 - color: white; 24 - display: flex; 25 - flex-direction: row; 26 - align-items: center; 27 - justify-content: space-between; 28 - padding: 0.5rem 1rem; 29 - 30 - h1 { 31 - font-size: 1rem; 32 - } 33 - 34 - ul { 35 - list-style-type: none; 36 - margin: 0; 37 - display: flex; 38 - flex-direction: row; 39 - gap: 1.5rem; 40 - } 41 - } 42 - 43 - a { 44 - text-decoration: none; 45 - color: white; 46 - } 47 - 48 - a:hover { 49 - font-style: italic; 50 - } 51 - 52 - main { 53 - background-color: white; 54 - background-clip: border-box; 55 - padding: 1rem 0.5rem; 56 - 57 - display: grid; 58 - grid-template-columns: 70% 30%; 59 - } 60 - 61 - #clip-list { 62 - margin: 0 0.5rem; 63 - 64 - .clip:first-of-type { 65 - margin: 0; 66 - } 67 - 68 - .clip { 69 - margin: 1.5rem 0; 70 - } 71 - } 72 - 73 - .clip { 74 - display: grid; 75 - grid-template-columns: auto; 76 - grid-template-rows: auto; 77 - grid-gap: 0.5rem; 78 - 79 - a { 80 - color: revert; 81 - } 82 - 83 - .clip-head { 84 - display: flex; 85 - flex-direction: row; 86 - align-items: center; 87 - gap: 1rem; 88 - 89 - h2 { 90 - margin: 0; 91 - } 92 - 93 - grid-column: 1; 94 - grid-row: 1; 95 - } 96 - 97 - .clip-link { 98 - grid-column: 1; 99 - grid-row: 2; 100 - } 101 - 102 - .clip-description { 103 - grid-column: 1; 104 - grid-row: 3; 105 - 106 - font-size: 0.8rem; 107 - margin: 0.25rem 0; 108 - } 109 - 110 - .clip-tags { 111 - margin: 0; 112 - } 113 - 114 - .clip-tags * { 115 - background: linear-gradient(#ffe076, #fff0cb) !important; 116 - padding: 0.25rem; 117 - margin: 0 0.25rem !important; 118 - border-radius: 0.34rem; 119 - border: 0.09rem solid black; 120 - } 121 - 122 - .clip-actions { 123 - display: flex; 124 - flex-direction: row; 125 - gap: 0.5rem; 126 - font-size: 0.8rem; 127 - 128 - grid-column: 1; 129 - grid-row: 4; 130 - } 131 - 132 - .original-clipper { 133 - color: #777 !important; 134 - } 135 - } 136 - 137 - #sidebar { 138 - margin: 0 1rem; 139 - } 140 - 141 - .sidebar-content { 142 - background-color: #bbbbbb; 143 - display: flex; 144 - flex-direction: column; 145 - align-items: center; 146 - justify-content: center; 147 - 148 - h3, p { 149 - margin: 0.5rem; 150 - } 151 - 152 - .item-counter { 153 - font-size: 2rem; 154 - } 155 - } 156 - 157 - .sidebar-item { 158 - padding: 0.5rem 0; 159 - 160 - h2 { 161 - margin: 0.5rem 0; 162 - } 163 - 164 - a { 165 - align-self: start; 166 - color: revert; 167 - padding: 0.5rem 0.5rem; 168 - } 169 - 170 - a:hover { 171 - font-style: revert; 172 - text-decoration: underline; 173 - } 174 - } 175 - 176 - .sidebar-item:first-of-type { 177 - padding-top: 0; 178 - 179 - h2 { 180 - margin-top: 0; 181 - } 182 - } 183 - 184 -
+19
frontend/src/types.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 + export type ErrorResponse = { 8 + error: string; 9 + message: string; 10 + }; 11 + 12 + export type ProfileViewQuery = Object & { 13 + did: string; 14 + handle: string; 15 + displayName: string; 16 + avatar: string; 17 + description: string; 18 + createdAt: string; 19 + }
+83
frontend/src/utils/profile.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 { ErrorResponse, ProfileViewQuery } from "../types.ts"; 8 + import { 9 + CompositeDidDocumentResolver, 10 + DocumentNotFoundError, 11 + FailedDocumentResolutionError, 12 + HandleResolutionError, 13 + ImproperDidError, 14 + PlcDidDocumentResolver, 15 + UnsupportedDidMethodError, 16 + WebDidDocumentResolver, 17 + } from "@atcute/identity-resolver"; 18 + 19 + export const fetchProfile = async (actor: any): Promise<ProfileViewQuery> => { 20 + const response: Response = await fetch( 21 + `${import.meta.env.VITE_CLIPPR_APPVIEW}/xrpc/social.clippr.actor.getProfile?actor=${actor}`, 22 + ); 23 + 24 + if (response.status !== 200) { 25 + if (response.status === 400) { 26 + const json: ErrorResponse = await response.json(); 27 + console.log(json); 28 + throw new Error(json.message); 29 + } else { 30 + throw new Error(response.statusText); 31 + } 32 + } 33 + 34 + return response.json(); 35 + }; 36 + 37 + export const convertDidToHandle = async (did: string): Promise<string> => { 38 + let convertedDid; 39 + if (did.startsWith("did:plc:")) { 40 + convertedDid = did as `did:plc:${string}`; 41 + } else convertedDid = did as `did:web:${string}`; 42 + const docResolver = new CompositeDidDocumentResolver({ 43 + methods: { 44 + plc: new PlcDidDocumentResolver(), 45 + web: new WebDidDocumentResolver(), 46 + }, 47 + }); 48 + 49 + let doc; 50 + 51 + try { 52 + doc = await docResolver.resolve(convertedDid); 53 + } catch (err) { 54 + if (err instanceof DocumentNotFoundError) { 55 + throw new Error("Document not found"); 56 + } 57 + if (err instanceof UnsupportedDidMethodError) { 58 + throw new Error("Unsupported did method"); 59 + } 60 + if (err instanceof ImproperDidError) { 61 + throw new Error("Improper did"); 62 + } 63 + if (err instanceof FailedDocumentResolutionError) { 64 + throw new Error("Failed document resolution"); 65 + } 66 + if (err instanceof HandleResolutionError) { 67 + throw new Error("Generic handle resolution error"); 68 + } 69 + } 70 + 71 + if (doc === undefined) { 72 + throw new Error("Could not get DID document"); 73 + } 74 + 75 + if (doc.alsoKnownAs === undefined) { 76 + throw new Error("No handles found"); 77 + } 78 + if (doc.alsoKnownAs[0] === undefined) { 79 + throw new Error("No handles found"); 80 + } 81 + 82 + return doc.alsoKnownAs[0].substring(doc.alsoKnownAs[0].lastIndexOf("/") + 1); 83 + };
+28
frontend/src/views/home.tsx
··· 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 { loginState } from "../components/loginForm.tsx"; 8 + import { ProfileWidget } from "../components/profileWidget.tsx"; 9 + import { PageLocation } from "../components/pageLocation.tsx"; 10 + 11 + const Home = () => { 12 + if (!loginState()) { 13 + location.href = "/login"; 14 + } 15 + 16 + return ( 17 + <main> 18 + <PageLocation lastLocation={"home"} /> 19 + <div id="content"> 20 + <div id="main-content" class="centered"> 21 + <ProfileWidget /> 22 + </div> 23 + </div> 24 + </main> 25 + ); 26 + }; 27 + 28 + export { Home };
+86
frontend/src/views/landingPage.tsx
··· 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 { LoginForm } from "../components/loginForm.tsx"; 8 + 9 + const LandingPage = () => { 10 + return ( 11 + <> 12 + <main> 13 + <div id="main-headings"> 14 + <h1>clippr</h1> 15 + <h2>social bookmarking for the AT Protocol</h2> 16 + </div> 17 + 18 + <div id="content"> 19 + <div id="main-content"> 20 + <h3>what is clippr?</h3> 21 + <p> 22 + Clippr is an application based on the{" "} 23 + <a href="https://atproto.com">AT Protocol</a> that allows you to 24 + bookmark, organize and share links with your friends. 25 + </p> 26 + <h3>is this app ready yet?</h3> 27 + <p> 28 + While you can use it right now, the application is still in{" "} 29 + <i>heavy</i> development, and things will eventually break. We do 30 + not recommend using Clippr as your primary bookmarking tool until 31 + it is out of beta. 32 + </p> 33 + <h3>what is the AT Protocol?</h3> 34 + <p> 35 + The AT Protocol (or "ATproto" for short) is a decentralized social 36 + networking protocol designed to allow users to have a single, 37 + portable identity across multiple interoperable applications. It 38 + is used mainly by the microblogging app Bluesky, but anyone can 39 + build an application that uses the protocol, even if it isn't 40 + related to Bluesky. 41 + </p> 42 + <h3> 43 + what's different about clippr compared to [other social 44 + bookmarking app]? 45 + </h3> 46 + <p> 47 + The main difference between Clippr and other bookmarking 48 + application such as Pocket, Instapaper, Wallabag, Linkding or 49 + Pinboard is that your data isn't locked to a specific platform. 50 + Anyone can build an extension or application that is interoperable 51 + with Clippr's API and data structures (or any other application), 52 + and we encourage you to do so. 53 + <br /> 54 + <br /> 55 + All of our code is available as{" "} 56 + <a href="https://tangled.sh/@hexmani.ac/clippr">free software</a>, 57 + and we provide a{" "} 58 + <a href="https://www.npmjs.com/package/@clipprjs/lexicons"> 59 + NPM package 60 + </a>{" "} 61 + to make it easier to develop with Clippr. 62 + </p> 63 + </div> 64 + 65 + <div id="sidebar"> 66 + <div class="sidebar-item"> 67 + <h3>log in</h3> 68 + <LoginForm /> 69 + </div> 70 + <div class="sidebar-item"> 71 + <h3>stats</h3> 72 + <h4>clips</h4> 73 + <p class="stat-counter">0</p> 74 + <h4>tags</h4> 75 + <p class="stat-counter">0</p> 76 + <h4>users</h4> 77 + <p class="stat-counter">0</p> 78 + </div> 79 + </div> 80 + </div> 81 + </main> 82 + </> 83 + ); 84 + }; 85 + 86 + export { LandingPage };
+29
frontend/src/views/login.tsx
··· 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 { LoginForm, loginState } from "../components/loginForm.tsx"; 8 + 9 + const Login = () => { 10 + // TODO: Fix weird transition states 11 + if (loginState()) { 12 + location.href = "/home"; 13 + } 14 + 15 + return ( 16 + <> 17 + <main> 18 + <div id="content"> 19 + <div id="main-content" class="centered"> 20 + <h2>login</h2> 21 + <LoginForm /> 22 + </div> 23 + </div> 24 + </main> 25 + </> 26 + ); 27 + }; 28 + 29 + export { Login };
+27
frontend/src/views/notFound.tsx
··· 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 { loginState } from "../components/loginForm.tsx"; 8 + 9 + const NotFound = () => { 10 + return ( 11 + <> 12 + <main> 13 + <div id="content"> 14 + <div id="main-content" class="centered"> 15 + <h2>404 | page not found</h2> 16 + <p>the party seems to be over...</p> 17 + <a href={loginState() ? "/home" : "/"}>go home</a> 18 + <br /> 19 + <br /> 20 + </div> 21 + </div> 22 + </main> 23 + </> 24 + ); 25 + }; 26 + 27 + export { NotFound };
+47
frontend/src/views/profile.tsx
··· 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 { createAsync, useParams } from "@solidjs/router"; 8 + import { PageLocation } from "../components/pageLocation.tsx"; 9 + import { ProfileWidget } from "../components/profileWidget.tsx"; 10 + import { agent, loginState } from "../components/loginForm.tsx"; 11 + import { convertDidToHandle } from "../utils/profile.ts"; 12 + 13 + const Profile = () => { 14 + const params = useParams(); 15 + 16 + // Authentication check for profile route catch-all 17 + if (!loginState() && location.pathname === "/profile") { 18 + location.href = "/login"; 19 + } 20 + 21 + let handle; 22 + try { 23 + handle = createAsync(() => convertDidToHandle(params.id || agent.sub)); 24 + } catch (e) { 25 + console.error(e); 26 + handle = null; 27 + } 28 + 29 + return ( 30 + <main> 31 + <PageLocation 32 + path={[{ name: "home", link: `${loginState() ? "/home" : "/"}` }]} 33 + lastLocation={handle || params.id} 34 + /> 35 + <div id="main-headings"> 36 + <h1>profile</h1> 37 + </div> 38 + <div id="content"> 39 + <div id="main-content" class="centered"> 40 + <ProfileWidget actor={params.id} /> 41 + </div> 42 + </div> 43 + </main> 44 + ); 45 + }; 46 + 47 + export { Profile };
+31
frontend/src/views/settings.tsx
··· 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 { ProfileEditor } from "../components/profileEditor.tsx"; 8 + import { killSession, loginState } from "../components/loginForm.tsx"; 9 + import { PageLocation } from "../components/pageLocation.tsx"; 10 + 11 + const Settings = () => { 12 + if (!loginState()) { 13 + location.href = "/login"; 14 + } 15 + 16 + return ( 17 + <main> 18 + <PageLocation lastLocation={"settings"} /> 19 + <div id="content"> 20 + <div id="main-content" class="centered"> 21 + <h2>account settings</h2> 22 + <button onclick={killSession}>Log out</button> 23 + <h2>edit profile</h2> 24 + <ProfileEditor /> 25 + </div> 26 + </div> 27 + </main> 28 + ); 29 + }; 30 + 31 + export { Settings };
+24
frontend/src/vite-env.d.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 + interface ImportMetaEnv { 8 + readonly VITE_DEV_SERVER_PORT?: string; 9 + 10 + /// OAuth environment variables 11 + readonly VITE_CLIENT_URI: string; 12 + readonly VITE_OAUTH_CLIENT_ID: string; 13 + readonly VITE_OAUTH_REDIRECT_URI: string; 14 + readonly VITE_OAUTH_SCOPE: string; 15 + 16 + /// Clippr-related environment variables 17 + /// 18 + /// A URL for where the clippr appview is hosted 19 + readonly VITE_CLIPPR_APPVIEW: string; 20 + } 21 + 22 + interface ImportMeta { 23 + readonly env: ImportMetaEnv; 24 + }
+26
frontend/tsconfig.app.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ESNext", 4 + "useDefineForClassFields": true, 5 + "module": "ESNext", 6 + "lib": ["ESNext", "DOM", "DOM.Iterable"], 7 + "types": [], 8 + "skipLibCheck": true, 9 + 10 + /* Bundler mode */ 11 + "moduleResolution": "bundler", 12 + "allowImportingTsExtensions": true, 13 + "isolatedModules": true, 14 + "moduleDetection": "force", 15 + "noEmit": true, 16 + "jsx": "preserve", 17 + "jsxImportSource": "solid-js", 18 + 19 + /* Linting */ 20 + "strict": true, 21 + "noUnusedLocals": true, 22 + "noUnusedParameters": true, 23 + "noFallthroughCasesInSwitch": true 24 + }, 25 + "include": ["src"] 26 + }
+5 -3
frontend/tsconfig.json
··· 1 1 { 2 - "extends": "astro/tsconfigs/strictest", 3 - "include": [".astro/types.d.ts", "**/*"], 4 - "exclude": ["dist"] 2 + "files": [], 3 + "references": [ 4 + { "path": "./tsconfig.app.json" }, 5 + { "path": "./tsconfig.node.json" }, 6 + ], 5 7 }
+23
frontend/tsconfig.node.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ESNext", 4 + "lib": ["ESNext"], 5 + "types": ["node"], 6 + "module": "ESNext", 7 + "skipLibCheck": true, 8 + 9 + /* Bundler mode */ 10 + "moduleResolution": "bundler", 11 + "allowImportingTsExtensions": true, 12 + "isolatedModules": true, 13 + "moduleDetection": "force", 14 + "noEmit": true, 15 + 16 + /* Linting */ 17 + "strict": true, 18 + "noUnusedLocals": true, 19 + "noUnusedParameters": true, 20 + "noFallthroughCasesInSwitch": true 21 + }, 22 + "include": ["vite.config.ts"] 23 + }
+58
frontend/vite.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 + import { defineConfig } from "vite"; 8 + import solidPlugin from "vite-plugin-solid"; 9 + import metadata from "./public/oauth/client-metadata.json"; 10 + import { devtoolsPlugin } from "solid-devtools/vite"; 11 + 12 + const SERVER_HOST = "127.0.0.1"; 13 + const SERVER_PORT = 3000; 14 + 15 + export default defineConfig({ 16 + plugins: [ 17 + devtoolsPlugin({ 18 + autoname: true, 19 + }), 20 + solidPlugin(), 21 + { 22 + // Shamelessly stolen from PDSls: https://github.com/notjuliet/pdsls/blob/main/vite.config.ts 23 + name: "oauth", 24 + config(_conf, { command }) { 25 + if (command === "build") { 26 + process.env.VITE_OAUTH_CLIENT_ID = metadata.client_id; 27 + process.env.VITE_OAUTH_REDIRECT_URI = metadata.redirect_uris[0]; 28 + process.env.VITE_CLIPPR_APPVIEW = "https://api.clippr.social"; 29 + } else { 30 + const redirectUri = ((): string => { 31 + const url = new URL(metadata.redirect_uris[0]); 32 + return `http://${SERVER_HOST}:${SERVER_PORT}${url.pathname}`; 33 + })(); 34 + 35 + const clientId = 36 + `http://localhost` + 37 + `?redirect_uri=${encodeURIComponent(redirectUri)}` + 38 + `&scope=${encodeURIComponent(metadata.scope)}`; 39 + 40 + process.env.VITE_DEV_SERVER_PORT = "" + SERVER_PORT; 41 + process.env.VITE_OAUTH_CLIENT_ID = clientId; 42 + process.env.VITE_OAUTH_REDIRECT_URI = redirectUri; 43 + process.env.VITE_CLIPPR_APPVIEW = `http://localhost:9090`; 44 + } 45 + 46 + process.env.VITE_CLIENT_URI = metadata.client_uri; 47 + process.env.VITE_OAUTH_SCOPE = metadata.scope; 48 + }, 49 + }, 50 + ], 51 + server: { 52 + host: SERVER_HOST, 53 + port: SERVER_PORT, 54 + }, 55 + build: { 56 + target: "esnext", 57 + }, 58 + });
-41
lexdocs/clippr/social/clippr/actor/defs.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.actor.defs", 4 - "defs": { 5 - "profileView": { 6 - "type": "object", 7 - "required": [ 8 - "did", 9 - "handle" 10 - ], 11 - "properties": { 12 - "did": { 13 - "type": "string", 14 - "format": "did" 15 - }, 16 - "handle": { 17 - "type": "string", 18 - "format": "handle" 19 - }, 20 - "displayName": { 21 - "type": "string", 22 - "maxGraphemes": 64, 23 - "maxLength": 640 24 - }, 25 - "description": { 26 - "type": "string", 27 - "maxGraphemes": 500, 28 - "maxLength": 5000 29 - }, 30 - "avatar": { 31 - "type": "string", 32 - "format": "uri" 33 - }, 34 - "createdAt": { 35 - "type": "string", 36 - "format": "datetime" 37 - } 38 - } 39 - } 40 - } 41 - }
-30
lexdocs/clippr/social/clippr/actor/getProfile.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.actor.getProfile", 4 - "defs": { 5 - "main": { 6 - "type": "query", 7 - "description": "Get profile view of an actor. Does not require auth.", 8 - "parameters": { 9 - "type": "params", 10 - "required": [ 11 - "actor" 12 - ], 13 - "properties": { 14 - "actor": { 15 - "type": "string", 16 - "format": "at-identifier", 17 - "description": "Handle or DID of account to fetch profile of." 18 - } 19 - } 20 - }, 21 - "output": { 22 - "encoding": "application/json", 23 - "schema": { 24 - "type": "ref", 25 - "ref": "social.clippr.actor.defs#profileView" 26 - } 27 - } 28 - } 29 - } 30 - }
-45
lexdocs/clippr/social/clippr/actor/profile.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.actor.profile", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "description": "A declaration of a Clippr account's profile.", 8 - "key": "literal:self", 9 - "record": { 10 - "type": "object", 11 - "required": [ 12 - "createdAt", 13 - "displayName" 14 - ], 15 - "properties": { 16 - "displayName": { 17 - "type": "string", 18 - "description": "A display name to be shown on a profile.", 19 - "maxGraphemes": 64, 20 - "maxLength": 640 21 - }, 22 - "description": { 23 - "type": "string", 24 - "description": "Text for user to describe themselves", 25 - "maxGraphemes": 500, 26 - "maxLength": 5000 27 - }, 28 - "avatar": { 29 - "type": "blob", 30 - "description": "Image to show on user's profiles.", 31 - "accept": [ 32 - "image/png", 33 - "image/jpeg" 34 - ], 35 - "maxSize": 1000000 36 - }, 37 - "createdAt": { 38 - "type": "string", 39 - "format": "datetime" 40 - } 41 - } 42 - } 43 - } 44 - } 45 - }
-79
lexdocs/clippr/social/clippr/feed/clip.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.feed.clip", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "description": "Record containing a bookmark item, or 'clip'.", 8 - "key": "any", 9 - "record": { 10 - "type": "object", 11 - "required": [ 12 - "url", 13 - "title", 14 - "description", 15 - "unlisted", 16 - "createdAt" 17 - ], 18 - "properties": { 19 - "url": { 20 - "type": "string", 21 - "description": "The URL of the bookmark. Cannot be left empty or be modified after creation.", 22 - "maxGraphemes": 2000, 23 - "maxLength": 20000 24 - }, 25 - "title": { 26 - "type": "string", 27 - "description": "The title of the bookmark. If left empty, reuse the URL.", 28 - "maxGraphemes": 2048, 29 - "maxLength": 20480 30 - }, 31 - "description": { 32 - "type": "string", 33 - "description": "A description of the bookmark's content. This should be ripped from the URL metadata and be static for all records using the URL.", 34 - "maxGraphemes": 4096, 35 - "maxLength": 40960 36 - }, 37 - "notes": { 38 - "type": "string", 39 - "description": "User-written notes for the bookmark. Public and personal.", 40 - "maxGraphemes": 10000, 41 - "maxLength": 100000 42 - }, 43 - "tags": { 44 - "type": "array", 45 - "description": "An array of tags. A format of solely alphanumeric characters and dashes should be used.", 46 - "items": { 47 - "type": "ref", 48 - "ref": "com.atproto.repo.strongRef" 49 - } 50 - }, 51 - "unlisted": { 52 - "type": "boolean", 53 - "description": "Whether the bookmark can be used for feed indexing and aggregation.", 54 - "default": false 55 - }, 56 - "unread": { 57 - "type": "boolean", 58 - "description": "Whether the bookmark has been read by the user.", 59 - "default": true 60 - }, 61 - "languages": { 62 - "type": "array", 63 - "description": "Indicates human language of the given URL.", 64 - "maxLength": 5, 65 - "items": { 66 - "type": "string", 67 - "format": "language" 68 - } 69 - }, 70 - "createdAt": { 71 - "type": "string", 72 - "description": "Client-declared timestamp when the bookmark is created.", 73 - "format": "datetime" 74 - } 75 - } 76 - } 77 - } 78 - } 79 - }
-37
lexdocs/clippr/social/clippr/feed/tag.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.feed.tag", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "description": "A record containing a bookmark tag for organization.", 8 - "key": "any", 9 - "record": { 10 - "type": "object", 11 - "required": [ 12 - "name", 13 - "createdAt" 14 - ], 15 - "properties": { 16 - "name": { 17 - "type": "string", 18 - "description": "A de-duplicated string containing the name of the tag.", 19 - "maxGraphemes": 64, 20 - "maxLength": 640 21 - }, 22 - "color": { 23 - "type": "string", 24 - "description": "A hexadecimal color code.", 25 - "maxGraphemes": 7, 26 - "maxLength": 70 27 - }, 28 - "createdAt": { 29 - "type": "string", 30 - "description": "A client-defined timestamp for the creation of the tag.", 31 - "format": "datetime" 32 - } 33 - } 34 - } 35 - } 36 - } 37 - }
+76
lexdocs/social/clippr/actor/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.defs", 4 + "defs": { 5 + "profileView": { 6 + "type": "object", 7 + "description": "A view of an actor's profile.", 8 + "required": [ 9 + "did", 10 + "handle", 11 + "displayName" 12 + ], 13 + "properties": { 14 + "did": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "The DID of the profile" 18 + }, 19 + "handle": { 20 + "type": "string", 21 + "format": "handle", 22 + "description": "The handle of the profile" 23 + }, 24 + "displayName": { 25 + "type": "string", 26 + "maxGraphemes": 64, 27 + "maxLength": 640, 28 + "description": "The display name associated to the profile" 29 + }, 30 + "description": { 31 + "type": "string", 32 + "maxGraphemes": 500, 33 + "maxLength": 5000, 34 + "description": "The biography associated to the profile" 35 + }, 36 + "avatar": { 37 + "type": "string", 38 + "format": "uri", 39 + "description": "A link to the profile's avatar" 40 + }, 41 + "createdAt": { 42 + "type": "string", 43 + "format": "datetime", 44 + "description": "When the profile record was first created" 45 + } 46 + } 47 + }, 48 + "preferences": { 49 + "type": "array", 50 + "description": "An array of refs to various preferences.", 51 + "items": { 52 + "type": "union", 53 + "refs": [ 54 + "#publishingScopesPref" 55 + ] 56 + } 57 + }, 58 + "publishingScopesPref": { 59 + "type": "object", 60 + "description": "Preferences for an user's publishing scopes.", 61 + "required": [ 62 + "defaultScope" 63 + ], 64 + "properties": { 65 + "defaultScope": { 66 + "type": "string", 67 + "knownValues": [ 68 + "public", 69 + "unlisted" 70 + ], 71 + "description": "What publishing scope to mark a clip as by default" 72 + } 73 + } 74 + } 75 + } 76 + }
+30
lexdocs/social/clippr/actor/getPreferences.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.getPreferences", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the private user preferences associated to the account.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": {} 11 + }, 12 + "output": { 13 + "encoding": "application/json", 14 + "schema": { 15 + "type": "object", 16 + "required": [ 17 + "preferences" 18 + ], 19 + "properties": { 20 + "preferences": { 21 + "type": "ref", 22 + "ref": "social.clippr.actor.defs#preferences", 23 + "description": "A ref to the user's preferences" 24 + } 25 + } 26 + } 27 + } 28 + } 29 + } 30 + }
+31
lexdocs/social/clippr/actor/getProfile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.getProfile", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get profile view of an actor. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "Handle or DID of account to fetch profile of" 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "application/json", 23 + "schema": { 24 + "type": "ref", 25 + "ref": "social.clippr.actor.defs#profileView", 26 + "description": "A reference to the profile view of the actor" 27 + } 28 + } 29 + } 30 + } 31 + }
+46
lexdocs/social/clippr/actor/profile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.profile", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A declaration of a Clippr account's profile.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "createdAt", 13 + "displayName" 14 + ], 15 + "properties": { 16 + "displayName": { 17 + "type": "string", 18 + "description": "A display name to be shown on a profile", 19 + "maxGraphemes": 64, 20 + "maxLength": 640 21 + }, 22 + "description": { 23 + "type": "string", 24 + "description": "Text for user to describe themselves", 25 + "maxGraphemes": 500, 26 + "maxLength": 5000 27 + }, 28 + "avatar": { 29 + "type": "blob", 30 + "description": "Image to show on user's profiles", 31 + "accept": [ 32 + "image/png", 33 + "image/jpeg" 34 + ], 35 + "maxSize": 1000000 36 + }, 37 + "createdAt": { 38 + "type": "string", 39 + "format": "datetime", 40 + "description": "The creation date of the profile" 41 + } 42 + } 43 + } 44 + } 45 + } 46 + }
+26
lexdocs/social/clippr/actor/putPreferences.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.putPreferences", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Set the private preferences attached to the account.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "preferences" 14 + ], 15 + "properties": { 16 + "preferences": { 17 + "type": "ref", 18 + "ref": "social.clippr.actor.defs#preferences", 19 + "description": "A ref to the user's preferences" 20 + } 21 + } 22 + } 23 + } 24 + } 25 + } 26 + }
+52
lexdocs/social/clippr/actor/searchProfiles.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.searchProfiles", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Find profiles matching search criteria. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "q": { 12 + "type": "string", 13 + "description": "Search query string" 14 + }, 15 + "limit": { 16 + "type": "integer", 17 + "minimum": 1, 18 + "maximum": 100, 19 + "default": 25, 20 + "description": "The number of profiles to be returned in the query" 21 + }, 22 + "cursor": { 23 + "type": "string", 24 + "description": "A parameter used for pagination" 25 + } 26 + } 27 + }, 28 + "output": { 29 + "encoding": "application/json", 30 + "schema": { 31 + "type": "object", 32 + "required": [ 33 + "actors" 34 + ], 35 + "properties": { 36 + "cursor": { 37 + "type": "string", 38 + "description": "A parameter used for pagination" 39 + }, 40 + "actors": { 41 + "type": "array", 42 + "items": { 43 + "type": "ref", 44 + "ref": "social.clippr.actor.defs#profileView" 45 + } 46 + } 47 + } 48 + } 49 + } 50 + } 51 + } 52 + }
+80
lexdocs/social/clippr/feed/clip.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.clip", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record containing a bookmarked item, or 'clip'.", 8 + "key": "any", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "url", 13 + "title", 14 + "description", 15 + "unlisted", 16 + "createdAt" 17 + ], 18 + "properties": { 19 + "url": { 20 + "type": "string", 21 + "format": "uri", 22 + "description": "The URL of the bookmark. Cannot be left empty or be modified after creation.", 23 + "maxGraphemes": 2000, 24 + "maxLength": 20000 25 + }, 26 + "title": { 27 + "type": "string", 28 + "description": "The title of the bookmark. If left empty, reuse the URL.", 29 + "maxGraphemes": 2048, 30 + "maxLength": 20480 31 + }, 32 + "description": { 33 + "type": "string", 34 + "description": "A description of the bookmark's content. This should be ripped from the URL metadata and be static for all records using the URL.", 35 + "maxGraphemes": 4096, 36 + "maxLength": 40960 37 + }, 38 + "notes": { 39 + "type": "string", 40 + "description": "User-written notes for the bookmark. Public and personal.", 41 + "maxGraphemes": 10000, 42 + "maxLength": 100000 43 + }, 44 + "tags": { 45 + "type": "array", 46 + "description": "An array of tags. A format of solely alphanumeric characters and dashes should be used.", 47 + "items": { 48 + "type": "ref", 49 + "ref": "com.atproto.repo.strongRef" 50 + } 51 + }, 52 + "unlisted": { 53 + "type": "boolean", 54 + "description": "Whether the bookmark can be used for feed indexing and aggregation", 55 + "default": false 56 + }, 57 + "unread": { 58 + "type": "boolean", 59 + "description": "Whether the bookmark has been read by the user", 60 + "default": true 61 + }, 62 + "languages": { 63 + "type": "array", 64 + "description": "Indicates human language of the given URL", 65 + "maxLength": 5, 66 + "items": { 67 + "type": "string", 68 + "format": "language" 69 + } 70 + }, 71 + "createdAt": { 72 + "type": "string", 73 + "description": "Client-declared timestamp when the bookmark is created", 74 + "format": "datetime" 75 + } 76 + } 77 + } 78 + } 79 + } 80 + }
+80
lexdocs/social/clippr/feed/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.defs", 4 + "defs": { 5 + "clipView": { 6 + "type": "object", 7 + "description": "A view of a single bookmark (or 'clip').", 8 + "required": [ 9 + "uri", 10 + "cid", 11 + "author", 12 + "record", 13 + "indexedAt" 14 + ], 15 + "properties": { 16 + "uri": { 17 + "type": "string", 18 + "format": "at-uri", 19 + "description": "The AT-URI of the clip" 20 + }, 21 + "cid": { 22 + "type": "string", 23 + "format": "cid", 24 + "description": "The CID of the clip" 25 + }, 26 + "author": { 27 + "type": "ref", 28 + "ref": "social.clippr.actor.defs#profileView", 29 + "description": "A reference to the actor's profile" 30 + }, 31 + "record": { 32 + "type": "unknown", 33 + "description": "The raw record of the clip" 34 + }, 35 + "indexedAt": { 36 + "type": "string", 37 + "format": "datetime", 38 + "description": "When the tag was first indexed by the AppView" 39 + } 40 + } 41 + }, 42 + "tagView": { 43 + "type": "object", 44 + "description": "A view of a single tag.", 45 + "required": [ 46 + "uri", 47 + "cid", 48 + "author", 49 + "record", 50 + "indexedAt" 51 + ], 52 + "properties": { 53 + "uri": { 54 + "type": "string", 55 + "format": "at-uri", 56 + "description": "The AT-URI to the tag" 57 + }, 58 + "cid": { 59 + "type": "string", 60 + "format": "cid", 61 + "description": "The CID of the tag" 62 + }, 63 + "author": { 64 + "type": "ref", 65 + "ref": "social.clippr.actor.defs#profileView", 66 + "description": "A reference to the actor's profile" 67 + }, 68 + "record": { 69 + "type": "unknown", 70 + "description": "The raw record of the tag" 71 + }, 72 + "indexedAt": { 73 + "type": "string", 74 + "format": "datetime", 75 + "description": "When the tag was first indexed by the AppView" 76 + } 77 + } 78 + } 79 + } 80 + }
+46
lexdocs/social/clippr/feed/getClips.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getClips", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a list of clips. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uris" 12 + ], 13 + "properties": { 14 + "uris": { 15 + "type": "array", 16 + "description": "List of clip AT-URIs to return hydrated views for", 17 + "items": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "maxLength": 25 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": [ 30 + "clips" 31 + ], 32 + "properties": { 33 + "clips": { 34 + "type": "array", 35 + "items": { 36 + "type": "ref", 37 + "ref": "social.clippr.feed.defs#clipView" 38 + }, 39 + "description": "An array of hydrated clip views" 40 + } 41 + } 42 + } 43 + } 44 + } 45 + } 46 + }
+65
lexdocs/social/clippr/feed/getProfileClips.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getProfileClips", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a view of a profile's reverse-chronological clips feed. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "An actor to get feed data from" 18 + }, 19 + "limit": { 20 + "type": "integer", 21 + "minimum": 1, 22 + "maximum": 100, 23 + "default": 50, 24 + "description": "How many results to return with the query" 25 + }, 26 + "cursor": { 27 + "type": "string", 28 + "description": "A parameter to paginate results" 29 + }, 30 + "filter": { 31 + "type": "string", 32 + "knownValues": [ 33 + "all_clips", 34 + "tagged_clips", 35 + "untagged_clips" 36 + ], 37 + "default": "all_clips", 38 + "description": "What types to include in response" 39 + } 40 + } 41 + }, 42 + "output": { 43 + "encoding": "application/json", 44 + "schema": { 45 + "type": "object", 46 + "required": [ 47 + "feed" 48 + ], 49 + "properties": { 50 + "cursor": { 51 + "type": "string" 52 + }, 53 + "feed": { 54 + "type": "array", 55 + "items": { 56 + "type": "ref", 57 + "ref": "social.clippr.feed.defs#clipView" 58 + } 59 + } 60 + } 61 + } 62 + } 63 + } 64 + } 65 + }
+55
lexdocs/social/clippr/feed/getProfileTags.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getProfileTags", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a view of a profile's reverse-chronological clips feed. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "An actor to get feed data from" 18 + }, 19 + "limit": { 20 + "type": "integer", 21 + "minimum": 1, 22 + "maximum": 100, 23 + "default": 50, 24 + "description": "How many results to return with the query" 25 + }, 26 + "cursor": { 27 + "type": "string", 28 + "description": "A parameter to paginate results" 29 + } 30 + } 31 + }, 32 + "output": { 33 + "encoding": "application/json", 34 + "schema": { 35 + "type": "object", 36 + "required": [ 37 + "feed" 38 + ], 39 + "properties": { 40 + "cursor": { 41 + "type": "string" 42 + }, 43 + "feed": { 44 + "type": "array", 45 + "items": { 46 + "type": "ref", 47 + "ref": "social.clippr.feed.defs#tagView" 48 + } 49 + } 50 + } 51 + } 52 + } 53 + } 54 + } 55 + }
+39
lexdocs/social/clippr/feed/getTagList.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getTagList", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a user's list of tags. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "actor": { 12 + "type": "string", 13 + "format": "at-identifier", 14 + "description": "An actor to fetch the tag list from" 15 + } 16 + } 17 + }, 18 + "output": { 19 + "encoding": "application/json", 20 + "schema": { 21 + "type": "object", 22 + "required": [ 23 + "tags" 24 + ], 25 + "properties": { 26 + "tags": { 27 + "type": "array", 28 + "items": { 29 + "type": "ref", 30 + "ref": "social.clippr.feed.defs#tagView" 31 + }, 32 + "description": "A list of tags and their associated details" 33 + } 34 + } 35 + } 36 + } 37 + } 38 + } 39 + }
+46
lexdocs/social/clippr/feed/getTags.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getTags", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a list of tags. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uris" 12 + ], 13 + "properties": { 14 + "uris": { 15 + "type": "array", 16 + "description": "List of tag AT-URIs to return hydrated views for", 17 + "items": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "maxLength": 25 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": [ 30 + "tags" 31 + ], 32 + "properties": { 33 + "tags": { 34 + "type": "array", 35 + "items": { 36 + "type": "ref", 37 + "ref": "social.clippr.feed.defs#tagView" 38 + }, 39 + "description": "An array of hydrated tag views" 40 + } 41 + } 42 + } 43 + } 44 + } 45 + } 46 + }
+61
lexdocs/social/clippr/feed/searchClips.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.searchClips", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Find clips matching search criteria. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "q" 12 + ], 13 + "properties": { 14 + "q": { 15 + "type": "string", 16 + "description": "Search query string" 17 + }, 18 + "limit": { 19 + "type": "integer", 20 + "minimum": 1, 21 + "maximum": 100, 22 + "default": 25, 23 + "description": "How many clips to return in the query output" 24 + }, 25 + "actor": { 26 + "type": "string", 27 + "format": "at-identifier", 28 + "description": "An actor to filter results to" 29 + }, 30 + "cursor": { 31 + "type": "string", 32 + "description": "A parameter to paginate results" 33 + } 34 + } 35 + }, 36 + "output": { 37 + "encoding": "application/json", 38 + "schema": { 39 + "type": "object", 40 + "required": [ 41 + "clips" 42 + ], 43 + "properties": { 44 + "cursor": { 45 + "type": "string", 46 + "description": "A parameter to paginate results" 47 + }, 48 + "clips": { 49 + "type": "array", 50 + "items": { 51 + "type": "ref", 52 + "ref": "social.clippr.feed.defs#clipView" 53 + }, 54 + "description": "A list of clips and their associated details" 55 + } 56 + } 57 + } 58 + } 59 + } 60 + } 61 + }
+61
lexdocs/social/clippr/feed/searchTags.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.searchTags", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Find tags matching search criteria. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "q" 12 + ], 13 + "properties": { 14 + "q": { 15 + "type": "string", 16 + "description": "Search query string" 17 + }, 18 + "limit": { 19 + "type": "integer", 20 + "minimum": 1, 21 + "maximum": 100, 22 + "default": 25, 23 + "description": "How many tags to return in the query output" 24 + }, 25 + "actor": { 26 + "type": "string", 27 + "format": "at-identifier", 28 + "description": "An actor to filter results to" 29 + }, 30 + "cursor": { 31 + "type": "string", 32 + "description": "A parameter to paginate results" 33 + } 34 + } 35 + }, 36 + "output": { 37 + "encoding": "application/json", 38 + "schema": { 39 + "type": "object", 40 + "required": [ 41 + "tags" 42 + ], 43 + "properties": { 44 + "cursor": { 45 + "type": "string", 46 + "description": "A parameter to paginate results" 47 + }, 48 + "tags": { 49 + "type": "array", 50 + "items": { 51 + "type": "ref", 52 + "ref": "social.clippr.feed.defs#tagView" 53 + }, 54 + "description": "A list of tags and their associated details" 55 + } 56 + } 57 + } 58 + } 59 + } 60 + } 61 + }
+43
lexdocs/social/clippr/feed/tag.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.tag", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A record containing a bookmark tag for organization.", 8 + "key": "any", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "name", 13 + "createdAt" 14 + ], 15 + "properties": { 16 + "name": { 17 + "type": "string", 18 + "maxGraphemes": 64, 19 + "maxLength": 640, 20 + "description": "A de-duplicated string containing the name of the tag" 21 + }, 22 + "color": { 23 + "type": "string", 24 + "maxGraphemes": 7, 25 + "maxLength": 70, 26 + "description": "A hexadecimal color code" 27 + }, 28 + "description": { 29 + "type": "string", 30 + "maxGraphemes": 5000, 31 + "maxLength": 50000, 32 + "description": "A description of the tag for additional context" 33 + }, 34 + "createdAt": { 35 + "type": "string", 36 + "format": "datetime", 37 + "description": "A client-defined timestamp for the creation of the tag" 38 + } 39 + } 40 + } 41 + } 42 + } 43 + }
+39
lexicons/CHANGELOG.md
··· 1 + # changelog for @clipprjs/lexicons 2 + 3 + ## v1.0.2 4 + * fix some description typos 5 + * fix `social.clippr.feed.getTags` not existing due to an ID collision 6 + 7 + ## v1.0.1 8 + 9 + * remove minimum character prompts due to schema validation errors that broke otherwise valid records 10 + 11 + ## v1.0.0 12 + 13 + > this version should be considered as the starting point for a usable Lexicon API. previous versions should be ignored. 14 + 15 + * added search queries for clips, tags and profiles 16 + * added `social.clippr.actor.defs#preferences` with an accompanying query and procedure lexicon 17 + * added more inline documentation to previously existing lexicons 18 + * added query lexicons for having a clip and tag feed on a profile 19 + * added general query lexicons for at:// URIs linking to clips and tags 20 + 21 + ## v0.1.4 22 + 23 + * added length constraints to more strings in record lexicons 24 + 25 + ## v0.1.3 26 + 27 + * made `displayName` required for profile records 28 + 29 + ## v0.1.2 30 + 31 + * added npm tags.. i guess 32 + 33 + ## v0.1.1 34 + 35 + * something(?) 36 + 37 + ## v0.1.0 38 + 39 + * initial record and `social.clippr.actor.getProfile` query lexicons
+2 -4
lexicons/README.md
··· 2 2 3 3 Lexicon package auto-generated with `@atcute/lex-cli` 4 4 5 - > [!WARNING] 6 - > This package is *very* unstable. Lexicon attributes can be modified at any moment. 5 + > This package is *somewhat* unstable. Lexicon attributes can be modified at any moment. 7 6 > Please do not use this package for anything until the [Clippr server](https://tangled.sh/@hexmani.ac/clippr) has been 8 - > deployed. 7 + > deployed for either public or developer usage. 9 8 10 9 ## Usage 11 10 12 - > [!NOTE] 13 11 > This section has been shamelessly lifted from 14 12 > the [atcute definitions](https://github.com/mary-ext/atcute/tree/trunk/packages/definitions/bluesky) packages. We 15 13 > recommend using this package with other atcute libraries for maximum compatibility.
+27
lexicons/lex.config.js
··· 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-ignore 8 + import {defineLexiconConfig} from "@atcute/lex-cli"; 9 + 10 + export default defineLexiconConfig({ 11 + files: ["../lexdocs/**/*.json"], 12 + outdir: "lib/lexicons", 13 + mappings: [ 14 + { 15 + nsid: ["com.atproto.*"], 16 + imports: (nsid) => { 17 + const specifier = nsid 18 + .slice("com.atproto.".length) 19 + .replaceAll(".", "/"); 20 + return { 21 + type: "namespace", 22 + from: `@atcute/atproto/types/${specifier}`, 23 + }; 24 + }, 25 + }, 26 + ], 27 + });
-27
lexicons/lex.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-ignore 8 - import {defineLexiconConfig} from "@atcute/lex-cli"; 9 - 10 - export default defineLexiconConfig({ 11 - files: ["../lexdocs/**/*.json"], 12 - outdir: "lib/lexicons", 13 - mappings: [ 14 - { 15 - nsid: ["com.atproto.*"], 16 - imports: (nsid) => { 17 - const specifier = nsid 18 - .slice("com.atproto.".length) 19 - .replaceAll(".", "/"); 20 - return { 21 - type: "namespace", 22 - from: `@atcute/atproto/types/${specifier}`, 23 - }; 24 - }, 25 - }, 26 - ], 27 - });
+11
lexicons/lib/lexicons/index.ts
··· 5 5 */ 6 6 7 7 export * as SocialClipprActorDefs from "./types/social/clippr/actor/defs.js"; 8 + export * as SocialClipprActorGetPreferences from "./types/social/clippr/actor/getPreferences.js"; 8 9 export * as SocialClipprActorGetProfile from "./types/social/clippr/actor/getProfile.js"; 9 10 export * as SocialClipprActorProfile from "./types/social/clippr/actor/profile.js"; 11 + export * as SocialClipprActorPutPreferences from "./types/social/clippr/actor/putPreferences.js"; 12 + export * as SocialClipprActorSearchClips from "./types/social/clippr/actor/searchClips.js"; 13 + export * as SocialClipprActorSearchProfiles from "./types/social/clippr/actor/searchProfiles.js"; 14 + export * as SocialClipprActorSearchTags from "./types/social/clippr/actor/searchTags.js"; 10 15 export * as SocialClipprFeedClip from "./types/social/clippr/feed/clip.js"; 16 + export * as SocialClipprFeedDefs from "./types/social/clippr/feed/defs.js"; 17 + export * as SocialClipprFeedGetClips from "./types/social/clippr/feed/getClips.js"; 18 + export * as SocialClipprFeedGetProfileClips from "./types/social/clippr/feed/getProfileClips.js"; 19 + export * as SocialClipprFeedGetProfileTags from "./types/social/clippr/feed/getProfileTags.js"; 20 + export * as SocialClipprFeedGetTagList from "./types/social/clippr/feed/getTagList.js"; 21 + export * as SocialClipprFeedGetTags from "./types/social/clippr/feed/getTags.js"; 11 22 export * as SocialClipprFeedTag from "./types/social/clippr/feed/tag.js";
+40 -23
lexicons/lib/lexicons/types/social/clippr/actor/defs.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 + import type {} from "@atcute/lexicons"; 7 8 import * as v from "@atcute/lexicons/validations"; 8 9 10 + const _preferencesSchema = /*#__PURE__*/ v.array(() => { 11 + return /*#__PURE__*/ v.variant([publishingScopesPrefSchema]); 12 + }); 9 13 const _profileViewSchema = /*#__PURE__*/ v.object({ 10 - $type: /*#__PURE__*/ v.optional( 11 - /*#__PURE__*/ v.literal("social.clippr.actor.defs#profileView"), 12 - ), 13 - avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 14 - createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 15 - description: /*#__PURE__*/ v.optional( 16 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 - /*#__PURE__*/ v.stringLength(0, 5000), 18 - /*#__PURE__*/ v.stringGraphemes(0, 500), 19 - ]), 20 - ), 21 - did: /*#__PURE__*/ v.didString(), 22 - displayName: /*#__PURE__*/ v.optional( 23 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 24 - /*#__PURE__*/ v.stringLength(0, 640), 25 - /*#__PURE__*/ v.stringGraphemes(0, 64), 26 - ]), 27 - ), 28 - handle: /*#__PURE__*/ v.handleString(), 14 + $type: /*#__PURE__*/ v.optional( 15 + /*#__PURE__*/ v.literal("social.clippr.actor.defs#profileView"), 16 + ), 17 + avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 18 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 19 + description: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 21 + /*#__PURE__*/ v.stringLength(0, 5000), 22 + /*#__PURE__*/ v.stringGraphemes(0, 500), 23 + ]), 24 + ), 25 + did: /*#__PURE__*/ v.didString(), 26 + displayName: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 27 + /*#__PURE__*/ v.stringLength(0, 640), 28 + /*#__PURE__*/ v.stringGraphemes(0, 64), 29 + ]), 30 + handle: /*#__PURE__*/ v.handleString(), 31 + }); 32 + const _publishingScopesPrefSchema = /*#__PURE__*/ v.object({ 33 + $type: /*#__PURE__*/ v.optional( 34 + /*#__PURE__*/ v.literal("social.clippr.actor.defs#publishingScopesPref"), 35 + ), 36 + defaultScope: /*#__PURE__*/ v.string<"public" | "unlisted" | (string & {})>(), 29 37 }); 30 38 39 + type preferences$schematype = typeof _preferencesSchema; 31 40 type profileView$schematype = typeof _profileViewSchema; 41 + type publishingScopesPref$schematype = typeof _publishingScopesPrefSchema; 32 42 33 - export interface profileViewSchema extends profileView$schematype { 34 - } 43 + export interface preferencesSchema extends preferences$schematype {} 44 + export interface profileViewSchema extends profileView$schematype {} 45 + export interface publishingScopesPrefSchema 46 + extends publishingScopesPref$schematype {} 35 47 48 + export const preferencesSchema = _preferencesSchema as preferencesSchema; 36 49 export const profileViewSchema = _profileViewSchema as profileViewSchema; 50 + export const publishingScopesPrefSchema = 51 + _publishingScopesPrefSchema as publishingScopesPrefSchema; 37 52 38 - export interface ProfileView extends v.InferInput<typeof profileViewSchema> { 39 - } 53 + export interface Preferences extends v.InferInput<typeof preferencesSchema> {} 54 + export interface ProfileView extends v.InferInput<typeof profileViewSchema> {} 55 + export interface PublishingScopesPref 56 + extends v.InferInput<typeof publishingScopesPrefSchema> {}
+40
lexicons/lib/lexicons/types/social/clippr/actor/getPreferences.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprActorDefs from "./defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query( 13 + "social.clippr.actor.getPreferences", 14 + { 15 + params: /*#__PURE__*/ v.object({}), 16 + output: { 17 + type: "lex", 18 + schema: /*#__PURE__*/ v.object({ 19 + get preferences() { 20 + return SocialClipprActorDefs.preferencesSchema; 21 + }, 22 + }), 23 + }, 24 + }, 25 + ); 26 + 27 + type main$schematype = typeof _mainSchema; 28 + 29 + export interface mainSchema extends main$schematype {} 30 + 31 + export const mainSchema = _mainSchema as mainSchema; 32 + 33 + export interface $params extends v.InferInput<mainSchema["params"]> {} 34 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 35 + 36 + declare module "@atcute/lexicons/ambient" { 37 + interface XRPCQueries { 38 + "social.clippr.actor.getPreferences": mainSchema; 39 + } 40 + }
+15 -15
lexicons/lib/lexicons/types/social/clippr/actor/getProfile.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 + import type {} from "@atcute/lexicons"; 7 8 import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 8 10 import * as SocialClipprActorDefs from "./defs.js"; 9 11 10 12 const _mainSchema = /*#__PURE__*/ v.query("social.clippr.actor.getProfile", { 11 - params: /*#__PURE__*/ v.object({ 12 - actor: /*#__PURE__*/ v.actorIdentifierString(), 13 - }), 14 - output: { 15 - type: "lex", 16 - get schema() { 17 - return SocialClipprActorDefs.profileViewSchema; 18 - }, 13 + params: /*#__PURE__*/ v.object({ 14 + actor: /*#__PURE__*/ v.actorIdentifierString(), 15 + }), 16 + output: { 17 + type: "lex", 18 + get schema() { 19 + return SocialClipprActorDefs.profileViewSchema; 19 20 }, 21 + }, 20 22 }); 21 23 22 24 type main$schematype = typeof _mainSchema; 23 25 24 - export interface mainSchema extends main$schematype { 25 - } 26 + export interface mainSchema extends main$schematype {} 26 27 27 28 export const mainSchema = _mainSchema as mainSchema; 28 29 29 - export interface $params extends v.InferInput<mainSchema["params"]> { 30 - } 30 + export interface $params extends v.InferInput<mainSchema["params"]> {} 31 31 export type $output = v.InferXRPCBodyInput<mainSchema["output"]>; 32 32 33 33 declare module "@atcute/lexicons/ambient" { 34 - interface XRPCQueries { 35 - "social.clippr.actor.getProfile": mainSchema; 36 - } 34 + interface XRPCQueries { 35 + "social.clippr.actor.getProfile": mainSchema; 36 + } 37 37 }
+23 -23
lexicons/lib/lexicons/types/social/clippr/actor/profile.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 + import type {} from "@atcute/lexicons"; 7 8 import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 8 10 9 11 const _mainSchema = /*#__PURE__*/ v.record( 10 - /*#__PURE__*/ v.literal("self"), 11 - /*#__PURE__*/ v.object({ 12 - $type: /*#__PURE__*/ v.literal("social.clippr.actor.profile"), 13 - avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.blob()), 14 - createdAt: /*#__PURE__*/ v.datetimeString(), 15 - description: /*#__PURE__*/ v.optional( 16 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 - /*#__PURE__*/ v.stringLength(0, 5000), 18 - /*#__PURE__*/ v.stringGraphemes(0, 500), 19 - ]), 20 - ), 21 - displayName: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 22 - /*#__PURE__*/ v.stringLength(0, 640), 23 - /*#__PURE__*/ v.stringGraphemes(0, 64), 24 - ]), 25 - }), 12 + /*#__PURE__*/ v.literal("self"), 13 + /*#__PURE__*/ v.object({ 14 + $type: /*#__PURE__*/ v.literal("social.clippr.actor.profile"), 15 + avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.blob()), 16 + createdAt: /*#__PURE__*/ v.datetimeString(), 17 + description: /*#__PURE__*/ v.optional( 18 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 19 + /*#__PURE__*/ v.stringLength(0, 5000), 20 + /*#__PURE__*/ v.stringGraphemes(0, 500), 21 + ]), 22 + ), 23 + displayName: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 24 + /*#__PURE__*/ v.stringLength(0, 640), 25 + /*#__PURE__*/ v.stringGraphemes(0, 64), 26 + ]), 27 + }), 26 28 ); 27 29 28 30 type main$schematype = typeof _mainSchema; 29 31 30 - export interface mainSchema extends main$schematype { 31 - } 32 + export interface mainSchema extends main$schematype {} 32 33 33 34 export const mainSchema = _mainSchema as mainSchema; 34 35 35 - export interface Main extends v.InferInput<typeof mainSchema> { 36 - } 36 + export interface Main extends v.InferInput<typeof mainSchema> {} 37 37 38 38 declare module "@atcute/lexicons/ambient" { 39 - interface Records { 40 - "social.clippr.actor.profile": mainSchema; 41 - } 39 + interface Records { 40 + "social.clippr.actor.profile": mainSchema; 41 + } 42 42 }
+41
lexicons/lib/lexicons/types/social/clippr/actor/putPreferences.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprActorDefs from "./defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.procedure( 13 + "social.clippr.actor.putPreferences", 14 + { 15 + params: null, 16 + input: { 17 + type: "lex", 18 + schema: /*#__PURE__*/ v.object({ 19 + get preferences() { 20 + return SocialClipprActorDefs.preferencesSchema; 21 + }, 22 + }), 23 + }, 24 + output: null, 25 + }, 26 + ); 27 + 28 + type main$schematype = typeof _mainSchema; 29 + 30 + export interface mainSchema extends main$schematype {} 31 + 32 + export const mainSchema = _mainSchema as mainSchema; 33 + 34 + export interface $params {} 35 + export interface $input extends v.InferXRPCBodyInput<mainSchema["input"]> {} 36 + 37 + declare module "@atcute/lexicons/ambient" { 38 + interface XRPCProcedures { 39 + "social.clippr.actor.putPreferences": mainSchema; 40 + } 41 + }
+48
lexicons/lib/lexicons/types/social/clippr/actor/searchClips.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprFeedDefs from "../feed/defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.actor.searchClips", { 13 + params: /*#__PURE__*/ v.object({ 14 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 15 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 16 + limit: /*#__PURE__*/ v.optional( 17 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 18 + /*#__PURE__*/ v.integerRange(1, 100), 19 + ]), 20 + 25, 21 + ), 22 + q: /*#__PURE__*/ v.string(), 23 + }), 24 + output: { 25 + type: "lex", 26 + schema: /*#__PURE__*/ v.object({ 27 + get clips() { 28 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.clipViewSchema); 29 + }, 30 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 31 + }), 32 + }, 33 + }); 34 + 35 + type main$schematype = typeof _mainSchema; 36 + 37 + export interface mainSchema extends main$schematype {} 38 + 39 + export const mainSchema = _mainSchema as mainSchema; 40 + 41 + export interface $params extends v.InferInput<mainSchema["params"]> {} 42 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 43 + 44 + declare module "@atcute/lexicons/ambient" { 45 + interface XRPCQueries { 46 + "social.clippr.actor.searchClips": mainSchema; 47 + } 48 + }
+50
lexicons/lib/lexicons/types/social/clippr/actor/searchProfiles.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprActorDefs from "./defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query( 13 + "social.clippr.actor.searchProfiles", 14 + { 15 + params: /*#__PURE__*/ v.object({ 16 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 17 + limit: /*#__PURE__*/ v.optional( 18 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 19 + /*#__PURE__*/ v.integerRange(1, 100), 20 + ]), 21 + 25, 22 + ), 23 + q: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 24 + }), 25 + output: { 26 + type: "lex", 27 + schema: /*#__PURE__*/ v.object({ 28 + get actors() { 29 + return /*#__PURE__*/ v.array(SocialClipprActorDefs.profileViewSchema); 30 + }, 31 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 32 + }), 33 + }, 34 + }, 35 + ); 36 + 37 + type main$schematype = typeof _mainSchema; 38 + 39 + export interface mainSchema extends main$schematype {} 40 + 41 + export const mainSchema = _mainSchema as mainSchema; 42 + 43 + export interface $params extends v.InferInput<mainSchema["params"]> {} 44 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 45 + 46 + declare module "@atcute/lexicons/ambient" { 47 + interface XRPCQueries { 48 + "social.clippr.actor.searchProfiles": mainSchema; 49 + } 50 + }
+48
lexicons/lib/lexicons/types/social/clippr/actor/searchTags.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprFeedDefs from "../feed/defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.actor.searchTags", { 13 + params: /*#__PURE__*/ v.object({ 14 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 15 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 16 + limit: /*#__PURE__*/ v.optional( 17 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 18 + /*#__PURE__*/ v.integerRange(1, 100), 19 + ]), 20 + 25, 21 + ), 22 + q: /*#__PURE__*/ v.string(), 23 + }), 24 + output: { 25 + type: "lex", 26 + schema: /*#__PURE__*/ v.object({ 27 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 28 + get tags() { 29 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.tagViewSchema); 30 + }, 31 + }), 32 + }, 33 + }); 34 + 35 + type main$schematype = typeof _mainSchema; 36 + 37 + export interface mainSchema extends main$schematype {} 38 + 39 + export const mainSchema = _mainSchema as mainSchema; 40 + 41 + export interface $params extends v.InferInput<mainSchema["params"]> {} 42 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 43 + 44 + declare module "@atcute/lexicons/ambient" { 45 + interface XRPCQueries { 46 + "social.clippr.actor.searchTags": mainSchema; 47 + } 48 + }
+43 -43
lexicons/lib/lexicons/types/social/clippr/feed/clip.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 + import type {} from "@atcute/lexicons"; 7 8 import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 8 10 import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 9 11 10 12 const _mainSchema = /*#__PURE__*/ v.record( 11 - /*#__PURE__*/ v.string(), 12 - /*#__PURE__*/ v.object({ 13 - $type: /*#__PURE__*/ v.literal("social.clippr.feed.clip"), 14 - createdAt: /*#__PURE__*/ v.datetimeString(), 15 - description: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 16 - /*#__PURE__*/ v.stringLength(0, 40960), 17 - /*#__PURE__*/ v.stringGraphemes(0, 4096), 18 - ]), 19 - languages: /*#__PURE__*/ v.optional( 20 - /*#__PURE__*/ v.constrain( 21 - /*#__PURE__*/ v.array(/*#__PURE__*/ v.languageCodeString()), 22 - [/*#__PURE__*/ v.arrayLength(0, 5)], 23 - ), 24 - ), 25 - notes: /*#__PURE__*/ v.optional( 26 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 27 - /*#__PURE__*/ v.stringLength(0, 100000), 28 - /*#__PURE__*/ v.stringGraphemes(0, 10000), 29 - ]), 30 - ), 31 - get tags() { 32 - return /*#__PURE__*/ v.optional( 33 - /*#__PURE__*/ v.array(ComAtprotoRepoStrongRef.mainSchema), 34 - ); 35 - }, 36 - title: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 37 - /*#__PURE__*/ v.stringLength(0, 20480), 38 - /*#__PURE__*/ v.stringGraphemes(0, 2048), 39 - ]), 40 - unlisted: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), false), 41 - unread: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), true), 42 - url: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 - /*#__PURE__*/ v.stringLength(0, 20000), 44 - /*#__PURE__*/ v.stringGraphemes(0, 2000), 45 - ]), 46 - }), 13 + /*#__PURE__*/ v.string(), 14 + /*#__PURE__*/ v.object({ 15 + $type: /*#__PURE__*/ v.literal("social.clippr.feed.clip"), 16 + createdAt: /*#__PURE__*/ v.datetimeString(), 17 + description: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 18 + /*#__PURE__*/ v.stringLength(0, 40960), 19 + /*#__PURE__*/ v.stringGraphemes(0, 4096), 20 + ]), 21 + languages: /*#__PURE__*/ v.optional( 22 + /*#__PURE__*/ v.constrain( 23 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.languageCodeString()), 24 + [/*#__PURE__*/ v.arrayLength(0, 5)], 25 + ), 26 + ), 27 + notes: /*#__PURE__*/ v.optional( 28 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 29 + /*#__PURE__*/ v.stringLength(0, 100000), 30 + /*#__PURE__*/ v.stringGraphemes(0, 10000), 31 + ]), 32 + ), 33 + get tags() { 34 + return /*#__PURE__*/ v.optional( 35 + /*#__PURE__*/ v.array(ComAtprotoRepoStrongRef.mainSchema), 36 + ); 37 + }, 38 + title: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 39 + /*#__PURE__*/ v.stringLength(0, 20480), 40 + /*#__PURE__*/ v.stringGraphemes(0, 2048), 41 + ]), 42 + unlisted: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), false), 43 + unread: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), true), 44 + url: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.genericUriString(), [ 45 + /*#__PURE__*/ v.stringLength(0, 20000), 46 + /*#__PURE__*/ v.stringGraphemes(0, 2000), 47 + ]), 48 + }), 47 49 ); 48 50 49 51 type main$schematype = typeof _mainSchema; 50 52 51 - export interface mainSchema extends main$schematype { 52 - } 53 + export interface mainSchema extends main$schematype {} 53 54 54 55 export const mainSchema = _mainSchema as mainSchema; 55 56 56 - export interface Main extends v.InferInput<typeof mainSchema> { 57 - } 57 + export interface Main extends v.InferInput<typeof mainSchema> {} 58 58 59 59 declare module "@atcute/lexicons/ambient" { 60 - interface Records { 61 - "social.clippr.feed.clip": mainSchema; 62 - } 60 + interface Records { 61 + "social.clippr.feed.clip": mainSchema; 62 + } 63 63 }
+46
lexicons/lib/lexicons/types/social/clippr/feed/defs.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import * as SocialClipprActorDefs from "../actor/defs.js"; 10 + 11 + const _clipViewSchema = /*#__PURE__*/ v.object({ 12 + $type: /*#__PURE__*/ v.optional( 13 + /*#__PURE__*/ v.literal("social.clippr.feed.defs#clipView"), 14 + ), 15 + get author() { 16 + return SocialClipprActorDefs.profileViewSchema; 17 + }, 18 + cid: /*#__PURE__*/ v.cidString(), 19 + indexedAt: /*#__PURE__*/ v.datetimeString(), 20 + record: /*#__PURE__*/ v.unknown(), 21 + uri: /*#__PURE__*/ v.resourceUriString(), 22 + }); 23 + const _tagViewSchema = /*#__PURE__*/ v.object({ 24 + $type: /*#__PURE__*/ v.optional( 25 + /*#__PURE__*/ v.literal("social.clippr.feed.defs#tagView"), 26 + ), 27 + get author() { 28 + return SocialClipprActorDefs.profileViewSchema; 29 + }, 30 + cid: /*#__PURE__*/ v.cidString(), 31 + indexedAt: /*#__PURE__*/ v.datetimeString(), 32 + record: /*#__PURE__*/ v.unknown(), 33 + uri: /*#__PURE__*/ v.resourceUriString(), 34 + }); 35 + 36 + type clipView$schematype = typeof _clipViewSchema; 37 + type tagView$schematype = typeof _tagViewSchema; 38 + 39 + export interface clipViewSchema extends clipView$schematype {} 40 + export interface tagViewSchema extends tagView$schematype {} 41 + 42 + export const clipViewSchema = _clipViewSchema as clipViewSchema; 43 + export const tagViewSchema = _tagViewSchema as tagViewSchema; 44 + 45 + export interface ClipView extends v.InferInput<typeof clipViewSchema> {} 46 + export interface TagView extends v.InferInput<typeof tagViewSchema> {}
+42
lexicons/lib/lexicons/types/social/clippr/feed/getClips.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprFeedDefs from "./defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.feed.getClips", { 13 + params: /*#__PURE__*/ v.object({ 14 + uris: /*#__PURE__*/ v.constrain( 15 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.resourceUriString()), 16 + [/*#__PURE__*/ v.arrayLength(1, 25)], 17 + ), 18 + }), 19 + output: { 20 + type: "lex", 21 + schema: /*#__PURE__*/ v.object({ 22 + get clips() { 23 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.clipViewSchema); 24 + }, 25 + }), 26 + }, 27 + }); 28 + 29 + type main$schematype = typeof _mainSchema; 30 + 31 + export interface mainSchema extends main$schematype {} 32 + 33 + export const mainSchema = _mainSchema as mainSchema; 34 + 35 + export interface $params extends v.InferInput<mainSchema["params"]> {} 36 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 37 + 38 + declare module "@atcute/lexicons/ambient" { 39 + interface XRPCQueries { 40 + "social.clippr.feed.getClips": mainSchema; 41 + } 42 + }
+56
lexicons/lib/lexicons/types/social/clippr/feed/getProfileClips.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprFeedDefs from "./defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query( 13 + "social.clippr.feed.getProfileClips", 14 + { 15 + params: /*#__PURE__*/ v.object({ 16 + actor: /*#__PURE__*/ v.actorIdentifierString(), 17 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 18 + filter: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.string< 20 + "all_clips" | "tagged_clips" | "untagged_clips" | (string & {}) 21 + >(), 22 + "all_clips", 23 + ), 24 + limit: /*#__PURE__*/ v.optional( 25 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 26 + /*#__PURE__*/ v.integerRange(1, 100), 27 + ]), 28 + 50, 29 + ), 30 + }), 31 + output: { 32 + type: "lex", 33 + schema: /*#__PURE__*/ v.object({ 34 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 35 + get feed() { 36 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.clipViewSchema); 37 + }, 38 + }), 39 + }, 40 + }, 41 + ); 42 + 43 + type main$schematype = typeof _mainSchema; 44 + 45 + export interface mainSchema extends main$schematype {} 46 + 47 + export const mainSchema = _mainSchema as mainSchema; 48 + 49 + export interface $params extends v.InferInput<mainSchema["params"]> {} 50 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 51 + 52 + declare module "@atcute/lexicons/ambient" { 53 + interface XRPCQueries { 54 + "social.clippr.feed.getProfileClips": mainSchema; 55 + } 56 + }
+47
lexicons/lib/lexicons/types/social/clippr/feed/getProfileTags.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprFeedDefs from "./defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.feed.getProfileTags", { 13 + params: /*#__PURE__*/ v.object({ 14 + actor: /*#__PURE__*/ v.actorIdentifierString(), 15 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 16 + limit: /*#__PURE__*/ v.optional( 17 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 18 + /*#__PURE__*/ v.integerRange(1, 100), 19 + ]), 20 + 50, 21 + ), 22 + }), 23 + output: { 24 + type: "lex", 25 + schema: /*#__PURE__*/ v.object({ 26 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 27 + get feed() { 28 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.tagViewSchema); 29 + }, 30 + }), 31 + }, 32 + }); 33 + 34 + type main$schematype = typeof _mainSchema; 35 + 36 + export interface mainSchema extends main$schematype {} 37 + 38 + export const mainSchema = _mainSchema as mainSchema; 39 + 40 + export interface $params extends v.InferInput<mainSchema["params"]> {} 41 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 42 + 43 + declare module "@atcute/lexicons/ambient" { 44 + interface XRPCQueries { 45 + "social.clippr.feed.getProfileTags": mainSchema; 46 + } 47 + }
+39
lexicons/lib/lexicons/types/social/clippr/feed/getTagList.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprFeedDefs from "./defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.feed.getTagList", { 13 + params: /*#__PURE__*/ v.object({ 14 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 15 + }), 16 + output: { 17 + type: "lex", 18 + schema: /*#__PURE__*/ v.object({ 19 + get tags() { 20 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.tagViewSchema); 21 + }, 22 + }), 23 + }, 24 + }); 25 + 26 + type main$schematype = typeof _mainSchema; 27 + 28 + export interface mainSchema extends main$schematype {} 29 + 30 + export const mainSchema = _mainSchema as mainSchema; 31 + 32 + export interface $params extends v.InferInput<mainSchema["params"]> {} 33 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 34 + 35 + declare module "@atcute/lexicons/ambient" { 36 + interface XRPCQueries { 37 + "social.clippr.feed.getTagList": mainSchema; 38 + } 39 + }
+42
lexicons/lib/lexicons/types/social/clippr/feed/getTags.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 type {} from "@atcute/lexicons"; 8 + import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 10 + import * as SocialClipprFeedDefs from "./defs.js"; 11 + 12 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.feed.getTags", { 13 + params: /*#__PURE__*/ v.object({ 14 + uris: /*#__PURE__*/ v.constrain( 15 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.resourceUriString()), 16 + [/*#__PURE__*/ v.arrayLength(1, 25)], 17 + ), 18 + }), 19 + output: { 20 + type: "lex", 21 + schema: /*#__PURE__*/ v.object({ 22 + get tags() { 23 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.tagViewSchema); 24 + }, 25 + }), 26 + }, 27 + }); 28 + 29 + type main$schematype = typeof _mainSchema; 30 + 31 + export interface mainSchema extends main$schematype {} 32 + 33 + export const mainSchema = _mainSchema as mainSchema; 34 + 35 + export interface $params extends v.InferInput<mainSchema["params"]> {} 36 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 37 + 38 + declare module "@atcute/lexicons/ambient" { 39 + interface XRPCQueries { 40 + "social.clippr.feed.getTags": mainSchema; 41 + } 42 + }
+28 -22
lexicons/lib/lexicons/types/social/clippr/feed/tag.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 + import type {} from "@atcute/lexicons"; 7 8 import * as v from "@atcute/lexicons/validations"; 9 + import type {} from "@atcute/lexicons/ambient"; 8 10 9 11 const _mainSchema = /*#__PURE__*/ v.record( 10 - /*#__PURE__*/ v.string(), 11 - /*#__PURE__*/ v.object({ 12 - $type: /*#__PURE__*/ v.literal("social.clippr.feed.tag"), 13 - color: /*#__PURE__*/ v.optional( 14 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 15 - /*#__PURE__*/ v.stringLength(0, 70), 16 - /*#__PURE__*/ v.stringGraphemes(0, 7), 17 - ]), 18 - ), 19 - createdAt: /*#__PURE__*/ v.datetimeString(), 20 - name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 21 - /*#__PURE__*/ v.stringLength(0, 640), 22 - /*#__PURE__*/ v.stringGraphemes(0, 64), 23 - ]), 24 - }), 12 + /*#__PURE__*/ v.string(), 13 + /*#__PURE__*/ v.object({ 14 + $type: /*#__PURE__*/ v.literal("social.clippr.feed.tag"), 15 + color: /*#__PURE__*/ v.optional( 16 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 + /*#__PURE__*/ v.stringLength(0, 70), 18 + /*#__PURE__*/ v.stringGraphemes(0, 7), 19 + ]), 20 + ), 21 + createdAt: /*#__PURE__*/ v.datetimeString(), 22 + description: /*#__PURE__*/ v.optional( 23 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 24 + /*#__PURE__*/ v.stringLength(0, 50000), 25 + /*#__PURE__*/ v.stringGraphemes(0, 5000), 26 + ]), 27 + ), 28 + name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 29 + /*#__PURE__*/ v.stringLength(0, 640), 30 + /*#__PURE__*/ v.stringGraphemes(0, 64), 31 + ]), 32 + }), 25 33 ); 26 34 27 35 type main$schematype = typeof _mainSchema; 28 36 29 - export interface mainSchema extends main$schematype { 30 - } 37 + export interface mainSchema extends main$schematype {} 31 38 32 39 export const mainSchema = _mainSchema as mainSchema; 33 40 34 - export interface Main extends v.InferInput<typeof mainSchema> { 35 - } 41 + export interface Main extends v.InferInput<typeof mainSchema> {} 36 42 37 43 declare module "@atcute/lexicons/ambient" { 38 - interface Records { 39 - "social.clippr.feed.tag": mainSchema; 40 - } 44 + interface Records { 45 + "social.clippr.feed.tag": mainSchema; 46 + } 41 47 }
+4 -4
lexicons/package.json
··· 1 1 { 2 2 "type": "module", 3 3 "name": "@clipprjs/lexicons", 4 - "version": "0.1.3", 4 + "version": "1.0.2", 5 5 "description": "Clippr schema definitions", 6 6 "license": "AGPL-3.0-only", 7 7 "private": false, ··· 21 21 ], 22 22 "exports": { 23 23 ".": "./dist/index.js", 24 - "./types/social/clippr/*": "./dist/lexicons/types/social/clippr/*.js" 24 + "./types/*": "./dist/lexicons/types/social/clippr/*.js" 25 25 }, 26 26 "scripts": { 27 27 "build": "tsc --project tsconfig.json", 28 - "generate": "rm -r lib/lexicons; lex-cli generate -c ./lex.config.ts", 28 + "generate": "rm -r lib/lexicons; lex-cli generate -c lex.config.js", 29 29 "prepublish": "rm -rf dist; pnpm run build" 30 30 }, 31 31 "dependencies": { 32 - "@atcute/atproto": "^3.1.0", 32 + "@atcute/atproto": "^3.1.1", 33 33 "@atcute/lexicons": "^1.1.0" 34 34 }, 35 35 "devDependencies": {
+5 -5
lexicons/pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@atcute/atproto': 12 - specifier: ^3.1.0 13 - version: 3.1.0 12 + specifier: ^3.1.1 13 + version: 3.1.1 14 14 '@atcute/lexicons': 15 15 specifier: ^1.1.0 16 16 version: 1.1.0 ··· 24 24 25 25 packages: 26 26 27 - '@atcute/atproto@3.1.0': 28 - resolution: {integrity: sha512-aJbDsY7FcIh8APWKAimBtshPwqoRE056tc0UV6vw4TW4e3nYaHedoJmKhlh/k8KQWxyw64MQThNGMaC89HNoTg==} 27 + '@atcute/atproto@3.1.1': 28 + resolution: {integrity: sha512-D+RLTIPF0xLu7BPZY8KSewAPemJFh+3n3zeQ3ROsLxbTtCHbrTDMAmAFexaVRAPGcPYrwXaBUlv7yZjScJolMg==} 29 29 30 30 '@atcute/lex-cli@2.1.1': 31 31 resolution: {integrity: sha512-QaR0sOP8Z24opGHKsSfleDbP/ahUb6HECkVaOqSwG7ORZzbLK1w0265o1BRjCVr2dT6FxlsMUa2Ge85JMA9bxg==} ··· 64 64 65 65 snapshots: 66 66 67 - '@atcute/atproto@3.1.0': 67 + '@atcute/atproto@3.1.1': 68 68 dependencies: 69 69 '@atcute/lexicons': 1.1.0 70 70