social bookmarking for atproto

Compare changes

Choose any two refs to compare.

+30
.husky/pre-commit
··· 1 + #!/bin/sh 2 + 3 + # 4 + # clippr: a social bookmarking service for the AT Protocol 5 + # Copyright (c) 2025 clippr contributors. 6 + # SPDX-License-Identifier: AGPL-3.0-only 7 + # 8 + 9 + test() { 10 + cd backend || return 1 11 + pnpm run fmt 12 + pnpm run lint 13 + cd ../frontend || return 1 14 + pnpm run fmt 15 + cd ../lexicons || return 1 16 + pnpm run generate 17 + pnpm run prepublish 18 + } 19 + 20 + echo "Testing code for any errors before committing..." 21 + test 22 + if [ $? -ne 0 ]; then { 23 + echo "Linting failed. Commit aborted." 24 + exit 1 25 + } 26 + fi 27 + 28 + echo "All relevant checks passed. Proceeding with commit." 29 + exit 0 30 +
+2
.idea/dictionaries/project.xml
··· 6 6 <w>appview</w> 7 7 <w>atcute</w> 8 8 <w>atproto</w> 9 + <w>atprotocol</w> 9 10 <w>bluesky</w> 10 11 <w>bsky</w> 11 12 <w>clippr</w> ··· 17 18 <w>llms</w> 18 19 <w>llmstxt</w> 19 20 <w>multiformats</w> 21 + <w>nodeinfo</w> 20 22 <w>nsid</w> 21 23 <w>outdir</w> 22 24 <w>rkey</w>
+3
.tangled/workflows/build_backend.yaml
··· 26 26 environment: 27 27 NODE_ENV: "production" 28 28 29 + environment: 30 + GIT_BRANCH: "main" 31 + 29 32 clone: 30 33 skip: false 31 34 depth: 50
+3
.tangled/workflows/build_frontend.yaml
··· 21 21 - name: "Build frontend" 22 22 command: "pnpm run --dir ./frontend/ build" 23 23 24 + environment: 25 + GIT_BRANCH: "main" 26 + 24 27 clone: 25 28 skip: false 26 29 depth: 50
+3
.tangled/workflows/build_lexicons.yaml
··· 26 26 environment: 27 27 NODE_ENV: "production" 28 28 29 + environment: 30 + GIT_BRANCH: "main" 31 + 29 32 clone: 30 33 skip: false 31 34 depth: 50
+25 -12
README.md
··· 1 1 # clippr 2 2 3 - social bookmarking for atproto 3 + Social bookmarking for the AT Protocol. 4 4 5 5 ## current status 6 6 7 - we are currently working on completing the appview first before moving on to the frontend or any other packages. 7 + Our current focus is on completing the AppView first before moving on in full earnest to the frontend or any other 8 + packages; however, some may be developed in tandem if necessary. 8 9 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. 10 + The AppView currently has support for indexing records that are created, updated or deleted, some basic queries and DID 11 + service proxying. Authenticated endpoints and most other queries are currently not implemented. 12 + 13 + The frontend has OAuth authentication and the ability to view and edit profiles, but is otherwise empty. 11 14 12 - the frontend has no interactivity and is basically just a mockup. 15 + A lexicon package is available for those using [atcute](https://github.com/mary-ext/atcute), but it is still under 16 + heavy development. We do not recommend 17 + using it in any production environment until the AppView is functionally complete. 13 18 14 19 ## what's in here? 15 20 16 - the project is sorted into different sections, with each root-level folder signifying a package. 21 + The project is sorted into different sections, with each root-level folder signifying a package. 17 22 18 - each section will usually contain its own README.md file dedicated to it, going into more detail about that specific 23 + Each section will usually contain its own README.md file dedicated to it, going into more detail about that specific 19 24 package. 20 25 21 26 | package | description | 22 27 |--------------------------------------------------------------------------|---------------------------------------------------| 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 | 28 + | [``backend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/backend) | The reference AppView written using Node and Hono | 29 + | [``frontend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/frontend) | The reference client written in Solid | 30 + | [``lexdocs``](https://tangled.sh/@hexmani.ac/clippr/tree/main/lexdocs) | The original Lexicon files | 31 + | [``lexicons``](https://tangled.sh/@hexmani.ac/clippr/tree/main/lexicons) | An atcute package for the clippr lexicons | 27 32 28 33 ## roadmap 29 34 30 - soonโ„ข๏ธ 35 + soonโ„ข๏ธ 36 + 37 + ## license 38 + 39 + All project code is licensed as free software under the 40 + [**GNU Affero General Public License**](https://tangled.sh/@hexmani.ac/clippr/blob/main/LICENSE), exclusively under 41 + version 3. However, the Lexicon schema files are licensed under the permissive 42 + [**MIT License**](https://tangled.sh/@hexmani.ac/clippr/blob/main/lexdocs/LICENSE) to encourage forks and to allow them 43 + to be used in projects that are incompatible with the AGPL.
+16 -17
backend/README.md
··· 1 1 # @clipprjs/server 2 2 3 - typescript implementation of clippr appview using ~~bun~~ deno and hono 3 + TypeScript implementation of the Clippr AppView, using ~~Bun~~ NodeJS and Hono. 4 + 5 + > **Why not Bun?** We currently aren't using Bun due to some compatibility errors. A migration to 6 + > Bun is planned in the future, preferably before launch. 4 7 5 - ## run and develop 8 + ## Start development server 6 9 7 10 ```shell 8 11 pnpm install 12 + cp config.example.toml config.toml # Customize as necessary 9 13 pnpm run db:push 10 14 pnpm run dev 11 15 ``` 12 16 13 - open http://localhost:9090 and enjoy 14 - 15 - ## build for production 17 + ## Build for production 16 18 17 19 ```shell 18 20 pnpm install 21 + cp config.example.toml config.toml # Customize as necessary 19 22 pnpm run db:push 20 23 pnpm run build 21 24 pnpm run start 22 25 ``` 23 26 27 + Open http://localhost:9090 and enjoy 28 + 24 29 ## current status 25 30 26 - right now we're not running on bun because there are 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. 30 - 31 - ### checklist before it's usable 32 - 33 31 - โœ… Ingesting content from the firehose (using Jetstream) 34 - - โœ… Creating the lexicon documents and validating content that comes in from the firehose 32 + - โœ… Validating incoming content according to the Lexicon schema 35 33 - โœ… 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 34 + - โœ… Support for DID service proxying and Nodeinfo 35 + - ๐ŸŸก API documentation 36 + - ๐ŸŸก Creating responses to unauthenticated API calls 37 + - ๐ŸŸก Interactions with the frontend 38 + - ๐Ÿ”ด Creating responses to authenticated API calls
+17 -4
backend/config.example.toml
··· 2 2 ## Please copy to "config.example.toml" before starting the server, 3 3 ## otherwise it will not start. Modify as necessary. 4 4 5 + ## Where the server is broadcasted to. 5 6 hostname = "localhost" 6 7 port = 9090 7 8 9 + ## Where the server will be deployed to. 10 + baseUrl = "https://localhost:9090" 11 + 8 12 ## For most deployments, you will want to keep the log level at "info". 9 - ## If you are debugging the software, move it down to "debug". 13 + ## If you are a developer, move it down to "debug" for more information. 10 14 ## 11 15 ## List of all recognized log levels, sorted by importance: 12 16 ## "error" - Critical errors, typically leading to a crash or a degraded state. ··· 16 20 ## "verbose" - Details more of the server's operations. 17 21 ## "debug" - Information for developers, meant for debugging. 18 22 ## "silly" - Anything goes. 19 - log-level = "info" 23 + logLevel = "info" 20 24 21 25 ## How the SQLite database is stored. 22 - ## For testing, you can store the database in memory with ":memory:" 26 + ## NOTE: Storing the database in-memory does not work as the schema is not properly loaded. Fixme! 23 27 [database] 24 28 ## Paths can be used here. 29 + ## It is not recommended to change this if you are using Docker. 25 30 name = "file:clippr.db" 26 31 27 32 ## How the server interacts with the ATproto network. 28 33 [network] 29 - firehose = "jetstream1.us-east.bsky.network" 34 + ## What Jetstream instance to use for receiving content from the network. 35 + ## Non-Bluesky relay: relay2.fire.hose.cam 36 + firehose = "jetstream1.us-east.bsky.network" 37 + ## What DID to use for service proxying. This should be the domain that the API is accessible from. 38 + ## Default: "did:web:localhost%3A9090" 39 + serviceDid = "did:web:localhost%3A9090" 40 + ## A multibase public key to use for DID service proxying, formatted as "did:key:[key]". 41 + ## Do not use the default key outside of development. 42 + didSigningKey = "did:key:zDnaeuuRRQuYp4S76LwosLhHbpU1HJcg6S5oJAUHmdZLVdLM5"
+2 -7
backend/drizzle.config.ts
··· 8 8 // @ts-expect-error Read from the TypeScript file instead of assuming that it's JavaScript 9 9 import { Config } from "./src/config.ts"; 10 10 11 - const config = Config.getInstance(); 12 - let dbname; 13 - 14 - dbname = config.get("database.name"); 15 - if (typeof dbname !== "string") { 16 - dbname = "file:clippr.db"; // Only way to disable linter error 17 - } 11 + const config = Config.getInstance().getConfig(); 12 + const dbname = config.database.name; 18 13 19 14 export default defineConfig({ 20 15 out: "./drizzle",
+10 -7
backend/package.json
··· 9 9 "start": "node dist/src/main.js", 10 10 "lint": "npx eslint .", 11 11 "lint-write": "npx eslint . --fix", 12 + "test": "vitest", 12 13 "fmt": "npx prettier --write .", 13 14 "db:push": "npx drizzle-kit push" 14 15 }, ··· 18 19 "node": ">=22.16.0" 19 20 }, 20 21 "dependencies": { 21 - "@atcute/atproto": "^3.1.1", 22 + "@atcute/atproto": "^3.1.2", 22 23 "@atcute/client": "^4.0.3", 24 + "@atcute/crypto": "^2.2.4", 23 25 "@atcute/identity": "^1.0.3", 24 26 "@atcute/identity-resolver": "^1.1.3", 25 27 "@atcute/lexicon-doc": "^1.0.3", 26 - "@atcute/lexicons": "^1.1.0", 27 - "@clipprjs/lexicons": "^1.0.2", 28 + "@atcute/lexicons": "^1.1.1", 29 + "@clipprjs/lexicons": "^1.0.3", 28 30 "@eslint/eslintrc": "^3.3.1", 29 31 "@hono/node-server": "^1.19.0", 30 32 "@libsql/client": "^0.15.12", 31 - "@scalar/hono-api-reference": "^0.9.13", 32 - "@scalar/openapi-to-markdown": "^0.2.26", 33 + "@scalar/hono-api-reference": "^0.9.15", 34 + "@scalar/openapi-to-markdown": "^0.2.28", 33 35 "@skyware/jetstream": "^0.2.5", 34 36 "drizzle-orm": "^0.44.4", 35 - "hono": "^4.9.2", 37 + "hono": "^4.9.4", 36 38 "toml": "^3.0.0", 37 39 "winston": "^3.17.0", 38 40 "xxhash-wasm": "^1.1.0" ··· 54 56 "prettier": "^3.6.2", 55 57 "tsx": "^4.20.4", 56 58 "typescript": "^5.9.2", 57 - "typescript-eslint": "^8.40.0" 59 + "typescript-eslint": "^8.40.0", 60 + "vitest": "^3.2.4" 58 61 } 59 62 }
+854 -216
backend/pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@atcute/atproto': 12 - specifier: ^3.1.1 13 - version: 3.1.1 12 + specifier: ^3.1.2 13 + version: 3.1.2 14 14 '@atcute/client': 15 15 specifier: ^4.0.3 16 16 version: 4.0.3 17 + '@atcute/crypto': 18 + specifier: ^2.2.4 19 + version: 2.2.4 17 20 '@atcute/identity': 18 21 specifier: ^1.0.3 19 22 version: 1.0.3 ··· 24 27 specifier: ^1.0.3 25 28 version: 1.0.3 26 29 '@atcute/lexicons': 27 - specifier: ^1.1.0 28 - version: 1.1.0 30 + specifier: ^1.1.1 31 + version: 1.1.1 29 32 '@clipprjs/lexicons': 30 - specifier: ^1.0.2 31 - version: 1.0.2 33 + specifier: ^1.0.3 34 + version: 1.0.3 32 35 '@eslint/eslintrc': 33 36 specifier: ^3.3.1 34 37 version: 3.3.1 35 38 '@hono/node-server': 36 39 specifier: ^1.19.0 37 - version: 1.19.0(hono@4.9.2) 40 + version: 1.19.0(hono@4.9.4) 38 41 '@libsql/client': 39 42 specifier: ^0.15.12 40 43 version: 0.15.12 41 44 '@scalar/hono-api-reference': 42 - specifier: ^0.9.13 43 - version: 0.9.13(hono@4.9.2) 45 + specifier: ^0.9.15 46 + version: 0.9.15(hono@4.9.4) 44 47 '@scalar/openapi-to-markdown': 45 - specifier: ^0.2.26 46 - version: 0.2.26(typescript@5.9.2) 48 + specifier: ^0.2.28 49 + version: 0.2.28(typescript@5.9.2) 47 50 '@skyware/jetstream': 48 51 specifier: ^0.2.5 49 52 version: 0.2.5 ··· 51 54 specifier: ^0.44.4 52 55 version: 0.44.4(@libsql/client@0.15.12)(bun-types@1.2.17) 53 56 hono: 54 - specifier: ^4.9.2 55 - version: 4.9.2 57 + specifier: ^4.9.4 58 + version: 4.9.4 56 59 toml: 57 60 specifier: ^3.0.0 58 61 version: 3.0.0 ··· 114 117 typescript-eslint: 115 118 specifier: ^8.40.0 116 119 version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 120 + vitest: 121 + specifier: ^3.2.4 122 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 117 123 118 124 packages: 119 125 120 - '@atcute/atproto@3.1.1': 121 - resolution: {integrity: sha512-D+RLTIPF0xLu7BPZY8KSewAPemJFh+3n3zeQ3ROsLxbTtCHbrTDMAmAFexaVRAPGcPYrwXaBUlv7yZjScJolMg==} 126 + '@atcute/atproto@3.1.2': 127 + resolution: {integrity: sha512-m6OWoGTeL8Wlw7cm8Nrf+NU24rlx5A0DzxEQQPPu1wqYNHw6S33nOU90W+U09vVN0aZGZUrLFfWWhAaSWTp1ZQ==} 122 128 123 - '@atcute/bluesky@3.2.0': 124 - resolution: {integrity: sha512-OqPLqUNjXcgQ25MaPdU7H0QcWmZrx6QQk7d5B22A5U4xy+hZJ954kQ5mSAn24Bt0DEm4j/isq1WZovr3vaPTUA==} 129 + '@atcute/bluesky@3.2.1': 130 + resolution: {integrity: sha512-WehZuGNEC9NNB2y7Jg/i4ANzbMEQzs2EwrLYKWDuvJT3YnPHEol3vkc4DK47TODs3TiacQJp4MWhsQyfktsZ6g==} 125 131 126 132 '@atcute/client@4.0.3': 127 133 resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 134 + 135 + '@atcute/crypto@2.2.4': 136 + resolution: {integrity: sha512-88LbuJr63bbdJywd949YgbEiaaW4UU5iXJcFE1WqY/5ItYuoHWVdmL3XsqehiM0AfzvrYEfd5ox2wm9CK9dyQQ==} 128 137 129 138 '@atcute/identity-resolver@1.1.3': 130 139 resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==} ··· 141 150 '@atcute/lexicon-doc@1.0.3': 142 151 resolution: {integrity: sha512-U7rinsTOwXGGcrF6/s7GzTXargcQpDr4BTrj5ci/XTK+POEK5jpcI+Ag1fF932pBX3k97em6y4TWwTSO8M/McQ==} 143 152 144 - '@atcute/lexicons@1.1.0': 145 - resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 153 + '@atcute/lexicons@1.1.1': 154 + resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==} 155 + 156 + '@atcute/multibase@1.1.5': 157 + resolution: {integrity: sha512-vbmEFxgpntMuRqVZOCBgf6bgq69UGrlznQCZirVSit/mlcgyFVkSGbSEfkRnpIcrM8SnaySwuKbVvL+EPLh2dw==} 158 + 159 + '@atcute/uint8array@1.0.4': 160 + resolution: {integrity: sha512-9jASMDghzhhDwjF3+eW+ZIauvytnUWDPfUVGUValRwnf9AZ7Yqqkc76tC89HVzVDAlJdhwQIUG2dQBsiVqumUA==} 146 161 147 162 '@atcute/util-fetch@1.0.1': 148 163 resolution: {integrity: sha512-Clc0E/5ufyGBVfYBUwWNlHONlZCoblSr4Ho50l1LhmRPGB1Wu/AQ9Sz+rsBg7fdaW/auve8ulmwhRhnX2cGRow==} ··· 168 183 resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 169 184 engines: {node: '>= 18'} 170 185 171 - '@clipprjs/lexicons@1.0.2': 172 - resolution: {integrity: sha512-AIof/RWAtwq/8ygMSNS5KzElbPdXWD9WEX4uGCgAb0RQ/FJUe41X7gIpL0MYOrVtLmOwH+A5rHxq8o3Tn3b8Sg==} 186 + '@clipprjs/lexicons@1.0.3': 187 + resolution: {integrity: sha512-RmdrHXcIXBuLcqoDyLexJKNdz06wCvZsHxDlo8XY54J7Qpm7Sp5+K9jeeuEYJEiFZ1b6Tds0aggvi9s0s0NrMw==} 173 188 174 189 '@colors/colors@1.6.0': 175 190 resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} ··· 523 538 '@floating-ui/core@1.7.3': 524 539 resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} 525 540 526 - '@floating-ui/dom@1.7.3': 527 - resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} 541 + '@floating-ui/dom@1.7.4': 542 + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} 528 543 529 544 '@floating-ui/utils@0.2.10': 530 545 resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} 531 546 532 - '@floating-ui/vue@1.1.8': 533 - resolution: {integrity: sha512-SNJAa1jbT8Gh1LvWw2uIIViLL0saV2bCY59ISCvJzhbut5DSb2H3LKUK49Xkd7SixTNHKX4LFu59nbwIXt9jjQ==} 547 + '@floating-ui/vue@1.1.9': 548 + resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} 534 549 535 550 '@headlessui/vue@1.7.23': 536 551 resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} ··· 668 683 '@neon-rs/load@0.0.4': 669 684 resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} 670 685 686 + '@noble/secp256k1@2.3.0': 687 + resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==} 688 + 671 689 '@nodelib/fs.scandir@2.1.5': 672 690 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 673 691 engines: {node: '>= 8'} ··· 687 705 resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} 688 706 engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 689 707 708 + '@rollup/rollup-android-arm-eabi@4.50.0': 709 + resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==} 710 + cpu: [arm] 711 + os: [android] 712 + 713 + '@rollup/rollup-android-arm64@4.50.0': 714 + resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==} 715 + cpu: [arm64] 716 + os: [android] 717 + 718 + '@rollup/rollup-darwin-arm64@4.50.0': 719 + resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==} 720 + cpu: [arm64] 721 + os: [darwin] 722 + 723 + '@rollup/rollup-darwin-x64@4.50.0': 724 + resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==} 725 + cpu: [x64] 726 + os: [darwin] 727 + 728 + '@rollup/rollup-freebsd-arm64@4.50.0': 729 + resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==} 730 + cpu: [arm64] 731 + os: [freebsd] 732 + 733 + '@rollup/rollup-freebsd-x64@4.50.0': 734 + resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==} 735 + cpu: [x64] 736 + os: [freebsd] 737 + 738 + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': 739 + resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==} 740 + cpu: [arm] 741 + os: [linux] 742 + 743 + '@rollup/rollup-linux-arm-musleabihf@4.50.0': 744 + resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==} 745 + cpu: [arm] 746 + os: [linux] 747 + 748 + '@rollup/rollup-linux-arm64-gnu@4.50.0': 749 + resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==} 750 + cpu: [arm64] 751 + os: [linux] 752 + 753 + '@rollup/rollup-linux-arm64-musl@4.50.0': 754 + resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==} 755 + cpu: [arm64] 756 + os: [linux] 757 + 758 + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': 759 + resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==} 760 + cpu: [loong64] 761 + os: [linux] 762 + 763 + '@rollup/rollup-linux-ppc64-gnu@4.50.0': 764 + resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==} 765 + cpu: [ppc64] 766 + os: [linux] 767 + 768 + '@rollup/rollup-linux-riscv64-gnu@4.50.0': 769 + resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==} 770 + cpu: [riscv64] 771 + os: [linux] 772 + 773 + '@rollup/rollup-linux-riscv64-musl@4.50.0': 774 + resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==} 775 + cpu: [riscv64] 776 + os: [linux] 777 + 778 + '@rollup/rollup-linux-s390x-gnu@4.50.0': 779 + resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==} 780 + cpu: [s390x] 781 + os: [linux] 782 + 783 + '@rollup/rollup-linux-x64-gnu@4.50.0': 784 + resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==} 785 + cpu: [x64] 786 + os: [linux] 787 + 788 + '@rollup/rollup-linux-x64-musl@4.50.0': 789 + resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==} 790 + cpu: [x64] 791 + os: [linux] 792 + 793 + '@rollup/rollup-openharmony-arm64@4.50.0': 794 + resolution: {integrity: sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==} 795 + cpu: [arm64] 796 + os: [openharmony] 797 + 798 + '@rollup/rollup-win32-arm64-msvc@4.50.0': 799 + resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==} 800 + cpu: [arm64] 801 + os: [win32] 802 + 803 + '@rollup/rollup-win32-ia32-msvc@4.50.0': 804 + resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==} 805 + cpu: [ia32] 806 + os: [win32] 807 + 808 + '@rollup/rollup-win32-x64-msvc@4.50.0': 809 + resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==} 810 + cpu: [x64] 811 + os: [win32] 812 + 690 813 '@rtsao/scc@1.1.0': 691 814 resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 692 815 ··· 694 817 resolution: {integrity: sha512-WUUVDd1Wk7QJVKWXl/Zdn/VINc2pc1NlWW8VJFYZRm3/hKJwBhi0on7+HjVQNKgUaRy7+zluru5Ckl1gcTHHEg==} 695 818 engines: {node: '>=20'} 696 819 697 - '@scalar/components@0.14.23': 698 - resolution: {integrity: sha512-rmIMRrlqOWlXAJaVbr9DArrKKp95P2fllNM69VrEAHtwMReambBRKuC02cQPwOZcbZCtPx4dZsv2aUB5QdtecQ==} 820 + '@scalar/components@0.14.25': 821 + resolution: {integrity: sha512-1lYVHa+9QVawEipFSBA/H9ROJJLijcAQ/kaFuTkJnZMS5DZ8aRB423TxVApJNSlMm96f8KGzIwS7Fq3sNYsXJg==} 699 822 engines: {node: '>=20'} 700 823 701 - '@scalar/core@0.3.11': 702 - resolution: {integrity: sha512-4O3mC29k2STz4quBHrpsl6czxi94F3dy8Ej/OPbELS2myKO4GoxromT0BiKSLPAThCnmJ0rqMZ7k9NsgzVjEgA==} 824 + '@scalar/core@0.3.13': 825 + resolution: {integrity: sha512-lgrueSjR1eacM39Zg0jAHikGomGAF2o2/s/5EcMz/ul7VLo/IBymw8gUjcGHZ9zd8PFGdo8DvOwFMRCiXiaDHw==} 703 826 engines: {node: '>=20'} 704 827 705 - '@scalar/helpers@0.0.7': 706 - resolution: {integrity: sha512-ieexJgofs0PPAp3yxz+0S2tI/GWvo9btxplHE5KxUiWwq2bksYnrhrt+gwe4DoGPRaajzutzJuD1u4VnJd9bNA==} 828 + '@scalar/helpers@0.0.8': 829 + resolution: {integrity: sha512-9A1CxL3jV7Kl9wGu86/cR/wiJN6J+3tK4WuW3252s2gF+upXsgQRx9WLhFF3xifOP1irIGusitZBiojiKmUSVg==} 707 830 engines: {node: '>=20'} 708 831 709 - '@scalar/hono-api-reference@0.9.13': 710 - resolution: {integrity: sha512-79Gs+/2/FcqwZ3Lp0lsv3pFKHY1qBF2ONkfgh/gxRsd8Z+RZRTDBZafe7OConj+c4tHm0Zz3bKTKEV0OMQi/aA==} 832 + '@scalar/hono-api-reference@0.9.15': 833 + resolution: {integrity: sha512-Lx/ity79xA3pdp624ikccDwvlY30M79e/1jvl/LjPDToc0byMr2tUVyHbmMhuaX8PVPlUKkdO97XGw0+M5IZJg==} 711 834 engines: {node: '>=20'} 712 835 peerDependencies: 713 836 hono: ^4.0.0 714 837 715 - '@scalar/icons@0.4.6': 716 - resolution: {integrity: sha512-ho9ee29Ik+Jv17bSaQEXvGn1e2ydNEyc7Sv8A8hqPq084aIOiTBtVFISPPt+k/O6z0SIRayfL8FEZqr93GyZPg==} 838 + '@scalar/icons@0.4.7': 839 + resolution: {integrity: sha512-0qXPGRdZ180TMfejWCPYy7ILszBrAraq4KBhPtcM12ghc5qkncFWWpTm5yXI/vrbm10t7wvtTK08CLZ36CnXlQ==} 717 840 engines: {node: '>=20'} 718 841 719 - '@scalar/json-magic@0.1.0': 720 - resolution: {integrity: sha512-Slq3nheaAzbhLMdjgKHsJBNyEYv2ekDnWaOagOflo6K5XOx6UTmCLclaj26z89ihpTgWWtQJIRDC8bsRIJwpAg==} 842 + '@scalar/json-magic@0.3.0': 843 + resolution: {integrity: sha512-RmX6tIsV76xHioQWVTB1By85+7tbBkKFFbMn3p+1s5PrPiK/U20AAv9OUTt6f5U5fjaTSuaQNVyyhn5SYjtBQQ==} 721 844 engines: {node: '>=20'} 722 845 723 - '@scalar/oas-utils@0.4.18': 724 - resolution: {integrity: sha512-1VsTZLIEThZ7vwa3Fych4Ks1VTf8JetCuP8LA1VlamAhl/+qpLn9mgvxKSAdTyiLzM8ST5jtDi/Pg/2qWbTlzw==} 846 + '@scalar/oas-utils@0.4.20': 847 + resolution: {integrity: sha512-zr7WLN6s6OLH+/BitInXOQxGOAr4ZDcIrQi6RFFc+U7F26rmhvhAN0qZXv8ew8SPnWyugH2PGjxZg0IgLs7+lQ==} 725 848 engines: {node: '>=20'} 726 849 727 - '@scalar/object-utils@1.2.3': 728 - resolution: {integrity: sha512-1LW2pHs2jp5ixyK+NdpAyuUlOL+iJ8wQ0P2EgV45vLJ8YeZo5DtxQbKuFyqoaviTYjg2MWs1exavYP/qAaSqyQ==} 850 + '@scalar/object-utils@1.2.4': 851 + resolution: {integrity: sha512-lX/+9Sp6euZvbsikGRZiHwmfbLd0oTLTttKbJF9v2EkahSrQUT0WF835Ct2N0R8xSkyQauDhT2xCfuA0QNqDeA==} 729 852 engines: {node: '>=20'} 730 853 731 - '@scalar/openapi-parser@0.19.0': 732 - resolution: {integrity: sha512-U1FDug4NFK+o1ib93L2MerW13s61sEDPDgrmO14mp5qAV5iYkC2l0KqKQLMIbt3sWw6fDy900eXNKIgUuge4BA==} 854 + '@scalar/openapi-parser@0.20.0': 855 + resolution: {integrity: sha512-gsqpiDP9BuZNMx8Ma9UXapdoorIXiyAwr3qra/Zb3CsShun2KQoq20jSMJzVSTAm8HnBmNlZIQm1jSUvzDW5Tw==} 733 856 engines: {node: '>=20'} 734 857 735 - '@scalar/openapi-to-markdown@0.2.26': 736 - resolution: {integrity: sha512-GqA1aItKQoTz6r36ClCSPqLCPHFDvMT4f7oNeg0mdzcNzN7/EE9DdMqNQFihkg5OPtl32nQFxL+r/XFwgGXDlQ==} 858 + '@scalar/openapi-to-markdown@0.2.28': 859 + resolution: {integrity: sha512-IB1P48kgLzCjVJQfkR0E2+qnnNY9uDLfYrStfZN5drhvWO/EmT7EIgGvGVj7XJHga7B9UVIL+s6CtfhUkPN0EA==} 737 860 engines: {node: '>=20'} 738 861 739 862 '@scalar/openapi-types@0.3.7': 740 863 resolution: {integrity: sha512-QHSvHBVDze3+dUwAhIGq6l1iOev4jdoqdBK7QpfeN1Q4h+6qpVEw3EEqBiH0AXUSh/iWwObBv4uMgfIx0aNZ5g==} 741 864 engines: {node: '>=20'} 742 865 743 - '@scalar/snippetz@0.4.4': 744 - resolution: {integrity: sha512-Vml82Jhzr10lLj4bUrwZAcn4ym63pzfH+fOkrJ0Ig/dM9dP1bAHmwHkEDaUQkiGM6x2KIhe2eMsJtO7Y+VgHOQ==} 866 + '@scalar/snippetz@0.4.5': 867 + resolution: {integrity: sha512-Pp4EDn5BAA1b/srgm6b7iD23UwzQISdQOh+Ai3gTWFePZlMHNuQBAiaqgDyINs1YUAgkBP+VDLBVlWMCjWC93A==} 745 868 engines: {node: '>=20'} 746 869 747 - '@scalar/themes@0.13.12': 748 - resolution: {integrity: sha512-fM010t8npZ8XqGle7ZjoAFGEfzkJ1XjEk1W3OJ5nLzSLq3hXXp72f4wHp6eaKoDWw8rFq+ZeOZk1GP7PgSr/Jw==} 870 + '@scalar/themes@0.13.13': 871 + resolution: {integrity: sha512-H67wm2Wfds6f+ygb/1qHWaKdieJdU8aGsU8qjGQamYPQriz6m6gr/AYNAc8B73I04ZXLswzJ6Doj/JcounPKZA==} 749 872 engines: {node: '>=20'} 750 873 751 - '@scalar/types@0.2.11': 752 - resolution: {integrity: sha512-SUZzGmoisWsYv33LmmT/ajvSlcl9ZDj9d5RncJ+wB9ZQ2l018xlfpDIH9Kdfo+6KCKQOe3LYLXfH4Lzm891Mag==} 874 + '@scalar/types@0.2.12': 875 + resolution: {integrity: sha512-CW7jS+gpc3lZdjf+888++I9HtsGCk6zbh4lZscY8spcg/dlXXd3ReYicxee/cx+soDjU1d/Pcqj9o/QqvTFYxQ==} 753 876 engines: {node: '>=20'} 754 877 755 878 '@scalar/use-hooks@0.2.4': ··· 760 883 resolution: {integrity: sha512-u+o77cdTNZ5ePqHPu8ZcFw1BLlISv+cthN0bR1zJHXmqBjvanFTy2kL+Gmv3eW9HxZiHdqycKVETlYd0mWiqJQ==} 761 884 engines: {node: '>=20'} 762 885 763 - '@scalar/workspace-store@0.12.0': 764 - resolution: {integrity: sha512-e0OMEYTrQ6D/8gg4lAIim5lL5utK+8zLH5mdriYY34L9UszLTbzGTesZBfNA15Eao1mo7f3hbyRJPPBydwo0rw==} 886 + '@scalar/workspace-store@0.14.0': 887 + resolution: {integrity: sha512-60gY3e3vsPn2ue1kMt4SlAM5mBZHObi0tGVZWYxwkXxvaKik2HaEpHQWZov7F6ZullCy1ECXNThzVE63zjqw9g==} 765 888 engines: {node: '>=18'} 766 889 767 - '@sinclair/typebox@0.34.37': 768 - resolution: {integrity: sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==} 890 + '@sinclair/typebox@https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz': 891 + resolution: {tarball: https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz} 892 + version: 0.34.38 769 893 770 894 '@skyware/jetstream@0.2.5': 771 895 resolution: {integrity: sha512-fM/zs03DLwqRyzZZJFWN20e76KrdqIp97Tlm8Cek+vxn96+tu5d/fx79V6H85L0QN6HvGiX2l9A8hWFqHvYlOA==} ··· 781 905 peerDependencies: 782 906 vue: ^2.7.0 || ^3.0.0 783 907 908 + '@types/chai@5.2.2': 909 + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 910 + 784 911 '@types/debug@4.1.12': 785 912 resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 913 + 914 + '@types/deep-eql@4.0.2': 915 + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 786 916 787 917 '@types/estree@1.0.8': 788 918 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} ··· 885 1015 '@ungap/structured-clone@1.3.0': 886 1016 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 887 1017 888 - '@vue/compiler-core@3.5.18': 889 - resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} 1018 + '@vitest/expect@3.2.4': 1019 + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} 1020 + 1021 + '@vitest/mocker@3.2.4': 1022 + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} 1023 + peerDependencies: 1024 + msw: ^2.4.9 1025 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 1026 + peerDependenciesMeta: 1027 + msw: 1028 + optional: true 1029 + vite: 1030 + optional: true 1031 + 1032 + '@vitest/pretty-format@3.2.4': 1033 + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} 1034 + 1035 + '@vitest/runner@3.2.4': 1036 + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} 1037 + 1038 + '@vitest/snapshot@3.2.4': 1039 + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} 1040 + 1041 + '@vitest/spy@3.2.4': 1042 + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} 1043 + 1044 + '@vitest/utils@3.2.4': 1045 + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} 890 1046 891 - '@vue/compiler-dom@3.5.18': 892 - resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} 1047 + '@vue/compiler-core@3.5.19': 1048 + resolution: {integrity: sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==} 893 1049 894 - '@vue/compiler-sfc@3.5.18': 895 - resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==} 1050 + '@vue/compiler-dom@3.5.19': 1051 + resolution: {integrity: sha512-Drs6rPHQZx/pN9S6ml3Z3K/TWCIRPvzG2B/o5kFK9X0MNHt8/E+38tiRfojufrYBfA6FQUFB2qBBRXlcSXWtOA==} 896 1052 897 - '@vue/compiler-ssr@3.5.18': 898 - resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==} 1053 + '@vue/compiler-sfc@3.5.19': 1054 + resolution: {integrity: sha512-YWCm1CYaJ+2RvNmhCwI7t3I3nU+hOrWGWMsn+Z/kmm1jy5iinnVtlmkiZwbLlbV1SRizX7vHsc0/bG5dj0zRTg==} 899 1055 900 - '@vue/reactivity@3.5.18': 901 - resolution: {integrity: sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==} 1056 + '@vue/compiler-ssr@3.5.19': 1057 + resolution: {integrity: sha512-/wx0VZtkWOPdiQLWPeQeqpHWR/LuNC7bHfSX7OayBTtUy8wur6vT6EQIX6Et86aED6J+y8tTw43qo2uoqGg5sw==} 902 1058 903 - '@vue/runtime-core@3.5.18': 904 - resolution: {integrity: sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==} 1059 + '@vue/reactivity@3.5.19': 1060 + resolution: {integrity: sha512-4bueZg2qs5MSsK2dQk3sssV0cfvxb/QZntTC8v7J448GLgmfPkQ+27aDjlt40+XFqOwUq5yRxK5uQh14Fc9eVA==} 1061 + 1062 + '@vue/runtime-core@3.5.19': 1063 + resolution: {integrity: sha512-TaooCr8Hge1sWjLSyhdubnuofs3shhzZGfyD11gFolZrny76drPwBVQj28/z/4+msSFb18tOIg6VVVgf9/IbIA==} 905 1064 906 - '@vue/runtime-dom@3.5.18': 907 - resolution: {integrity: sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==} 1065 + '@vue/runtime-dom@3.5.19': 1066 + resolution: {integrity: sha512-qmahqeok6ztuUTmV8lqd7N9ymbBzctNF885n8gL3xdCC1u2RnM/coX16Via0AiONQXUoYpxPojL3U1IsDgSWUQ==} 908 1067 909 - '@vue/server-renderer@3.5.18': 910 - resolution: {integrity: sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==} 1068 + '@vue/server-renderer@3.5.19': 1069 + resolution: {integrity: sha512-ZJ/zV9SQuaIO+BEEVq/2a6fipyrSYfjKMU3267bPUk+oTx/hZq3RzV7VCh0Unlppt39Bvh6+NzxeopIFv4HJNg==} 911 1070 peerDependencies: 912 - vue: 3.5.18 1071 + vue: 3.5.19 913 1072 914 - '@vue/shared@3.5.18': 915 - resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} 1073 + '@vue/shared@3.5.19': 1074 + resolution: {integrity: sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==} 916 1075 917 1076 '@vueuse/core@10.11.1': 918 1077 resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} ··· 999 1158 resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 1000 1159 engines: {node: '>= 0.4'} 1001 1160 1161 + assertion-error@2.0.1: 1162 + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 1163 + engines: {node: '>=12'} 1164 + 1002 1165 async-function@1.0.0: 1003 1166 resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 1004 1167 engines: {node: '>= 0.4'} ··· 1032 1195 bun-types@1.2.17: 1033 1196 resolution: {integrity: sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ==} 1034 1197 1198 + cac@6.7.14: 1199 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1200 + engines: {node: '>=8'} 1201 + 1035 1202 call-bind-apply-helpers@1.0.2: 1036 1203 resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 1037 1204 engines: {node: '>= 0.4'} ··· 1053 1220 1054 1221 ccount@2.0.1: 1055 1222 resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 1223 + 1224 + chai@5.3.3: 1225 + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} 1226 + engines: {node: '>=18'} 1056 1227 1057 1228 chalk@4.1.2: 1058 1229 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} ··· 1071 1242 character-entities@2.0.2: 1072 1243 resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 1073 1244 1245 + check-error@2.1.1: 1246 + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1247 + engines: {node: '>= 16'} 1248 + 1074 1249 clean-css@5.3.3: 1075 1250 resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} 1076 1251 engines: {node: '>= 10.0'} ··· 1174 1349 1175 1350 decode-named-character-reference@1.2.0: 1176 1351 resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} 1352 + 1353 + deep-eql@5.0.2: 1354 + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 1355 + engines: {node: '>=6'} 1177 1356 1178 1357 deep-is@0.1.4: 1179 1358 resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} ··· 1330 1509 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 1331 1510 engines: {node: '>= 0.4'} 1332 1511 1512 + es-module-lexer@1.7.0: 1513 + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 1514 + 1333 1515 es-object-atoms@1.1.1: 1334 1516 resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 1335 1517 engines: {node: '>= 0.4'} ··· 1472 1654 estree-walker@2.0.2: 1473 1655 resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1474 1656 1657 + estree-walker@3.0.3: 1658 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1659 + 1475 1660 esutils@2.0.3: 1476 1661 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1477 1662 engines: {node: '>=0.10.0'} ··· 1479 1664 event-target-polyfill@0.0.4: 1480 1665 resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} 1481 1666 1667 + expect-type@1.2.2: 1668 + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 1669 + engines: {node: '>=12.0.0'} 1670 + 1482 1671 extend@3.0.2: 1483 1672 resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 1484 1673 ··· 1504 1693 fastq@1.19.1: 1505 1694 resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 1506 1695 1696 + fdir@6.5.0: 1697 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 1698 + engines: {node: '>=12.0.0'} 1699 + peerDependencies: 1700 + picomatch: ^3 || ^4 1701 + peerDependenciesMeta: 1702 + picomatch: 1703 + optional: true 1704 + 1507 1705 fecha@4.2.3: 1508 1706 resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} 1509 1707 ··· 1696 1894 highlightjs-vue@1.0.0: 1697 1895 resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} 1698 1896 1699 - hono@4.9.2: 1700 - resolution: {integrity: sha512-UG2jXGS/gkLH42l/1uROnwXpkjvvxkl3kpopL3LBo27NuaDPI6xHNfuUSilIHcrBkPfl4y0z6y2ByI455TjNRw==} 1897 + hono@4.9.4: 1898 + resolution: {integrity: sha512-61hl6MF6ojTl/8QSRu5ran6GXt+6zsngIUN95KzF5v5UjiX/xnrLR358BNRawwIRO49JwUqJqQe3Rb2v559R8Q==} 1701 1899 engines: {node: '>=16.9.0'} 1702 1900 1703 1901 html-minifier-terser@7.2.0: ··· 1870 2068 js-base64@3.7.8: 1871 2069 resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} 1872 2070 2071 + js-tokens@9.0.1: 2072 + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 2073 + 1873 2074 js-yaml@4.1.0: 1874 2075 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1875 2076 hasBin: true ··· 1937 2138 longest-streak@3.1.0: 1938 2139 resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 1939 2140 2141 + loupe@3.2.1: 2142 + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} 2143 + 1940 2144 lower-case@2.0.2: 1941 2145 resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1942 2146 1943 2147 lowlight@3.3.0: 1944 2148 resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} 1945 2149 1946 - magic-string@0.30.17: 1947 - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 2150 + magic-string@0.30.18: 2151 + resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} 1948 2152 1949 2153 markdown-table@3.0.4: 1950 2154 resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} ··· 2195 2399 path-parse@1.0.7: 2196 2400 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2197 2401 2402 + pathe@2.0.3: 2403 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 2404 + 2405 + pathval@2.0.1: 2406 + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} 2407 + engines: {node: '>= 14.16'} 2408 + 2198 2409 picocolors@1.1.1: 2199 2410 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 2200 2411 ··· 2202 2413 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2203 2414 engines: {node: '>=8.6'} 2204 2415 2416 + picomatch@4.0.3: 2417 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 2418 + engines: {node: '>=12'} 2419 + 2205 2420 possible-typed-array-names@1.1.0: 2206 2421 resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 2207 2422 engines: {node: '>= 0.4'} ··· 2320 2535 resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 2321 2536 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2322 2537 2538 + rollup@4.50.0: 2539 + resolution: {integrity: sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==} 2540 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2541 + hasBin: true 2542 + 2323 2543 run-parallel@1.2.0: 2324 2544 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2325 2545 ··· 2390 2610 resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 2391 2611 engines: {node: '>= 0.4'} 2392 2612 2613 + siginfo@2.0.0: 2614 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2615 + 2393 2616 simple-swizzle@0.2.2: 2394 2617 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 2395 2618 ··· 2409 2632 2410 2633 stack-trace@0.0.10: 2411 2634 resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 2635 + 2636 + stackback@0.0.2: 2637 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 2638 + 2639 + std-env@3.9.0: 2640 + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 2412 2641 2413 2642 stop-iteration-iterator@1.1.0: 2414 2643 resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} ··· 2444 2673 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2445 2674 engines: {node: '>=8'} 2446 2675 2676 + strip-literal@3.0.0: 2677 + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 2678 + 2447 2679 supports-color@7.2.0: 2448 2680 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2449 2681 engines: {node: '>=8'} ··· 2470 2702 tiny-emitter@2.1.0: 2471 2703 resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} 2472 2704 2705 + tinybench@2.9.0: 2706 + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 2707 + 2708 + tinyexec@0.3.2: 2709 + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 2710 + 2711 + tinyglobby@0.2.15: 2712 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 2713 + engines: {node: '>=12.0.0'} 2714 + 2715 + tinypool@1.1.1: 2716 + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} 2717 + engines: {node: ^18.0.0 || >=20.0.0} 2718 + 2719 + tinyrainbow@2.0.0: 2720 + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 2721 + engines: {node: '>=14.0.0'} 2722 + 2723 + tinyspy@4.0.3: 2724 + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} 2725 + engines: {node: '>=14.0.0'} 2726 + 2473 2727 to-regex-range@5.0.1: 2474 2728 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2475 2729 engines: {node: '>=8.0'} ··· 2597 2851 vfile@6.0.3: 2598 2852 resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 2599 2853 2600 - vue-component-type-helpers@3.0.5: 2601 - resolution: {integrity: sha512-uoNZaJ+a1/zppa/Vgmi8zIOP2PHXDN2rT8NyF+zQRK6ZG94lNB9prcV0GdLJbY9i9lrD47JOVIH92SaiA7oJ1A==} 2854 + vite-node@3.2.4: 2855 + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} 2856 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2857 + hasBin: true 2858 + 2859 + vite@7.1.4: 2860 + resolution: {integrity: sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==} 2861 + engines: {node: ^20.19.0 || >=22.12.0} 2862 + hasBin: true 2863 + peerDependencies: 2864 + '@types/node': ^20.19.0 || >=22.12.0 2865 + jiti: '>=1.21.0' 2866 + less: ^4.0.0 2867 + lightningcss: ^1.21.0 2868 + sass: ^1.70.0 2869 + sass-embedded: ^1.70.0 2870 + stylus: '>=0.54.8' 2871 + sugarss: ^5.0.0 2872 + terser: ^5.16.0 2873 + tsx: ^4.8.1 2874 + yaml: ^2.4.2 2875 + peerDependenciesMeta: 2876 + '@types/node': 2877 + optional: true 2878 + jiti: 2879 + optional: true 2880 + less: 2881 + optional: true 2882 + lightningcss: 2883 + optional: true 2884 + sass: 2885 + optional: true 2886 + sass-embedded: 2887 + optional: true 2888 + stylus: 2889 + optional: true 2890 + sugarss: 2891 + optional: true 2892 + terser: 2893 + optional: true 2894 + tsx: 2895 + optional: true 2896 + yaml: 2897 + optional: true 2898 + 2899 + vitest@3.2.4: 2900 + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} 2901 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 2902 + hasBin: true 2903 + peerDependencies: 2904 + '@edge-runtime/vm': '*' 2905 + '@types/debug': ^4.1.12 2906 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 2907 + '@vitest/browser': 3.2.4 2908 + '@vitest/ui': 3.2.4 2909 + happy-dom: '*' 2910 + jsdom: '*' 2911 + peerDependenciesMeta: 2912 + '@edge-runtime/vm': 2913 + optional: true 2914 + '@types/debug': 2915 + optional: true 2916 + '@types/node': 2917 + optional: true 2918 + '@vitest/browser': 2919 + optional: true 2920 + '@vitest/ui': 2921 + optional: true 2922 + happy-dom: 2923 + optional: true 2924 + jsdom: 2925 + optional: true 2926 + 2927 + vue-component-type-helpers@3.0.6: 2928 + resolution: {integrity: sha512-6CRM8X7EJqWCJOiKPvSLQG+hJPb/Oy2gyJx3pLjUEhY7PuaCthQu3e0zAGI1lqUBobrrk9IT0K8sG2GsCluxoQ==} 2602 2929 2603 2930 vue-demi@0.14.10: 2604 2931 resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} ··· 2614 2941 vue-sonner@1.3.2: 2615 2942 resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} 2616 2943 2617 - vue@3.5.18: 2618 - resolution: {integrity: sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==} 2944 + vue@3.5.19: 2945 + resolution: {integrity: sha512-ZRh0HTmw6KChRYWgN8Ox/wi7VhpuGlvMPrHjIsdRbzKNgECFLzy+dKL5z9yGaBSjCpmcfJCbh3I1tNSRmBz2tg==} 2619 2946 peerDependencies: 2620 2947 typescript: '*' 2621 2948 peerDependenciesMeta: ··· 2650 2977 engines: {node: '>= 8'} 2651 2978 hasBin: true 2652 2979 2980 + why-is-node-running@2.3.0: 2981 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 2982 + engines: {node: '>=8'} 2983 + hasBin: true 2984 + 2653 2985 winston-transport@4.9.0: 2654 2986 resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} 2655 2987 engines: {node: '>= 12.0.0'} ··· 2694 3026 2695 3027 snapshots: 2696 3028 2697 - '@atcute/atproto@3.1.1': 3029 + '@atcute/atproto@3.1.2': 2698 3030 dependencies: 2699 - '@atcute/lexicons': 1.1.0 3031 + '@atcute/lexicons': 1.1.1 2700 3032 2701 - '@atcute/bluesky@3.2.0': 3033 + '@atcute/bluesky@3.2.1': 2702 3034 dependencies: 2703 - '@atcute/atproto': 3.1.1 2704 - '@atcute/lexicons': 1.1.0 3035 + '@atcute/atproto': 3.1.2 3036 + '@atcute/lexicons': 1.1.1 2705 3037 2706 3038 '@atcute/client@4.0.3': 2707 3039 dependencies: 2708 3040 '@atcute/identity': 1.0.3 2709 - '@atcute/lexicons': 1.1.0 3041 + '@atcute/lexicons': 1.1.1 3042 + 3043 + '@atcute/crypto@2.2.4': 3044 + dependencies: 3045 + '@atcute/multibase': 1.1.5 3046 + '@atcute/uint8array': 1.0.4 3047 + '@noble/secp256k1': 2.3.0 2710 3048 2711 3049 '@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)': 2712 3050 dependencies: 2713 3051 '@atcute/identity': 1.0.3 2714 - '@atcute/lexicons': 1.1.0 3052 + '@atcute/lexicons': 1.1.1 2715 3053 '@atcute/util-fetch': 1.0.1 2716 3054 '@badrap/valita': 0.4.6 2717 3055 2718 3056 '@atcute/identity@1.0.3': 2719 3057 dependencies: 2720 - '@atcute/lexicons': 1.1.0 3058 + '@atcute/lexicons': 1.1.1 2721 3059 '@badrap/valita': 0.4.6 2722 3060 2723 3061 '@atcute/lex-cli@2.1.1': ··· 2732 3070 dependencies: 2733 3071 '@badrap/valita': 0.4.6 2734 3072 2735 - '@atcute/lexicons@1.1.0': 3073 + '@atcute/lexicons@1.1.1': 2736 3074 dependencies: 2737 3075 esm-env: 1.2.2 2738 3076 3077 + '@atcute/multibase@1.1.5': 3078 + dependencies: 3079 + '@atcute/uint8array': 1.0.4 3080 + 3081 + '@atcute/uint8array@1.0.4': {} 3082 + 2739 3083 '@atcute/util-fetch@1.0.1': 2740 3084 dependencies: 2741 3085 '@badrap/valita': 0.4.6 ··· 2755 3099 2756 3100 '@badrap/valita@0.4.6': {} 2757 3101 2758 - '@clipprjs/lexicons@1.0.2': 3102 + '@clipprjs/lexicons@1.0.3': 2759 3103 dependencies: 2760 - '@atcute/atproto': 3.1.1 2761 - '@atcute/lexicons': 1.1.0 3104 + '@atcute/atproto': 3.1.2 3105 + '@atcute/lexicons': 1.1.1 2762 3106 2763 3107 '@colors/colors@1.6.0': {} 2764 3108 ··· 2976 3320 dependencies: 2977 3321 '@floating-ui/utils': 0.2.10 2978 3322 2979 - '@floating-ui/dom@1.7.3': 3323 + '@floating-ui/dom@1.7.4': 2980 3324 dependencies: 2981 3325 '@floating-ui/core': 1.7.3 2982 3326 '@floating-ui/utils': 0.2.10 2983 3327 2984 3328 '@floating-ui/utils@0.2.10': {} 2985 3329 2986 - '@floating-ui/vue@1.1.8(vue@3.5.18(typescript@5.9.2))': 3330 + '@floating-ui/vue@1.1.9(vue@3.5.19(typescript@5.9.2))': 2987 3331 dependencies: 2988 - '@floating-ui/dom': 1.7.3 3332 + '@floating-ui/dom': 1.7.4 2989 3333 '@floating-ui/utils': 0.2.10 2990 - vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) 3334 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 2991 3335 transitivePeerDependencies: 2992 3336 - '@vue/composition-api' 2993 3337 - vue 2994 3338 2995 - '@headlessui/vue@1.7.23(vue@3.5.18(typescript@5.9.2))': 3339 + '@headlessui/vue@1.7.23(vue@3.5.19(typescript@5.9.2))': 2996 3340 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) 3341 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.19(typescript@5.9.2)) 3342 + vue: 3.5.19(typescript@5.9.2) 2999 3343 3000 - '@hono/node-server@1.19.0(hono@4.9.2)': 3344 + '@hono/node-server@1.19.0(hono@4.9.4)': 3001 3345 dependencies: 3002 - hono: 4.9.2 3346 + hono: 4.9.4 3003 3347 3004 3348 '@humanfs/core@0.19.1': {} 3005 3349 ··· 3129 3473 3130 3474 '@neon-rs/load@0.0.4': {} 3131 3475 3476 + '@noble/secp256k1@2.3.0': {} 3477 + 3132 3478 '@nodelib/fs.scandir@2.1.5': 3133 3479 dependencies: 3134 3480 '@nodelib/fs.stat': 2.0.5 ··· 3145 3491 3146 3492 '@pkgr/core@0.2.9': {} 3147 3493 3494 + '@rollup/rollup-android-arm-eabi@4.50.0': 3495 + optional: true 3496 + 3497 + '@rollup/rollup-android-arm64@4.50.0': 3498 + optional: true 3499 + 3500 + '@rollup/rollup-darwin-arm64@4.50.0': 3501 + optional: true 3502 + 3503 + '@rollup/rollup-darwin-x64@4.50.0': 3504 + optional: true 3505 + 3506 + '@rollup/rollup-freebsd-arm64@4.50.0': 3507 + optional: true 3508 + 3509 + '@rollup/rollup-freebsd-x64@4.50.0': 3510 + optional: true 3511 + 3512 + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': 3513 + optional: true 3514 + 3515 + '@rollup/rollup-linux-arm-musleabihf@4.50.0': 3516 + optional: true 3517 + 3518 + '@rollup/rollup-linux-arm64-gnu@4.50.0': 3519 + optional: true 3520 + 3521 + '@rollup/rollup-linux-arm64-musl@4.50.0': 3522 + optional: true 3523 + 3524 + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': 3525 + optional: true 3526 + 3527 + '@rollup/rollup-linux-ppc64-gnu@4.50.0': 3528 + optional: true 3529 + 3530 + '@rollup/rollup-linux-riscv64-gnu@4.50.0': 3531 + optional: true 3532 + 3533 + '@rollup/rollup-linux-riscv64-musl@4.50.0': 3534 + optional: true 3535 + 3536 + '@rollup/rollup-linux-s390x-gnu@4.50.0': 3537 + optional: true 3538 + 3539 + '@rollup/rollup-linux-x64-gnu@4.50.0': 3540 + optional: true 3541 + 3542 + '@rollup/rollup-linux-x64-musl@4.50.0': 3543 + optional: true 3544 + 3545 + '@rollup/rollup-openharmony-arm64@4.50.0': 3546 + optional: true 3547 + 3548 + '@rollup/rollup-win32-arm64-msvc@4.50.0': 3549 + optional: true 3550 + 3551 + '@rollup/rollup-win32-ia32-msvc@4.50.0': 3552 + optional: true 3553 + 3554 + '@rollup/rollup-win32-x64-msvc@4.50.0': 3555 + optional: true 3556 + 3148 3557 '@rtsao/scc@1.1.0': {} 3149 3558 3150 3559 '@scalar/code-highlight@0.1.9': ··· 3169 3578 transitivePeerDependencies: 3170 3579 - supports-color 3171 3580 3172 - '@scalar/components@0.14.23(typescript@5.9.2)': 3581 + '@scalar/components@0.14.25(typescript@5.9.2)': 3173 3582 dependencies: 3174 3583 '@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)) 3584 + '@floating-ui/vue': 1.1.9(vue@3.5.19(typescript@5.9.2)) 3585 + '@headlessui/vue': 1.7.23(vue@3.5.19(typescript@5.9.2)) 3177 3586 '@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 3587 + '@scalar/helpers': 0.0.8 3588 + '@scalar/icons': 0.4.7(typescript@5.9.2) 3589 + '@scalar/oas-utils': 0.4.20(typescript@5.9.2) 3590 + '@scalar/themes': 0.13.13 3181 3591 '@scalar/use-hooks': 0.2.4(typescript@5.9.2) 3182 3592 '@scalar/use-toasts': 0.8.0(typescript@5.9.2) 3183 - '@vueuse/core': 11.3.0(vue@3.5.18(typescript@5.9.2)) 3593 + '@vueuse/core': 11.3.0(vue@3.5.19(typescript@5.9.2)) 3184 3594 cva: 1.0.0-beta.2(typescript@5.9.2) 3185 3595 nanoid: 5.1.5 3186 3596 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 3597 + radix-vue: 1.9.17(vue@3.5.19(typescript@5.9.2)) 3598 + vue: 3.5.19(typescript@5.9.2) 3599 + vue-component-type-helpers: 3.0.6 3190 3600 transitivePeerDependencies: 3191 3601 - '@vue/composition-api' 3192 3602 - supports-color 3193 3603 - typescript 3194 3604 3195 - '@scalar/core@0.3.11': 3605 + '@scalar/core@0.3.13': 3196 3606 dependencies: 3197 - '@scalar/types': 0.2.11 3607 + '@scalar/types': 0.2.12 3198 3608 3199 - '@scalar/helpers@0.0.7': {} 3609 + '@scalar/helpers@0.0.8': {} 3200 3610 3201 - '@scalar/hono-api-reference@0.9.13(hono@4.9.2)': 3611 + '@scalar/hono-api-reference@0.9.15(hono@4.9.4)': 3202 3612 dependencies: 3203 - '@scalar/core': 0.3.11 3204 - hono: 4.9.2 3613 + '@scalar/core': 0.3.13 3614 + hono: 4.9.4 3205 3615 3206 - '@scalar/icons@0.4.6(typescript@5.9.2)': 3616 + '@scalar/icons@0.4.7(typescript@5.9.2)': 3207 3617 dependencies: 3208 3618 '@phosphor-icons/core': 2.1.1 3209 3619 '@types/node': 22.17.2 3210 3620 chalk: 5.6.0 3211 - vue: 3.5.18(typescript@5.9.2) 3621 + vue: 3.5.19(typescript@5.9.2) 3212 3622 transitivePeerDependencies: 3213 3623 - typescript 3214 3624 3215 - '@scalar/json-magic@0.1.0(typescript@5.9.2)': 3625 + '@scalar/json-magic@0.3.0(typescript@5.9.2)': 3216 3626 dependencies: 3217 - vue: 3.5.18(typescript@5.9.2) 3627 + '@scalar/helpers': 0.0.8 3628 + vue: 3.5.19(typescript@5.9.2) 3218 3629 yaml: 2.8.0 3219 3630 transitivePeerDependencies: 3220 3631 - typescript 3221 3632 3222 - '@scalar/oas-utils@0.4.18(typescript@5.9.2)': 3633 + '@scalar/oas-utils@0.4.20(typescript@5.9.2)': 3223 3634 dependencies: 3224 3635 '@hyperjump/browser': 1.3.1 3225 3636 '@hyperjump/json-schema': 1.16.2(@hyperjump/browser@1.3.1) 3226 - '@scalar/helpers': 0.0.7 3227 - '@scalar/object-utils': 1.2.3 3637 + '@scalar/helpers': 0.0.8 3638 + '@scalar/json-magic': 0.3.0(typescript@5.9.2) 3639 + '@scalar/object-utils': 1.2.4 3228 3640 '@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) 3641 + '@scalar/themes': 0.13.13 3642 + '@scalar/types': 0.2.12 3643 + '@scalar/workspace-store': 0.14.0(typescript@5.9.2) 3232 3644 '@types/har-format': 1.2.16 3233 3645 flatted: 3.3.3 3234 3646 microdiff: 1.5.0 ··· 3240 3652 - supports-color 3241 3653 - typescript 3242 3654 3243 - '@scalar/object-utils@1.2.3': 3655 + '@scalar/object-utils@1.2.4': 3244 3656 dependencies: 3245 - '@scalar/helpers': 0.0.7 3657 + '@scalar/helpers': 0.0.8 3246 3658 flatted: 3.3.3 3247 3659 just-clone: 6.2.0 3248 3660 ts-deepmerge: 7.0.3 3249 3661 type-fest: 4.41.0 3250 3662 3251 - '@scalar/openapi-parser@0.19.0': 3663 + '@scalar/openapi-parser@0.20.0(typescript@5.9.2)': 3252 3664 dependencies: 3665 + '@scalar/json-magic': 0.3.0(typescript@5.9.2) 3253 3666 '@scalar/openapi-types': 0.3.7 3254 3667 ajv: 8.17.1 3255 3668 ajv-draft-04: 1.0.0(ajv@8.17.1) ··· 3257 3670 jsonpointer: 5.0.1 3258 3671 leven: 4.0.0 3259 3672 yaml: 2.8.0 3673 + transitivePeerDependencies: 3674 + - typescript 3260 3675 3261 - '@scalar/openapi-to-markdown@0.2.26(typescript@5.9.2)': 3676 + '@scalar/openapi-to-markdown@0.2.28(typescript@5.9.2)': 3262 3677 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 3678 + '@scalar/components': 0.14.25(typescript@5.9.2) 3679 + '@scalar/oas-utils': 0.4.20(typescript@5.9.2) 3680 + '@scalar/openapi-parser': 0.20.0(typescript@5.9.2) 3266 3681 '@scalar/openapi-types': 0.3.7 3267 - '@scalar/snippetz': 0.4.4 3268 - '@scalar/types': 0.2.11 3682 + '@scalar/snippetz': 0.4.5 3683 + '@scalar/types': 0.2.12 3269 3684 html-minifier-terser: 7.2.0 3270 3685 object-to-xml: 2.0.0 3271 3686 rehype-parse: 9.0.1 ··· 3275 3690 remark-gfm: 4.0.1 3276 3691 remark-stringify: 11.0.0 3277 3692 unified: 11.0.5 3278 - vue: 3.5.18(typescript@5.9.2) 3693 + vue: 3.5.19(typescript@5.9.2) 3279 3694 transitivePeerDependencies: 3280 3695 - '@vue/composition-api' 3281 3696 - supports-color ··· 3285 3700 dependencies: 3286 3701 zod: 3.24.1 3287 3702 3288 - '@scalar/snippetz@0.4.4': 3703 + '@scalar/snippetz@0.4.5': 3289 3704 dependencies: 3290 - '@scalar/types': 0.2.11 3705 + '@scalar/types': 0.2.12 3291 3706 stringify-object: 5.0.0 3292 3707 3293 - '@scalar/themes@0.13.12': 3708 + '@scalar/themes@0.13.13': 3294 3709 dependencies: 3295 - '@scalar/types': 0.2.11 3710 + '@scalar/types': 0.2.12 3296 3711 nanoid: 5.1.5 3297 3712 3298 - '@scalar/types@0.2.11': 3713 + '@scalar/types@0.2.12': 3299 3714 dependencies: 3300 3715 '@scalar/openapi-types': 0.3.7 3301 3716 nanoid: 5.1.5 ··· 3304 3719 '@scalar/use-hooks@0.2.4(typescript@5.9.2)': 3305 3720 dependencies: 3306 3721 '@scalar/use-toasts': 0.8.0(typescript@5.9.2) 3307 - '@vueuse/core': 10.11.1(vue@3.5.18(typescript@5.9.2)) 3722 + '@vueuse/core': 10.11.1(vue@3.5.19(typescript@5.9.2)) 3308 3723 cva: 1.0.0-beta.2(typescript@5.9.2) 3309 3724 tailwind-merge: 2.6.0 3310 - vue: 3.5.18(typescript@5.9.2) 3725 + vue: 3.5.19(typescript@5.9.2) 3311 3726 zod: 3.24.1 3312 3727 transitivePeerDependencies: 3313 3728 - '@vue/composition-api' ··· 3316 3731 '@scalar/use-toasts@0.8.0(typescript@5.9.2)': 3317 3732 dependencies: 3318 3733 nanoid: 5.1.5 3319 - vue: 3.5.18(typescript@5.9.2) 3734 + vue: 3.5.19(typescript@5.9.2) 3320 3735 vue-sonner: 1.3.2 3321 3736 transitivePeerDependencies: 3322 3737 - typescript 3323 3738 3324 - '@scalar/workspace-store@0.12.0(typescript@5.9.2)': 3739 + '@scalar/workspace-store@0.14.0(typescript@5.9.2)': 3325 3740 dependencies: 3326 3741 '@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 3742 + '@scalar/helpers': 0.0.8 3743 + '@scalar/json-magic': 0.3.0(typescript@5.9.2) 3744 + '@scalar/openapi-parser': 0.20.0(typescript@5.9.2) 3745 + '@scalar/types': 0.2.12 3746 + '@sinclair/typebox': https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz 3332 3747 github-slugger: 2.0.0 3333 - vue: 3.5.18(typescript@5.9.2) 3748 + type-fest: 4.41.0 3749 + vue: 3.5.19(typescript@5.9.2) 3334 3750 yaml: 2.8.0 3335 3751 transitivePeerDependencies: 3336 3752 - supports-color 3337 3753 - typescript 3338 3754 3339 - '@sinclair/typebox@0.34.37': {} 3755 + '@sinclair/typebox@https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz': {} 3340 3756 3341 3757 '@skyware/jetstream@0.2.5': 3342 3758 dependencies: 3343 - '@atcute/atproto': 3.1.1 3344 - '@atcute/bluesky': 3.2.0 3345 - '@atcute/lexicons': 1.1.0 3759 + '@atcute/atproto': 3.1.2 3760 + '@atcute/bluesky': 3.2.1 3761 + '@atcute/lexicons': 1.1.1 3346 3762 partysocket: 1.1.5 3347 3763 tiny-emitter: 2.1.0 3348 3764 ··· 3352 3768 3353 3769 '@tanstack/virtual-core@3.13.12': {} 3354 3770 3355 - '@tanstack/vue-virtual@3.13.12(vue@3.5.18(typescript@5.9.2))': 3771 + '@tanstack/vue-virtual@3.13.12(vue@3.5.19(typescript@5.9.2))': 3356 3772 dependencies: 3357 3773 '@tanstack/virtual-core': 3.13.12 3358 - vue: 3.5.18(typescript@5.9.2) 3774 + vue: 3.5.19(typescript@5.9.2) 3775 + 3776 + '@types/chai@5.2.2': 3777 + dependencies: 3778 + '@types/deep-eql': 4.0.2 3359 3779 3360 3780 '@types/debug@4.1.12': 3361 3781 dependencies: 3362 3782 '@types/ms': 2.1.0 3783 + 3784 + '@types/deep-eql@4.0.2': {} 3363 3785 3364 3786 '@types/estree@1.0.8': {} 3365 3787 ··· 3492 3914 3493 3915 '@ungap/structured-clone@1.3.0': {} 3494 3916 3495 - '@vue/compiler-core@3.5.18': 3917 + '@vitest/expect@3.2.4': 3918 + dependencies: 3919 + '@types/chai': 5.2.2 3920 + '@vitest/spy': 3.2.4 3921 + '@vitest/utils': 3.2.4 3922 + chai: 5.3.3 3923 + tinyrainbow: 2.0.0 3924 + 3925 + '@vitest/mocker@3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0))': 3926 + dependencies: 3927 + '@vitest/spy': 3.2.4 3928 + estree-walker: 3.0.3 3929 + magic-string: 0.30.18 3930 + optionalDependencies: 3931 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 3932 + 3933 + '@vitest/pretty-format@3.2.4': 3934 + dependencies: 3935 + tinyrainbow: 2.0.0 3936 + 3937 + '@vitest/runner@3.2.4': 3938 + dependencies: 3939 + '@vitest/utils': 3.2.4 3940 + pathe: 2.0.3 3941 + strip-literal: 3.0.0 3942 + 3943 + '@vitest/snapshot@3.2.4': 3944 + dependencies: 3945 + '@vitest/pretty-format': 3.2.4 3946 + magic-string: 0.30.18 3947 + pathe: 2.0.3 3948 + 3949 + '@vitest/spy@3.2.4': 3950 + dependencies: 3951 + tinyspy: 4.0.3 3952 + 3953 + '@vitest/utils@3.2.4': 3954 + dependencies: 3955 + '@vitest/pretty-format': 3.2.4 3956 + loupe: 3.2.1 3957 + tinyrainbow: 2.0.0 3958 + 3959 + '@vue/compiler-core@3.5.19': 3496 3960 dependencies: 3497 3961 '@babel/parser': 7.28.3 3498 - '@vue/shared': 3.5.18 3962 + '@vue/shared': 3.5.19 3499 3963 entities: 4.5.0 3500 3964 estree-walker: 2.0.2 3501 3965 source-map-js: 1.2.1 3502 3966 3503 - '@vue/compiler-dom@3.5.18': 3967 + '@vue/compiler-dom@3.5.19': 3504 3968 dependencies: 3505 - '@vue/compiler-core': 3.5.18 3506 - '@vue/shared': 3.5.18 3969 + '@vue/compiler-core': 3.5.19 3970 + '@vue/shared': 3.5.19 3507 3971 3508 - '@vue/compiler-sfc@3.5.18': 3972 + '@vue/compiler-sfc@3.5.19': 3509 3973 dependencies: 3510 3974 '@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 3975 + '@vue/compiler-core': 3.5.19 3976 + '@vue/compiler-dom': 3.5.19 3977 + '@vue/compiler-ssr': 3.5.19 3978 + '@vue/shared': 3.5.19 3515 3979 estree-walker: 2.0.2 3516 - magic-string: 0.30.17 3980 + magic-string: 0.30.18 3517 3981 postcss: 8.5.6 3518 3982 source-map-js: 1.2.1 3519 3983 3520 - '@vue/compiler-ssr@3.5.18': 3984 + '@vue/compiler-ssr@3.5.19': 3521 3985 dependencies: 3522 - '@vue/compiler-dom': 3.5.18 3523 - '@vue/shared': 3.5.18 3986 + '@vue/compiler-dom': 3.5.19 3987 + '@vue/shared': 3.5.19 3524 3988 3525 - '@vue/reactivity@3.5.18': 3989 + '@vue/reactivity@3.5.19': 3526 3990 dependencies: 3527 - '@vue/shared': 3.5.18 3991 + '@vue/shared': 3.5.19 3528 3992 3529 - '@vue/runtime-core@3.5.18': 3993 + '@vue/runtime-core@3.5.19': 3530 3994 dependencies: 3531 - '@vue/reactivity': 3.5.18 3532 - '@vue/shared': 3.5.18 3995 + '@vue/reactivity': 3.5.19 3996 + '@vue/shared': 3.5.19 3533 3997 3534 - '@vue/runtime-dom@3.5.18': 3998 + '@vue/runtime-dom@3.5.19': 3535 3999 dependencies: 3536 - '@vue/reactivity': 3.5.18 3537 - '@vue/runtime-core': 3.5.18 3538 - '@vue/shared': 3.5.18 4000 + '@vue/reactivity': 3.5.19 4001 + '@vue/runtime-core': 3.5.19 4002 + '@vue/shared': 3.5.19 3539 4003 csstype: 3.1.3 3540 4004 3541 - '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.9.2))': 4005 + '@vue/server-renderer@3.5.19(vue@3.5.19(typescript@5.9.2))': 3542 4006 dependencies: 3543 - '@vue/compiler-ssr': 3.5.18 3544 - '@vue/shared': 3.5.18 3545 - vue: 3.5.18(typescript@5.9.2) 4007 + '@vue/compiler-ssr': 3.5.19 4008 + '@vue/shared': 3.5.19 4009 + vue: 3.5.19(typescript@5.9.2) 3546 4010 3547 - '@vue/shared@3.5.18': {} 4011 + '@vue/shared@3.5.19': {} 3548 4012 3549 - '@vueuse/core@10.11.1(vue@3.5.18(typescript@5.9.2))': 4013 + '@vueuse/core@10.11.1(vue@3.5.19(typescript@5.9.2))': 3550 4014 dependencies: 3551 4015 '@types/web-bluetooth': 0.0.20 3552 4016 '@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)) 4017 + '@vueuse/shared': 10.11.1(vue@3.5.19(typescript@5.9.2)) 4018 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 3555 4019 transitivePeerDependencies: 3556 4020 - '@vue/composition-api' 3557 4021 - vue 3558 4022 3559 - '@vueuse/core@11.3.0(vue@3.5.18(typescript@5.9.2))': 4023 + '@vueuse/core@11.3.0(vue@3.5.19(typescript@5.9.2))': 3560 4024 dependencies: 3561 4025 '@types/web-bluetooth': 0.0.20 3562 4026 '@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)) 4027 + '@vueuse/shared': 11.3.0(vue@3.5.19(typescript@5.9.2)) 4028 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 3565 4029 transitivePeerDependencies: 3566 4030 - '@vue/composition-api' 3567 4031 - vue ··· 3570 4034 3571 4035 '@vueuse/metadata@11.3.0': {} 3572 4036 3573 - '@vueuse/shared@10.11.1(vue@3.5.18(typescript@5.9.2))': 4037 + '@vueuse/shared@10.11.1(vue@3.5.19(typescript@5.9.2))': 3574 4038 dependencies: 3575 - vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) 4039 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 3576 4040 transitivePeerDependencies: 3577 4041 - '@vue/composition-api' 3578 4042 - vue 3579 4043 3580 - '@vueuse/shared@11.3.0(vue@3.5.18(typescript@5.9.2))': 4044 + '@vueuse/shared@11.3.0(vue@3.5.19(typescript@5.9.2))': 3581 4045 dependencies: 3582 - vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2)) 4046 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 3583 4047 transitivePeerDependencies: 3584 4048 - '@vue/composition-api' 3585 4049 - vue ··· 3672 4136 get-intrinsic: 1.3.0 3673 4137 is-array-buffer: 3.0.5 3674 4138 4139 + assertion-error@2.0.1: {} 4140 + 3675 4141 async-function@1.0.0: {} 3676 4142 3677 4143 async@3.2.6: {} ··· 3704 4170 '@types/node': 24.3.0 3705 4171 optional: true 3706 4172 4173 + cac@6.7.14: {} 4174 + 3707 4175 call-bind-apply-helpers@1.0.2: 3708 4176 dependencies: 3709 4177 es-errors: 1.3.0 ··· 3730 4198 3731 4199 ccount@2.0.1: {} 3732 4200 4201 + chai@5.3.3: 4202 + dependencies: 4203 + assertion-error: 2.0.1 4204 + check-error: 2.1.1 4205 + deep-eql: 5.0.2 4206 + loupe: 3.2.1 4207 + pathval: 2.0.1 4208 + 3733 4209 chalk@4.1.2: 3734 4210 dependencies: 3735 4211 ansi-styles: 4.3.0 ··· 3742 4218 character-entities-legacy@3.0.0: {} 3743 4219 3744 4220 character-entities@2.0.2: {} 4221 + 4222 + check-error@2.1.1: {} 3745 4223 3746 4224 clean-css@5.3.3: 3747 4225 dependencies: ··· 3836 4314 dependencies: 3837 4315 character-entities: 2.0.2 3838 4316 4317 + deep-eql@5.0.2: {} 4318 + 3839 4319 deep-is@0.1.4: {} 3840 4320 3841 4321 define-data-property@1.1.4: ··· 3955 4435 es-define-property@1.0.1: {} 3956 4436 3957 4437 es-errors@1.3.0: {} 4438 + 4439 + es-module-lexer@1.7.0: {} 3958 4440 3959 4441 es-object-atoms@1.1.1: 3960 4442 dependencies: ··· 4177 4659 4178 4660 estree-walker@2.0.2: {} 4179 4661 4662 + estree-walker@3.0.3: 4663 + dependencies: 4664 + '@types/estree': 1.0.8 4665 + 4180 4666 esutils@2.0.3: {} 4181 4667 4182 4668 event-target-polyfill@0.0.4: {} 4669 + 4670 + expect-type@1.2.2: {} 4183 4671 4184 4672 extend@3.0.2: {} 4185 4673 ··· 4205 4693 dependencies: 4206 4694 reusify: 1.1.0 4207 4695 4696 + fdir@6.5.0(picomatch@4.0.3): 4697 + optionalDependencies: 4698 + picomatch: 4.0.3 4699 + 4208 4700 fecha@4.2.3: {} 4209 4701 4210 4702 fetch-blob@3.2.0: ··· 4488 4980 4489 4981 highlightjs-vue@1.0.0: {} 4490 4982 4491 - hono@4.9.2: {} 4983 + hono@4.9.4: {} 4492 4984 4493 4985 html-minifier-terser@7.2.0: 4494 4986 dependencies: ··· 4650 5142 4651 5143 js-base64@3.7.8: {} 4652 5144 5145 + js-tokens@9.0.1: {} 5146 + 4653 5147 js-yaml@4.1.0: 4654 5148 dependencies: 4655 5149 argparse: 2.0.1 ··· 4719 5213 4720 5214 longest-streak@3.1.0: {} 4721 5215 5216 + loupe@3.2.1: {} 5217 + 4722 5218 lower-case@2.0.2: 4723 5219 dependencies: 4724 5220 tslib: 2.8.1 ··· 4729 5225 devlop: 1.1.0 4730 5226 highlight.js: 11.11.1 4731 5227 4732 - magic-string@0.30.17: 5228 + magic-string@0.30.18: 4733 5229 dependencies: 4734 5230 '@jridgewell/sourcemap-codec': 1.5.5 4735 5231 ··· 5176 5672 5177 5673 path-parse@1.0.7: {} 5178 5674 5675 + pathe@2.0.3: {} 5676 + 5677 + pathval@2.0.1: {} 5678 + 5179 5679 picocolors@1.1.1: {} 5180 5680 5181 5681 picomatch@2.3.1: {} 5682 + 5683 + picomatch@4.0.3: {} 5182 5684 5183 5685 possible-typed-array-names@1.1.0: {} 5184 5686 ··· 5208 5710 5209 5711 queue-microtask@1.2.3: {} 5210 5712 5211 - radix-vue@1.9.17(vue@3.5.18(typescript@5.9.2)): 5713 + radix-vue@1.9.17(vue@3.5.19(typescript@5.9.2)): 5212 5714 dependencies: 5213 - '@floating-ui/dom': 1.7.3 5214 - '@floating-ui/vue': 1.1.8(vue@3.5.18(typescript@5.9.2)) 5715 + '@floating-ui/dom': 1.7.4 5716 + '@floating-ui/vue': 1.1.9(vue@3.5.19(typescript@5.9.2)) 5215 5717 '@internationalized/date': 3.8.2 5216 5718 '@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)) 5719 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.19(typescript@5.9.2)) 5720 + '@vueuse/core': 10.11.1(vue@3.5.19(typescript@5.9.2)) 5721 + '@vueuse/shared': 10.11.1(vue@3.5.19(typescript@5.9.2)) 5220 5722 aria-hidden: 1.2.6 5221 5723 defu: 6.1.4 5222 5724 fast-deep-equal: 3.1.3 5223 5725 nanoid: 5.1.5 5224 - vue: 3.5.18(typescript@5.9.2) 5726 + vue: 3.5.19(typescript@5.9.2) 5225 5727 transitivePeerDependencies: 5226 5728 - '@vue/composition-api' 5227 5729 ··· 5351 5853 5352 5854 reusify@1.1.0: {} 5353 5855 5856 + rollup@4.50.0: 5857 + dependencies: 5858 + '@types/estree': 1.0.8 5859 + optionalDependencies: 5860 + '@rollup/rollup-android-arm-eabi': 4.50.0 5861 + '@rollup/rollup-android-arm64': 4.50.0 5862 + '@rollup/rollup-darwin-arm64': 4.50.0 5863 + '@rollup/rollup-darwin-x64': 4.50.0 5864 + '@rollup/rollup-freebsd-arm64': 4.50.0 5865 + '@rollup/rollup-freebsd-x64': 4.50.0 5866 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.0 5867 + '@rollup/rollup-linux-arm-musleabihf': 4.50.0 5868 + '@rollup/rollup-linux-arm64-gnu': 4.50.0 5869 + '@rollup/rollup-linux-arm64-musl': 4.50.0 5870 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.0 5871 + '@rollup/rollup-linux-ppc64-gnu': 4.50.0 5872 + '@rollup/rollup-linux-riscv64-gnu': 4.50.0 5873 + '@rollup/rollup-linux-riscv64-musl': 4.50.0 5874 + '@rollup/rollup-linux-s390x-gnu': 4.50.0 5875 + '@rollup/rollup-linux-x64-gnu': 4.50.0 5876 + '@rollup/rollup-linux-x64-musl': 4.50.0 5877 + '@rollup/rollup-openharmony-arm64': 4.50.0 5878 + '@rollup/rollup-win32-arm64-msvc': 4.50.0 5879 + '@rollup/rollup-win32-ia32-msvc': 4.50.0 5880 + '@rollup/rollup-win32-x64-msvc': 4.50.0 5881 + fsevents: 2.3.3 5882 + 5354 5883 run-parallel@1.2.0: 5355 5884 dependencies: 5356 5885 queue-microtask: 1.2.3 ··· 5440 5969 side-channel-map: 1.0.1 5441 5970 side-channel-weakmap: 1.0.2 5442 5971 5972 + siginfo@2.0.0: {} 5973 + 5443 5974 simple-swizzle@0.2.2: 5444 5975 dependencies: 5445 5976 is-arrayish: 0.3.2 ··· 5457 5988 5458 5989 stack-trace@0.0.10: {} 5459 5990 5991 + stackback@0.0.2: {} 5992 + 5993 + std-env@3.9.0: {} 5994 + 5460 5995 stop-iteration-iterator@1.1.0: 5461 5996 dependencies: 5462 5997 es-errors: 1.3.0 ··· 5504 6039 5505 6040 strip-json-comments@3.1.1: {} 5506 6041 6042 + strip-literal@3.0.0: 6043 + dependencies: 6044 + js-tokens: 9.0.1 6045 + 5507 6046 supports-color@7.2.0: 5508 6047 dependencies: 5509 6048 has-flag: 4.0.0 ··· 5527 6066 5528 6067 tiny-emitter@2.1.0: {} 5529 6068 6069 + tinybench@2.9.0: {} 6070 + 6071 + tinyexec@0.3.2: {} 6072 + 6073 + tinyglobby@0.2.15: 6074 + dependencies: 6075 + fdir: 6.5.0(picomatch@4.0.3) 6076 + picomatch: 4.0.3 6077 + 6078 + tinypool@1.1.1: {} 6079 + 6080 + tinyrainbow@2.0.0: {} 6081 + 6082 + tinyspy@4.0.3: {} 6083 + 5530 6084 to-regex-range@5.0.1: 5531 6085 dependencies: 5532 6086 is-number: 7.0.0 ··· 5687 6241 '@types/unist': 3.0.3 5688 6242 vfile-message: 4.0.3 5689 6243 5690 - vue-component-type-helpers@3.0.5: {} 6244 + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0): 6245 + dependencies: 6246 + cac: 6.7.14 6247 + debug: 4.4.1 6248 + es-module-lexer: 1.7.0 6249 + pathe: 2.0.3 6250 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 6251 + transitivePeerDependencies: 6252 + - '@types/node' 6253 + - jiti 6254 + - less 6255 + - lightningcss 6256 + - sass 6257 + - sass-embedded 6258 + - stylus 6259 + - sugarss 6260 + - supports-color 6261 + - terser 6262 + - tsx 6263 + - yaml 6264 + 6265 + vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0): 6266 + dependencies: 6267 + esbuild: 0.25.9 6268 + fdir: 6.5.0(picomatch@4.0.3) 6269 + picomatch: 4.0.3 6270 + postcss: 8.5.6 6271 + rollup: 4.50.0 6272 + tinyglobby: 0.2.15 6273 + optionalDependencies: 6274 + '@types/node': 24.3.0 6275 + fsevents: 2.3.3 6276 + jiti: 2.5.1 6277 + terser: 5.43.1 6278 + tsx: 4.20.4 6279 + yaml: 2.8.0 5691 6280 5692 - vue-demi@0.14.10(vue@3.5.18(typescript@5.9.2)): 6281 + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0): 5693 6282 dependencies: 5694 - vue: 3.5.18(typescript@5.9.2) 6283 + '@types/chai': 5.2.2 6284 + '@vitest/expect': 3.2.4 6285 + '@vitest/mocker': 3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0)) 6286 + '@vitest/pretty-format': 3.2.4 6287 + '@vitest/runner': 3.2.4 6288 + '@vitest/snapshot': 3.2.4 6289 + '@vitest/spy': 3.2.4 6290 + '@vitest/utils': 3.2.4 6291 + chai: 5.3.3 6292 + debug: 4.4.1 6293 + expect-type: 1.2.2 6294 + magic-string: 0.30.18 6295 + pathe: 2.0.3 6296 + picomatch: 4.0.3 6297 + std-env: 3.9.0 6298 + tinybench: 2.9.0 6299 + tinyexec: 0.3.2 6300 + tinyglobby: 0.2.15 6301 + tinypool: 1.1.1 6302 + tinyrainbow: 2.0.0 6303 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 6304 + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 6305 + why-is-node-running: 2.3.0 6306 + optionalDependencies: 6307 + '@types/debug': 4.1.12 6308 + '@types/node': 24.3.0 6309 + transitivePeerDependencies: 6310 + - jiti 6311 + - less 6312 + - lightningcss 6313 + - msw 6314 + - sass 6315 + - sass-embedded 6316 + - stylus 6317 + - sugarss 6318 + - supports-color 6319 + - terser 6320 + - tsx 6321 + - yaml 6322 + 6323 + vue-component-type-helpers@3.0.6: {} 6324 + 6325 + vue-demi@0.14.10(vue@3.5.19(typescript@5.9.2)): 6326 + dependencies: 6327 + vue: 3.5.19(typescript@5.9.2) 5695 6328 5696 6329 vue-sonner@1.3.2: {} 5697 6330 5698 - vue@3.5.18(typescript@5.9.2): 6331 + vue@3.5.19(typescript@5.9.2): 5699 6332 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 6333 + '@vue/compiler-dom': 3.5.19 6334 + '@vue/compiler-sfc': 3.5.19 6335 + '@vue/runtime-dom': 3.5.19 6336 + '@vue/server-renderer': 3.5.19(vue@3.5.19(typescript@5.9.2)) 6337 + '@vue/shared': 3.5.19 5705 6338 optionalDependencies: 5706 6339 typescript: 5.9.2 5707 6340 ··· 5753 6386 which@2.0.2: 5754 6387 dependencies: 5755 6388 isexe: 2.0.0 6389 + 6390 + why-is-node-running@2.3.0: 6391 + dependencies: 6392 + siginfo: 2.0.0 6393 + stackback: 0.0.2 5756 6394 5757 6395 winston-transport@4.9.0: 5758 6396 dependencies:
+51
backend/src/api/did.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 + 18 + // Gets a DID document from a given DID. DID method agnostic. 19 + export async function getDidDocument( 20 + did: `did:plc:${string}` | `did:web:${string}`, 21 + ) { 22 + const docResolver = new CompositeDidDocumentResolver({ 23 + methods: { 24 + plc: new PlcDidDocumentResolver(), 25 + web: new WebDidDocumentResolver(), 26 + }, 27 + }); 28 + 29 + let doc; 30 + try { 31 + doc = await docResolver.resolve(did); 32 + } catch (err) { 33 + if (err instanceof DocumentNotFoundError) { 34 + throw new Error("Document not found"); 35 + } 36 + if (err instanceof UnsupportedDidMethodError) { 37 + throw new Error("Unsupported DID method"); 38 + } 39 + if (err instanceof ImproperDidError) { 40 + throw new Error("Invalid DID"); 41 + } 42 + if (err instanceof FailedDocumentResolutionError) { 43 + throw new Error("Failed document resolution"); 44 + } 45 + if (err instanceof HandleResolutionError) { 46 + throw new Error("Unknown resolution error"); 47 + } 48 + } 49 + 50 + return doc; 51 + }
+36
backend/src/api/stats.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 { AppviewStatsQuery } from "./types.js"; 8 + import { Database } from "../db/database.js"; 9 + import { clipsTable, tagsTable, usersTable } from "../db/schema.js"; 10 + import { count } from "drizzle-orm"; 11 + 12 + const db = Database.getInstance().getDb(); 13 + 14 + export async function getStats(): Promise<AppviewStatsQuery> { 15 + const clipCount = await db.select({ count: count() }).from(clipsTable); 16 + const tagCount = await db.select({ count: count() }).from(tagsTable); 17 + const userCount = await db.select({ count: count() }).from(usersTable); 18 + 19 + if ( 20 + clipCount[0] === undefined || 21 + tagCount[0] === undefined || 22 + userCount[0] === undefined 23 + ) { 24 + return { 25 + knownClips: 0, 26 + knownTags: 0, 27 + knownUsers: 0, 28 + }; 29 + } 30 + 31 + return { 32 + knownClips: clipCount[0].count, 33 + knownTags: tagCount[0].count, 34 + knownUsers: userCount[0].count, 35 + }; 36 + }
+6
backend/src/api/types.ts
··· 36 36 collection: string; 37 37 recordKey: string; 38 38 } 39 + 40 + export interface AppviewStatsQuery { 41 + knownUsers: number; 42 + knownClips: number; 43 + knownTags: number; 44 + }
+37 -14
backend/src/config.ts
··· 7 7 import { readFileSync } from "fs"; 8 8 import * as toml from "toml"; 9 9 10 + interface ConfigSchema { 11 + hostname: string | "localhost"; 12 + port: number | 9090; 13 + baseUrl: string | "http://localhost:9090"; 14 + logLevel: string | "debug"; 15 + database: { 16 + name: string | "file:clippr.db"; 17 + }; 18 + network: { 19 + firehose: string | "jetstream1.us-east.bsky.network"; 20 + serviceDid: string | "did:web:localhost%3A9090"; 21 + didSigningKey: 22 + | string 23 + | "did:key:zDnaeuuRRQuYp4S76LwosLhHbpU1HJcg6S5oJAUHmdZLVdLM5"; 24 + }; 25 + } 26 + 27 + class ConfigError extends Error { 28 + constructor(message: string) { 29 + super(message); 30 + this.name = "ConfigError"; 31 + } 32 + } 33 + 10 34 export class Config { 11 35 private static instance: Config; 12 - private readonly configData; 36 + private readonly configData: ConfigSchema; 13 37 14 38 private constructor() { 15 39 let tomlString; 16 40 try { 17 41 tomlString = readFileSync("config.toml", "utf-8"); 18 42 } catch { 19 - throw new Error("Config file not found"); 43 + throw new ConfigError("Config file not found"); 44 + } 45 + 46 + try { 47 + this.configData = toml.parse(tomlString); 48 + } catch { 49 + throw new ConfigError(`Config file is not valid TOML`); 20 50 } 21 - this.configData = toml.parse(tomlString); 22 51 } 23 52 53 + /** 54 + * Gets a singleton instance of the program configuration 55 + * @throws {ConfigError} if the config file cannot be read or parsed 56 + */ 24 57 static getInstance(): Config { 25 58 if (!Config.instance) { 26 59 try { ··· 33 66 return Config.instance; 34 67 } 35 68 36 - get<T>(path: string): T | undefined { 37 - const keys = path.split("."); 38 - let value = this.configData; 39 - for (const key of keys) { 40 - if (value == null) return undefined; 41 - value = value[key]; 42 - } 43 - return value; 44 - } 45 - 46 - getAll() { 69 + getConfig(): ConfigSchema { 47 70 return this.configData; 48 71 } 49 72 }
+16 -3
backend/src/db/database.ts
··· 8 8 import { Config } from "../config.js"; 9 9 import Logger from "../logger.js"; 10 10 11 - const config = Config.getInstance(); 12 - const dbname = config.get("database.name"); 11 + const config = Config.getInstance().getConfig(); 12 + const dbname = config.database.name; 13 + 14 + class DatabaseError extends Error { 15 + constructor(message: string) { 16 + super(message); 17 + this.name = "DatabaseError"; 18 + } 19 + } 13 20 14 21 export class Database { 15 22 private static instance: Database; 16 23 private readonly db; 17 24 18 25 private constructor() { 19 - this.db = drizzle({ connection: { url: `${dbname}` } }); 26 + try { 27 + this.db = drizzle({ connection: { url: `${dbname}` } }); 28 + } catch (e: unknown) { 29 + if (e instanceof Error) { 30 + throw new DatabaseError(e.message); 31 + } else throw new DatabaseError("Unknown error"); 32 + } 20 33 } 21 34 22 35 static getInstance(): Database {
+4 -3
backend/src/logger.ts
··· 5 5 */ 6 6 7 7 import { createLogger, format, transports } from "winston"; 8 + import { Config } from "./config.js"; 8 9 9 - // TODO: I can't seem to actually get the config setting for the log level yet. 10 - const loglevel = "debug"; 10 + const config = Config.getInstance().getConfig(); 11 + const logLevel = config.logLevel; 11 12 12 13 const Logger = createLogger({ 13 - level: loglevel, 14 + level: logLevel, 14 15 transports: [ 15 16 new transports.Console({ 16 17 format: format.combine(
+7 -6
backend/src/main.ts
··· 17 17 18 18 async function main() { 19 19 const logger = Logger; 20 - logger.info("Clippr-BE starting..."); 20 + logger.info(`Clippr-BE v${process.env.npm_package_version} starting...`); 21 21 22 - logger.verbose("Reading configuration..."); 23 - const config = Config.getInstance(); 22 + // Config is already loaded into the app (when preparing logger) 23 + const config = Config.getInstance().getConfig(); 24 24 25 25 logger.verbose("Initializing database..."); 26 26 Database.getInstance(); ··· 29 29 startFirehose(); 30 30 readFromFirehose(); 31 31 32 + logger.verbose("Starting XRPC server..."); 32 33 const server: ServerType = serve({ 33 - port: config.get("port"), 34 - hostname: config.get("hostname"), 34 + port: config.port, 35 + hostname: config.hostname, 35 36 fetch: app.fetch, 36 37 }); 37 38 38 39 logger.info( 39 - `XRPC server launched at http://${config.get("hostname")}:${config.get("port")}`, 40 + `XRPC server launched at http://${config.hostname}:${config.port}`, 40 41 ); 41 42 42 43 process.removeAllListeners("SIGINT");
+80 -20
backend/src/network/commit.ts
··· 18 18 import { validateClip, validateProfile, validateTag } from "./validator.js"; 19 19 import { convertDidToString } from "./converters.js"; 20 20 import { hashString } from "../hasher.js"; 21 - import { eq } from "drizzle-orm"; 21 + import { and, eq } from "drizzle-orm"; 22 + import type { TagRef } from "../api/types.js"; 22 23 23 24 const db = Database.getInstance().getDb(); 24 25 ··· 30 31 export async function handleClip( 31 32 event: CommitEvent<`social.clippr.${string}`>, 32 33 ): Promise<void> { 33 - if (event.commit.operation !== "create") { 34 - Logger.warn( 35 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 36 - ); 34 + if (event.commit.operation === "delete") { 35 + await db 36 + .delete(clipsTable) 37 + .where( 38 + and( 39 + eq(clipsTable.did, event.did), 40 + eq(clipsTable.recordKey, event.commit.rkey), 41 + ), 42 + ); 43 + Logger.verbose(`Deleted clip: ${event.did}/${event.commit.rkey}`, event); 37 44 return; 38 - } // We currently do not handle these. 45 + } 39 46 40 47 if (event.commit.record.$type !== "social.clippr.feed.clip") { 41 48 Logger.verbose( ··· 76 83 return; 77 84 } 78 85 79 - if (!(await validateClip(record))) { 86 + if (!(await validateClip(record))) return; 87 + 88 + if (event.commit.operation === "update") { 89 + await db 90 + .update(clipsTable) 91 + .set({ 92 + did: convertDidToString(event.did), 93 + cid: event.commit.cid, 94 + timestamp: convertMicroToDate(event.time_us), 95 + recordKey: event.commit.rkey, 96 + createdAt: new Date(record.createdAt), 97 + indexedAt: new Date(), 98 + url: record.url, 99 + title: record.title, 100 + description: record.description, 101 + tags: record.tags as TagRef[] | undefined, 102 + notes: record.notes, 103 + unlisted: record.unlisted, 104 + unread: record.unread, 105 + languages: record.languages, 106 + }) 107 + .where( 108 + and( 109 + eq(clipsTable.did, event.did), 110 + eq(clipsTable.recordKey, event.commit.rkey), 111 + ), 112 + ); 113 + Logger.verbose(`Updated clip: ${event.did}/${event.commit.rkey}`, event); 80 114 return; 81 115 } 82 116 ··· 104 138 export async function handleTag( 105 139 event: CommitEvent<`social.clippr.${string}`>, 106 140 ): Promise<void> { 107 - if (event.commit.operation !== "create") { 108 - Logger.warn( 109 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 110 - ); 141 + if (event.commit.operation === "delete") { 142 + await db 143 + .delete(tagsTable) 144 + .where( 145 + and( 146 + eq(tagsTable.did, event.did), 147 + eq(tagsTable.recordKey, event.commit.rkey), 148 + ), 149 + ); 150 + Logger.verbose(`Deleted tag: ${event.did}/${event.commit.rkey}`, event); 111 151 return; 112 - } // We currently do not handle these. 152 + } 113 153 114 154 if (event.commit.record.$type !== "social.clippr.feed.tag") { 115 155 Logger.verbose( ··· 148 188 return; 149 189 } 150 190 191 + if (event.commit.operation === "update") { 192 + await db 193 + .update(tagsTable) 194 + .set({ 195 + timestamp: convertMicroToDate(event.time_us), 196 + did: convertDidToString(event.did), 197 + cid: event.commit.cid, 198 + recordKey: event.commit.rkey, 199 + name: record.name, 200 + description: record.description, 201 + color: record.color, 202 + createdAt: new Date(record.createdAt), 203 + indexedAt: new Date(), 204 + }) 205 + .where( 206 + and( 207 + eq(tagsTable.did, event.did), 208 + eq(tagsTable.recordKey, event.commit.rkey), 209 + ), 210 + ); 211 + Logger.verbose(`Updated tag: ${event.did}/${event.commit.rkey}`, event); 212 + return; 213 + } 214 + 151 215 await db.insert(tagsTable).values({ 152 216 timestamp: convertMicroToDate(event.time_us), 153 217 did: convertDidToString(event.did), ··· 167 231 event: CommitEvent<`social.clippr.${string}`>, 168 232 ): Promise<void> { 169 233 if (event.commit.operation === "delete") { 170 - Logger.warn( 171 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 172 - ); 234 + await db.delete(usersTable).where(eq(usersTable.did, event.did)); 235 + Logger.verbose(`Deleted profile: ${event.did}`, event); 173 236 return; 174 - } // We currently do not handle deletes. 237 + } 175 238 176 239 if (event.commit.record.$type !== "social.clippr.actor.profile") { 177 240 Logger.verbose( ··· 257 320 avatar: record.avatar?.ref.$link, 258 321 description: record.description, 259 322 }) 260 - .where(eq(usersTable.did, convertDidToString(event.did))) 261 - .execute(); 262 - 323 + .where(eq(usersTable.did, convertDidToString(event.did))); 263 324 Logger.verbose(`Updated profile: ${convertDidToString(event.did)}`, event); 264 - 265 325 return; 266 326 } 267 327
+5 -38
backend/src/network/converters.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 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 7 import { Client, simpleFetchHandler } from "@atcute/client"; 8 + import { getDidDocument } from "../api/did.js"; 18 9 19 10 /// Converts an ``At.DID`` type to a proper string, for type reasons. 20 11 export function convertDidToString(did: `did:${string}`): string { ··· 31 22 } 32 23 } 33 24 34 - // Get a user's handle from their DID. DID method agnostic. 25 + // Get a user's handle from their DID. 26 + // 27 + // WARNING: Handle validation is not performed and is taken from the document as-is. Fix me! 35 28 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 - } 29 + const doc = await getDidDocument(convertStringToTypedDid(did)); 63 30 64 31 if (!doc?.alsoKnownAs) { 65 32 throw new Error("No handles found");
+2 -2
backend/src/network/jetstream.ts
··· 9 9 import { handleClip, handleProfile, handleTag } from "./commit.js"; 10 10 import Logger from "../logger.js"; 11 11 12 - const config = Config.getInstance(); 13 - const hostname = config.get("network.firehose"); 12 + const config = Config.getInstance().getConfig(); 13 + const hostname = config.network.firehose; 14 14 15 15 const jetstream = new Jetstream({ 16 16 endpoint: `wss://${hostname}/subscribe`,
+186
backend/src/routes/well-known.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 { Config } from "../config.js"; 9 + import { getStats } from "../api/stats.js"; 10 + 11 + const app = new Hono(); 12 + const config = Config.getInstance().getConfig(); 13 + 14 + const serviceDid: string = config.network.serviceDid; 15 + const signingKey: string = config.network.didSigningKey; 16 + let baseUrl: string = config.baseUrl; 17 + 18 + if (!baseUrl.startsWith("http://") || !baseUrl.startsWith("https://")) { 19 + baseUrl = `http://${baseUrl.replace(/^https?:\/\//, "")}`; 20 + } 21 + 22 + app.get("/.well-known/nodeinfo", (c) => { 23 + return c.json({ 24 + links: [ 25 + { 26 + rel: "https://nodeinfo.diaspora.software/ns/schema/2.2", 27 + href: `${baseUrl}/nodeinfo/2.2`, 28 + }, 29 + { 30 + rel: "https://nodeinfo.diaspora.software/ns/schema/2.1", 31 + href: `${baseUrl}/nodeinfo/2.1`, 32 + }, 33 + { 34 + rel: "https://nodeinfo.diaspora.software/ns/schema/2.0", 35 + href: `${baseUrl}/nodeinfo/2.0`, 36 + }, 37 + ], 38 + }); 39 + }); 40 + 41 + app.get("/nodeinfo/2.2", async (c) => { 42 + const appviewStats = await getStats(); 43 + 44 + return c.json({ 45 + version: "2.2", 46 + software: { 47 + name: "clippr", 48 + version: `${process.env.npm_package_version}`, 49 + repository: "https://tangled.sh/@hexmani.ac/clippr", 50 + homepage: "https://clippr.social", 51 + }, 52 + instance: { 53 + name: "clippr", 54 + description: "A social bookmarking service for the AT Protocol", 55 + }, 56 + openRegistrations: true, 57 + protocols: ["atprotocol"], 58 + services: { 59 + inbound: [], 60 + outbound: [], 61 + }, 62 + usage: { 63 + users: { 64 + total: appviewStats.knownUsers, 65 + }, 66 + }, 67 + metadata: { 68 + clips: appviewStats.knownClips, 69 + tags: appviewStats.knownTags, 70 + }, 71 + }); 72 + }); 73 + 74 + app.get("/nodeinfo/2.1", async (c) => { 75 + const appviewStats = await getStats(); 76 + 77 + return c.json({ 78 + version: "2.1", 79 + software: { 80 + name: "clippr", 81 + version: `${process.env.npm_package_version}`, 82 + repository: "https://tangled.sh/@hexmani.ac/clippr", 83 + homepage: "https://clippr.social", 84 + }, 85 + openRegistrations: true, 86 + protocols: ["atprotocol"], 87 + services: { 88 + inbound: [], 89 + outbound: [], 90 + }, 91 + usage: { 92 + users: { 93 + total: appviewStats.knownUsers, 94 + }, 95 + }, 96 + metadata: { 97 + clips: appviewStats.knownClips, 98 + tags: appviewStats.knownTags, 99 + }, 100 + }); 101 + }); 102 + 103 + app.get("/nodeinfo/2.0", async (c) => { 104 + const appviewStats = await getStats(); 105 + 106 + return c.json({ 107 + version: "2.0", 108 + software: { 109 + name: "clippr", 110 + version: `${process.env.npm_package_version}`, 111 + }, 112 + openRegistrations: true, 113 + protocols: ["atprotocol"], 114 + services: { 115 + inbound: [], 116 + outbound: [], 117 + }, 118 + usage: { 119 + users: { 120 + total: appviewStats.knownUsers, 121 + }, 122 + }, 123 + metadata: { 124 + clips: appviewStats.knownClips, 125 + tags: appviewStats.knownTags, 126 + }, 127 + }); 128 + }); 129 + 130 + app.get("/.well-known/did.json", async (c) => { 131 + if (serviceDid === undefined) { 132 + return c.json( 133 + { 134 + error: "Internal Server Error", 135 + message: "Server is not properly configured", 136 + }, 137 + 500, 138 + ); 139 + } 140 + 141 + if (signingKey === undefined) { 142 + return c.json( 143 + { 144 + error: "Internal Server Error", 145 + message: "Server is not properly configured", 146 + }, 147 + 500, 148 + ); 149 + } 150 + 151 + if (!signingKey.replace("did:key:", "").startsWith("z")) { 152 + console.log(signingKey); 153 + return c.json( 154 + { 155 + error: "Internal Server Error", 156 + message: "Server is not properly configured", 157 + }, 158 + 500, 159 + ); 160 + } 161 + 162 + return c.json({ 163 + "@context": [ 164 + "https://www.w3.org/ns/did/v1", 165 + "https://w3id.org/security/multikey/v1", 166 + ], 167 + id: serviceDid, 168 + verificationMethod: [ 169 + { 170 + id: `${serviceDid}#atproto`, 171 + type: "Multikey", 172 + controller: serviceDid, 173 + publicKeyMultibase: `${signingKey.replace("did:key:", "")}`, 174 + }, 175 + ], 176 + services: [ 177 + { 178 + id: "#clippr_appview", 179 + type: "ClipprAppView", 180 + serviceEndpoint: `${baseUrl}`, 181 + }, 182 + ], 183 + }); 184 + }); 185 + 186 + export default app;
+3 -1
backend/src/server.ts
··· 6 6 7 7 import { Hono } from "hono"; 8 8 import misc from "./routes/misc.js"; 9 + import openapi from "./routes/openapi.js"; 9 10 import xrpc from "./routes/xrpc.js"; 11 + import wellKnown from "./routes/well-known.js"; 10 12 import Logger from "./logger.js"; 11 13 import { logger } from "hono/logger"; 12 - import openapi from "./routes/openapi.js"; 13 14 import { cors } from "hono/cors"; 14 15 15 16 export function winstonLogger(message: string, ...rest: unknown[]) { ··· 23 24 // Link all routes up 24 25 app.route("/", misc); 25 26 app.route("/", openapi); 27 + app.route("/", wellKnown); 26 28 app.route("/xrpc", xrpc); 27 29 28 30 export default app;
+12 -1
frontend/README.md
··· 4 4 5 5 ## development 6 6 7 + If you are testing the frontend in conjunction with the AppView, you might want to change the 8 + following: 9 + 10 + - OAuth automatically adapts to whether the frontend is built or in dev mode. 11 + - `VITE_CLIPPR_APPVIEW` is set to the defaults for both production and development, however, if you 12 + are hosting the appview from another location, you will need to change this. 13 + 7 14 ```shell 8 15 pnpm install 9 - cp .env.example .env # Modify this if necessary 10 16 pnpm run dev 11 17 ``` 12 18 13 19 ## deployment 20 + 21 + If you plan to deploy the frontend and use another AppView or to add/remove OAuth scopes, you will 22 + have to modify `public/oauth/client-metadata.json` and the `VITE_CLIPPR_APPVIEW` environment 23 + variable. There are plans to add a way to change what AppView DID the frontend proxies its requests 24 + to inside the frontend, but not before launch. 14 25 15 26 ```shell 16 27 pnpm run build
+1 -1
frontend/package.json
··· 22 22 "dependencies": { 23 23 "@atcute/client": "^4.0.3", 24 24 "@atcute/identity-resolver": "^1.1.3", 25 - "@atcute/lexicons": "^1.1.0", 25 + "@atcute/lexicons": "^1.1.1", 26 26 "@atcute/oauth-browser-client": "^1.0.26", 27 27 "@mary/exif-rm": "jsr:^0.2.2", 28 28 "@solidjs/router": "^0.15.3",
+101 -101
frontend/pnpm-lock.yaml
··· 15 15 specifier: ^1.1.3 16 16 version: 1.1.3(@atcute/identity@1.0.3) 17 17 '@atcute/lexicons': 18 - specifier: ^1.1.0 19 - version: 1.1.0 18 + specifier: ^1.1.1 19 + version: 1.1.1 20 20 '@atcute/oauth-browser-client': 21 21 specifier: ^1.0.26 22 22 version: 1.0.26 ··· 66 66 '@atcute/identity@1.0.3': 67 67 resolution: {integrity: sha512-mNMxbKHFGys03A8JXKk0KfMBzdd0vrYMzZZWjpw1nYTs0+ea6bo5S1hwqVUZxHdo1gFHSe/t63jxQIF4yL9aKw==} 68 68 69 - '@atcute/lexicons@1.1.0': 70 - resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 69 + '@atcute/lexicons@1.1.1': 70 + resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==} 71 71 72 72 '@atcute/multibase@1.1.4': 73 73 resolution: {integrity: sha512-NUf5AeeSOmuZHGU+4GAaMtISJoG+ZHtW/vUVA4lK/YDt/7LODAW0Fd0NNIIUPVUoW0xJS6zSEIWvwLLuxmEHhA==} ··· 347 347 '@nothing-but/utils@0.17.0': 348 348 resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} 349 349 350 - '@rollup/rollup-android-arm-eabi@4.46.3': 351 - resolution: {integrity: sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==} 350 + '@rollup/rollup-android-arm-eabi@4.47.1': 351 + resolution: {integrity: sha512-lTahKRJip0knffA/GTNFJMrToD+CM+JJ+Qt5kjzBK/sFQ0EWqfKW3AYQSlZXN98tX0lx66083U9JYIMioMMK7g==} 352 352 cpu: [arm] 353 353 os: [android] 354 354 355 - '@rollup/rollup-android-arm64@4.46.3': 356 - resolution: {integrity: sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==} 355 + '@rollup/rollup-android-arm64@4.47.1': 356 + resolution: {integrity: sha512-uqxkb3RJLzlBbh/bbNQ4r7YpSZnjgMgyoEOY7Fy6GCbelkDSAzeiogxMG9TfLsBbqmGsdDObo3mzGqa8hps4MA==} 357 357 cpu: [arm64] 358 358 os: [android] 359 359 360 - '@rollup/rollup-darwin-arm64@4.46.3': 361 - resolution: {integrity: sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==} 360 + '@rollup/rollup-darwin-arm64@4.47.1': 361 + resolution: {integrity: sha512-tV6reObmxBDS4DDyLzTDIpymthNlxrLBGAoQx6m2a7eifSNEZdkXQl1PE4ZjCkEDPVgNXSzND/k9AQ3mC4IOEQ==} 362 362 cpu: [arm64] 363 363 os: [darwin] 364 364 365 - '@rollup/rollup-darwin-x64@4.46.3': 366 - resolution: {integrity: sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==} 365 + '@rollup/rollup-darwin-x64@4.47.1': 366 + resolution: {integrity: sha512-XuJRPTnMk1lwsSnS3vYyVMu4x/+WIw1MMSiqj5C4j3QOWsMzbJEK90zG+SWV1h0B1ABGCQ0UZUjti+TQK35uHQ==} 367 367 cpu: [x64] 368 368 os: [darwin] 369 369 370 - '@rollup/rollup-freebsd-arm64@4.46.3': 371 - resolution: {integrity: sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==} 370 + '@rollup/rollup-freebsd-arm64@4.47.1': 371 + resolution: {integrity: sha512-79BAm8Ag/tmJ5asCqgOXsb3WY28Rdd5Lxj8ONiQzWzy9LvWORd5qVuOnjlqiWWZJw+dWewEktZb5yiM1DLLaHw==} 372 372 cpu: [arm64] 373 373 os: [freebsd] 374 374 375 - '@rollup/rollup-freebsd-x64@4.46.3': 376 - resolution: {integrity: sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==} 375 + '@rollup/rollup-freebsd-x64@4.47.1': 376 + resolution: {integrity: sha512-OQ2/ZDGzdOOlyfqBiip0ZX/jVFekzYrGtUsqAfLDbWy0jh1PUU18+jYp8UMpqhly5ltEqotc2miLngf9FPSWIA==} 377 377 cpu: [x64] 378 378 os: [freebsd] 379 379 380 - '@rollup/rollup-linux-arm-gnueabihf@4.46.3': 381 - resolution: {integrity: sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==} 380 + '@rollup/rollup-linux-arm-gnueabihf@4.47.1': 381 + resolution: {integrity: sha512-HZZBXJL1udxlCVvoVadstgiU26seKkHbbAMLg7680gAcMnRNP9SAwTMVet02ANA94kXEI2VhBnXs4e5nf7KG2A==} 382 382 cpu: [arm] 383 383 os: [linux] 384 384 385 - '@rollup/rollup-linux-arm-musleabihf@4.46.3': 386 - resolution: {integrity: sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==} 385 + '@rollup/rollup-linux-arm-musleabihf@4.47.1': 386 + resolution: {integrity: sha512-sZ5p2I9UA7T950JmuZ3pgdKA6+RTBr+0FpK427ExW0t7n+QwYOcmDTK/aRlzoBrWyTpJNlS3kacgSlSTUg6P/Q==} 387 387 cpu: [arm] 388 388 os: [linux] 389 389 390 - '@rollup/rollup-linux-arm64-gnu@4.46.3': 391 - resolution: {integrity: sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==} 390 + '@rollup/rollup-linux-arm64-gnu@4.47.1': 391 + resolution: {integrity: sha512-3hBFoqPyU89Dyf1mQRXCdpc6qC6At3LV6jbbIOZd72jcx7xNk3aAp+EjzAtN6sDlmHFzsDJN5yeUySvorWeRXA==} 392 392 cpu: [arm64] 393 393 os: [linux] 394 394 395 - '@rollup/rollup-linux-arm64-musl@4.46.3': 396 - resolution: {integrity: sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==} 395 + '@rollup/rollup-linux-arm64-musl@4.47.1': 396 + resolution: {integrity: sha512-49J4FnMHfGodJWPw73Ve+/hsPjZgcXQGkmqBGZFvltzBKRS+cvMiWNLadOMXKGnYRhs1ToTGM0sItKISoSGUNA==} 397 397 cpu: [arm64] 398 398 os: [linux] 399 399 400 - '@rollup/rollup-linux-loongarch64-gnu@4.46.3': 401 - resolution: {integrity: sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==} 400 + '@rollup/rollup-linux-loongarch64-gnu@4.47.1': 401 + resolution: {integrity: sha512-4yYU8p7AneEpQkRX03pbpLmE21z5JNys16F1BZBZg5fP9rIlb0TkeQjn5du5w4agConCCEoYIG57sNxjryHEGg==} 402 402 cpu: [loong64] 403 403 os: [linux] 404 404 405 - '@rollup/rollup-linux-ppc64-gnu@4.46.3': 406 - resolution: {integrity: sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==} 405 + '@rollup/rollup-linux-ppc64-gnu@4.47.1': 406 + resolution: {integrity: sha512-fAiq+J28l2YMWgC39jz/zPi2jqc0y3GSRo1yyxlBHt6UN0yYgnegHSRPa3pnHS5amT/efXQrm0ug5+aNEu9UuQ==} 407 407 cpu: [ppc64] 408 408 os: [linux] 409 409 410 - '@rollup/rollup-linux-riscv64-gnu@4.46.3': 411 - resolution: {integrity: sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==} 410 + '@rollup/rollup-linux-riscv64-gnu@4.47.1': 411 + resolution: {integrity: sha512-daoT0PMENNdjVYYU9xec30Y2prb1AbEIbb64sqkcQcSaR0zYuKkoPuhIztfxuqN82KYCKKrj+tQe4Gi7OSm1ow==} 412 412 cpu: [riscv64] 413 413 os: [linux] 414 414 415 - '@rollup/rollup-linux-riscv64-musl@4.46.3': 416 - resolution: {integrity: sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==} 415 + '@rollup/rollup-linux-riscv64-musl@4.47.1': 416 + resolution: {integrity: sha512-JNyXaAhWtdzfXu5pUcHAuNwGQKevR+6z/poYQKVW+pLaYOj9G1meYc57/1Xv2u4uTxfu9qEWmNTjv/H/EpAisw==} 417 417 cpu: [riscv64] 418 418 os: [linux] 419 419 420 - '@rollup/rollup-linux-s390x-gnu@4.46.3': 421 - resolution: {integrity: sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==} 420 + '@rollup/rollup-linux-s390x-gnu@4.47.1': 421 + resolution: {integrity: sha512-U/CHbqKSwEQyZXjCpY43/GLYcTVKEXeRHw0rMBJP7fP3x6WpYG4LTJWR3ic6TeYKX6ZK7mrhltP4ppolyVhLVQ==} 422 422 cpu: [s390x] 423 423 os: [linux] 424 424 425 - '@rollup/rollup-linux-x64-gnu@4.46.3': 426 - resolution: {integrity: sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==} 425 + '@rollup/rollup-linux-x64-gnu@4.47.1': 426 + resolution: {integrity: sha512-uTLEakjxOTElfeZIGWkC34u2auLHB1AYS6wBjPGI00bWdxdLcCzK5awjs25YXpqB9lS8S0vbO0t9ZcBeNibA7g==} 427 427 cpu: [x64] 428 428 os: [linux] 429 429 430 - '@rollup/rollup-linux-x64-musl@4.46.3': 431 - resolution: {integrity: sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==} 430 + '@rollup/rollup-linux-x64-musl@4.47.1': 431 + resolution: {integrity: sha512-Ft+d/9DXs30BK7CHCTX11FtQGHUdpNDLJW0HHLign4lgMgBcPFN3NkdIXhC5r9iwsMwYreBBc4Rho5ieOmKNVQ==} 432 432 cpu: [x64] 433 433 os: [linux] 434 434 435 - '@rollup/rollup-win32-arm64-msvc@4.46.3': 436 - resolution: {integrity: sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==} 435 + '@rollup/rollup-win32-arm64-msvc@4.47.1': 436 + resolution: {integrity: sha512-N9X5WqGYzZnjGAFsKSfYFtAShYjwOmFJoWbLg3dYixZOZqU7hdMq+/xyS14zKLhFhZDhP9VfkzQnsdk0ZDS9IA==} 437 437 cpu: [arm64] 438 438 os: [win32] 439 439 440 - '@rollup/rollup-win32-ia32-msvc@4.46.3': 441 - resolution: {integrity: sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==} 440 + '@rollup/rollup-win32-ia32-msvc@4.47.1': 441 + resolution: {integrity: sha512-O+KcfeCORZADEY8oQJk4HK8wtEOCRE4MdOkb8qGZQNun3jzmj2nmhV/B/ZaaZOkPmJyvm/gW9n0gsB4eRa1eiQ==} 442 442 cpu: [ia32] 443 443 os: [win32] 444 444 445 - '@rollup/rollup-win32-x64-msvc@4.46.3': 446 - resolution: {integrity: sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==} 445 + '@rollup/rollup-win32-x64-msvc@4.47.1': 446 + resolution: {integrity: sha512-CpKnYa8eHthJa3c+C38v/E+/KZyF1Jdh2Cz3DyKZqEWYgrM1IHFArXNWvBLPQCKUEsAqqKX27tTqVEFbDNUcOA==} 447 447 cpu: [x64] 448 448 os: [win32] 449 449 ··· 554 554 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 555 555 hasBin: true 556 556 557 - caniuse-lite@1.0.30001735: 558 - resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} 557 + caniuse-lite@1.0.30001737: 558 + resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} 559 559 560 560 convert-source-map@2.0.0: 561 561 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} ··· 572 572 supports-color: 573 573 optional: true 574 574 575 - electron-to-chromium@1.5.207: 576 - resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} 575 + electron-to-chromium@1.5.208: 576 + resolution: {integrity: sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==} 577 577 578 578 entities@6.0.1: 579 579 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} ··· 671 671 engines: {node: '>=14'} 672 672 hasBin: true 673 673 674 - rollup@4.46.3: 675 - resolution: {integrity: sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==} 674 + rollup@4.47.1: 675 + resolution: {integrity: sha512-iasGAQoZ5dWDzULEUX3jiW0oB1qyFOepSyDyoU6S/OhVlDIwj5knI5QBa5RRQ0sK7OE0v+8VIi2JuV+G+3tfNg==} 676 676 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 677 677 hasBin: true 678 678 ··· 803 803 '@atcute/client@4.0.3': 804 804 dependencies: 805 805 '@atcute/identity': 1.0.3 806 - '@atcute/lexicons': 1.1.0 806 + '@atcute/lexicons': 1.1.1 807 807 808 808 '@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)': 809 809 dependencies: 810 810 '@atcute/identity': 1.0.3 811 - '@atcute/lexicons': 1.1.0 811 + '@atcute/lexicons': 1.1.1 812 812 '@atcute/util-fetch': 1.0.1 813 813 '@badrap/valita': 0.4.6 814 814 815 815 '@atcute/identity@1.0.3': 816 816 dependencies: 817 - '@atcute/lexicons': 1.1.0 817 + '@atcute/lexicons': 1.1.1 818 818 '@badrap/valita': 0.4.6 819 819 820 - '@atcute/lexicons@1.1.0': 820 + '@atcute/lexicons@1.1.1': 821 821 dependencies: 822 822 esm-env: 1.2.2 823 823 ··· 829 829 dependencies: 830 830 '@atcute/client': 4.0.3 831 831 '@atcute/identity': 1.0.3 832 - '@atcute/lexicons': 1.1.0 832 + '@atcute/lexicons': 1.1.1 833 833 '@atcute/multibase': 1.1.4 834 834 '@atcute/uint8array': 1.0.3 835 835 nanoid: 5.1.5 ··· 1054 1054 1055 1055 '@nothing-but/utils@0.17.0': {} 1056 1056 1057 - '@rollup/rollup-android-arm-eabi@4.46.3': 1057 + '@rollup/rollup-android-arm-eabi@4.47.1': 1058 1058 optional: true 1059 1059 1060 - '@rollup/rollup-android-arm64@4.46.3': 1060 + '@rollup/rollup-android-arm64@4.47.1': 1061 1061 optional: true 1062 1062 1063 - '@rollup/rollup-darwin-arm64@4.46.3': 1063 + '@rollup/rollup-darwin-arm64@4.47.1': 1064 1064 optional: true 1065 1065 1066 - '@rollup/rollup-darwin-x64@4.46.3': 1066 + '@rollup/rollup-darwin-x64@4.47.1': 1067 1067 optional: true 1068 1068 1069 - '@rollup/rollup-freebsd-arm64@4.46.3': 1069 + '@rollup/rollup-freebsd-arm64@4.47.1': 1070 1070 optional: true 1071 1071 1072 - '@rollup/rollup-freebsd-x64@4.46.3': 1072 + '@rollup/rollup-freebsd-x64@4.47.1': 1073 1073 optional: true 1074 1074 1075 - '@rollup/rollup-linux-arm-gnueabihf@4.46.3': 1075 + '@rollup/rollup-linux-arm-gnueabihf@4.47.1': 1076 1076 optional: true 1077 1077 1078 - '@rollup/rollup-linux-arm-musleabihf@4.46.3': 1078 + '@rollup/rollup-linux-arm-musleabihf@4.47.1': 1079 1079 optional: true 1080 1080 1081 - '@rollup/rollup-linux-arm64-gnu@4.46.3': 1081 + '@rollup/rollup-linux-arm64-gnu@4.47.1': 1082 1082 optional: true 1083 1083 1084 - '@rollup/rollup-linux-arm64-musl@4.46.3': 1084 + '@rollup/rollup-linux-arm64-musl@4.47.1': 1085 1085 optional: true 1086 1086 1087 - '@rollup/rollup-linux-loongarch64-gnu@4.46.3': 1087 + '@rollup/rollup-linux-loongarch64-gnu@4.47.1': 1088 1088 optional: true 1089 1089 1090 - '@rollup/rollup-linux-ppc64-gnu@4.46.3': 1090 + '@rollup/rollup-linux-ppc64-gnu@4.47.1': 1091 1091 optional: true 1092 1092 1093 - '@rollup/rollup-linux-riscv64-gnu@4.46.3': 1093 + '@rollup/rollup-linux-riscv64-gnu@4.47.1': 1094 1094 optional: true 1095 1095 1096 - '@rollup/rollup-linux-riscv64-musl@4.46.3': 1096 + '@rollup/rollup-linux-riscv64-musl@4.47.1': 1097 1097 optional: true 1098 1098 1099 - '@rollup/rollup-linux-s390x-gnu@4.46.3': 1099 + '@rollup/rollup-linux-s390x-gnu@4.47.1': 1100 1100 optional: true 1101 1101 1102 - '@rollup/rollup-linux-x64-gnu@4.46.3': 1102 + '@rollup/rollup-linux-x64-gnu@4.47.1': 1103 1103 optional: true 1104 1104 1105 - '@rollup/rollup-linux-x64-musl@4.46.3': 1105 + '@rollup/rollup-linux-x64-musl@4.47.1': 1106 1106 optional: true 1107 1107 1108 - '@rollup/rollup-win32-arm64-msvc@4.46.3': 1108 + '@rollup/rollup-win32-arm64-msvc@4.47.1': 1109 1109 optional: true 1110 1110 1111 - '@rollup/rollup-win32-ia32-msvc@4.46.3': 1111 + '@rollup/rollup-win32-ia32-msvc@4.47.1': 1112 1112 optional: true 1113 1113 1114 - '@rollup/rollup-win32-x64-msvc@4.46.3': 1114 + '@rollup/rollup-win32-x64-msvc@4.47.1': 1115 1115 optional: true 1116 1116 1117 1117 '@solid-devtools/debugger@0.28.1(solid-js@1.9.9)': ··· 1255 1255 1256 1256 browserslist@4.25.3: 1257 1257 dependencies: 1258 - caniuse-lite: 1.0.30001735 1259 - electron-to-chromium: 1.5.207 1258 + caniuse-lite: 1.0.30001737 1259 + electron-to-chromium: 1.5.208 1260 1260 node-releases: 2.0.19 1261 1261 update-browserslist-db: 1.1.3(browserslist@4.25.3) 1262 1262 1263 - caniuse-lite@1.0.30001735: {} 1263 + caniuse-lite@1.0.30001737: {} 1264 1264 1265 1265 convert-source-map@2.0.0: {} 1266 1266 ··· 1270 1270 dependencies: 1271 1271 ms: 2.1.3 1272 1272 1273 - electron-to-chromium@1.5.207: {} 1273 + electron-to-chromium@1.5.208: {} 1274 1274 1275 1275 entities@6.0.1: {} 1276 1276 ··· 1358 1358 1359 1359 prettier@3.6.2: {} 1360 1360 1361 - rollup@4.46.3: 1361 + rollup@4.47.1: 1362 1362 dependencies: 1363 1363 '@types/estree': 1.0.8 1364 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 1365 + '@rollup/rollup-android-arm-eabi': 4.47.1 1366 + '@rollup/rollup-android-arm64': 4.47.1 1367 + '@rollup/rollup-darwin-arm64': 4.47.1 1368 + '@rollup/rollup-darwin-x64': 4.47.1 1369 + '@rollup/rollup-freebsd-arm64': 4.47.1 1370 + '@rollup/rollup-freebsd-x64': 4.47.1 1371 + '@rollup/rollup-linux-arm-gnueabihf': 4.47.1 1372 + '@rollup/rollup-linux-arm-musleabihf': 4.47.1 1373 + '@rollup/rollup-linux-arm64-gnu': 4.47.1 1374 + '@rollup/rollup-linux-arm64-musl': 4.47.1 1375 + '@rollup/rollup-linux-loongarch64-gnu': 4.47.1 1376 + '@rollup/rollup-linux-ppc64-gnu': 4.47.1 1377 + '@rollup/rollup-linux-riscv64-gnu': 4.47.1 1378 + '@rollup/rollup-linux-riscv64-musl': 4.47.1 1379 + '@rollup/rollup-linux-s390x-gnu': 4.47.1 1380 + '@rollup/rollup-linux-x64-gnu': 4.47.1 1381 + '@rollup/rollup-linux-x64-musl': 4.47.1 1382 + '@rollup/rollup-win32-arm64-msvc': 4.47.1 1383 + '@rollup/rollup-win32-ia32-msvc': 4.47.1 1384 + '@rollup/rollup-win32-x64-msvc': 4.47.1 1385 1385 fsevents: 2.3.3 1386 1386 1387 1387 semver@6.3.1: {} ··· 1458 1458 fdir: 6.5.0(picomatch@4.0.3) 1459 1459 picomatch: 4.0.3 1460 1460 postcss: 8.5.6 1461 - rollup: 4.46.3 1461 + rollup: 4.47.1 1462 1462 tinyglobby: 0.2.14 1463 1463 optionalDependencies: 1464 1464 '@types/node': 24.3.0
-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 - }
+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 + }
+6 -1
frontend/src/components/profileEditor.tsx
··· 146 146 accept=".jpg,.jpeg,.png,image/jpeg,image/png" 147 147 onChange={() => uploadBlob()} 148 148 /> 149 - <img class="profile-picture" src={avatarPreview()} alt="The user's uploaded avatar." hidden={avatarPreview() === ""} /> 149 + <img 150 + class="profile-picture" 151 + src={avatarPreview()} 152 + alt="The user's uploaded avatar." 153 + hidden={avatarPreview() === ""} 154 + /> 150 155 <label for="displayName">display name</label> 151 156 <input 152 157 type="text"
+1 -8
frontend/src/components/profileWidget.tsx
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import { 8 - createResource, 9 - Match, 10 - Show, 11 - splitProps, 12 - Switch, 13 - } from "solid-js"; 7 + import { createResource, Match, Show, splitProps, Switch } from "solid-js"; 14 8 import { agent } from "./loginForm.tsx"; 15 9 import { fetchProfile } from "../utils/profile.ts"; 16 10 ··· 21 15 const ProfileWidget = (props: ProfileProps) => { 22 16 const [local] = splitProps(props, ["actor"]); 23 17 const actor = () => local.actor ?? agent.session.info.sub; 24 - 25 18 26 19 const [profile] = createResource(actor, fetchProfile); 27 20
+6 -6
frontend/src/styles/index.css
··· 13 13 :root { 14 14 --bg: #222 !important; 15 15 --fg: #fff !important; 16 - --controls-bg: #2B2A33 !important; 17 - --controls-bg-hover: #52525E !important; 18 - --controls-border: #8F8F9D !important; 16 + --controls-bg: #2b2a33 !important; 17 + --controls-bg-hover: #52525e !important; 18 + --controls-border: #8f8f9d !important; 19 19 } 20 20 } 21 21 ··· 23 23 :root { 24 24 --bg: #fff !important; 25 25 --fg: #222 !important; 26 - --controls-bg: #E9E9ED !important; 27 - --controls-bg-hover: #D0D0D7 !important; 28 - --controls-border: #8F8F9D !important; 26 + --controls-bg: #e9e9ed !important; 27 + --controls-bg-hover: #d0d0d7 !important; 28 + --controls-border: #8f8f9d !important; 29 29 } 30 30 } 31 31
+1 -1
frontend/src/types.ts
··· 16 16 avatar: string; 17 17 description: string; 18 18 createdAt: string; 19 - } 19 + };
+19
frontend/src/utils/client.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 { ServiceProxyOptions } from "@atcute/client"; 8 + 9 + // Converts the AppView environment variable into options for the client's server proxy options. 10 + export const createServiceProxy = (): ServiceProxyOptions | undefined => { 11 + const appviewUrl = import.meta.env.VITE_CLIPPR_APPVIEW; 12 + if (appviewUrl.includes("localhost:")) return undefined; // TODO: You can't do PDS proxying if you're testing locally!!! 13 + let sanitizedUrl = appviewUrl.replace(/^(https?:\/\/)/, "did:web:"); 14 + 15 + return { 16 + did: sanitizedUrl as `did:${string}:${string}`, 17 + serviceId: "#clippr_appview", 18 + }; 19 + };
+1 -1
frontend/vite.config.ts
··· 6 6 7 7 import { defineConfig } from "vite"; 8 8 import solidPlugin from "vite-plugin-solid"; 9 - import metadata from "./public/oauth/client-metadata.json"; 9 + import metadata from "./public/oauth-client-metadata.json"; 10 10 import { devtoolsPlugin } from "solid-devtools/vite"; 11 11 12 12 const SERVER_HOST = "127.0.0.1";
+21
lexdocs/LICENSE
··· 1 + MIT License 2 + 3 + Copyright (c) 2025 clippr contributors 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
+1 -1
lexdocs/social/clippr/actor/defs.json
··· 31 31 "type": "string", 32 32 "maxGraphemes": 500, 33 33 "maxLength": 5000, 34 - "description": "The biography associated to the profile" 34 + "description": "A description (or 'bio') associated to the profile" 35 35 }, 36 36 "avatar": { 37 37 "type": "string",
+1 -1
lexdocs/social/clippr/actor/getPreferences.json
··· 4 4 "defs": { 5 5 "main": { 6 6 "type": "query", 7 - "description": "Get the private user preferences associated to the account.", 7 + "description": "Get the private user preferences associated to the requesting account.", 8 8 "parameters": { 9 9 "type": "params", 10 10 "properties": {}
+1 -1
lexdocs/social/clippr/actor/getProfile.json
··· 23 23 "schema": { 24 24 "type": "ref", 25 25 "ref": "social.clippr.actor.defs#profileView", 26 - "description": "A reference to the profile view of the actor" 26 + "description": "A ref to the hydrated profile view of the actor" 27 27 } 28 28 } 29 29 }
+1 -1
lexdocs/social/clippr/actor/putPreferences.json
··· 4 4 "defs": { 5 5 "main": { 6 6 "type": "procedure", 7 - "description": "Set the private preferences attached to the account.", 7 + "description": "Set the private user preferences associated to the requesting account.", 8 8 "input": { 9 9 "encoding": "application/json", 10 10 "schema": {
+5 -1
lexdocs/social/clippr/actor/searchProfiles.json
··· 7 7 "description": "Find profiles matching search criteria. Does not require auth.", 8 8 "parameters": { 9 9 "type": "params", 10 + "required": [ 11 + "q" 12 + ], 10 13 "properties": { 11 14 "q": { 12 15 "type": "string", ··· 42 45 "items": { 43 46 "type": "ref", 44 47 "ref": "social.clippr.actor.defs#profileView" 45 - } 48 + }, 49 + "description": "An array of hydrated profile views" 46 50 } 47 51 } 48 52 }
+2 -2
lexdocs/social/clippr/feed/defs.json
··· 26 26 "author": { 27 27 "type": "ref", 28 28 "ref": "social.clippr.actor.defs#profileView", 29 - "description": "A reference to the actor's profile" 29 + "description": "A ref to the actor's profile" 30 30 }, 31 31 "record": { 32 32 "type": "unknown", ··· 63 63 "author": { 64 64 "type": "ref", 65 65 "ref": "social.clippr.actor.defs#profileView", 66 - "description": "A reference to the actor's profile" 66 + "description": "A ref to the actor's profile" 67 67 }, 68 68 "record": { 69 69 "type": "unknown",
+1 -1
lexdocs/social/clippr/feed/getClips.json
··· 4 4 "defs": { 5 5 "main": { 6 6 "type": "query", 7 - "description": "Get a list of clips. Does not require auth.", 7 + "description": "Get a list of hydrated clips. Does not require auth.", 8 8 "parameters": { 9 9 "type": "params", 10 10 "required": [
+6 -4
lexdocs/social/clippr/feed/getProfileClips.json
··· 4 4 "defs": { 5 5 "main": { 6 6 "type": "query", 7 - "description": "Get a view of a profile's reverse-chronological clips feed. Does not require auth.", 7 + "description": "Get a view of a profile's reverse-chronological feed containing their clips. Does not require auth.", 8 8 "parameters": { 9 9 "type": "params", 10 10 "required": [ ··· 35 35 "untagged_clips" 36 36 ], 37 37 "default": "all_clips", 38 - "description": "What types to include in response" 38 + "description": "What types of clips to include in response" 39 39 } 40 40 } 41 41 }, ··· 48 48 ], 49 49 "properties": { 50 50 "cursor": { 51 - "type": "string" 51 + "type": "string", 52 + "description": "A parameter to paginate results" 52 53 }, 53 54 "feed": { 54 55 "type": "array", 55 56 "items": { 56 57 "type": "ref", 57 58 "ref": "social.clippr.feed.defs#clipView" 58 - } 59 + }, 60 + "description": "An array of hydrated clip views" 59 61 } 60 62 } 61 63 }
+5 -3
lexdocs/social/clippr/feed/getProfileTags.json
··· 4 4 "defs": { 5 5 "main": { 6 6 "type": "query", 7 - "description": "Get a view of a profile's reverse-chronological clips feed. Does not require auth.", 7 + "description": "Get a view of a profile's reverse-chronological feed containing their tags. Does not require auth.", 8 8 "parameters": { 9 9 "type": "params", 10 10 "required": [ ··· 38 38 ], 39 39 "properties": { 40 40 "cursor": { 41 - "type": "string" 41 + "type": "string", 42 + "description": "A parameter to paginate results" 42 43 }, 43 44 "feed": { 44 45 "type": "array", 45 46 "items": { 46 47 "type": "ref", 47 48 "ref": "social.clippr.feed.defs#tagView" 48 - } 49 + }, 50 + "description": "An array of hydrated tag views" 49 51 } 50 52 } 51 53 }
+64
lexdocs/social/clippr/feed/getTagClips.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getTagClips", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a list of clips that are linked to a tag. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor", 12 + "tag" 13 + ], 14 + "properties": { 15 + "actor": { 16 + "type": "string", 17 + "format": "at-identifier", 18 + "description": "An actor to get valid tags from" 19 + }, 20 + "tag": { 21 + "type": "string", 22 + "maxGraphemes": 64, 23 + "maxLength": 640, 24 + "description": "A tag to use for discovering linked clips" 25 + }, 26 + "limit": { 27 + "type": "integer", 28 + "minimum": 1, 29 + "maximum": 1000, 30 + "default": 50, 31 + "description": "How many results to return with the query" 32 + }, 33 + "cursor": { 34 + "type": "string", 35 + "description": "A parameter to paginate results" 36 + } 37 + } 38 + }, 39 + "output": { 40 + "encoding": "application/json", 41 + "schema": { 42 + "type": "object", 43 + "required": [ 44 + "clips" 45 + ], 46 + "properties": { 47 + "cursor": { 48 + "type": "string", 49 + "description": "A parameter to paginate results" 50 + }, 51 + "clips": { 52 + "type": "array", 53 + "items": { 54 + "type": "ref", 55 + "ref": "social.clippr.feed.defs#clipView" 56 + }, 57 + "description": "An array of hydrated clip views" 58 + } 59 + } 60 + } 61 + } 62 + } 63 + } 64 + }
+1 -1
lexdocs/social/clippr/feed/searchClips.json
··· 51 51 "type": "ref", 52 52 "ref": "social.clippr.feed.defs#clipView" 53 53 }, 54 - "description": "A list of clips and their associated details" 54 + "description": "An array of hydrated clip views" 55 55 } 56 56 } 57 57 }
+1 -1
lexdocs/social/clippr/feed/searchTags.json
··· 51 51 "type": "ref", 52 52 "ref": "social.clippr.feed.defs#tagView" 53 53 }, 54 - "description": "A list of tags and their associated details" 54 + "description": "An array of hydrated tag views" 55 55 } 56 56 } 57 57 }
+7
lexicons/CHANGELOG.md
··· 1 1 # changelog for @clipprjs/lexicons 2 2 3 + ## v1.0.3 4 + 5 + * add ``social.clippr.feed.getTagClips`` query 6 + * make query parameter required for ``social.clippr.actor.searchProfiles`` 7 + * improved lexicon documentation 8 + 3 9 ## v1.0.2 10 + 4 11 * fix some description typos 5 12 * fix `social.clippr.feed.getTags` not existing due to an ID collision 6 13
+1 -1
lexicons/README.md
··· 58 58 import type {} from '@clipprjs/lexicons'; 59 59 ``` 60 60 61 - All the XRPC operations should be visible in the client afterward. 61 + All the Lexicon record schemas and XRPC operations should be visible in the client afterward.
+1 -6
lexicons/lib/lexicons/index.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 1 export * as SocialClipprActorDefs from "./types/social/clippr/actor/defs.js"; 8 2 export * as SocialClipprActorGetPreferences from "./types/social/clippr/actor/getPreferences.js"; 9 3 export * as SocialClipprActorGetProfile from "./types/social/clippr/actor/getProfile.js"; ··· 17 11 export * as SocialClipprFeedGetClips from "./types/social/clippr/feed/getClips.js"; 18 12 export * as SocialClipprFeedGetProfileClips from "./types/social/clippr/feed/getProfileClips.js"; 19 13 export * as SocialClipprFeedGetProfileTags from "./types/social/clippr/feed/getProfileTags.js"; 14 + export * as SocialClipprFeedGetTagClips from "./types/social/clippr/feed/getTagClips.js"; 20 15 export * as SocialClipprFeedGetTagList from "./types/social/clippr/feed/getTagList.js"; 21 16 export * as SocialClipprFeedGetTags from "./types/social/clippr/feed/getTags.js"; 22 17 export * as SocialClipprFeedTag from "./types/social/clippr/feed/tag.js";
-6
lexicons/lib/lexicons/types/social/clippr/actor/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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
lexicons/lib/lexicons/types/social/clippr/actor/getProfile.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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
lexicons/lib/lexicons/types/social/clippr/actor/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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
+1 -7
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient"; ··· 20 14 ]), 21 15 25, 22 16 ), 23 - q: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 17 + q: /*#__PURE__*/ v.string(), 24 18 }), 25 19 output: { 26 20 type: "lex",
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
lexicons/lib/lexicons/types/social/clippr/feed/clip.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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import * as SocialClipprActorDefs from "../actor/defs.js";
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
+45
lexicons/lib/lexicons/types/social/clippr/feed/getTagClips.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as SocialClipprFeedDefs from "./defs.js"; 5 + 6 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.feed.getTagClips", { 7 + params: /*#__PURE__*/ v.object({ 8 + actor: /*#__PURE__*/ v.actorIdentifierString(), 9 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 10 + limit: /*#__PURE__*/ v.optional( 11 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 12 + /*#__PURE__*/ v.integerRange(1, 1000), 13 + ]), 14 + 50, 15 + ), 16 + tag: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 + /*#__PURE__*/ v.stringLength(0, 640), 18 + /*#__PURE__*/ v.stringGraphemes(0, 64), 19 + ]), 20 + }), 21 + output: { 22 + type: "lex", 23 + schema: /*#__PURE__*/ v.object({ 24 + get clips() { 25 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.clipViewSchema); 26 + }, 27 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 28 + }), 29 + }, 30 + }); 31 + 32 + type main$schematype = typeof _mainSchema; 33 + 34 + export interface mainSchema extends main$schematype {} 35 + 36 + export const mainSchema = _mainSchema as mainSchema; 37 + 38 + export interface $params extends v.InferInput<mainSchema["params"]> {} 39 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 40 + 41 + declare module "@atcute/lexicons/ambient" { 42 + interface XRPCQueries { 43 + "social.clippr.feed.getTagClips": mainSchema; 44 + } 45 + }
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
-6
lexicons/lib/lexicons/types/social/clippr/feed/tag.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 1 import type {} from "@atcute/lexicons"; 8 2 import * as v from "@atcute/lexicons/validations"; 9 3 import type {} from "@atcute/lexicons/ambient";
+4 -4
lexicons/package.json
··· 1 1 { 2 2 "type": "module", 3 3 "name": "@clipprjs/lexicons", 4 - "version": "1.0.2", 4 + "version": "1.0.3", 5 5 "description": "Clippr schema definitions", 6 6 "license": "AGPL-3.0-only", 7 7 "private": false, ··· 29 29 "prepublish": "rm -rf dist; pnpm run build" 30 30 }, 31 31 "dependencies": { 32 - "@atcute/atproto": "^3.1.1", 33 - "@atcute/lexicons": "^1.1.0" 32 + "@atcute/atproto": "^3.1.2", 33 + "@atcute/lexicons": "^1.1.1" 34 34 }, 35 35 "devDependencies": { 36 36 "@atcute/lex-cli": "^2.1.1", 37 - "typescript": "^5.8.3" 37 + "typescript": "^5.9.2" 38 38 } 39 39 }
+24 -24
lexicons/pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@atcute/atproto': 12 - specifier: ^3.1.1 13 - version: 3.1.1 12 + specifier: ^3.1.2 13 + version: 3.1.2 14 14 '@atcute/lexicons': 15 - specifier: ^1.1.0 16 - version: 1.1.0 15 + specifier: ^1.1.1 16 + version: 1.1.1 17 17 devDependencies: 18 18 '@atcute/lex-cli': 19 19 specifier: ^2.1.1 20 20 version: 2.1.1 21 21 typescript: 22 - specifier: ^5.8.3 23 - version: 5.8.3 22 + specifier: ^5.9.2 23 + version: 5.9.2 24 24 25 25 packages: 26 26 27 - '@atcute/atproto@3.1.1': 28 - resolution: {integrity: sha512-D+RLTIPF0xLu7BPZY8KSewAPemJFh+3n3zeQ3ROsLxbTtCHbrTDMAmAFexaVRAPGcPYrwXaBUlv7yZjScJolMg==} 27 + '@atcute/atproto@3.1.2': 28 + resolution: {integrity: sha512-m6OWoGTeL8Wlw7cm8Nrf+NU24rlx5A0DzxEQQPPu1wqYNHw6S33nOU90W+U09vVN0aZGZUrLFfWWhAaSWTp1ZQ==} 29 29 30 30 '@atcute/lex-cli@2.1.1': 31 31 resolution: {integrity: sha512-QaR0sOP8Z24opGHKsSfleDbP/ahUb6HECkVaOqSwG7ORZzbLK1w0265o1BRjCVr2dT6FxlsMUa2Ge85JMA9bxg==} ··· 34 34 '@atcute/lexicon-doc@1.0.3': 35 35 resolution: {integrity: sha512-U7rinsTOwXGGcrF6/s7GzTXargcQpDr4BTrj5ci/XTK+POEK5jpcI+Ag1fF932pBX3k97em6y4TWwTSO8M/McQ==} 36 36 37 - '@atcute/lexicons@1.1.0': 38 - resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 37 + '@atcute/lexicons@1.1.1': 38 + resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==} 39 39 40 - '@badrap/valita@0.4.5': 41 - resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==} 40 + '@badrap/valita@0.4.6': 41 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 42 42 engines: {node: '>= 18'} 43 43 44 44 '@externdefs/collider@0.3.0': ··· 57 57 engines: {node: '>=14'} 58 58 hasBin: true 59 59 60 - typescript@5.8.3: 61 - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 60 + typescript@5.9.2: 61 + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 62 62 engines: {node: '>=14.17'} 63 63 hasBin: true 64 64 65 65 snapshots: 66 66 67 - '@atcute/atproto@3.1.1': 67 + '@atcute/atproto@3.1.2': 68 68 dependencies: 69 - '@atcute/lexicons': 1.1.0 69 + '@atcute/lexicons': 1.1.1 70 70 71 71 '@atcute/lex-cli@2.1.1': 72 72 dependencies: 73 73 '@atcute/lexicon-doc': 1.0.3 74 - '@badrap/valita': 0.4.5 75 - '@externdefs/collider': 0.3.0(@badrap/valita@0.4.5) 74 + '@badrap/valita': 0.4.6 75 + '@externdefs/collider': 0.3.0(@badrap/valita@0.4.6) 76 76 picocolors: 1.1.1 77 77 prettier: 3.6.2 78 78 79 79 '@atcute/lexicon-doc@1.0.3': 80 80 dependencies: 81 - '@badrap/valita': 0.4.5 81 + '@badrap/valita': 0.4.6 82 82 83 - '@atcute/lexicons@1.1.0': 83 + '@atcute/lexicons@1.1.1': 84 84 dependencies: 85 85 esm-env: 1.2.2 86 86 87 - '@badrap/valita@0.4.5': {} 87 + '@badrap/valita@0.4.6': {} 88 88 89 - '@externdefs/collider@0.3.0(@badrap/valita@0.4.5)': 89 + '@externdefs/collider@0.3.0(@badrap/valita@0.4.6)': 90 90 dependencies: 91 - '@badrap/valita': 0.4.5 91 + '@badrap/valita': 0.4.6 92 92 93 93 esm-env@1.2.2: {} 94 94 ··· 96 96 97 97 prettier@3.6.2: {} 98 98 99 - typescript@5.8.3: {} 99 + typescript@5.9.2: {}
+10
package.json
··· 1 + { 2 + "private": true, 3 + "type": "module", 4 + "devDependencies": { 5 + "husky": "^9.1.7" 6 + }, 7 + "scripts": { 8 + "prepare-hooks": "husky" 9 + } 10 + }
+24
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + devDependencies: 11 + husky: 12 + specifier: ^9.1.7 13 + version: 9.1.7 14 + 15 + packages: 16 + 17 + husky@9.1.7: 18 + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} 19 + engines: {node: '>=18'} 20 + hasBin: true 21 + 22 + snapshots: 23 + 24 + husky@9.1.7: {}