social bookmarking for atproto

Compare changes

Choose any two refs to compare.

Changed files
+6114 -4106
.husky
.idea
dictionaries
.tangled
backend
frontend
lexdocs
lexicons
+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 +
+3
.idea/dictionaries/project.xml
··· 1 1 <component name="ProjectDictionaryState"> 2 2 <dictionary name="project"> 3 3 <words> 4 + <w>affero</w> 4 5 <w>agpl</w> 5 6 <w>appview</w> 6 7 <w>atcute</w> 7 8 <w>atproto</w> 9 + <w>atprotocol</w> 8 10 <w>bluesky</w> 9 11 <w>bsky</w> 10 12 <w>clippr</w> ··· 16 18 <w>llms</w> 17 19 <w>llmstxt</w> 18 20 <w>multiformats</w> 21 + <w>nodeinfo</w> 19 22 <w>nsid</w> 20 23 <w>outdir</w> 21 24 <w>rkey</w>
+5
.tangled/workflows/build_backend.yaml
··· 3 3 branch: [ "main" ] 4 4 - event: [ "manual" ] 5 5 6 + engine: "nixery" 7 + 6 8 dependencies: 7 9 nixpkgs: 8 10 - nodejs ··· 23 25 command: "pnpm run --dir ./backend/ build" 24 26 environment: 25 27 NODE_ENV: "production" 28 + 29 + environment: 30 + GIT_BRANCH: "main" 26 31 27 32 clone: 28 33 skip: false
+5
.tangled/workflows/build_frontend.yaml
··· 3 3 branch: [ "main" ] 4 4 - event: [ "manual" ] 5 5 6 + engine: "nixery" 7 + 6 8 dependencies: 7 9 nixpkgs: 8 10 - nodejs ··· 18 20 19 21 - name: "Build frontend" 20 22 command: "pnpm run --dir ./frontend/ build" 23 + 24 + environment: 25 + GIT_BRANCH: "main" 21 26 22 27 clone: 23 28 skip: false
+5
.tangled/workflows/build_lexicons.yaml
··· 3 3 branch: [ "main" ] 4 4 - event: [ "manual" ] 5 5 6 + engine: "nixery" 7 + 6 8 dependencies: 7 9 nixpkgs: 8 10 - nodejs ··· 23 25 command: "pnpm run --dir ./lexicons/ prepublish" 24 26 environment: 25 27 NODE_ENV: "production" 28 + 29 + environment: 30 + GIT_BRANCH: "main" 26 31 27 32 clone: 28 33 skip: false
+27 -14
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. 9 + 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. 8 12 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. 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 - | package | description | 22 - |--------------------------------------------------------------------------|------------------------------------------------------| 23 - | [``backend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/backend) | the reference appview written using node and hono | 24 - | [``frontend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/frontend) | the reference client written in astro and typescript | 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 | 26 + | package | description | 27 + |--------------------------------------------------------------------------|---------------------------------------------------| 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",
+24 -21
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.0", 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": "^0.1.4", 28 + "@atcute/lexicons": "^1.1.1", 29 + "@clipprjs/lexicons": "^1.0.3", 28 30 "@eslint/eslintrc": "^3.3.1", 29 - "@hono/node-server": "^1.15.0", 30 - "@libsql/client": "^0.15.9", 31 - "@scalar/hono-api-reference": "^0.9.9", 32 - "@scalar/openapi-to-markdown": "^0.2.19", 33 - "@skyware/jetstream": "^0.2.4", 34 - "drizzle-orm": "^0.44.2", 35 - "hono": "^4.8.4", 31 + "@hono/node-server": "^1.19.0", 32 + "@libsql/client": "^0.15.12", 33 + "@scalar/hono-api-reference": "^0.9.15", 34 + "@scalar/openapi-to-markdown": "^0.2.28", 35 + "@skyware/jetstream": "^0.2.5", 36 + "drizzle-orm": "^0.44.4", 37 + "hono": "^4.9.4", 36 38 "toml": "^3.0.0", 37 39 "winston": "^3.17.0", 38 40 "xxhash-wasm": "^1.1.0" 39 41 }, 40 42 "devDependencies": { 41 43 "@atcute/lex-cli": "^2.1.1", 42 - "@eslint/js": "^9.30.1", 43 - "@types/node": "^24.0.12", 44 - "@typescript-eslint/eslint-plugin": "^8.36.0", 45 - "@typescript-eslint/parser": "^8.36.0", 44 + "@eslint/js": "^9.33.0", 45 + "@types/node": "^24.3.0", 46 + "@typescript-eslint/eslint-plugin": "^8.40.0", 47 + "@typescript-eslint/parser": "^8.40.0", 46 48 "drizzle-kit": "^0.31.4", 47 - "eslint": "^9.30.1", 48 - "eslint-config-prettier": "^10.1.5", 49 + "eslint": "^9.33.0", 50 + "eslint-config-prettier": "^10.1.8", 49 51 "eslint-plugin-drizzle": "^0.2.3", 50 52 "eslint-plugin-import": "^2.32.0", 51 - "eslint-plugin-prettier": "^5.5.1", 53 + "eslint-plugin-prettier": "^5.5.4", 52 54 "globals": "^16.3.0", 53 - "jiti": "^2.4.2", 55 + "jiti": "^2.5.1", 54 56 "prettier": "^3.6.2", 55 - "tsx": "^4.20.3", 56 - "typescript": "^5.8.3", 57 - "typescript-eslint": "^8.36.0" 57 + "tsx": "^4.20.4", 58 + "typescript": "^5.9.2", 59 + "typescript-eslint": "^8.40.0", 60 + "vitest": "^3.2.4" 58 61 } 59 62 }
+1335 -663
backend/pnpm-lock.yaml
··· 9 9 .: 10 10 dependencies: 11 11 '@atcute/atproto': 12 - specifier: ^3.1.0 13 - version: 3.1.0 12 + specifier: ^3.1.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: ^0.1.4 31 - version: 0.1.4 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 - specifier: ^1.15.0 37 - version: 1.15.0(hono@4.8.4) 39 + specifier: ^1.19.0 40 + version: 1.19.0(hono@4.9.4) 38 41 '@libsql/client': 39 - specifier: ^0.15.9 40 - version: 0.15.9 42 + specifier: ^0.15.12 43 + version: 0.15.12 41 44 '@scalar/hono-api-reference': 42 - specifier: ^0.9.9 43 - version: 0.9.9(hono@4.8.4) 45 + specifier: ^0.9.15 46 + version: 0.9.15(hono@4.9.4) 44 47 '@scalar/openapi-to-markdown': 45 - specifier: ^0.2.19 46 - version: 0.2.19(typescript@5.8.3) 48 + specifier: ^0.2.28 49 + version: 0.2.28(typescript@5.9.2) 47 50 '@skyware/jetstream': 48 - specifier: ^0.2.4 49 - version: 0.2.4 51 + specifier: ^0.2.5 52 + version: 0.2.5 50 53 drizzle-orm: 51 - specifier: ^0.44.2 52 - version: 0.44.2(@libsql/client@0.15.9)(bun-types@1.2.17) 54 + specifier: ^0.44.4 55 + version: 0.44.4(@libsql/client@0.15.12)(bun-types@1.2.17) 53 56 hono: 54 - specifier: ^4.8.4 55 - version: 4.8.4 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 ··· 67 70 specifier: ^2.1.1 68 71 version: 2.1.1 69 72 '@eslint/js': 70 - specifier: ^9.30.1 71 - version: 9.30.1 73 + specifier: ^9.33.0 74 + version: 9.33.0 72 75 '@types/node': 73 - specifier: ^24.0.12 74 - version: 24.0.12 76 + specifier: ^24.3.0 77 + version: 24.3.0 75 78 '@typescript-eslint/eslint-plugin': 76 - specifier: ^8.36.0 77 - version: 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 79 + specifier: ^8.40.0 80 + version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 78 81 '@typescript-eslint/parser': 79 - specifier: ^8.36.0 80 - version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 82 + specifier: ^8.40.0 83 + version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 81 84 drizzle-kit: 82 85 specifier: ^0.31.4 83 86 version: 0.31.4 84 87 eslint: 85 - specifier: ^9.30.1 86 - version: 9.30.1(jiti@2.4.2) 88 + specifier: ^9.33.0 89 + version: 9.33.0(jiti@2.5.1) 87 90 eslint-config-prettier: 88 - specifier: ^10.1.5 89 - version: 10.1.5(eslint@9.30.1(jiti@2.4.2)) 91 + specifier: ^10.1.8 92 + version: 10.1.8(eslint@9.33.0(jiti@2.5.1)) 90 93 eslint-plugin-drizzle: 91 94 specifier: ^0.2.3 92 - version: 0.2.3(eslint@9.30.1(jiti@2.4.2)) 95 + version: 0.2.3(eslint@9.33.0(jiti@2.5.1)) 93 96 eslint-plugin-import: 94 97 specifier: ^2.32.0 95 - version: 2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)) 98 + version: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) 96 99 eslint-plugin-prettier: 97 - specifier: ^5.5.1 98 - version: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2) 100 + specifier: ^5.5.4 101 + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(prettier@3.6.2) 99 102 globals: 100 103 specifier: ^16.3.0 101 104 version: 16.3.0 102 105 jiti: 103 - specifier: ^2.4.2 104 - version: 2.4.2 106 + specifier: ^2.5.1 107 + version: 2.5.1 105 108 prettier: 106 109 specifier: ^3.6.2 107 110 version: 3.6.2 108 111 tsx: 109 - specifier: ^4.20.3 110 - version: 4.20.3 112 + specifier: ^4.20.4 113 + version: 4.20.4 111 114 typescript: 112 - specifier: ^5.8.3 113 - version: 5.8.3 115 + specifier: ^5.9.2 116 + version: 5.9.2 114 117 typescript-eslint: 115 - specifier: ^8.36.0 116 - version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 118 + specifier: ^8.40.0 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.0': 121 - resolution: {integrity: sha512-aJbDsY7FcIh8APWKAimBtshPwqoRE056tc0UV6vw4TW4e3nYaHedoJmKhlh/k8KQWxyw64MQThNGMaC89HNoTg==} 126 + '@atcute/atproto@3.1.2': 127 + resolution: {integrity: sha512-m6OWoGTeL8Wlw7cm8Nrf+NU24rlx5A0DzxEQQPPu1wqYNHw6S33nOU90W+U09vVN0aZGZUrLFfWWhAaSWTp1ZQ==} 122 128 123 - '@atcute/bluesky@3.1.4': 124 - resolution: {integrity: sha512-iSdZGk/UktgKpT/lI0/YxRjM3E5dkd6/vIa2mgH82lgRjI0jH5LJAfLXPyr2mPeZ/qku1gf2/KrkqJ9dfiNxVw==} 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==} ··· 155 170 resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 156 171 engines: {node: '>=6.9.0'} 157 172 158 - '@babel/parser@7.28.0': 159 - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} 173 + '@babel/parser@7.28.3': 174 + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} 160 175 engines: {node: '>=6.0.0'} 161 176 hasBin: true 162 177 163 - '@babel/types@7.28.0': 164 - resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} 178 + '@babel/types@7.28.2': 179 + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 165 180 engines: {node: '>=6.9.0'} 166 181 167 - '@badrap/valita@0.4.5': 168 - resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==} 182 + '@badrap/valita@0.4.6': 183 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 169 184 engines: {node: '>= 18'} 170 185 171 - '@clipprjs/lexicons@0.1.4': 172 - resolution: {integrity: sha512-p3m4eatuWMYtxB7qR5MxfyPEWv5+DVAavH4H0ZtrGI1Z0OmYs2rSPjb9tesCl3ym+/vEnzEeI2zcWSu2Akd2+Q==} 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==} ··· 189 204 resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} 190 205 deprecated: 'Merged into tsx: https://tsx.is' 191 206 192 - '@esbuild/aix-ppc64@0.25.6': 193 - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} 207 + '@esbuild/aix-ppc64@0.25.9': 208 + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} 194 209 engines: {node: '>=18'} 195 210 cpu: [ppc64] 196 211 os: [aix] ··· 201 216 cpu: [arm64] 202 217 os: [android] 203 218 204 - '@esbuild/android-arm64@0.25.6': 205 - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} 219 + '@esbuild/android-arm64@0.25.9': 220 + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} 206 221 engines: {node: '>=18'} 207 222 cpu: [arm64] 208 223 os: [android] ··· 213 228 cpu: [arm] 214 229 os: [android] 215 230 216 - '@esbuild/android-arm@0.25.6': 217 - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} 231 + '@esbuild/android-arm@0.25.9': 232 + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} 218 233 engines: {node: '>=18'} 219 234 cpu: [arm] 220 235 os: [android] ··· 225 240 cpu: [x64] 226 241 os: [android] 227 242 228 - '@esbuild/android-x64@0.25.6': 229 - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} 243 + '@esbuild/android-x64@0.25.9': 244 + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} 230 245 engines: {node: '>=18'} 231 246 cpu: [x64] 232 247 os: [android] ··· 237 252 cpu: [arm64] 238 253 os: [darwin] 239 254 240 - '@esbuild/darwin-arm64@0.25.6': 241 - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} 255 + '@esbuild/darwin-arm64@0.25.9': 256 + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} 242 257 engines: {node: '>=18'} 243 258 cpu: [arm64] 244 259 os: [darwin] ··· 249 264 cpu: [x64] 250 265 os: [darwin] 251 266 252 - '@esbuild/darwin-x64@0.25.6': 253 - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} 267 + '@esbuild/darwin-x64@0.25.9': 268 + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} 254 269 engines: {node: '>=18'} 255 270 cpu: [x64] 256 271 os: [darwin] ··· 261 276 cpu: [arm64] 262 277 os: [freebsd] 263 278 264 - '@esbuild/freebsd-arm64@0.25.6': 265 - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} 279 + '@esbuild/freebsd-arm64@0.25.9': 280 + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} 266 281 engines: {node: '>=18'} 267 282 cpu: [arm64] 268 283 os: [freebsd] ··· 273 288 cpu: [x64] 274 289 os: [freebsd] 275 290 276 - '@esbuild/freebsd-x64@0.25.6': 277 - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} 291 + '@esbuild/freebsd-x64@0.25.9': 292 + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} 278 293 engines: {node: '>=18'} 279 294 cpu: [x64] 280 295 os: [freebsd] ··· 285 300 cpu: [arm64] 286 301 os: [linux] 287 302 288 - '@esbuild/linux-arm64@0.25.6': 289 - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} 303 + '@esbuild/linux-arm64@0.25.9': 304 + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} 290 305 engines: {node: '>=18'} 291 306 cpu: [arm64] 292 307 os: [linux] ··· 297 312 cpu: [arm] 298 313 os: [linux] 299 314 300 - '@esbuild/linux-arm@0.25.6': 301 - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} 315 + '@esbuild/linux-arm@0.25.9': 316 + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} 302 317 engines: {node: '>=18'} 303 318 cpu: [arm] 304 319 os: [linux] ··· 309 324 cpu: [ia32] 310 325 os: [linux] 311 326 312 - '@esbuild/linux-ia32@0.25.6': 313 - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} 327 + '@esbuild/linux-ia32@0.25.9': 328 + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} 314 329 engines: {node: '>=18'} 315 330 cpu: [ia32] 316 331 os: [linux] ··· 321 336 cpu: [loong64] 322 337 os: [linux] 323 338 324 - '@esbuild/linux-loong64@0.25.6': 325 - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} 339 + '@esbuild/linux-loong64@0.25.9': 340 + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} 326 341 engines: {node: '>=18'} 327 342 cpu: [loong64] 328 343 os: [linux] ··· 333 348 cpu: [mips64el] 334 349 os: [linux] 335 350 336 - '@esbuild/linux-mips64el@0.25.6': 337 - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} 351 + '@esbuild/linux-mips64el@0.25.9': 352 + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} 338 353 engines: {node: '>=18'} 339 354 cpu: [mips64el] 340 355 os: [linux] ··· 345 360 cpu: [ppc64] 346 361 os: [linux] 347 362 348 - '@esbuild/linux-ppc64@0.25.6': 349 - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} 363 + '@esbuild/linux-ppc64@0.25.9': 364 + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} 350 365 engines: {node: '>=18'} 351 366 cpu: [ppc64] 352 367 os: [linux] ··· 357 372 cpu: [riscv64] 358 373 os: [linux] 359 374 360 - '@esbuild/linux-riscv64@0.25.6': 361 - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} 375 + '@esbuild/linux-riscv64@0.25.9': 376 + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} 362 377 engines: {node: '>=18'} 363 378 cpu: [riscv64] 364 379 os: [linux] ··· 369 384 cpu: [s390x] 370 385 os: [linux] 371 386 372 - '@esbuild/linux-s390x@0.25.6': 373 - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} 387 + '@esbuild/linux-s390x@0.25.9': 388 + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} 374 389 engines: {node: '>=18'} 375 390 cpu: [s390x] 376 391 os: [linux] ··· 381 396 cpu: [x64] 382 397 os: [linux] 383 398 384 - '@esbuild/linux-x64@0.25.6': 385 - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} 399 + '@esbuild/linux-x64@0.25.9': 400 + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} 386 401 engines: {node: '>=18'} 387 402 cpu: [x64] 388 403 os: [linux] 389 404 390 - '@esbuild/netbsd-arm64@0.25.6': 391 - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} 405 + '@esbuild/netbsd-arm64@0.25.9': 406 + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} 392 407 engines: {node: '>=18'} 393 408 cpu: [arm64] 394 409 os: [netbsd] ··· 399 414 cpu: [x64] 400 415 os: [netbsd] 401 416 402 - '@esbuild/netbsd-x64@0.25.6': 403 - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} 417 + '@esbuild/netbsd-x64@0.25.9': 418 + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} 404 419 engines: {node: '>=18'} 405 420 cpu: [x64] 406 421 os: [netbsd] 407 422 408 - '@esbuild/openbsd-arm64@0.25.6': 409 - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} 423 + '@esbuild/openbsd-arm64@0.25.9': 424 + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} 410 425 engines: {node: '>=18'} 411 426 cpu: [arm64] 412 427 os: [openbsd] ··· 417 432 cpu: [x64] 418 433 os: [openbsd] 419 434 420 - '@esbuild/openbsd-x64@0.25.6': 421 - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} 435 + '@esbuild/openbsd-x64@0.25.9': 436 + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} 422 437 engines: {node: '>=18'} 423 438 cpu: [x64] 424 439 os: [openbsd] 425 440 426 - '@esbuild/openharmony-arm64@0.25.6': 427 - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} 441 + '@esbuild/openharmony-arm64@0.25.9': 442 + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} 428 443 engines: {node: '>=18'} 429 444 cpu: [arm64] 430 445 os: [openharmony] ··· 435 450 cpu: [x64] 436 451 os: [sunos] 437 452 438 - '@esbuild/sunos-x64@0.25.6': 439 - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} 453 + '@esbuild/sunos-x64@0.25.9': 454 + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} 440 455 engines: {node: '>=18'} 441 456 cpu: [x64] 442 457 os: [sunos] ··· 447 462 cpu: [arm64] 448 463 os: [win32] 449 464 450 - '@esbuild/win32-arm64@0.25.6': 451 - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} 465 + '@esbuild/win32-arm64@0.25.9': 466 + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} 452 467 engines: {node: '>=18'} 453 468 cpu: [arm64] 454 469 os: [win32] ··· 459 474 cpu: [ia32] 460 475 os: [win32] 461 476 462 - '@esbuild/win32-ia32@0.25.6': 463 - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} 477 + '@esbuild/win32-ia32@0.25.9': 478 + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} 464 479 engines: {node: '>=18'} 465 480 cpu: [ia32] 466 481 os: [win32] ··· 471 486 cpu: [x64] 472 487 os: [win32] 473 488 474 - '@esbuild/win32-x64@0.25.6': 475 - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} 489 + '@esbuild/win32-x64@0.25.9': 490 + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} 476 491 engines: {node: '>=18'} 477 492 cpu: [x64] 478 493 os: [win32] ··· 491 506 resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} 492 507 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 493 508 494 - '@eslint/config-helpers@0.3.0': 495 - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} 509 + '@eslint/config-helpers@0.3.1': 510 + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} 496 511 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 497 512 498 - '@eslint/core@0.14.0': 499 - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 500 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 501 - 502 - '@eslint/core@0.15.1': 503 - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} 513 + '@eslint/core@0.15.2': 514 + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} 504 515 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 505 516 506 517 '@eslint/eslintrc@3.3.1': 507 518 resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 508 519 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 509 520 510 - '@eslint/js@9.30.1': 511 - resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} 521 + '@eslint/js@9.33.0': 522 + resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} 512 523 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 513 524 514 525 '@eslint/object-schema@2.1.6': 515 526 resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 516 527 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 517 528 518 - '@eslint/plugin-kit@0.3.3': 519 - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} 529 + '@eslint/plugin-kit@0.3.5': 530 + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} 520 531 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 521 532 522 533 '@externdefs/collider@0.3.0': ··· 524 535 peerDependencies: 525 536 '@badrap/valita': ^0.4.4 526 537 527 - '@floating-ui/core@1.7.2': 528 - resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} 538 + '@floating-ui/core@1.7.3': 539 + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} 529 540 530 - '@floating-ui/dom@1.7.2': 531 - resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} 541 + '@floating-ui/dom@1.7.4': 542 + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} 532 543 533 544 '@floating-ui/utils@0.2.10': 534 545 resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} 535 546 536 - '@floating-ui/vue@1.1.7': 537 - resolution: {integrity: sha512-idmAtbAIigGXN2SI5gItiXYBYtNfDTP9yIiObxgu13dgtG7ARCHlNfnR29GxP4LI4o13oiwsJ8wVgghj1lNqcw==} 547 + '@floating-ui/vue@1.1.9': 548 + resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} 538 549 539 550 '@headlessui/vue@1.7.23': 540 551 resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} ··· 542 553 peerDependencies: 543 554 vue: ^3.2.0 544 555 545 - '@hono/node-server@1.15.0': 546 - resolution: {integrity: sha512-MjmK4l5N4dQpZ9OSWN0tCj7ejuc7WvuWMzSKtc89bnknJykAeHxzRigXBTYZk85H6Awrii6RM59iUiUluApu2A==} 556 + '@hono/node-server@1.19.0': 557 + resolution: {integrity: sha512-1k8/8OHf5VIymJEcJyVksFpT+AQ5euY0VA5hUkCnlKpD4mr8FSbvXaHblxeTTEr90OaqWzAkQaqD80qHZQKxBA==} 547 558 engines: {node: '>=18.14.1'} 548 559 peerDependencies: 549 560 hono: ^4 ··· 575 586 '@hyperjump/json-pointer@1.1.1': 576 587 resolution: {integrity: sha512-M0T3s7TC2JepoWPMZQn1W6eYhFh06OXwpMqL+8c5wMVpvnCKNsPgpu9u7WyCI03xVQti8JAeAy4RzUa6SYlJLA==} 577 588 578 - '@hyperjump/json-schema@1.16.1': 579 - resolution: {integrity: sha512-GCGQCOJMwAUTcCn7eDFOx5G6uOPFLG2O3tv+vMrHJUHwqeFo4GVO03BcsmX/Xy7dfTP4VgucXyoNjrtyoqb5wA==} 589 + '@hyperjump/json-schema@1.16.2': 590 + resolution: {integrity: sha512-MJNvaEFc79+h5rvBPgAJK4OHEUr0RqsKcLC5rc3V9FEsJyQAjnP910deRFoZCE068kX/NrAPPhunMgUMwonPtg==} 580 591 peerDependencies: 581 592 '@hyperjump/browser': ^1.1.0 582 593 ··· 589 600 '@internationalized/date@3.8.2': 590 601 resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} 591 602 592 - '@internationalized/number@3.6.3': 593 - resolution: {integrity: sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw==} 603 + '@internationalized/number@3.6.4': 604 + resolution: {integrity: sha512-P+/h+RDaiX8EGt3shB9AYM1+QgkvHmJ5rKi4/59k4sg9g58k9rqsRW0WxRO7jCoHyvVbFRRFKmVTdFYdehrxHg==} 594 605 595 - '@jridgewell/gen-mapping@0.3.12': 596 - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 606 + '@jridgewell/gen-mapping@0.3.13': 607 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 597 608 598 609 '@jridgewell/resolve-uri@3.1.2': 599 610 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 600 611 engines: {node: '>=6.0.0'} 601 612 602 - '@jridgewell/source-map@0.3.10': 603 - resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} 613 + '@jridgewell/source-map@0.3.11': 614 + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} 604 615 605 - '@jridgewell/sourcemap-codec@1.5.4': 606 - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 616 + '@jridgewell/sourcemap-codec@1.5.5': 617 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 607 618 608 - '@jridgewell/trace-mapping@0.3.29': 609 - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 619 + '@jridgewell/trace-mapping@0.3.30': 620 + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} 610 621 611 - '@libsql/client@0.15.9': 612 - resolution: {integrity: sha512-VT3do0a0vwYVaNcp/y05ikkKS3OrFR5UeEf5SUuYZVgKVl1Nc1k9ajoYSsOid8AD/vlhLDB5yFQaV4HmT/OB9w==} 622 + '@libsql/client@0.15.12': 623 + resolution: {integrity: sha512-JIqB0XsNrqYqBQZuhcgZdTcQoNOoQ5AMF+1yxc7vcZrLtm42QJwRazmTuBfyDwtWASEmVgjxeaLF4NT1iyVX8g==} 613 624 614 - '@libsql/core@0.15.9': 615 - resolution: {integrity: sha512-4OVdeAmuaCUq5hYT8NNn0nxlO9AcA/eTjXfUZ+QK8MT3Dz7Z76m73x7KxjU6I64WyXX98dauVH2b9XM+d84npw==} 625 + '@libsql/core@0.15.12': 626 + resolution: {integrity: sha512-S3tF6885ZizVjfym7f8SevL2VId/+DzxiKmP5zFbrhA8oMLh2XH8bYXChmhab7o9qUSHx+XjK4jCFpUwR5g+Ig==} 616 627 617 - '@libsql/darwin-arm64@0.5.13': 618 - resolution: {integrity: sha512-ASz/EAMLDLx3oq9PVvZ4zBXXHbz2TxtxUwX2xpTRFR4V4uSHAN07+jpLu3aK5HUBLuv58z7+GjaL5w/cyjR28Q==} 628 + '@libsql/darwin-arm64@0.5.17': 629 + resolution: {integrity: sha512-WTYG2skZsUnZmfZ2v7WFj7s3/5s2PfrYBZOWBKOnxHA8g4XCDc/4bFDaqob9Q2e88+GC7cWeJ8VNkVBFpD2Xxg==} 619 630 cpu: [arm64] 620 631 os: [darwin] 621 632 622 - '@libsql/darwin-x64@0.5.13': 623 - resolution: {integrity: sha512-kzglniv1difkq8opusSXM7u9H0WoEPeKxw0ixIfcGfvlCVMJ+t9UNtXmyNHW68ljdllje6a4C6c94iPmIYafYA==} 633 + '@libsql/darwin-x64@0.5.17': 634 + resolution: {integrity: sha512-ab0RlTR4KYrxgjNrZhAhY/10GibKoq6G0W4oi0kdm+eYiAv/Ip8GDMpSaZdAcoKA4T+iKR/ehczKHnMEB8MFxA==} 624 635 cpu: [x64] 625 636 os: [darwin] 626 637 ··· 634 645 '@libsql/isomorphic-ws@0.1.5': 635 646 resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} 636 647 637 - '@libsql/linux-arm-gnueabihf@0.5.13': 638 - resolution: {integrity: sha512-UEW+VZN2r0mFkfztKOS7cqfS8IemuekbjUXbXCwULHtusww2QNCXvM5KU9eJCNE419SZCb0qaEWYytcfka8qeA==} 648 + '@libsql/linux-arm-gnueabihf@0.5.17': 649 + resolution: {integrity: sha512-PcASh4k47RqC+kMWAbLUKf1y6Do0q8vnUGi0yhKY4ghJcimMExViBimjbjYRSa+WIb/zh3QxNoXOhQAXx3tiuw==} 639 650 cpu: [arm] 640 651 os: [linux] 641 652 642 - '@libsql/linux-arm-musleabihf@0.5.13': 643 - resolution: {integrity: sha512-NMDgLqryYBv4Sr3WoO/m++XDjR5KLlw9r/JK4Ym6A1XBv2bxQQNhH0Lxx3bjLW8qqhBD4+0xfms4d2cOlexPyA==} 653 + '@libsql/linux-arm-musleabihf@0.5.17': 654 + resolution: {integrity: sha512-vxOkSLG9Wspit+SNle84nuIzMtr2G2qaxFzW7BhsZBjlZ8+kErf9RXcT2YJQdJYxmBYRbsOrc91gg0jLEQVCqg==} 644 655 cpu: [arm] 645 656 os: [linux] 646 657 647 - '@libsql/linux-arm64-gnu@0.5.13': 648 - resolution: {integrity: sha512-/wCxVdrwl1ee6D6LEjwl+w4SxuLm5UL9Kb1LD5n0bBGs0q+49ChdPPh7tp175iRgkcrTgl23emymvt1yj3KxVQ==} 658 + '@libsql/linux-arm64-gnu@0.5.17': 659 + resolution: {integrity: sha512-L8jnaN01TxjBJlDuDTX2W2BKzBkAOhcnKfCOf3xzvvygblxnDOK0whkYwIXeTfwtd/rr4jN/d6dZD/bcHiDxEQ==} 649 660 cpu: [arm64] 650 661 os: [linux] 651 662 652 - '@libsql/linux-arm64-musl@0.5.13': 653 - resolution: {integrity: sha512-xnVAbZIanUgX57XqeI5sNaDnVilp0Di5syCLSEo+bRyBobe/1IAeehNZpyVbCy91U2N6rH1C/mZU7jicVI9x+A==} 663 + '@libsql/linux-arm64-musl@0.5.17': 664 + resolution: {integrity: sha512-HfFD7TzQtmmTwyQsuiHhWZdMRtdNpKJ1p4tbMMTMRECk+971NFHrj69D64cc2ClVTAmn7fA9XibKPil7WN/Q7w==} 654 665 cpu: [arm64] 655 666 os: [linux] 656 667 657 - '@libsql/linux-x64-gnu@0.5.13': 658 - resolution: {integrity: sha512-/mfMRxcQAI9f8t7tU3QZyh25lXgXKzgin9B9TOSnchD73PWtsVhlyfA6qOCfjQl5kr4sHscdXD5Yb3KIoUgrpQ==} 668 + '@libsql/linux-x64-gnu@0.5.17': 669 + resolution: {integrity: sha512-5l3XxWqUPVFrtX0xnZaXwqsXs0BFbP4w6ahRFTPSdXU50YBfUOajFznJRB6bJTMsCvraDSD0IkHhjSNfrE1CuQ==} 659 670 cpu: [x64] 660 671 os: [linux] 661 672 662 - '@libsql/linux-x64-musl@0.5.13': 663 - resolution: {integrity: sha512-rdefPTpQCVwUjIQYbDLMv3qpd5MdrT0IeD0UZPGqhT9AWU8nJSQoj2lfyIDAWEz7PPOVCY4jHuEn7FS2sw9kRA==} 673 + '@libsql/linux-x64-musl@0.5.17': 674 + resolution: {integrity: sha512-FvSpWlwc+dIeYIFYlsSv+UdQ/NiZWr+SstwVji+QZ//8NnvzwWQU9cgP+Vpps6Qiq4jyYQm9chJhTYOVT9Y3BA==} 664 675 cpu: [x64] 665 676 os: [linux] 666 677 667 - '@libsql/win32-x64-msvc@0.5.13': 668 - resolution: {integrity: sha512-aNcmDrD1Ws+dNZIv9ECbxBQumqB9MlSVEykwfXJpqv/593nABb8Ttg5nAGUPtnADyaGDTrGvPPP81d/KsKho4Q==} 678 + '@libsql/win32-x64-msvc@0.5.17': 679 + resolution: {integrity: sha512-f5bGH8+3A5sn6Lrqg8FsQ09a1pYXPnKGXGTFiAYlfQXVst1tUTxDTugnuWcJYKXyzDe/T7ccxyIZXeSmPOhq8A==} 669 680 cpu: [x64] 670 681 os: [win32] 671 682 672 683 '@neon-rs/load@0.0.4': 673 684 resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} 685 + 686 + '@noble/secp256k1@2.3.0': 687 + resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==} 674 688 675 689 '@nodelib/fs.scandir@2.1.5': 676 690 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} ··· 687 701 '@phosphor-icons/core@2.1.1': 688 702 resolution: {integrity: sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==} 689 703 690 - '@pkgr/core@0.2.7': 691 - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} 704 + '@pkgr/core@0.2.9': 705 + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} 692 706 engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 693 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 + 694 813 '@rtsao/scc@1.1.0': 695 814 resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 696 815 697 - '@scalar/code-highlight@0.1.5': 698 - resolution: {integrity: sha512-gFTorMvDq91IKf0cV17+UvgGsBichGURsS3qBEo72ihc4yUX207/AT2Obm6kT+ckkIYvXydD6MPapk9rEnCPuA==} 816 + '@scalar/code-highlight@0.1.9': 817 + resolution: {integrity: sha512-WUUVDd1Wk7QJVKWXl/Zdn/VINc2pc1NlWW8VJFYZRm3/hKJwBhi0on7+HjVQNKgUaRy7+zluru5Ckl1gcTHHEg==} 699 818 engines: {node: '>=20'} 700 819 701 - '@scalar/components@0.14.16': 702 - resolution: {integrity: sha512-JcF8r93isL+rdTpCccPM8BEdIO17ERTkjNBVviqGHmQ57jXX8c2v1/1HtOz9qez5fE8uEEUJ3KJXUgskeLdWmQ==} 820 + '@scalar/components@0.14.25': 821 + resolution: {integrity: sha512-1lYVHa+9QVawEipFSBA/H9ROJJLijcAQ/kaFuTkJnZMS5DZ8aRB423TxVApJNSlMm96f8KGzIwS7Fq3sNYsXJg==} 703 822 engines: {node: '>=20'} 704 823 705 - '@scalar/core@0.3.7': 706 - resolution: {integrity: sha512-Qeq+DfOWxjVHFff9qx0w9gVK6FmgqJtpN3je5C3elKVXNPC/7rxG4BfAuced+SdnogaVzpb9rvvHPblMgsKrwQ==} 824 + '@scalar/core@0.3.13': 825 + resolution: {integrity: sha512-lgrueSjR1eacM39Zg0jAHikGomGAF2o2/s/5EcMz/ul7VLo/IBymw8gUjcGHZ9zd8PFGdo8DvOwFMRCiXiaDHw==} 707 826 engines: {node: '>=20'} 708 827 709 - '@scalar/helpers@0.0.6': 710 - resolution: {integrity: sha512-VrkpJmEq3zLu0lYFVRplNLA54rZ9rBkiahEI8laVpLnzGl1QilIn2EhxBT9lK7/2jbPprCbTfgnZZv+zHgGYTw==} 828 + '@scalar/helpers@0.0.8': 829 + resolution: {integrity: sha512-9A1CxL3jV7Kl9wGu86/cR/wiJN6J+3tK4WuW3252s2gF+upXsgQRx9WLhFF3xifOP1irIGusitZBiojiKmUSVg==} 711 830 engines: {node: '>=20'} 712 831 713 - '@scalar/hono-api-reference@0.9.9': 714 - resolution: {integrity: sha512-8oJ1xaYVHT3/7Go5FtcZqqsm4NkJL0Jxf3ZipXjoJcvhyiBXyQdXGNnKJVXSci2BhQMqMav6pXzkje8gq74ZAg==} 832 + '@scalar/hono-api-reference@0.9.15': 833 + resolution: {integrity: sha512-Lx/ity79xA3pdp624ikccDwvlY30M79e/1jvl/LjPDToc0byMr2tUVyHbmMhuaX8PVPlUKkdO97XGw0+M5IZJg==} 715 834 engines: {node: '>=20'} 716 835 peerDependencies: 717 836 hono: ^4.0.0 718 837 719 - '@scalar/icons@0.4.6': 720 - resolution: {integrity: sha512-ho9ee29Ik+Jv17bSaQEXvGn1e2ydNEyc7Sv8A8hqPq084aIOiTBtVFISPPt+k/O6z0SIRayfL8FEZqr93GyZPg==} 838 + '@scalar/icons@0.4.7': 839 + resolution: {integrity: sha512-0qXPGRdZ180TMfejWCPYy7ILszBrAraq4KBhPtcM12ghc5qkncFWWpTm5yXI/vrbm10t7wvtTK08CLZ36CnXlQ==} 721 840 engines: {node: '>=20'} 722 841 723 - '@scalar/json-diff@0.0.4': 724 - resolution: {integrity: sha512-4u2gtyhA119T+HdQ4dVKYzQOCOos5Iaj08C1H2Hi6WW64sTNJaZuh9hpVtY94e0I9feRiCyNEtWvmbOjOAxbTw==} 842 + '@scalar/json-magic@0.3.0': 843 + resolution: {integrity: sha512-RmX6tIsV76xHioQWVTB1By85+7tbBkKFFbMn3p+1s5PrPiK/U20AAv9OUTt6f5U5fjaTSuaQNVyyhn5SYjtBQQ==} 725 844 engines: {node: '>=20'} 726 845 727 - '@scalar/oas-utils@0.4.11': 728 - resolution: {integrity: sha512-ptekTIpxCczQxP3iXtSpDWEf0nV0nsYJh/b0/wD3krfw6hUAGVqctRTnOuZBQmiVfVeP47NsVavdpG1fiWuZ5Q==} 846 + '@scalar/oas-utils@0.4.20': 847 + resolution: {integrity: sha512-zr7WLN6s6OLH+/BitInXOQxGOAr4ZDcIrQi6RFFc+U7F26rmhvhAN0qZXv8ew8SPnWyugH2PGjxZg0IgLs7+lQ==} 729 848 engines: {node: '>=20'} 730 849 731 - '@scalar/object-utils@1.2.2': 732 - resolution: {integrity: sha512-dnH/JeXLudjBfEISpYvnMrH3bLjpc06vWVx7UQmtNNWIIonJ+bDMg1ATnYon7q6m+V8aJZ9/To8SwYsunYRL9g==} 850 + '@scalar/object-utils@1.2.4': 851 + resolution: {integrity: sha512-lX/+9Sp6euZvbsikGRZiHwmfbLd0oTLTttKbJF9v2EkahSrQUT0WF835Ct2N0R8xSkyQauDhT2xCfuA0QNqDeA==} 733 852 engines: {node: '>=20'} 734 853 735 - '@scalar/openapi-parser@0.18.1': 736 - resolution: {integrity: sha512-xlJRmizgAlYp+pUMVmohL1aNwEpPcwJ/FpsWZsDtIW9esddHJ3Zt5dAG1TDO/jsyDsMJg2Lz28IhNObOzIQpzg==} 854 + '@scalar/openapi-parser@0.20.0': 855 + resolution: {integrity: sha512-gsqpiDP9BuZNMx8Ma9UXapdoorIXiyAwr3qra/Zb3CsShun2KQoq20jSMJzVSTAm8HnBmNlZIQm1jSUvzDW5Tw==} 737 856 engines: {node: '>=20'} 738 857 739 - '@scalar/openapi-to-markdown@0.2.19': 740 - resolution: {integrity: sha512-o/dbYLmggUllLgVXdAMVJT4Bdxy/MPC2UFlzeJ4hoxBSgvTO1CWr6v61HIBrDn0eqId7PF1V9p+EV1RNtgz/jA==} 858 + '@scalar/openapi-to-markdown@0.2.28': 859 + resolution: {integrity: sha512-IB1P48kgLzCjVJQfkR0E2+qnnNY9uDLfYrStfZN5drhvWO/EmT7EIgGvGVj7XJHga7B9UVIL+s6CtfhUkPN0EA==} 741 860 engines: {node: '>=20'} 742 861 743 - '@scalar/openapi-types@0.3.5': 744 - resolution: {integrity: sha512-/iTUSJMMHVMIFJngeIjTVtU5lwIMNyEIm25e0XtDV0veW6zmIhLsaH2/nwpIgR1iXVyd/uWMyMrtQW329s3c4w==} 862 + '@scalar/openapi-types@0.3.7': 863 + resolution: {integrity: sha512-QHSvHBVDze3+dUwAhIGq6l1iOev4jdoqdBK7QpfeN1Q4h+6qpVEw3EEqBiH0AXUSh/iWwObBv4uMgfIx0aNZ5g==} 745 864 engines: {node: '>=20'} 746 865 747 - '@scalar/snippetz@0.4.0': 748 - resolution: {integrity: sha512-smfJ0UiXsHmPOk6k+oAdShAIwZ7LTgK23l/ecTUQVYg0ub4yIadWFqo3cqjpZJ1zF88LLIfiHcthe2iQ1LHzXw==} 866 + '@scalar/snippetz@0.4.5': 867 + resolution: {integrity: sha512-Pp4EDn5BAA1b/srgm6b7iD23UwzQISdQOh+Ai3gTWFePZlMHNuQBAiaqgDyINs1YUAgkBP+VDLBVlWMCjWC93A==} 749 868 engines: {node: '>=20'} 750 869 751 - '@scalar/themes@0.13.8': 752 - resolution: {integrity: sha512-qWAOFpLYEVVkQnHFb5js6njFLHwwXVVRC06edthBTtUvaL8HOQexg6bXp2uksCFStm1bb1VYy9UOp8EqEnfN5Q==} 870 + '@scalar/themes@0.13.13': 871 + resolution: {integrity: sha512-H67wm2Wfds6f+ygb/1qHWaKdieJdU8aGsU8qjGQamYPQriz6m6gr/AYNAc8B73I04ZXLswzJ6Doj/JcounPKZA==} 753 872 engines: {node: '>=20'} 754 873 755 - '@scalar/types@0.2.7': 756 - resolution: {integrity: sha512-C4sbkqzCeQWYWaOUIQPdVm6g3FhUkcqpVorArApv7WfCEgVn1KLOOYELFMWwCHim2GnrZblVVUPubf0UXjUcLA==} 874 + '@scalar/types@0.2.12': 875 + resolution: {integrity: sha512-CW7jS+gpc3lZdjf+888++I9HtsGCk6zbh4lZscY8spcg/dlXXd3ReYicxee/cx+soDjU1d/Pcqj9o/QqvTFYxQ==} 757 876 engines: {node: '>=20'} 758 877 759 878 '@scalar/use-hooks@0.2.4': ··· 764 883 resolution: {integrity: sha512-u+o77cdTNZ5ePqHPu8ZcFw1BLlISv+cthN0bR1zJHXmqBjvanFTy2kL+Gmv3eW9HxZiHdqycKVETlYd0mWiqJQ==} 765 884 engines: {node: '>=20'} 766 885 767 - '@scalar/workspace-store@0.8.0': 768 - resolution: {integrity: sha512-HFtXNCU/qfY08cXhdd5UhnGbrWS6w6w9RAnNql4O3J0P/MiotMIZiUreCfGbiCVOXCj59ClzeOJIhA8R59Z2OA==} 886 + '@scalar/workspace-store@0.14.0': 887 + resolution: {integrity: sha512-60gY3e3vsPn2ue1kMt4SlAM5mBZHObi0tGVZWYxwkXxvaKik2HaEpHQWZov7F6ZullCy1ECXNThzVE63zjqw9g==} 769 888 engines: {node: '>=18'} 770 889 771 - '@sinclair/typebox@0.34.37': 772 - 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 773 893 774 - '@skyware/jetstream@0.2.4': 775 - resolution: {integrity: sha512-QA94YMamBnULAHhDLX3DdvDaEkGEIzEmMmN2NPr+J2xKQ/D9NczOe50kBaGmOST4E19w8CR12/y6ykWNOMlE+Q==} 894 + '@skyware/jetstream@0.2.5': 895 + resolution: {integrity: sha512-fM/zs03DLwqRyzZZJFWN20e76KrdqIp97Tlm8Cek+vxn96+tu5d/fx79V6H85L0QN6HvGiX2l9A8hWFqHvYlOA==} 776 896 777 897 '@swc/helpers@0.5.17': 778 898 resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} ··· 785 905 peerDependencies: 786 906 vue: ^2.7.0 || ^3.0.0 787 907 908 + '@types/chai@5.2.2': 909 + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 910 + 788 911 '@types/debug@4.1.12': 789 912 resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 913 + 914 + '@types/deep-eql@4.0.2': 915 + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 790 916 791 917 '@types/estree@1.0.8': 792 918 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} ··· 809 935 '@types/ms@2.1.0': 810 936 resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 811 937 812 - '@types/node@22.16.2': 813 - resolution: {integrity: sha512-Cdqa/eJTvt4fC4wmq1Mcc0CPUjp/Qy2FGqLza3z3pKymsI969TcZ54diNJv8UYUgeWxyb8FSbCkhdR6WqmUFhA==} 938 + '@types/node@22.17.2': 939 + resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} 814 940 815 - '@types/node@24.0.12': 816 - resolution: {integrity: sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g==} 941 + '@types/node@24.3.0': 942 + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} 817 943 818 944 '@types/triple-beam@1.3.5': 819 945 resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} ··· 827 953 '@types/ws@8.18.1': 828 954 resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} 829 955 830 - '@typescript-eslint/eslint-plugin@8.36.0': 831 - resolution: {integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==} 956 + '@typescript-eslint/eslint-plugin@8.40.0': 957 + resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} 832 958 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 833 959 peerDependencies: 834 - '@typescript-eslint/parser': ^8.36.0 960 + '@typescript-eslint/parser': ^8.40.0 835 961 eslint: ^8.57.0 || ^9.0.0 836 - typescript: '>=4.8.4 <5.9.0' 962 + typescript: '>=4.8.4 <6.0.0' 837 963 838 - '@typescript-eslint/parser@8.36.0': 839 - resolution: {integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==} 964 + '@typescript-eslint/parser@8.40.0': 965 + resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} 840 966 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 841 967 peerDependencies: 842 968 eslint: ^8.57.0 || ^9.0.0 843 - typescript: '>=4.8.4 <5.9.0' 969 + typescript: '>=4.8.4 <6.0.0' 844 970 845 - '@typescript-eslint/project-service@8.36.0': 846 - resolution: {integrity: sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==} 971 + '@typescript-eslint/project-service@8.40.0': 972 + resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} 847 973 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 848 974 peerDependencies: 849 - typescript: '>=4.8.4 <5.9.0' 975 + typescript: '>=4.8.4 <6.0.0' 850 976 851 - '@typescript-eslint/scope-manager@8.36.0': 852 - resolution: {integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==} 977 + '@typescript-eslint/scope-manager@8.40.0': 978 + resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} 853 979 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 854 980 855 - '@typescript-eslint/tsconfig-utils@8.36.0': 856 - resolution: {integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==} 981 + '@typescript-eslint/tsconfig-utils@8.40.0': 982 + resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} 857 983 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 858 984 peerDependencies: 859 - typescript: '>=4.8.4 <5.9.0' 985 + typescript: '>=4.8.4 <6.0.0' 860 986 861 - '@typescript-eslint/type-utils@8.36.0': 862 - resolution: {integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==} 987 + '@typescript-eslint/type-utils@8.40.0': 988 + resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} 863 989 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 864 990 peerDependencies: 865 991 eslint: ^8.57.0 || ^9.0.0 866 - typescript: '>=4.8.4 <5.9.0' 992 + typescript: '>=4.8.4 <6.0.0' 867 993 868 - '@typescript-eslint/types@8.36.0': 869 - resolution: {integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==} 994 + '@typescript-eslint/types@8.40.0': 995 + resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} 870 996 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 871 997 872 - '@typescript-eslint/typescript-estree@8.36.0': 873 - resolution: {integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==} 998 + '@typescript-eslint/typescript-estree@8.40.0': 999 + resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} 874 1000 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 875 1001 peerDependencies: 876 - typescript: '>=4.8.4 <5.9.0' 1002 + typescript: '>=4.8.4 <6.0.0' 877 1003 878 - '@typescript-eslint/utils@8.36.0': 879 - resolution: {integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==} 1004 + '@typescript-eslint/utils@8.40.0': 1005 + resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} 880 1006 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 881 1007 peerDependencies: 882 1008 eslint: ^8.57.0 || ^9.0.0 883 - typescript: '>=4.8.4 <5.9.0' 1009 + typescript: '>=4.8.4 <6.0.0' 884 1010 885 - '@typescript-eslint/visitor-keys@8.36.0': 886 - resolution: {integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==} 1011 + '@typescript-eslint/visitor-keys@8.40.0': 1012 + resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} 887 1013 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 888 1014 889 1015 '@ungap/structured-clone@1.3.0': 890 1016 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 891 1017 892 - '@vue/compiler-core@3.5.17': 893 - resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} 1018 + '@vitest/expect@3.2.4': 1019 + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} 894 1020 895 - '@vue/compiler-dom@3.5.17': 896 - resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} 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 897 1031 898 - '@vue/compiler-sfc@3.5.17': 899 - resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} 1032 + '@vitest/pretty-format@3.2.4': 1033 + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} 900 1034 901 - '@vue/compiler-ssr@3.5.17': 902 - resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} 1035 + '@vitest/runner@3.2.4': 1036 + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} 903 1037 904 - '@vue/reactivity@3.5.17': 905 - resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} 1038 + '@vitest/snapshot@3.2.4': 1039 + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} 906 1040 907 - '@vue/runtime-core@3.5.17': 908 - resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} 1041 + '@vitest/spy@3.2.4': 1042 + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} 909 1043 910 - '@vue/runtime-dom@3.5.17': 911 - resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} 1044 + '@vitest/utils@3.2.4': 1045 + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} 912 1046 913 - '@vue/server-renderer@3.5.17': 914 - resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} 1047 + '@vue/compiler-core@3.5.19': 1048 + resolution: {integrity: sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==} 1049 + 1050 + '@vue/compiler-dom@3.5.19': 1051 + resolution: {integrity: sha512-Drs6rPHQZx/pN9S6ml3Z3K/TWCIRPvzG2B/o5kFK9X0MNHt8/E+38tiRfojufrYBfA6FQUFB2qBBRXlcSXWtOA==} 1052 + 1053 + '@vue/compiler-sfc@3.5.19': 1054 + resolution: {integrity: sha512-YWCm1CYaJ+2RvNmhCwI7t3I3nU+hOrWGWMsn+Z/kmm1jy5iinnVtlmkiZwbLlbV1SRizX7vHsc0/bG5dj0zRTg==} 1055 + 1056 + '@vue/compiler-ssr@3.5.19': 1057 + resolution: {integrity: sha512-/wx0VZtkWOPdiQLWPeQeqpHWR/LuNC7bHfSX7OayBTtUy8wur6vT6EQIX6Et86aED6J+y8tTw43qo2uoqGg5sw==} 1058 + 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==} 1064 + 1065 + '@vue/runtime-dom@3.5.19': 1066 + resolution: {integrity: sha512-qmahqeok6ztuUTmV8lqd7N9ymbBzctNF885n8gL3xdCC1u2RnM/coX16Via0AiONQXUoYpxPojL3U1IsDgSWUQ==} 1067 + 1068 + '@vue/server-renderer@3.5.19': 1069 + resolution: {integrity: sha512-ZJ/zV9SQuaIO+BEEVq/2a6fipyrSYfjKMU3267bPUk+oTx/hZq3RzV7VCh0Unlppt39Bvh6+NzxeopIFv4HJNg==} 915 1070 peerDependencies: 916 - vue: 3.5.17 1071 + vue: 3.5.19 917 1072 918 - '@vue/shared@3.5.17': 919 - resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} 1073 + '@vue/shared@3.5.19': 1074 + resolution: {integrity: sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==} 920 1075 921 1076 '@vueuse/core@10.11.1': 922 1077 resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} 1078 + 1079 + '@vueuse/core@11.3.0': 1080 + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} 923 1081 924 1082 '@vueuse/metadata@10.11.1': 925 1083 resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} 926 1084 1085 + '@vueuse/metadata@11.3.0': 1086 + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} 1087 + 927 1088 '@vueuse/shared@10.11.1': 928 1089 resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} 1090 + 1091 + '@vueuse/shared@11.3.0': 1092 + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} 929 1093 930 1094 acorn-jsx@5.3.2: 931 1095 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} ··· 994 1158 resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 995 1159 engines: {node: '>= 0.4'} 996 1160 1161 + assertion-error@2.0.1: 1162 + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 1163 + engines: {node: '>=12'} 1164 + 997 1165 async-function@1.0.0: 998 1166 resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 999 1167 engines: {node: '>= 0.4'} ··· 1027 1195 bun-types@1.2.17: 1028 1196 resolution: {integrity: sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ==} 1029 1197 1198 + cac@6.7.14: 1199 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1200 + engines: {node: '>=8'} 1201 + 1030 1202 call-bind-apply-helpers@1.0.2: 1031 1203 resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 1032 1204 engines: {node: '>= 0.4'} ··· 1049 1221 ccount@2.0.1: 1050 1222 resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 1051 1223 1224 + chai@5.3.3: 1225 + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} 1226 + engines: {node: '>=18'} 1227 + 1052 1228 chalk@4.1.2: 1053 1229 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1054 1230 engines: {node: '>=10'} 1055 1231 1056 - chalk@5.4.1: 1057 - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 1232 + chalk@5.6.0: 1233 + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} 1058 1234 engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 1059 1235 1060 1236 character-entities-html4@2.1.0: ··· 1066 1242 character-entities@2.0.2: 1067 1243 resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 1068 1244 1245 + check-error@2.1.1: 1246 + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1247 + engines: {node: '>= 16'} 1248 + 1069 1249 clean-css@5.3.3: 1070 1250 resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} 1071 1251 engines: {node: '>= 10.0'} ··· 1170 1350 decode-named-character-reference@1.2.0: 1171 1351 resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} 1172 1352 1353 + deep-eql@5.0.2: 1354 + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 1355 + engines: {node: '>=6'} 1356 + 1173 1357 deep-is@0.1.4: 1174 1358 resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1175 1359 ··· 1206 1390 resolution: {integrity: sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA==} 1207 1391 hasBin: true 1208 1392 1209 - drizzle-orm@0.44.2: 1210 - resolution: {integrity: sha512-zGAqBzWWkVSFjZpwPOrmCrgO++1kZ5H/rZ4qTGeGOe18iXGVJWf3WPfHOVwFIbmi8kHjfJstC6rJomzGx8g/dQ==} 1393 + drizzle-orm@0.44.4: 1394 + resolution: {integrity: sha512-ZyzKFpTC/Ut3fIqc2c0dPZ6nhchQXriTsqTNs4ayRgl6sZcFlMs9QZKPSHXK4bdOf41GHGWf+FrpcDDYwW+W6Q==} 1211 1395 peerDependencies: 1212 1396 '@aws-sdk/client-rds-data': '>=3' 1213 1397 '@cloudflare/workers-types': '>=4' ··· 1325 1509 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 1326 1510 engines: {node: '>= 0.4'} 1327 1511 1512 + es-module-lexer@1.7.0: 1513 + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 1514 + 1328 1515 es-object-atoms@1.1.1: 1329 1516 resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 1330 1517 engines: {node: '>= 0.4'} ··· 1351 1538 engines: {node: '>=12'} 1352 1539 hasBin: true 1353 1540 1354 - esbuild@0.25.6: 1355 - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} 1541 + esbuild@0.25.9: 1542 + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} 1356 1543 engines: {node: '>=18'} 1357 1544 hasBin: true 1358 1545 ··· 1364 1551 resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 1365 1552 engines: {node: '>=12'} 1366 1553 1367 - eslint-config-prettier@10.1.5: 1368 - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} 1554 + eslint-config-prettier@10.1.8: 1555 + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} 1369 1556 hasBin: true 1370 1557 peerDependencies: 1371 1558 eslint: '>=7.0.0' ··· 1409 1596 '@typescript-eslint/parser': 1410 1597 optional: true 1411 1598 1412 - eslint-plugin-prettier@5.5.1: 1413 - resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} 1599 + eslint-plugin-prettier@5.5.4: 1600 + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} 1414 1601 engines: {node: ^14.18.0 || >=16.0.0} 1415 1602 peerDependencies: 1416 1603 '@types/eslint': '>=8.0.0' ··· 1435 1622 resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 1436 1623 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1437 1624 1438 - eslint@9.30.1: 1439 - resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} 1625 + eslint@9.33.0: 1626 + resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} 1440 1627 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1441 1628 hasBin: true 1442 1629 peerDependencies: ··· 1467 1654 estree-walker@2.0.2: 1468 1655 resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1469 1656 1657 + estree-walker@3.0.3: 1658 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1659 + 1470 1660 esutils@2.0.3: 1471 1661 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1472 1662 engines: {node: '>=0.10.0'} 1473 1663 1474 1664 event-target-polyfill@0.0.4: 1475 1665 resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} 1666 + 1667 + expect-type@1.2.2: 1668 + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 1669 + engines: {node: '>=12.0.0'} 1476 1670 1477 1671 extend@3.0.2: 1478 1672 resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} ··· 1498 1692 1499 1693 fastq@1.19.1: 1500 1694 resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 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 1501 1704 1502 1705 fecha@4.2.3: 1503 1706 resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} ··· 1691 1894 highlightjs-vue@1.0.0: 1692 1895 resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} 1693 1896 1694 - hono@4.8.4: 1695 - resolution: {integrity: sha512-KOIBp1+iUs0HrKztM4EHiB2UtzZDTBihDtOF5K6+WaJjCPeaW4Q92R8j63jOhvJI5+tZSMuKD9REVEXXY9illg==} 1897 + hono@4.9.4: 1898 + resolution: {integrity: sha512-61hl6MF6ojTl/8QSRu5ran6GXt+6zsngIUN95KzF5v5UjiX/xnrLR358BNRawwIRO49JwUqJqQe3Rb2v559R8Q==} 1696 1899 engines: {node: '>=16.9.0'} 1697 1900 1698 1901 html-minifier-terser@7.2.0: ··· 1858 2061 isexe@2.0.0: 1859 2062 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1860 2063 1861 - jiti@2.4.2: 1862 - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 2064 + jiti@2.5.1: 2065 + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} 1863 2066 hasBin: true 1864 2067 1865 - js-base64@3.7.7: 1866 - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} 2068 + js-base64@3.7.8: 2069 + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} 2070 + 2071 + js-tokens@9.0.1: 2072 + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 1867 2073 1868 2074 js-yaml@4.1.0: 1869 2075 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} ··· 1913 2119 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1914 2120 engines: {node: '>= 0.8.0'} 1915 2121 1916 - libsql@0.5.13: 1917 - resolution: {integrity: sha512-5Bwoa/CqzgkTwySgqHA5TsaUDRrdLIbdM4egdPcaAnqO3aC+qAgS6BwdzuZwARA5digXwiskogZ8H7Yy4XfdOg==} 2122 + libsql@0.5.17: 2123 + resolution: {integrity: sha512-RRlj5XQI9+Wq+/5UY8EnugSWfRmHEw4hn3DKlPrkUgZONsge1PwTtHcpStP6MSNi8ohcbsRgEHJaymA33a8cBw==} 1918 2124 cpu: [x64, arm64, wasm32, arm] 1919 2125 os: [darwin, linux, win32] 1920 2126 ··· 1932 2138 longest-streak@3.1.0: 1933 2139 resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 1934 2140 2141 + loupe@3.2.1: 2142 + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} 2143 + 1935 2144 lower-case@2.0.2: 1936 2145 resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1937 2146 1938 2147 lowlight@3.3.0: 1939 2148 resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} 1940 2149 1941 - magic-string@0.30.17: 1942 - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 2150 + magic-string@0.30.18: 2151 + resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} 1943 2152 1944 2153 markdown-table@3.0.4: 1945 2154 resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} ··· 2173 2382 parse5@7.3.0: 2174 2383 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 2175 2384 2176 - partysocket@1.1.4: 2177 - resolution: {integrity: sha512-jXP7PFj2h5/v4UjDS8P7MZy6NJUQ7sspiFyxL4uc/+oKOL+KdtXzHnTV8INPGxBrLTXgalyG3kd12Qm7WrYc3A==} 2385 + partysocket@1.1.5: 2386 + resolution: {integrity: sha512-8uw9foq9bij4sKLCtTSHvyqMrMTQ5FJjrHc7BjoM2s95Vu7xYCN63ABpI7OZHC7ZMP5xaom/A+SsoFPXmTV6ZQ==} 2178 2387 2179 2388 pascal-case@3.1.2: 2180 2389 resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} ··· 2190 2399 path-parse@1.0.7: 2191 2400 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2192 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 + 2193 2409 picocolors@1.1.1: 2194 2410 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 2195 2411 2196 2412 picomatch@2.3.1: 2197 2413 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2198 2414 engines: {node: '>=8.6'} 2415 + 2416 + picomatch@4.0.3: 2417 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 2418 + engines: {node: '>=12'} 2199 2419 2200 2420 possible-typed-array-names@1.1.0: 2201 2421 resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} ··· 2315 2535 resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 2316 2536 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2317 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 + 2318 2543 run-parallel@1.2.0: 2319 2544 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2320 2545 ··· 2384 2609 side-channel@1.1.0: 2385 2610 resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 2386 2611 engines: {node: '>= 0.4'} 2612 + 2613 + siginfo@2.0.0: 2614 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2387 2615 2388 2616 simple-swizzle@0.2.2: 2389 2617 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} ··· 2405 2633 stack-trace@0.0.10: 2406 2634 resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 2407 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==} 2641 + 2408 2642 stop-iteration-iterator@1.1.0: 2409 2643 resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} 2410 2644 engines: {node: '>= 0.4'} ··· 2439 2673 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2440 2674 engines: {node: '>=8'} 2441 2675 2676 + strip-literal@3.0.0: 2677 + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 2678 + 2442 2679 supports-color@7.2.0: 2443 2680 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2444 2681 engines: {node: '>=8'} ··· 2447 2684 resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2448 2685 engines: {node: '>= 0.4'} 2449 2686 2450 - synckit@0.11.8: 2451 - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 2687 + synckit@0.11.11: 2688 + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} 2452 2689 engines: {node: ^14.18.0 || >=16.0.0} 2453 2690 2454 2691 tailwind-merge@2.6.0: ··· 2465 2702 tiny-emitter@2.1.0: 2466 2703 resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} 2467 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 + 2468 2727 to-regex-range@5.0.1: 2469 2728 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2470 2729 engines: {node: '>=8.0'} ··· 2501 2760 tslib@2.8.1: 2502 2761 resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2503 2762 2504 - tsx@4.20.3: 2505 - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} 2763 + tsx@4.20.4: 2764 + resolution: {integrity: sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==} 2506 2765 engines: {node: '>=18.0.0'} 2507 2766 hasBin: true 2508 2767 ··· 2530 2789 resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 2531 2790 engines: {node: '>= 0.4'} 2532 2791 2533 - typescript-eslint@8.36.0: 2534 - resolution: {integrity: sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==} 2792 + typescript-eslint@8.40.0: 2793 + resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} 2535 2794 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2536 2795 peerDependencies: 2537 2796 eslint: ^8.57.0 || ^9.0.0 2538 - typescript: '>=4.8.4 <5.9.0' 2797 + typescript: '>=4.8.4 <6.0.0' 2539 2798 2540 - typescript@5.8.3: 2541 - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 2799 + typescript@5.9.2: 2800 + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 2542 2801 engines: {node: '>=14.17'} 2543 2802 hasBin: true 2544 2803 ··· 2549 2808 undici-types@6.21.0: 2550 2809 resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 2551 2810 2552 - undici-types@7.8.0: 2553 - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} 2811 + undici-types@7.10.0: 2812 + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} 2554 2813 2555 2814 unified@11.0.5: 2556 2815 resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} ··· 2586 2845 vfile-location@5.0.3: 2587 2846 resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 2588 2847 2589 - vfile-message@4.0.2: 2590 - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 2848 + vfile-message@4.0.3: 2849 + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} 2591 2850 2592 2851 vfile@6.0.3: 2593 2852 resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 2594 2853 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==} 2929 + 2595 2930 vue-demi@0.14.10: 2596 2931 resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} 2597 2932 engines: {node: '>=12'} ··· 2606 2941 vue-sonner@1.3.2: 2607 2942 resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} 2608 2943 2609 - vue@3.5.17: 2610 - resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} 2944 + vue@3.5.19: 2945 + resolution: {integrity: sha512-ZRh0HTmw6KChRYWgN8Ox/wi7VhpuGlvMPrHjIsdRbzKNgECFLzy+dKL5z9yGaBSjCpmcfJCbh3I1tNSRmBz2tg==} 2611 2946 peerDependencies: 2612 2947 typescript: '*' 2613 2948 peerDependenciesMeta: ··· 2642 2977 engines: {node: '>= 8'} 2643 2978 hasBin: true 2644 2979 2980 + why-is-node-running@2.3.0: 2981 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 2982 + engines: {node: '>=8'} 2983 + hasBin: true 2984 + 2645 2985 winston-transport@4.9.0: 2646 2986 resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} 2647 2987 engines: {node: '>= 12.0.0'} ··· 2686 3026 2687 3027 snapshots: 2688 3028 2689 - '@atcute/atproto@3.1.0': 3029 + '@atcute/atproto@3.1.2': 2690 3030 dependencies: 2691 - '@atcute/lexicons': 1.1.0 3031 + '@atcute/lexicons': 1.1.1 2692 3032 2693 - '@atcute/bluesky@3.1.4': 3033 + '@atcute/bluesky@3.2.1': 2694 3034 dependencies: 2695 - '@atcute/atproto': 3.1.0 2696 - '@atcute/lexicons': 1.1.0 3035 + '@atcute/atproto': 3.1.2 3036 + '@atcute/lexicons': 1.1.1 2697 3037 2698 3038 '@atcute/client@4.0.3': 2699 3039 dependencies: 2700 3040 '@atcute/identity': 1.0.3 2701 - '@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 2702 3048 2703 3049 '@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)': 2704 3050 dependencies: 2705 3051 '@atcute/identity': 1.0.3 2706 - '@atcute/lexicons': 1.1.0 3052 + '@atcute/lexicons': 1.1.1 2707 3053 '@atcute/util-fetch': 1.0.1 2708 - '@badrap/valita': 0.4.5 3054 + '@badrap/valita': 0.4.6 2709 3055 2710 3056 '@atcute/identity@1.0.3': 2711 3057 dependencies: 2712 - '@atcute/lexicons': 1.1.0 2713 - '@badrap/valita': 0.4.5 3058 + '@atcute/lexicons': 1.1.1 3059 + '@badrap/valita': 0.4.6 2714 3060 2715 3061 '@atcute/lex-cli@2.1.1': 2716 3062 dependencies: 2717 3063 '@atcute/lexicon-doc': 1.0.3 2718 - '@badrap/valita': 0.4.5 2719 - '@externdefs/collider': 0.3.0(@badrap/valita@0.4.5) 3064 + '@badrap/valita': 0.4.6 3065 + '@externdefs/collider': 0.3.0(@badrap/valita@0.4.6) 2720 3066 picocolors: 1.1.1 2721 3067 prettier: 3.6.2 2722 3068 2723 3069 '@atcute/lexicon-doc@1.0.3': 2724 3070 dependencies: 2725 - '@badrap/valita': 0.4.5 3071 + '@badrap/valita': 0.4.6 2726 3072 2727 - '@atcute/lexicons@1.1.0': 3073 + '@atcute/lexicons@1.1.1': 2728 3074 dependencies: 2729 3075 esm-env: 1.2.2 2730 3076 3077 + '@atcute/multibase@1.1.5': 3078 + dependencies: 3079 + '@atcute/uint8array': 1.0.4 3080 + 3081 + '@atcute/uint8array@1.0.4': {} 3082 + 2731 3083 '@atcute/util-fetch@1.0.1': 2732 3084 dependencies: 2733 - '@badrap/valita': 0.4.5 3085 + '@badrap/valita': 0.4.6 2734 3086 2735 3087 '@babel/helper-string-parser@7.27.1': {} 2736 3088 2737 3089 '@babel/helper-validator-identifier@7.27.1': {} 2738 3090 2739 - '@babel/parser@7.28.0': 3091 + '@babel/parser@7.28.3': 2740 3092 dependencies: 2741 - '@babel/types': 7.28.0 3093 + '@babel/types': 7.28.2 2742 3094 2743 - '@babel/types@7.28.0': 3095 + '@babel/types@7.28.2': 2744 3096 dependencies: 2745 3097 '@babel/helper-string-parser': 7.27.1 2746 3098 '@babel/helper-validator-identifier': 7.27.1 2747 3099 2748 - '@badrap/valita@0.4.5': {} 3100 + '@badrap/valita@0.4.6': {} 2749 3101 2750 - '@clipprjs/lexicons@0.1.4': 3102 + '@clipprjs/lexicons@1.0.3': 2751 3103 dependencies: 2752 - '@atcute/atproto': 3.1.0 2753 - '@atcute/lexicons': 1.1.0 3104 + '@atcute/atproto': 3.1.2 3105 + '@atcute/lexicons': 1.1.1 2754 3106 2755 3107 '@colors/colors@1.6.0': {} 2756 3108 ··· 2772 3124 '@esbuild-kit/core-utils': 3.3.2 2773 3125 get-tsconfig: 4.10.1 2774 3126 2775 - '@esbuild/aix-ppc64@0.25.6': 3127 + '@esbuild/aix-ppc64@0.25.9': 2776 3128 optional: true 2777 3129 2778 3130 '@esbuild/android-arm64@0.18.20': 2779 3131 optional: true 2780 3132 2781 - '@esbuild/android-arm64@0.25.6': 3133 + '@esbuild/android-arm64@0.25.9': 2782 3134 optional: true 2783 3135 2784 3136 '@esbuild/android-arm@0.18.20': 2785 3137 optional: true 2786 3138 2787 - '@esbuild/android-arm@0.25.6': 3139 + '@esbuild/android-arm@0.25.9': 2788 3140 optional: true 2789 3141 2790 3142 '@esbuild/android-x64@0.18.20': 2791 3143 optional: true 2792 3144 2793 - '@esbuild/android-x64@0.25.6': 3145 + '@esbuild/android-x64@0.25.9': 2794 3146 optional: true 2795 3147 2796 3148 '@esbuild/darwin-arm64@0.18.20': 2797 3149 optional: true 2798 3150 2799 - '@esbuild/darwin-arm64@0.25.6': 3151 + '@esbuild/darwin-arm64@0.25.9': 2800 3152 optional: true 2801 3153 2802 3154 '@esbuild/darwin-x64@0.18.20': 2803 3155 optional: true 2804 3156 2805 - '@esbuild/darwin-x64@0.25.6': 3157 + '@esbuild/darwin-x64@0.25.9': 2806 3158 optional: true 2807 3159 2808 3160 '@esbuild/freebsd-arm64@0.18.20': 2809 3161 optional: true 2810 3162 2811 - '@esbuild/freebsd-arm64@0.25.6': 3163 + '@esbuild/freebsd-arm64@0.25.9': 2812 3164 optional: true 2813 3165 2814 3166 '@esbuild/freebsd-x64@0.18.20': 2815 3167 optional: true 2816 3168 2817 - '@esbuild/freebsd-x64@0.25.6': 3169 + '@esbuild/freebsd-x64@0.25.9': 2818 3170 optional: true 2819 3171 2820 3172 '@esbuild/linux-arm64@0.18.20': 2821 3173 optional: true 2822 3174 2823 - '@esbuild/linux-arm64@0.25.6': 3175 + '@esbuild/linux-arm64@0.25.9': 2824 3176 optional: true 2825 3177 2826 3178 '@esbuild/linux-arm@0.18.20': 2827 3179 optional: true 2828 3180 2829 - '@esbuild/linux-arm@0.25.6': 3181 + '@esbuild/linux-arm@0.25.9': 2830 3182 optional: true 2831 3183 2832 3184 '@esbuild/linux-ia32@0.18.20': 2833 3185 optional: true 2834 3186 2835 - '@esbuild/linux-ia32@0.25.6': 3187 + '@esbuild/linux-ia32@0.25.9': 2836 3188 optional: true 2837 3189 2838 3190 '@esbuild/linux-loong64@0.18.20': 2839 3191 optional: true 2840 3192 2841 - '@esbuild/linux-loong64@0.25.6': 3193 + '@esbuild/linux-loong64@0.25.9': 2842 3194 optional: true 2843 3195 2844 3196 '@esbuild/linux-mips64el@0.18.20': 2845 3197 optional: true 2846 3198 2847 - '@esbuild/linux-mips64el@0.25.6': 3199 + '@esbuild/linux-mips64el@0.25.9': 2848 3200 optional: true 2849 3201 2850 3202 '@esbuild/linux-ppc64@0.18.20': 2851 3203 optional: true 2852 3204 2853 - '@esbuild/linux-ppc64@0.25.6': 3205 + '@esbuild/linux-ppc64@0.25.9': 2854 3206 optional: true 2855 3207 2856 3208 '@esbuild/linux-riscv64@0.18.20': 2857 3209 optional: true 2858 3210 2859 - '@esbuild/linux-riscv64@0.25.6': 3211 + '@esbuild/linux-riscv64@0.25.9': 2860 3212 optional: true 2861 3213 2862 3214 '@esbuild/linux-s390x@0.18.20': 2863 3215 optional: true 2864 3216 2865 - '@esbuild/linux-s390x@0.25.6': 3217 + '@esbuild/linux-s390x@0.25.9': 2866 3218 optional: true 2867 3219 2868 3220 '@esbuild/linux-x64@0.18.20': 2869 3221 optional: true 2870 3222 2871 - '@esbuild/linux-x64@0.25.6': 3223 + '@esbuild/linux-x64@0.25.9': 2872 3224 optional: true 2873 3225 2874 - '@esbuild/netbsd-arm64@0.25.6': 3226 + '@esbuild/netbsd-arm64@0.25.9': 2875 3227 optional: true 2876 3228 2877 3229 '@esbuild/netbsd-x64@0.18.20': 2878 3230 optional: true 2879 3231 2880 - '@esbuild/netbsd-x64@0.25.6': 3232 + '@esbuild/netbsd-x64@0.25.9': 2881 3233 optional: true 2882 3234 2883 - '@esbuild/openbsd-arm64@0.25.6': 3235 + '@esbuild/openbsd-arm64@0.25.9': 2884 3236 optional: true 2885 3237 2886 3238 '@esbuild/openbsd-x64@0.18.20': 2887 3239 optional: true 2888 3240 2889 - '@esbuild/openbsd-x64@0.25.6': 3241 + '@esbuild/openbsd-x64@0.25.9': 2890 3242 optional: true 2891 3243 2892 - '@esbuild/openharmony-arm64@0.25.6': 3244 + '@esbuild/openharmony-arm64@0.25.9': 2893 3245 optional: true 2894 3246 2895 3247 '@esbuild/sunos-x64@0.18.20': 2896 3248 optional: true 2897 3249 2898 - '@esbuild/sunos-x64@0.25.6': 3250 + '@esbuild/sunos-x64@0.25.9': 2899 3251 optional: true 2900 3252 2901 3253 '@esbuild/win32-arm64@0.18.20': 2902 3254 optional: true 2903 3255 2904 - '@esbuild/win32-arm64@0.25.6': 3256 + '@esbuild/win32-arm64@0.25.9': 2905 3257 optional: true 2906 3258 2907 3259 '@esbuild/win32-ia32@0.18.20': 2908 3260 optional: true 2909 3261 2910 - '@esbuild/win32-ia32@0.25.6': 3262 + '@esbuild/win32-ia32@0.25.9': 2911 3263 optional: true 2912 3264 2913 3265 '@esbuild/win32-x64@0.18.20': 2914 3266 optional: true 2915 3267 2916 - '@esbuild/win32-x64@0.25.6': 3268 + '@esbuild/win32-x64@0.25.9': 2917 3269 optional: true 2918 3270 2919 - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': 3271 + '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.5.1))': 2920 3272 dependencies: 2921 - eslint: 9.30.1(jiti@2.4.2) 3273 + eslint: 9.33.0(jiti@2.5.1) 2922 3274 eslint-visitor-keys: 3.4.3 2923 3275 2924 3276 '@eslint-community/regexpp@4.12.1': {} ··· 2931 3283 transitivePeerDependencies: 2932 3284 - supports-color 2933 3285 2934 - '@eslint/config-helpers@0.3.0': {} 2935 - 2936 - '@eslint/core@0.14.0': 2937 - dependencies: 2938 - '@types/json-schema': 7.0.15 3286 + '@eslint/config-helpers@0.3.1': {} 2939 3287 2940 - '@eslint/core@0.15.1': 3288 + '@eslint/core@0.15.2': 2941 3289 dependencies: 2942 3290 '@types/json-schema': 7.0.15 2943 3291 ··· 2955 3303 transitivePeerDependencies: 2956 3304 - supports-color 2957 3305 2958 - '@eslint/js@9.30.1': {} 3306 + '@eslint/js@9.33.0': {} 2959 3307 2960 3308 '@eslint/object-schema@2.1.6': {} 2961 3309 2962 - '@eslint/plugin-kit@0.3.3': 3310 + '@eslint/plugin-kit@0.3.5': 2963 3311 dependencies: 2964 - '@eslint/core': 0.15.1 3312 + '@eslint/core': 0.15.2 2965 3313 levn: 0.4.1 2966 3314 2967 - '@externdefs/collider@0.3.0(@badrap/valita@0.4.5)': 3315 + '@externdefs/collider@0.3.0(@badrap/valita@0.4.6)': 2968 3316 dependencies: 2969 - '@badrap/valita': 0.4.5 3317 + '@badrap/valita': 0.4.6 2970 3318 2971 - '@floating-ui/core@1.7.2': 3319 + '@floating-ui/core@1.7.3': 2972 3320 dependencies: 2973 3321 '@floating-ui/utils': 0.2.10 2974 3322 2975 - '@floating-ui/dom@1.7.2': 3323 + '@floating-ui/dom@1.7.4': 2976 3324 dependencies: 2977 - '@floating-ui/core': 1.7.2 3325 + '@floating-ui/core': 1.7.3 2978 3326 '@floating-ui/utils': 0.2.10 2979 3327 2980 3328 '@floating-ui/utils@0.2.10': {} 2981 3329 2982 - '@floating-ui/vue@1.1.7(vue@3.5.17(typescript@5.8.3))': 3330 + '@floating-ui/vue@1.1.9(vue@3.5.19(typescript@5.9.2))': 2983 3331 dependencies: 2984 - '@floating-ui/dom': 1.7.2 3332 + '@floating-ui/dom': 1.7.4 2985 3333 '@floating-ui/utils': 0.2.10 2986 - vue-demi: 0.14.10(vue@3.5.17(typescript@5.8.3)) 3334 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 2987 3335 transitivePeerDependencies: 2988 3336 - '@vue/composition-api' 2989 3337 - vue 2990 3338 2991 - '@headlessui/vue@1.7.23(vue@3.5.17(typescript@5.8.3))': 3339 + '@headlessui/vue@1.7.23(vue@3.5.19(typescript@5.9.2))': 2992 3340 dependencies: 2993 - '@tanstack/vue-virtual': 3.13.12(vue@3.5.17(typescript@5.8.3)) 2994 - vue: 3.5.17(typescript@5.8.3) 3341 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.19(typescript@5.9.2)) 3342 + vue: 3.5.19(typescript@5.9.2) 2995 3343 2996 - '@hono/node-server@1.15.0(hono@4.8.4)': 3344 + '@hono/node-server@1.19.0(hono@4.9.4)': 2997 3345 dependencies: 2998 - hono: 4.8.4 3346 + hono: 4.9.4 2999 3347 3000 3348 '@humanfs/core@0.19.1': {} 3001 3349 ··· 3019 3367 3020 3368 '@hyperjump/json-pointer@1.1.1': {} 3021 3369 3022 - '@hyperjump/json-schema@1.16.1(@hyperjump/browser@1.3.1)': 3370 + '@hyperjump/json-schema@1.16.2(@hyperjump/browser@1.3.1)': 3023 3371 dependencies: 3024 3372 '@hyperjump/browser': 1.3.1 3025 3373 '@hyperjump/json-pointer': 1.1.1 ··· 3038 3386 dependencies: 3039 3387 '@swc/helpers': 0.5.17 3040 3388 3041 - '@internationalized/number@3.6.3': 3389 + '@internationalized/number@3.6.4': 3042 3390 dependencies: 3043 3391 '@swc/helpers': 0.5.17 3044 3392 3045 - '@jridgewell/gen-mapping@0.3.12': 3393 + '@jridgewell/gen-mapping@0.3.13': 3046 3394 dependencies: 3047 - '@jridgewell/sourcemap-codec': 1.5.4 3048 - '@jridgewell/trace-mapping': 0.3.29 3395 + '@jridgewell/sourcemap-codec': 1.5.5 3396 + '@jridgewell/trace-mapping': 0.3.30 3049 3397 3050 3398 '@jridgewell/resolve-uri@3.1.2': {} 3051 3399 3052 - '@jridgewell/source-map@0.3.10': 3400 + '@jridgewell/source-map@0.3.11': 3053 3401 dependencies: 3054 - '@jridgewell/gen-mapping': 0.3.12 3055 - '@jridgewell/trace-mapping': 0.3.29 3402 + '@jridgewell/gen-mapping': 0.3.13 3403 + '@jridgewell/trace-mapping': 0.3.30 3056 3404 3057 - '@jridgewell/sourcemap-codec@1.5.4': {} 3405 + '@jridgewell/sourcemap-codec@1.5.5': {} 3058 3406 3059 - '@jridgewell/trace-mapping@0.3.29': 3407 + '@jridgewell/trace-mapping@0.3.30': 3060 3408 dependencies: 3061 3409 '@jridgewell/resolve-uri': 3.1.2 3062 - '@jridgewell/sourcemap-codec': 1.5.4 3410 + '@jridgewell/sourcemap-codec': 1.5.5 3063 3411 3064 - '@libsql/client@0.15.9': 3412 + '@libsql/client@0.15.12': 3065 3413 dependencies: 3066 - '@libsql/core': 0.15.9 3414 + '@libsql/core': 0.15.12 3067 3415 '@libsql/hrana-client': 0.7.0 3068 - js-base64: 3.7.7 3069 - libsql: 0.5.13 3416 + js-base64: 3.7.8 3417 + libsql: 0.5.17 3070 3418 promise-limit: 2.7.0 3071 3419 transitivePeerDependencies: 3072 3420 - bufferutil 3073 3421 - utf-8-validate 3074 3422 3075 - '@libsql/core@0.15.9': 3423 + '@libsql/core@0.15.12': 3076 3424 dependencies: 3077 - js-base64: 3.7.7 3425 + js-base64: 3.7.8 3078 3426 3079 - '@libsql/darwin-arm64@0.5.13': 3427 + '@libsql/darwin-arm64@0.5.17': 3080 3428 optional: true 3081 3429 3082 - '@libsql/darwin-x64@0.5.13': 3430 + '@libsql/darwin-x64@0.5.17': 3083 3431 optional: true 3084 3432 3085 3433 '@libsql/hrana-client@0.7.0': 3086 3434 dependencies: 3087 3435 '@libsql/isomorphic-fetch': 0.3.1 3088 3436 '@libsql/isomorphic-ws': 0.1.5 3089 - js-base64: 3.7.7 3437 + js-base64: 3.7.8 3090 3438 node-fetch: 3.3.2 3091 3439 transitivePeerDependencies: 3092 3440 - bufferutil ··· 3102 3450 - bufferutil 3103 3451 - utf-8-validate 3104 3452 3105 - '@libsql/linux-arm-gnueabihf@0.5.13': 3453 + '@libsql/linux-arm-gnueabihf@0.5.17': 3106 3454 optional: true 3107 3455 3108 - '@libsql/linux-arm-musleabihf@0.5.13': 3456 + '@libsql/linux-arm-musleabihf@0.5.17': 3109 3457 optional: true 3110 3458 3111 - '@libsql/linux-arm64-gnu@0.5.13': 3459 + '@libsql/linux-arm64-gnu@0.5.17': 3112 3460 optional: true 3113 3461 3114 - '@libsql/linux-arm64-musl@0.5.13': 3462 + '@libsql/linux-arm64-musl@0.5.17': 3115 3463 optional: true 3116 3464 3117 - '@libsql/linux-x64-gnu@0.5.13': 3465 + '@libsql/linux-x64-gnu@0.5.17': 3118 3466 optional: true 3119 3467 3120 - '@libsql/linux-x64-musl@0.5.13': 3468 + '@libsql/linux-x64-musl@0.5.17': 3121 3469 optional: true 3122 3470 3123 - '@libsql/win32-x64-msvc@0.5.13': 3471 + '@libsql/win32-x64-msvc@0.5.17': 3124 3472 optional: true 3125 3473 3126 3474 '@neon-rs/load@0.0.4': {} 3475 + 3476 + '@noble/secp256k1@2.3.0': {} 3127 3477 3128 3478 '@nodelib/fs.scandir@2.1.5': 3129 3479 dependencies: ··· 3139 3489 3140 3490 '@phosphor-icons/core@2.1.1': {} 3141 3491 3142 - '@pkgr/core@0.2.7': {} 3492 + '@pkgr/core@0.2.9': {} 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 3143 3556 3144 3557 '@rtsao/scc@1.1.0': {} 3145 3558 3146 - '@scalar/code-highlight@0.1.5': 3559 + '@scalar/code-highlight@0.1.9': 3147 3560 dependencies: 3148 3561 hast-util-to-text: 4.0.2 3149 3562 highlight.js: 11.11.1 ··· 3165 3578 transitivePeerDependencies: 3166 3579 - supports-color 3167 3580 3168 - '@scalar/components@0.14.16(typescript@5.8.3)': 3581 + '@scalar/components@0.14.25(typescript@5.9.2)': 3169 3582 dependencies: 3170 3583 '@floating-ui/utils': 0.2.10 3171 - '@floating-ui/vue': 1.1.7(vue@3.5.17(typescript@5.8.3)) 3172 - '@headlessui/vue': 1.7.23(vue@3.5.17(typescript@5.8.3)) 3173 - '@scalar/code-highlight': 0.1.5 3174 - '@scalar/icons': 0.4.6(typescript@5.8.3) 3175 - '@scalar/oas-utils': 0.4.11(typescript@5.8.3) 3176 - '@scalar/themes': 0.13.8 3177 - '@scalar/use-hooks': 0.2.4(typescript@5.8.3) 3178 - '@scalar/use-toasts': 0.8.0(typescript@5.8.3) 3179 - '@vueuse/core': 10.11.1(vue@3.5.17(typescript@5.8.3)) 3180 - cva: 1.0.0-beta.2(typescript@5.8.3) 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)) 3586 + '@scalar/code-highlight': 0.1.9 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 3591 + '@scalar/use-hooks': 0.2.4(typescript@5.9.2) 3592 + '@scalar/use-toasts': 0.8.0(typescript@5.9.2) 3593 + '@vueuse/core': 11.3.0(vue@3.5.19(typescript@5.9.2)) 3594 + cva: 1.0.0-beta.2(typescript@5.9.2) 3181 3595 nanoid: 5.1.5 3182 3596 pretty-bytes: 6.1.1 3183 - radix-vue: 1.9.17(vue@3.5.17(typescript@5.8.3)) 3184 - vue: 3.5.17(typescript@5.8.3) 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 3185 3600 transitivePeerDependencies: 3186 3601 - '@vue/composition-api' 3187 3602 - supports-color 3188 3603 - typescript 3189 3604 3190 - '@scalar/core@0.3.7': 3605 + '@scalar/core@0.3.13': 3191 3606 dependencies: 3192 - '@scalar/types': 0.2.7 3607 + '@scalar/types': 0.2.12 3193 3608 3194 - '@scalar/helpers@0.0.6': {} 3609 + '@scalar/helpers@0.0.8': {} 3195 3610 3196 - '@scalar/hono-api-reference@0.9.9(hono@4.8.4)': 3611 + '@scalar/hono-api-reference@0.9.15(hono@4.9.4)': 3197 3612 dependencies: 3198 - '@scalar/core': 0.3.7 3199 - hono: 4.8.4 3613 + '@scalar/core': 0.3.13 3614 + hono: 4.9.4 3200 3615 3201 - '@scalar/icons@0.4.6(typescript@5.8.3)': 3616 + '@scalar/icons@0.4.7(typescript@5.9.2)': 3202 3617 dependencies: 3203 3618 '@phosphor-icons/core': 2.1.1 3204 - '@types/node': 22.16.2 3205 - chalk: 5.4.1 3206 - vue: 3.5.17(typescript@5.8.3) 3619 + '@types/node': 22.17.2 3620 + chalk: 5.6.0 3621 + vue: 3.5.19(typescript@5.9.2) 3207 3622 transitivePeerDependencies: 3208 3623 - typescript 3209 3624 3210 - '@scalar/json-diff@0.0.4': {} 3625 + '@scalar/json-magic@0.3.0(typescript@5.9.2)': 3626 + dependencies: 3627 + '@scalar/helpers': 0.0.8 3628 + vue: 3.5.19(typescript@5.9.2) 3629 + yaml: 2.8.0 3630 + transitivePeerDependencies: 3631 + - typescript 3211 3632 3212 - '@scalar/oas-utils@0.4.11(typescript@5.8.3)': 3633 + '@scalar/oas-utils@0.4.20(typescript@5.9.2)': 3213 3634 dependencies: 3214 3635 '@hyperjump/browser': 1.3.1 3215 - '@hyperjump/json-schema': 1.16.1(@hyperjump/browser@1.3.1) 3216 - '@scalar/helpers': 0.0.6 3217 - '@scalar/object-utils': 1.2.2 3218 - '@scalar/openapi-types': 0.3.5 3219 - '@scalar/themes': 0.13.8 3220 - '@scalar/types': 0.2.7 3221 - '@scalar/workspace-store': 0.8.0(typescript@5.8.3) 3636 + '@hyperjump/json-schema': 1.16.2(@hyperjump/browser@1.3.1) 3637 + '@scalar/helpers': 0.0.8 3638 + '@scalar/json-magic': 0.3.0(typescript@5.9.2) 3639 + '@scalar/object-utils': 1.2.4 3640 + '@scalar/openapi-types': 0.3.7 3641 + '@scalar/themes': 0.13.13 3642 + '@scalar/types': 0.2.12 3643 + '@scalar/workspace-store': 0.14.0(typescript@5.9.2) 3222 3644 '@types/har-format': 1.2.16 3223 3645 flatted: 3.3.3 3224 3646 microdiff: 1.5.0 ··· 3230 3652 - supports-color 3231 3653 - typescript 3232 3654 3233 - '@scalar/object-utils@1.2.2': 3655 + '@scalar/object-utils@1.2.4': 3234 3656 dependencies: 3657 + '@scalar/helpers': 0.0.8 3235 3658 flatted: 3.3.3 3236 3659 just-clone: 6.2.0 3237 3660 ts-deepmerge: 7.0.3 3238 3661 type-fest: 4.41.0 3239 3662 3240 - '@scalar/openapi-parser@0.18.1': 3663 + '@scalar/openapi-parser@0.20.0(typescript@5.9.2)': 3241 3664 dependencies: 3665 + '@scalar/json-magic': 0.3.0(typescript@5.9.2) 3666 + '@scalar/openapi-types': 0.3.7 3242 3667 ajv: 8.17.1 3243 3668 ajv-draft-04: 1.0.0(ajv@8.17.1) 3244 3669 ajv-formats: 3.0.1(ajv@8.17.1) 3245 3670 jsonpointer: 5.0.1 3246 3671 leven: 4.0.0 3247 3672 yaml: 2.8.0 3673 + transitivePeerDependencies: 3674 + - typescript 3248 3675 3249 - '@scalar/openapi-to-markdown@0.2.19(typescript@5.8.3)': 3676 + '@scalar/openapi-to-markdown@0.2.28(typescript@5.9.2)': 3250 3677 dependencies: 3251 - '@scalar/components': 0.14.16(typescript@5.8.3) 3252 - '@scalar/oas-utils': 0.4.11(typescript@5.8.3) 3253 - '@scalar/openapi-parser': 0.18.1 3254 - '@scalar/openapi-types': 0.3.5 3255 - '@scalar/snippetz': 0.4.0 3256 - '@scalar/types': 0.2.7 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) 3681 + '@scalar/openapi-types': 0.3.7 3682 + '@scalar/snippetz': 0.4.5 3683 + '@scalar/types': 0.2.12 3257 3684 html-minifier-terser: 7.2.0 3258 3685 object-to-xml: 2.0.0 3259 3686 rehype-parse: 9.0.1 ··· 3263 3690 remark-gfm: 4.0.1 3264 3691 remark-stringify: 11.0.0 3265 3692 unified: 11.0.5 3266 - vue: 3.5.17(typescript@5.8.3) 3693 + vue: 3.5.19(typescript@5.9.2) 3267 3694 transitivePeerDependencies: 3268 3695 - '@vue/composition-api' 3269 3696 - supports-color 3270 3697 - typescript 3271 3698 3272 - '@scalar/openapi-types@0.3.5': 3699 + '@scalar/openapi-types@0.3.7': 3273 3700 dependencies: 3274 3701 zod: 3.24.1 3275 3702 3276 - '@scalar/snippetz@0.4.0': 3703 + '@scalar/snippetz@0.4.5': 3277 3704 dependencies: 3278 - '@scalar/types': 0.2.7 3705 + '@scalar/types': 0.2.12 3279 3706 stringify-object: 5.0.0 3280 3707 3281 - '@scalar/themes@0.13.8': 3708 + '@scalar/themes@0.13.13': 3282 3709 dependencies: 3283 - '@scalar/types': 0.2.7 3710 + '@scalar/types': 0.2.12 3284 3711 nanoid: 5.1.5 3285 3712 3286 - '@scalar/types@0.2.7': 3713 + '@scalar/types@0.2.12': 3287 3714 dependencies: 3288 - '@scalar/openapi-types': 0.3.5 3715 + '@scalar/openapi-types': 0.3.7 3289 3716 nanoid: 5.1.5 3290 3717 zod: 3.24.1 3291 3718 3292 - '@scalar/use-hooks@0.2.4(typescript@5.8.3)': 3719 + '@scalar/use-hooks@0.2.4(typescript@5.9.2)': 3293 3720 dependencies: 3294 - '@scalar/use-toasts': 0.8.0(typescript@5.8.3) 3295 - '@vueuse/core': 10.11.1(vue@3.5.17(typescript@5.8.3)) 3296 - cva: 1.0.0-beta.2(typescript@5.8.3) 3721 + '@scalar/use-toasts': 0.8.0(typescript@5.9.2) 3722 + '@vueuse/core': 10.11.1(vue@3.5.19(typescript@5.9.2)) 3723 + cva: 1.0.0-beta.2(typescript@5.9.2) 3297 3724 tailwind-merge: 2.6.0 3298 - vue: 3.5.17(typescript@5.8.3) 3725 + vue: 3.5.19(typescript@5.9.2) 3299 3726 zod: 3.24.1 3300 3727 transitivePeerDependencies: 3301 3728 - '@vue/composition-api' 3302 3729 - typescript 3303 3730 3304 - '@scalar/use-toasts@0.8.0(typescript@5.8.3)': 3731 + '@scalar/use-toasts@0.8.0(typescript@5.9.2)': 3305 3732 dependencies: 3306 3733 nanoid: 5.1.5 3307 - vue: 3.5.17(typescript@5.8.3) 3734 + vue: 3.5.19(typescript@5.9.2) 3308 3735 vue-sonner: 1.3.2 3309 3736 transitivePeerDependencies: 3310 3737 - typescript 3311 3738 3312 - '@scalar/workspace-store@0.8.0(typescript@5.8.3)': 3739 + '@scalar/workspace-store@0.14.0(typescript@5.9.2)': 3313 3740 dependencies: 3314 - '@scalar/code-highlight': 0.1.5 3315 - '@scalar/helpers': 0.0.6 3316 - '@scalar/json-diff': 0.0.4 3317 - '@scalar/openapi-parser': 0.18.1 3318 - '@scalar/openapi-types': 0.3.5 3319 - '@scalar/types': 0.2.7 3320 - '@sinclair/typebox': 0.34.37 3741 + '@scalar/code-highlight': 0.1.9 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 3321 3747 github-slugger: 2.0.0 3322 - vue: 3.5.17(typescript@5.8.3) 3748 + type-fest: 4.41.0 3749 + vue: 3.5.19(typescript@5.9.2) 3323 3750 yaml: 2.8.0 3324 3751 transitivePeerDependencies: 3325 3752 - supports-color 3326 3753 - typescript 3327 3754 3328 - '@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': {} 3329 3756 3330 - '@skyware/jetstream@0.2.4': 3757 + '@skyware/jetstream@0.2.5': 3331 3758 dependencies: 3332 - '@atcute/atproto': 3.1.0 3333 - '@atcute/bluesky': 3.1.4 3334 - '@atcute/lexicons': 1.1.0 3335 - partysocket: 1.1.4 3759 + '@atcute/atproto': 3.1.2 3760 + '@atcute/bluesky': 3.2.1 3761 + '@atcute/lexicons': 1.1.1 3762 + partysocket: 1.1.5 3336 3763 tiny-emitter: 2.1.0 3337 3764 3338 3765 '@swc/helpers@0.5.17': ··· 3341 3768 3342 3769 '@tanstack/virtual-core@3.13.12': {} 3343 3770 3344 - '@tanstack/vue-virtual@3.13.12(vue@3.5.17(typescript@5.8.3))': 3771 + '@tanstack/vue-virtual@3.13.12(vue@3.5.19(typescript@5.9.2))': 3345 3772 dependencies: 3346 3773 '@tanstack/virtual-core': 3.13.12 3347 - vue: 3.5.17(typescript@5.8.3) 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 3348 3779 3349 3780 '@types/debug@4.1.12': 3350 3781 dependencies: 3351 3782 '@types/ms': 2.1.0 3783 + 3784 + '@types/deep-eql@4.0.2': {} 3352 3785 3353 3786 '@types/estree@1.0.8': {} 3354 3787 ··· 3368 3801 3369 3802 '@types/ms@2.1.0': {} 3370 3803 3371 - '@types/node@22.16.2': 3804 + '@types/node@22.17.2': 3372 3805 dependencies: 3373 3806 undici-types: 6.21.0 3374 3807 3375 - '@types/node@24.0.12': 3808 + '@types/node@24.3.0': 3376 3809 dependencies: 3377 - undici-types: 7.8.0 3810 + undici-types: 7.10.0 3378 3811 3379 3812 '@types/triple-beam@1.3.5': {} 3380 3813 ··· 3384 3817 3385 3818 '@types/ws@8.18.1': 3386 3819 dependencies: 3387 - '@types/node': 24.0.12 3820 + '@types/node': 24.3.0 3388 3821 3389 - '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 3822 + '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': 3390 3823 dependencies: 3391 3824 '@eslint-community/regexpp': 4.12.1 3392 - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3393 - '@typescript-eslint/scope-manager': 8.36.0 3394 - '@typescript-eslint/type-utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3395 - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3396 - '@typescript-eslint/visitor-keys': 8.36.0 3397 - eslint: 9.30.1(jiti@2.4.2) 3825 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 3826 + '@typescript-eslint/scope-manager': 8.40.0 3827 + '@typescript-eslint/type-utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 3828 + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 3829 + '@typescript-eslint/visitor-keys': 8.40.0 3830 + eslint: 9.33.0(jiti@2.5.1) 3398 3831 graphemer: 1.4.0 3399 3832 ignore: 7.0.5 3400 3833 natural-compare: 1.4.0 3401 - ts-api-utils: 2.1.0(typescript@5.8.3) 3402 - typescript: 5.8.3 3834 + ts-api-utils: 2.1.0(typescript@5.9.2) 3835 + typescript: 5.9.2 3403 3836 transitivePeerDependencies: 3404 3837 - supports-color 3405 3838 3406 - '@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 3839 + '@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': 3407 3840 dependencies: 3408 - '@typescript-eslint/scope-manager': 8.36.0 3409 - '@typescript-eslint/types': 8.36.0 3410 - '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) 3411 - '@typescript-eslint/visitor-keys': 8.36.0 3841 + '@typescript-eslint/scope-manager': 8.40.0 3842 + '@typescript-eslint/types': 8.40.0 3843 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) 3844 + '@typescript-eslint/visitor-keys': 8.40.0 3412 3845 debug: 4.4.1 3413 - eslint: 9.30.1(jiti@2.4.2) 3414 - typescript: 5.8.3 3846 + eslint: 9.33.0(jiti@2.5.1) 3847 + typescript: 5.9.2 3415 3848 transitivePeerDependencies: 3416 3849 - supports-color 3417 3850 3418 - '@typescript-eslint/project-service@8.36.0(typescript@5.8.3)': 3851 + '@typescript-eslint/project-service@8.40.0(typescript@5.9.2)': 3419 3852 dependencies: 3420 - '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) 3421 - '@typescript-eslint/types': 8.36.0 3853 + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) 3854 + '@typescript-eslint/types': 8.40.0 3422 3855 debug: 4.4.1 3423 - typescript: 5.8.3 3856 + typescript: 5.9.2 3424 3857 transitivePeerDependencies: 3425 3858 - supports-color 3426 3859 3427 - '@typescript-eslint/scope-manager@8.36.0': 3860 + '@typescript-eslint/scope-manager@8.40.0': 3428 3861 dependencies: 3429 - '@typescript-eslint/types': 8.36.0 3430 - '@typescript-eslint/visitor-keys': 8.36.0 3862 + '@typescript-eslint/types': 8.40.0 3863 + '@typescript-eslint/visitor-keys': 8.40.0 3431 3864 3432 - '@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.8.3)': 3865 + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)': 3433 3866 dependencies: 3434 - typescript: 5.8.3 3867 + typescript: 5.9.2 3435 3868 3436 - '@typescript-eslint/type-utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 3869 + '@typescript-eslint/type-utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': 3437 3870 dependencies: 3438 - '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) 3439 - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3871 + '@typescript-eslint/types': 8.40.0 3872 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) 3873 + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 3440 3874 debug: 4.4.1 3441 - eslint: 9.30.1(jiti@2.4.2) 3442 - ts-api-utils: 2.1.0(typescript@5.8.3) 3443 - typescript: 5.8.3 3875 + eslint: 9.33.0(jiti@2.5.1) 3876 + ts-api-utils: 2.1.0(typescript@5.9.2) 3877 + typescript: 5.9.2 3444 3878 transitivePeerDependencies: 3445 3879 - supports-color 3446 3880 3447 - '@typescript-eslint/types@8.36.0': {} 3881 + '@typescript-eslint/types@8.40.0': {} 3448 3882 3449 - '@typescript-eslint/typescript-estree@8.36.0(typescript@5.8.3)': 3883 + '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)': 3450 3884 dependencies: 3451 - '@typescript-eslint/project-service': 8.36.0(typescript@5.8.3) 3452 - '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) 3453 - '@typescript-eslint/types': 8.36.0 3454 - '@typescript-eslint/visitor-keys': 8.36.0 3885 + '@typescript-eslint/project-service': 8.40.0(typescript@5.9.2) 3886 + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) 3887 + '@typescript-eslint/types': 8.40.0 3888 + '@typescript-eslint/visitor-keys': 8.40.0 3455 3889 debug: 4.4.1 3456 3890 fast-glob: 3.3.3 3457 3891 is-glob: 4.0.3 3458 3892 minimatch: 9.0.5 3459 3893 semver: 7.7.2 3460 - ts-api-utils: 2.1.0(typescript@5.8.3) 3461 - typescript: 5.8.3 3894 + ts-api-utils: 2.1.0(typescript@5.9.2) 3895 + typescript: 5.9.2 3462 3896 transitivePeerDependencies: 3463 3897 - supports-color 3464 3898 3465 - '@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 3899 + '@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': 3466 3900 dependencies: 3467 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) 3468 - '@typescript-eslint/scope-manager': 8.36.0 3469 - '@typescript-eslint/types': 8.36.0 3470 - '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) 3471 - eslint: 9.30.1(jiti@2.4.2) 3472 - typescript: 5.8.3 3901 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) 3902 + '@typescript-eslint/scope-manager': 8.40.0 3903 + '@typescript-eslint/types': 8.40.0 3904 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) 3905 + eslint: 9.33.0(jiti@2.5.1) 3906 + typescript: 5.9.2 3473 3907 transitivePeerDependencies: 3474 3908 - supports-color 3475 3909 3476 - '@typescript-eslint/visitor-keys@8.36.0': 3910 + '@typescript-eslint/visitor-keys@8.40.0': 3477 3911 dependencies: 3478 - '@typescript-eslint/types': 8.36.0 3912 + '@typescript-eslint/types': 8.40.0 3479 3913 eslint-visitor-keys: 4.2.1 3480 3914 3481 3915 '@ungap/structured-clone@1.3.0': {} 3482 3916 3483 - '@vue/compiler-core@3.5.17': 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': 3484 3950 dependencies: 3485 - '@babel/parser': 7.28.0 3486 - '@vue/shared': 3.5.17 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': 3960 + dependencies: 3961 + '@babel/parser': 7.28.3 3962 + '@vue/shared': 3.5.19 3487 3963 entities: 4.5.0 3488 3964 estree-walker: 2.0.2 3489 3965 source-map-js: 1.2.1 3490 3966 3491 - '@vue/compiler-dom@3.5.17': 3967 + '@vue/compiler-dom@3.5.19': 3492 3968 dependencies: 3493 - '@vue/compiler-core': 3.5.17 3494 - '@vue/shared': 3.5.17 3969 + '@vue/compiler-core': 3.5.19 3970 + '@vue/shared': 3.5.19 3495 3971 3496 - '@vue/compiler-sfc@3.5.17': 3972 + '@vue/compiler-sfc@3.5.19': 3497 3973 dependencies: 3498 - '@babel/parser': 7.28.0 3499 - '@vue/compiler-core': 3.5.17 3500 - '@vue/compiler-dom': 3.5.17 3501 - '@vue/compiler-ssr': 3.5.17 3502 - '@vue/shared': 3.5.17 3974 + '@babel/parser': 7.28.3 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 3503 3979 estree-walker: 2.0.2 3504 - magic-string: 0.30.17 3980 + magic-string: 0.30.18 3505 3981 postcss: 8.5.6 3506 3982 source-map-js: 1.2.1 3507 3983 3508 - '@vue/compiler-ssr@3.5.17': 3984 + '@vue/compiler-ssr@3.5.19': 3509 3985 dependencies: 3510 - '@vue/compiler-dom': 3.5.17 3511 - '@vue/shared': 3.5.17 3986 + '@vue/compiler-dom': 3.5.19 3987 + '@vue/shared': 3.5.19 3512 3988 3513 - '@vue/reactivity@3.5.17': 3989 + '@vue/reactivity@3.5.19': 3514 3990 dependencies: 3515 - '@vue/shared': 3.5.17 3991 + '@vue/shared': 3.5.19 3516 3992 3517 - '@vue/runtime-core@3.5.17': 3993 + '@vue/runtime-core@3.5.19': 3518 3994 dependencies: 3519 - '@vue/reactivity': 3.5.17 3520 - '@vue/shared': 3.5.17 3995 + '@vue/reactivity': 3.5.19 3996 + '@vue/shared': 3.5.19 3521 3997 3522 - '@vue/runtime-dom@3.5.17': 3998 + '@vue/runtime-dom@3.5.19': 3523 3999 dependencies: 3524 - '@vue/reactivity': 3.5.17 3525 - '@vue/runtime-core': 3.5.17 3526 - '@vue/shared': 3.5.17 4000 + '@vue/reactivity': 3.5.19 4001 + '@vue/runtime-core': 3.5.19 4002 + '@vue/shared': 3.5.19 3527 4003 csstype: 3.1.3 3528 4004 3529 - '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))': 4005 + '@vue/server-renderer@3.5.19(vue@3.5.19(typescript@5.9.2))': 3530 4006 dependencies: 3531 - '@vue/compiler-ssr': 3.5.17 3532 - '@vue/shared': 3.5.17 3533 - vue: 3.5.17(typescript@5.8.3) 4007 + '@vue/compiler-ssr': 3.5.19 4008 + '@vue/shared': 3.5.19 4009 + vue: 3.5.19(typescript@5.9.2) 3534 4010 3535 - '@vue/shared@3.5.17': {} 4011 + '@vue/shared@3.5.19': {} 3536 4012 3537 - '@vueuse/core@10.11.1(vue@3.5.17(typescript@5.8.3))': 4013 + '@vueuse/core@10.11.1(vue@3.5.19(typescript@5.9.2))': 3538 4014 dependencies: 3539 4015 '@types/web-bluetooth': 0.0.20 3540 4016 '@vueuse/metadata': 10.11.1 3541 - '@vueuse/shared': 10.11.1(vue@3.5.17(typescript@5.8.3)) 3542 - vue-demi: 0.14.10(vue@3.5.17(typescript@5.8.3)) 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)) 4019 + transitivePeerDependencies: 4020 + - '@vue/composition-api' 4021 + - vue 4022 + 4023 + '@vueuse/core@11.3.0(vue@3.5.19(typescript@5.9.2))': 4024 + dependencies: 4025 + '@types/web-bluetooth': 0.0.20 4026 + '@vueuse/metadata': 11.3.0 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)) 3543 4029 transitivePeerDependencies: 3544 4030 - '@vue/composition-api' 3545 4031 - vue 3546 4032 3547 4033 '@vueuse/metadata@10.11.1': {} 3548 4034 3549 - '@vueuse/shared@10.11.1(vue@3.5.17(typescript@5.8.3))': 4035 + '@vueuse/metadata@11.3.0': {} 4036 + 4037 + '@vueuse/shared@10.11.1(vue@3.5.19(typescript@5.9.2))': 3550 4038 dependencies: 3551 - vue-demi: 0.14.10(vue@3.5.17(typescript@5.8.3)) 4039 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 4040 + transitivePeerDependencies: 4041 + - '@vue/composition-api' 4042 + - vue 4043 + 4044 + '@vueuse/shared@11.3.0(vue@3.5.19(typescript@5.9.2))': 4045 + dependencies: 4046 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 3552 4047 transitivePeerDependencies: 3553 4048 - '@vue/composition-api' 3554 4049 - vue ··· 3641 4136 get-intrinsic: 1.3.0 3642 4137 is-array-buffer: 3.0.5 3643 4138 4139 + assertion-error@2.0.1: {} 4140 + 3644 4141 async-function@1.0.0: {} 3645 4142 3646 4143 async@3.2.6: {} ··· 3670 4167 3671 4168 bun-types@1.2.17: 3672 4169 dependencies: 3673 - '@types/node': 24.0.12 4170 + '@types/node': 24.3.0 3674 4171 optional: true 3675 4172 4173 + cac@6.7.14: {} 4174 + 3676 4175 call-bind-apply-helpers@1.0.2: 3677 4176 dependencies: 3678 4177 es-errors: 1.3.0 ··· 3699 4198 3700 4199 ccount@2.0.1: {} 3701 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 + 3702 4209 chalk@4.1.2: 3703 4210 dependencies: 3704 4211 ansi-styles: 4.3.0 3705 4212 supports-color: 7.2.0 3706 4213 3707 - chalk@5.4.1: {} 4214 + chalk@5.6.0: {} 3708 4215 3709 4216 character-entities-html4@2.1.0: {} 3710 4217 ··· 3712 4219 3713 4220 character-entities@2.0.2: {} 3714 4221 4222 + check-error@2.1.1: {} 4223 + 3715 4224 clean-css@5.3.3: 3716 4225 dependencies: 3717 4226 source-map: 0.6.1 ··· 3763 4272 3764 4273 csstype@3.1.3: {} 3765 4274 3766 - cva@1.0.0-beta.2(typescript@5.8.3): 4275 + cva@1.0.0-beta.2(typescript@5.9.2): 3767 4276 dependencies: 3768 4277 clsx: 2.1.1 3769 4278 optionalDependencies: 3770 - typescript: 5.8.3 4279 + typescript: 5.9.2 3771 4280 3772 4281 dank-each@1.0.0: {} 3773 4282 ··· 3805 4314 dependencies: 3806 4315 character-entities: 2.0.2 3807 4316 4317 + deep-eql@5.0.2: {} 4318 + 3808 4319 deep-is@0.1.4: {} 3809 4320 3810 4321 define-data-property@1.1.4: ··· 3842 4353 dependencies: 3843 4354 '@drizzle-team/brocli': 0.10.2 3844 4355 '@esbuild-kit/esm-loader': 2.6.5 3845 - esbuild: 0.25.6 3846 - esbuild-register: 3.6.0(esbuild@0.25.6) 4356 + esbuild: 0.25.9 4357 + esbuild-register: 3.6.0(esbuild@0.25.9) 3847 4358 transitivePeerDependencies: 3848 4359 - supports-color 3849 4360 3850 - drizzle-orm@0.44.2(@libsql/client@0.15.9)(bun-types@1.2.17): 4361 + drizzle-orm@0.44.4(@libsql/client@0.15.12)(bun-types@1.2.17): 3851 4362 optionalDependencies: 3852 - '@libsql/client': 0.15.9 4363 + '@libsql/client': 0.15.12 3853 4364 bun-types: 1.2.17 3854 4365 3855 4366 dunder-proto@1.0.1: ··· 3925 4436 3926 4437 es-errors@1.3.0: {} 3927 4438 4439 + es-module-lexer@1.7.0: {} 4440 + 3928 4441 es-object-atoms@1.1.1: 3929 4442 dependencies: 3930 4443 es-errors: 1.3.0 ··· 3946 4459 is-date-object: 1.1.0 3947 4460 is-symbol: 1.1.1 3948 4461 3949 - esbuild-register@3.6.0(esbuild@0.25.6): 4462 + esbuild-register@3.6.0(esbuild@0.25.9): 3950 4463 dependencies: 3951 4464 debug: 4.4.1 3952 - esbuild: 0.25.6 4465 + esbuild: 0.25.9 3953 4466 transitivePeerDependencies: 3954 4467 - supports-color 3955 4468 ··· 3978 4491 '@esbuild/win32-ia32': 0.18.20 3979 4492 '@esbuild/win32-x64': 0.18.20 3980 4493 3981 - esbuild@0.25.6: 4494 + esbuild@0.25.9: 3982 4495 optionalDependencies: 3983 - '@esbuild/aix-ppc64': 0.25.6 3984 - '@esbuild/android-arm': 0.25.6 3985 - '@esbuild/android-arm64': 0.25.6 3986 - '@esbuild/android-x64': 0.25.6 3987 - '@esbuild/darwin-arm64': 0.25.6 3988 - '@esbuild/darwin-x64': 0.25.6 3989 - '@esbuild/freebsd-arm64': 0.25.6 3990 - '@esbuild/freebsd-x64': 0.25.6 3991 - '@esbuild/linux-arm': 0.25.6 3992 - '@esbuild/linux-arm64': 0.25.6 3993 - '@esbuild/linux-ia32': 0.25.6 3994 - '@esbuild/linux-loong64': 0.25.6 3995 - '@esbuild/linux-mips64el': 0.25.6 3996 - '@esbuild/linux-ppc64': 0.25.6 3997 - '@esbuild/linux-riscv64': 0.25.6 3998 - '@esbuild/linux-s390x': 0.25.6 3999 - '@esbuild/linux-x64': 0.25.6 4000 - '@esbuild/netbsd-arm64': 0.25.6 4001 - '@esbuild/netbsd-x64': 0.25.6 4002 - '@esbuild/openbsd-arm64': 0.25.6 4003 - '@esbuild/openbsd-x64': 0.25.6 4004 - '@esbuild/openharmony-arm64': 0.25.6 4005 - '@esbuild/sunos-x64': 0.25.6 4006 - '@esbuild/win32-arm64': 0.25.6 4007 - '@esbuild/win32-ia32': 0.25.6 4008 - '@esbuild/win32-x64': 0.25.6 4496 + '@esbuild/aix-ppc64': 0.25.9 4497 + '@esbuild/android-arm': 0.25.9 4498 + '@esbuild/android-arm64': 0.25.9 4499 + '@esbuild/android-x64': 0.25.9 4500 + '@esbuild/darwin-arm64': 0.25.9 4501 + '@esbuild/darwin-x64': 0.25.9 4502 + '@esbuild/freebsd-arm64': 0.25.9 4503 + '@esbuild/freebsd-x64': 0.25.9 4504 + '@esbuild/linux-arm': 0.25.9 4505 + '@esbuild/linux-arm64': 0.25.9 4506 + '@esbuild/linux-ia32': 0.25.9 4507 + '@esbuild/linux-loong64': 0.25.9 4508 + '@esbuild/linux-mips64el': 0.25.9 4509 + '@esbuild/linux-ppc64': 0.25.9 4510 + '@esbuild/linux-riscv64': 0.25.9 4511 + '@esbuild/linux-s390x': 0.25.9 4512 + '@esbuild/linux-x64': 0.25.9 4513 + '@esbuild/netbsd-arm64': 0.25.9 4514 + '@esbuild/netbsd-x64': 0.25.9 4515 + '@esbuild/openbsd-arm64': 0.25.9 4516 + '@esbuild/openbsd-x64': 0.25.9 4517 + '@esbuild/openharmony-arm64': 0.25.9 4518 + '@esbuild/sunos-x64': 0.25.9 4519 + '@esbuild/win32-arm64': 0.25.9 4520 + '@esbuild/win32-ia32': 0.25.9 4521 + '@esbuild/win32-x64': 0.25.9 4009 4522 4010 4523 escape-string-regexp@4.0.0: {} 4011 4524 4012 4525 escape-string-regexp@5.0.0: {} 4013 4526 4014 - eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)): 4527 + eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)): 4015 4528 dependencies: 4016 - eslint: 9.30.1(jiti@2.4.2) 4529 + eslint: 9.33.0(jiti@2.5.1) 4017 4530 4018 4531 eslint-import-resolver-node@0.3.9: 4019 4532 dependencies: ··· 4023 4536 transitivePeerDependencies: 4024 4537 - supports-color 4025 4538 4026 - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2)): 4539 + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): 4027 4540 dependencies: 4028 4541 debug: 3.2.7 4029 4542 optionalDependencies: 4030 - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 4031 - eslint: 9.30.1(jiti@2.4.2) 4543 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 4544 + eslint: 9.33.0(jiti@2.5.1) 4032 4545 eslint-import-resolver-node: 0.3.9 4033 4546 transitivePeerDependencies: 4034 4547 - supports-color 4035 4548 4036 - eslint-plugin-drizzle@0.2.3(eslint@9.30.1(jiti@2.4.2)): 4549 + eslint-plugin-drizzle@0.2.3(eslint@9.33.0(jiti@2.5.1)): 4037 4550 dependencies: 4038 - eslint: 9.30.1(jiti@2.4.2) 4551 + eslint: 9.33.0(jiti@2.5.1) 4039 4552 4040 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)): 4553 + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)): 4041 4554 dependencies: 4042 4555 '@rtsao/scc': 1.1.0 4043 4556 array-includes: 3.1.9 ··· 4046 4559 array.prototype.flatmap: 1.3.3 4047 4560 debug: 3.2.7 4048 4561 doctrine: 2.1.0 4049 - eslint: 9.30.1(jiti@2.4.2) 4562 + eslint: 9.33.0(jiti@2.5.1) 4050 4563 eslint-import-resolver-node: 0.3.9 4051 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2)) 4564 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) 4052 4565 hasown: 2.0.2 4053 4566 is-core-module: 2.16.1 4054 4567 is-glob: 4.0.3 ··· 4060 4573 string.prototype.trimend: 1.0.9 4061 4574 tsconfig-paths: 3.15.0 4062 4575 optionalDependencies: 4063 - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 4576 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 4064 4577 transitivePeerDependencies: 4065 4578 - eslint-import-resolver-typescript 4066 4579 - eslint-import-resolver-webpack 4067 4580 - supports-color 4068 4581 4069 - eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2): 4582 + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(prettier@3.6.2): 4070 4583 dependencies: 4071 - eslint: 9.30.1(jiti@2.4.2) 4584 + eslint: 9.33.0(jiti@2.5.1) 4072 4585 prettier: 3.6.2 4073 4586 prettier-linter-helpers: 1.0.0 4074 - synckit: 0.11.8 4587 + synckit: 0.11.11 4075 4588 optionalDependencies: 4076 - eslint-config-prettier: 10.1.5(eslint@9.30.1(jiti@2.4.2)) 4589 + eslint-config-prettier: 10.1.8(eslint@9.33.0(jiti@2.5.1)) 4077 4590 4078 4591 eslint-scope@8.4.0: 4079 4592 dependencies: ··· 4084 4597 4085 4598 eslint-visitor-keys@4.2.1: {} 4086 4599 4087 - eslint@9.30.1(jiti@2.4.2): 4600 + eslint@9.33.0(jiti@2.5.1): 4088 4601 dependencies: 4089 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) 4602 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) 4090 4603 '@eslint-community/regexpp': 4.12.1 4091 4604 '@eslint/config-array': 0.21.0 4092 - '@eslint/config-helpers': 0.3.0 4093 - '@eslint/core': 0.14.0 4605 + '@eslint/config-helpers': 0.3.1 4606 + '@eslint/core': 0.15.2 4094 4607 '@eslint/eslintrc': 3.3.1 4095 - '@eslint/js': 9.30.1 4096 - '@eslint/plugin-kit': 0.3.3 4608 + '@eslint/js': 9.33.0 4609 + '@eslint/plugin-kit': 0.3.5 4097 4610 '@humanfs/node': 0.16.6 4098 4611 '@humanwhocodes/module-importer': 1.0.1 4099 4612 '@humanwhocodes/retry': 0.4.3 ··· 4122 4635 natural-compare: 1.4.0 4123 4636 optionator: 0.9.4 4124 4637 optionalDependencies: 4125 - jiti: 2.4.2 4638 + jiti: 2.5.1 4126 4639 transitivePeerDependencies: 4127 4640 - supports-color 4128 4641 ··· 4146 4659 4147 4660 estree-walker@2.0.2: {} 4148 4661 4662 + estree-walker@3.0.3: 4663 + dependencies: 4664 + '@types/estree': 1.0.8 4665 + 4149 4666 esutils@2.0.3: {} 4150 4667 4151 4668 event-target-polyfill@0.0.4: {} 4669 + 4670 + expect-type@1.2.2: {} 4152 4671 4153 4672 extend@3.0.2: {} 4154 4673 ··· 4173 4692 fastq@1.19.1: 4174 4693 dependencies: 4175 4694 reusify: 1.1.0 4695 + 4696 + fdir@6.5.0(picomatch@4.0.3): 4697 + optionalDependencies: 4698 + picomatch: 4.0.3 4176 4699 4177 4700 fecha@4.2.3: {} 4178 4701 ··· 4324 4847 hast-util-from-parse5: 8.0.3 4325 4848 parse5: 7.3.0 4326 4849 vfile: 6.0.3 4327 - vfile-message: 4.0.2 4850 + vfile-message: 4.0.3 4328 4851 4329 4852 hast-util-from-parse5@8.0.3: 4330 4853 dependencies: ··· 4457 4980 4458 4981 highlightjs-vue@1.0.0: {} 4459 4982 4460 - hono@4.8.4: {} 4983 + hono@4.9.4: {} 4461 4984 4462 4985 html-minifier-terser@7.2.0: 4463 4986 dependencies: ··· 4615 5138 4616 5139 isexe@2.0.0: {} 4617 5140 4618 - jiti@2.4.2: {} 5141 + jiti@2.5.1: {} 4619 5142 4620 - js-base64@3.7.7: {} 5143 + js-base64@3.7.8: {} 5144 + 5145 + js-tokens@9.0.1: {} 4621 5146 4622 5147 js-yaml@4.1.0: 4623 5148 dependencies: ··· 4656 5181 prelude-ls: 1.2.1 4657 5182 type-check: 0.4.0 4658 5183 4659 - libsql@0.5.13: 5184 + libsql@0.5.17: 4660 5185 dependencies: 4661 5186 '@neon-rs/load': 0.0.4 4662 5187 detect-libc: 2.0.2 4663 5188 optionalDependencies: 4664 - '@libsql/darwin-arm64': 0.5.13 4665 - '@libsql/darwin-x64': 0.5.13 4666 - '@libsql/linux-arm-gnueabihf': 0.5.13 4667 - '@libsql/linux-arm-musleabihf': 0.5.13 4668 - '@libsql/linux-arm64-gnu': 0.5.13 4669 - '@libsql/linux-arm64-musl': 0.5.13 4670 - '@libsql/linux-x64-gnu': 0.5.13 4671 - '@libsql/linux-x64-musl': 0.5.13 4672 - '@libsql/win32-x64-msvc': 0.5.13 5189 + '@libsql/darwin-arm64': 0.5.17 5190 + '@libsql/darwin-x64': 0.5.17 5191 + '@libsql/linux-arm-gnueabihf': 0.5.17 5192 + '@libsql/linux-arm-musleabihf': 0.5.17 5193 + '@libsql/linux-arm64-gnu': 0.5.17 5194 + '@libsql/linux-arm64-musl': 0.5.17 5195 + '@libsql/linux-x64-gnu': 0.5.17 5196 + '@libsql/linux-x64-musl': 0.5.17 5197 + '@libsql/win32-x64-msvc': 0.5.17 4673 5198 4674 5199 locate-path@6.0.0: 4675 5200 dependencies: ··· 4688 5213 4689 5214 longest-streak@3.1.0: {} 4690 5215 5216 + loupe@3.2.1: {} 5217 + 4691 5218 lower-case@2.0.2: 4692 5219 dependencies: 4693 5220 tslib: 2.8.1 ··· 4698 5225 devlop: 1.1.0 4699 5226 highlight.js: 11.11.1 4700 5227 4701 - magic-string@0.30.17: 5228 + magic-string@0.30.18: 4702 5229 dependencies: 4703 - '@jridgewell/sourcemap-codec': 1.5.4 5230 + '@jridgewell/sourcemap-codec': 1.5.5 4704 5231 4705 5232 markdown-table@3.0.4: {} 4706 5233 ··· 5130 5657 dependencies: 5131 5658 entities: 6.0.1 5132 5659 5133 - partysocket@1.1.4: 5660 + partysocket@1.1.5: 5134 5661 dependencies: 5135 5662 event-target-polyfill: 0.0.4 5136 5663 ··· 5145 5672 5146 5673 path-parse@1.0.7: {} 5147 5674 5675 + pathe@2.0.3: {} 5676 + 5677 + pathval@2.0.1: {} 5678 + 5148 5679 picocolors@1.1.1: {} 5149 5680 5150 5681 picomatch@2.3.1: {} 5682 + 5683 + picomatch@4.0.3: {} 5151 5684 5152 5685 possible-typed-array-names@1.1.0: {} 5153 5686 ··· 5177 5710 5178 5711 queue-microtask@1.2.3: {} 5179 5712 5180 - radix-vue@1.9.17(vue@3.5.17(typescript@5.8.3)): 5713 + radix-vue@1.9.17(vue@3.5.19(typescript@5.9.2)): 5181 5714 dependencies: 5182 - '@floating-ui/dom': 1.7.2 5183 - '@floating-ui/vue': 1.1.7(vue@3.5.17(typescript@5.8.3)) 5715 + '@floating-ui/dom': 1.7.4 5716 + '@floating-ui/vue': 1.1.9(vue@3.5.19(typescript@5.9.2)) 5184 5717 '@internationalized/date': 3.8.2 5185 - '@internationalized/number': 3.6.3 5186 - '@tanstack/vue-virtual': 3.13.12(vue@3.5.17(typescript@5.8.3)) 5187 - '@vueuse/core': 10.11.1(vue@3.5.17(typescript@5.8.3)) 5188 - '@vueuse/shared': 10.11.1(vue@3.5.17(typescript@5.8.3)) 5718 + '@internationalized/number': 3.6.4 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)) 5189 5722 aria-hidden: 1.2.6 5190 5723 defu: 6.1.4 5191 5724 fast-deep-equal: 3.1.3 5192 5725 nanoid: 5.1.5 5193 - vue: 3.5.17(typescript@5.8.3) 5726 + vue: 3.5.19(typescript@5.9.2) 5194 5727 transitivePeerDependencies: 5195 5728 - '@vue/composition-api' 5196 5729 ··· 5320 5853 5321 5854 reusify@1.1.0: {} 5322 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 + 5323 5883 run-parallel@1.2.0: 5324 5884 dependencies: 5325 5885 queue-microtask: 1.2.3 ··· 5409 5969 side-channel-map: 1.0.1 5410 5970 side-channel-weakmap: 1.0.2 5411 5971 5972 + siginfo@2.0.0: {} 5973 + 5412 5974 simple-swizzle@0.2.2: 5413 5975 dependencies: 5414 5976 is-arrayish: 0.3.2 ··· 5425 5987 space-separated-tokens@2.0.2: {} 5426 5988 5427 5989 stack-trace@0.0.10: {} 5990 + 5991 + stackback@0.0.2: {} 5992 + 5993 + std-env@3.9.0: {} 5428 5994 5429 5995 stop-iteration-iterator@1.1.0: 5430 5996 dependencies: ··· 5473 6039 5474 6040 strip-json-comments@3.1.1: {} 5475 6041 6042 + strip-literal@3.0.0: 6043 + dependencies: 6044 + js-tokens: 9.0.1 6045 + 5476 6046 supports-color@7.2.0: 5477 6047 dependencies: 5478 6048 has-flag: 4.0.0 5479 6049 5480 6050 supports-preserve-symlinks-flag@1.0.0: {} 5481 6051 5482 - synckit@0.11.8: 6052 + synckit@0.11.11: 5483 6053 dependencies: 5484 - '@pkgr/core': 0.2.7 6054 + '@pkgr/core': 0.2.9 5485 6055 5486 6056 tailwind-merge@2.6.0: {} 5487 6057 5488 6058 terser@5.43.1: 5489 6059 dependencies: 5490 - '@jridgewell/source-map': 0.3.10 6060 + '@jridgewell/source-map': 0.3.11 5491 6061 acorn: 8.15.0 5492 6062 commander: 2.20.3 5493 6063 source-map-support: 0.5.21 ··· 5496 6066 5497 6067 tiny-emitter@2.1.0: {} 5498 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 + 5499 6084 to-regex-range@5.0.1: 5500 6085 dependencies: 5501 6086 is-number: 7.0.0 ··· 5510 6095 5511 6096 trough@2.2.0: {} 5512 6097 5513 - ts-api-utils@2.1.0(typescript@5.8.3): 6098 + ts-api-utils@2.1.0(typescript@5.9.2): 5514 6099 dependencies: 5515 - typescript: 5.8.3 6100 + typescript: 5.9.2 5516 6101 5517 6102 ts-deepmerge@7.0.3: {} 5518 6103 ··· 5525 6110 5526 6111 tslib@2.8.1: {} 5527 6112 5528 - tsx@4.20.3: 6113 + tsx@4.20.4: 5529 6114 dependencies: 5530 - esbuild: 0.25.6 6115 + esbuild: 0.25.9 5531 6116 get-tsconfig: 4.10.1 5532 6117 optionalDependencies: 5533 6118 fsevents: 2.3.3 ··· 5571 6156 possible-typed-array-names: 1.1.0 5572 6157 reflect.getprototypeof: 1.0.10 5573 6158 5574 - typescript-eslint@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): 6159 + typescript-eslint@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): 5575 6160 dependencies: 5576 - '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 5577 - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 5578 - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 5579 - eslint: 9.30.1(jiti@2.4.2) 5580 - typescript: 5.8.3 6161 + '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 6162 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 6163 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) 6164 + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 6165 + eslint: 9.33.0(jiti@2.5.1) 6166 + typescript: 5.9.2 5581 6167 transitivePeerDependencies: 5582 6168 - supports-color 5583 6169 5584 - typescript@5.8.3: {} 6170 + typescript@5.9.2: {} 5585 6171 5586 6172 unbox-primitive@1.1.0: 5587 6173 dependencies: ··· 5592 6178 5593 6179 undici-types@6.21.0: {} 5594 6180 5595 - undici-types@7.8.0: {} 6181 + undici-types@7.10.0: {} 5596 6182 5597 6183 unified@11.0.5: 5598 6184 dependencies: ··· 5645 6231 '@types/unist': 3.0.3 5646 6232 vfile: 6.0.3 5647 6233 5648 - vfile-message@4.0.2: 6234 + vfile-message@4.0.3: 5649 6235 dependencies: 5650 6236 '@types/unist': 3.0.3 5651 6237 unist-util-stringify-position: 4.0.0 ··· 5653 6239 vfile@6.0.3: 5654 6240 dependencies: 5655 6241 '@types/unist': 3.0.3 5656 - vfile-message: 4.0.2 6242 + vfile-message: 4.0.3 5657 6243 5658 - vue-demi@0.14.10(vue@3.5.17(typescript@5.8.3)): 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): 5659 6245 dependencies: 5660 - vue: 3.5.17(typescript@5.8.3) 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 6280 + 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): 6282 + dependencies: 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) 5661 6328 5662 6329 vue-sonner@1.3.2: {} 5663 6330 5664 - vue@3.5.17(typescript@5.8.3): 6331 + vue@3.5.19(typescript@5.9.2): 5665 6332 dependencies: 5666 - '@vue/compiler-dom': 3.5.17 5667 - '@vue/compiler-sfc': 3.5.17 5668 - '@vue/runtime-dom': 3.5.17 5669 - '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3)) 5670 - '@vue/shared': 3.5.17 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 5671 6338 optionalDependencies: 5672 - typescript: 5.8.3 6339 + typescript: 5.9.2 5673 6340 5674 6341 web-namespaces@2.0.1: {} 5675 6342 ··· 5719 6386 which@2.0.2: 5720 6387 dependencies: 5721 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 5722 6394 5723 6395 winston-transport@4.9.0: 5724 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 + }
+123
backend/src/api/feed.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { 8 + SocialClipprActorDefs, 9 + SocialClipprFeedClip, 10 + SocialClipprFeedDefs, 11 + } from "@clipprjs/lexicons"; 12 + import type { ClipViewQuery, ErrorResponse, TagRef } from "./types.js"; 13 + import { getHandleFromDid } from "../network/converters.js"; 14 + import { Database } from "../db/database.js"; 15 + import { clipsTable } from "../db/schema.js"; 16 + import { and, eq } from "drizzle-orm"; 17 + import { createProfileView } from "./profile.js"; 18 + import { is } from "@atcute/lexicons"; 19 + import { validateHash } from "../hasher.js"; 20 + 21 + const db = Database.getInstance().getDb(); 22 + 23 + export async function createClipView( 24 + query: ClipViewQuery, 25 + ): Promise<SocialClipprFeedDefs.ClipView | ErrorResponse> { 26 + if (!query.did.startsWith("did:")) { 27 + let did; 28 + try { 29 + did = await getHandleFromDid(query.did); 30 + } catch (e: unknown) { 31 + if (e instanceof Error) { 32 + return { 33 + error: "InvalidRequest", 34 + message: `Error: A queried URI does not have a valid DID or handle: ${e.message}`, 35 + }; 36 + } else { 37 + return { 38 + error: "InvalidRequest", 39 + message: 40 + "Error: A queried URI does not have a valid DID or handle: unknown error", 41 + }; 42 + } 43 + } 44 + query.did = did; 45 + } 46 + 47 + if (query.collection !== "social.clippr.feed.clip") { 48 + return { 49 + error: "InvalidRequest", 50 + message: "Error: A queried URI is not a proper clip", 51 + }; 52 + } 53 + 54 + const dbQuery = await db 55 + .selectDistinct() 56 + .from(clipsTable) 57 + .where( 58 + and( 59 + eq(clipsTable.did, query.did), 60 + eq(clipsTable.recordKey, query.recordKey), 61 + ), 62 + ); 63 + 64 + if (dbQuery.length === 0) { 65 + return { 66 + error: "InvalidRequest", 67 + message: "Could not find a given URI", 68 + }; 69 + } 70 + 71 + // Yes, the array thing is not ideal. 72 + if (!dbQuery[0]?.cid) { 73 + return { 74 + error: "InvalidRequest", 75 + message: "Could not find a given URI", 76 + }; 77 + } 78 + 79 + if (!(await validateHash(dbQuery[0]?.url, query.recordKey))) { 80 + return { 81 + error: "InvalidRequest", 82 + message: "Could not find a given URI", 83 + }; 84 + } 85 + 86 + const authorView: ErrorResponse | SocialClipprActorDefs.ProfileView = 87 + await createProfileView(query.did); 88 + 89 + if (!is(SocialClipprActorDefs.profileViewSchema, authorView)) { 90 + console.log(authorView); 91 + return { 92 + error: "InvalidRequest", 93 + message: "Could not validate profile view", // I can't get the error message, it seems to always assume the type is the ProfileView 94 + } as ErrorResponse; 95 + } 96 + 97 + let clipTags: TagRef[] | undefined; 98 + 99 + if (dbQuery[0]?.tags === null) { 100 + clipTags = undefined; 101 + } 102 + 103 + const clipRecord: SocialClipprFeedClip.Main = { 104 + $type: "social.clippr.feed.clip", 105 + url: dbQuery[0]?.url as `${string}:${string}`, 106 + title: dbQuery[0]?.title, 107 + description: dbQuery[0]?.description, 108 + tags: clipTags || undefined, 109 + unlisted: dbQuery[0]?.unlisted, 110 + unread: dbQuery[0]?.unread || undefined, 111 + notes: dbQuery[0]?.notes || undefined, 112 + languages: dbQuery[0]?.languages || undefined, 113 + createdAt: dbQuery[0]?.createdAt.toISOString(), 114 + }; 115 + 116 + return { 117 + cid: dbQuery[0]?.cid, 118 + uri: `at://${query.did}/${query.collection}/${query.recordKey}`, 119 + author: authorView, 120 + record: clipRecord, 121 + indexedAt: dbQuery[0]?.indexedAt.toISOString(), 122 + }; 123 + }
+101
backend/src/api/profile.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { SocialClipprActorDefs } from "@clipprjs/lexicons"; 8 + import type { ErrorResponse } from "./types.js"; 9 + import { getDidFromHandle, getHandleFromDid } from "../network/converters.js"; 10 + import { Database } from "../db/database.js"; 11 + import { usersTable } from "../db/schema.js"; 12 + import { eq } from "drizzle-orm"; 13 + 14 + const db = Database.getInstance().getDb(); 15 + 16 + // TODO: Stop leeching off the Bluesky CDN and get the blob directly from the user's PDS 17 + // 18 + // Get a CDN URI from a blob's CID 19 + export async function createAvatarLink( 20 + did: string, 21 + cid: string, 22 + ): Promise<string> { 23 + return `https://cdn.bsky.app/img/avatar/plain/${did}/${cid}`; 24 + } 25 + 26 + export async function createProfileView( 27 + actor: string, 28 + ): Promise<SocialClipprActorDefs.ProfileView | ErrorResponse> { 29 + let viewHandle; 30 + let viewDid; 31 + 32 + if (actor.startsWith("did:")) { 33 + viewDid = actor; 34 + try { 35 + viewHandle = await getHandleFromDid(viewDid); 36 + viewHandle = viewHandle.replace("at://", ""); 37 + } catch (e: unknown) { 38 + if (e instanceof Error) { 39 + return { 40 + error: "InvalidRequest", 41 + message: `Error: A queried URI does not have a valid DID or handle: ${e.message}`, 42 + }; 43 + } else { 44 + return { 45 + error: "InvalidRequest", 46 + message: 47 + "Error: A queried URI does not have a valid DID or handle: unknown error", 48 + }; 49 + } 50 + } 51 + } else { 52 + viewHandle = actor; 53 + viewHandle = viewHandle.replace("at://", ""); 54 + try { 55 + viewDid = await getDidFromHandle(viewHandle); 56 + } catch (e: unknown) { 57 + if (e instanceof Error) { 58 + return { 59 + error: "InvalidRequest", 60 + message: `Error: A queried URI does not have a valid DID or handle: ${e.message}`, 61 + }; 62 + } else { 63 + return { 64 + error: "InvalidRequest", 65 + message: 66 + "Error: A queried URI does not have a valid DID or handle: unknown error", 67 + }; 68 + } 69 + } 70 + } 71 + 72 + const dbQuery = await db 73 + .selectDistinct() 74 + .from(usersTable) 75 + .where(eq(usersTable.did, viewDid)); 76 + 77 + if (dbQuery.length === 0) { 78 + return { 79 + error: "InvalidRequest", 80 + message: "Could not find a queried URI's profile", 81 + } as ErrorResponse; 82 + } 83 + 84 + const avatarCid = dbQuery[0]?.avatar; 85 + 86 + let viewAvatar; 87 + 88 + if (avatarCid === undefined || avatarCid === null) { 89 + viewAvatar = "https://missing.avatar"; 90 + } else viewAvatar = await createAvatarLink(viewDid, avatarCid); 91 + 92 + return { 93 + $type: "social.clippr.actor.defs#profileView", 94 + did: viewDid as `did:${string}:${string}`, 95 + handle: viewHandle as `${string}.${string}`, 96 + avatar: (viewAvatar as `${string}:${string}`) || undefined, 97 + createdAt: dbQuery[0]?.createdAt.toISOString(), 98 + description: dbQuery[0]?.description || undefined, 99 + displayName: dbQuery[0]?.displayName || viewHandle, 100 + }; 101 + }
+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 + }
+44
backend/src/api/types.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import type { ResourceUri } from "@atcute/lexicons"; 8 + 9 + export interface ErrorResponse { 10 + error: string; 11 + message: string; 12 + } 13 + 14 + export interface ProfileViewQuery { 15 + actor: string; 16 + } 17 + 18 + export interface ClipViewQuery { 19 + did: string; 20 + collection: string; 21 + recordKey: string; 22 + } 23 + 24 + export const isClipViewQuery = (query: unknown): query is ClipViewQuery => { 25 + return typeof query === "object" && query !== null && "did" in query; 26 + }; 27 + 28 + export interface TagRef { 29 + $type: "com.atproto.repo.strongRef"; 30 + cid: string; 31 + uri: ResourceUri; 32 + } 33 + 34 + export interface TagViewQuery { 35 + did: string; 36 + collection: string; 37 + recordKey: string; 38 + } 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 {
+26 -5
backend/src/db/schema.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - // noinspection Annotator 8 - 9 7 import { int, sqliteTable, text } from "drizzle-orm/sqlite-core"; 10 8 import { sql } from "drizzle-orm"; 9 + import type { TagRef } from "../api/types.js"; 11 10 12 11 // WebStorm keeps throwing errors with the default statements as it wants 13 12 // an actual SQLite query, despite being valid. Sucks. ··· 18 17 .default(sql`(unixepoch() * 1000)`), 19 18 did: text("did").notNull(), 20 19 recordKey: text("rkey").notNull(), 20 + cid: text("cid").notNull(), 21 21 url: text("url").notNull(), 22 22 title: text("title").notNull(), 23 23 description: text("description").notNull(), 24 24 unlisted: int("unlisted", { mode: "boolean" }).notNull(), 25 25 notes: text("notes"), 26 26 tags: text("tags", { mode: "json" }) 27 - .$type<string[]>() 27 + .$type<TagRef[]>() 28 28 .default(sql`'[]'`), 29 29 unread: int("unread", { mode: "boolean" }), 30 30 languages: text("languages", { mode: "json" }) ··· 33 33 createdAt: int("createdAt", { mode: "timestamp_ms" }) 34 34 .notNull() 35 35 .default(sql`(unixepoch() * 1000)`), 36 + indexedAt: int("indexedAt", { mode: "timestamp_ms" }) 37 + .notNull() 38 + .default(sql`(unixepoch() * 1000)`), 36 39 }); 37 40 38 41 export const tagsTable = sqliteTable("tags", { ··· 42 45 .default(sql`(unixepoch() * 1000)`), 43 46 did: text("did").notNull(), 44 47 recordKey: text("rkey").notNull(), 48 + cid: text("cid").notNull(), 45 49 name: text("name").notNull(), 50 + description: text("description"), 46 51 color: text("color"), 47 52 createdAt: int("createdAt", { mode: "timestamp_ms" }) 48 53 .notNull() 49 54 .default(sql`(unixepoch() * 1000)`), 55 + indexedAt: int("indexedAt", { mode: "timestamp_ms" }) 56 + .notNull() 57 + .default(sql`(unixepoch() * 1000)`), 50 58 }); 51 59 52 60 export const usersTable = sqliteTable("profiles", { ··· 54 62 timestamp: int("time_us", { mode: "timestamp_ms" }) 55 63 .notNull() 56 64 .default(sql`(unixepoch() * 1000)`), 57 - did: text("did").notNull(), 58 - displayName: text("displayName"), 65 + did: text("did").notNull().unique(), 66 + cid: text("cid").notNull(), 67 + displayName: text("displayName").notNull(), 59 68 description: text("description"), 60 69 avatar: text("avatar"), 61 70 createdAt: int("createdAt", { mode: "timestamp_ms" }) 62 71 .notNull() 63 72 .default(sql`(unixepoch() * 1000)`), 64 73 }); 74 + 75 + export const preferencesTable = sqliteTable("preferences", { 76 + id: int("id").primaryKey({ autoIncrement: true }), 77 + did: text("did").notNull().unique(), 78 + handle: text("handle").notNull(), 79 + publishingScopesPref: text("publishingScopesPref", { mode: "json" }) 80 + .$type<string[]>() 81 + .default(sql`'[]'`), 82 + lastModified: int("lastModified", { mode: "timestamp_ms" }) 83 + .notNull() 84 + .default(sql`(unixepoch() * 1000)`), 85 + });
+21
backend/src/hasher.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import xxhash from "xxhash-wasm"; 8 + 9 + /// Hash a given string into a hexadecimal xxh64 string. 10 + export async function hashString(data: string): Promise<string> { 11 + const { h64 } = await xxhash(); 12 + return h64(data).toString(16); 13 + } 14 + 15 + /// Check if a string is equivalent to a given hash. 16 + export async function validateHash( 17 + data: string, 18 + hash: string, 19 + ): Promise<boolean> { 20 + return hash === (await hashString(data)); 21 + }
+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");
+136 -37
backend/src/network/commit.ts
··· 16 16 import Logger from "../logger.js"; 17 17 import { isBlob } from "@atcute/lexicons/interfaces"; 18 18 import { validateClip, validateProfile, validateTag } from "./validator.js"; 19 - import xxhash from "xxhash-wasm"; 20 19 import { convertDidToString } from "./converters.js"; 20 + import { hashString } from "../hasher.js"; 21 + import { and, eq } from "drizzle-orm"; 22 + import type { TagRef } from "../api/types.js"; 21 23 22 24 const db = Database.getInstance().getDb(); 23 25 ··· 29 31 export async function handleClip( 30 32 event: CommitEvent<`social.clippr.${string}`>, 31 33 ): Promise<void> { 32 - if (event.commit.operation !== "create") { 33 - Logger.warn( 34 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 35 - ); 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); 36 44 return; 37 - } // We currently do not handle these. 45 + } 38 46 39 47 if (event.commit.record.$type !== "social.clippr.feed.clip") { 40 48 Logger.verbose( 41 - "Invalid type for incoming clip record", 49 + `Mismatched type for incoming clip record (${event.did}/${event.commit.rkey})`, 42 50 event.commit.record, 43 51 ); 44 52 } 45 53 46 54 if (!is(SocialClipprFeedClip.mainSchema, event.commit.record)) { 47 55 Logger.verbose( 48 - "Invalid schema for incoming clip record", 56 + `Invalid schema for incoming clip record (${event.did}/${event.commit.rkey})`, 49 57 event.commit.record, 50 58 ); 51 59 return; ··· 65 73 }; 66 74 67 75 // xxh64, NOT xxh3 learned that the hard way 68 - const { h64 } = await xxhash(); 69 - const urlHash = h64(record.url).toString(16); 76 + const urlHash: string = await hashString(record.url); 70 77 71 78 if (urlHash !== event.commit.rkey) { 72 79 Logger.verbose( 73 - `Record key hash (${event.commit.rkey}) does not match hash of URL (${urlHash}) in incoming clip record`, 80 + `Record key hash (${event.commit.rkey}) does not match hash of URL (${urlHash}) in incoming clip record (${event.did})`, 74 81 event.commit.record, 75 82 ); 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 83 117 await db.insert(clipsTable).values({ 84 118 // @ts-expect-error Weird type error despite being a normal string. 85 119 did: convertDidToString(event.did), 120 + cid: event.commit.cid, 86 121 timestamp: convertMicroToDate(event.time_us), 87 122 recordKey: event.commit.rkey, 88 123 createdAt: new Date(record.createdAt), 124 + indexedAt: new Date(), 89 125 url: record.url, 90 126 title: record.title, 91 127 description: record.description, ··· 96 132 languages: record.languages, 97 133 }); 98 134 99 - Logger.verbose("Indexed new clip:", event.did, event.commit.rkey); 135 + Logger.verbose(`Indexed new clip: ${event.did}/${event.commit.rkey}`, event); 100 136 } 101 137 102 138 export async function handleTag( 103 139 event: CommitEvent<`social.clippr.${string}`>, 104 140 ): Promise<void> { 105 - if (event.commit.operation !== "create") { 106 - Logger.warn( 107 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 108 - ); 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); 109 151 return; 110 - } // We currently do not handle these. 152 + } 111 153 112 154 if (event.commit.record.$type !== "social.clippr.feed.tag") { 113 - Logger.verbose("Invalid type for incoming tag record", event.commit.record); 155 + Logger.verbose( 156 + `Mismatched type for incoming tag record (${event.did}/${event.commit.rkey})`, 157 + event.commit.record, 158 + ); 114 159 return; 115 160 } 116 161 117 162 if (!is(SocialClipprFeedTag.mainSchema, event.commit.record)) { 118 163 Logger.verbose( 119 - "Invalid schema for incoming tag record", 164 + `Invalid schema for incoming tag record (${event.did}/${event.commit.rkey})`, 120 165 event.commit.record, 121 166 ); 122 167 return; ··· 127 172 createdAt: event.commit.record.createdAt, 128 173 name: event.commit.record.name, 129 174 color: event.commit.record.color, 175 + description: event.commit.record.description, 130 176 }; 131 177 132 178 if (record.name !== event.commit.rkey) { 133 179 Logger.verbose( 134 - "Record key does not match name of incoming tag record", 180 + `Record key does not match name of incoming tag record (${event.did}/${event.commit.rkey})`, 135 181 event.commit.record, 136 182 ); 137 183 return; ··· 142 188 return; 143 189 } 144 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 + 145 215 await db.insert(tagsTable).values({ 216 + timestamp: convertMicroToDate(event.time_us), 146 217 did: convertDidToString(event.did), 147 - timestamp: convertMicroToDate(event.time_us), 218 + cid: event.commit.cid, 148 219 recordKey: event.commit.rkey, 149 - createdAt: new Date(record.createdAt), 150 220 name: record.name, 221 + description: record.description, 151 222 color: record.color, 223 + createdAt: new Date(record.createdAt), 224 + indexedAt: new Date(), 152 225 }); 153 226 154 - Logger.verbose("Indexed new tag:", event.did, event.commit.rkey); 227 + Logger.verbose(`Indexed new tag: ${event.did}/${event.commit.rkey}`, event); 155 228 } 156 229 157 230 export async function handleProfile( 158 231 event: CommitEvent<`social.clippr.${string}`>, 159 232 ): Promise<void> { 160 - if (event.commit.operation !== "create") { 161 - Logger.warn( 162 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 163 - ); 233 + if (event.commit.operation === "delete") { 234 + await db.delete(usersTable).where(eq(usersTable.did, event.did)); 235 + Logger.verbose(`Deleted profile: ${event.did}`, event); 164 236 return; 165 - } // We currently do not handle these. 237 + } 166 238 167 239 if (event.commit.record.$type !== "social.clippr.actor.profile") { 168 240 Logger.verbose( 169 - "Invalid type for incoming profile record", 241 + `Mismatched type for incoming profile record (${event.did})`, 170 242 event.commit.record, 171 243 ); 172 244 return; ··· 174 246 175 247 if (!is(SocialClipprActorProfile.mainSchema, event.commit.record)) { 176 248 Logger.verbose( 177 - "Invalid schema for incoming profile record", 249 + `Invalid schema for incoming profile record (${event.did})`, 178 250 event.commit.record, 179 251 ); 180 252 return; ··· 190 262 191 263 if (event.commit.rkey !== "self") { 192 264 Logger.verbose( 193 - "Record key of incoming profile record does not match 'self'", 265 + `Record key of incoming profile record does not match 'self' (${event.did})`, 194 266 event.commit.record, 195 267 ); 196 268 return; ··· 199 271 // This needs to be here so the avatar can be recognized as a proper blob. 200 272 if (record.avatar) { 201 273 if (!isBlob(record.avatar)) { 202 - Logger.verbose("Avatar in incoming profile record is not a blob", record); 274 + Logger.verbose( 275 + `Avatar in incoming profile record is not a blob (${event.did})`, 276 + record, 277 + ); 203 278 return; 204 279 } 205 280 206 281 if (record.avatar.mimeType.match(/^image\/(png|jpeg)$/i) === null) { 207 282 Logger.verbose( 208 - "Avatar in incoming profile record is not a PNG or JPEG", 283 + `Avatar in incoming profile record is not a PNG or JPEG (${event.did})`, 209 284 record, 210 285 ); 211 286 return; ··· 213 288 214 289 if (record.avatar.ref?.$link === undefined) { 215 290 Logger.verbose( 216 - "Avatar in incoming profile record has no link to blob", 291 + `Avatar in incoming profile record has no link to blob (${event.did})`, 217 292 record, 218 293 ); 219 294 return; 220 295 } 221 296 222 297 if (record.avatar.size > 1000000) { 223 - Logger.verbose("Avatar in incoming profile record is too large", record); 298 + Logger.verbose( 299 + `Avatar in incoming profile record is too large (${event.did})`, 300 + record, 301 + ); 224 302 return; 225 303 } 226 304 } ··· 230 308 return; 231 309 } 232 310 311 + if (event.commit.operation === "update") { 312 + await db 313 + .update(usersTable) 314 + .set({ 315 + did: convertDidToString(event.did), 316 + cid: event.commit.cid, 317 + timestamp: convertMicroToDate(event.time_us), 318 + createdAt: new Date(record.createdAt), 319 + displayName: record.displayName, 320 + avatar: record.avatar?.ref.$link, 321 + description: record.description, 322 + }) 323 + .where(eq(usersTable.did, convertDidToString(event.did))); 324 + Logger.verbose(`Updated profile: ${convertDidToString(event.did)}`, event); 325 + return; 326 + } 327 + 233 328 await db.insert(usersTable).values({ 234 329 did: convertDidToString(event.did), 330 + cid: event.commit.cid, 235 331 timestamp: convertMicroToDate(event.time_us), 236 332 createdAt: new Date(record.createdAt), 237 333 displayName: record.displayName, ··· 239 335 description: record.description, 240 336 }); 241 337 242 - Logger.verbose("Indexed new profile for:", convertDidToString(event.did)); 338 + Logger.verbose( 339 + `Indexed new profile: ${convertDidToString(event.did)}`, 340 + event, 341 + ); 243 342 }
+5 -47
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 - // TODO: Stop leeching off the Bluesky CDN and get the blob directly from the user's PDS 35 - // Get a CDN URI from a blob's CID 36 - export async function getUriFromBlobCid( 37 - did: string, 38 - cid: string, 39 - ): Promise<string> { 40 - return `https://cdn.bsky.app/img/avatar/plain/${did}/${cid}`; 41 - } 42 - 43 - // 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! 44 28 export async function getHandleFromDid(did: string): Promise<string> { 45 - const docResolver = new CompositeDidDocumentResolver({ 46 - methods: { 47 - plc: new PlcDidDocumentResolver(), 48 - web: new WebDidDocumentResolver(), 49 - }, 50 - }); 51 - 52 - let doc; 53 - try { 54 - doc = await docResolver.resolve(convertStringToTypedDid(did)); 55 - } catch (err) { 56 - if (err instanceof DocumentNotFoundError) { 57 - throw new Error("Document not found"); 58 - } 59 - if (err instanceof UnsupportedDidMethodError) { 60 - throw new Error("Unsupported did method"); 61 - } 62 - if (err instanceof ImproperDidError) { 63 - throw new Error("Improper did"); 64 - } 65 - if (err instanceof FailedDocumentResolutionError) { 66 - throw new Error("Failed document resolution"); 67 - } 68 - if (err instanceof HandleResolutionError) { 69 - throw new Error("Generic handle resolution error"); 70 - } 71 - } 29 + const doc = await getDidDocument(convertStringToTypedDid(did)); 72 30 73 31 if (!doc?.alsoKnownAs) { 74 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`,
+9 -28
backend/src/network/validator.ts
··· 87 87 return false; 88 88 } 89 89 90 - if (record.name.length < 1) { 91 - Logger.verbose("Name from incoming tag record is too short", record); 92 - } 93 - 94 90 if (record.color) { 95 91 if (record.color.length > 7) { 96 92 Logger.verbose("Color from incoming tag record is too long", record); 97 93 return false; 98 94 } 99 95 100 - if (record.color.length < 4) { 101 - Logger.verbose("Color from incoming tag record is too short", record); 96 + if (!record.color.match("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$")) { 97 + Logger.verbose( 98 + "Invalid hexadecimal color for incoming tag record", 99 + record, 100 + ); 102 101 return false; 103 102 } 103 + } 104 104 105 - if (!record.color.match("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$")) { 105 + if (record.description) { 106 + if (record.description.length > 500) { 106 107 Logger.verbose( 107 - "Invalid hexadecimal color for incoming tag record", 108 + "Description from incoming tag record is too long", 108 109 record, 109 110 ); 110 111 return false; ··· 127 128 return false; 128 129 } 129 130 130 - if (record.url.length < 3) { 131 - Logger.verbose("Too short url from incoming clip record", record); 132 - return false; 133 - } 134 - 135 131 if (record.title.length > 2048) { 136 132 Logger.verbose("Too long title from incoming clip record", record); 137 133 return false; 138 134 } 139 135 140 - if (record.title.length < 1) { 141 - Logger.verbose("Too short title from incoming clip record", record); 142 - return false; 143 - } 144 - 145 136 if (record.description.length > 4096) { 146 137 Logger.verbose("Too long description from incoming clip record", record); 147 138 return false; 148 139 } 149 140 150 - if (record.description.length < 1) { 151 - Logger.verbose("Too short description from incoming clip record", record); 152 - return false; 153 - } 154 - 155 141 if (record.notes) { 156 142 if (record.notes.length > 10000) { 157 143 Logger.verbose("Too long notes from incoming clip record", record); 158 - return false; 159 - } 160 - 161 - if (record.notes.length < 1) { 162 - Logger.verbose("Too short notes from incoming clip record", record); 163 144 return false; 164 145 } 165 146 }
+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;
+114 -6
backend/src/routes/xrpc.ts
··· 8 8 import { Database } from "../db/database.js"; 9 9 import { usersTable } from "../db/schema.js"; 10 10 import { eq } from "drizzle-orm"; 11 - import { 12 - getDidFromHandle, 13 - getHandleFromDid, 14 - getUriFromBlobCid, 15 - } from "../network/converters.js"; 11 + import { getDidFromHandle, getHandleFromDid } from "../network/converters.js"; 12 + import { createClipView } from "../api/feed.js"; 13 + import { type ClipViewQuery, type ErrorResponse } from "../api/types.js"; 14 + import { createAvatarLink } from "../api/profile.js"; 15 + import { SocialClipprFeedDefs } from "@clipprjs/lexicons"; 16 + import { is } from "@atcute/lexicons"; 16 17 17 18 const app = new Hono(); 18 19 const db = Database.getInstance().getDb(); ··· 101 102 } else actorHandle = actor; 102 103 103 104 // TODO: Add placeholder avatar 105 + // This is a mess and should be replaced with a real solution! 104 106 const avatarCid: string = 105 107 profileSearch[0]?.avatar || "https://missing.avatar"; 106 108 let actorAvatar; 107 109 if (avatarCid !== "https://missing.avatar") { 108 - actorAvatar = await getUriFromBlobCid(actorDid, avatarCid); 110 + actorAvatar = await createAvatarLink(actorDid, avatarCid); 109 111 } else actorAvatar = avatarCid; 110 112 111 113 // Right now we don't do de-duplication in the database, so we just take the ··· 118 120 description: profileSearch[0]?.description || null, 119 121 createdAt: profileSearch[0]?.createdAt, 120 122 }); 123 + }); 124 + 125 + app.get("/social.clippr.feed.getClips", async (c) => { 126 + const uris = c.req.query("uris"); 127 + if (uris === undefined || uris.trim().length === 0) { 128 + return c.json( 129 + { 130 + error: "InvalidRequest", 131 + message: "Error: Parameters must have the uris property included", 132 + }, 133 + 400, 134 + ); 135 + } 136 + 137 + const rawUriArray: string[] = uris.split(","); 138 + 139 + if (rawUriArray.length > 25) { 140 + return c.json( 141 + { 142 + error: "InvalidRequest", 143 + message: "Error: More than 25 URIs have been provided", 144 + }, 145 + 400, 146 + ); 147 + } 148 + 149 + if ( 150 + rawUriArray.some((value) => { 151 + return !value.startsWith("at://"); 152 + }) 153 + ) { 154 + return c.json( 155 + { 156 + error: "InvalidRequest", 157 + message: "Error: A queried URI is missing the at:// identifier", 158 + }, 159 + 400, 160 + ); 161 + } 162 + 163 + const parsedUriArray: object[] = []; 164 + 165 + for (let value of rawUriArray) { 166 + value = value.replace("at://", ""); 167 + const splitUri: string[] = value.split("/"); 168 + 169 + if (splitUri.length !== 3) { 170 + c.json( 171 + { 172 + error: "InvalidRequest", 173 + message: "Error: A queried URI is not a proper clip", 174 + }, 175 + 400, 176 + ); 177 + } 178 + 179 + let splitUriObject: ClipViewQuery = { 180 + did: "", 181 + collection: "", 182 + recordKey: "", 183 + }; 184 + 185 + // validate type 186 + if ( 187 + !splitUri[0] || 188 + !splitUri[1] || 189 + !splitUri[2] || 190 + typeof splitUri[0] !== "string" || 191 + typeof splitUri[1] !== "string" || 192 + typeof splitUri[2] !== "string" 193 + ) { 194 + c.json( 195 + { 196 + error: "InvalidRequest", 197 + message: "Error: A queried URI is not a proper clip", 198 + }, 199 + 400, 200 + ); 201 + } else { 202 + splitUriObject = { 203 + did: splitUri[0], 204 + collection: splitUri[1], 205 + recordKey: splitUri[2], 206 + }; 207 + } 208 + 209 + const clipView = await createClipView(splitUriObject); 210 + 211 + if (!is(SocialClipprFeedDefs.clipViewSchema, value)) { 212 + c.json(clipView, 400); 213 + } 214 + 215 + parsedUriArray.push(clipView); 216 + } 217 + 218 + if (parsedUriArray.length === 0) { 219 + return c.json( 220 + { 221 + error: "InvalidRequest", 222 + message: "No queried URIs exist", 223 + } as ErrorResponse, 224 + 400, 225 + ); 226 + } 227 + 228 + return c.json(parsedUriArray, 200); 121 229 }); 122 230 123 231 app.get("/_health", async (c) => {
+5 -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"; 14 + import { cors } from "hono/cors"; 13 15 14 16 export function winstonLogger(message: string, ...rest: unknown[]) { 15 17 Logger.http(message, ...rest); ··· 17 19 18 20 const app = new Hono(); 19 21 app.use(logger(winstonLogger)); 22 + app.use(cors()); 20 23 21 24 // Link all routes up 22 25 app.route("/", misc); 23 26 app.route("/", openapi); 27 + app.route("/", wellKnown); 24 28 app.route("/xrpc", xrpc); 25 29 26 30 export default app;
+1119 -36
backend/static/api.json
··· 1 1 { 2 2 "openapi": "3.1.1", 3 + "info": { 4 + "title": "Clippr AppView API", 5 + "version": "1.0.1", 6 + "description": "API reference documentation for Clippr's backend.", 7 + "license": { 8 + "name": "GNU Affero General Public License v3.0 only", 9 + "identifier": "AGPL-3.0-only" 10 + } 11 + }, 3 12 "servers": [ 4 13 { 5 14 "url": "http://localhost:9090", 6 15 "description": "Development server" 7 16 }, 8 17 { 9 - "url": "https://clippr.social", 18 + "url": "https://api.clippr.social", 10 19 "description": "Production server" 11 20 } 12 21 ], 13 - "info": { 14 - "title": "Clippr AppView API", 15 - "version": "0.1.0", 16 - "description": "Official API reference documentation for Clippr's backend." 17 - }, 18 22 "tags": [ 19 23 { 24 + "name": "Clips", 25 + "description": "API paths that relate to user bookmarks, or 'clips'." 26 + }, 27 + { 28 + "name": "Tags", 29 + "description": "API paths that relate to user tags." 30 + }, 31 + { 20 32 "name": "Profile", 21 33 "description": "API paths that relate to user profiles." 22 34 }, ··· 26 38 } 27 39 ], 28 40 "paths": { 41 + "/xrpc/social.clippr.actor.getPreferences": { 42 + "get": { 43 + "tags": ["Profile"], 44 + "summary": "Get a user's preferences", 45 + "operationId": "social.clippr.actor.getPreferences", 46 + "description": "Get a user's private preferences. Requires authentication.", 47 + "security": [ 48 + { 49 + "Bearer": [] 50 + } 51 + ], 52 + "responses": { 53 + "200": { 54 + "description": "OK", 55 + "content": { 56 + "application/json": { 57 + "schema": { 58 + "$ref": "#/components/schemas/social.clippr.actor.defs.preferences" 59 + } 60 + } 61 + } 62 + }, 63 + "400": { 64 + "description": "Bad Request", 65 + "content": { 66 + "application/json": { 67 + "schema": { 68 + "type": "object", 69 + "properties": { 70 + "error": { 71 + "type": "string", 72 + "description": "A general error code", 73 + "oneOf": [ 74 + { 75 + "const": "InvalidRequest" 76 + }, 77 + { 78 + "const": "ExpiredToken" 79 + }, 80 + { 81 + "const": "InvalidToken" 82 + } 83 + ] 84 + }, 85 + "message": { 86 + "type": "string", 87 + "description": "A detailed description of the error" 88 + } 89 + } 90 + } 91 + } 92 + } 93 + }, 94 + "401": { 95 + "description": "Unauthorized", 96 + "content": { 97 + "application/json": { 98 + "schema": { 99 + "type": "object", 100 + "properties": { 101 + "error": { 102 + "type": "string", 103 + "description": "A general error code", 104 + "oneOf": [ 105 + { 106 + "const": "AuthMissing" 107 + } 108 + ] 109 + }, 110 + "message": { 111 + "type": "string", 112 + "description": "A detailed description of the error" 113 + } 114 + } 115 + } 116 + } 117 + } 118 + } 119 + } 120 + } 121 + }, 29 122 "/xrpc/social.clippr.actor.getProfile": { 30 123 "get": { 124 + "tags": ["Profile"], 31 125 "summary": "Get a profile", 32 - "description": "Get an user's profile based on their DID or handle.", 126 + "operationId": "social.clippr.actor.getProfile", 127 + "description": "Get a user's profile based on a given DID or handle.", 33 128 "parameters": [ 34 129 { 35 130 "name": "actor", 36 131 "in": "query", 37 - "description": "The DID or handle of the account to get the profile record of.", 132 + "description": "Handle or DID of account to fetch profile of", 38 133 "required": true, 39 134 "content": { 40 135 "schema": { 41 - "type": "string" 136 + "type": "string", 137 + "description": "Handle or DID of account to fetch profile of", 138 + "format": "at-identifier" 42 139 } 43 140 }, 44 141 "deprecated": false, ··· 52 149 "application/json": { 53 150 "schema": { 54 151 "type": "object", 152 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 153 + } 154 + } 155 + } 156 + }, 157 + "400": { 158 + "description": "Bad Request", 159 + "content": { 160 + "application/json": { 161 + "schema": { 162 + "type": "object", 55 163 "properties": { 56 - "did": { 164 + "error": { 165 + "type": "string", 166 + "description": "A general error code", 167 + "oneOf": [ 168 + { 169 + "const": "InvalidRequest" 170 + } 171 + ] 172 + }, 173 + "message": { 174 + "type": "string", 175 + "description": "A detailed description of the error" 176 + } 177 + } 178 + } 179 + } 180 + } 181 + } 182 + } 183 + } 184 + }, 185 + "/xrpc/social.clippr.actor.putPreferences": { 186 + "post": { 187 + "tags": ["Profile"], 188 + "summary": "Set a user's preferences", 189 + "operationId": "social.clippr.actor.putPreferences", 190 + "description": "Sets the private preferences attached to the account. Requires authentication.", 191 + "security": [ 192 + { 193 + "Bearer": [] 194 + } 195 + ], 196 + "requestBody": { 197 + "required": true, 198 + "content": { 199 + "application/json": { 200 + "schema": { 201 + "type": "object", 202 + "properties": { 203 + "preferences": { 204 + "$ref": "#/components/schemas/social.clippr.actor.defs.preferences" 205 + } 206 + } 207 + } 208 + } 209 + } 210 + }, 211 + "responses": { 212 + "200": { 213 + "description": "OK" 214 + }, 215 + "400": { 216 + "description": "Bad Request", 217 + "content": { 218 + "application/json": { 219 + "schema": { 220 + "type": "object", 221 + "properties": { 222 + "error": { 223 + "type": "string", 224 + "oneOf": [ 225 + { 226 + "const": "InvalidRequest" 227 + }, 228 + { 229 + "const": "ExpiredToken" 230 + }, 231 + { 232 + "const": "InvalidToken" 233 + } 234 + ], 235 + "description": "A general error code" 236 + }, 237 + "message": { 238 + "type": "string", 239 + "description": "A detailed description of the error" 240 + } 241 + } 242 + } 243 + } 244 + } 245 + }, 246 + "401": { 247 + "description": "Unauthorized", 248 + "content": { 249 + "application/json": { 250 + "schema": { 251 + "type": "object", 252 + "properties": { 253 + "error": { 254 + "type": "string", 255 + "description": "A general error code", 256 + "oneOf": [ 257 + { 258 + "const": "AuthMissing" 259 + } 260 + ] 261 + }, 262 + "message": { 263 + "type": "string", 264 + "description": "A detailed description of the error" 265 + } 266 + } 267 + } 268 + } 269 + } 270 + } 271 + } 272 + } 273 + }, 274 + "/xrpc/social.clippr.actor.searchClips": { 275 + "get": { 276 + "tags": ["Clips"], 277 + "summary": "Search clips", 278 + "operationId": "social.clippr.actor.searchClips", 279 + "description": "Find clips matching search criteria.", 280 + "parameters": [ 281 + { 282 + "name": "q", 283 + "in": "query", 284 + "description": "Search query string", 285 + "required": true, 286 + "schema": { 287 + "type": "string", 288 + "description": "Search query string" 289 + } 290 + }, 291 + { 292 + "name": "limit", 293 + "in": "query", 294 + "description": "How many clips to return in the query output", 295 + "required": false, 296 + "schema": { 297 + "type": "integer", 298 + "minimum": 1, 299 + "maximum": 100, 300 + "default": 25 301 + } 302 + }, 303 + { 304 + "name": "actor", 305 + "in": "query", 306 + "description": "An actor to filter results to", 307 + "required": false, 308 + "schema": { 309 + "type": "string", 310 + "description": "An actor to filter results to", 311 + "format": "at-identifier" 312 + } 313 + }, 314 + { 315 + "name": "cursor", 316 + "in": "query", 317 + "description": "A parameter to paginate results", 318 + "required": false, 319 + "schema": { 320 + "type": "string", 321 + "description": "A parameter to paginate results" 322 + } 323 + } 324 + ], 325 + "responses": { 326 + "200": { 327 + "description": "OK", 328 + "content": { 329 + "application/json": { 330 + "schema": { 331 + "type": "object", 332 + "properties": { 333 + "cursor": { 334 + "type": "string", 335 + "description": "A parameter to paginate results" 336 + }, 337 + "clips": { 338 + "type": "array", 339 + "items": { 340 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 341 + } 342 + } 343 + } 344 + } 345 + } 346 + } 347 + }, 348 + "400": { 349 + "description": "Bad Request", 350 + "content": { 351 + "application/json": { 352 + "schema": { 353 + "type": "object", 354 + "properties": { 355 + "error": { 356 + "type": "string", 357 + "description": "A general error code", 358 + "oneOf": [ 359 + { 360 + "const": "InvalidRequest" 361 + } 362 + ] 363 + }, 364 + "message": { 365 + "type": "string", 366 + "description": "A detailed description of the error" 367 + } 368 + } 369 + } 370 + } 371 + } 372 + } 373 + } 374 + } 375 + }, 376 + "/xrpc/social.clippr.actor.searchProfiles": { 377 + "get": { 378 + "tags": ["Profile"], 379 + "summary": "Search profiles", 380 + "operationId": "social.clippr.actor.searchProfiles", 381 + "description": "Find profiles matching search criteria.", 382 + "parameters": [ 383 + { 384 + "name": "q", 385 + "in": "query", 386 + "description": "Search query string", 387 + "required": false, 388 + "schema": { 389 + "type": "string", 390 + "description": "Search query string" 391 + } 392 + }, 393 + { 394 + "name": "limit", 395 + "in": "query", 396 + "description": "The number of profiles to be returned in the query", 397 + "required": false, 398 + "schema": { 399 + "type": "integer", 400 + "minimum": 1, 401 + "maximum": 100, 402 + "default": 25 403 + } 404 + }, 405 + { 406 + "name": "cursor", 407 + "in": "query", 408 + "description": "A parameter used for pagination", 409 + "required": false, 410 + "schema": { 411 + "type": "string", 412 + "description": "A parameter used for pagination" 413 + } 414 + } 415 + ], 416 + "responses": { 417 + "200": { 418 + "description": "OK", 419 + "content": { 420 + "application/json": { 421 + "schema": { 422 + "type": "object", 423 + "properties": { 424 + "cursor": { 425 + "type": "string", 426 + "description": "A parameter used for pagination" 427 + }, 428 + "actors": { 429 + "type": "array", 430 + "items": { 431 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 432 + } 433 + } 434 + } 435 + } 436 + } 437 + } 438 + }, 439 + "400": { 440 + "description": "Bad Request", 441 + "content": { 442 + "application/json": { 443 + "schema": { 444 + "type": "object", 445 + "properties": { 446 + "error": { 447 + "type": "string", 448 + "description": "A general error code", 449 + "oneOf": [ 450 + { 451 + "const": "InvalidRequest" 452 + } 453 + ] 454 + }, 455 + "message": { 456 + "type": "string", 457 + "description": "A detailed description of the error" 458 + } 459 + } 460 + } 461 + } 462 + } 463 + } 464 + } 465 + } 466 + }, 467 + "/xrpc/social.clippr.actor.searchTags": { 468 + "get": { 469 + "tags": ["Tags"], 470 + "summary": "Search tags", 471 + "operationId": "social.clippr.actor.searchTags", 472 + "description": "Find tags matching search criteria.", 473 + "parameters": [ 474 + { 475 + "name": "q", 476 + "in": "query", 477 + "description": "Search query string", 478 + "required": true, 479 + "schema": { 480 + "type": "string", 481 + "description": "Search query string" 482 + } 483 + }, 484 + { 485 + "name": "limit", 486 + "in": "query", 487 + "description": "How many tags to return in the query output", 488 + "required": false, 489 + "schema": { 490 + "type": "integer", 491 + "minimum": 1, 492 + "maximum": 100, 493 + "default": 25 494 + } 495 + }, 496 + { 497 + "name": "actor", 498 + "in": "query", 499 + "description": "An actor to filter results to", 500 + "required": false, 501 + "schema": { 502 + "type": "string", 503 + "description": "An actor to filter results to", 504 + "format": "at-identifier" 505 + } 506 + }, 507 + { 508 + "name": "cursor", 509 + "in": "query", 510 + "description": "A parameter to paginate results", 511 + "required": false, 512 + "schema": { 513 + "type": "string", 514 + "description": "A parameter to paginate results" 515 + } 516 + } 517 + ], 518 + "responses": { 519 + "200": { 520 + "description": "OK", 521 + "content": { 522 + "application/json": { 523 + "schema": { 524 + "type": "object", 525 + "properties": { 526 + "cursor": { 527 + "type": "string", 528 + "description": "A parameter to paginate results" 529 + }, 530 + "tags": { 531 + "type": "array", 532 + "items": { 533 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 534 + } 535 + } 536 + } 537 + } 538 + } 539 + } 540 + }, 541 + "400": { 542 + "description": "Bad Request", 543 + "content": { 544 + "application/json": { 545 + "schema": { 546 + "type": "object", 547 + "properties": { 548 + "error": { 549 + "type": "string", 550 + "description": "A general error code", 551 + "oneOf": [ 552 + { 553 + "const": "InvalidRequest" 554 + } 555 + ] 556 + }, 557 + "message": { 558 + "type": "string", 559 + "description": "A detailed description of the error" 560 + } 561 + } 562 + } 563 + } 564 + } 565 + } 566 + } 567 + } 568 + }, 569 + "/xrpc/social.clippr.feed.getClips": { 570 + "get": { 571 + "tags": ["Clips"], 572 + "summary": "Get clips", 573 + "operationId": "social.clippr.feed.getClips", 574 + "description": "Get the hydrated views of a list of clips from their AT URIs.", 575 + "parameters": [ 576 + { 577 + "name": "uris", 578 + "in": "query", 579 + "description": "List of tag AT-URIs to return hydrated views for", 580 + "required": true, 581 + "schema": { 582 + "type": "array", 583 + "items": { 584 + "type": "string", 585 + "format": "at-uri" 586 + }, 587 + "maxItems": 25 588 + } 589 + } 590 + ], 591 + "responses": { 592 + "200": { 593 + "description": "OK", 594 + "content": { 595 + "application/json": { 596 + "schema": { 597 + "type": "array", 598 + "items": { 599 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 600 + } 601 + } 602 + } 603 + } 604 + }, 605 + "400": { 606 + "description": "Bad Request", 607 + "content": { 608 + "application/json": { 609 + "schema": { 610 + "type": "object", 611 + "properties": { 612 + "error": { 613 + "type": "string", 614 + "description": "A general error code", 615 + "oneOf": [ 616 + { 617 + "const": "InvalidRequest" 618 + } 619 + ] 620 + }, 621 + "message": { 622 + "type": "string", 623 + "description": "A detailed description of the error" 624 + } 625 + } 626 + } 627 + } 628 + } 629 + } 630 + } 631 + } 632 + }, 633 + "/xrpc/social.clippr.feed.getTags": { 634 + "get": { 635 + "tags": ["Tags"], 636 + "summary": "Get tags", 637 + "operationId": "social.clippr.feed.getTags", 638 + "description": "Get a the hydrated views of a list of tags from their AT URIs.", 639 + "parameters": [ 640 + { 641 + "name": "uris", 642 + "in": "query", 643 + "description": "List of tag AT-URIs to return hydrated views for", 644 + "required": true, 645 + "schema": { 646 + "type": "array", 647 + "items": { 648 + "type": "string", 649 + "format": "at-uri" 650 + }, 651 + "maxItems": 25 652 + } 653 + } 654 + ], 655 + "responses": { 656 + "200": { 657 + "description": "OK", 658 + "content": { 659 + "application/json": { 660 + "schema": { 661 + "type": "array", 662 + "items": { 663 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 664 + } 665 + } 666 + } 667 + } 668 + }, 669 + "400": { 670 + "description": "Bad Request", 671 + "content": { 672 + "application/json": { 673 + "schema": { 674 + "type": "object", 675 + "properties": { 676 + "error": { 57 677 "type": "string", 58 - "description": "The decentralized identifier associated to the profile.", 59 - "example": "did:plc:z72i7hdynmk6r22z27h6tvur" 678 + "description": "A general error code", 679 + "oneOf": [ 680 + { 681 + "const": "InvalidRequest" 682 + } 683 + ] 60 684 }, 61 - "handle": { 685 + "message": { 62 686 "type": "string", 63 - "description": "The handle associated to the profile.", 64 - "example": "alice.bsky.social" 687 + "description": "A detailed description of the error" 688 + } 689 + } 690 + } 691 + } 692 + } 693 + } 694 + } 695 + } 696 + }, 697 + "/xrpc/social.clippr.feed.getProfileClips": { 698 + "get": { 699 + "tags": ["Clips"], 700 + "summary": "Get a profile's clip feed", 701 + "operationId": "social.clippr.feed.getProfileClips", 702 + "description": "Get a view of a profile's reverse-chronological clips feed.", 703 + "parameters": [ 704 + { 705 + "name": "actor", 706 + "in": "query", 707 + "description": "An actor to get feed data from", 708 + "required": true, 709 + "schema": { 710 + "type": "string", 711 + "description": "An actor to get feed data from", 712 + "format": "at-identifier" 713 + } 714 + }, 715 + { 716 + "name": "limit", 717 + "in": "query", 718 + "description": "How many results to return with the query", 719 + "required": false, 720 + "schema": { 721 + "type": "integer", 722 + "minimum": 1, 723 + "maximum": 100, 724 + "default": 50 725 + } 726 + }, 727 + { 728 + "name": "cursor", 729 + "in": "query", 730 + "description": "A parameter to paginate results", 731 + "required": false, 732 + "schema": { 733 + "type": "string", 734 + "description": "A parameter to paginate results" 735 + } 736 + }, 737 + { 738 + "name": "filter", 739 + "in": "query", 740 + "description": "What types to include in response", 741 + "required": false, 742 + "schema": { 743 + "type": "string", 744 + "description": "What types of clips to include in response", 745 + "default": "all_clips", 746 + "enum": ["all_clips", "tagged_clips", "untagged_clips"] 747 + } 748 + } 749 + ], 750 + "responses": { 751 + "200": { 752 + "description": "OK", 753 + "content": { 754 + "application/json": { 755 + "schema": { 756 + "type": "object", 757 + "properties": { 758 + "cursor": { 759 + "type": "string" 65 760 }, 66 - "displayName": { 761 + "feed": { 762 + "type": "array", 763 + "items": { 764 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 765 + } 766 + } 767 + } 768 + } 769 + } 770 + } 771 + }, 772 + "400": { 773 + "description": "Bad Request", 774 + "content": { 775 + "application/json": { 776 + "schema": { 777 + "type": "object", 778 + "properties": { 779 + "error": { 67 780 "type": "string", 68 - "description": "The display name associated to the profile.", 69 - "example": "Alice" 781 + "description": "A general error code", 782 + "oneOf": [ 783 + { 784 + "const": "InvalidRequest" 785 + } 786 + ] 70 787 }, 71 - "avatar": { 788 + "message": { 72 789 "type": "string", 73 - "format": "uri", 74 - "description": "A URI linking to an JPEG or PNG file.", 75 - "example": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:b6bhzquz665p6bgjuaqz6xjp/bafkreicoqygyiqhhmjod4hvezo3besjyza24neldcxkz55keos3dg5mmj4@jpeg" 790 + "description": "A detailed description of the error" 791 + } 792 + } 793 + } 794 + } 795 + } 796 + } 797 + } 798 + } 799 + }, 800 + "/xrpc/social.clippr.feed.getProfileTags": { 801 + "get": { 802 + "tags": ["Tags"], 803 + "summary": "Get a profile's tag feed", 804 + "operationId": "social.clippr.feed.getProfileTags", 805 + "description": "Get a view of a profile's reverse-chronological clips feed.", 806 + "parameters": [ 807 + { 808 + "name": "actor", 809 + "in": "query", 810 + "description": "An actor to get feed data from", 811 + "required": true, 812 + "schema": { 813 + "type": "string", 814 + "description": "An actor to get feed data from", 815 + "format": "at-identifier" 816 + } 817 + }, 818 + { 819 + "name": "limit", 820 + "in": "query", 821 + "description": "How many results to return with the query", 822 + "required": false, 823 + "schema": { 824 + "type": "integer", 825 + "minimum": 1, 826 + "maximum": 100, 827 + "default": 50 828 + } 829 + }, 830 + { 831 + "name": "cursor", 832 + "in": "query", 833 + "description": "A parameter to paginate results", 834 + "required": false, 835 + "schema": { 836 + "type": "string", 837 + "description": "A parameter to paginate results" 838 + } 839 + } 840 + ], 841 + "responses": { 842 + "200": { 843 + "description": "OK", 844 + "content": { 845 + "application/json": { 846 + "schema": { 847 + "type": "object", 848 + "properties": { 849 + "cursor": { 850 + "type": "string" 76 851 }, 77 - "description": { 852 + "feed": { 853 + "type": "array", 854 + "items": { 855 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 856 + } 857 + } 858 + } 859 + } 860 + } 861 + } 862 + }, 863 + "400": { 864 + "description": "Bad Request", 865 + "content": { 866 + "application/json": { 867 + "schema": { 868 + "type": "object", 869 + "properties": { 870 + "error": { 78 871 "type": "string", 79 - "description": "A biography associated to the profile.", 80 - "example": "This is an example bio." 872 + "description": "A general error code", 873 + "oneOf": [ 874 + { 875 + "const": "InvalidRequest" 876 + } 877 + ] 81 878 }, 82 - "createdAt": { 879 + "message": { 83 880 "type": "string", 84 - "format": "date-time", 85 - "description": "The date and time of the creation of the profile record." 881 + "description": "A detailed description of the error" 882 + } 883 + } 884 + } 885 + } 886 + } 887 + } 888 + } 889 + } 890 + }, 891 + "/xrpc/social.clippr.feed.getTagList": { 892 + "get": { 893 + "tags": ["Tags"], 894 + "summary": "Get a profile's tag list", 895 + "operationId": "social.clippr.feed.getProfileTags", 896 + "description": "Get a profile's complete list of tags.", 897 + "parameters": [ 898 + { 899 + "name": "actor", 900 + "in": "query", 901 + "description": "An actor to fetch the tag list from", 902 + "required": false, 903 + "schema": { 904 + "type": "string", 905 + "description": "An actor to fetch the tag list from", 906 + "format": "at-identifier" 907 + } 908 + } 909 + ], 910 + "responses": { 911 + "200": { 912 + "description": "OK", 913 + "content": { 914 + "application/json": { 915 + "schema": { 916 + "type": "object", 917 + "properties": { 918 + "tags": { 919 + "type": "array", 920 + "items": { 921 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 922 + } 86 923 } 87 924 } 88 925 } ··· 98 935 "properties": { 99 936 "error": { 100 937 "type": "string", 101 - "description": "A general error code.", 102 - "example": "InvalidRequest" 938 + "description": "A general error code", 939 + "oneOf": [ 940 + { 941 + "error": "InvalidRequest" 942 + } 943 + ] 103 944 }, 104 945 "message": { 105 946 "type": "string", 106 - "description": "A detailed description of the error.", 107 - "example": "Error: Parameters must have the actor property included" 947 + "description": "A detailed description of the error" 108 948 } 109 949 } 110 950 } 111 951 } 112 952 } 113 953 } 114 - }, 115 - "tags": ["Profile"] 954 + } 116 955 } 117 956 }, 118 957 "/xrpc/_health": { ··· 129 968 "properties": { 130 969 "version": { 131 970 "type": "string", 132 - "description": "The version number of the AppView.", 133 - "example": "0.1.0" 971 + "description": "The version number of the AppView." 134 972 } 135 973 } 136 974 } ··· 139 977 } 140 978 }, 141 979 "tags": ["Misc"] 980 + } 981 + } 982 + }, 983 + "components": { 984 + "schemas": { 985 + "com.atproto.repo.strongRef": { 986 + "type": "object", 987 + "required": ["uri", "cid"], 988 + "properties": { 989 + "uri": { 990 + "type": "string", 991 + "format": "at-uri" 992 + }, 993 + "cid": { 994 + "type": "string", 995 + "format": "cid" 996 + } 997 + } 998 + }, 999 + "social.clippr.actor.defs.profileView": { 1000 + "type": "object", 1001 + "description": "A view of an actor's profile", 1002 + "required": ["did", "handle", "displayName"], 1003 + "properties": { 1004 + "did": { 1005 + "type": "string", 1006 + "description": "The DID of the profile", 1007 + "format": "did" 1008 + }, 1009 + "handle": { 1010 + "type": "string", 1011 + "description": "The handle of the profile", 1012 + "format": "handle" 1013 + }, 1014 + "displayName": { 1015 + "type": "string", 1016 + "description": "The display name associated to the profile", 1017 + "maxLength": 64 1018 + }, 1019 + "description": { 1020 + "type": "string", 1021 + "description": "The biography associated to the profile", 1022 + "maxLength": 500 1023 + }, 1024 + "avatar": { 1025 + "type": "string", 1026 + "description": "A link to the profile's avatar", 1027 + "format": "uri" 1028 + }, 1029 + "createdAt": { 1030 + "type": "string", 1031 + "description": "When the profile record was first created", 1032 + "format": "date-time" 1033 + } 1034 + } 1035 + }, 1036 + "social.clippr.actor.defs.preferences": { 1037 + "type": "array", 1038 + "items": { 1039 + "oneOf": [ 1040 + { 1041 + "$ref": "#/components/schemas/social.clippr.actor.defs.publishingScopesPref" 1042 + } 1043 + ] 1044 + } 1045 + }, 1046 + "social.clippr.actor.defs.publishingScopesPref": { 1047 + "type": "object", 1048 + "description": "Preferences for a user's publishing scopes", 1049 + "required": ["defaultScope"], 1050 + "properties": { 1051 + "defaultScope": { 1052 + "type": "string", 1053 + "description": "What publishing scope to mark a clip as by default", 1054 + "enum": ["public", "unlisted"] 1055 + } 1056 + } 1057 + }, 1058 + "social.clippr.feed.defs.clipView": { 1059 + "type": "object", 1060 + "description": "A view of a single bookmark (or 'clip')", 1061 + "required": ["uri", "cid", "author", "record", "indexedAt"], 1062 + "properties": { 1063 + "uri": { 1064 + "type": "string", 1065 + "description": "The AT-URI of the clip", 1066 + "format": "at-uri" 1067 + }, 1068 + "cid": { 1069 + "type": "string", 1070 + "description": "The CID of the clip", 1071 + "format": "cid" 1072 + }, 1073 + "author": { 1074 + "description": "A reference to the actor's profile", 1075 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 1076 + }, 1077 + "record": { 1078 + "type": "object", 1079 + "description": "The raw record of the clip" 1080 + }, 1081 + "indexedAt": { 1082 + "type": "string", 1083 + "description": "The time in which the clip's record was indexed by the AppView", 1084 + "format": "date-time" 1085 + } 1086 + } 1087 + }, 1088 + "social.clippr.feed.defs.tagView": { 1089 + "type": "object", 1090 + "description": "A view of a single tag", 1091 + "required": ["uri", "cid", "author", "record", "indexedAt"], 1092 + "properties": { 1093 + "uri": { 1094 + "type": "string", 1095 + "description": "The AT-URI to the tag", 1096 + "format": "at-uri" 1097 + }, 1098 + "cid": { 1099 + "type": "string", 1100 + "description": "The CID of the tag", 1101 + "format": "cid" 1102 + }, 1103 + "author": { 1104 + "description": "A reference to the actor's profile", 1105 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 1106 + }, 1107 + "record": { 1108 + "type": "object", 1109 + "description": "The raw record of the clip" 1110 + }, 1111 + "indexedAt": { 1112 + "type": "string", 1113 + "description": "The time in which the tag's record was indexed by the AppView", 1114 + "format": "date-time" 1115 + } 1116 + } 1117 + }, 1118 + "social.clippr.actor.profile": { 1119 + "type": "object", 1120 + "required": ["createdAt", "displayName"], 1121 + "properties": { 1122 + "displayName": { 1123 + "type": "string", 1124 + "description": "A display name to be shown on a profile", 1125 + "maxLength": 64 1126 + }, 1127 + "description": { 1128 + "type": "string", 1129 + "description": "Text for user to describe themselves", 1130 + "maxLength": 500 1131 + }, 1132 + "avatar": { 1133 + "type": "blob", 1134 + "maxSize": 1000000, 1135 + "description": "Image to show on user's profiles" 1136 + }, 1137 + "createdAt": { 1138 + "type": "string", 1139 + "description": "The creation date of the profile", 1140 + "format": "date-time" 1141 + } 1142 + } 1143 + }, 1144 + "social.clippr.feed.clip": { 1145 + "type": "object", 1146 + "required": ["url", "title", "description", "unlisted", "createdAt"], 1147 + "properties": { 1148 + "url": { 1149 + "type": "string", 1150 + "description": "The URL of the bookmark. Cannot be left empty or be modified after creation.", 1151 + "format": "uri", 1152 + "maxLength": 2000 1153 + }, 1154 + "title": { 1155 + "type": "string", 1156 + "description": "The title of the bookmark. If left empty, reuse the URL.", 1157 + "maxLength": 2048 1158 + }, 1159 + "description": { 1160 + "type": "string", 1161 + "description": "A description of the bookmark's content. This should be ripped from the URL metadata and be static for all records using the URL.", 1162 + "maxLength": 4096 1163 + }, 1164 + "notes": { 1165 + "type": "string", 1166 + "description": "User-written notes for the bookmark. Public and personal.", 1167 + "maxLength": 10000 1168 + }, 1169 + "tags": { 1170 + "type": "array", 1171 + "description": "An array of tags. A format of solely alphanumeric characters and dashes should be used.", 1172 + "items": { 1173 + "$ref": "#/components/schemas/com.atproto.repo.strongRef" 1174 + } 1175 + }, 1176 + "unlisted": { 1177 + "type": "boolean", 1178 + "description": "Whether the bookmark can be used for feed indexing and aggregation" 1179 + }, 1180 + "unread": { 1181 + "type": "boolean", 1182 + "description": "Whether the bookmark has been read by the user", 1183 + "default": true 1184 + }, 1185 + "languages": { 1186 + "type": "array", 1187 + "items": { 1188 + "type": "string", 1189 + "format": "language" 1190 + }, 1191 + "maxItems": 5 1192 + }, 1193 + "createdAt": { 1194 + "type": "string", 1195 + "description": "Client-declared timestamp when the bookmark is created", 1196 + "format": "date-time" 1197 + } 1198 + } 1199 + }, 1200 + "social.clippr.feed.tag": { 1201 + "type": "object", 1202 + "required": ["name", "createdAt"], 1203 + "properties": { 1204 + "name": { 1205 + "type": "string", 1206 + "description": "A de-duplicated string containing the name of the tag", 1207 + "maxLength": 64 1208 + }, 1209 + "color": { 1210 + "type": "string", 1211 + "description": "A hexadecimal color code", 1212 + "maxLength": 7 1213 + }, 1214 + "description": { 1215 + "type": "string", 1216 + "description": "A description of the tag for additional context", 1217 + "maxLength": 5000 1218 + }, 1219 + "createdAt": { 1220 + "type": "string", 1221 + "description": "A client-defined timestamp for the creation of the tag", 1222 + "format": "date-time" 1223 + } 1224 + } 142 1225 } 143 1226 } 144 1227 }
+2 -23
frontend/.gitignore
··· 1 - # build output 1 + node_modules/ 2 2 dist/ 3 - # generated types 4 - .astro/ 5 - 6 - # dependencies 7 - node_modules/ 8 - 9 - # logs 10 - npm-debug.log* 11 - yarn-debug.log* 12 - yarn-error.log* 13 - pnpm-debug.log* 14 - 15 - 16 - # environment variables 17 - .env 18 - .env.production 19 - 20 - # macOS-specific files 21 - .DS_Store 22 - 23 - # jetbrains setting folder 24 - .idea/ 3 + did.json
+2
frontend/.prettierignore
··· 1 + pnpm-lock.yaml 2 + dist/*
+24
frontend/.prettierrc
··· 1 + { 2 + "trailingComma": "all", 3 + "useTabs": true, 4 + "tabWidth": 2, 5 + "printWidth": 80, 6 + "semi": true, 7 + "singleQuote": false, 8 + "bracketSpacing": true, 9 + "overrides": [ 10 + { 11 + "files": ["tsconfig.json", "jsconfig.json"], 12 + "options": { 13 + "parser": "jsonc" 14 + } 15 + }, 16 + { 17 + "files": ["*.md"], 18 + "options": { 19 + "printWidth": 100, 20 + "proseWrap": "always" 21 + } 22 + } 23 + ] 24 + }
-4
frontend/.vscode/extensions.json
··· 1 - { 2 - "recommendations": ["astro-build.astro-vscode"], 3 - "unwantedRecommendations": [] 4 - }
-11
frontend/.vscode/launch.json
··· 1 - { 2 - "version": "0.2.0", 3 - "configurations": [ 4 - { 5 - "command": "./node_modules/.bin/astro dev", 6 - "name": "Development server", 7 - "request": "launch", 8 - "type": "node-terminal" 9 - } 10 - ] 11 - }
+24 -5
frontend/README.md
··· 1 1 # @clipprjs/client 2 - astro-based reference frontend for clippr, meant to use as little javascript as possible 2 + 3 + This is a reference implementation for the Clippr frontend using Solid. 4 + 5 + ## development 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. 3 13 4 - ## run 5 - ```bash 14 + ```shell 6 15 pnpm install 7 16 pnpm run dev 8 - # pnpm run build 9 - ``` 17 + ``` 18 + 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. 25 + 26 + ```shell 27 + pnpm run build 28 + ```
-11
frontend/astro.config.mts
··· 1 - /* 2 - * clippr: a social bookmarking service for the AT Protocol 3 - * Copyright (c) 2025 clippr contributors. 4 - * SPDX-License-Identifier: AGPL-3.0-only 5 - */ 6 - 7 - // @ts-check 8 - import { defineConfig } from 'astro/config'; 9 - 10 - // https://astro.build/config 11 - export default defineConfig({});
+34
frontend/index.html
··· 1 + <!-- 2 + ~ clippr: a social bookmarking service for the AT Protocol 3 + ~ Copyright (c) 2025 clippr contributors. 4 + ~ SPDX-License-Identifier: AGPL-3.0-only 5 + --> 6 + 7 + <!doctype html> 8 + <html lang="en"> 9 + <head> 10 + <meta charset="utf-8" /> 11 + <meta name="viewport" content="width=device-width, initial-scale=1" /> 12 + <link rel="icon" type="image/ico" href="src/assets/favicon.ico" /> 13 + <link rel="stylesheet" href="src/styles/index.css" /> 14 + <meta property="og:title" content="clippr" /> 15 + <meta property="og:type" content="website" /> 16 + <meta property="og:url" content="https://clippr.social" /> 17 + <meta 18 + property="og:description" 19 + content="A social bookmarking service for the AT Protocol." 20 + /> 21 + <meta 22 + property="description" 23 + content="A social bookmarking service for the AT Protocol." 24 + /> 25 + <title>clippr</title> 26 + <script src="src/index.tsx" type="module"></script> 27 + </head> 28 + <body id="root"> 29 + <noscript 30 + >You need to enable JavaScript to run this app. Yes, we know this is 31 + inconvenient.</noscript 32 + > 33 + </body> 34 + </html>
+30 -13
frontend/package.json
··· 1 1 { 2 - "name": "@clipprjs/client", 3 - "type": "module", 4 - "version": "0.1.0", 5 - "scripts": { 6 - "dev": "astro dev", 7 - "build": "astro build", 8 - "preview": "astro preview", 9 - "astro": "astro" 10 - }, 11 - "dependencies": { 12 - "astro": "^5.9.1" 13 - } 14 - } 2 + "name": "@clipprjs/client", 3 + "version": "0.1.0", 4 + "description": "Reference implementation frontend for Clippr", 5 + "type": "module", 6 + "scripts": { 7 + "start": "vite", 8 + "dev": "vite", 9 + "build": "vite build", 10 + "serve": "vite preview", 11 + "fmt": "pnpm exec prettier --write ." 12 + }, 13 + "license": "AGPL-3.0-only", 14 + "devDependencies": { 15 + "@types/node": "^24.3.0", 16 + "prettier": "^3.6.2", 17 + "solid-devtools": "^0.34.3", 18 + "typescript": "^5.9.2", 19 + "vite": "^6.3.5", 20 + "vite-plugin-solid": "^2.11.8" 21 + }, 22 + "dependencies": { 23 + "@atcute/client": "^4.0.3", 24 + "@atcute/identity-resolver": "^1.1.3", 25 + "@atcute/lexicons": "^1.1.1", 26 + "@atcute/oauth-browser-client": "^1.0.26", 27 + "@mary/exif-rm": "jsr:^0.2.2", 28 + "@solidjs/router": "^0.15.3", 29 + "solid-js": "^1.9.9" 30 + } 31 + }
+844 -2472
frontend/pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 - astro: 12 - specifier: ^5.9.1 13 - version: 5.9.1(@types/node@22.15.30)(rollup@4.42.0)(typescript@5.8.3) 11 + '@atcute/client': 12 + specifier: ^4.0.3 13 + version: 4.0.3 14 + '@atcute/identity-resolver': 15 + specifier: ^1.1.3 16 + version: 1.1.3(@atcute/identity@1.0.3) 17 + '@atcute/lexicons': 18 + specifier: ^1.1.1 19 + version: 1.1.1 20 + '@atcute/oauth-browser-client': 21 + specifier: ^1.0.26 22 + version: 1.0.26 23 + '@mary/exif-rm': 24 + specifier: jsr:^0.2.2 25 + version: '@jsr/mary__exif-rm@0.2.2' 26 + '@solidjs/router': 27 + specifier: ^0.15.3 28 + version: 0.15.3(solid-js@1.9.9) 29 + solid-js: 30 + specifier: ^1.9.9 31 + version: 1.9.9 32 + devDependencies: 33 + '@types/node': 34 + specifier: ^24.3.0 35 + version: 24.3.0 36 + prettier: 37 + specifier: ^3.6.2 38 + version: 3.6.2 39 + solid-devtools: 40 + specifier: ^0.34.3 41 + version: 0.34.3(solid-js@1.9.9)(vite@6.3.5(@types/node@24.3.0)) 42 + typescript: 43 + specifier: ^5.9.2 44 + version: 5.9.2 45 + vite: 46 + specifier: ^6.3.5 47 + version: 6.3.5(@types/node@24.3.0) 48 + vite-plugin-solid: 49 + specifier: ^2.11.8 50 + version: 2.11.8(solid-js@1.9.9)(vite@6.3.5(@types/node@24.3.0)) 14 51 15 52 packages: 16 53 17 - '@astrojs/compiler@2.12.1': 18 - resolution: {integrity: sha512-WDSyVIiz7sNcJcCJxJFITu6XjfGhJ50Z0auyaWsrM+xb07IlhBLFtQuDkNy0caVHWNcKTM2LISAaHhgkRqGAVg==} 54 + '@ampproject/remapping@2.3.0': 55 + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 56 + engines: {node: '>=6.0.0'} 19 57 20 - '@astrojs/internal-helpers@0.6.1': 21 - resolution: {integrity: sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==} 58 + '@atcute/client@4.0.3': 59 + resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 22 60 23 - '@astrojs/markdown-remark@6.3.2': 24 - resolution: {integrity: sha512-bO35JbWpVvyKRl7cmSJD822e8YA8ThR/YbUsciWNA7yTcqpIAL2hJDToWP5KcZBWxGT6IOdOkHSXARSNZc4l/Q==} 61 + '@atcute/identity-resolver@1.1.3': 62 + resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==} 63 + peerDependencies: 64 + '@atcute/identity': ^1.0.0 25 65 26 - '@astrojs/prism@3.3.0': 27 - resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} 28 - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} 66 + '@atcute/identity@1.0.3': 67 + resolution: {integrity: sha512-mNMxbKHFGys03A8JXKk0KfMBzdd0vrYMzZZWjpw1nYTs0+ea6bo5S1hwqVUZxHdo1gFHSe/t63jxQIF4yL9aKw==} 29 68 30 - '@astrojs/telemetry@3.3.0': 31 - resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} 32 - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} 69 + '@atcute/lexicons@1.1.1': 70 + resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==} 71 + 72 + '@atcute/multibase@1.1.4': 73 + resolution: {integrity: sha512-NUf5AeeSOmuZHGU+4GAaMtISJoG+ZHtW/vUVA4lK/YDt/7LODAW0Fd0NNIIUPVUoW0xJS6zSEIWvwLLuxmEHhA==} 74 + 75 + '@atcute/oauth-browser-client@1.0.26': 76 + resolution: {integrity: sha512-z8VUmwRO1sFu5Dq1qYQOQLenkTSNaOyzlUZhVwFR41ru+AP84MS5UHHW/NsdC1xJAq1v6mlLySJ+pjxdDW8IYA==} 77 + 78 + '@atcute/uint8array@1.0.3': 79 + resolution: {integrity: sha512-M/K+ihiVW8Pl2PFLzaC4E3l4JaZ1IH05Q0AbPWUC4cVHnd/gZ/1kAF5ngdtGvJeDMirHZ2VAy7OmAsPwR/2nlA==} 80 + 81 + '@atcute/util-fetch@1.0.1': 82 + resolution: {integrity: sha512-Clc0E/5ufyGBVfYBUwWNlHONlZCoblSr4Ho50l1LhmRPGB1Wu/AQ9Sz+rsBg7fdaW/auve8ulmwhRhnX2cGRow==} 83 + 84 + '@babel/code-frame@7.27.1': 85 + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 86 + engines: {node: '>=6.9.0'} 87 + 88 + '@babel/compat-data@7.28.0': 89 + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 90 + engines: {node: '>=6.9.0'} 91 + 92 + '@babel/core@7.28.3': 93 + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} 94 + engines: {node: '>=6.9.0'} 95 + 96 + '@babel/generator@7.28.3': 97 + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} 98 + engines: {node: '>=6.9.0'} 99 + 100 + '@babel/helper-compilation-targets@7.27.2': 101 + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 102 + engines: {node: '>=6.9.0'} 103 + 104 + '@babel/helper-globals@7.28.0': 105 + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 106 + engines: {node: '>=6.9.0'} 107 + 108 + '@babel/helper-module-imports@7.18.6': 109 + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 110 + engines: {node: '>=6.9.0'} 111 + 112 + '@babel/helper-module-imports@7.27.1': 113 + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 114 + engines: {node: '>=6.9.0'} 115 + 116 + '@babel/helper-module-transforms@7.28.3': 117 + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 118 + engines: {node: '>=6.9.0'} 119 + peerDependencies: 120 + '@babel/core': ^7.0.0 121 + 122 + '@babel/helper-plugin-utils@7.27.1': 123 + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 124 + engines: {node: '>=6.9.0'} 33 125 34 126 '@babel/helper-string-parser@7.27.1': 35 127 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} ··· 39 131 resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 40 132 engines: {node: '>=6.9.0'} 41 133 42 - '@babel/parser@7.27.5': 43 - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} 134 + '@babel/helper-validator-option@7.27.1': 135 + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 136 + engines: {node: '>=6.9.0'} 137 + 138 + '@babel/helpers@7.28.3': 139 + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} 140 + engines: {node: '>=6.9.0'} 141 + 142 + '@babel/parser@7.28.3': 143 + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} 44 144 engines: {node: '>=6.0.0'} 45 145 hasBin: true 46 146 47 - '@babel/types@7.27.6': 48 - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} 147 + '@babel/plugin-syntax-jsx@7.27.1': 148 + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} 49 149 engines: {node: '>=6.9.0'} 150 + peerDependencies: 151 + '@babel/core': ^7.0.0-0 50 152 51 - '@capsizecss/unpack@2.4.0': 52 - resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} 153 + '@babel/plugin-syntax-typescript@7.27.1': 154 + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} 155 + engines: {node: '>=6.9.0'} 156 + peerDependencies: 157 + '@babel/core': ^7.0.0-0 53 158 54 - '@emnapi/runtime@1.4.3': 55 - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} 159 + '@babel/template@7.27.2': 160 + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 161 + engines: {node: '>=6.9.0'} 56 162 57 - '@esbuild/aix-ppc64@0.25.5': 58 - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 163 + '@babel/traverse@7.28.3': 164 + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} 165 + engines: {node: '>=6.9.0'} 166 + 167 + '@babel/types@7.28.2': 168 + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 169 + engines: {node: '>=6.9.0'} 170 + 171 + '@badrap/valita@0.4.6': 172 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 173 + engines: {node: '>= 18'} 174 + 175 + '@esbuild/aix-ppc64@0.25.9': 176 + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} 59 177 engines: {node: '>=18'} 60 178 cpu: [ppc64] 61 179 os: [aix] 62 180 63 - '@esbuild/android-arm64@0.25.5': 64 - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 181 + '@esbuild/android-arm64@0.25.9': 182 + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} 65 183 engines: {node: '>=18'} 66 184 cpu: [arm64] 67 185 os: [android] 68 186 69 - '@esbuild/android-arm@0.25.5': 70 - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 187 + '@esbuild/android-arm@0.25.9': 188 + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} 71 189 engines: {node: '>=18'} 72 190 cpu: [arm] 73 191 os: [android] 74 192 75 - '@esbuild/android-x64@0.25.5': 76 - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 193 + '@esbuild/android-x64@0.25.9': 194 + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} 77 195 engines: {node: '>=18'} 78 196 cpu: [x64] 79 197 os: [android] 80 198 81 - '@esbuild/darwin-arm64@0.25.5': 82 - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 199 + '@esbuild/darwin-arm64@0.25.9': 200 + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} 83 201 engines: {node: '>=18'} 84 202 cpu: [arm64] 85 203 os: [darwin] 86 204 87 - '@esbuild/darwin-x64@0.25.5': 88 - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 205 + '@esbuild/darwin-x64@0.25.9': 206 + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} 89 207 engines: {node: '>=18'} 90 208 cpu: [x64] 91 209 os: [darwin] 92 210 93 - '@esbuild/freebsd-arm64@0.25.5': 94 - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 211 + '@esbuild/freebsd-arm64@0.25.9': 212 + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} 95 213 engines: {node: '>=18'} 96 214 cpu: [arm64] 97 215 os: [freebsd] 98 216 99 - '@esbuild/freebsd-x64@0.25.5': 100 - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 217 + '@esbuild/freebsd-x64@0.25.9': 218 + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} 101 219 engines: {node: '>=18'} 102 220 cpu: [x64] 103 221 os: [freebsd] 104 222 105 - '@esbuild/linux-arm64@0.25.5': 106 - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 223 + '@esbuild/linux-arm64@0.25.9': 224 + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} 107 225 engines: {node: '>=18'} 108 226 cpu: [arm64] 109 227 os: [linux] 110 228 111 - '@esbuild/linux-arm@0.25.5': 112 - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 229 + '@esbuild/linux-arm@0.25.9': 230 + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} 113 231 engines: {node: '>=18'} 114 232 cpu: [arm] 115 233 os: [linux] 116 234 117 - '@esbuild/linux-ia32@0.25.5': 118 - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 235 + '@esbuild/linux-ia32@0.25.9': 236 + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} 119 237 engines: {node: '>=18'} 120 238 cpu: [ia32] 121 239 os: [linux] 122 240 123 - '@esbuild/linux-loong64@0.25.5': 124 - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 241 + '@esbuild/linux-loong64@0.25.9': 242 + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} 125 243 engines: {node: '>=18'} 126 244 cpu: [loong64] 127 245 os: [linux] 128 246 129 - '@esbuild/linux-mips64el@0.25.5': 130 - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 247 + '@esbuild/linux-mips64el@0.25.9': 248 + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} 131 249 engines: {node: '>=18'} 132 250 cpu: [mips64el] 133 251 os: [linux] 134 252 135 - '@esbuild/linux-ppc64@0.25.5': 136 - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 253 + '@esbuild/linux-ppc64@0.25.9': 254 + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} 137 255 engines: {node: '>=18'} 138 256 cpu: [ppc64] 139 257 os: [linux] 140 258 141 - '@esbuild/linux-riscv64@0.25.5': 142 - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 259 + '@esbuild/linux-riscv64@0.25.9': 260 + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} 143 261 engines: {node: '>=18'} 144 262 cpu: [riscv64] 145 263 os: [linux] 146 264 147 - '@esbuild/linux-s390x@0.25.5': 148 - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 265 + '@esbuild/linux-s390x@0.25.9': 266 + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} 149 267 engines: {node: '>=18'} 150 268 cpu: [s390x] 151 269 os: [linux] 152 270 153 - '@esbuild/linux-x64@0.25.5': 154 - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 271 + '@esbuild/linux-x64@0.25.9': 272 + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} 155 273 engines: {node: '>=18'} 156 274 cpu: [x64] 157 275 os: [linux] 158 276 159 - '@esbuild/netbsd-arm64@0.25.5': 160 - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 277 + '@esbuild/netbsd-arm64@0.25.9': 278 + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} 161 279 engines: {node: '>=18'} 162 280 cpu: [arm64] 163 281 os: [netbsd] 164 282 165 - '@esbuild/netbsd-x64@0.25.5': 166 - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 283 + '@esbuild/netbsd-x64@0.25.9': 284 + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} 167 285 engines: {node: '>=18'} 168 286 cpu: [x64] 169 287 os: [netbsd] 170 288 171 - '@esbuild/openbsd-arm64@0.25.5': 172 - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 289 + '@esbuild/openbsd-arm64@0.25.9': 290 + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} 173 291 engines: {node: '>=18'} 174 292 cpu: [arm64] 175 293 os: [openbsd] 176 294 177 - '@esbuild/openbsd-x64@0.25.5': 178 - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 295 + '@esbuild/openbsd-x64@0.25.9': 296 + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} 179 297 engines: {node: '>=18'} 180 298 cpu: [x64] 181 299 os: [openbsd] 182 300 183 - '@esbuild/sunos-x64@0.25.5': 184 - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 301 + '@esbuild/openharmony-arm64@0.25.9': 302 + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} 303 + engines: {node: '>=18'} 304 + cpu: [arm64] 305 + os: [openharmony] 306 + 307 + '@esbuild/sunos-x64@0.25.9': 308 + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} 185 309 engines: {node: '>=18'} 186 310 cpu: [x64] 187 311 os: [sunos] 188 312 189 - '@esbuild/win32-arm64@0.25.5': 190 - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 313 + '@esbuild/win32-arm64@0.25.9': 314 + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} 191 315 engines: {node: '>=18'} 192 316 cpu: [arm64] 193 317 os: [win32] 194 318 195 - '@esbuild/win32-ia32@0.25.5': 196 - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 319 + '@esbuild/win32-ia32@0.25.9': 320 + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} 197 321 engines: {node: '>=18'} 198 322 cpu: [ia32] 199 323 os: [win32] 200 324 201 - '@esbuild/win32-x64@0.25.5': 202 - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 325 + '@esbuild/win32-x64@0.25.9': 326 + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} 203 327 engines: {node: '>=18'} 204 328 cpu: [x64] 205 329 os: [win32] 206 330 207 - '@img/sharp-darwin-arm64@0.33.5': 208 - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} 209 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 210 - cpu: [arm64] 211 - os: [darwin] 331 + '@jridgewell/gen-mapping@0.3.13': 332 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 212 333 213 - '@img/sharp-darwin-x64@0.33.5': 214 - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} 215 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 216 - cpu: [x64] 217 - os: [darwin] 334 + '@jridgewell/resolve-uri@3.1.2': 335 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 336 + engines: {node: '>=6.0.0'} 218 337 219 - '@img/sharp-libvips-darwin-arm64@1.0.4': 220 - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} 221 - cpu: [arm64] 222 - os: [darwin] 338 + '@jridgewell/sourcemap-codec@1.5.5': 339 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 223 340 224 - '@img/sharp-libvips-darwin-x64@1.0.4': 225 - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} 226 - cpu: [x64] 227 - os: [darwin] 341 + '@jridgewell/trace-mapping@0.3.30': 342 + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} 228 343 229 - '@img/sharp-libvips-linux-arm64@1.0.4': 230 - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} 231 - cpu: [arm64] 232 - os: [linux] 344 + '@jsr/mary__exif-rm@0.2.2': 345 + resolution: {integrity: sha512-+ZpLaC+1CyqWhH608Sqd6/yTG0pOlokn2tCXha7s1SMQ+GLKo4Nn/PskTeeP9Pt+6gNYSu6ednoSlRvXb2ZGxg==, tarball: https://npm.jsr.io/~/11/@jsr/mary__exif-rm/0.2.2.tgz} 233 346 234 - '@img/sharp-libvips-linux-arm@1.0.5': 235 - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} 236 - cpu: [arm] 237 - os: [linux] 347 + '@nothing-but/utils@0.17.0': 348 + resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} 238 349 239 - '@img/sharp-libvips-linux-s390x@1.0.4': 240 - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} 241 - cpu: [s390x] 242 - os: [linux] 243 - 244 - '@img/sharp-libvips-linux-x64@1.0.4': 245 - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} 246 - cpu: [x64] 247 - os: [linux] 248 - 249 - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': 250 - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} 251 - cpu: [arm64] 252 - os: [linux] 253 - 254 - '@img/sharp-libvips-linuxmusl-x64@1.0.4': 255 - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} 256 - cpu: [x64] 257 - os: [linux] 258 - 259 - '@img/sharp-linux-arm64@0.33.5': 260 - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} 261 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 262 - cpu: [arm64] 263 - os: [linux] 264 - 265 - '@img/sharp-linux-arm@0.33.5': 266 - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} 267 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 268 - cpu: [arm] 269 - os: [linux] 270 - 271 - '@img/sharp-linux-s390x@0.33.5': 272 - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} 273 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 274 - cpu: [s390x] 275 - os: [linux] 276 - 277 - '@img/sharp-linux-x64@0.33.5': 278 - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} 279 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 280 - cpu: [x64] 281 - os: [linux] 282 - 283 - '@img/sharp-linuxmusl-arm64@0.33.5': 284 - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} 285 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 286 - cpu: [arm64] 287 - os: [linux] 288 - 289 - '@img/sharp-linuxmusl-x64@0.33.5': 290 - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} 291 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 292 - cpu: [x64] 293 - os: [linux] 294 - 295 - '@img/sharp-wasm32@0.33.5': 296 - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} 297 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 298 - cpu: [wasm32] 299 - 300 - '@img/sharp-win32-ia32@0.33.5': 301 - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} 302 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 303 - cpu: [ia32] 304 - os: [win32] 305 - 306 - '@img/sharp-win32-x64@0.33.5': 307 - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} 308 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 309 - cpu: [x64] 310 - os: [win32] 311 - 312 - '@jridgewell/sourcemap-codec@1.5.0': 313 - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 314 - 315 - '@oslojs/encoding@1.1.0': 316 - resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} 317 - 318 - '@rollup/pluginutils@5.1.4': 319 - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 320 - engines: {node: '>=14.0.0'} 321 - peerDependencies: 322 - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 323 - peerDependenciesMeta: 324 - rollup: 325 - optional: true 326 - 327 - '@rollup/rollup-android-arm-eabi@4.42.0': 328 - resolution: {integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==} 350 + '@rollup/rollup-android-arm-eabi@4.47.1': 351 + resolution: {integrity: sha512-lTahKRJip0knffA/GTNFJMrToD+CM+JJ+Qt5kjzBK/sFQ0EWqfKW3AYQSlZXN98tX0lx66083U9JYIMioMMK7g==} 329 352 cpu: [arm] 330 353 os: [android] 331 354 332 - '@rollup/rollup-android-arm64@4.42.0': 333 - resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} 355 + '@rollup/rollup-android-arm64@4.47.1': 356 + resolution: {integrity: sha512-uqxkb3RJLzlBbh/bbNQ4r7YpSZnjgMgyoEOY7Fy6GCbelkDSAzeiogxMG9TfLsBbqmGsdDObo3mzGqa8hps4MA==} 334 357 cpu: [arm64] 335 358 os: [android] 336 359 337 - '@rollup/rollup-darwin-arm64@4.42.0': 338 - resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} 360 + '@rollup/rollup-darwin-arm64@4.47.1': 361 + resolution: {integrity: sha512-tV6reObmxBDS4DDyLzTDIpymthNlxrLBGAoQx6m2a7eifSNEZdkXQl1PE4ZjCkEDPVgNXSzND/k9AQ3mC4IOEQ==} 339 362 cpu: [arm64] 340 363 os: [darwin] 341 364 342 - '@rollup/rollup-darwin-x64@4.42.0': 343 - resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} 365 + '@rollup/rollup-darwin-x64@4.47.1': 366 + resolution: {integrity: sha512-XuJRPTnMk1lwsSnS3vYyVMu4x/+WIw1MMSiqj5C4j3QOWsMzbJEK90zG+SWV1h0B1ABGCQ0UZUjti+TQK35uHQ==} 344 367 cpu: [x64] 345 368 os: [darwin] 346 369 347 - '@rollup/rollup-freebsd-arm64@4.42.0': 348 - resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} 370 + '@rollup/rollup-freebsd-arm64@4.47.1': 371 + resolution: {integrity: sha512-79BAm8Ag/tmJ5asCqgOXsb3WY28Rdd5Lxj8ONiQzWzy9LvWORd5qVuOnjlqiWWZJw+dWewEktZb5yiM1DLLaHw==} 349 372 cpu: [arm64] 350 373 os: [freebsd] 351 374 352 - '@rollup/rollup-freebsd-x64@4.42.0': 353 - resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} 375 + '@rollup/rollup-freebsd-x64@4.47.1': 376 + resolution: {integrity: sha512-OQ2/ZDGzdOOlyfqBiip0ZX/jVFekzYrGtUsqAfLDbWy0jh1PUU18+jYp8UMpqhly5ltEqotc2miLngf9FPSWIA==} 354 377 cpu: [x64] 355 378 os: [freebsd] 356 379 357 - '@rollup/rollup-linux-arm-gnueabihf@4.42.0': 358 - resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} 380 + '@rollup/rollup-linux-arm-gnueabihf@4.47.1': 381 + resolution: {integrity: sha512-HZZBXJL1udxlCVvoVadstgiU26seKkHbbAMLg7680gAcMnRNP9SAwTMVet02ANA94kXEI2VhBnXs4e5nf7KG2A==} 359 382 cpu: [arm] 360 383 os: [linux] 361 384 362 - '@rollup/rollup-linux-arm-musleabihf@4.42.0': 363 - resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} 385 + '@rollup/rollup-linux-arm-musleabihf@4.47.1': 386 + resolution: {integrity: sha512-sZ5p2I9UA7T950JmuZ3pgdKA6+RTBr+0FpK427ExW0t7n+QwYOcmDTK/aRlzoBrWyTpJNlS3kacgSlSTUg6P/Q==} 364 387 cpu: [arm] 365 388 os: [linux] 366 389 367 - '@rollup/rollup-linux-arm64-gnu@4.42.0': 368 - resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} 390 + '@rollup/rollup-linux-arm64-gnu@4.47.1': 391 + resolution: {integrity: sha512-3hBFoqPyU89Dyf1mQRXCdpc6qC6At3LV6jbbIOZd72jcx7xNk3aAp+EjzAtN6sDlmHFzsDJN5yeUySvorWeRXA==} 369 392 cpu: [arm64] 370 393 os: [linux] 371 394 372 - '@rollup/rollup-linux-arm64-musl@4.42.0': 373 - resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} 395 + '@rollup/rollup-linux-arm64-musl@4.47.1': 396 + resolution: {integrity: sha512-49J4FnMHfGodJWPw73Ve+/hsPjZgcXQGkmqBGZFvltzBKRS+cvMiWNLadOMXKGnYRhs1ToTGM0sItKISoSGUNA==} 374 397 cpu: [arm64] 375 398 os: [linux] 376 399 377 - '@rollup/rollup-linux-loongarch64-gnu@4.42.0': 378 - resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} 400 + '@rollup/rollup-linux-loongarch64-gnu@4.47.1': 401 + resolution: {integrity: sha512-4yYU8p7AneEpQkRX03pbpLmE21z5JNys16F1BZBZg5fP9rIlb0TkeQjn5du5w4agConCCEoYIG57sNxjryHEGg==} 379 402 cpu: [loong64] 380 403 os: [linux] 381 404 382 - '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': 383 - resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} 405 + '@rollup/rollup-linux-ppc64-gnu@4.47.1': 406 + resolution: {integrity: sha512-fAiq+J28l2YMWgC39jz/zPi2jqc0y3GSRo1yyxlBHt6UN0yYgnegHSRPa3pnHS5amT/efXQrm0ug5+aNEu9UuQ==} 384 407 cpu: [ppc64] 385 408 os: [linux] 386 409 387 - '@rollup/rollup-linux-riscv64-gnu@4.42.0': 388 - resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} 410 + '@rollup/rollup-linux-riscv64-gnu@4.47.1': 411 + resolution: {integrity: sha512-daoT0PMENNdjVYYU9xec30Y2prb1AbEIbb64sqkcQcSaR0zYuKkoPuhIztfxuqN82KYCKKrj+tQe4Gi7OSm1ow==} 389 412 cpu: [riscv64] 390 413 os: [linux] 391 414 392 - '@rollup/rollup-linux-riscv64-musl@4.42.0': 393 - resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} 415 + '@rollup/rollup-linux-riscv64-musl@4.47.1': 416 + resolution: {integrity: sha512-JNyXaAhWtdzfXu5pUcHAuNwGQKevR+6z/poYQKVW+pLaYOj9G1meYc57/1Xv2u4uTxfu9qEWmNTjv/H/EpAisw==} 394 417 cpu: [riscv64] 395 418 os: [linux] 396 419 397 - '@rollup/rollup-linux-s390x-gnu@4.42.0': 398 - resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} 420 + '@rollup/rollup-linux-s390x-gnu@4.47.1': 421 + resolution: {integrity: sha512-U/CHbqKSwEQyZXjCpY43/GLYcTVKEXeRHw0rMBJP7fP3x6WpYG4LTJWR3ic6TeYKX6ZK7mrhltP4ppolyVhLVQ==} 399 422 cpu: [s390x] 400 423 os: [linux] 401 424 402 - '@rollup/rollup-linux-x64-gnu@4.42.0': 403 - resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} 425 + '@rollup/rollup-linux-x64-gnu@4.47.1': 426 + resolution: {integrity: sha512-uTLEakjxOTElfeZIGWkC34u2auLHB1AYS6wBjPGI00bWdxdLcCzK5awjs25YXpqB9lS8S0vbO0t9ZcBeNibA7g==} 404 427 cpu: [x64] 405 428 os: [linux] 406 429 407 - '@rollup/rollup-linux-x64-musl@4.42.0': 408 - resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} 430 + '@rollup/rollup-linux-x64-musl@4.47.1': 431 + resolution: {integrity: sha512-Ft+d/9DXs30BK7CHCTX11FtQGHUdpNDLJW0HHLign4lgMgBcPFN3NkdIXhC5r9iwsMwYreBBc4Rho5ieOmKNVQ==} 409 432 cpu: [x64] 410 433 os: [linux] 411 434 412 - '@rollup/rollup-win32-arm64-msvc@4.42.0': 413 - resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} 435 + '@rollup/rollup-win32-arm64-msvc@4.47.1': 436 + resolution: {integrity: sha512-N9X5WqGYzZnjGAFsKSfYFtAShYjwOmFJoWbLg3dYixZOZqU7hdMq+/xyS14zKLhFhZDhP9VfkzQnsdk0ZDS9IA==} 414 437 cpu: [arm64] 415 438 os: [win32] 416 439 417 - '@rollup/rollup-win32-ia32-msvc@4.42.0': 418 - resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} 440 + '@rollup/rollup-win32-ia32-msvc@4.47.1': 441 + resolution: {integrity: sha512-O+KcfeCORZADEY8oQJk4HK8wtEOCRE4MdOkb8qGZQNun3jzmj2nmhV/B/ZaaZOkPmJyvm/gW9n0gsB4eRa1eiQ==} 419 442 cpu: [ia32] 420 443 os: [win32] 421 444 422 - '@rollup/rollup-win32-x64-msvc@4.42.0': 423 - resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} 445 + '@rollup/rollup-win32-x64-msvc@4.47.1': 446 + resolution: {integrity: sha512-CpKnYa8eHthJa3c+C38v/E+/KZyF1Jdh2Cz3DyKZqEWYgrM1IHFArXNWvBLPQCKUEsAqqKX27tTqVEFbDNUcOA==} 424 447 cpu: [x64] 425 448 os: [win32] 426 449 427 - '@shikijs/core@3.6.0': 428 - resolution: {integrity: sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==} 450 + '@solid-devtools/debugger@0.28.1': 451 + resolution: {integrity: sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg==} 452 + peerDependencies: 453 + solid-js: ^1.9.0 429 454 430 - '@shikijs/engine-javascript@3.6.0': 431 - resolution: {integrity: sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==} 455 + '@solid-devtools/shared@0.20.0': 456 + resolution: {integrity: sha512-o5TACmUOQsxpzpOKCjbQqGk8wL8PMi+frXG9WNu4Lh3PQVUB6hs95Kl/S8xc++zwcMguUKZJn8h5URUiMOca6Q==} 457 + peerDependencies: 458 + solid-js: ^1.9.0 432 459 433 - '@shikijs/engine-oniguruma@3.6.0': 434 - resolution: {integrity: sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==} 460 + '@solid-primitives/bounds@0.1.3': 461 + resolution: {integrity: sha512-UbiyKMdSPmtijcEDnYLQL3zzaejpwWDAJJ4Gt5P0hgVs6A72piov0GyNw7V2SroH7NZFwxlYS22YmOr8A5xc1Q==} 462 + peerDependencies: 463 + solid-js: ^1.6.12 435 464 436 - '@shikijs/langs@3.6.0': 437 - resolution: {integrity: sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==} 465 + '@solid-primitives/event-listener@2.4.3': 466 + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} 467 + peerDependencies: 468 + solid-js: ^1.6.12 438 469 439 - '@shikijs/themes@3.6.0': 440 - resolution: {integrity: sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==} 470 + '@solid-primitives/keyboard@1.3.3': 471 + resolution: {integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==} 472 + peerDependencies: 473 + solid-js: ^1.6.12 441 474 442 - '@shikijs/types@3.6.0': 443 - resolution: {integrity: sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==} 475 + '@solid-primitives/media@2.3.3': 476 + resolution: {integrity: sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA==} 477 + peerDependencies: 478 + solid-js: ^1.6.12 444 479 445 - '@shikijs/vscode-textmate@10.0.2': 446 - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} 480 + '@solid-primitives/refs@1.1.2': 481 + resolution: {integrity: sha512-K7tf2thy7L+YJjdqXspXOg5xvNEOH8tgEWsp0+1mQk3obHBRD6hEjYZk7p7FlJphSZImS35je3UfmWuD7MhDfg==} 482 + peerDependencies: 483 + solid-js: ^1.6.12 447 484 448 - '@swc/helpers@0.5.17': 449 - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} 485 + '@solid-primitives/resize-observer@2.1.3': 486 + resolution: {integrity: sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==} 487 + peerDependencies: 488 + solid-js: ^1.6.12 450 489 451 - '@types/debug@4.1.12': 452 - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 490 + '@solid-primitives/rootless@1.5.2': 491 + resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} 492 + peerDependencies: 493 + solid-js: ^1.6.12 453 494 454 - '@types/estree@1.0.7': 455 - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 495 + '@solid-primitives/scheduled@1.5.2': 496 + resolution: {integrity: sha512-/j2igE0xyNaHhj6kMfcUQn5rAVSTLbAX+CDEBm25hSNBmNiHLu2lM7Usj2kJJ5j36D67bE8wR1hBNA8hjtvsQA==} 497 + peerDependencies: 498 + solid-js: ^1.6.12 456 499 457 - '@types/estree@1.0.8': 458 - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 500 + '@solid-primitives/static-store@0.1.2': 501 + resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} 502 + peerDependencies: 503 + solid-js: ^1.6.12 459 504 460 - '@types/fontkit@2.0.8': 461 - resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==} 505 + '@solid-primitives/styles@0.1.2': 506 + resolution: {integrity: sha512-7iX5K+J5b1PRrbgw3Ki92uvU2LgQ0Kd/QMsrAZxDg5dpUBwMyTijZkA3bbs1ikZsT1oQhS41bTyKbjrXeU0Awg==} 507 + peerDependencies: 508 + solid-js: ^1.6.12 462 509 463 - '@types/hast@3.0.4': 464 - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 510 + '@solid-primitives/utils@6.3.2': 511 + resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} 512 + peerDependencies: 513 + solid-js: ^1.6.12 465 514 466 - '@types/mdast@4.0.4': 467 - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 515 + '@solidjs/router@0.15.3': 516 + resolution: {integrity: sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==} 517 + peerDependencies: 518 + solid-js: ^1.8.6 468 519 469 - '@types/ms@2.1.0': 470 - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 520 + '@types/babel__core@7.20.5': 521 + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 471 522 472 - '@types/nlcst@2.0.3': 473 - resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} 523 + '@types/babel__generator@7.27.0': 524 + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 474 525 475 - '@types/node@22.15.30': 476 - resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} 526 + '@types/babel__template@7.4.4': 527 + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 477 528 478 - '@types/unist@3.0.3': 479 - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 529 + '@types/babel__traverse@7.28.0': 530 + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 480 531 481 - '@ungap/structured-clone@1.3.0': 482 - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 532 + '@types/estree@1.0.8': 533 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 483 534 484 - acorn@8.15.0: 485 - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 486 - engines: {node: '>=0.4.0'} 487 - hasBin: true 535 + '@types/node@24.3.0': 536 + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} 488 537 489 - ansi-align@3.0.1: 490 - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} 538 + babel-plugin-jsx-dom-expressions@0.40.1: 539 + resolution: {integrity: sha512-b4iHuirqK7RgaMzB2Lsl7MqrlDgQtVRSSazyrmx7wB3T759ggGjod5Rkok5MfHjQXhR7tRPmdwoeGPqBnW2KfA==} 540 + peerDependencies: 541 + '@babel/core': ^7.20.12 491 542 492 - ansi-regex@5.0.1: 493 - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 494 - engines: {node: '>=8'} 495 - 496 - ansi-regex@6.1.0: 497 - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 498 - engines: {node: '>=12'} 499 - 500 - ansi-styles@6.2.1: 501 - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 502 - engines: {node: '>=12'} 503 - 504 - anymatch@3.1.3: 505 - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 506 - engines: {node: '>= 8'} 507 - 508 - argparse@2.0.1: 509 - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 510 - 511 - aria-query@5.3.2: 512 - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 513 - engines: {node: '>= 0.4'} 514 - 515 - array-iterate@2.0.1: 516 - resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} 543 + babel-preset-solid@1.9.9: 544 + resolution: {integrity: sha512-pCnxWrciluXCeli/dj5PIEHgbNzim3evtTn12snjqqg8QZWJNMjH1AWIp4iG/tbVjqQ72aBEymMSagvmgxubXw==} 545 + peerDependencies: 546 + '@babel/core': ^7.0.0 547 + solid-js: ^1.9.8 548 + peerDependenciesMeta: 549 + solid-js: 550 + optional: true 517 551 518 - astro@5.9.1: 519 - resolution: {integrity: sha512-wxoJcTbuDZNFSv6EaL0PAlrp0Wx6VnOAULCXvy0scsV70oWMeUkdxuBxfO54JxO5Qgyvwj9h99y6E0elqOpGtA==} 520 - engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} 552 + browserslist@4.25.3: 553 + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} 554 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 521 555 hasBin: true 522 556 523 - axobject-query@4.1.0: 524 - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 525 - engines: {node: '>= 0.4'} 526 - 527 - bail@2.0.2: 528 - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 529 - 530 - base-64@1.0.0: 531 - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} 532 - 533 - base64-js@1.5.1: 534 - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 535 - 536 - blob-to-buffer@1.2.9: 537 - resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} 538 - 539 - boxen@8.0.1: 540 - resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} 541 - engines: {node: '>=18'} 542 - 543 - brotli@1.3.3: 544 - resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} 545 - 546 - camelcase@8.0.0: 547 - resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} 548 - engines: {node: '>=16'} 549 - 550 - ccount@2.0.1: 551 - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 552 - 553 - chalk@5.4.1: 554 - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 555 - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 556 - 557 - character-entities-html4@2.1.0: 558 - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 559 - 560 - character-entities-legacy@3.0.0: 561 - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 562 - 563 - character-entities@2.0.2: 564 - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 565 - 566 - chokidar@4.0.3: 567 - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 568 - engines: {node: '>= 14.16.0'} 569 - 570 - ci-info@4.2.0: 571 - resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} 572 - engines: {node: '>=8'} 573 - 574 - cli-boxes@3.0.0: 575 - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 576 - engines: {node: '>=10'} 577 - 578 - clone@2.1.2: 579 - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} 580 - engines: {node: '>=0.8'} 581 - 582 - clsx@2.1.1: 583 - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 584 - engines: {node: '>=6'} 585 - 586 - color-convert@2.0.1: 587 - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 588 - engines: {node: '>=7.0.0'} 589 - 590 - color-name@1.1.4: 591 - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 592 - 593 - color-string@1.9.1: 594 - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 595 - 596 - color@4.2.3: 597 - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 598 - engines: {node: '>=12.5.0'} 599 - 600 - comma-separated-tokens@2.0.3: 601 - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 602 - 603 - common-ancestor-path@1.0.1: 604 - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} 557 + caniuse-lite@1.0.30001737: 558 + resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} 605 559 606 - cookie-es@1.2.2: 607 - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} 560 + convert-source-map@2.0.0: 561 + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 608 562 609 - cookie@1.0.2: 610 - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} 611 - engines: {node: '>=18'} 612 - 613 - cross-fetch@3.2.0: 614 - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} 615 - 616 - crossws@0.3.5: 617 - resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} 618 - 619 - css-tree@3.1.0: 620 - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} 621 - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 622 - 623 - cssesc@3.0.0: 624 - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 625 - engines: {node: '>=4'} 626 - hasBin: true 563 + csstype@3.1.3: 564 + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 627 565 628 566 debug@4.4.1: 629 567 resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} ··· 634 572 supports-color: 635 573 optional: true 636 574 637 - decode-named-character-reference@1.1.0: 638 - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} 639 - 640 - defu@6.1.4: 641 - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 642 - 643 - dequal@2.0.3: 644 - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 645 - engines: {node: '>=6'} 646 - 647 - destr@2.0.5: 648 - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} 649 - 650 - detect-libc@2.0.4: 651 - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 652 - engines: {node: '>=8'} 653 - 654 - deterministic-object-hash@2.0.2: 655 - resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} 656 - engines: {node: '>=18'} 657 - 658 - devalue@5.1.1: 659 - resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} 660 - 661 - devlop@1.1.0: 662 - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 663 - 664 - dfa@1.2.0: 665 - resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} 666 - 667 - diff@5.2.0: 668 - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} 669 - engines: {node: '>=0.3.1'} 670 - 671 - dlv@1.1.3: 672 - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 673 - 674 - dset@3.1.4: 675 - resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} 676 - engines: {node: '>=4'} 677 - 678 - emoji-regex@10.4.0: 679 - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} 680 - 681 - emoji-regex@8.0.0: 682 - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 575 + electron-to-chromium@1.5.208: 576 + resolution: {integrity: sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==} 683 577 684 578 entities@6.0.1: 685 579 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 686 580 engines: {node: '>=0.12'} 687 581 688 - es-module-lexer@1.7.0: 689 - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 690 - 691 - esbuild@0.25.5: 692 - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 582 + esbuild@0.25.9: 583 + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} 693 584 engines: {node: '>=18'} 694 585 hasBin: true 695 586 696 - escape-string-regexp@5.0.0: 697 - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 698 - engines: {node: '>=12'} 587 + escalade@3.2.0: 588 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 589 + engines: {node: '>=6'} 699 590 700 - estree-walker@2.0.2: 701 - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 591 + esm-env@1.2.2: 592 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 702 593 703 - estree-walker@3.0.3: 704 - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 705 - 706 - eventemitter3@5.0.1: 707 - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 708 - 709 - extend@3.0.2: 710 - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 711 - 712 - fast-deep-equal@3.1.3: 713 - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 714 - 715 - fdir@6.4.5: 716 - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} 594 + fdir@6.5.0: 595 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 596 + engines: {node: '>=12.0.0'} 717 597 peerDependencies: 718 598 picomatch: ^3 || ^4 719 599 peerDependenciesMeta: 720 600 picomatch: 721 601 optional: true 722 602 723 - flattie@1.1.1: 724 - resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} 725 - engines: {node: '>=8'} 726 - 727 - fontace@0.3.0: 728 - resolution: {integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==} 729 - 730 - fontkit@2.0.4: 731 - resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} 732 - 733 603 fsevents@2.3.3: 734 604 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 735 605 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 736 606 os: [darwin] 737 607 738 - get-east-asian-width@1.3.0: 739 - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} 740 - engines: {node: '>=18'} 741 - 742 - github-slugger@2.0.0: 743 - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} 744 - 745 - h3@1.15.3: 746 - resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} 747 - 748 - hast-util-from-html@2.0.3: 749 - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} 750 - 751 - hast-util-from-parse5@8.0.3: 752 - resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} 753 - 754 - hast-util-is-element@3.0.0: 755 - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} 756 - 757 - hast-util-parse-selector@4.0.0: 758 - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 759 - 760 - hast-util-raw@9.1.0: 761 - resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} 762 - 763 - hast-util-to-html@9.0.5: 764 - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} 765 - 766 - hast-util-to-parse5@8.0.0: 767 - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} 768 - 769 - hast-util-to-text@4.0.2: 770 - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} 771 - 772 - hast-util-whitespace@3.0.0: 773 - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 774 - 775 - hastscript@9.0.1: 776 - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} 777 - 778 - html-escaper@3.0.3: 779 - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} 780 - 781 - html-void-elements@3.0.0: 782 - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 783 - 784 - http-cache-semantics@4.2.0: 785 - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} 786 - 787 - import-meta-resolve@4.1.0: 788 - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 789 - 790 - iron-webcrypto@1.2.1: 791 - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} 792 - 793 - is-arrayish@0.3.2: 794 - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 795 - 796 - is-docker@3.0.0: 797 - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} 798 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 799 - hasBin: true 800 - 801 - is-fullwidth-code-point@3.0.0: 802 - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 803 - engines: {node: '>=8'} 608 + gensync@1.0.0-beta.2: 609 + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 610 + engines: {node: '>=6.9.0'} 804 611 805 - is-inside-container@1.0.0: 806 - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} 807 - engines: {node: '>=14.16'} 808 - hasBin: true 809 - 810 - is-plain-obj@4.1.0: 811 - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 812 - engines: {node: '>=12'} 612 + html-entities@2.3.3: 613 + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} 813 614 814 - is-wsl@3.1.0: 815 - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} 816 - engines: {node: '>=16'} 615 + is-what@4.1.16: 616 + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} 617 + engines: {node: '>=12.13'} 817 618 818 - js-yaml@4.1.0: 819 - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 820 - hasBin: true 619 + js-tokens@4.0.0: 620 + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 821 621 822 - kleur@3.0.3: 823 - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 622 + jsesc@3.1.0: 623 + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 824 624 engines: {node: '>=6'} 625 + hasBin: true 825 626 826 - kleur@4.1.5: 827 - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 627 + json5@2.2.3: 628 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 828 629 engines: {node: '>=6'} 829 - 830 - longest-streak@3.1.0: 831 - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 832 - 833 - lru-cache@10.4.3: 834 - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 835 - 836 - magic-string@0.30.17: 837 - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 838 - 839 - magicast@0.3.5: 840 - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} 841 - 842 - markdown-table@3.0.4: 843 - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} 844 - 845 - mdast-util-definitions@6.0.0: 846 - resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} 847 - 848 - mdast-util-find-and-replace@3.0.2: 849 - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} 850 - 851 - mdast-util-from-markdown@2.0.2: 852 - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} 853 - 854 - mdast-util-gfm-autolink-literal@2.0.1: 855 - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} 856 - 857 - mdast-util-gfm-footnote@2.1.0: 858 - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} 859 - 860 - mdast-util-gfm-strikethrough@2.0.0: 861 - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} 862 - 863 - mdast-util-gfm-table@2.0.0: 864 - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} 865 - 866 - mdast-util-gfm-task-list-item@2.0.0: 867 - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} 868 - 869 - mdast-util-gfm@3.1.0: 870 - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} 871 - 872 - mdast-util-phrasing@4.1.0: 873 - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} 874 - 875 - mdast-util-to-hast@13.2.0: 876 - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} 877 - 878 - mdast-util-to-markdown@2.1.2: 879 - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} 880 - 881 - mdast-util-to-string@4.0.0: 882 - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} 883 - 884 - mdn-data@2.12.2: 885 - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} 886 - 887 - micromark-core-commonmark@2.0.3: 888 - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} 889 - 890 - micromark-extension-gfm-autolink-literal@2.1.0: 891 - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} 892 - 893 - micromark-extension-gfm-footnote@2.1.0: 894 - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} 895 - 896 - micromark-extension-gfm-strikethrough@2.1.0: 897 - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} 898 - 899 - micromark-extension-gfm-table@2.1.1: 900 - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} 901 - 902 - micromark-extension-gfm-tagfilter@2.0.0: 903 - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} 904 - 905 - micromark-extension-gfm-task-list-item@2.1.0: 906 - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} 907 - 908 - micromark-extension-gfm@3.0.0: 909 - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} 910 - 911 - micromark-factory-destination@2.0.1: 912 - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} 913 - 914 - micromark-factory-label@2.0.1: 915 - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} 916 - 917 - micromark-factory-space@2.0.1: 918 - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} 919 - 920 - micromark-factory-title@2.0.1: 921 - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} 630 + hasBin: true 922 631 923 - micromark-factory-whitespace@2.0.1: 924 - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} 632 + lru-cache@5.1.1: 633 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 925 634 926 - micromark-util-character@2.1.1: 927 - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 928 - 929 - micromark-util-chunked@2.0.1: 930 - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} 931 - 932 - micromark-util-classify-character@2.0.1: 933 - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} 934 - 935 - micromark-util-combine-extensions@2.0.1: 936 - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} 937 - 938 - micromark-util-decode-numeric-character-reference@2.0.2: 939 - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} 940 - 941 - micromark-util-decode-string@2.0.1: 942 - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} 943 - 944 - micromark-util-encode@2.0.1: 945 - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 946 - 947 - micromark-util-html-tag-name@2.0.1: 948 - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} 949 - 950 - micromark-util-normalize-identifier@2.0.1: 951 - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} 952 - 953 - micromark-util-resolve-all@2.0.1: 954 - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} 955 - 956 - micromark-util-sanitize-uri@2.0.1: 957 - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 958 - 959 - micromark-util-subtokenize@2.1.0: 960 - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} 961 - 962 - micromark-util-symbol@2.0.1: 963 - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 964 - 965 - micromark-util-types@2.0.2: 966 - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 967 - 968 - micromark@4.0.2: 969 - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} 970 - 971 - mrmime@2.0.1: 972 - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 973 - engines: {node: '>=10'} 635 + merge-anything@5.1.7: 636 + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} 637 + engines: {node: '>=12.13'} 974 638 975 639 ms@2.1.3: 976 640 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} ··· 980 644 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 981 645 hasBin: true 982 646 983 - neotraverse@0.6.18: 984 - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} 985 - engines: {node: '>= 10'} 986 - 987 - nlcst-to-string@4.0.0: 988 - resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} 989 - 990 - node-fetch-native@1.6.6: 991 - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} 992 - 993 - node-fetch@2.7.0: 994 - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 995 - engines: {node: 4.x || >=6.0.0} 996 - peerDependencies: 997 - encoding: ^0.1.0 998 - peerDependenciesMeta: 999 - encoding: 1000 - optional: true 1001 - 1002 - node-mock-http@1.0.0: 1003 - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} 1004 - 1005 - normalize-path@3.0.0: 1006 - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1007 - engines: {node: '>=0.10.0'} 1008 - 1009 - ofetch@1.4.1: 1010 - resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} 1011 - 1012 - ohash@2.0.11: 1013 - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} 1014 - 1015 - oniguruma-parser@0.12.1: 1016 - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} 1017 - 1018 - oniguruma-to-es@4.3.3: 1019 - resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} 1020 - 1021 - p-limit@6.2.0: 1022 - resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} 1023 - engines: {node: '>=18'} 1024 - 1025 - p-queue@8.1.0: 1026 - resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==} 1027 - engines: {node: '>=18'} 1028 - 1029 - p-timeout@6.1.4: 1030 - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} 1031 - engines: {node: '>=14.16'} 647 + nanoid@5.1.5: 648 + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} 649 + engines: {node: ^18 || >=20} 650 + hasBin: true 1032 651 1033 - package-manager-detector@1.3.0: 1034 - resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} 1035 - 1036 - pako@0.2.9: 1037 - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} 1038 - 1039 - parse-latin@7.0.0: 1040 - resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} 652 + node-releases@2.0.19: 653 + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1041 654 1042 655 parse5@7.3.0: 1043 656 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} ··· 1045 658 picocolors@1.1.1: 1046 659 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1047 660 1048 - picomatch@2.3.1: 1049 - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1050 - engines: {node: '>=8.6'} 1051 - 1052 - picomatch@4.0.2: 1053 - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 661 + picomatch@4.0.3: 662 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1054 663 engines: {node: '>=12'} 1055 664 1056 - postcss@8.5.4: 1057 - resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} 665 + postcss@8.5.6: 666 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1058 667 engines: {node: ^10 || ^12 || >=14} 1059 668 1060 - prismjs@1.30.0: 1061 - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} 1062 - engines: {node: '>=6'} 1063 - 1064 - prompts@2.4.2: 1065 - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1066 - engines: {node: '>= 6'} 1067 - 1068 - property-information@6.5.0: 1069 - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} 1070 - 1071 - property-information@7.1.0: 1072 - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} 1073 - 1074 - radix3@1.1.2: 1075 - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} 1076 - 1077 - readdirp@4.1.2: 1078 - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1079 - engines: {node: '>= 14.18.0'} 1080 - 1081 - regex-recursion@6.0.2: 1082 - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} 1083 - 1084 - regex-utilities@2.3.0: 1085 - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} 669 + prettier@3.6.2: 670 + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 671 + engines: {node: '>=14'} 672 + hasBin: true 1086 673 1087 - regex@6.0.1: 1088 - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} 1089 - 1090 - rehype-parse@9.0.1: 1091 - resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} 1092 - 1093 - rehype-raw@7.0.0: 1094 - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} 1095 - 1096 - rehype-stringify@10.0.1: 1097 - resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} 1098 - 1099 - rehype@13.0.2: 1100 - resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} 1101 - 1102 - remark-gfm@4.0.1: 1103 - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} 1104 - 1105 - remark-parse@11.0.0: 1106 - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} 1107 - 1108 - remark-rehype@11.1.2: 1109 - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} 1110 - 1111 - remark-smartypants@3.0.2: 1112 - resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} 1113 - engines: {node: '>=16.0.0'} 1114 - 1115 - remark-stringify@11.0.0: 1116 - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} 1117 - 1118 - restructure@3.0.2: 1119 - resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} 1120 - 1121 - retext-latin@4.0.0: 1122 - resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} 1123 - 1124 - retext-smartypants@6.2.0: 1125 - resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} 1126 - 1127 - retext-stringify@4.0.0: 1128 - resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} 1129 - 1130 - retext@9.0.0: 1131 - resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} 1132 - 1133 - rollup@4.42.0: 1134 - resolution: {integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==} 674 + rollup@4.47.1: 675 + resolution: {integrity: sha512-iasGAQoZ5dWDzULEUX3jiW0oB1qyFOepSyDyoU6S/OhVlDIwj5knI5QBa5RRQ0sK7OE0v+8VIi2JuV+G+3tfNg==} 1135 676 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1136 677 hasBin: true 1137 678 1138 - semver@7.7.2: 1139 - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1140 - engines: {node: '>=10'} 679 + semver@6.3.1: 680 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1141 681 hasBin: true 1142 682 1143 - sharp@0.33.5: 1144 - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} 1145 - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 683 + seroval-plugins@1.3.2: 684 + resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} 685 + engines: {node: '>=10'} 686 + peerDependencies: 687 + seroval: ^1.0 1146 688 1147 - shiki@3.6.0: 1148 - resolution: {integrity: sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==} 689 + seroval@1.3.2: 690 + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} 691 + engines: {node: '>=10'} 1149 692 1150 - simple-swizzle@0.2.2: 1151 - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 693 + solid-devtools@0.34.3: 694 + resolution: {integrity: sha512-ZQua959n+Zu3sLbm9g0IRjYUb1YYlYbu83PWLRoKbSsq0a3ItQNhnS2OBU7rQNmOKZiMexNo9Z3izas9BcOKDg==} 695 + peerDependencies: 696 + solid-js: ^1.9.0 697 + vite: ^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 698 + peerDependenciesMeta: 699 + vite: 700 + optional: true 1152 701 1153 - sisteransi@1.0.5: 1154 - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 702 + solid-js@1.9.9: 703 + resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} 1155 704 1156 - smol-toml@1.3.4: 1157 - resolution: {integrity: sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==} 1158 - engines: {node: '>= 18'} 705 + solid-refresh@0.6.3: 706 + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} 707 + peerDependencies: 708 + solid-js: ^1.3 1159 709 1160 710 source-map-js@1.2.1: 1161 711 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1162 712 engines: {node: '>=0.10.0'} 1163 713 1164 - space-separated-tokens@2.0.2: 1165 - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 1166 - 1167 - string-width@4.2.3: 1168 - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1169 - engines: {node: '>=8'} 1170 - 1171 - string-width@7.2.0: 1172 - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 1173 - engines: {node: '>=18'} 1174 - 1175 - stringify-entities@4.0.4: 1176 - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 1177 - 1178 - strip-ansi@6.0.1: 1179 - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1180 - engines: {node: '>=8'} 1181 - 1182 - strip-ansi@7.1.0: 1183 - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1184 - engines: {node: '>=12'} 1185 - 1186 - tiny-inflate@1.0.3: 1187 - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} 1188 - 1189 - tinyexec@0.3.2: 1190 - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1191 - 1192 714 tinyglobby@0.2.14: 1193 715 resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 1194 716 engines: {node: '>=12.0.0'} 1195 717 1196 - tr46@0.0.3: 1197 - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1198 - 1199 - trim-lines@3.0.1: 1200 - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 1201 - 1202 - trough@2.2.0: 1203 - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} 1204 - 1205 - tsconfck@3.1.6: 1206 - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} 1207 - engines: {node: ^18 || >=20} 718 + typescript@5.9.2: 719 + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 720 + engines: {node: '>=14.17'} 1208 721 hasBin: true 1209 - peerDependencies: 1210 - typescript: ^5.0.0 1211 - peerDependenciesMeta: 1212 - typescript: 1213 - optional: true 1214 722 1215 - tslib@2.8.1: 1216 - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 723 + undici-types@7.10.0: 724 + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} 1217 725 1218 - type-fest@4.41.0: 1219 - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 1220 - engines: {node: '>=16'} 1221 - 1222 - typescript@5.8.3: 1223 - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1224 - engines: {node: '>=14.17'} 726 + update-browserslist-db@1.1.3: 727 + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1225 728 hasBin: true 729 + peerDependencies: 730 + browserslist: '>= 4.21.0' 1226 731 1227 - ufo@1.6.1: 1228 - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 732 + validate-html-nesting@1.2.3: 733 + resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} 1229 734 1230 - ultrahtml@1.6.0: 1231 - resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} 1232 - 1233 - uncrypto@0.1.3: 1234 - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} 1235 - 1236 - undici-types@6.21.0: 1237 - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1238 - 1239 - unicode-properties@1.4.1: 1240 - resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} 1241 - 1242 - unicode-trie@2.0.0: 1243 - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} 1244 - 1245 - unified@11.0.5: 1246 - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} 1247 - 1248 - unifont@0.5.0: 1249 - resolution: {integrity: sha512-4DueXMP5Hy4n607sh+vJ+rajoLu778aU3GzqeTCqsD/EaUcvqZT9wPC8kgK6Vjh22ZskrxyRCR71FwNOaYn6jA==} 1250 - 1251 - unist-util-find-after@5.0.0: 1252 - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} 1253 - 1254 - unist-util-is@6.0.0: 1255 - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 1256 - 1257 - unist-util-modify-children@4.0.0: 1258 - resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} 1259 - 1260 - unist-util-position@5.0.0: 1261 - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 1262 - 1263 - unist-util-remove-position@5.0.0: 1264 - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} 1265 - 1266 - unist-util-stringify-position@4.0.0: 1267 - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 1268 - 1269 - unist-util-visit-children@3.0.0: 1270 - resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} 1271 - 1272 - unist-util-visit-parents@6.0.1: 1273 - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 1274 - 1275 - unist-util-visit@5.0.0: 1276 - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1277 - 1278 - unstorage@1.16.0: 1279 - resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} 735 + vite-plugin-solid@2.11.8: 736 + resolution: {integrity: sha512-hFrCxBfv3B1BmFqnJF4JOCYpjrmi/zwyeKjcomQ0khh8HFyQ8SbuBWQ7zGojfrz6HUOBFrJBNySDi/JgAHytWg==} 1280 737 peerDependencies: 1281 - '@azure/app-configuration': ^1.8.0 1282 - '@azure/cosmos': ^4.2.0 1283 - '@azure/data-tables': ^13.3.0 1284 - '@azure/identity': ^4.6.0 1285 - '@azure/keyvault-secrets': ^4.9.0 1286 - '@azure/storage-blob': ^12.26.0 1287 - '@capacitor/preferences': ^6.0.3 || ^7.0.0 1288 - '@deno/kv': '>=0.9.0' 1289 - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 1290 - '@planetscale/database': ^1.19.0 1291 - '@upstash/redis': ^1.34.3 1292 - '@vercel/blob': '>=0.27.1' 1293 - '@vercel/kv': ^1.0.1 1294 - aws4fetch: ^1.0.20 1295 - db0: '>=0.2.1' 1296 - idb-keyval: ^6.2.1 1297 - ioredis: ^5.4.2 1298 - uploadthing: ^7.4.4 738 + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* 739 + solid-js: ^1.7.2 740 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 1299 741 peerDependenciesMeta: 1300 - '@azure/app-configuration': 1301 - optional: true 1302 - '@azure/cosmos': 1303 - optional: true 1304 - '@azure/data-tables': 1305 - optional: true 1306 - '@azure/identity': 1307 - optional: true 1308 - '@azure/keyvault-secrets': 1309 - optional: true 1310 - '@azure/storage-blob': 1311 - optional: true 1312 - '@capacitor/preferences': 1313 - optional: true 1314 - '@deno/kv': 1315 - optional: true 1316 - '@netlify/blobs': 1317 - optional: true 1318 - '@planetscale/database': 1319 - optional: true 1320 - '@upstash/redis': 1321 - optional: true 1322 - '@vercel/blob': 1323 - optional: true 1324 - '@vercel/kv': 1325 - optional: true 1326 - aws4fetch: 1327 - optional: true 1328 - db0: 1329 - optional: true 1330 - idb-keyval: 1331 - optional: true 1332 - ioredis: 1333 - optional: true 1334 - uploadthing: 742 + '@testing-library/jest-dom': 1335 743 optional: true 1336 744 1337 - vfile-location@5.0.3: 1338 - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 1339 - 1340 - vfile-message@4.0.2: 1341 - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 1342 - 1343 - vfile@6.0.3: 1344 - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 1345 - 1346 745 vite@6.3.5: 1347 746 resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1348 747 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} ··· 1383 782 yaml: 1384 783 optional: true 1385 784 1386 - vitefu@1.0.6: 1387 - resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} 785 + vitefu@1.1.1: 786 + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} 1388 787 peerDependencies: 1389 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 788 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 1390 789 peerDependenciesMeta: 1391 790 vite: 1392 791 optional: true 1393 792 1394 - web-namespaces@2.0.1: 1395 - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 793 + yallist@3.1.1: 794 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1396 795 1397 - webidl-conversions@3.0.1: 1398 - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 796 + snapshots: 1399 797 1400 - whatwg-url@5.0.0: 1401 - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 798 + '@ampproject/remapping@2.3.0': 799 + dependencies: 800 + '@jridgewell/gen-mapping': 0.3.13 801 + '@jridgewell/trace-mapping': 0.3.30 1402 802 1403 - which-pm-runs@1.1.0: 1404 - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} 1405 - engines: {node: '>=4'} 803 + '@atcute/client@4.0.3': 804 + dependencies: 805 + '@atcute/identity': 1.0.3 806 + '@atcute/lexicons': 1.1.1 1406 807 1407 - widest-line@5.0.0: 1408 - resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} 1409 - engines: {node: '>=18'} 808 + '@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)': 809 + dependencies: 810 + '@atcute/identity': 1.0.3 811 + '@atcute/lexicons': 1.1.1 812 + '@atcute/util-fetch': 1.0.1 813 + '@badrap/valita': 0.4.6 1410 814 1411 - wrap-ansi@9.0.0: 1412 - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} 1413 - engines: {node: '>=18'} 815 + '@atcute/identity@1.0.3': 816 + dependencies: 817 + '@atcute/lexicons': 1.1.1 818 + '@badrap/valita': 0.4.6 1414 819 1415 - xxhash-wasm@1.1.0: 1416 - resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 820 + '@atcute/lexicons@1.1.1': 821 + dependencies: 822 + esm-env: 1.2.2 1417 823 1418 - yargs-parser@21.1.1: 1419 - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1420 - engines: {node: '>=12'} 824 + '@atcute/multibase@1.1.4': 825 + dependencies: 826 + '@atcute/uint8array': 1.0.3 1421 827 1422 - yocto-queue@1.2.1: 1423 - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} 1424 - engines: {node: '>=12.20'} 828 + '@atcute/oauth-browser-client@1.0.26': 829 + dependencies: 830 + '@atcute/client': 4.0.3 831 + '@atcute/identity': 1.0.3 832 + '@atcute/lexicons': 1.1.1 833 + '@atcute/multibase': 1.1.4 834 + '@atcute/uint8array': 1.0.3 835 + nanoid: 5.1.5 1425 836 1426 - yocto-spinner@0.2.3: 1427 - resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} 1428 - engines: {node: '>=18.19'} 837 + '@atcute/uint8array@1.0.3': {} 1429 838 1430 - yoctocolors@2.1.1: 1431 - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} 1432 - engines: {node: '>=18'} 839 + '@atcute/util-fetch@1.0.1': 840 + dependencies: 841 + '@badrap/valita': 0.4.6 1433 842 1434 - zod-to-json-schema@3.24.5: 1435 - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} 1436 - peerDependencies: 1437 - zod: ^3.24.1 843 + '@babel/code-frame@7.27.1': 844 + dependencies: 845 + '@babel/helper-validator-identifier': 7.27.1 846 + js-tokens: 4.0.0 847 + picocolors: 1.1.1 1438 848 1439 - zod-to-ts@1.2.0: 1440 - resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} 1441 - peerDependencies: 1442 - typescript: ^4.9.4 || ^5.0.2 1443 - zod: ^3 849 + '@babel/compat-data@7.28.0': {} 1444 850 1445 - zod@3.25.56: 1446 - resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==} 851 + '@babel/core@7.28.3': 852 + dependencies: 853 + '@ampproject/remapping': 2.3.0 854 + '@babel/code-frame': 7.27.1 855 + '@babel/generator': 7.28.3 856 + '@babel/helper-compilation-targets': 7.27.2 857 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) 858 + '@babel/helpers': 7.28.3 859 + '@babel/parser': 7.28.3 860 + '@babel/template': 7.27.2 861 + '@babel/traverse': 7.28.3 862 + '@babel/types': 7.28.2 863 + convert-source-map: 2.0.0 864 + debug: 4.4.1 865 + gensync: 1.0.0-beta.2 866 + json5: 2.2.3 867 + semver: 6.3.1 868 + transitivePeerDependencies: 869 + - supports-color 1447 870 1448 - zwitch@2.0.4: 1449 - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 871 + '@babel/generator@7.28.3': 872 + dependencies: 873 + '@babel/parser': 7.28.3 874 + '@babel/types': 7.28.2 875 + '@jridgewell/gen-mapping': 0.3.13 876 + '@jridgewell/trace-mapping': 0.3.30 877 + jsesc: 3.1.0 1450 878 1451 - snapshots: 879 + '@babel/helper-compilation-targets@7.27.2': 880 + dependencies: 881 + '@babel/compat-data': 7.28.0 882 + '@babel/helper-validator-option': 7.27.1 883 + browserslist: 4.25.3 884 + lru-cache: 5.1.1 885 + semver: 6.3.1 1452 886 1453 - '@astrojs/compiler@2.12.1': {} 887 + '@babel/helper-globals@7.28.0': {} 1454 888 1455 - '@astrojs/internal-helpers@0.6.1': {} 889 + '@babel/helper-module-imports@7.18.6': 890 + dependencies: 891 + '@babel/types': 7.28.2 1456 892 1457 - '@astrojs/markdown-remark@6.3.2': 893 + '@babel/helper-module-imports@7.27.1': 1458 894 dependencies: 1459 - '@astrojs/internal-helpers': 0.6.1 1460 - '@astrojs/prism': 3.3.0 1461 - github-slugger: 2.0.0 1462 - hast-util-from-html: 2.0.3 1463 - hast-util-to-text: 4.0.2 1464 - import-meta-resolve: 4.1.0 1465 - js-yaml: 4.1.0 1466 - mdast-util-definitions: 6.0.0 1467 - rehype-raw: 7.0.0 1468 - rehype-stringify: 10.0.1 1469 - remark-gfm: 4.0.1 1470 - remark-parse: 11.0.0 1471 - remark-rehype: 11.1.2 1472 - remark-smartypants: 3.0.2 1473 - shiki: 3.6.0 1474 - smol-toml: 1.3.4 1475 - unified: 11.0.5 1476 - unist-util-remove-position: 5.0.0 1477 - unist-util-visit: 5.0.0 1478 - unist-util-visit-parents: 6.0.1 1479 - vfile: 6.0.3 895 + '@babel/traverse': 7.28.3 896 + '@babel/types': 7.28.2 1480 897 transitivePeerDependencies: 1481 898 - supports-color 1482 899 1483 - '@astrojs/prism@3.3.0': 1484 - dependencies: 1485 - prismjs: 1.30.0 1486 - 1487 - '@astrojs/telemetry@3.3.0': 900 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': 1488 901 dependencies: 1489 - ci-info: 4.2.0 1490 - debug: 4.4.1 1491 - dlv: 1.1.3 1492 - dset: 3.1.4 1493 - is-docker: 3.0.0 1494 - is-wsl: 3.1.0 1495 - which-pm-runs: 1.1.0 902 + '@babel/core': 7.28.3 903 + '@babel/helper-module-imports': 7.27.1 904 + '@babel/helper-validator-identifier': 7.27.1 905 + '@babel/traverse': 7.28.3 1496 906 transitivePeerDependencies: 1497 907 - supports-color 908 + 909 + '@babel/helper-plugin-utils@7.27.1': {} 1498 910 1499 911 '@babel/helper-string-parser@7.27.1': {} 1500 912 1501 913 '@babel/helper-validator-identifier@7.27.1': {} 1502 914 1503 - '@babel/parser@7.27.5': 1504 - dependencies: 1505 - '@babel/types': 7.27.6 915 + '@babel/helper-validator-option@7.27.1': {} 1506 916 1507 - '@babel/types@7.27.6': 917 + '@babel/helpers@7.28.3': 1508 918 dependencies: 1509 - '@babel/helper-string-parser': 7.27.1 1510 - '@babel/helper-validator-identifier': 7.27.1 919 + '@babel/template': 7.27.2 920 + '@babel/types': 7.28.2 1511 921 1512 - '@capsizecss/unpack@2.4.0': 922 + '@babel/parser@7.28.3': 1513 923 dependencies: 1514 - blob-to-buffer: 1.2.9 1515 - cross-fetch: 3.2.0 1516 - fontkit: 2.0.4 1517 - transitivePeerDependencies: 1518 - - encoding 924 + '@babel/types': 7.28.2 1519 925 1520 - '@emnapi/runtime@1.4.3': 926 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': 1521 927 dependencies: 1522 - tslib: 2.8.1 1523 - optional: true 1524 - 1525 - '@esbuild/aix-ppc64@0.25.5': 1526 - optional: true 1527 - 1528 - '@esbuild/android-arm64@0.25.5': 1529 - optional: true 1530 - 1531 - '@esbuild/android-arm@0.25.5': 1532 - optional: true 1533 - 1534 - '@esbuild/android-x64@0.25.5': 1535 - optional: true 1536 - 1537 - '@esbuild/darwin-arm64@0.25.5': 1538 - optional: true 1539 - 1540 - '@esbuild/darwin-x64@0.25.5': 1541 - optional: true 1542 - 1543 - '@esbuild/freebsd-arm64@0.25.5': 1544 - optional: true 1545 - 1546 - '@esbuild/freebsd-x64@0.25.5': 1547 - optional: true 1548 - 1549 - '@esbuild/linux-arm64@0.25.5': 1550 - optional: true 928 + '@babel/core': 7.28.3 929 + '@babel/helper-plugin-utils': 7.27.1 1551 930 1552 - '@esbuild/linux-arm@0.25.5': 1553 - optional: true 931 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': 932 + dependencies: 933 + '@babel/core': 7.28.3 934 + '@babel/helper-plugin-utils': 7.27.1 1554 935 1555 - '@esbuild/linux-ia32@0.25.5': 1556 - optional: true 1557 - 1558 - '@esbuild/linux-loong64@0.25.5': 1559 - optional: true 936 + '@babel/template@7.27.2': 937 + dependencies: 938 + '@babel/code-frame': 7.27.1 939 + '@babel/parser': 7.28.3 940 + '@babel/types': 7.28.2 1560 941 1561 - '@esbuild/linux-mips64el@0.25.5': 1562 - optional: true 942 + '@babel/traverse@7.28.3': 943 + dependencies: 944 + '@babel/code-frame': 7.27.1 945 + '@babel/generator': 7.28.3 946 + '@babel/helper-globals': 7.28.0 947 + '@babel/parser': 7.28.3 948 + '@babel/template': 7.27.2 949 + '@babel/types': 7.28.2 950 + debug: 4.4.1 951 + transitivePeerDependencies: 952 + - supports-color 1563 953 1564 - '@esbuild/linux-ppc64@0.25.5': 1565 - optional: true 954 + '@babel/types@7.28.2': 955 + dependencies: 956 + '@babel/helper-string-parser': 7.27.1 957 + '@babel/helper-validator-identifier': 7.27.1 1566 958 1567 - '@esbuild/linux-riscv64@0.25.5': 1568 - optional: true 959 + '@badrap/valita@0.4.6': {} 1569 960 1570 - '@esbuild/linux-s390x@0.25.5': 961 + '@esbuild/aix-ppc64@0.25.9': 1571 962 optional: true 1572 963 1573 - '@esbuild/linux-x64@0.25.5': 964 + '@esbuild/android-arm64@0.25.9': 1574 965 optional: true 1575 966 1576 - '@esbuild/netbsd-arm64@0.25.5': 967 + '@esbuild/android-arm@0.25.9': 1577 968 optional: true 1578 969 1579 - '@esbuild/netbsd-x64@0.25.5': 970 + '@esbuild/android-x64@0.25.9': 1580 971 optional: true 1581 972 1582 - '@esbuild/openbsd-arm64@0.25.5': 973 + '@esbuild/darwin-arm64@0.25.9': 1583 974 optional: true 1584 975 1585 - '@esbuild/openbsd-x64@0.25.5': 976 + '@esbuild/darwin-x64@0.25.9': 1586 977 optional: true 1587 978 1588 - '@esbuild/sunos-x64@0.25.5': 979 + '@esbuild/freebsd-arm64@0.25.9': 1589 980 optional: true 1590 981 1591 - '@esbuild/win32-arm64@0.25.5': 982 + '@esbuild/freebsd-x64@0.25.9': 1592 983 optional: true 1593 984 1594 - '@esbuild/win32-ia32@0.25.5': 985 + '@esbuild/linux-arm64@0.25.9': 1595 986 optional: true 1596 987 1597 - '@esbuild/win32-x64@0.25.5': 988 + '@esbuild/linux-arm@0.25.9': 1598 989 optional: true 1599 990 1600 - '@img/sharp-darwin-arm64@0.33.5': 1601 - optionalDependencies: 1602 - '@img/sharp-libvips-darwin-arm64': 1.0.4 991 + '@esbuild/linux-ia32@0.25.9': 1603 992 optional: true 1604 993 1605 - '@img/sharp-darwin-x64@0.33.5': 1606 - optionalDependencies: 1607 - '@img/sharp-libvips-darwin-x64': 1.0.4 994 + '@esbuild/linux-loong64@0.25.9': 1608 995 optional: true 1609 996 1610 - '@img/sharp-libvips-darwin-arm64@1.0.4': 997 + '@esbuild/linux-mips64el@0.25.9': 1611 998 optional: true 1612 999 1613 - '@img/sharp-libvips-darwin-x64@1.0.4': 1000 + '@esbuild/linux-ppc64@0.25.9': 1614 1001 optional: true 1615 1002 1616 - '@img/sharp-libvips-linux-arm64@1.0.4': 1003 + '@esbuild/linux-riscv64@0.25.9': 1617 1004 optional: true 1618 1005 1619 - '@img/sharp-libvips-linux-arm@1.0.5': 1006 + '@esbuild/linux-s390x@0.25.9': 1620 1007 optional: true 1621 1008 1622 - '@img/sharp-libvips-linux-s390x@1.0.4': 1009 + '@esbuild/linux-x64@0.25.9': 1623 1010 optional: true 1624 1011 1625 - '@img/sharp-libvips-linux-x64@1.0.4': 1012 + '@esbuild/netbsd-arm64@0.25.9': 1626 1013 optional: true 1627 1014 1628 - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': 1015 + '@esbuild/netbsd-x64@0.25.9': 1629 1016 optional: true 1630 1017 1631 - '@img/sharp-libvips-linuxmusl-x64@1.0.4': 1018 + '@esbuild/openbsd-arm64@0.25.9': 1632 1019 optional: true 1633 1020 1634 - '@img/sharp-linux-arm64@0.33.5': 1635 - optionalDependencies: 1636 - '@img/sharp-libvips-linux-arm64': 1.0.4 1021 + '@esbuild/openbsd-x64@0.25.9': 1637 1022 optional: true 1638 1023 1639 - '@img/sharp-linux-arm@0.33.5': 1640 - optionalDependencies: 1641 - '@img/sharp-libvips-linux-arm': 1.0.5 1024 + '@esbuild/openharmony-arm64@0.25.9': 1642 1025 optional: true 1643 1026 1644 - '@img/sharp-linux-s390x@0.33.5': 1645 - optionalDependencies: 1646 - '@img/sharp-libvips-linux-s390x': 1.0.4 1027 + '@esbuild/sunos-x64@0.25.9': 1647 1028 optional: true 1648 1029 1649 - '@img/sharp-linux-x64@0.33.5': 1650 - optionalDependencies: 1651 - '@img/sharp-libvips-linux-x64': 1.0.4 1030 + '@esbuild/win32-arm64@0.25.9': 1652 1031 optional: true 1653 1032 1654 - '@img/sharp-linuxmusl-arm64@0.33.5': 1655 - optionalDependencies: 1656 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 1033 + '@esbuild/win32-ia32@0.25.9': 1657 1034 optional: true 1658 1035 1659 - '@img/sharp-linuxmusl-x64@0.33.5': 1660 - optionalDependencies: 1661 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 1036 + '@esbuild/win32-x64@0.25.9': 1662 1037 optional: true 1663 1038 1664 - '@img/sharp-wasm32@0.33.5': 1039 + '@jridgewell/gen-mapping@0.3.13': 1665 1040 dependencies: 1666 - '@emnapi/runtime': 1.4.3 1667 - optional: true 1041 + '@jridgewell/sourcemap-codec': 1.5.5 1042 + '@jridgewell/trace-mapping': 0.3.30 1668 1043 1669 - '@img/sharp-win32-ia32@0.33.5': 1670 - optional: true 1044 + '@jridgewell/resolve-uri@3.1.2': {} 1671 1045 1672 - '@img/sharp-win32-x64@0.33.5': 1673 - optional: true 1046 + '@jridgewell/sourcemap-codec@1.5.5': {} 1674 1047 1675 - '@jridgewell/sourcemap-codec@1.5.0': {} 1048 + '@jridgewell/trace-mapping@0.3.30': 1049 + dependencies: 1050 + '@jridgewell/resolve-uri': 3.1.2 1051 + '@jridgewell/sourcemap-codec': 1.5.5 1676 1052 1677 - '@oslojs/encoding@1.1.0': {} 1053 + '@jsr/mary__exif-rm@0.2.2': {} 1678 1054 1679 - '@rollup/pluginutils@5.1.4(rollup@4.42.0)': 1680 - dependencies: 1681 - '@types/estree': 1.0.8 1682 - estree-walker: 2.0.2 1683 - picomatch: 4.0.2 1684 - optionalDependencies: 1685 - rollup: 4.42.0 1055 + '@nothing-but/utils@0.17.0': {} 1686 1056 1687 - '@rollup/rollup-android-arm-eabi@4.42.0': 1057 + '@rollup/rollup-android-arm-eabi@4.47.1': 1688 1058 optional: true 1689 1059 1690 - '@rollup/rollup-android-arm64@4.42.0': 1060 + '@rollup/rollup-android-arm64@4.47.1': 1691 1061 optional: true 1692 1062 1693 - '@rollup/rollup-darwin-arm64@4.42.0': 1063 + '@rollup/rollup-darwin-arm64@4.47.1': 1694 1064 optional: true 1695 1065 1696 - '@rollup/rollup-darwin-x64@4.42.0': 1066 + '@rollup/rollup-darwin-x64@4.47.1': 1697 1067 optional: true 1698 1068 1699 - '@rollup/rollup-freebsd-arm64@4.42.0': 1069 + '@rollup/rollup-freebsd-arm64@4.47.1': 1700 1070 optional: true 1701 1071 1702 - '@rollup/rollup-freebsd-x64@4.42.0': 1072 + '@rollup/rollup-freebsd-x64@4.47.1': 1703 1073 optional: true 1704 1074 1705 - '@rollup/rollup-linux-arm-gnueabihf@4.42.0': 1075 + '@rollup/rollup-linux-arm-gnueabihf@4.47.1': 1706 1076 optional: true 1707 1077 1708 - '@rollup/rollup-linux-arm-musleabihf@4.42.0': 1078 + '@rollup/rollup-linux-arm-musleabihf@4.47.1': 1709 1079 optional: true 1710 1080 1711 - '@rollup/rollup-linux-arm64-gnu@4.42.0': 1081 + '@rollup/rollup-linux-arm64-gnu@4.47.1': 1712 1082 optional: true 1713 1083 1714 - '@rollup/rollup-linux-arm64-musl@4.42.0': 1084 + '@rollup/rollup-linux-arm64-musl@4.47.1': 1715 1085 optional: true 1716 1086 1717 - '@rollup/rollup-linux-loongarch64-gnu@4.42.0': 1087 + '@rollup/rollup-linux-loongarch64-gnu@4.47.1': 1718 1088 optional: true 1719 1089 1720 - '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': 1090 + '@rollup/rollup-linux-ppc64-gnu@4.47.1': 1721 1091 optional: true 1722 1092 1723 - '@rollup/rollup-linux-riscv64-gnu@4.42.0': 1093 + '@rollup/rollup-linux-riscv64-gnu@4.47.1': 1724 1094 optional: true 1725 1095 1726 - '@rollup/rollup-linux-riscv64-musl@4.42.0': 1096 + '@rollup/rollup-linux-riscv64-musl@4.47.1': 1727 1097 optional: true 1728 1098 1729 - '@rollup/rollup-linux-s390x-gnu@4.42.0': 1099 + '@rollup/rollup-linux-s390x-gnu@4.47.1': 1730 1100 optional: true 1731 1101 1732 - '@rollup/rollup-linux-x64-gnu@4.42.0': 1102 + '@rollup/rollup-linux-x64-gnu@4.47.1': 1733 1103 optional: true 1734 1104 1735 - '@rollup/rollup-linux-x64-musl@4.42.0': 1105 + '@rollup/rollup-linux-x64-musl@4.47.1': 1736 1106 optional: true 1737 1107 1738 - '@rollup/rollup-win32-arm64-msvc@4.42.0': 1108 + '@rollup/rollup-win32-arm64-msvc@4.47.1': 1739 1109 optional: true 1740 1110 1741 - '@rollup/rollup-win32-ia32-msvc@4.42.0': 1111 + '@rollup/rollup-win32-ia32-msvc@4.47.1': 1742 1112 optional: true 1743 1113 1744 - '@rollup/rollup-win32-x64-msvc@4.42.0': 1114 + '@rollup/rollup-win32-x64-msvc@4.47.1': 1745 1115 optional: true 1746 1116 1747 - '@shikijs/core@3.6.0': 1117 + '@solid-devtools/debugger@0.28.1(solid-js@1.9.9)': 1748 1118 dependencies: 1749 - '@shikijs/types': 3.6.0 1750 - '@shikijs/vscode-textmate': 10.0.2 1751 - '@types/hast': 3.0.4 1752 - hast-util-to-html: 9.0.5 1119 + '@nothing-but/utils': 0.17.0 1120 + '@solid-devtools/shared': 0.20.0(solid-js@1.9.9) 1121 + '@solid-primitives/bounds': 0.1.3(solid-js@1.9.9) 1122 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1123 + '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.9) 1124 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1125 + '@solid-primitives/scheduled': 1.5.2(solid-js@1.9.9) 1126 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1127 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1128 + solid-js: 1.9.9 1753 1129 1754 - '@shikijs/engine-javascript@3.6.0': 1130 + '@solid-devtools/shared@0.20.0(solid-js@1.9.9)': 1755 1131 dependencies: 1756 - '@shikijs/types': 3.6.0 1757 - '@shikijs/vscode-textmate': 10.0.2 1758 - oniguruma-to-es: 4.3.3 1132 + '@nothing-but/utils': 0.17.0 1133 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1134 + '@solid-primitives/media': 2.3.3(solid-js@1.9.9) 1135 + '@solid-primitives/refs': 1.1.2(solid-js@1.9.9) 1136 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1137 + '@solid-primitives/scheduled': 1.5.2(solid-js@1.9.9) 1138 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1139 + '@solid-primitives/styles': 0.1.2(solid-js@1.9.9) 1140 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1141 + solid-js: 1.9.9 1759 1142 1760 - '@shikijs/engine-oniguruma@3.6.0': 1143 + '@solid-primitives/bounds@0.1.3(solid-js@1.9.9)': 1761 1144 dependencies: 1762 - '@shikijs/types': 3.6.0 1763 - '@shikijs/vscode-textmate': 10.0.2 1145 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1146 + '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.9) 1147 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1148 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1149 + solid-js: 1.9.9 1764 1150 1765 - '@shikijs/langs@3.6.0': 1151 + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.9)': 1766 1152 dependencies: 1767 - '@shikijs/types': 3.6.0 1153 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1154 + solid-js: 1.9.9 1768 1155 1769 - '@shikijs/themes@3.6.0': 1156 + '@solid-primitives/keyboard@1.3.3(solid-js@1.9.9)': 1770 1157 dependencies: 1771 - '@shikijs/types': 3.6.0 1158 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1159 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1160 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1161 + solid-js: 1.9.9 1772 1162 1773 - '@shikijs/types@3.6.0': 1163 + '@solid-primitives/media@2.3.3(solid-js@1.9.9)': 1774 1164 dependencies: 1775 - '@shikijs/vscode-textmate': 10.0.2 1776 - '@types/hast': 3.0.4 1777 - 1778 - '@shikijs/vscode-textmate@10.0.2': {} 1165 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1166 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1167 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1168 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1169 + solid-js: 1.9.9 1779 1170 1780 - '@swc/helpers@0.5.17': 1171 + '@solid-primitives/refs@1.1.2(solid-js@1.9.9)': 1781 1172 dependencies: 1782 - tslib: 2.8.1 1173 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1174 + solid-js: 1.9.9 1783 1175 1784 - '@types/debug@4.1.12': 1176 + '@solid-primitives/resize-observer@2.1.3(solid-js@1.9.9)': 1785 1177 dependencies: 1786 - '@types/ms': 2.1.0 1178 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) 1179 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1180 + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.9) 1181 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1182 + solid-js: 1.9.9 1787 1183 1788 - '@types/estree@1.0.7': {} 1789 - 1790 - '@types/estree@1.0.8': {} 1791 - 1792 - '@types/fontkit@2.0.8': 1184 + '@solid-primitives/rootless@1.5.2(solid-js@1.9.9)': 1793 1185 dependencies: 1794 - '@types/node': 22.15.30 1186 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1187 + solid-js: 1.9.9 1795 1188 1796 - '@types/hast@3.0.4': 1189 + '@solid-primitives/scheduled@1.5.2(solid-js@1.9.9)': 1797 1190 dependencies: 1798 - '@types/unist': 3.0.3 1191 + solid-js: 1.9.9 1799 1192 1800 - '@types/mdast@4.0.4': 1193 + '@solid-primitives/static-store@0.1.2(solid-js@1.9.9)': 1801 1194 dependencies: 1802 - '@types/unist': 3.0.3 1803 - 1804 - '@types/ms@2.1.0': {} 1195 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1196 + solid-js: 1.9.9 1805 1197 1806 - '@types/nlcst@2.0.3': 1198 + '@solid-primitives/styles@0.1.2(solid-js@1.9.9)': 1807 1199 dependencies: 1808 - '@types/unist': 3.0.3 1200 + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) 1201 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) 1202 + solid-js: 1.9.9 1809 1203 1810 - '@types/node@22.15.30': 1204 + '@solid-primitives/utils@6.3.2(solid-js@1.9.9)': 1811 1205 dependencies: 1812 - undici-types: 6.21.0 1813 - 1814 - '@types/unist@3.0.3': {} 1206 + solid-js: 1.9.9 1815 1207 1816 - '@ungap/structured-clone@1.3.0': {} 1817 - 1818 - acorn@8.15.0: {} 1819 - 1820 - ansi-align@3.0.1: 1208 + '@solidjs/router@0.15.3(solid-js@1.9.9)': 1821 1209 dependencies: 1822 - string-width: 4.2.3 1210 + solid-js: 1.9.9 1823 1211 1824 - ansi-regex@5.0.1: {} 1825 - 1826 - ansi-regex@6.1.0: {} 1827 - 1828 - ansi-styles@6.2.1: {} 1829 - 1830 - anymatch@3.1.3: 1212 + '@types/babel__core@7.20.5': 1831 1213 dependencies: 1832 - normalize-path: 3.0.0 1833 - picomatch: 2.3.1 1834 - 1835 - argparse@2.0.1: {} 1836 - 1837 - aria-query@5.3.2: {} 1838 - 1839 - array-iterate@2.0.1: {} 1214 + '@babel/parser': 7.28.3 1215 + '@babel/types': 7.28.2 1216 + '@types/babel__generator': 7.27.0 1217 + '@types/babel__template': 7.4.4 1218 + '@types/babel__traverse': 7.28.0 1840 1219 1841 - astro@5.9.1(@types/node@22.15.30)(rollup@4.42.0)(typescript@5.8.3): 1220 + '@types/babel__generator@7.27.0': 1842 1221 dependencies: 1843 - '@astrojs/compiler': 2.12.1 1844 - '@astrojs/internal-helpers': 0.6.1 1845 - '@astrojs/markdown-remark': 6.3.2 1846 - '@astrojs/telemetry': 3.3.0 1847 - '@capsizecss/unpack': 2.4.0 1848 - '@oslojs/encoding': 1.1.0 1849 - '@rollup/pluginutils': 5.1.4(rollup@4.42.0) 1850 - acorn: 8.15.0 1851 - aria-query: 5.3.2 1852 - axobject-query: 4.1.0 1853 - boxen: 8.0.1 1854 - ci-info: 4.2.0 1855 - clsx: 2.1.1 1856 - common-ancestor-path: 1.0.1 1857 - cookie: 1.0.2 1858 - cssesc: 3.0.0 1859 - debug: 4.4.1 1860 - deterministic-object-hash: 2.0.2 1861 - devalue: 5.1.1 1862 - diff: 5.2.0 1863 - dlv: 1.1.3 1864 - dset: 3.1.4 1865 - es-module-lexer: 1.7.0 1866 - esbuild: 0.25.5 1867 - estree-walker: 3.0.3 1868 - flattie: 1.1.1 1869 - fontace: 0.3.0 1870 - github-slugger: 2.0.0 1871 - html-escaper: 3.0.3 1872 - http-cache-semantics: 4.2.0 1873 - import-meta-resolve: 4.1.0 1874 - js-yaml: 4.1.0 1875 - kleur: 4.1.5 1876 - magic-string: 0.30.17 1877 - magicast: 0.3.5 1878 - mrmime: 2.0.1 1879 - neotraverse: 0.6.18 1880 - p-limit: 6.2.0 1881 - p-queue: 8.1.0 1882 - package-manager-detector: 1.3.0 1883 - picomatch: 4.0.2 1884 - prompts: 2.4.2 1885 - rehype: 13.0.2 1886 - semver: 7.7.2 1887 - shiki: 3.6.0 1888 - tinyexec: 0.3.2 1889 - tinyglobby: 0.2.14 1890 - tsconfck: 3.1.6(typescript@5.8.3) 1891 - ultrahtml: 1.6.0 1892 - unifont: 0.5.0 1893 - unist-util-visit: 5.0.0 1894 - unstorage: 1.16.0 1895 - vfile: 6.0.3 1896 - vite: 6.3.5(@types/node@22.15.30) 1897 - vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.30)) 1898 - xxhash-wasm: 1.1.0 1899 - yargs-parser: 21.1.1 1900 - yocto-spinner: 0.2.3 1901 - zod: 3.25.56 1902 - zod-to-json-schema: 3.24.5(zod@3.25.56) 1903 - zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.25.56) 1904 - optionalDependencies: 1905 - sharp: 0.33.5 1906 - transitivePeerDependencies: 1907 - - '@azure/app-configuration' 1908 - - '@azure/cosmos' 1909 - - '@azure/data-tables' 1910 - - '@azure/identity' 1911 - - '@azure/keyvault-secrets' 1912 - - '@azure/storage-blob' 1913 - - '@capacitor/preferences' 1914 - - '@deno/kv' 1915 - - '@netlify/blobs' 1916 - - '@planetscale/database' 1917 - - '@types/node' 1918 - - '@upstash/redis' 1919 - - '@vercel/blob' 1920 - - '@vercel/kv' 1921 - - aws4fetch 1922 - - db0 1923 - - encoding 1924 - - idb-keyval 1925 - - ioredis 1926 - - jiti 1927 - - less 1928 - - lightningcss 1929 - - rollup 1930 - - sass 1931 - - sass-embedded 1932 - - stylus 1933 - - sugarss 1934 - - supports-color 1935 - - terser 1936 - - tsx 1937 - - typescript 1938 - - uploadthing 1939 - - yaml 1940 - 1941 - axobject-query@4.1.0: {} 1222 + '@babel/types': 7.28.2 1942 1223 1943 - bail@2.0.2: {} 1944 - 1945 - base-64@1.0.0: {} 1946 - 1947 - base64-js@1.5.1: {} 1948 - 1949 - blob-to-buffer@1.2.9: {} 1950 - 1951 - boxen@8.0.1: 1224 + '@types/babel__template@7.4.4': 1952 1225 dependencies: 1953 - ansi-align: 3.0.1 1954 - camelcase: 8.0.0 1955 - chalk: 5.4.1 1956 - cli-boxes: 3.0.0 1957 - string-width: 7.2.0 1958 - type-fest: 4.41.0 1959 - widest-line: 5.0.0 1960 - wrap-ansi: 9.0.0 1226 + '@babel/parser': 7.28.3 1227 + '@babel/types': 7.28.2 1961 1228 1962 - brotli@1.3.3: 1229 + '@types/babel__traverse@7.28.0': 1963 1230 dependencies: 1964 - base64-js: 1.5.1 1965 - 1966 - camelcase@8.0.0: {} 1967 - 1968 - ccount@2.0.1: {} 1231 + '@babel/types': 7.28.2 1969 1232 1970 - chalk@5.4.1: {} 1233 + '@types/estree@1.0.8': {} 1971 1234 1972 - character-entities-html4@2.1.0: {} 1973 - 1974 - character-entities-legacy@3.0.0: {} 1975 - 1976 - character-entities@2.0.2: {} 1977 - 1978 - chokidar@4.0.3: 1235 + '@types/node@24.3.0': 1979 1236 dependencies: 1980 - readdirp: 4.1.2 1981 - 1982 - ci-info@4.2.0: {} 1237 + undici-types: 7.10.0 1983 1238 1984 - cli-boxes@3.0.0: {} 1985 - 1986 - clone@2.1.2: {} 1987 - 1988 - clsx@2.1.1: {} 1989 - 1990 - color-convert@2.0.1: 1239 + babel-plugin-jsx-dom-expressions@0.40.1(@babel/core@7.28.3): 1991 1240 dependencies: 1992 - color-name: 1.1.4 1993 - optional: true 1241 + '@babel/core': 7.28.3 1242 + '@babel/helper-module-imports': 7.18.6 1243 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) 1244 + '@babel/types': 7.28.2 1245 + html-entities: 2.3.3 1246 + parse5: 7.3.0 1247 + validate-html-nesting: 1.2.3 1994 1248 1995 - color-name@1.1.4: 1996 - optional: true 1997 - 1998 - color-string@1.9.1: 1249 + babel-preset-solid@1.9.9(@babel/core@7.28.3)(solid-js@1.9.9): 1999 1250 dependencies: 2000 - color-name: 1.1.4 2001 - simple-swizzle: 0.2.2 2002 - optional: true 1251 + '@babel/core': 7.28.3 1252 + babel-plugin-jsx-dom-expressions: 0.40.1(@babel/core@7.28.3) 1253 + optionalDependencies: 1254 + solid-js: 1.9.9 2003 1255 2004 - color@4.2.3: 1256 + browserslist@4.25.3: 2005 1257 dependencies: 2006 - color-convert: 2.0.1 2007 - color-string: 1.9.1 2008 - optional: true 1258 + caniuse-lite: 1.0.30001737 1259 + electron-to-chromium: 1.5.208 1260 + node-releases: 2.0.19 1261 + update-browserslist-db: 1.1.3(browserslist@4.25.3) 2009 1262 2010 - comma-separated-tokens@2.0.3: {} 2011 - 2012 - common-ancestor-path@1.0.1: {} 2013 - 2014 - cookie-es@1.2.2: {} 2015 - 2016 - cookie@1.0.2: {} 2017 - 2018 - cross-fetch@3.2.0: 2019 - dependencies: 2020 - node-fetch: 2.7.0 2021 - transitivePeerDependencies: 2022 - - encoding 1263 + caniuse-lite@1.0.30001737: {} 2023 1264 2024 - crossws@0.3.5: 2025 - dependencies: 2026 - uncrypto: 0.1.3 1265 + convert-source-map@2.0.0: {} 2027 1266 2028 - css-tree@3.1.0: 2029 - dependencies: 2030 - mdn-data: 2.12.2 2031 - source-map-js: 1.2.1 2032 - 2033 - cssesc@3.0.0: {} 1267 + csstype@3.1.3: {} 2034 1268 2035 1269 debug@4.4.1: 2036 1270 dependencies: 2037 1271 ms: 2.1.3 2038 1272 2039 - decode-named-character-reference@1.1.0: 2040 - dependencies: 2041 - character-entities: 2.0.2 2042 - 2043 - defu@6.1.4: {} 2044 - 2045 - dequal@2.0.3: {} 2046 - 2047 - destr@2.0.5: {} 2048 - 2049 - detect-libc@2.0.4: 2050 - optional: true 2051 - 2052 - deterministic-object-hash@2.0.2: 2053 - dependencies: 2054 - base-64: 1.0.0 2055 - 2056 - devalue@5.1.1: {} 2057 - 2058 - devlop@1.1.0: 2059 - dependencies: 2060 - dequal: 2.0.3 2061 - 2062 - dfa@1.2.0: {} 2063 - 2064 - diff@5.2.0: {} 2065 - 2066 - dlv@1.1.3: {} 2067 - 2068 - dset@3.1.4: {} 2069 - 2070 - emoji-regex@10.4.0: {} 2071 - 2072 - emoji-regex@8.0.0: {} 1273 + electron-to-chromium@1.5.208: {} 2073 1274 2074 1275 entities@6.0.1: {} 2075 1276 2076 - es-module-lexer@1.7.0: {} 2077 - 2078 - esbuild@0.25.5: 1277 + esbuild@0.25.9: 2079 1278 optionalDependencies: 2080 - '@esbuild/aix-ppc64': 0.25.5 2081 - '@esbuild/android-arm': 0.25.5 2082 - '@esbuild/android-arm64': 0.25.5 2083 - '@esbuild/android-x64': 0.25.5 2084 - '@esbuild/darwin-arm64': 0.25.5 2085 - '@esbuild/darwin-x64': 0.25.5 2086 - '@esbuild/freebsd-arm64': 0.25.5 2087 - '@esbuild/freebsd-x64': 0.25.5 2088 - '@esbuild/linux-arm': 0.25.5 2089 - '@esbuild/linux-arm64': 0.25.5 2090 - '@esbuild/linux-ia32': 0.25.5 2091 - '@esbuild/linux-loong64': 0.25.5 2092 - '@esbuild/linux-mips64el': 0.25.5 2093 - '@esbuild/linux-ppc64': 0.25.5 2094 - '@esbuild/linux-riscv64': 0.25.5 2095 - '@esbuild/linux-s390x': 0.25.5 2096 - '@esbuild/linux-x64': 0.25.5 2097 - '@esbuild/netbsd-arm64': 0.25.5 2098 - '@esbuild/netbsd-x64': 0.25.5 2099 - '@esbuild/openbsd-arm64': 0.25.5 2100 - '@esbuild/openbsd-x64': 0.25.5 2101 - '@esbuild/sunos-x64': 0.25.5 2102 - '@esbuild/win32-arm64': 0.25.5 2103 - '@esbuild/win32-ia32': 0.25.5 2104 - '@esbuild/win32-x64': 0.25.5 2105 - 2106 - escape-string-regexp@5.0.0: {} 2107 - 2108 - estree-walker@2.0.2: {} 2109 - 2110 - estree-walker@3.0.3: 2111 - dependencies: 2112 - '@types/estree': 1.0.8 2113 - 2114 - eventemitter3@5.0.1: {} 1279 + '@esbuild/aix-ppc64': 0.25.9 1280 + '@esbuild/android-arm': 0.25.9 1281 + '@esbuild/android-arm64': 0.25.9 1282 + '@esbuild/android-x64': 0.25.9 1283 + '@esbuild/darwin-arm64': 0.25.9 1284 + '@esbuild/darwin-x64': 0.25.9 1285 + '@esbuild/freebsd-arm64': 0.25.9 1286 + '@esbuild/freebsd-x64': 0.25.9 1287 + '@esbuild/linux-arm': 0.25.9 1288 + '@esbuild/linux-arm64': 0.25.9 1289 + '@esbuild/linux-ia32': 0.25.9 1290 + '@esbuild/linux-loong64': 0.25.9 1291 + '@esbuild/linux-mips64el': 0.25.9 1292 + '@esbuild/linux-ppc64': 0.25.9 1293 + '@esbuild/linux-riscv64': 0.25.9 1294 + '@esbuild/linux-s390x': 0.25.9 1295 + '@esbuild/linux-x64': 0.25.9 1296 + '@esbuild/netbsd-arm64': 0.25.9 1297 + '@esbuild/netbsd-x64': 0.25.9 1298 + '@esbuild/openbsd-arm64': 0.25.9 1299 + '@esbuild/openbsd-x64': 0.25.9 1300 + '@esbuild/openharmony-arm64': 0.25.9 1301 + '@esbuild/sunos-x64': 0.25.9 1302 + '@esbuild/win32-arm64': 0.25.9 1303 + '@esbuild/win32-ia32': 0.25.9 1304 + '@esbuild/win32-x64': 0.25.9 2115 1305 2116 - extend@3.0.2: {} 1306 + escalade@3.2.0: {} 2117 1307 2118 - fast-deep-equal@3.1.3: {} 1308 + esm-env@1.2.2: {} 2119 1309 2120 - fdir@6.4.5(picomatch@4.0.2): 1310 + fdir@6.5.0(picomatch@4.0.3): 2121 1311 optionalDependencies: 2122 - picomatch: 4.0.2 2123 - 2124 - flattie@1.1.1: {} 2125 - 2126 - fontace@0.3.0: 2127 - dependencies: 2128 - '@types/fontkit': 2.0.8 2129 - fontkit: 2.0.4 2130 - 2131 - fontkit@2.0.4: 2132 - dependencies: 2133 - '@swc/helpers': 0.5.17 2134 - brotli: 1.3.3 2135 - clone: 2.1.2 2136 - dfa: 1.2.0 2137 - fast-deep-equal: 3.1.3 2138 - restructure: 3.0.2 2139 - tiny-inflate: 1.0.3 2140 - unicode-properties: 1.4.1 2141 - unicode-trie: 2.0.0 1312 + picomatch: 4.0.3 2142 1313 2143 1314 fsevents@2.3.3: 2144 1315 optional: true 2145 1316 2146 - get-east-asian-width@1.3.0: {} 2147 - 2148 - github-slugger@2.0.0: {} 2149 - 2150 - h3@1.15.3: 2151 - dependencies: 2152 - cookie-es: 1.2.2 2153 - crossws: 0.3.5 2154 - defu: 6.1.4 2155 - destr: 2.0.5 2156 - iron-webcrypto: 1.2.1 2157 - node-mock-http: 1.0.0 2158 - radix3: 1.1.2 2159 - ufo: 1.6.1 2160 - uncrypto: 0.1.3 2161 - 2162 - hast-util-from-html@2.0.3: 2163 - dependencies: 2164 - '@types/hast': 3.0.4 2165 - devlop: 1.1.0 2166 - hast-util-from-parse5: 8.0.3 2167 - parse5: 7.3.0 2168 - vfile: 6.0.3 2169 - vfile-message: 4.0.2 2170 - 2171 - hast-util-from-parse5@8.0.3: 2172 - dependencies: 2173 - '@types/hast': 3.0.4 2174 - '@types/unist': 3.0.3 2175 - devlop: 1.1.0 2176 - hastscript: 9.0.1 2177 - property-information: 7.1.0 2178 - vfile: 6.0.3 2179 - vfile-location: 5.0.3 2180 - web-namespaces: 2.0.1 2181 - 2182 - hast-util-is-element@3.0.0: 2183 - dependencies: 2184 - '@types/hast': 3.0.4 2185 - 2186 - hast-util-parse-selector@4.0.0: 2187 - dependencies: 2188 - '@types/hast': 3.0.4 2189 - 2190 - hast-util-raw@9.1.0: 2191 - dependencies: 2192 - '@types/hast': 3.0.4 2193 - '@types/unist': 3.0.3 2194 - '@ungap/structured-clone': 1.3.0 2195 - hast-util-from-parse5: 8.0.3 2196 - hast-util-to-parse5: 8.0.0 2197 - html-void-elements: 3.0.0 2198 - mdast-util-to-hast: 13.2.0 2199 - parse5: 7.3.0 2200 - unist-util-position: 5.0.0 2201 - unist-util-visit: 5.0.0 2202 - vfile: 6.0.3 2203 - web-namespaces: 2.0.1 2204 - zwitch: 2.0.4 2205 - 2206 - hast-util-to-html@9.0.5: 2207 - dependencies: 2208 - '@types/hast': 3.0.4 2209 - '@types/unist': 3.0.3 2210 - ccount: 2.0.1 2211 - comma-separated-tokens: 2.0.3 2212 - hast-util-whitespace: 3.0.0 2213 - html-void-elements: 3.0.0 2214 - mdast-util-to-hast: 13.2.0 2215 - property-information: 7.1.0 2216 - space-separated-tokens: 2.0.2 2217 - stringify-entities: 4.0.4 2218 - zwitch: 2.0.4 2219 - 2220 - hast-util-to-parse5@8.0.0: 2221 - dependencies: 2222 - '@types/hast': 3.0.4 2223 - comma-separated-tokens: 2.0.3 2224 - devlop: 1.1.0 2225 - property-information: 6.5.0 2226 - space-separated-tokens: 2.0.2 2227 - web-namespaces: 2.0.1 2228 - zwitch: 2.0.4 2229 - 2230 - hast-util-to-text@4.0.2: 2231 - dependencies: 2232 - '@types/hast': 3.0.4 2233 - '@types/unist': 3.0.3 2234 - hast-util-is-element: 3.0.0 2235 - unist-util-find-after: 5.0.0 2236 - 2237 - hast-util-whitespace@3.0.0: 2238 - dependencies: 2239 - '@types/hast': 3.0.4 2240 - 2241 - hastscript@9.0.1: 2242 - dependencies: 2243 - '@types/hast': 3.0.4 2244 - comma-separated-tokens: 2.0.3 2245 - hast-util-parse-selector: 4.0.0 2246 - property-information: 7.1.0 2247 - space-separated-tokens: 2.0.2 2248 - 2249 - html-escaper@3.0.3: {} 2250 - 2251 - html-void-elements@3.0.0: {} 2252 - 2253 - http-cache-semantics@4.2.0: {} 2254 - 2255 - import-meta-resolve@4.1.0: {} 2256 - 2257 - iron-webcrypto@1.2.1: {} 2258 - 2259 - is-arrayish@0.3.2: 2260 - optional: true 2261 - 2262 - is-docker@3.0.0: {} 2263 - 2264 - is-fullwidth-code-point@3.0.0: {} 2265 - 2266 - is-inside-container@1.0.0: 2267 - dependencies: 2268 - is-docker: 3.0.0 2269 - 2270 - is-plain-obj@4.1.0: {} 2271 - 2272 - is-wsl@3.1.0: 2273 - dependencies: 2274 - is-inside-container: 1.0.0 2275 - 2276 - js-yaml@4.1.0: 2277 - dependencies: 2278 - argparse: 2.0.1 2279 - 2280 - kleur@3.0.3: {} 2281 - 2282 - kleur@4.1.5: {} 2283 - 2284 - longest-streak@3.1.0: {} 2285 - 2286 - lru-cache@10.4.3: {} 2287 - 2288 - magic-string@0.30.17: 2289 - dependencies: 2290 - '@jridgewell/sourcemap-codec': 1.5.0 2291 - 2292 - magicast@0.3.5: 2293 - dependencies: 2294 - '@babel/parser': 7.27.5 2295 - '@babel/types': 7.27.6 2296 - source-map-js: 1.2.1 2297 - 2298 - markdown-table@3.0.4: {} 2299 - 2300 - mdast-util-definitions@6.0.0: 2301 - dependencies: 2302 - '@types/mdast': 4.0.4 2303 - '@types/unist': 3.0.3 2304 - unist-util-visit: 5.0.0 2305 - 2306 - mdast-util-find-and-replace@3.0.2: 2307 - dependencies: 2308 - '@types/mdast': 4.0.4 2309 - escape-string-regexp: 5.0.0 2310 - unist-util-is: 6.0.0 2311 - unist-util-visit-parents: 6.0.1 2312 - 2313 - mdast-util-from-markdown@2.0.2: 2314 - dependencies: 2315 - '@types/mdast': 4.0.4 2316 - '@types/unist': 3.0.3 2317 - decode-named-character-reference: 1.1.0 2318 - devlop: 1.1.0 2319 - mdast-util-to-string: 4.0.0 2320 - micromark: 4.0.2 2321 - micromark-util-decode-numeric-character-reference: 2.0.2 2322 - micromark-util-decode-string: 2.0.1 2323 - micromark-util-normalize-identifier: 2.0.1 2324 - micromark-util-symbol: 2.0.1 2325 - micromark-util-types: 2.0.2 2326 - unist-util-stringify-position: 4.0.0 2327 - transitivePeerDependencies: 2328 - - supports-color 2329 - 2330 - mdast-util-gfm-autolink-literal@2.0.1: 2331 - dependencies: 2332 - '@types/mdast': 4.0.4 2333 - ccount: 2.0.1 2334 - devlop: 1.1.0 2335 - mdast-util-find-and-replace: 3.0.2 2336 - micromark-util-character: 2.1.1 2337 - 2338 - mdast-util-gfm-footnote@2.1.0: 2339 - dependencies: 2340 - '@types/mdast': 4.0.4 2341 - devlop: 1.1.0 2342 - mdast-util-from-markdown: 2.0.2 2343 - mdast-util-to-markdown: 2.1.2 2344 - micromark-util-normalize-identifier: 2.0.1 2345 - transitivePeerDependencies: 2346 - - supports-color 2347 - 2348 - mdast-util-gfm-strikethrough@2.0.0: 2349 - dependencies: 2350 - '@types/mdast': 4.0.4 2351 - mdast-util-from-markdown: 2.0.2 2352 - mdast-util-to-markdown: 2.1.2 2353 - transitivePeerDependencies: 2354 - - supports-color 2355 - 2356 - mdast-util-gfm-table@2.0.0: 2357 - dependencies: 2358 - '@types/mdast': 4.0.4 2359 - devlop: 1.1.0 2360 - markdown-table: 3.0.4 2361 - mdast-util-from-markdown: 2.0.2 2362 - mdast-util-to-markdown: 2.1.2 2363 - transitivePeerDependencies: 2364 - - supports-color 2365 - 2366 - mdast-util-gfm-task-list-item@2.0.0: 2367 - dependencies: 2368 - '@types/mdast': 4.0.4 2369 - devlop: 1.1.0 2370 - mdast-util-from-markdown: 2.0.2 2371 - mdast-util-to-markdown: 2.1.2 2372 - transitivePeerDependencies: 2373 - - supports-color 2374 - 2375 - mdast-util-gfm@3.1.0: 2376 - dependencies: 2377 - mdast-util-from-markdown: 2.0.2 2378 - mdast-util-gfm-autolink-literal: 2.0.1 2379 - mdast-util-gfm-footnote: 2.1.0 2380 - mdast-util-gfm-strikethrough: 2.0.0 2381 - mdast-util-gfm-table: 2.0.0 2382 - mdast-util-gfm-task-list-item: 2.0.0 2383 - mdast-util-to-markdown: 2.1.2 2384 - transitivePeerDependencies: 2385 - - supports-color 2386 - 2387 - mdast-util-phrasing@4.1.0: 2388 - dependencies: 2389 - '@types/mdast': 4.0.4 2390 - unist-util-is: 6.0.0 2391 - 2392 - mdast-util-to-hast@13.2.0: 2393 - dependencies: 2394 - '@types/hast': 3.0.4 2395 - '@types/mdast': 4.0.4 2396 - '@ungap/structured-clone': 1.3.0 2397 - devlop: 1.1.0 2398 - micromark-util-sanitize-uri: 2.0.1 2399 - trim-lines: 3.0.1 2400 - unist-util-position: 5.0.0 2401 - unist-util-visit: 5.0.0 2402 - vfile: 6.0.3 2403 - 2404 - mdast-util-to-markdown@2.1.2: 2405 - dependencies: 2406 - '@types/mdast': 4.0.4 2407 - '@types/unist': 3.0.3 2408 - longest-streak: 3.1.0 2409 - mdast-util-phrasing: 4.1.0 2410 - mdast-util-to-string: 4.0.0 2411 - micromark-util-classify-character: 2.0.1 2412 - micromark-util-decode-string: 2.0.1 2413 - unist-util-visit: 5.0.0 2414 - zwitch: 2.0.4 2415 - 2416 - mdast-util-to-string@4.0.0: 2417 - dependencies: 2418 - '@types/mdast': 4.0.4 2419 - 2420 - mdn-data@2.12.2: {} 2421 - 2422 - micromark-core-commonmark@2.0.3: 2423 - dependencies: 2424 - decode-named-character-reference: 1.1.0 2425 - devlop: 1.1.0 2426 - micromark-factory-destination: 2.0.1 2427 - micromark-factory-label: 2.0.1 2428 - micromark-factory-space: 2.0.1 2429 - micromark-factory-title: 2.0.1 2430 - micromark-factory-whitespace: 2.0.1 2431 - micromark-util-character: 2.1.1 2432 - micromark-util-chunked: 2.0.1 2433 - micromark-util-classify-character: 2.0.1 2434 - micromark-util-html-tag-name: 2.0.1 2435 - micromark-util-normalize-identifier: 2.0.1 2436 - micromark-util-resolve-all: 2.0.1 2437 - micromark-util-subtokenize: 2.1.0 2438 - micromark-util-symbol: 2.0.1 2439 - micromark-util-types: 2.0.2 2440 - 2441 - micromark-extension-gfm-autolink-literal@2.1.0: 2442 - dependencies: 2443 - micromark-util-character: 2.1.1 2444 - micromark-util-sanitize-uri: 2.0.1 2445 - micromark-util-symbol: 2.0.1 2446 - micromark-util-types: 2.0.2 1317 + gensync@1.0.0-beta.2: {} 2447 1318 2448 - micromark-extension-gfm-footnote@2.1.0: 2449 - dependencies: 2450 - devlop: 1.1.0 2451 - micromark-core-commonmark: 2.0.3 2452 - micromark-factory-space: 2.0.1 2453 - micromark-util-character: 2.1.1 2454 - micromark-util-normalize-identifier: 2.0.1 2455 - micromark-util-sanitize-uri: 2.0.1 2456 - micromark-util-symbol: 2.0.1 2457 - micromark-util-types: 2.0.2 1319 + html-entities@2.3.3: {} 2458 1320 2459 - micromark-extension-gfm-strikethrough@2.1.0: 2460 - dependencies: 2461 - devlop: 1.1.0 2462 - micromark-util-chunked: 2.0.1 2463 - micromark-util-classify-character: 2.0.1 2464 - micromark-util-resolve-all: 2.0.1 2465 - micromark-util-symbol: 2.0.1 2466 - micromark-util-types: 2.0.2 1321 + is-what@4.1.16: {} 2467 1322 2468 - micromark-extension-gfm-table@2.1.1: 2469 - dependencies: 2470 - devlop: 1.1.0 2471 - micromark-factory-space: 2.0.1 2472 - micromark-util-character: 2.1.1 2473 - micromark-util-symbol: 2.0.1 2474 - micromark-util-types: 2.0.2 1323 + js-tokens@4.0.0: {} 2475 1324 2476 - micromark-extension-gfm-tagfilter@2.0.0: 2477 - dependencies: 2478 - micromark-util-types: 2.0.2 1325 + jsesc@3.1.0: {} 2479 1326 2480 - micromark-extension-gfm-task-list-item@2.1.0: 2481 - dependencies: 2482 - devlop: 1.1.0 2483 - micromark-factory-space: 2.0.1 2484 - micromark-util-character: 2.1.1 2485 - micromark-util-symbol: 2.0.1 2486 - micromark-util-types: 2.0.2 1327 + json5@2.2.3: {} 2487 1328 2488 - micromark-extension-gfm@3.0.0: 1329 + lru-cache@5.1.1: 2489 1330 dependencies: 2490 - micromark-extension-gfm-autolink-literal: 2.1.0 2491 - micromark-extension-gfm-footnote: 2.1.0 2492 - micromark-extension-gfm-strikethrough: 2.1.0 2493 - micromark-extension-gfm-table: 2.1.1 2494 - micromark-extension-gfm-tagfilter: 2.0.0 2495 - micromark-extension-gfm-task-list-item: 2.1.0 2496 - micromark-util-combine-extensions: 2.0.1 2497 - micromark-util-types: 2.0.2 1331 + yallist: 3.1.1 2498 1332 2499 - micromark-factory-destination@2.0.1: 1333 + merge-anything@5.1.7: 2500 1334 dependencies: 2501 - micromark-util-character: 2.1.1 2502 - micromark-util-symbol: 2.0.1 2503 - micromark-util-types: 2.0.2 2504 - 2505 - micromark-factory-label@2.0.1: 2506 - dependencies: 2507 - devlop: 1.1.0 2508 - micromark-util-character: 2.1.1 2509 - micromark-util-symbol: 2.0.1 2510 - micromark-util-types: 2.0.2 2511 - 2512 - micromark-factory-space@2.0.1: 2513 - dependencies: 2514 - micromark-util-character: 2.1.1 2515 - micromark-util-types: 2.0.2 2516 - 2517 - micromark-factory-title@2.0.1: 2518 - dependencies: 2519 - micromark-factory-space: 2.0.1 2520 - micromark-util-character: 2.1.1 2521 - micromark-util-symbol: 2.0.1 2522 - micromark-util-types: 2.0.2 2523 - 2524 - micromark-factory-whitespace@2.0.1: 2525 - dependencies: 2526 - micromark-factory-space: 2.0.1 2527 - micromark-util-character: 2.1.1 2528 - micromark-util-symbol: 2.0.1 2529 - micromark-util-types: 2.0.2 2530 - 2531 - micromark-util-character@2.1.1: 2532 - dependencies: 2533 - micromark-util-symbol: 2.0.1 2534 - micromark-util-types: 2.0.2 2535 - 2536 - micromark-util-chunked@2.0.1: 2537 - dependencies: 2538 - micromark-util-symbol: 2.0.1 2539 - 2540 - micromark-util-classify-character@2.0.1: 2541 - dependencies: 2542 - micromark-util-character: 2.1.1 2543 - micromark-util-symbol: 2.0.1 2544 - micromark-util-types: 2.0.2 2545 - 2546 - micromark-util-combine-extensions@2.0.1: 2547 - dependencies: 2548 - micromark-util-chunked: 2.0.1 2549 - micromark-util-types: 2.0.2 2550 - 2551 - micromark-util-decode-numeric-character-reference@2.0.2: 2552 - dependencies: 2553 - micromark-util-symbol: 2.0.1 2554 - 2555 - micromark-util-decode-string@2.0.1: 2556 - dependencies: 2557 - decode-named-character-reference: 1.1.0 2558 - micromark-util-character: 2.1.1 2559 - micromark-util-decode-numeric-character-reference: 2.0.2 2560 - micromark-util-symbol: 2.0.1 2561 - 2562 - micromark-util-encode@2.0.1: {} 2563 - 2564 - micromark-util-html-tag-name@2.0.1: {} 2565 - 2566 - micromark-util-normalize-identifier@2.0.1: 2567 - dependencies: 2568 - micromark-util-symbol: 2.0.1 2569 - 2570 - micromark-util-resolve-all@2.0.1: 2571 - dependencies: 2572 - micromark-util-types: 2.0.2 2573 - 2574 - micromark-util-sanitize-uri@2.0.1: 2575 - dependencies: 2576 - micromark-util-character: 2.1.1 2577 - micromark-util-encode: 2.0.1 2578 - micromark-util-symbol: 2.0.1 2579 - 2580 - micromark-util-subtokenize@2.1.0: 2581 - dependencies: 2582 - devlop: 1.1.0 2583 - micromark-util-chunked: 2.0.1 2584 - micromark-util-symbol: 2.0.1 2585 - micromark-util-types: 2.0.2 2586 - 2587 - micromark-util-symbol@2.0.1: {} 2588 - 2589 - micromark-util-types@2.0.2: {} 2590 - 2591 - micromark@4.0.2: 2592 - dependencies: 2593 - '@types/debug': 4.1.12 2594 - debug: 4.4.1 2595 - decode-named-character-reference: 1.1.0 2596 - devlop: 1.1.0 2597 - micromark-core-commonmark: 2.0.3 2598 - micromark-factory-space: 2.0.1 2599 - micromark-util-character: 2.1.1 2600 - micromark-util-chunked: 2.0.1 2601 - micromark-util-combine-extensions: 2.0.1 2602 - micromark-util-decode-numeric-character-reference: 2.0.2 2603 - micromark-util-encode: 2.0.1 2604 - micromark-util-normalize-identifier: 2.0.1 2605 - micromark-util-resolve-all: 2.0.1 2606 - micromark-util-sanitize-uri: 2.0.1 2607 - micromark-util-subtokenize: 2.1.0 2608 - micromark-util-symbol: 2.0.1 2609 - micromark-util-types: 2.0.2 2610 - transitivePeerDependencies: 2611 - - supports-color 2612 - 2613 - mrmime@2.0.1: {} 1335 + is-what: 4.1.16 2614 1336 2615 1337 ms@2.1.3: {} 2616 1338 2617 1339 nanoid@3.3.11: {} 2618 1340 2619 - neotraverse@0.6.18: {} 2620 - 2621 - nlcst-to-string@4.0.0: 2622 - dependencies: 2623 - '@types/nlcst': 2.0.3 2624 - 2625 - node-fetch-native@1.6.6: {} 2626 - 2627 - node-fetch@2.7.0: 2628 - dependencies: 2629 - whatwg-url: 5.0.0 2630 - 2631 - node-mock-http@1.0.0: {} 2632 - 2633 - normalize-path@3.0.0: {} 2634 - 2635 - ofetch@1.4.1: 2636 - dependencies: 2637 - destr: 2.0.5 2638 - node-fetch-native: 1.6.6 2639 - ufo: 1.6.1 2640 - 2641 - ohash@2.0.11: {} 2642 - 2643 - oniguruma-parser@0.12.1: {} 2644 - 2645 - oniguruma-to-es@4.3.3: 2646 - dependencies: 2647 - oniguruma-parser: 0.12.1 2648 - regex: 6.0.1 2649 - regex-recursion: 6.0.2 2650 - 2651 - p-limit@6.2.0: 2652 - dependencies: 2653 - yocto-queue: 1.2.1 2654 - 2655 - p-queue@8.1.0: 2656 - dependencies: 2657 - eventemitter3: 5.0.1 2658 - p-timeout: 6.1.4 1341 + nanoid@5.1.5: {} 2659 1342 2660 - p-timeout@6.1.4: {} 2661 - 2662 - package-manager-detector@1.3.0: {} 2663 - 2664 - pako@0.2.9: {} 2665 - 2666 - parse-latin@7.0.0: 2667 - dependencies: 2668 - '@types/nlcst': 2.0.3 2669 - '@types/unist': 3.0.3 2670 - nlcst-to-string: 4.0.0 2671 - unist-util-modify-children: 4.0.0 2672 - unist-util-visit-children: 3.0.0 2673 - vfile: 6.0.3 1343 + node-releases@2.0.19: {} 2674 1344 2675 1345 parse5@7.3.0: 2676 1346 dependencies: ··· 2678 1348 2679 1349 picocolors@1.1.1: {} 2680 1350 2681 - picomatch@2.3.1: {} 1351 + picomatch@4.0.3: {} 2682 1352 2683 - picomatch@4.0.2: {} 2684 - 2685 - postcss@8.5.4: 1353 + postcss@8.5.6: 2686 1354 dependencies: 2687 1355 nanoid: 3.3.11 2688 1356 picocolors: 1.1.1 2689 1357 source-map-js: 1.2.1 2690 1358 2691 - prismjs@1.30.0: {} 1359 + prettier@3.6.2: {} 2692 1360 2693 - prompts@2.4.2: 1361 + rollup@4.47.1: 2694 1362 dependencies: 2695 - kleur: 3.0.3 2696 - sisteransi: 1.0.5 1363 + '@types/estree': 1.0.8 1364 + optionalDependencies: 1365 + '@rollup/rollup-android-arm-eabi': 4.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 + fsevents: 2.3.3 2697 1386 2698 - property-information@6.5.0: {} 2699 - 2700 - property-information@7.1.0: {} 2701 - 2702 - radix3@1.1.2: {} 2703 - 2704 - readdirp@4.1.2: {} 1387 + semver@6.3.1: {} 2705 1388 2706 - regex-recursion@6.0.2: 1389 + seroval-plugins@1.3.2(seroval@1.3.2): 2707 1390 dependencies: 2708 - regex-utilities: 2.3.0 1391 + seroval: 1.3.2 2709 1392 2710 - regex-utilities@2.3.0: {} 2711 - 2712 - regex@6.0.1: 2713 - dependencies: 2714 - regex-utilities: 2.3.0 2715 - 2716 - rehype-parse@9.0.1: 2717 - dependencies: 2718 - '@types/hast': 3.0.4 2719 - hast-util-from-html: 2.0.3 2720 - unified: 11.0.5 2721 - 2722 - rehype-raw@7.0.0: 2723 - dependencies: 2724 - '@types/hast': 3.0.4 2725 - hast-util-raw: 9.1.0 2726 - vfile: 6.0.3 2727 - 2728 - rehype-stringify@10.0.1: 2729 - dependencies: 2730 - '@types/hast': 3.0.4 2731 - hast-util-to-html: 9.0.5 2732 - unified: 11.0.5 2733 - 2734 - rehype@13.0.2: 2735 - dependencies: 2736 - '@types/hast': 3.0.4 2737 - rehype-parse: 9.0.1 2738 - rehype-stringify: 10.0.1 2739 - unified: 11.0.5 2740 - 2741 - remark-gfm@4.0.1: 2742 - dependencies: 2743 - '@types/mdast': 4.0.4 2744 - mdast-util-gfm: 3.1.0 2745 - micromark-extension-gfm: 3.0.0 2746 - remark-parse: 11.0.0 2747 - remark-stringify: 11.0.0 2748 - unified: 11.0.5 2749 - transitivePeerDependencies: 2750 - - supports-color 1393 + seroval@1.3.2: {} 2751 1394 2752 - remark-parse@11.0.0: 1395 + solid-devtools@0.34.3(solid-js@1.9.9)(vite@6.3.5(@types/node@24.3.0)): 2753 1396 dependencies: 2754 - '@types/mdast': 4.0.4 2755 - mdast-util-from-markdown: 2.0.2 2756 - micromark-util-types: 2.0.2 2757 - unified: 11.0.5 1397 + '@babel/core': 7.28.3 1398 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) 1399 + '@babel/types': 7.28.2 1400 + '@solid-devtools/debugger': 0.28.1(solid-js@1.9.9) 1401 + '@solid-devtools/shared': 0.20.0(solid-js@1.9.9) 1402 + solid-js: 1.9.9 1403 + optionalDependencies: 1404 + vite: 6.3.5(@types/node@24.3.0) 2758 1405 transitivePeerDependencies: 2759 1406 - supports-color 2760 1407 2761 - remark-rehype@11.1.2: 2762 - dependencies: 2763 - '@types/hast': 3.0.4 2764 - '@types/mdast': 4.0.4 2765 - mdast-util-to-hast: 13.2.0 2766 - unified: 11.0.5 2767 - vfile: 6.0.3 2768 - 2769 - remark-smartypants@3.0.2: 2770 - dependencies: 2771 - retext: 9.0.0 2772 - retext-smartypants: 6.2.0 2773 - unified: 11.0.5 2774 - unist-util-visit: 5.0.0 2775 - 2776 - remark-stringify@11.0.0: 2777 - dependencies: 2778 - '@types/mdast': 4.0.4 2779 - mdast-util-to-markdown: 2.1.2 2780 - unified: 11.0.5 2781 - 2782 - restructure@3.0.2: {} 2783 - 2784 - retext-latin@4.0.0: 1408 + solid-js@1.9.9: 2785 1409 dependencies: 2786 - '@types/nlcst': 2.0.3 2787 - parse-latin: 7.0.0 2788 - unified: 11.0.5 1410 + csstype: 3.1.3 1411 + seroval: 1.3.2 1412 + seroval-plugins: 1.3.2(seroval@1.3.2) 2789 1413 2790 - retext-smartypants@6.2.0: 1414 + solid-refresh@0.6.3(solid-js@1.9.9): 2791 1415 dependencies: 2792 - '@types/nlcst': 2.0.3 2793 - nlcst-to-string: 4.0.0 2794 - unist-util-visit: 5.0.0 2795 - 2796 - retext-stringify@4.0.0: 2797 - dependencies: 2798 - '@types/nlcst': 2.0.3 2799 - nlcst-to-string: 4.0.0 2800 - unified: 11.0.5 2801 - 2802 - retext@9.0.0: 2803 - dependencies: 2804 - '@types/nlcst': 2.0.3 2805 - retext-latin: 4.0.0 2806 - retext-stringify: 4.0.0 2807 - unified: 11.0.5 2808 - 2809 - rollup@4.42.0: 2810 - dependencies: 2811 - '@types/estree': 1.0.7 2812 - optionalDependencies: 2813 - '@rollup/rollup-android-arm-eabi': 4.42.0 2814 - '@rollup/rollup-android-arm64': 4.42.0 2815 - '@rollup/rollup-darwin-arm64': 4.42.0 2816 - '@rollup/rollup-darwin-x64': 4.42.0 2817 - '@rollup/rollup-freebsd-arm64': 4.42.0 2818 - '@rollup/rollup-freebsd-x64': 4.42.0 2819 - '@rollup/rollup-linux-arm-gnueabihf': 4.42.0 2820 - '@rollup/rollup-linux-arm-musleabihf': 4.42.0 2821 - '@rollup/rollup-linux-arm64-gnu': 4.42.0 2822 - '@rollup/rollup-linux-arm64-musl': 4.42.0 2823 - '@rollup/rollup-linux-loongarch64-gnu': 4.42.0 2824 - '@rollup/rollup-linux-powerpc64le-gnu': 4.42.0 2825 - '@rollup/rollup-linux-riscv64-gnu': 4.42.0 2826 - '@rollup/rollup-linux-riscv64-musl': 4.42.0 2827 - '@rollup/rollup-linux-s390x-gnu': 4.42.0 2828 - '@rollup/rollup-linux-x64-gnu': 4.42.0 2829 - '@rollup/rollup-linux-x64-musl': 4.42.0 2830 - '@rollup/rollup-win32-arm64-msvc': 4.42.0 2831 - '@rollup/rollup-win32-ia32-msvc': 4.42.0 2832 - '@rollup/rollup-win32-x64-msvc': 4.42.0 2833 - fsevents: 2.3.3 2834 - 2835 - semver@7.7.2: {} 2836 - 2837 - sharp@0.33.5: 2838 - dependencies: 2839 - color: 4.2.3 2840 - detect-libc: 2.0.4 2841 - semver: 7.7.2 2842 - optionalDependencies: 2843 - '@img/sharp-darwin-arm64': 0.33.5 2844 - '@img/sharp-darwin-x64': 0.33.5 2845 - '@img/sharp-libvips-darwin-arm64': 1.0.4 2846 - '@img/sharp-libvips-darwin-x64': 1.0.4 2847 - '@img/sharp-libvips-linux-arm': 1.0.5 2848 - '@img/sharp-libvips-linux-arm64': 1.0.4 2849 - '@img/sharp-libvips-linux-s390x': 1.0.4 2850 - '@img/sharp-libvips-linux-x64': 1.0.4 2851 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 2852 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 2853 - '@img/sharp-linux-arm': 0.33.5 2854 - '@img/sharp-linux-arm64': 0.33.5 2855 - '@img/sharp-linux-s390x': 0.33.5 2856 - '@img/sharp-linux-x64': 0.33.5 2857 - '@img/sharp-linuxmusl-arm64': 0.33.5 2858 - '@img/sharp-linuxmusl-x64': 0.33.5 2859 - '@img/sharp-wasm32': 0.33.5 2860 - '@img/sharp-win32-ia32': 0.33.5 2861 - '@img/sharp-win32-x64': 0.33.5 2862 - optional: true 2863 - 2864 - shiki@3.6.0: 2865 - dependencies: 2866 - '@shikijs/core': 3.6.0 2867 - '@shikijs/engine-javascript': 3.6.0 2868 - '@shikijs/engine-oniguruma': 3.6.0 2869 - '@shikijs/langs': 3.6.0 2870 - '@shikijs/themes': 3.6.0 2871 - '@shikijs/types': 3.6.0 2872 - '@shikijs/vscode-textmate': 10.0.2 2873 - '@types/hast': 3.0.4 2874 - 2875 - simple-swizzle@0.2.2: 2876 - dependencies: 2877 - is-arrayish: 0.3.2 2878 - optional: true 2879 - 2880 - sisteransi@1.0.5: {} 2881 - 2882 - smol-toml@1.3.4: {} 1416 + '@babel/generator': 7.28.3 1417 + '@babel/helper-module-imports': 7.27.1 1418 + '@babel/types': 7.28.2 1419 + solid-js: 1.9.9 1420 + transitivePeerDependencies: 1421 + - supports-color 2883 1422 2884 1423 source-map-js@1.2.1: {} 2885 1424 2886 - space-separated-tokens@2.0.2: {} 2887 - 2888 - string-width@4.2.3: 2889 - dependencies: 2890 - emoji-regex: 8.0.0 2891 - is-fullwidth-code-point: 3.0.0 2892 - strip-ansi: 6.0.1 2893 - 2894 - string-width@7.2.0: 2895 - dependencies: 2896 - emoji-regex: 10.4.0 2897 - get-east-asian-width: 1.3.0 2898 - strip-ansi: 7.1.0 2899 - 2900 - stringify-entities@4.0.4: 2901 - dependencies: 2902 - character-entities-html4: 2.1.0 2903 - character-entities-legacy: 3.0.0 2904 - 2905 - strip-ansi@6.0.1: 2906 - dependencies: 2907 - ansi-regex: 5.0.1 2908 - 2909 - strip-ansi@7.1.0: 2910 - dependencies: 2911 - ansi-regex: 6.1.0 2912 - 2913 - tiny-inflate@1.0.3: {} 2914 - 2915 - tinyexec@0.3.2: {} 2916 - 2917 1425 tinyglobby@0.2.14: 2918 1426 dependencies: 2919 - fdir: 6.4.5(picomatch@4.0.2) 2920 - picomatch: 4.0.2 2921 - 2922 - tr46@0.0.3: {} 2923 - 2924 - trim-lines@3.0.1: {} 2925 - 2926 - trough@2.2.0: {} 2927 - 2928 - tsconfck@3.1.6(typescript@5.8.3): 2929 - optionalDependencies: 2930 - typescript: 5.8.3 2931 - 2932 - tslib@2.8.1: {} 2933 - 2934 - type-fest@4.41.0: {} 2935 - 2936 - typescript@5.8.3: {} 2937 - 2938 - ufo@1.6.1: {} 2939 - 2940 - ultrahtml@1.6.0: {} 2941 - 2942 - uncrypto@0.1.3: {} 2943 - 2944 - undici-types@6.21.0: {} 2945 - 2946 - unicode-properties@1.4.1: 2947 - dependencies: 2948 - base64-js: 1.5.1 2949 - unicode-trie: 2.0.0 2950 - 2951 - unicode-trie@2.0.0: 2952 - dependencies: 2953 - pako: 0.2.9 2954 - tiny-inflate: 1.0.3 2955 - 2956 - unified@11.0.5: 2957 - dependencies: 2958 - '@types/unist': 3.0.3 2959 - bail: 2.0.2 2960 - devlop: 1.1.0 2961 - extend: 3.0.2 2962 - is-plain-obj: 4.1.0 2963 - trough: 2.2.0 2964 - vfile: 6.0.3 1427 + fdir: 6.5.0(picomatch@4.0.3) 1428 + picomatch: 4.0.3 2965 1429 2966 - unifont@0.5.0: 2967 - dependencies: 2968 - css-tree: 3.1.0 2969 - ohash: 2.0.11 1430 + typescript@5.9.2: {} 2970 1431 2971 - unist-util-find-after@5.0.0: 2972 - dependencies: 2973 - '@types/unist': 3.0.3 2974 - unist-util-is: 6.0.0 1432 + undici-types@7.10.0: {} 2975 1433 2976 - unist-util-is@6.0.0: 1434 + update-browserslist-db@1.1.3(browserslist@4.25.3): 2977 1435 dependencies: 2978 - '@types/unist': 3.0.3 1436 + browserslist: 4.25.3 1437 + escalade: 3.2.0 1438 + picocolors: 1.1.1 2979 1439 2980 - unist-util-modify-children@4.0.0: 2981 - dependencies: 2982 - '@types/unist': 3.0.3 2983 - array-iterate: 2.0.1 1440 + validate-html-nesting@1.2.3: {} 2984 1441 2985 - unist-util-position@5.0.0: 1442 + vite-plugin-solid@2.11.8(solid-js@1.9.9)(vite@6.3.5(@types/node@24.3.0)): 2986 1443 dependencies: 2987 - '@types/unist': 3.0.3 1444 + '@babel/core': 7.28.3 1445 + '@types/babel__core': 7.20.5 1446 + babel-preset-solid: 1.9.9(@babel/core@7.28.3)(solid-js@1.9.9) 1447 + merge-anything: 5.1.7 1448 + solid-js: 1.9.9 1449 + solid-refresh: 0.6.3(solid-js@1.9.9) 1450 + vite: 6.3.5(@types/node@24.3.0) 1451 + vitefu: 1.1.1(vite@6.3.5(@types/node@24.3.0)) 1452 + transitivePeerDependencies: 1453 + - supports-color 2988 1454 2989 - unist-util-remove-position@5.0.0: 1455 + vite@6.3.5(@types/node@24.3.0): 2990 1456 dependencies: 2991 - '@types/unist': 3.0.3 2992 - unist-util-visit: 5.0.0 2993 - 2994 - unist-util-stringify-position@4.0.0: 2995 - dependencies: 2996 - '@types/unist': 3.0.3 2997 - 2998 - unist-util-visit-children@3.0.0: 2999 - dependencies: 3000 - '@types/unist': 3.0.3 3001 - 3002 - unist-util-visit-parents@6.0.1: 3003 - dependencies: 3004 - '@types/unist': 3.0.3 3005 - unist-util-is: 6.0.0 3006 - 3007 - unist-util-visit@5.0.0: 3008 - dependencies: 3009 - '@types/unist': 3.0.3 3010 - unist-util-is: 6.0.0 3011 - unist-util-visit-parents: 6.0.1 3012 - 3013 - unstorage@1.16.0: 3014 - dependencies: 3015 - anymatch: 3.1.3 3016 - chokidar: 4.0.3 3017 - destr: 2.0.5 3018 - h3: 1.15.3 3019 - lru-cache: 10.4.3 3020 - node-fetch-native: 1.6.6 3021 - ofetch: 1.4.1 3022 - ufo: 1.6.1 3023 - 3024 - vfile-location@5.0.3: 3025 - dependencies: 3026 - '@types/unist': 3.0.3 3027 - vfile: 6.0.3 3028 - 3029 - vfile-message@4.0.2: 3030 - dependencies: 3031 - '@types/unist': 3.0.3 3032 - unist-util-stringify-position: 4.0.0 3033 - 3034 - vfile@6.0.3: 3035 - dependencies: 3036 - '@types/unist': 3.0.3 3037 - vfile-message: 4.0.2 3038 - 3039 - vite@6.3.5(@types/node@22.15.30): 3040 - dependencies: 3041 - esbuild: 0.25.5 3042 - fdir: 6.4.5(picomatch@4.0.2) 3043 - picomatch: 4.0.2 3044 - postcss: 8.5.4 3045 - rollup: 4.42.0 1457 + esbuild: 0.25.9 1458 + fdir: 6.5.0(picomatch@4.0.3) 1459 + picomatch: 4.0.3 1460 + postcss: 8.5.6 1461 + rollup: 4.47.1 3046 1462 tinyglobby: 0.2.14 3047 1463 optionalDependencies: 3048 - '@types/node': 22.15.30 1464 + '@types/node': 24.3.0 3049 1465 fsevents: 2.3.3 3050 1466 3051 - vitefu@1.0.6(vite@6.3.5(@types/node@22.15.30)): 1467 + vitefu@1.1.1(vite@6.3.5(@types/node@24.3.0)): 3052 1468 optionalDependencies: 3053 - vite: 6.3.5(@types/node@22.15.30) 3054 - 3055 - web-namespaces@2.0.1: {} 3056 - 3057 - webidl-conversions@3.0.1: {} 3058 - 3059 - whatwg-url@5.0.0: 3060 - dependencies: 3061 - tr46: 0.0.3 3062 - webidl-conversions: 3.0.1 3063 - 3064 - which-pm-runs@1.1.0: {} 1469 + vite: 6.3.5(@types/node@24.3.0) 3065 1470 3066 - widest-line@5.0.0: 3067 - dependencies: 3068 - string-width: 7.2.0 3069 - 3070 - wrap-ansi@9.0.0: 3071 - dependencies: 3072 - ansi-styles: 6.2.1 3073 - string-width: 7.2.0 3074 - strip-ansi: 7.1.0 3075 - 3076 - xxhash-wasm@1.1.0: {} 3077 - 3078 - yargs-parser@21.1.1: {} 3079 - 3080 - yocto-queue@1.2.1: {} 3081 - 3082 - yocto-spinner@0.2.3: 3083 - dependencies: 3084 - yoctocolors: 2.1.1 3085 - 3086 - yoctocolors@2.1.1: {} 3087 - 3088 - zod-to-json-schema@3.24.5(zod@3.25.56): 3089 - dependencies: 3090 - zod: 3.25.56 3091 - 3092 - zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.25.56): 3093 - dependencies: 3094 - typescript: 5.8.3 3095 - zod: 3.25.56 3096 - 3097 - zod@3.25.56: {} 3098 - 3099 - zwitch@2.0.4: {} 1471 + yallist@3.1.1: {}
-1
frontend/pnpm-workspace.yaml
··· 1 1 onlyBuiltDependencies: 2 2 - esbuild 3 - - sharp
-9
frontend/public/favicon.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128"> 2 - <path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" /> 3 - <style> 4 - path { fill: #000; } 5 - @media (prefers-color-scheme: dark) { 6 - path { fill: #FFF; } 7 - } 8 - </style> 9 - </svg>
frontend/public/images/404.png

This is a binary file and will not be displayed.

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

This is a binary file and will not be displayed.

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