social bookmarking for atproto

Compare changes

Choose any two refs to compare.

Changed files
+9965 -4074
.husky
.idea
.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 +
+1
.idea/clippr.iml
··· 10 10 <excludeFolder url="file://$MODULE_DIR$/backend/build" /> 11 11 <excludeFolder url="file://$MODULE_DIR$/.idea/dataSources" /> 12 12 <excludeFolder url="file://$MODULE_DIR$/lexicons/dist" /> 13 + <excludeFolder url="file://$MODULE_DIR$/backend/logs" /> 13 14 </content> 14 15 <orderEntry type="inheritedJdk" /> 15 16 <orderEntry type="sourceFolder" forTests="false" />
+1 -1
.idea/dataSources.xml
··· 1 1 <?xml version="1.0" encoding="UTF-8"?> 2 2 <project version="4"> 3 3 <component name="DataSourceManagerImpl" format="xml" multifile-model="true"> 4 - <data-source source="LOCAL" name="Backend DB" read-only="true" uuid="befffb07-c652-4b9d-8f1c-31a01590f686"> 4 + <data-source source="LOCAL" name="Backend DB" uuid="befffb07-c652-4b9d-8f1c-31a01590f686"> 5 5 <driver-ref>sqlite.xerial</driver-ref> 6 6 <synchronize>true</synchronize> 7 7 <jdbc-driver>org.sqlite.JDBC</jdbc-driver>
+9
.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> 10 + <w>bluesky</w> 8 11 <w>bsky</w> 9 12 <w>clippr</w> 10 13 <w>clipprjs</w> 11 14 <w>dids</w> 12 15 <w>hono</w> 13 16 <w>jetstream</w> 17 + <w>lexdocs</w> 18 + <w>llms</w> 19 + <w>llmstxt</w> 14 20 <w>multiformats</w> 21 + <w>nodeinfo</w> 22 + <w>nsid</w> 23 + <w>outdir</w> 15 24 <w>rkey</w> 16 25 <w>tseslint</w> 17 26 <w>xrpc</w>
+27
.idea/jsonSchemas.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <project version="4"> 3 + <component name="JsonSchemaMappingsProjectConfiguration"> 4 + <state> 5 + <map> 6 + <entry key="Lexicon Schema"> 7 + <value> 8 + <SchemaInfo> 9 + <option name="generatedName" value="New Schema" /> 10 + <option name="name" value="Lexicon Schema" /> 11 + <option name="relativePathToSchema" value="https://cdn.justdavi.dev/lexiconschema.json" /> 12 + <option name="patterns"> 13 + <list> 14 + <Item> 15 + <option name="directory" value="true" /> 16 + <option name="path" value="lexdocs" /> 17 + <option name="mappingKind" value="Directory" /> 18 + </Item> 19 + </list> 20 + </option> 21 + </SchemaInfo> 22 + </value> 23 + </entry> 24 + </map> 25 + </state> 26 + </component> 27 + </project>
+6
.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 9 11 - pnpm 12 + - gnused 10 13 11 14 steps: 12 15 - name: "Install dependencies" ··· 22 25 command: "pnpm run --dir ./backend/ build" 23 26 environment: 24 27 NODE_ENV: "production" 28 + 29 + environment: 30 + GIT_BRANCH: "main" 25 31 26 32 clone: 27 33 skip: false
+6
.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 9 11 - pnpm 12 + - gnused 10 13 11 14 steps: 12 15 - name: "Install dependencies" ··· 17 20 18 21 - name: "Build frontend" 19 22 command: "pnpm run --dir ./frontend/ build" 23 + 24 + environment: 25 + GIT_BRANCH: "main" 20 26 21 27 clone: 22 28 skip: false
+8 -2
.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 9 11 - pnpm 12 + - gnused 10 13 11 14 steps: 12 15 - name: "Install dependencies" ··· 16 19 CI: true 17 20 18 21 - name: "Generate lexicons" 19 - command: "pnpm run --dir ./lexicons/ generate " 22 + command: "pnpm run --dir ./lexicons/ generate" 20 23 21 24 - name: "Build package" 22 - command: "pnpm run --dir ./lexicons/ prepublish " 25 + command: "pnpm run --dir ./lexicons/ prepublish" 23 26 environment: 24 27 NODE_ENV: "production" 28 + 29 + environment: 30 + GIT_BRANCH: "main" 25 31 26 32 clone: 27 33 skip: false
+37 -6
README.md
··· 1 1 # clippr 2 2 3 - social bookmarking for atproto 3 + Social bookmarking for the AT Protocol. 4 + 5 + ## current status 6 + 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. 12 + 13 + The frontend has OAuth authentication and the ability to view and edit profiles, but is otherwise empty. 14 + 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. 4 18 5 19 ## what's in here? 6 20 7 - the project is sorted into four directories, comprised of: 21 + The project is sorted into different sections, with each root-level folder signifying a package. 22 + 23 + Each section will usually contain its own README.md file dedicated to it, going into more detail about that specific 24 + package. 25 + 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 | 32 + 33 + ## roadmap 34 + 35 + soonโ„ข๏ธ 36 + 37 + ## license 8 38 9 - * ``backend`` - the reference appview written using node and hono 10 - * ``frontend`` - the reference frontend written in astro and typescript 11 - * ``lex-src`` - the original lexicon files 12 - * ``lexicons`` - an atcute package for the clippr lexicon 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.
+2 -7
backend/.prettierrc
··· 8 8 "bracketSpacing": true, 9 9 "overrides": [ 10 10 { 11 - "files": [ 12 - "tsconfig.json", 13 - "jsconfig.json" 14 - ], 11 + "files": ["tsconfig.json", "jsconfig.json"], 15 12 "options": { 16 13 "parser": "jsonc" 17 14 } 18 15 }, 19 16 { 20 - "files": [ 21 - "*.md" 22 - ], 17 + "files": ["*.md"], 23 18 "options": { 24 19 "printWidth": 100, 25 20 "proseWrap": "always"
+27 -17
backend/README.md
··· 1 - # clippr-be 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 - ```sh 10 + ```shell 8 11 pnpm install 12 + cp config.example.toml config.toml # Customize as necessary 13 + pnpm run db:push 9 14 pnpm run dev 10 15 ``` 11 16 12 - open http://localhost:9090 and enjoy 17 + ## Build for production 13 18 14 - ## current status 19 + ```shell 20 + pnpm install 21 + cp config.example.toml config.toml # Customize as necessary 22 + pnpm run db:push 23 + pnpm run build 24 + pnpm run start 25 + ``` 15 26 16 - right now we're not running on bun because there are 17 - [some issues with the jetstream library](https://github.com/oven-sh/bun/issues/18807), which haven't 18 - been fixed yet. 27 + Open http://localhost:9090 and enjoy 19 28 20 - ### checklist before it's usable 29 + ## current status 21 30 22 - - [x] Ingesting content from the firehose (using Jetstream) 23 - - [x] Creating the lexicon documents and validating content that comes in from the firehose 24 - - [x] Indexing valid content from the firehose into a database 25 - - [ ] Handling OAuth authentication (public OAuth for the moment) 26 - - [ ] Creating responses to API calls 27 - - [ ] Create records through the API 28 - - [ ] Interact with the frontend 31 + - โœ… Ingesting content from the firehose (using Jetstream) 32 + - โœ… Validating incoming content according to the Lexicon schema 33 + - โœ… Indexing valid content from the firehose into a database 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",
+5
backend/eslint.config.ts
··· 22 22 eslint.configs.recommended, 23 23 { 24 24 languageOptions: { 25 + sourceType: "module", 25 26 globals: { 26 27 ...globals.node, 27 28 }, 29 + }, 30 + files: ["**/*.ts"], 31 + rules: { 32 + "no-undef": "off", 28 33 }, 29 34 }, 30 35 );
+28 -19
backend/package.json
··· 5 5 "license": "AGPL-3.0-only", 6 6 "scripts": { 7 7 "dev": "tsx watch src/main.ts", 8 - "build": "rm -r dist/; tsc", 8 + "build": "tsc", 9 9 "start": "node dist/src/main.js", 10 10 "lint": "npx eslint .", 11 11 "lint-write": "npx eslint . --fix", 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", 23 + "@atcute/client": "^4.0.3", 24 + "@atcute/crypto": "^2.2.4", 25 + "@atcute/identity": "^1.0.3", 26 + "@atcute/identity-resolver": "^1.1.3", 22 27 "@atcute/lexicon-doc": "^1.0.3", 23 - "@atcute/lexicons": "^1.1.0", 24 - "@clipprjs/lexicons": "^0.1.3", 28 + "@atcute/lexicons": "^1.1.1", 29 + "@clipprjs/lexicons": "^1.0.3", 25 30 "@eslint/eslintrc": "^3.3.1", 26 - "@hono/node-server": "^1.15.0", 27 - "@libsql/client": "^0.15.9", 28 - "@skyware/jetstream": "^0.2.2", 29 - "drizzle-orm": "^0.44.2", 30 - "hono": "^4.8.4", 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", 31 38 "toml": "^3.0.0", 32 39 "winston": "^3.17.0", 33 40 "xxhash-wasm": "^1.1.0" 34 41 }, 35 42 "devDependencies": { 36 43 "@atcute/lex-cli": "^2.1.1", 37 - "@eslint/js": "^9.30.1", 38 - "@typescript-eslint/eslint-plugin": "^8.35.1", 39 - "@typescript-eslint/parser": "^8.35.1", 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", 40 48 "drizzle-kit": "^0.31.4", 41 - "eslint": "^9.30.1", 42 - "eslint-config-prettier": "^10.1.5", 49 + "eslint": "^9.33.0", 50 + "eslint-config-prettier": "^10.1.8", 43 51 "eslint-plugin-drizzle": "^0.2.3", 44 52 "eslint-plugin-import": "^2.32.0", 45 - "eslint-plugin-prettier": "^5.5.1", 53 + "eslint-plugin-prettier": "^5.5.4", 46 54 "globals": "^16.3.0", 47 - "jiti": "^2.4.2", 55 + "jiti": "^2.5.1", 48 56 "prettier": "^3.6.2", 49 - "tsx": "^4.20.3", 50 - "typescript": "^5.8.3", 51 - "typescript-eslint": "^8.35.1" 57 + "tsx": "^4.20.4", 58 + "typescript": "^5.9.2", 59 + "typescript-eslint": "^8.40.0", 60 + "vitest": "^3.2.4" 52 61 } 53 62 }
+3219 -410
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 + '@atcute/client': 15 + specifier: ^4.0.3 16 + version: 4.0.3 17 + '@atcute/crypto': 18 + specifier: ^2.2.4 19 + version: 2.2.4 20 + '@atcute/identity': 21 + specifier: ^1.0.3 22 + version: 1.0.3 23 + '@atcute/identity-resolver': 24 + specifier: ^1.1.3 25 + version: 1.1.3(@atcute/identity@1.0.3) 14 26 '@atcute/lexicon-doc': 15 27 specifier: ^1.0.3 16 28 version: 1.0.3 17 29 '@atcute/lexicons': 18 - specifier: ^1.1.0 19 - version: 1.1.0 30 + specifier: ^1.1.1 31 + version: 1.1.1 20 32 '@clipprjs/lexicons': 21 - specifier: ^0.1.3 22 - version: 0.1.3 33 + specifier: ^1.0.3 34 + version: 1.0.3 23 35 '@eslint/eslintrc': 24 36 specifier: ^3.3.1 25 37 version: 3.3.1 26 38 '@hono/node-server': 27 - specifier: ^1.15.0 28 - version: 1.15.0(hono@4.8.4) 39 + specifier: ^1.19.0 40 + version: 1.19.0(hono@4.9.4) 29 41 '@libsql/client': 30 - specifier: ^0.15.9 31 - version: 0.15.9 42 + specifier: ^0.15.12 43 + version: 0.15.12 44 + '@scalar/hono-api-reference': 45 + specifier: ^0.9.15 46 + version: 0.9.15(hono@4.9.4) 47 + '@scalar/openapi-to-markdown': 48 + specifier: ^0.2.28 49 + version: 0.2.28(typescript@5.9.2) 32 50 '@skyware/jetstream': 33 - specifier: ^0.2.2 34 - version: 0.2.2(@atcute/client@2.0.9) 51 + specifier: ^0.2.5 52 + version: 0.2.5 35 53 drizzle-orm: 36 - specifier: ^0.44.2 37 - 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) 38 56 hono: 39 - specifier: ^4.8.4 40 - version: 4.8.4 57 + specifier: ^4.9.4 58 + version: 4.9.4 41 59 toml: 42 60 specifier: ^3.0.0 43 61 version: 3.0.0 ··· 52 70 specifier: ^2.1.1 53 71 version: 2.1.1 54 72 '@eslint/js': 55 - specifier: ^9.30.1 56 - version: 9.30.1 73 + specifier: ^9.33.0 74 + version: 9.33.0 75 + '@types/node': 76 + specifier: ^24.3.0 77 + version: 24.3.0 57 78 '@typescript-eslint/eslint-plugin': 58 - specifier: ^8.35.1 59 - version: 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 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) 60 81 '@typescript-eslint/parser': 61 - specifier: ^8.35.1 62 - version: 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 82 + specifier: ^8.40.0 83 + version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) 63 84 drizzle-kit: 64 85 specifier: ^0.31.4 65 86 version: 0.31.4 66 87 eslint: 67 - specifier: ^9.30.1 68 - version: 9.30.1(jiti@2.4.2) 88 + specifier: ^9.33.0 89 + version: 9.33.0(jiti@2.5.1) 69 90 eslint-config-prettier: 70 - specifier: ^10.1.5 71 - 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)) 72 93 eslint-plugin-drizzle: 73 94 specifier: ^0.2.3 74 - 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)) 75 96 eslint-plugin-import: 76 97 specifier: ^2.32.0 77 - version: 2.32.0(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)) 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)) 78 99 eslint-plugin-prettier: 79 - specifier: ^5.5.1 80 - version: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2) 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) 81 102 globals: 82 103 specifier: ^16.3.0 83 104 version: 16.3.0 84 105 jiti: 85 - specifier: ^2.4.2 86 - version: 2.4.2 106 + specifier: ^2.5.1 107 + version: 2.5.1 87 108 prettier: 88 109 specifier: ^3.6.2 89 110 version: 3.6.2 90 111 tsx: 91 - specifier: ^4.20.3 92 - version: 4.20.3 112 + specifier: ^4.20.4 113 + version: 4.20.4 93 114 typescript: 94 - specifier: ^5.8.3 95 - version: 5.8.3 115 + specifier: ^5.9.2 116 + version: 5.9.2 96 117 typescript-eslint: 97 - specifier: ^8.35.1 98 - version: 8.35.1(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) 99 123 100 124 packages: 101 125 102 - '@atcute/atproto@3.1.0': 103 - resolution: {integrity: sha512-aJbDsY7FcIh8APWKAimBtshPwqoRE056tc0UV6vw4TW4e3nYaHedoJmKhlh/k8KQWxyw64MQThNGMaC89HNoTg==} 126 + '@atcute/atproto@3.1.2': 127 + resolution: {integrity: sha512-m6OWoGTeL8Wlw7cm8Nrf+NU24rlx5A0DzxEQQPPu1wqYNHw6S33nOU90W+U09vVN0aZGZUrLFfWWhAaSWTp1ZQ==} 128 + 129 + '@atcute/bluesky@3.2.1': 130 + resolution: {integrity: sha512-WehZuGNEC9NNB2y7Jg/i4ANzbMEQzs2EwrLYKWDuvJT3YnPHEol3vkc4DK47TODs3TiacQJp4MWhsQyfktsZ6g==} 104 131 105 - '@atcute/bluesky@1.0.15': 106 - resolution: {integrity: sha512-+EFiybmKQ97aBAgtaD+cKRJER5AMn3cZMkEwEg/pDdWyzxYJ9m1UgemmLdTgI8VrxPufKqdXS2nl7uO7TY6BPA==} 132 + '@atcute/client@4.0.3': 133 + resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==} 134 + 135 + '@atcute/crypto@2.2.4': 136 + resolution: {integrity: sha512-88LbuJr63bbdJywd949YgbEiaaW4UU5iXJcFE1WqY/5ItYuoHWVdmL3XsqehiM0AfzvrYEfd5ox2wm9CK9dyQQ==} 137 + 138 + '@atcute/identity-resolver@1.1.3': 139 + resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==} 107 140 peerDependencies: 108 - '@atcute/client': ^1.0.0 || ^2.0.0 141 + '@atcute/identity': ^1.0.0 109 142 110 - '@atcute/client@2.0.9': 111 - resolution: {integrity: sha512-QNDm9gMP6x9LY77ArwY+urQOBtQW74/onEAz42c40JxRm6Rl9K9cU4ROvNKJ+5cpVmEm1sthEWVRmDr5CSZENA==} 143 + '@atcute/identity@1.0.3': 144 + resolution: {integrity: sha512-mNMxbKHFGys03A8JXKk0KfMBzdd0vrYMzZZWjpw1nYTs0+ea6bo5S1hwqVUZxHdo1gFHSe/t63jxQIF4yL9aKw==} 112 145 113 146 '@atcute/lex-cli@2.1.1': 114 147 resolution: {integrity: sha512-QaR0sOP8Z24opGHKsSfleDbP/ahUb6HECkVaOqSwG7ORZzbLK1w0265o1BRjCVr2dT6FxlsMUa2Ge85JMA9bxg==} ··· 117 150 '@atcute/lexicon-doc@1.0.3': 118 151 resolution: {integrity: sha512-U7rinsTOwXGGcrF6/s7GzTXargcQpDr4BTrj5ci/XTK+POEK5jpcI+Ag1fF932pBX3k97em6y4TWwTSO8M/McQ==} 119 152 120 - '@atcute/lexicons@1.1.0': 121 - 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==} 161 + 162 + '@atcute/util-fetch@1.0.1': 163 + resolution: {integrity: sha512-Clc0E/5ufyGBVfYBUwWNlHONlZCoblSr4Ho50l1LhmRPGB1Wu/AQ9Sz+rsBg7fdaW/auve8ulmwhRhnX2cGRow==} 164 + 165 + '@babel/helper-string-parser@7.27.1': 166 + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 167 + engines: {node: '>=6.9.0'} 168 + 169 + '@babel/helper-validator-identifier@7.27.1': 170 + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 171 + engines: {node: '>=6.9.0'} 172 + 173 + '@babel/parser@7.28.3': 174 + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} 175 + engines: {node: '>=6.0.0'} 176 + hasBin: true 122 177 123 - '@badrap/valita@0.4.5': 124 - resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==} 178 + '@babel/types@7.28.2': 179 + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 180 + engines: {node: '>=6.9.0'} 181 + 182 + '@badrap/valita@0.4.6': 183 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 125 184 engines: {node: '>= 18'} 126 185 127 - '@clipprjs/lexicons@0.1.3': 128 - resolution: {integrity: sha512-jv52Ib/E4hhoD/rXntZgBmVcCqBJe1EY7+WOLBqCyVvkdajMzpYHDHMFxALU61z7Gc6ducYJK3S5Ki7EnBywCw==} 186 + '@clipprjs/lexicons@1.0.3': 187 + resolution: {integrity: sha512-RmdrHXcIXBuLcqoDyLexJKNdz06wCvZsHxDlo8XY54J7Qpm7Sp5+K9jeeuEYJEiFZ1b6Tds0aggvi9s0s0NrMw==} 129 188 130 189 '@colors/colors@1.6.0': 131 190 resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} ··· 145 204 resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} 146 205 deprecated: 'Merged into tsx: https://tsx.is' 147 206 148 - '@esbuild/aix-ppc64@0.25.5': 149 - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 207 + '@esbuild/aix-ppc64@0.25.9': 208 + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} 150 209 engines: {node: '>=18'} 151 210 cpu: [ppc64] 152 211 os: [aix] ··· 157 216 cpu: [arm64] 158 217 os: [android] 159 218 160 - '@esbuild/android-arm64@0.25.5': 161 - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 219 + '@esbuild/android-arm64@0.25.9': 220 + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} 162 221 engines: {node: '>=18'} 163 222 cpu: [arm64] 164 223 os: [android] ··· 169 228 cpu: [arm] 170 229 os: [android] 171 230 172 - '@esbuild/android-arm@0.25.5': 173 - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 231 + '@esbuild/android-arm@0.25.9': 232 + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} 174 233 engines: {node: '>=18'} 175 234 cpu: [arm] 176 235 os: [android] ··· 181 240 cpu: [x64] 182 241 os: [android] 183 242 184 - '@esbuild/android-x64@0.25.5': 185 - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 243 + '@esbuild/android-x64@0.25.9': 244 + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} 186 245 engines: {node: '>=18'} 187 246 cpu: [x64] 188 247 os: [android] ··· 193 252 cpu: [arm64] 194 253 os: [darwin] 195 254 196 - '@esbuild/darwin-arm64@0.25.5': 197 - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 255 + '@esbuild/darwin-arm64@0.25.9': 256 + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} 198 257 engines: {node: '>=18'} 199 258 cpu: [arm64] 200 259 os: [darwin] ··· 205 264 cpu: [x64] 206 265 os: [darwin] 207 266 208 - '@esbuild/darwin-x64@0.25.5': 209 - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 267 + '@esbuild/darwin-x64@0.25.9': 268 + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} 210 269 engines: {node: '>=18'} 211 270 cpu: [x64] 212 271 os: [darwin] ··· 217 276 cpu: [arm64] 218 277 os: [freebsd] 219 278 220 - '@esbuild/freebsd-arm64@0.25.5': 221 - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 279 + '@esbuild/freebsd-arm64@0.25.9': 280 + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} 222 281 engines: {node: '>=18'} 223 282 cpu: [arm64] 224 283 os: [freebsd] ··· 229 288 cpu: [x64] 230 289 os: [freebsd] 231 290 232 - '@esbuild/freebsd-x64@0.25.5': 233 - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 291 + '@esbuild/freebsd-x64@0.25.9': 292 + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} 234 293 engines: {node: '>=18'} 235 294 cpu: [x64] 236 295 os: [freebsd] ··· 241 300 cpu: [arm64] 242 301 os: [linux] 243 302 244 - '@esbuild/linux-arm64@0.25.5': 245 - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 303 + '@esbuild/linux-arm64@0.25.9': 304 + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} 246 305 engines: {node: '>=18'} 247 306 cpu: [arm64] 248 307 os: [linux] ··· 253 312 cpu: [arm] 254 313 os: [linux] 255 314 256 - '@esbuild/linux-arm@0.25.5': 257 - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 315 + '@esbuild/linux-arm@0.25.9': 316 + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} 258 317 engines: {node: '>=18'} 259 318 cpu: [arm] 260 319 os: [linux] ··· 265 324 cpu: [ia32] 266 325 os: [linux] 267 326 268 - '@esbuild/linux-ia32@0.25.5': 269 - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 327 + '@esbuild/linux-ia32@0.25.9': 328 + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} 270 329 engines: {node: '>=18'} 271 330 cpu: [ia32] 272 331 os: [linux] ··· 277 336 cpu: [loong64] 278 337 os: [linux] 279 338 280 - '@esbuild/linux-loong64@0.25.5': 281 - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 339 + '@esbuild/linux-loong64@0.25.9': 340 + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} 282 341 engines: {node: '>=18'} 283 342 cpu: [loong64] 284 343 os: [linux] ··· 289 348 cpu: [mips64el] 290 349 os: [linux] 291 350 292 - '@esbuild/linux-mips64el@0.25.5': 293 - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 351 + '@esbuild/linux-mips64el@0.25.9': 352 + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} 294 353 engines: {node: '>=18'} 295 354 cpu: [mips64el] 296 355 os: [linux] ··· 301 360 cpu: [ppc64] 302 361 os: [linux] 303 362 304 - '@esbuild/linux-ppc64@0.25.5': 305 - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 363 + '@esbuild/linux-ppc64@0.25.9': 364 + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} 306 365 engines: {node: '>=18'} 307 366 cpu: [ppc64] 308 367 os: [linux] ··· 313 372 cpu: [riscv64] 314 373 os: [linux] 315 374 316 - '@esbuild/linux-riscv64@0.25.5': 317 - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 375 + '@esbuild/linux-riscv64@0.25.9': 376 + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} 318 377 engines: {node: '>=18'} 319 378 cpu: [riscv64] 320 379 os: [linux] ··· 325 384 cpu: [s390x] 326 385 os: [linux] 327 386 328 - '@esbuild/linux-s390x@0.25.5': 329 - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 387 + '@esbuild/linux-s390x@0.25.9': 388 + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} 330 389 engines: {node: '>=18'} 331 390 cpu: [s390x] 332 391 os: [linux] ··· 337 396 cpu: [x64] 338 397 os: [linux] 339 398 340 - '@esbuild/linux-x64@0.25.5': 341 - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 399 + '@esbuild/linux-x64@0.25.9': 400 + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} 342 401 engines: {node: '>=18'} 343 402 cpu: [x64] 344 403 os: [linux] 345 404 346 - '@esbuild/netbsd-arm64@0.25.5': 347 - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 405 + '@esbuild/netbsd-arm64@0.25.9': 406 + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} 348 407 engines: {node: '>=18'} 349 408 cpu: [arm64] 350 409 os: [netbsd] ··· 355 414 cpu: [x64] 356 415 os: [netbsd] 357 416 358 - '@esbuild/netbsd-x64@0.25.5': 359 - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 417 + '@esbuild/netbsd-x64@0.25.9': 418 + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} 360 419 engines: {node: '>=18'} 361 420 cpu: [x64] 362 421 os: [netbsd] 363 422 364 - '@esbuild/openbsd-arm64@0.25.5': 365 - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 423 + '@esbuild/openbsd-arm64@0.25.9': 424 + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} 366 425 engines: {node: '>=18'} 367 426 cpu: [arm64] 368 427 os: [openbsd] ··· 373 432 cpu: [x64] 374 433 os: [openbsd] 375 434 376 - '@esbuild/openbsd-x64@0.25.5': 377 - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 435 + '@esbuild/openbsd-x64@0.25.9': 436 + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} 378 437 engines: {node: '>=18'} 379 438 cpu: [x64] 380 439 os: [openbsd] 381 440 441 + '@esbuild/openharmony-arm64@0.25.9': 442 + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} 443 + engines: {node: '>=18'} 444 + cpu: [arm64] 445 + os: [openharmony] 446 + 382 447 '@esbuild/sunos-x64@0.18.20': 383 448 resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 384 449 engines: {node: '>=12'} 385 450 cpu: [x64] 386 451 os: [sunos] 387 452 388 - '@esbuild/sunos-x64@0.25.5': 389 - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 453 + '@esbuild/sunos-x64@0.25.9': 454 + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} 390 455 engines: {node: '>=18'} 391 456 cpu: [x64] 392 457 os: [sunos] ··· 397 462 cpu: [arm64] 398 463 os: [win32] 399 464 400 - '@esbuild/win32-arm64@0.25.5': 401 - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 465 + '@esbuild/win32-arm64@0.25.9': 466 + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} 402 467 engines: {node: '>=18'} 403 468 cpu: [arm64] 404 469 os: [win32] ··· 409 474 cpu: [ia32] 410 475 os: [win32] 411 476 412 - '@esbuild/win32-ia32@0.25.5': 413 - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 477 + '@esbuild/win32-ia32@0.25.9': 478 + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} 414 479 engines: {node: '>=18'} 415 480 cpu: [ia32] 416 481 os: [win32] ··· 421 486 cpu: [x64] 422 487 os: [win32] 423 488 424 - '@esbuild/win32-x64@0.25.5': 425 - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 489 + '@esbuild/win32-x64@0.25.9': 490 + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} 426 491 engines: {node: '>=18'} 427 492 cpu: [x64] 428 493 os: [win32] ··· 441 506 resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} 442 507 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 443 508 444 - '@eslint/config-helpers@0.3.0': 445 - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} 446 - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 447 - 448 - '@eslint/core@0.14.0': 449 - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 509 + '@eslint/config-helpers@0.3.1': 510 + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} 450 511 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 451 512 452 - '@eslint/core@0.15.1': 453 - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} 513 + '@eslint/core@0.15.2': 514 + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} 454 515 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 455 516 456 517 '@eslint/eslintrc@3.3.1': 457 518 resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 458 519 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 459 520 460 - '@eslint/js@9.30.1': 461 - resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} 521 + '@eslint/js@9.33.0': 522 + resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} 462 523 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 463 524 464 525 '@eslint/object-schema@2.1.6': 465 526 resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 466 527 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 467 528 468 - '@eslint/plugin-kit@0.3.3': 469 - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} 529 + '@eslint/plugin-kit@0.3.5': 530 + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} 470 531 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 471 532 472 533 '@externdefs/collider@0.3.0': ··· 474 535 peerDependencies: 475 536 '@badrap/valita': ^0.4.4 476 537 477 - '@hono/node-server@1.15.0': 478 - resolution: {integrity: sha512-MjmK4l5N4dQpZ9OSWN0tCj7ejuc7WvuWMzSKtc89bnknJykAeHxzRigXBTYZk85H6Awrii6RM59iUiUluApu2A==} 538 + '@floating-ui/core@1.7.3': 539 + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} 540 + 541 + '@floating-ui/dom@1.7.4': 542 + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} 543 + 544 + '@floating-ui/utils@0.2.10': 545 + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} 546 + 547 + '@floating-ui/vue@1.1.9': 548 + resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==} 549 + 550 + '@headlessui/vue@1.7.23': 551 + resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} 552 + engines: {node: '>=10'} 553 + peerDependencies: 554 + vue: ^3.2.0 555 + 556 + '@hono/node-server@1.19.0': 557 + resolution: {integrity: sha512-1k8/8OHf5VIymJEcJyVksFpT+AQ5euY0VA5hUkCnlKpD4mr8FSbvXaHblxeTTEr90OaqWzAkQaqD80qHZQKxBA==} 479 558 engines: {node: '>=18.14.1'} 480 559 peerDependencies: 481 560 hono: ^4 ··· 500 579 resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 501 580 engines: {node: '>=18.18'} 502 581 503 - '@libsql/client@0.15.9': 504 - resolution: {integrity: sha512-VT3do0a0vwYVaNcp/y05ikkKS3OrFR5UeEf5SUuYZVgKVl1Nc1k9ajoYSsOid8AD/vlhLDB5yFQaV4HmT/OB9w==} 582 + '@hyperjump/browser@1.3.1': 583 + resolution: {integrity: sha512-Le5XZUjnVqVjkgLYv6yyWgALat/0HpB1XaCPuCZ+GCFki9NvXloSZITIJ0H+wRW7mb9At1SxvohKBbNQbrr/cw==} 584 + engines: {node: '>=18.0.0'} 585 + 586 + '@hyperjump/json-pointer@1.1.1': 587 + resolution: {integrity: sha512-M0T3s7TC2JepoWPMZQn1W6eYhFh06OXwpMqL+8c5wMVpvnCKNsPgpu9u7WyCI03xVQti8JAeAy4RzUa6SYlJLA==} 588 + 589 + '@hyperjump/json-schema@1.16.2': 590 + resolution: {integrity: sha512-MJNvaEFc79+h5rvBPgAJK4OHEUr0RqsKcLC5rc3V9FEsJyQAjnP910deRFoZCE068kX/NrAPPhunMgUMwonPtg==} 591 + peerDependencies: 592 + '@hyperjump/browser': ^1.1.0 593 + 594 + '@hyperjump/pact@1.4.0': 595 + resolution: {integrity: sha512-01Q7VY6BcAkp9W31Fv+ciiZycxZHGlR2N6ba9BifgyclHYHdbaZgITo0U6QMhYRlem4k8pf8J31/tApxvqAz8A==} 596 + 597 + '@hyperjump/uri@1.3.1': 598 + resolution: {integrity: sha512-2ecKymxf6prQMgrNpAvlx4RhsuM5+PFT6oh6uUTZdv5qmBv0RZvxv8LJ7oR30ZxGhdPdZAl4We/1NFc0nqHeAw==} 599 + 600 + '@internationalized/date@3.8.2': 601 + resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} 602 + 603 + '@internationalized/number@3.6.4': 604 + resolution: {integrity: sha512-P+/h+RDaiX8EGt3shB9AYM1+QgkvHmJ5rKi4/59k4sg9g58k9rqsRW0WxRO7jCoHyvVbFRRFKmVTdFYdehrxHg==} 605 + 606 + '@jridgewell/gen-mapping@0.3.13': 607 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 608 + 609 + '@jridgewell/resolve-uri@3.1.2': 610 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 611 + engines: {node: '>=6.0.0'} 612 + 613 + '@jridgewell/source-map@0.3.11': 614 + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} 615 + 616 + '@jridgewell/sourcemap-codec@1.5.5': 617 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 618 + 619 + '@jridgewell/trace-mapping@0.3.30': 620 + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} 621 + 622 + '@libsql/client@0.15.12': 623 + resolution: {integrity: sha512-JIqB0XsNrqYqBQZuhcgZdTcQoNOoQ5AMF+1yxc7vcZrLtm42QJwRazmTuBfyDwtWASEmVgjxeaLF4NT1iyVX8g==} 505 624 506 - '@libsql/core@0.15.9': 507 - resolution: {integrity: sha512-4OVdeAmuaCUq5hYT8NNn0nxlO9AcA/eTjXfUZ+QK8MT3Dz7Z76m73x7KxjU6I64WyXX98dauVH2b9XM+d84npw==} 625 + '@libsql/core@0.15.12': 626 + resolution: {integrity: sha512-S3tF6885ZizVjfym7f8SevL2VId/+DzxiKmP5zFbrhA8oMLh2XH8bYXChmhab7o9qUSHx+XjK4jCFpUwR5g+Ig==} 508 627 509 - '@libsql/darwin-arm64@0.5.13': 510 - resolution: {integrity: sha512-ASz/EAMLDLx3oq9PVvZ4zBXXHbz2TxtxUwX2xpTRFR4V4uSHAN07+jpLu3aK5HUBLuv58z7+GjaL5w/cyjR28Q==} 628 + '@libsql/darwin-arm64@0.5.17': 629 + resolution: {integrity: sha512-WTYG2skZsUnZmfZ2v7WFj7s3/5s2PfrYBZOWBKOnxHA8g4XCDc/4bFDaqob9Q2e88+GC7cWeJ8VNkVBFpD2Xxg==} 511 630 cpu: [arm64] 512 631 os: [darwin] 513 632 514 - '@libsql/darwin-x64@0.5.13': 515 - resolution: {integrity: sha512-kzglniv1difkq8opusSXM7u9H0WoEPeKxw0ixIfcGfvlCVMJ+t9UNtXmyNHW68ljdllje6a4C6c94iPmIYafYA==} 633 + '@libsql/darwin-x64@0.5.17': 634 + resolution: {integrity: sha512-ab0RlTR4KYrxgjNrZhAhY/10GibKoq6G0W4oi0kdm+eYiAv/Ip8GDMpSaZdAcoKA4T+iKR/ehczKHnMEB8MFxA==} 516 635 cpu: [x64] 517 636 os: [darwin] 518 637 ··· 526 645 '@libsql/isomorphic-ws@0.1.5': 527 646 resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} 528 647 529 - '@libsql/linux-arm-gnueabihf@0.5.13': 530 - resolution: {integrity: sha512-UEW+VZN2r0mFkfztKOS7cqfS8IemuekbjUXbXCwULHtusww2QNCXvM5KU9eJCNE419SZCb0qaEWYytcfka8qeA==} 648 + '@libsql/linux-arm-gnueabihf@0.5.17': 649 + resolution: {integrity: sha512-PcASh4k47RqC+kMWAbLUKf1y6Do0q8vnUGi0yhKY4ghJcimMExViBimjbjYRSa+WIb/zh3QxNoXOhQAXx3tiuw==} 531 650 cpu: [arm] 532 651 os: [linux] 533 652 534 - '@libsql/linux-arm-musleabihf@0.5.13': 535 - resolution: {integrity: sha512-NMDgLqryYBv4Sr3WoO/m++XDjR5KLlw9r/JK4Ym6A1XBv2bxQQNhH0Lxx3bjLW8qqhBD4+0xfms4d2cOlexPyA==} 653 + '@libsql/linux-arm-musleabihf@0.5.17': 654 + resolution: {integrity: sha512-vxOkSLG9Wspit+SNle84nuIzMtr2G2qaxFzW7BhsZBjlZ8+kErf9RXcT2YJQdJYxmBYRbsOrc91gg0jLEQVCqg==} 536 655 cpu: [arm] 537 656 os: [linux] 538 657 539 - '@libsql/linux-arm64-gnu@0.5.13': 540 - resolution: {integrity: sha512-/wCxVdrwl1ee6D6LEjwl+w4SxuLm5UL9Kb1LD5n0bBGs0q+49ChdPPh7tp175iRgkcrTgl23emymvt1yj3KxVQ==} 658 + '@libsql/linux-arm64-gnu@0.5.17': 659 + resolution: {integrity: sha512-L8jnaN01TxjBJlDuDTX2W2BKzBkAOhcnKfCOf3xzvvygblxnDOK0whkYwIXeTfwtd/rr4jN/d6dZD/bcHiDxEQ==} 541 660 cpu: [arm64] 542 661 os: [linux] 543 662 544 - '@libsql/linux-arm64-musl@0.5.13': 545 - resolution: {integrity: sha512-xnVAbZIanUgX57XqeI5sNaDnVilp0Di5syCLSEo+bRyBobe/1IAeehNZpyVbCy91U2N6rH1C/mZU7jicVI9x+A==} 663 + '@libsql/linux-arm64-musl@0.5.17': 664 + resolution: {integrity: sha512-HfFD7TzQtmmTwyQsuiHhWZdMRtdNpKJ1p4tbMMTMRECk+971NFHrj69D64cc2ClVTAmn7fA9XibKPil7WN/Q7w==} 546 665 cpu: [arm64] 547 666 os: [linux] 548 667 549 - '@libsql/linux-x64-gnu@0.5.13': 550 - resolution: {integrity: sha512-/mfMRxcQAI9f8t7tU3QZyh25lXgXKzgin9B9TOSnchD73PWtsVhlyfA6qOCfjQl5kr4sHscdXD5Yb3KIoUgrpQ==} 668 + '@libsql/linux-x64-gnu@0.5.17': 669 + resolution: {integrity: sha512-5l3XxWqUPVFrtX0xnZaXwqsXs0BFbP4w6ahRFTPSdXU50YBfUOajFznJRB6bJTMsCvraDSD0IkHhjSNfrE1CuQ==} 551 670 cpu: [x64] 552 671 os: [linux] 553 672 554 - '@libsql/linux-x64-musl@0.5.13': 555 - resolution: {integrity: sha512-rdefPTpQCVwUjIQYbDLMv3qpd5MdrT0IeD0UZPGqhT9AWU8nJSQoj2lfyIDAWEz7PPOVCY4jHuEn7FS2sw9kRA==} 673 + '@libsql/linux-x64-musl@0.5.17': 674 + resolution: {integrity: sha512-FvSpWlwc+dIeYIFYlsSv+UdQ/NiZWr+SstwVji+QZ//8NnvzwWQU9cgP+Vpps6Qiq4jyYQm9chJhTYOVT9Y3BA==} 556 675 cpu: [x64] 557 676 os: [linux] 558 677 559 - '@libsql/win32-x64-msvc@0.5.13': 560 - resolution: {integrity: sha512-aNcmDrD1Ws+dNZIv9ECbxBQumqB9MlSVEykwfXJpqv/593nABb8Ttg5nAGUPtnADyaGDTrGvPPP81d/KsKho4Q==} 678 + '@libsql/win32-x64-msvc@0.5.17': 679 + resolution: {integrity: sha512-f5bGH8+3A5sn6Lrqg8FsQ09a1pYXPnKGXGTFiAYlfQXVst1tUTxDTugnuWcJYKXyzDe/T7ccxyIZXeSmPOhq8A==} 561 680 cpu: [x64] 562 681 os: [win32] 563 682 564 683 '@neon-rs/load@0.0.4': 565 684 resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} 685 + 686 + '@noble/secp256k1@2.3.0': 687 + resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==} 566 688 567 689 '@nodelib/fs.scandir@2.1.5': 568 690 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} ··· 576 698 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 577 699 engines: {node: '>= 8'} 578 700 579 - '@pkgr/core@0.2.7': 580 - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} 701 + '@phosphor-icons/core@2.1.1': 702 + resolution: {integrity: sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==} 703 + 704 + '@pkgr/core@0.2.9': 705 + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} 581 706 engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 582 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 + 583 813 '@rtsao/scc@1.1.0': 584 814 resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 585 815 586 - '@skyware/jetstream@0.2.2': 587 - resolution: {integrity: sha512-d1MtWPTIFEciSzV8OClXZCJoz0DJ7aupt4EZSwpGAASYG0ZIPmZTt7RVJkoFzQyqRPHAMD7CvEwu0ut3MHX1og==} 816 + '@scalar/code-highlight@0.1.9': 817 + resolution: {integrity: sha512-WUUVDd1Wk7QJVKWXl/Zdn/VINc2pc1NlWW8VJFYZRm3/hKJwBhi0on7+HjVQNKgUaRy7+zluru5Ckl1gcTHHEg==} 818 + engines: {node: '>=20'} 819 + 820 + '@scalar/components@0.14.25': 821 + resolution: {integrity: sha512-1lYVHa+9QVawEipFSBA/H9ROJJLijcAQ/kaFuTkJnZMS5DZ8aRB423TxVApJNSlMm96f8KGzIwS7Fq3sNYsXJg==} 822 + engines: {node: '>=20'} 823 + 824 + '@scalar/core@0.3.13': 825 + resolution: {integrity: sha512-lgrueSjR1eacM39Zg0jAHikGomGAF2o2/s/5EcMz/ul7VLo/IBymw8gUjcGHZ9zd8PFGdo8DvOwFMRCiXiaDHw==} 826 + engines: {node: '>=20'} 827 + 828 + '@scalar/helpers@0.0.8': 829 + resolution: {integrity: sha512-9A1CxL3jV7Kl9wGu86/cR/wiJN6J+3tK4WuW3252s2gF+upXsgQRx9WLhFF3xifOP1irIGusitZBiojiKmUSVg==} 830 + engines: {node: '>=20'} 831 + 832 + '@scalar/hono-api-reference@0.9.15': 833 + resolution: {integrity: sha512-Lx/ity79xA3pdp624ikccDwvlY30M79e/1jvl/LjPDToc0byMr2tUVyHbmMhuaX8PVPlUKkdO97XGw0+M5IZJg==} 834 + engines: {node: '>=20'} 835 + peerDependencies: 836 + hono: ^4.0.0 837 + 838 + '@scalar/icons@0.4.7': 839 + resolution: {integrity: sha512-0qXPGRdZ180TMfejWCPYy7ILszBrAraq4KBhPtcM12ghc5qkncFWWpTm5yXI/vrbm10t7wvtTK08CLZ36CnXlQ==} 840 + engines: {node: '>=20'} 841 + 842 + '@scalar/json-magic@0.3.0': 843 + resolution: {integrity: sha512-RmX6tIsV76xHioQWVTB1By85+7tbBkKFFbMn3p+1s5PrPiK/U20AAv9OUTt6f5U5fjaTSuaQNVyyhn5SYjtBQQ==} 844 + engines: {node: '>=20'} 845 + 846 + '@scalar/oas-utils@0.4.20': 847 + resolution: {integrity: sha512-zr7WLN6s6OLH+/BitInXOQxGOAr4ZDcIrQi6RFFc+U7F26rmhvhAN0qZXv8ew8SPnWyugH2PGjxZg0IgLs7+lQ==} 848 + engines: {node: '>=20'} 849 + 850 + '@scalar/object-utils@1.2.4': 851 + resolution: {integrity: sha512-lX/+9Sp6euZvbsikGRZiHwmfbLd0oTLTttKbJF9v2EkahSrQUT0WF835Ct2N0R8xSkyQauDhT2xCfuA0QNqDeA==} 852 + engines: {node: '>=20'} 853 + 854 + '@scalar/openapi-parser@0.20.0': 855 + resolution: {integrity: sha512-gsqpiDP9BuZNMx8Ma9UXapdoorIXiyAwr3qra/Zb3CsShun2KQoq20jSMJzVSTAm8HnBmNlZIQm1jSUvzDW5Tw==} 856 + engines: {node: '>=20'} 857 + 858 + '@scalar/openapi-to-markdown@0.2.28': 859 + resolution: {integrity: sha512-IB1P48kgLzCjVJQfkR0E2+qnnNY9uDLfYrStfZN5drhvWO/EmT7EIgGvGVj7XJHga7B9UVIL+s6CtfhUkPN0EA==} 860 + engines: {node: '>=20'} 861 + 862 + '@scalar/openapi-types@0.3.7': 863 + resolution: {integrity: sha512-QHSvHBVDze3+dUwAhIGq6l1iOev4jdoqdBK7QpfeN1Q4h+6qpVEw3EEqBiH0AXUSh/iWwObBv4uMgfIx0aNZ5g==} 864 + engines: {node: '>=20'} 865 + 866 + '@scalar/snippetz@0.4.5': 867 + resolution: {integrity: sha512-Pp4EDn5BAA1b/srgm6b7iD23UwzQISdQOh+Ai3gTWFePZlMHNuQBAiaqgDyINs1YUAgkBP+VDLBVlWMCjWC93A==} 868 + engines: {node: '>=20'} 869 + 870 + '@scalar/themes@0.13.13': 871 + resolution: {integrity: sha512-H67wm2Wfds6f+ygb/1qHWaKdieJdU8aGsU8qjGQamYPQriz6m6gr/AYNAc8B73I04ZXLswzJ6Doj/JcounPKZA==} 872 + engines: {node: '>=20'} 873 + 874 + '@scalar/types@0.2.12': 875 + resolution: {integrity: sha512-CW7jS+gpc3lZdjf+888++I9HtsGCk6zbh4lZscY8spcg/dlXXd3ReYicxee/cx+soDjU1d/Pcqj9o/QqvTFYxQ==} 876 + engines: {node: '>=20'} 877 + 878 + '@scalar/use-hooks@0.2.4': 879 + resolution: {integrity: sha512-TXviVV9Cfmei6g24QadnfuFj2r1YkZY56ufsSnwHgLNbtDRd9U9jXGIswXAuA+k7whaEVEgcoZ3Zmq2v5ZLF8w==} 880 + engines: {node: '>=20'} 881 + 882 + '@scalar/use-toasts@0.8.0': 883 + resolution: {integrity: sha512-u+o77cdTNZ5ePqHPu8ZcFw1BLlISv+cthN0bR1zJHXmqBjvanFTy2kL+Gmv3eW9HxZiHdqycKVETlYd0mWiqJQ==} 884 + engines: {node: '>=20'} 885 + 886 + '@scalar/workspace-store@0.14.0': 887 + resolution: {integrity: sha512-60gY3e3vsPn2ue1kMt4SlAM5mBZHObi0tGVZWYxwkXxvaKik2HaEpHQWZov7F6ZullCy1ECXNThzVE63zjqw9g==} 888 + engines: {node: '>=18'} 889 + 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 893 + 894 + '@skyware/jetstream@0.2.5': 895 + resolution: {integrity: sha512-fM/zs03DLwqRyzZZJFWN20e76KrdqIp97Tlm8Cek+vxn96+tu5d/fx79V6H85L0QN6HvGiX2l9A8hWFqHvYlOA==} 896 + 897 + '@swc/helpers@0.5.17': 898 + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} 899 + 900 + '@tanstack/virtual-core@3.13.12': 901 + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} 902 + 903 + '@tanstack/vue-virtual@3.13.12': 904 + resolution: {integrity: sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==} 905 + peerDependencies: 906 + vue: ^2.7.0 || ^3.0.0 907 + 908 + '@types/chai@5.2.2': 909 + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 910 + 911 + '@types/debug@4.1.12': 912 + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 913 + 914 + '@types/deep-eql@4.0.2': 915 + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 588 916 589 917 '@types/estree@1.0.8': 590 918 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 591 919 920 + '@types/har-format@1.2.16': 921 + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} 922 + 923 + '@types/hast@3.0.4': 924 + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 925 + 592 926 '@types/json-schema@7.0.15': 593 927 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 594 928 595 929 '@types/json5@0.0.29': 596 930 resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 597 931 598 - '@types/node@24.0.10': 599 - resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} 932 + '@types/mdast@4.0.4': 933 + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 934 + 935 + '@types/ms@2.1.0': 936 + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 937 + 938 + '@types/node@22.17.2': 939 + resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} 940 + 941 + '@types/node@24.3.0': 942 + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} 600 943 601 944 '@types/triple-beam@1.3.5': 602 945 resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} 603 946 947 + '@types/unist@3.0.3': 948 + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 949 + 950 + '@types/web-bluetooth@0.0.20': 951 + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} 952 + 604 953 '@types/ws@8.18.1': 605 954 resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} 606 955 607 - '@typescript-eslint/eslint-plugin@8.35.1': 608 - resolution: {integrity: sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==} 956 + '@typescript-eslint/eslint-plugin@8.40.0': 957 + resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} 609 958 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 610 959 peerDependencies: 611 - '@typescript-eslint/parser': ^8.35.1 960 + '@typescript-eslint/parser': ^8.40.0 612 961 eslint: ^8.57.0 || ^9.0.0 613 - typescript: '>=4.8.4 <5.9.0' 962 + typescript: '>=4.8.4 <6.0.0' 614 963 615 - '@typescript-eslint/parser@8.35.1': 616 - resolution: {integrity: sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==} 964 + '@typescript-eslint/parser@8.40.0': 965 + resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} 617 966 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 618 967 peerDependencies: 619 968 eslint: ^8.57.0 || ^9.0.0 620 - typescript: '>=4.8.4 <5.9.0' 969 + typescript: '>=4.8.4 <6.0.0' 621 970 622 - '@typescript-eslint/project-service@8.35.1': 623 - resolution: {integrity: sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==} 971 + '@typescript-eslint/project-service@8.40.0': 972 + resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} 624 973 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 625 974 peerDependencies: 626 - typescript: '>=4.8.4 <5.9.0' 975 + typescript: '>=4.8.4 <6.0.0' 627 976 628 - '@typescript-eslint/scope-manager@8.35.1': 629 - resolution: {integrity: sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==} 977 + '@typescript-eslint/scope-manager@8.40.0': 978 + resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} 630 979 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 631 980 632 - '@typescript-eslint/tsconfig-utils@8.35.1': 633 - resolution: {integrity: sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==} 981 + '@typescript-eslint/tsconfig-utils@8.40.0': 982 + resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} 634 983 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 635 984 peerDependencies: 636 - typescript: '>=4.8.4 <5.9.0' 985 + typescript: '>=4.8.4 <6.0.0' 637 986 638 - '@typescript-eslint/type-utils@8.35.1': 639 - resolution: {integrity: sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==} 987 + '@typescript-eslint/type-utils@8.40.0': 988 + resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} 640 989 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 641 990 peerDependencies: 642 991 eslint: ^8.57.0 || ^9.0.0 643 - typescript: '>=4.8.4 <5.9.0' 992 + typescript: '>=4.8.4 <6.0.0' 644 993 645 - '@typescript-eslint/types@8.35.1': 646 - resolution: {integrity: sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==} 994 + '@typescript-eslint/types@8.40.0': 995 + resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} 647 996 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 648 997 649 - '@typescript-eslint/typescript-estree@8.35.1': 650 - resolution: {integrity: sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==} 998 + '@typescript-eslint/typescript-estree@8.40.0': 999 + resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} 651 1000 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 652 1001 peerDependencies: 653 - typescript: '>=4.8.4 <5.9.0' 1002 + typescript: '>=4.8.4 <6.0.0' 654 1003 655 - '@typescript-eslint/utils@8.35.1': 656 - resolution: {integrity: sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==} 1004 + '@typescript-eslint/utils@8.40.0': 1005 + resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} 657 1006 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 658 1007 peerDependencies: 659 1008 eslint: ^8.57.0 || ^9.0.0 660 - typescript: '>=4.8.4 <5.9.0' 1009 + typescript: '>=4.8.4 <6.0.0' 661 1010 662 - '@typescript-eslint/visitor-keys@8.35.1': 663 - resolution: {integrity: sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==} 1011 + '@typescript-eslint/visitor-keys@8.40.0': 1012 + resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} 664 1013 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 665 1014 1015 + '@ungap/structured-clone@1.3.0': 1016 + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 1017 + 1018 + '@vitest/expect@3.2.4': 1019 + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} 1020 + 1021 + '@vitest/mocker@3.2.4': 1022 + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} 1023 + peerDependencies: 1024 + msw: ^2.4.9 1025 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 1026 + peerDependenciesMeta: 1027 + msw: 1028 + optional: true 1029 + vite: 1030 + optional: true 1031 + 1032 + '@vitest/pretty-format@3.2.4': 1033 + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} 1034 + 1035 + '@vitest/runner@3.2.4': 1036 + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} 1037 + 1038 + '@vitest/snapshot@3.2.4': 1039 + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} 1040 + 1041 + '@vitest/spy@3.2.4': 1042 + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} 1043 + 1044 + '@vitest/utils@3.2.4': 1045 + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} 1046 + 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==} 1070 + peerDependencies: 1071 + vue: 3.5.19 1072 + 1073 + '@vue/shared@3.5.19': 1074 + resolution: {integrity: sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==} 1075 + 1076 + '@vueuse/core@10.11.1': 1077 + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} 1078 + 1079 + '@vueuse/core@11.3.0': 1080 + resolution: {integrity: sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==} 1081 + 1082 + '@vueuse/metadata@10.11.1': 1083 + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} 1084 + 1085 + '@vueuse/metadata@11.3.0': 1086 + resolution: {integrity: sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==} 1087 + 1088 + '@vueuse/shared@10.11.1': 1089 + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} 1090 + 1091 + '@vueuse/shared@11.3.0': 1092 + resolution: {integrity: sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==} 1093 + 666 1094 acorn-jsx@5.3.2: 667 1095 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 668 1096 peerDependencies: ··· 673 1101 engines: {node: '>=0.4.0'} 674 1102 hasBin: true 675 1103 1104 + ajv-draft-04@1.0.0: 1105 + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} 1106 + peerDependencies: 1107 + ajv: ^8.5.0 1108 + peerDependenciesMeta: 1109 + ajv: 1110 + optional: true 1111 + 1112 + ajv-formats@3.0.1: 1113 + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} 1114 + peerDependencies: 1115 + ajv: ^8.0.0 1116 + peerDependenciesMeta: 1117 + ajv: 1118 + optional: true 1119 + 676 1120 ajv@6.12.6: 677 1121 resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 678 1122 1123 + ajv@8.17.1: 1124 + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 1125 + 679 1126 ansi-styles@4.3.0: 680 1127 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 681 1128 engines: {node: '>=8'} 682 1129 683 1130 argparse@2.0.1: 684 1131 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1132 + 1133 + aria-hidden@1.2.6: 1134 + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} 1135 + engines: {node: '>=10'} 685 1136 686 1137 array-buffer-byte-length@1.0.2: 687 1138 resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} ··· 707 1158 resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 708 1159 engines: {node: '>= 0.4'} 709 1160 1161 + assertion-error@2.0.1: 1162 + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 1163 + engines: {node: '>=12'} 1164 + 710 1165 async-function@1.0.0: 711 1166 resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 712 1167 engines: {node: '>= 0.4'} ··· 717 1172 available-typed-arrays@1.0.7: 718 1173 resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 719 1174 engines: {node: '>= 0.4'} 1175 + 1176 + bail@2.0.2: 1177 + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 720 1178 721 1179 balanced-match@1.0.2: 722 1180 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} ··· 737 1195 bun-types@1.2.17: 738 1196 resolution: {integrity: sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ==} 739 1197 1198 + cac@6.7.14: 1199 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1200 + engines: {node: '>=8'} 1201 + 740 1202 call-bind-apply-helpers@1.0.2: 741 1203 resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 742 1204 engines: {node: '>= 0.4'} ··· 753 1215 resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 754 1216 engines: {node: '>=6'} 755 1217 1218 + camel-case@4.1.2: 1219 + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} 1220 + 1221 + ccount@2.0.1: 1222 + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 1223 + 1224 + chai@5.3.3: 1225 + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} 1226 + engines: {node: '>=18'} 1227 + 756 1228 chalk@4.1.2: 757 1229 resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 758 1230 engines: {node: '>=10'} 759 1231 1232 + chalk@5.6.0: 1233 + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} 1234 + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 1235 + 1236 + character-entities-html4@2.1.0: 1237 + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 1238 + 1239 + character-entities-legacy@3.0.0: 1240 + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 1241 + 1242 + character-entities@2.0.2: 1243 + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 1244 + 1245 + check-error@2.1.1: 1246 + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1247 + engines: {node: '>= 16'} 1248 + 1249 + clean-css@5.3.3: 1250 + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} 1251 + engines: {node: '>= 10.0'} 1252 + 1253 + clsx@2.1.1: 1254 + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 1255 + engines: {node: '>=6'} 1256 + 760 1257 color-convert@1.9.3: 761 1258 resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 762 1259 ··· 779 1276 colorspace@1.1.4: 780 1277 resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} 781 1278 1279 + comma-separated-tokens@2.0.3: 1280 + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 1281 + 1282 + commander@10.0.1: 1283 + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 1284 + engines: {node: '>=14'} 1285 + 1286 + commander@2.20.3: 1287 + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 1288 + 782 1289 concat-map@0.0.1: 783 1290 resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 784 1291 1292 + content-type@1.0.5: 1293 + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 1294 + engines: {node: '>= 0.6'} 1295 + 785 1296 cross-spawn@7.0.6: 786 1297 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 787 1298 engines: {node: '>= 8'} 788 1299 1300 + csstype@3.1.3: 1301 + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1302 + 1303 + cva@1.0.0-beta.2: 1304 + resolution: {integrity: sha512-dqcOFe247I5pKxfuzqfq3seLL5iMYsTgo40Uw7+pKZAntPgFtR7Tmy59P5IVIq/XgB0NQWoIvYDt9TwHkuK8Cg==} 1305 + peerDependencies: 1306 + typescript: '>= 4.5.5 < 6' 1307 + peerDependenciesMeta: 1308 + typescript: 1309 + optional: true 1310 + 1311 + dank-each@1.0.0: 1312 + resolution: {integrity: sha512-gMDy24y+3LlnAaHq4WFwRKliMZRkGp41Gy9JVsD1BO5tprb/lEh4afJlkankcTqRoppSaHRwgFQX61QjJ5ClfQ==} 1313 + 1314 + dank-map@0.1.0: 1315 + resolution: {integrity: sha512-mQoLySkWc5bQM8XKXz0rIuISX/+12rSSfPojYlTVT6KPj3LsvfLURtrv0w+QEt1gRIKwp9mxnwOcL5nsOTkk2Q==} 1316 + 789 1317 data-uri-to-buffer@4.0.1: 790 1318 resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 791 1319 engines: {node: '>= 12'} ··· 819 1347 supports-color: 820 1348 optional: true 821 1349 1350 + decode-named-character-reference@1.2.0: 1351 + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} 1352 + 1353 + deep-eql@5.0.2: 1354 + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 1355 + engines: {node: '>=6'} 1356 + 822 1357 deep-is@0.1.4: 823 1358 resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 824 1359 ··· 830 1365 resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 831 1366 engines: {node: '>= 0.4'} 832 1367 1368 + defu@6.1.4: 1369 + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 1370 + 1371 + dequal@2.0.3: 1372 + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 1373 + engines: {node: '>=6'} 1374 + 833 1375 detect-libc@2.0.2: 834 1376 resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} 835 1377 engines: {node: '>=8'} 1378 + 1379 + devlop@1.1.0: 1380 + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 836 1381 837 1382 doctrine@2.1.0: 838 1383 resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 839 1384 engines: {node: '>=0.10.0'} 840 1385 1386 + dot-case@3.0.4: 1387 + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 1388 + 841 1389 drizzle-kit@0.31.4: 842 1390 resolution: {integrity: sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA==} 843 1391 hasBin: true 844 1392 845 - drizzle-orm@0.44.2: 846 - resolution: {integrity: sha512-zGAqBzWWkVSFjZpwPOrmCrgO++1kZ5H/rZ4qTGeGOe18iXGVJWf3WPfHOVwFIbmi8kHjfJstC6rJomzGx8g/dQ==} 1393 + drizzle-orm@0.44.4: 1394 + resolution: {integrity: sha512-ZyzKFpTC/Ut3fIqc2c0dPZ6nhchQXriTsqTNs4ayRgl6sZcFlMs9QZKPSHXK4bdOf41GHGWf+FrpcDDYwW+W6Q==} 847 1395 peerDependencies: 848 1396 '@aws-sdk/client-rds-data': '>=3' 849 1397 '@cloudflare/workers-types': '>=4' ··· 941 1489 enabled@2.0.0: 942 1490 resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} 943 1491 1492 + entities@4.5.0: 1493 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1494 + engines: {node: '>=0.12'} 1495 + 1496 + entities@6.0.1: 1497 + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 1498 + engines: {node: '>=0.12'} 1499 + 944 1500 es-abstract@1.24.0: 945 1501 resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} 946 1502 engines: {node: '>= 0.4'} ··· 952 1508 es-errors@1.3.0: 953 1509 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 954 1510 engines: {node: '>= 0.4'} 1511 + 1512 + es-module-lexer@1.7.0: 1513 + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 955 1514 956 1515 es-object-atoms@1.1.1: 957 1516 resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} ··· 979 1538 engines: {node: '>=12'} 980 1539 hasBin: true 981 1540 982 - esbuild@0.25.5: 983 - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 1541 + esbuild@0.25.9: 1542 + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} 984 1543 engines: {node: '>=18'} 985 1544 hasBin: true 986 1545 ··· 988 1547 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 989 1548 engines: {node: '>=10'} 990 1549 991 - eslint-config-prettier@10.1.5: 992 - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} 1550 + escape-string-regexp@5.0.0: 1551 + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 1552 + engines: {node: '>=12'} 1553 + 1554 + eslint-config-prettier@10.1.8: 1555 + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} 993 1556 hasBin: true 994 1557 peerDependencies: 995 1558 eslint: '>=7.0.0' ··· 1033 1596 '@typescript-eslint/parser': 1034 1597 optional: true 1035 1598 1036 - eslint-plugin-prettier@5.5.1: 1037 - resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} 1599 + eslint-plugin-prettier@5.5.4: 1600 + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} 1038 1601 engines: {node: ^14.18.0 || >=16.0.0} 1039 1602 peerDependencies: 1040 1603 '@types/eslint': '>=8.0.0' ··· 1059 1622 resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 1060 1623 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1061 1624 1062 - eslint@9.30.1: 1063 - resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} 1625 + eslint@9.33.0: 1626 + resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} 1064 1627 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1065 1628 hasBin: true 1066 1629 peerDependencies: ··· 1088 1651 resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1089 1652 engines: {node: '>=4.0'} 1090 1653 1654 + estree-walker@2.0.2: 1655 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1656 + 1657 + estree-walker@3.0.3: 1658 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1659 + 1091 1660 esutils@2.0.3: 1092 1661 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1093 1662 engines: {node: '>=0.10.0'} ··· 1095 1664 event-target-polyfill@0.0.4: 1096 1665 resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} 1097 1666 1667 + expect-type@1.2.2: 1668 + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 1669 + engines: {node: '>=12.0.0'} 1670 + 1671 + extend@3.0.2: 1672 + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 1673 + 1098 1674 fast-deep-equal@3.1.3: 1099 1675 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1100 1676 ··· 1111 1687 fast-levenshtein@2.0.6: 1112 1688 resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1113 1689 1690 + fast-uri@3.0.6: 1691 + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} 1692 + 1114 1693 fastq@1.19.1: 1115 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 1116 1704 1117 1705 fecha@4.2.3: 1118 1706 resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} ··· 1170 1758 resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 1171 1759 engines: {node: '>= 0.4'} 1172 1760 1761 + get-own-enumerable-keys@1.0.0: 1762 + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} 1763 + engines: {node: '>=14.16'} 1764 + 1173 1765 get-proto@1.0.1: 1174 1766 resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 1175 1767 engines: {node: '>= 0.4'} ··· 1180 1772 1181 1773 get-tsconfig@4.10.1: 1182 1774 resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} 1775 + 1776 + github-slugger@2.0.0: 1777 + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} 1183 1778 1184 1779 glob-parent@5.1.2: 1185 1780 resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} ··· 1235 1830 resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1236 1831 engines: {node: '>= 0.4'} 1237 1832 1238 - hono@4.8.4: 1239 - resolution: {integrity: sha512-KOIBp1+iUs0HrKztM4EHiB2UtzZDTBihDtOF5K6+WaJjCPeaW4Q92R8j63jOhvJI5+tZSMuKD9REVEXXY9illg==} 1833 + hast-util-embedded@3.0.0: 1834 + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} 1835 + 1836 + hast-util-format@1.1.0: 1837 + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} 1838 + 1839 + hast-util-from-html@2.0.3: 1840 + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} 1841 + 1842 + hast-util-from-parse5@8.0.3: 1843 + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} 1844 + 1845 + hast-util-has-property@3.0.0: 1846 + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} 1847 + 1848 + hast-util-is-body-ok-link@3.0.1: 1849 + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} 1850 + 1851 + hast-util-is-element@3.0.0: 1852 + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} 1853 + 1854 + hast-util-minify-whitespace@1.0.1: 1855 + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} 1856 + 1857 + hast-util-parse-selector@4.0.0: 1858 + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 1859 + 1860 + hast-util-phrasing@3.0.1: 1861 + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} 1862 + 1863 + hast-util-raw@9.1.0: 1864 + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} 1865 + 1866 + hast-util-sanitize@5.0.2: 1867 + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} 1868 + 1869 + hast-util-to-html@9.0.5: 1870 + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} 1871 + 1872 + hast-util-to-mdast@10.1.2: 1873 + resolution: {integrity: sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==} 1874 + 1875 + hast-util-to-parse5@8.0.0: 1876 + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} 1877 + 1878 + hast-util-to-text@4.0.2: 1879 + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} 1880 + 1881 + hast-util-whitespace@3.0.0: 1882 + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 1883 + 1884 + hastscript@9.0.1: 1885 + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} 1886 + 1887 + highlight.js@11.11.1: 1888 + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} 1889 + engines: {node: '>=12.0.0'} 1890 + 1891 + highlightjs-curl@1.3.0: 1892 + resolution: {integrity: sha512-50UEfZq1KR0Lfk2Tr6xb/MUIZH3h10oNC0OTy9g7WELcs5Fgy/mKN1vEhuKTkKbdo8vr5F9GXstu2eLhApfQ3A==} 1893 + 1894 + highlightjs-vue@1.0.0: 1895 + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} 1896 + 1897 + hono@4.9.4: 1898 + resolution: {integrity: sha512-61hl6MF6ojTl/8QSRu5ran6GXt+6zsngIUN95KzF5v5UjiX/xnrLR358BNRawwIRO49JwUqJqQe3Rb2v559R8Q==} 1240 1899 engines: {node: '>=16.9.0'} 1900 + 1901 + html-minifier-terser@7.2.0: 1902 + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} 1903 + engines: {node: ^14.13.1 || >=16.0.0} 1904 + hasBin: true 1905 + 1906 + html-void-elements@3.0.0: 1907 + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 1908 + 1909 + html-whitespace-sensitive-tag-names@3.0.1: 1910 + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} 1241 1911 1242 1912 ignore@5.3.2: 1243 1913 resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} ··· 1261 1931 internal-slot@1.1.0: 1262 1932 resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1263 1933 engines: {node: '>= 0.4'} 1934 + 1935 + is-absolute-url@4.0.1: 1936 + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} 1937 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1264 1938 1265 1939 is-array-buffer@3.0.5: 1266 1940 resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} ··· 1329 2003 resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1330 2004 engines: {node: '>=0.12.0'} 1331 2005 2006 + is-obj@3.0.0: 2007 + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} 2008 + engines: {node: '>=12'} 2009 + 2010 + is-plain-obj@4.1.0: 2011 + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 2012 + engines: {node: '>=12'} 2013 + 1332 2014 is-regex@1.2.1: 1333 2015 resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1334 2016 engines: {node: '>= 0.4'} 1335 2017 2018 + is-regexp@3.1.0: 2019 + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} 2020 + engines: {node: '>=12'} 2021 + 1336 2022 is-set@2.0.3: 1337 2023 resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 1338 2024 engines: {node: '>= 0.4'} ··· 1375 2061 isexe@2.0.0: 1376 2062 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1377 2063 1378 - jiti@2.4.2: 1379 - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 2064 + jiti@2.5.1: 2065 + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} 1380 2066 hasBin: true 1381 2067 1382 - js-base64@3.7.7: 1383 - 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==} 1384 2073 1385 2074 js-yaml@4.1.0: 1386 2075 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} ··· 1392 2081 json-schema-traverse@0.4.1: 1393 2082 resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1394 2083 2084 + json-schema-traverse@1.0.0: 2085 + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 2086 + 1395 2087 json-stable-stringify-without-jsonify@1.0.1: 1396 2088 resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1397 2089 2090 + json-stringify-deterministic@1.0.12: 2091 + resolution: {integrity: sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==} 2092 + engines: {node: '>= 4'} 2093 + 1398 2094 json5@1.0.2: 1399 2095 resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1400 2096 hasBin: true 1401 2097 2098 + jsonpointer@5.0.1: 2099 + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} 2100 + engines: {node: '>=0.10.0'} 2101 + 2102 + just-clone@6.2.0: 2103 + resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} 2104 + 2105 + just-curry-it@5.3.0: 2106 + resolution: {integrity: sha512-silMIRiFjUWlfaDhkgSzpuAyQ6EX/o09Eu8ZBfmFwQMbax7+LQzeIU2CBrICT6Ne4l86ITCGvUCBpCubWYy0Yw==} 2107 + 1402 2108 keyv@4.5.4: 1403 2109 resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1404 2110 1405 2111 kuler@2.0.0: 1406 2112 resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} 1407 2113 2114 + leven@4.0.0: 2115 + resolution: {integrity: sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==} 2116 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2117 + 1408 2118 levn@0.4.1: 1409 2119 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1410 2120 engines: {node: '>= 0.8.0'} 1411 2121 1412 - libsql@0.5.13: 1413 - resolution: {integrity: sha512-5Bwoa/CqzgkTwySgqHA5TsaUDRrdLIbdM4egdPcaAnqO3aC+qAgS6BwdzuZwARA5digXwiskogZ8H7Yy4XfdOg==} 2122 + libsql@0.5.17: 2123 + resolution: {integrity: sha512-RRlj5XQI9+Wq+/5UY8EnugSWfRmHEw4hn3DKlPrkUgZONsge1PwTtHcpStP6MSNi8ohcbsRgEHJaymA33a8cBw==} 1414 2124 cpu: [x64, arm64, wasm32, arm] 1415 2125 os: [darwin, linux, win32] 1416 2126 ··· 1425 2135 resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} 1426 2136 engines: {node: '>= 12.0.0'} 1427 2137 2138 + longest-streak@3.1.0: 2139 + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 2140 + 2141 + loupe@3.2.1: 2142 + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} 2143 + 2144 + lower-case@2.0.2: 2145 + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 2146 + 2147 + lowlight@3.3.0: 2148 + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} 2149 + 2150 + magic-string@0.30.18: 2151 + resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} 2152 + 2153 + markdown-table@3.0.4: 2154 + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} 2155 + 1428 2156 math-intrinsics@1.1.0: 1429 2157 resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1430 2158 engines: {node: '>= 0.4'} 1431 2159 2160 + mdast-util-find-and-replace@3.0.2: 2161 + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} 2162 + 2163 + mdast-util-from-markdown@2.0.2: 2164 + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} 2165 + 2166 + mdast-util-gfm-autolink-literal@2.0.1: 2167 + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} 2168 + 2169 + mdast-util-gfm-footnote@2.1.0: 2170 + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} 2171 + 2172 + mdast-util-gfm-strikethrough@2.0.0: 2173 + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} 2174 + 2175 + mdast-util-gfm-table@2.0.0: 2176 + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} 2177 + 2178 + mdast-util-gfm-task-list-item@2.0.0: 2179 + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} 2180 + 2181 + mdast-util-gfm@3.1.0: 2182 + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} 2183 + 2184 + mdast-util-phrasing@4.1.0: 2185 + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} 2186 + 2187 + mdast-util-to-hast@13.2.0: 2188 + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} 2189 + 2190 + mdast-util-to-markdown@2.1.2: 2191 + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} 2192 + 2193 + mdast-util-to-string@4.0.0: 2194 + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} 2195 + 1432 2196 merge2@1.4.1: 1433 2197 resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1434 2198 engines: {node: '>= 8'} 1435 2199 2200 + microdiff@1.5.0: 2201 + resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==} 2202 + 2203 + micromark-core-commonmark@2.0.3: 2204 + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} 2205 + 2206 + micromark-extension-gfm-autolink-literal@2.1.0: 2207 + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} 2208 + 2209 + micromark-extension-gfm-footnote@2.1.0: 2210 + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} 2211 + 2212 + micromark-extension-gfm-strikethrough@2.1.0: 2213 + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} 2214 + 2215 + micromark-extension-gfm-table@2.1.1: 2216 + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} 2217 + 2218 + micromark-extension-gfm-tagfilter@2.0.0: 2219 + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} 2220 + 2221 + micromark-extension-gfm-task-list-item@2.1.0: 2222 + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} 2223 + 2224 + micromark-extension-gfm@3.0.0: 2225 + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} 2226 + 2227 + micromark-factory-destination@2.0.1: 2228 + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} 2229 + 2230 + micromark-factory-label@2.0.1: 2231 + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} 2232 + 2233 + micromark-factory-space@2.0.1: 2234 + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} 2235 + 2236 + micromark-factory-title@2.0.1: 2237 + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} 2238 + 2239 + micromark-factory-whitespace@2.0.1: 2240 + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} 2241 + 2242 + micromark-util-character@2.1.1: 2243 + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 2244 + 2245 + micromark-util-chunked@2.0.1: 2246 + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} 2247 + 2248 + micromark-util-classify-character@2.0.1: 2249 + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} 2250 + 2251 + micromark-util-combine-extensions@2.0.1: 2252 + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} 2253 + 2254 + micromark-util-decode-numeric-character-reference@2.0.2: 2255 + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} 2256 + 2257 + micromark-util-decode-string@2.0.1: 2258 + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} 2259 + 2260 + micromark-util-encode@2.0.1: 2261 + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 2262 + 2263 + micromark-util-html-tag-name@2.0.1: 2264 + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} 2265 + 2266 + micromark-util-normalize-identifier@2.0.1: 2267 + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} 2268 + 2269 + micromark-util-resolve-all@2.0.1: 2270 + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} 2271 + 2272 + micromark-util-sanitize-uri@2.0.1: 2273 + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 2274 + 2275 + micromark-util-subtokenize@2.1.0: 2276 + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} 2277 + 2278 + micromark-util-symbol@2.0.1: 2279 + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 2280 + 2281 + micromark-util-types@2.0.2: 2282 + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 2283 + 2284 + micromark@4.0.2: 2285 + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} 2286 + 1436 2287 micromatch@4.0.8: 1437 2288 resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1438 2289 engines: {node: '>=8.6'} ··· 1450 2301 ms@2.1.3: 1451 2302 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1452 2303 2304 + nanoid@3.3.11: 2305 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 2306 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2307 + hasBin: true 2308 + 2309 + nanoid@5.1.5: 2310 + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} 2311 + engines: {node: ^18 || >=20} 2312 + hasBin: true 2313 + 1453 2314 natural-compare@1.4.0: 1454 2315 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2316 + 2317 + no-case@3.0.4: 2318 + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1455 2319 1456 2320 node-domexception@1.0.0: 1457 2321 resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} ··· 1470 2334 resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1471 2335 engines: {node: '>= 0.4'} 1472 2336 2337 + object-to-xml@2.0.0: 2338 + resolution: {integrity: sha512-bArXy7WCF1V9R88/zF9adSZSeFQnFmmKhMqNuNLAxqrbkvzcWP8HgnaRCcVJsfvIgvpdHiYd0qzJi7LM7QFfcQ==} 2339 + 1473 2340 object.assign@4.1.7: 1474 2341 resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1475 2342 engines: {node: '>= 0.4'} ··· 1505 2372 resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1506 2373 engines: {node: '>=10'} 1507 2374 2375 + param-case@3.0.4: 2376 + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} 2377 + 1508 2378 parent-module@1.0.1: 1509 2379 resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1510 2380 engines: {node: '>=6'} 1511 2381 1512 - partysocket@1.1.4: 1513 - resolution: {integrity: sha512-jXP7PFj2h5/v4UjDS8P7MZy6NJUQ7sspiFyxL4uc/+oKOL+KdtXzHnTV8INPGxBrLTXgalyG3kd12Qm7WrYc3A==} 2382 + parse5@7.3.0: 2383 + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 2384 + 2385 + partysocket@1.1.5: 2386 + resolution: {integrity: sha512-8uw9foq9bij4sKLCtTSHvyqMrMTQ5FJjrHc7BjoM2s95Vu7xYCN63ABpI7OZHC7ZMP5xaom/A+SsoFPXmTV6ZQ==} 2387 + 2388 + pascal-case@3.1.2: 2389 + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 1514 2390 1515 2391 path-exists@4.0.0: 1516 2392 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} ··· 1523 2399 path-parse@1.0.7: 1524 2400 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1525 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 + 1526 2409 picocolors@1.1.1: 1527 2410 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1528 2411 ··· 1530 2413 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1531 2414 engines: {node: '>=8.6'} 1532 2415 2416 + picomatch@4.0.3: 2417 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 2418 + engines: {node: '>=12'} 2419 + 1533 2420 possible-typed-array-names@1.1.0: 1534 2421 resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1535 2422 engines: {node: '>= 0.4'} 1536 2423 2424 + postcss@8.5.6: 2425 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 2426 + engines: {node: ^10 || ^12 || >=14} 2427 + 1537 2428 prelude-ls@1.2.1: 1538 2429 resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1539 2430 engines: {node: '>= 0.8.0'} ··· 1547 2438 engines: {node: '>=14'} 1548 2439 hasBin: true 1549 2440 2441 + pretty-bytes@6.1.1: 2442 + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} 2443 + engines: {node: ^14.13.1 || >=16.0.0} 2444 + 1550 2445 promise-limit@2.7.0: 1551 2446 resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} 1552 2447 2448 + property-information@6.5.0: 2449 + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} 2450 + 2451 + property-information@7.1.0: 2452 + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} 2453 + 1553 2454 punycode@2.3.1: 1554 2455 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1555 2456 engines: {node: '>=6'} ··· 1557 2458 queue-microtask@1.2.3: 1558 2459 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1559 2460 2461 + radix-vue@1.9.17: 2462 + resolution: {integrity: sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==} 2463 + peerDependencies: 2464 + vue: '>= 3.2.0' 2465 + 1560 2466 readable-stream@3.6.2: 1561 2467 resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1562 2468 engines: {node: '>= 6'} ··· 1569 2475 resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1570 2476 engines: {node: '>= 0.4'} 1571 2477 2478 + rehype-external-links@3.0.0: 2479 + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} 2480 + 2481 + rehype-format@5.0.1: 2482 + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} 2483 + 2484 + rehype-minify-whitespace@6.0.2: 2485 + resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==} 2486 + 2487 + rehype-parse@9.0.1: 2488 + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} 2489 + 2490 + rehype-raw@7.0.0: 2491 + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} 2492 + 2493 + rehype-remark@10.0.1: 2494 + resolution: {integrity: sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==} 2495 + 2496 + rehype-sanitize@6.0.0: 2497 + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} 2498 + 2499 + rehype-stringify@10.0.1: 2500 + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} 2501 + 2502 + relateurl@0.2.7: 2503 + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} 2504 + engines: {node: '>= 0.10'} 2505 + 2506 + remark-gfm@4.0.1: 2507 + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} 2508 + 2509 + remark-parse@11.0.0: 2510 + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} 2511 + 2512 + remark-rehype@11.1.2: 2513 + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} 2514 + 2515 + remark-stringify@11.0.0: 2516 + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} 2517 + 2518 + require-from-string@2.0.2: 2519 + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 2520 + engines: {node: '>=0.10.0'} 2521 + 1572 2522 resolve-from@4.0.0: 1573 2523 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1574 2524 engines: {node: '>=4'} ··· 1585 2535 resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1586 2536 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1587 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 + 1588 2543 run-parallel@1.2.0: 1589 2544 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1590 2545 ··· 1606 2561 safe-stable-stringify@2.5.0: 1607 2562 resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 1608 2563 engines: {node: '>=10'} 2564 + 2565 + sanitizer@0.1.3: 2566 + resolution: {integrity: sha512-j05vL56tR90rsYqm9ZD05v6K4HI7t4yMDEvvU0x4f+IADXM9Jx1x9mzatxOs5drJq6dGhugxDW99mcPvXVLl+Q==} 1609 2567 1610 2568 semver@6.3.1: 1611 2569 resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} ··· 1652 2610 resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1653 2611 engines: {node: '>= 0.4'} 1654 2612 2613 + siginfo@2.0.0: 2614 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2615 + 1655 2616 simple-swizzle@0.2.2: 1656 2617 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1657 2618 2619 + source-map-js@1.2.1: 2620 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 2621 + engines: {node: '>=0.10.0'} 2622 + 1658 2623 source-map-support@0.5.21: 1659 2624 resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1660 2625 ··· 1662 2627 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1663 2628 engines: {node: '>=0.10.0'} 1664 2629 2630 + space-separated-tokens@2.0.2: 2631 + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 2632 + 1665 2633 stack-trace@0.0.10: 1666 2634 resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 2635 + 2636 + stackback@0.0.2: 2637 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 2638 + 2639 + std-env@3.9.0: 2640 + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 1667 2641 1668 2642 stop-iteration-iterator@1.1.0: 1669 2643 resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} ··· 1684 2658 string_decoder@1.3.0: 1685 2659 resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1686 2660 2661 + stringify-entities@4.0.4: 2662 + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 2663 + 2664 + stringify-object@5.0.0: 2665 + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} 2666 + engines: {node: '>=14.16'} 2667 + 1687 2668 strip-bom@3.0.0: 1688 2669 resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1689 2670 engines: {node: '>=4'} ··· 1691 2672 strip-json-comments@3.1.1: 1692 2673 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1693 2674 engines: {node: '>=8'} 2675 + 2676 + strip-literal@3.0.0: 2677 + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 1694 2678 1695 2679 supports-color@7.2.0: 1696 2680 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} ··· 1700 2684 resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1701 2685 engines: {node: '>= 0.4'} 1702 2686 1703 - synckit@0.11.8: 1704 - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 2687 + synckit@0.11.11: 2688 + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} 1705 2689 engines: {node: ^14.18.0 || >=16.0.0} 1706 2690 2691 + tailwind-merge@2.6.0: 2692 + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} 2693 + 2694 + terser@5.43.1: 2695 + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} 2696 + engines: {node: '>=10'} 2697 + hasBin: true 2698 + 1707 2699 text-hex@1.0.0: 1708 2700 resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} 1709 2701 2702 + tiny-emitter@2.1.0: 2703 + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} 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 + 1710 2727 to-regex-range@5.0.1: 1711 2728 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1712 2729 engines: {node: '>=8.0'} ··· 1714 2731 toml@3.0.0: 1715 2732 resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} 1716 2733 2734 + trim-lines@3.0.1: 2735 + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 2736 + 2737 + trim-trailing-lines@2.1.0: 2738 + resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==} 2739 + 1717 2740 triple-beam@1.4.1: 1718 2741 resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} 1719 2742 engines: {node: '>= 14.0.0'} 2743 + 2744 + trough@2.2.0: 2745 + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} 1720 2746 1721 2747 ts-api-utils@2.1.0: 1722 2748 resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} ··· 1724 2750 peerDependencies: 1725 2751 typescript: '>=4.8.4' 1726 2752 2753 + ts-deepmerge@7.0.3: 2754 + resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} 2755 + engines: {node: '>=14.13.1'} 2756 + 1727 2757 tsconfig-paths@3.15.0: 1728 2758 resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 1729 2759 1730 - tsx@4.20.3: 1731 - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} 2760 + tslib@2.8.1: 2761 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2762 + 2763 + tsx@4.20.4: 2764 + resolution: {integrity: sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==} 1732 2765 engines: {node: '>=18.0.0'} 1733 2766 hasBin: true 1734 2767 1735 2768 type-check@0.4.0: 1736 2769 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1737 2770 engines: {node: '>= 0.8.0'} 2771 + 2772 + type-fest@4.41.0: 2773 + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} 2774 + engines: {node: '>=16'} 1738 2775 1739 2776 typed-array-buffer@1.0.3: 1740 2777 resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} ··· 1752 2789 resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1753 2790 engines: {node: '>= 0.4'} 1754 2791 1755 - typescript-eslint@8.35.1: 1756 - resolution: {integrity: sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==} 2792 + typescript-eslint@8.40.0: 2793 + resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} 1757 2794 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1758 2795 peerDependencies: 1759 2796 eslint: ^8.57.0 || ^9.0.0 1760 - typescript: '>=4.8.4 <5.9.0' 2797 + typescript: '>=4.8.4 <6.0.0' 1761 2798 1762 - typescript@5.8.3: 1763 - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 2799 + typescript@5.9.2: 2800 + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 1764 2801 engines: {node: '>=14.17'} 1765 2802 hasBin: true 1766 2803 ··· 1768 2805 resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1769 2806 engines: {node: '>= 0.4'} 1770 2807 1771 - undici-types@7.8.0: 1772 - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} 2808 + undici-types@6.21.0: 2809 + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 2810 + 2811 + undici-types@7.10.0: 2812 + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} 2813 + 2814 + unified@11.0.5: 2815 + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} 2816 + 2817 + unist-util-find-after@5.0.0: 2818 + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} 2819 + 2820 + unist-util-is@6.0.0: 2821 + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} 2822 + 2823 + unist-util-position@5.0.0: 2824 + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 2825 + 2826 + unist-util-stringify-position@4.0.0: 2827 + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 2828 + 2829 + unist-util-visit-parents@6.0.1: 2830 + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} 2831 + 2832 + unist-util-visit@5.0.0: 2833 + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} 1773 2834 1774 2835 uri-js@4.4.1: 1775 2836 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} ··· 1777 2838 util-deprecate@1.0.2: 1778 2839 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1779 2840 2841 + uuid@9.0.1: 2842 + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} 2843 + hasBin: true 2844 + 2845 + vfile-location@5.0.3: 2846 + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 2847 + 2848 + vfile-message@4.0.3: 2849 + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} 2850 + 2851 + vfile@6.0.3: 2852 + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 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 + 2930 + vue-demi@0.14.10: 2931 + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} 2932 + engines: {node: '>=12'} 2933 + hasBin: true 2934 + peerDependencies: 2935 + '@vue/composition-api': ^1.0.0-rc.1 2936 + vue: ^3.0.0-0 || ^2.6.0 2937 + peerDependenciesMeta: 2938 + '@vue/composition-api': 2939 + optional: true 2940 + 2941 + vue-sonner@1.3.2: 2942 + resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==} 2943 + 2944 + vue@3.5.19: 2945 + resolution: {integrity: sha512-ZRh0HTmw6KChRYWgN8Ox/wi7VhpuGlvMPrHjIsdRbzKNgECFLzy+dKL5z9yGaBSjCpmcfJCbh3I1tNSRmBz2tg==} 2946 + peerDependencies: 2947 + typescript: '*' 2948 + peerDependenciesMeta: 2949 + typescript: 2950 + optional: true 2951 + 2952 + web-namespaces@2.0.1: 2953 + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 2954 + 1780 2955 web-streams-polyfill@3.3.3: 1781 2956 resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 1782 2957 engines: {node: '>= 8'} ··· 1802 2977 engines: {node: '>= 8'} 1803 2978 hasBin: true 1804 2979 2980 + why-is-node-running@2.3.0: 2981 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 2982 + engines: {node: '>=8'} 2983 + hasBin: true 2984 + 1805 2985 winston-transport@4.9.0: 1806 2986 resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} 1807 2987 engines: {node: '>= 12.0.0'} ··· 1828 3008 1829 3009 xxhash-wasm@1.1.0: 1830 3010 resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 3011 + 3012 + yaml@2.8.0: 3013 + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} 3014 + engines: {node: '>= 14.6'} 3015 + hasBin: true 1831 3016 1832 3017 yocto-queue@0.1.0: 1833 3018 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1834 3019 engines: {node: '>=10'} 1835 3020 3021 + zod@3.24.1: 3022 + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} 3023 + 3024 + zwitch@2.0.4: 3025 + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 3026 + 1836 3027 snapshots: 1837 3028 1838 - '@atcute/atproto@3.1.0': 3029 + '@atcute/atproto@3.1.2': 3030 + dependencies: 3031 + '@atcute/lexicons': 1.1.1 3032 + 3033 + '@atcute/bluesky@3.2.1': 3034 + dependencies: 3035 + '@atcute/atproto': 3.1.2 3036 + '@atcute/lexicons': 1.1.1 3037 + 3038 + '@atcute/client@4.0.3': 1839 3039 dependencies: 1840 - '@atcute/lexicons': 1.1.0 3040 + '@atcute/identity': 1.0.3 3041 + '@atcute/lexicons': 1.1.1 1841 3042 1842 - '@atcute/bluesky@1.0.15(@atcute/client@2.0.9)': 3043 + '@atcute/crypto@2.2.4': 1843 3044 dependencies: 1844 - '@atcute/client': 2.0.9 3045 + '@atcute/multibase': 1.1.5 3046 + '@atcute/uint8array': 1.0.4 3047 + '@noble/secp256k1': 2.3.0 3048 + 3049 + '@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)': 3050 + dependencies: 3051 + '@atcute/identity': 1.0.3 3052 + '@atcute/lexicons': 1.1.1 3053 + '@atcute/util-fetch': 1.0.1 3054 + '@badrap/valita': 0.4.6 1845 3055 1846 - '@atcute/client@2.0.9': {} 3056 + '@atcute/identity@1.0.3': 3057 + dependencies: 3058 + '@atcute/lexicons': 1.1.1 3059 + '@badrap/valita': 0.4.6 1847 3060 1848 3061 '@atcute/lex-cli@2.1.1': 1849 3062 dependencies: 1850 3063 '@atcute/lexicon-doc': 1.0.3 1851 - '@badrap/valita': 0.4.5 1852 - '@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) 1853 3066 picocolors: 1.1.1 1854 3067 prettier: 3.6.2 1855 3068 1856 3069 '@atcute/lexicon-doc@1.0.3': 1857 3070 dependencies: 1858 - '@badrap/valita': 0.4.5 3071 + '@badrap/valita': 0.4.6 1859 3072 1860 - '@atcute/lexicons@1.1.0': 3073 + '@atcute/lexicons@1.1.1': 1861 3074 dependencies: 1862 3075 esm-env: 1.2.2 1863 3076 1864 - '@badrap/valita@0.4.5': {} 3077 + '@atcute/multibase@1.1.5': 3078 + dependencies: 3079 + '@atcute/uint8array': 1.0.4 3080 + 3081 + '@atcute/uint8array@1.0.4': {} 3082 + 3083 + '@atcute/util-fetch@1.0.1': 3084 + dependencies: 3085 + '@badrap/valita': 0.4.6 3086 + 3087 + '@babel/helper-string-parser@7.27.1': {} 1865 3088 1866 - '@clipprjs/lexicons@0.1.3': 3089 + '@babel/helper-validator-identifier@7.27.1': {} 3090 + 3091 + '@babel/parser@7.28.3': 1867 3092 dependencies: 1868 - '@atcute/atproto': 3.1.0 1869 - '@atcute/lexicons': 1.1.0 3093 + '@babel/types': 7.28.2 3094 + 3095 + '@babel/types@7.28.2': 3096 + dependencies: 3097 + '@babel/helper-string-parser': 7.27.1 3098 + '@babel/helper-validator-identifier': 7.27.1 3099 + 3100 + '@badrap/valita@0.4.6': {} 3101 + 3102 + '@clipprjs/lexicons@1.0.3': 3103 + dependencies: 3104 + '@atcute/atproto': 3.1.2 3105 + '@atcute/lexicons': 1.1.1 1870 3106 1871 3107 '@colors/colors@1.6.0': {} 1872 3108 ··· 1888 3124 '@esbuild-kit/core-utils': 3.3.2 1889 3125 get-tsconfig: 4.10.1 1890 3126 1891 - '@esbuild/aix-ppc64@0.25.5': 3127 + '@esbuild/aix-ppc64@0.25.9': 1892 3128 optional: true 1893 3129 1894 3130 '@esbuild/android-arm64@0.18.20': 1895 3131 optional: true 1896 3132 1897 - '@esbuild/android-arm64@0.25.5': 3133 + '@esbuild/android-arm64@0.25.9': 1898 3134 optional: true 1899 3135 1900 3136 '@esbuild/android-arm@0.18.20': 1901 3137 optional: true 1902 3138 1903 - '@esbuild/android-arm@0.25.5': 3139 + '@esbuild/android-arm@0.25.9': 1904 3140 optional: true 1905 3141 1906 3142 '@esbuild/android-x64@0.18.20': 1907 3143 optional: true 1908 3144 1909 - '@esbuild/android-x64@0.25.5': 3145 + '@esbuild/android-x64@0.25.9': 1910 3146 optional: true 1911 3147 1912 3148 '@esbuild/darwin-arm64@0.18.20': 1913 3149 optional: true 1914 3150 1915 - '@esbuild/darwin-arm64@0.25.5': 3151 + '@esbuild/darwin-arm64@0.25.9': 1916 3152 optional: true 1917 3153 1918 3154 '@esbuild/darwin-x64@0.18.20': 1919 3155 optional: true 1920 3156 1921 - '@esbuild/darwin-x64@0.25.5': 3157 + '@esbuild/darwin-x64@0.25.9': 1922 3158 optional: true 1923 3159 1924 3160 '@esbuild/freebsd-arm64@0.18.20': 1925 3161 optional: true 1926 3162 1927 - '@esbuild/freebsd-arm64@0.25.5': 3163 + '@esbuild/freebsd-arm64@0.25.9': 1928 3164 optional: true 1929 3165 1930 3166 '@esbuild/freebsd-x64@0.18.20': 1931 3167 optional: true 1932 3168 1933 - '@esbuild/freebsd-x64@0.25.5': 3169 + '@esbuild/freebsd-x64@0.25.9': 1934 3170 optional: true 1935 3171 1936 3172 '@esbuild/linux-arm64@0.18.20': 1937 3173 optional: true 1938 3174 1939 - '@esbuild/linux-arm64@0.25.5': 3175 + '@esbuild/linux-arm64@0.25.9': 1940 3176 optional: true 1941 3177 1942 3178 '@esbuild/linux-arm@0.18.20': 1943 3179 optional: true 1944 3180 1945 - '@esbuild/linux-arm@0.25.5': 3181 + '@esbuild/linux-arm@0.25.9': 1946 3182 optional: true 1947 3183 1948 3184 '@esbuild/linux-ia32@0.18.20': 1949 3185 optional: true 1950 3186 1951 - '@esbuild/linux-ia32@0.25.5': 3187 + '@esbuild/linux-ia32@0.25.9': 1952 3188 optional: true 1953 3189 1954 3190 '@esbuild/linux-loong64@0.18.20': 1955 3191 optional: true 1956 3192 1957 - '@esbuild/linux-loong64@0.25.5': 3193 + '@esbuild/linux-loong64@0.25.9': 1958 3194 optional: true 1959 3195 1960 3196 '@esbuild/linux-mips64el@0.18.20': 1961 3197 optional: true 1962 3198 1963 - '@esbuild/linux-mips64el@0.25.5': 3199 + '@esbuild/linux-mips64el@0.25.9': 1964 3200 optional: true 1965 3201 1966 3202 '@esbuild/linux-ppc64@0.18.20': 1967 3203 optional: true 1968 3204 1969 - '@esbuild/linux-ppc64@0.25.5': 3205 + '@esbuild/linux-ppc64@0.25.9': 1970 3206 optional: true 1971 3207 1972 3208 '@esbuild/linux-riscv64@0.18.20': 1973 3209 optional: true 1974 3210 1975 - '@esbuild/linux-riscv64@0.25.5': 3211 + '@esbuild/linux-riscv64@0.25.9': 1976 3212 optional: true 1977 3213 1978 3214 '@esbuild/linux-s390x@0.18.20': 1979 3215 optional: true 1980 3216 1981 - '@esbuild/linux-s390x@0.25.5': 3217 + '@esbuild/linux-s390x@0.25.9': 1982 3218 optional: true 1983 3219 1984 3220 '@esbuild/linux-x64@0.18.20': 1985 3221 optional: true 1986 3222 1987 - '@esbuild/linux-x64@0.25.5': 3223 + '@esbuild/linux-x64@0.25.9': 1988 3224 optional: true 1989 3225 1990 - '@esbuild/netbsd-arm64@0.25.5': 3226 + '@esbuild/netbsd-arm64@0.25.9': 1991 3227 optional: true 1992 3228 1993 3229 '@esbuild/netbsd-x64@0.18.20': 1994 3230 optional: true 1995 3231 1996 - '@esbuild/netbsd-x64@0.25.5': 3232 + '@esbuild/netbsd-x64@0.25.9': 1997 3233 optional: true 1998 3234 1999 - '@esbuild/openbsd-arm64@0.25.5': 3235 + '@esbuild/openbsd-arm64@0.25.9': 2000 3236 optional: true 2001 3237 2002 3238 '@esbuild/openbsd-x64@0.18.20': 2003 3239 optional: true 2004 3240 2005 - '@esbuild/openbsd-x64@0.25.5': 3241 + '@esbuild/openbsd-x64@0.25.9': 3242 + optional: true 3243 + 3244 + '@esbuild/openharmony-arm64@0.25.9': 2006 3245 optional: true 2007 3246 2008 3247 '@esbuild/sunos-x64@0.18.20': 2009 3248 optional: true 2010 3249 2011 - '@esbuild/sunos-x64@0.25.5': 3250 + '@esbuild/sunos-x64@0.25.9': 2012 3251 optional: true 2013 3252 2014 3253 '@esbuild/win32-arm64@0.18.20': 2015 3254 optional: true 2016 3255 2017 - '@esbuild/win32-arm64@0.25.5': 3256 + '@esbuild/win32-arm64@0.25.9': 2018 3257 optional: true 2019 3258 2020 3259 '@esbuild/win32-ia32@0.18.20': 2021 3260 optional: true 2022 3261 2023 - '@esbuild/win32-ia32@0.25.5': 3262 + '@esbuild/win32-ia32@0.25.9': 2024 3263 optional: true 2025 3264 2026 3265 '@esbuild/win32-x64@0.18.20': 2027 3266 optional: true 2028 3267 2029 - '@esbuild/win32-x64@0.25.5': 3268 + '@esbuild/win32-x64@0.25.9': 2030 3269 optional: true 2031 3270 2032 - '@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))': 2033 3272 dependencies: 2034 - eslint: 9.30.1(jiti@2.4.2) 3273 + eslint: 9.33.0(jiti@2.5.1) 2035 3274 eslint-visitor-keys: 3.4.3 2036 3275 2037 3276 '@eslint-community/regexpp@4.12.1': {} ··· 2044 3283 transitivePeerDependencies: 2045 3284 - supports-color 2046 3285 2047 - '@eslint/config-helpers@0.3.0': {} 3286 + '@eslint/config-helpers@0.3.1': {} 2048 3287 2049 - '@eslint/core@0.14.0': 2050 - dependencies: 2051 - '@types/json-schema': 7.0.15 2052 - 2053 - '@eslint/core@0.15.1': 3288 + '@eslint/core@0.15.2': 2054 3289 dependencies: 2055 3290 '@types/json-schema': 7.0.15 2056 3291 ··· 2068 3303 transitivePeerDependencies: 2069 3304 - supports-color 2070 3305 2071 - '@eslint/js@9.30.1': {} 3306 + '@eslint/js@9.33.0': {} 2072 3307 2073 3308 '@eslint/object-schema@2.1.6': {} 2074 3309 2075 - '@eslint/plugin-kit@0.3.3': 3310 + '@eslint/plugin-kit@0.3.5': 2076 3311 dependencies: 2077 - '@eslint/core': 0.15.1 3312 + '@eslint/core': 0.15.2 2078 3313 levn: 0.4.1 2079 3314 2080 - '@externdefs/collider@0.3.0(@badrap/valita@0.4.5)': 3315 + '@externdefs/collider@0.3.0(@badrap/valita@0.4.6)': 3316 + dependencies: 3317 + '@badrap/valita': 0.4.6 3318 + 3319 + '@floating-ui/core@1.7.3': 3320 + dependencies: 3321 + '@floating-ui/utils': 0.2.10 3322 + 3323 + '@floating-ui/dom@1.7.4': 3324 + dependencies: 3325 + '@floating-ui/core': 1.7.3 3326 + '@floating-ui/utils': 0.2.10 3327 + 3328 + '@floating-ui/utils@0.2.10': {} 3329 + 3330 + '@floating-ui/vue@1.1.9(vue@3.5.19(typescript@5.9.2))': 3331 + dependencies: 3332 + '@floating-ui/dom': 1.7.4 3333 + '@floating-ui/utils': 0.2.10 3334 + vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2)) 3335 + transitivePeerDependencies: 3336 + - '@vue/composition-api' 3337 + - vue 3338 + 3339 + '@headlessui/vue@1.7.23(vue@3.5.19(typescript@5.9.2))': 2081 3340 dependencies: 2082 - '@badrap/valita': 0.4.5 3341 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.19(typescript@5.9.2)) 3342 + vue: 3.5.19(typescript@5.9.2) 2083 3343 2084 - '@hono/node-server@1.15.0(hono@4.8.4)': 3344 + '@hono/node-server@1.19.0(hono@4.9.4)': 2085 3345 dependencies: 2086 - hono: 4.8.4 3346 + hono: 4.9.4 2087 3347 2088 3348 '@humanfs/core@0.19.1': {} 2089 3349 ··· 2098 3358 2099 3359 '@humanwhocodes/retry@0.4.3': {} 2100 3360 2101 - '@libsql/client@0.15.9': 3361 + '@hyperjump/browser@1.3.1': 3362 + dependencies: 3363 + '@hyperjump/json-pointer': 1.1.1 3364 + '@hyperjump/uri': 1.3.1 3365 + content-type: 1.0.5 3366 + just-curry-it: 5.3.0 3367 + 3368 + '@hyperjump/json-pointer@1.1.1': {} 3369 + 3370 + '@hyperjump/json-schema@1.16.2(@hyperjump/browser@1.3.1)': 3371 + dependencies: 3372 + '@hyperjump/browser': 1.3.1 3373 + '@hyperjump/json-pointer': 1.1.1 3374 + '@hyperjump/pact': 1.4.0 3375 + '@hyperjump/uri': 1.3.1 3376 + content-type: 1.0.5 3377 + json-stringify-deterministic: 1.0.12 3378 + just-curry-it: 5.3.0 3379 + uuid: 9.0.1 3380 + 3381 + '@hyperjump/pact@1.4.0': {} 3382 + 3383 + '@hyperjump/uri@1.3.1': {} 3384 + 3385 + '@internationalized/date@3.8.2': 3386 + dependencies: 3387 + '@swc/helpers': 0.5.17 3388 + 3389 + '@internationalized/number@3.6.4': 3390 + dependencies: 3391 + '@swc/helpers': 0.5.17 3392 + 3393 + '@jridgewell/gen-mapping@0.3.13': 3394 + dependencies: 3395 + '@jridgewell/sourcemap-codec': 1.5.5 3396 + '@jridgewell/trace-mapping': 0.3.30 3397 + 3398 + '@jridgewell/resolve-uri@3.1.2': {} 3399 + 3400 + '@jridgewell/source-map@0.3.11': 3401 + dependencies: 3402 + '@jridgewell/gen-mapping': 0.3.13 3403 + '@jridgewell/trace-mapping': 0.3.30 3404 + 3405 + '@jridgewell/sourcemap-codec@1.5.5': {} 3406 + 3407 + '@jridgewell/trace-mapping@0.3.30': 3408 + dependencies: 3409 + '@jridgewell/resolve-uri': 3.1.2 3410 + '@jridgewell/sourcemap-codec': 1.5.5 3411 + 3412 + '@libsql/client@0.15.12': 2102 3413 dependencies: 2103 - '@libsql/core': 0.15.9 3414 + '@libsql/core': 0.15.12 2104 3415 '@libsql/hrana-client': 0.7.0 2105 - js-base64: 3.7.7 2106 - libsql: 0.5.13 3416 + js-base64: 3.7.8 3417 + libsql: 0.5.17 2107 3418 promise-limit: 2.7.0 2108 3419 transitivePeerDependencies: 2109 3420 - bufferutil 2110 3421 - utf-8-validate 2111 3422 2112 - '@libsql/core@0.15.9': 3423 + '@libsql/core@0.15.12': 2113 3424 dependencies: 2114 - js-base64: 3.7.7 3425 + js-base64: 3.7.8 2115 3426 2116 - '@libsql/darwin-arm64@0.5.13': 3427 + '@libsql/darwin-arm64@0.5.17': 2117 3428 optional: true 2118 3429 2119 - '@libsql/darwin-x64@0.5.13': 3430 + '@libsql/darwin-x64@0.5.17': 2120 3431 optional: true 2121 3432 2122 3433 '@libsql/hrana-client@0.7.0': 2123 3434 dependencies: 2124 3435 '@libsql/isomorphic-fetch': 0.3.1 2125 3436 '@libsql/isomorphic-ws': 0.1.5 2126 - js-base64: 3.7.7 3437 + js-base64: 3.7.8 2127 3438 node-fetch: 3.3.2 2128 3439 transitivePeerDependencies: 2129 3440 - bufferutil ··· 2139 3450 - bufferutil 2140 3451 - utf-8-validate 2141 3452 2142 - '@libsql/linux-arm-gnueabihf@0.5.13': 3453 + '@libsql/linux-arm-gnueabihf@0.5.17': 2143 3454 optional: true 2144 3455 2145 - '@libsql/linux-arm-musleabihf@0.5.13': 3456 + '@libsql/linux-arm-musleabihf@0.5.17': 2146 3457 optional: true 2147 3458 2148 - '@libsql/linux-arm64-gnu@0.5.13': 3459 + '@libsql/linux-arm64-gnu@0.5.17': 2149 3460 optional: true 2150 3461 2151 - '@libsql/linux-arm64-musl@0.5.13': 3462 + '@libsql/linux-arm64-musl@0.5.17': 2152 3463 optional: true 2153 3464 2154 - '@libsql/linux-x64-gnu@0.5.13': 3465 + '@libsql/linux-x64-gnu@0.5.17': 2155 3466 optional: true 2156 3467 2157 - '@libsql/linux-x64-musl@0.5.13': 3468 + '@libsql/linux-x64-musl@0.5.17': 2158 3469 optional: true 2159 3470 2160 - '@libsql/win32-x64-msvc@0.5.13': 3471 + '@libsql/win32-x64-msvc@0.5.17': 2161 3472 optional: true 2162 3473 2163 3474 '@neon-rs/load@0.0.4': {} 3475 + 3476 + '@noble/secp256k1@2.3.0': {} 2164 3477 2165 3478 '@nodelib/fs.scandir@2.1.5': 2166 3479 dependencies: ··· 2174 3487 '@nodelib/fs.scandir': 2.1.5 2175 3488 fastq: 1.19.1 2176 3489 2177 - '@pkgr/core@0.2.7': {} 3490 + '@phosphor-icons/core@2.1.1': {} 3491 + 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 2178 3556 2179 3557 '@rtsao/scc@1.1.0': {} 2180 3558 2181 - '@skyware/jetstream@0.2.2(@atcute/client@2.0.9)': 3559 + '@scalar/code-highlight@0.1.9': 3560 + dependencies: 3561 + hast-util-to-text: 4.0.2 3562 + highlight.js: 11.11.1 3563 + highlightjs-curl: 1.3.0 3564 + highlightjs-vue: 1.0.0 3565 + lowlight: 3.3.0 3566 + rehype-external-links: 3.0.0 3567 + rehype-format: 5.0.1 3568 + rehype-parse: 9.0.1 3569 + rehype-raw: 7.0.0 3570 + rehype-sanitize: 6.0.0 3571 + rehype-stringify: 10.0.1 3572 + remark-gfm: 4.0.1 3573 + remark-parse: 11.0.0 3574 + remark-rehype: 11.1.2 3575 + remark-stringify: 11.0.0 3576 + unified: 11.0.5 3577 + unist-util-visit: 5.0.0 3578 + transitivePeerDependencies: 3579 + - supports-color 3580 + 3581 + '@scalar/components@0.14.25(typescript@5.9.2)': 3582 + dependencies: 3583 + '@floating-ui/utils': 0.2.10 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) 3595 + nanoid: 5.1.5 3596 + pretty-bytes: 6.1.1 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 3600 + transitivePeerDependencies: 3601 + - '@vue/composition-api' 3602 + - supports-color 3603 + - typescript 3604 + 3605 + '@scalar/core@0.3.13': 3606 + dependencies: 3607 + '@scalar/types': 0.2.12 3608 + 3609 + '@scalar/helpers@0.0.8': {} 3610 + 3611 + '@scalar/hono-api-reference@0.9.15(hono@4.9.4)': 3612 + dependencies: 3613 + '@scalar/core': 0.3.13 3614 + hono: 4.9.4 3615 + 3616 + '@scalar/icons@0.4.7(typescript@5.9.2)': 3617 + dependencies: 3618 + '@phosphor-icons/core': 2.1.1 3619 + '@types/node': 22.17.2 3620 + chalk: 5.6.0 3621 + vue: 3.5.19(typescript@5.9.2) 3622 + transitivePeerDependencies: 3623 + - typescript 3624 + 3625 + '@scalar/json-magic@0.3.0(typescript@5.9.2)': 2182 3626 dependencies: 2183 - '@atcute/bluesky': 1.0.15(@atcute/client@2.0.9) 2184 - partysocket: 1.1.4 3627 + '@scalar/helpers': 0.0.8 3628 + vue: 3.5.19(typescript@5.9.2) 3629 + yaml: 2.8.0 2185 3630 transitivePeerDependencies: 2186 - - '@atcute/client' 3631 + - typescript 3632 + 3633 + '@scalar/oas-utils@0.4.20(typescript@5.9.2)': 3634 + dependencies: 3635 + '@hyperjump/browser': 1.3.1 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) 3644 + '@types/har-format': 1.2.16 3645 + flatted: 3.3.3 3646 + microdiff: 1.5.0 3647 + nanoid: 5.1.5 3648 + type-fest: 4.41.0 3649 + yaml: 2.8.0 3650 + zod: 3.24.1 3651 + transitivePeerDependencies: 3652 + - supports-color 3653 + - typescript 3654 + 3655 + '@scalar/object-utils@1.2.4': 3656 + dependencies: 3657 + '@scalar/helpers': 0.0.8 3658 + flatted: 3.3.3 3659 + just-clone: 6.2.0 3660 + ts-deepmerge: 7.0.3 3661 + type-fest: 4.41.0 3662 + 3663 + '@scalar/openapi-parser@0.20.0(typescript@5.9.2)': 3664 + dependencies: 3665 + '@scalar/json-magic': 0.3.0(typescript@5.9.2) 3666 + '@scalar/openapi-types': 0.3.7 3667 + ajv: 8.17.1 3668 + ajv-draft-04: 1.0.0(ajv@8.17.1) 3669 + ajv-formats: 3.0.1(ajv@8.17.1) 3670 + jsonpointer: 5.0.1 3671 + leven: 4.0.0 3672 + yaml: 2.8.0 3673 + transitivePeerDependencies: 3674 + - typescript 3675 + 3676 + '@scalar/openapi-to-markdown@0.2.28(typescript@5.9.2)': 3677 + dependencies: 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 3684 + html-minifier-terser: 7.2.0 3685 + object-to-xml: 2.0.0 3686 + rehype-parse: 9.0.1 3687 + rehype-remark: 10.0.1 3688 + rehype-sanitize: 6.0.0 3689 + rehype-stringify: 10.0.1 3690 + remark-gfm: 4.0.1 3691 + remark-stringify: 11.0.0 3692 + unified: 11.0.5 3693 + vue: 3.5.19(typescript@5.9.2) 3694 + transitivePeerDependencies: 3695 + - '@vue/composition-api' 3696 + - supports-color 3697 + - typescript 3698 + 3699 + '@scalar/openapi-types@0.3.7': 3700 + dependencies: 3701 + zod: 3.24.1 3702 + 3703 + '@scalar/snippetz@0.4.5': 3704 + dependencies: 3705 + '@scalar/types': 0.2.12 3706 + stringify-object: 5.0.0 3707 + 3708 + '@scalar/themes@0.13.13': 3709 + dependencies: 3710 + '@scalar/types': 0.2.12 3711 + nanoid: 5.1.5 3712 + 3713 + '@scalar/types@0.2.12': 3714 + dependencies: 3715 + '@scalar/openapi-types': 0.3.7 3716 + nanoid: 5.1.5 3717 + zod: 3.24.1 3718 + 3719 + '@scalar/use-hooks@0.2.4(typescript@5.9.2)': 3720 + dependencies: 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) 3724 + tailwind-merge: 2.6.0 3725 + vue: 3.5.19(typescript@5.9.2) 3726 + zod: 3.24.1 3727 + transitivePeerDependencies: 3728 + - '@vue/composition-api' 3729 + - typescript 3730 + 3731 + '@scalar/use-toasts@0.8.0(typescript@5.9.2)': 3732 + dependencies: 3733 + nanoid: 5.1.5 3734 + vue: 3.5.19(typescript@5.9.2) 3735 + vue-sonner: 1.3.2 3736 + transitivePeerDependencies: 3737 + - typescript 3738 + 3739 + '@scalar/workspace-store@0.14.0(typescript@5.9.2)': 3740 + dependencies: 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 3747 + github-slugger: 2.0.0 3748 + type-fest: 4.41.0 3749 + vue: 3.5.19(typescript@5.9.2) 3750 + yaml: 2.8.0 3751 + transitivePeerDependencies: 3752 + - supports-color 3753 + - typescript 3754 + 3755 + '@sinclair/typebox@https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz': {} 3756 + 3757 + '@skyware/jetstream@0.2.5': 3758 + dependencies: 3759 + '@atcute/atproto': 3.1.2 3760 + '@atcute/bluesky': 3.2.1 3761 + '@atcute/lexicons': 1.1.1 3762 + partysocket: 1.1.5 3763 + tiny-emitter: 2.1.0 3764 + 3765 + '@swc/helpers@0.5.17': 3766 + dependencies: 3767 + tslib: 2.8.1 3768 + 3769 + '@tanstack/virtual-core@3.13.12': {} 3770 + 3771 + '@tanstack/vue-virtual@3.13.12(vue@3.5.19(typescript@5.9.2))': 3772 + dependencies: 3773 + '@tanstack/virtual-core': 3.13.12 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 3779 + 3780 + '@types/debug@4.1.12': 3781 + dependencies: 3782 + '@types/ms': 2.1.0 3783 + 3784 + '@types/deep-eql@4.0.2': {} 2187 3785 2188 3786 '@types/estree@1.0.8': {} 3787 + 3788 + '@types/har-format@1.2.16': {} 3789 + 3790 + '@types/hast@3.0.4': 3791 + dependencies: 3792 + '@types/unist': 3.0.3 2189 3793 2190 3794 '@types/json-schema@7.0.15': {} 2191 3795 2192 3796 '@types/json5@0.0.29': {} 2193 3797 2194 - '@types/node@24.0.10': 3798 + '@types/mdast@4.0.4': 3799 + dependencies: 3800 + '@types/unist': 3.0.3 3801 + 3802 + '@types/ms@2.1.0': {} 3803 + 3804 + '@types/node@22.17.2': 3805 + dependencies: 3806 + undici-types: 6.21.0 3807 + 3808 + '@types/node@24.3.0': 2195 3809 dependencies: 2196 - undici-types: 7.8.0 3810 + undici-types: 7.10.0 2197 3811 2198 3812 '@types/triple-beam@1.3.5': {} 2199 3813 3814 + '@types/unist@3.0.3': {} 3815 + 3816 + '@types/web-bluetooth@0.0.20': {} 3817 + 2200 3818 '@types/ws@8.18.1': 2201 3819 dependencies: 2202 - '@types/node': 24.0.10 3820 + '@types/node': 24.3.0 2203 3821 2204 - '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': 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)': 2205 3823 dependencies: 2206 3824 '@eslint-community/regexpp': 4.12.1 2207 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2208 - '@typescript-eslint/scope-manager': 8.35.1 2209 - '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2210 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2211 - '@typescript-eslint/visitor-keys': 8.35.1 2212 - eslint: 9.30.1(jiti@2.4.2) 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) 2213 3831 graphemer: 1.4.0 2214 3832 ignore: 7.0.5 2215 3833 natural-compare: 1.4.0 2216 - ts-api-utils: 2.1.0(typescript@5.8.3) 2217 - typescript: 5.8.3 3834 + ts-api-utils: 2.1.0(typescript@5.9.2) 3835 + typescript: 5.9.2 2218 3836 transitivePeerDependencies: 2219 3837 - supports-color 2220 3838 2221 - '@typescript-eslint/parser@8.35.1(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)': 2222 3840 dependencies: 2223 - '@typescript-eslint/scope-manager': 8.35.1 2224 - '@typescript-eslint/types': 8.35.1 2225 - '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 2226 - '@typescript-eslint/visitor-keys': 8.35.1 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 2227 3845 debug: 4.4.1 2228 - eslint: 9.30.1(jiti@2.4.2) 2229 - typescript: 5.8.3 3846 + eslint: 9.33.0(jiti@2.5.1) 3847 + typescript: 5.9.2 2230 3848 transitivePeerDependencies: 2231 3849 - supports-color 2232 3850 2233 - '@typescript-eslint/project-service@8.35.1(typescript@5.8.3)': 3851 + '@typescript-eslint/project-service@8.40.0(typescript@5.9.2)': 2234 3852 dependencies: 2235 - '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) 2236 - '@typescript-eslint/types': 8.35.1 3853 + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) 3854 + '@typescript-eslint/types': 8.40.0 2237 3855 debug: 4.4.1 2238 - typescript: 5.8.3 3856 + typescript: 5.9.2 2239 3857 transitivePeerDependencies: 2240 3858 - supports-color 2241 3859 2242 - '@typescript-eslint/scope-manager@8.35.1': 3860 + '@typescript-eslint/scope-manager@8.40.0': 2243 3861 dependencies: 2244 - '@typescript-eslint/types': 8.35.1 2245 - '@typescript-eslint/visitor-keys': 8.35.1 3862 + '@typescript-eslint/types': 8.40.0 3863 + '@typescript-eslint/visitor-keys': 8.40.0 2246 3864 2247 - '@typescript-eslint/tsconfig-utils@8.35.1(typescript@5.8.3)': 3865 + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)': 2248 3866 dependencies: 2249 - typescript: 5.8.3 3867 + typescript: 5.9.2 2250 3868 2251 - '@typescript-eslint/type-utils@8.35.1(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)': 2252 3870 dependencies: 2253 - '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 2254 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 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) 2255 3874 debug: 4.4.1 2256 - eslint: 9.30.1(jiti@2.4.2) 2257 - ts-api-utils: 2.1.0(typescript@5.8.3) 2258 - typescript: 5.8.3 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 2259 3878 transitivePeerDependencies: 2260 3879 - supports-color 2261 3880 2262 - '@typescript-eslint/types@8.35.1': {} 3881 + '@typescript-eslint/types@8.40.0': {} 2263 3882 2264 - '@typescript-eslint/typescript-estree@8.35.1(typescript@5.8.3)': 3883 + '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)': 2265 3884 dependencies: 2266 - '@typescript-eslint/project-service': 8.35.1(typescript@5.8.3) 2267 - '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) 2268 - '@typescript-eslint/types': 8.35.1 2269 - '@typescript-eslint/visitor-keys': 8.35.1 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 2270 3889 debug: 4.4.1 2271 3890 fast-glob: 3.3.3 2272 3891 is-glob: 4.0.3 2273 3892 minimatch: 9.0.5 2274 3893 semver: 7.7.2 2275 - ts-api-utils: 2.1.0(typescript@5.8.3) 2276 - typescript: 5.8.3 3894 + ts-api-utils: 2.1.0(typescript@5.9.2) 3895 + typescript: 5.9.2 2277 3896 transitivePeerDependencies: 2278 3897 - supports-color 2279 3898 2280 - '@typescript-eslint/utils@8.35.1(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)': 2281 3900 dependencies: 2282 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) 2283 - '@typescript-eslint/scope-manager': 8.35.1 2284 - '@typescript-eslint/types': 8.35.1 2285 - '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) 2286 - eslint: 9.30.1(jiti@2.4.2) 2287 - typescript: 5.8.3 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 2288 3907 transitivePeerDependencies: 2289 3908 - supports-color 2290 3909 2291 - '@typescript-eslint/visitor-keys@8.35.1': 3910 + '@typescript-eslint/visitor-keys@8.40.0': 2292 3911 dependencies: 2293 - '@typescript-eslint/types': 8.35.1 3912 + '@typescript-eslint/types': 8.40.0 2294 3913 eslint-visitor-keys: 4.2.1 2295 3914 3915 + '@ungap/structured-clone@1.3.0': {} 3916 + 3917 + '@vitest/expect@3.2.4': 3918 + dependencies: 3919 + '@types/chai': 5.2.2 3920 + '@vitest/spy': 3.2.4 3921 + '@vitest/utils': 3.2.4 3922 + chai: 5.3.3 3923 + tinyrainbow: 2.0.0 3924 + 3925 + '@vitest/mocker@3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0))': 3926 + dependencies: 3927 + '@vitest/spy': 3.2.4 3928 + estree-walker: 3.0.3 3929 + magic-string: 0.30.18 3930 + optionalDependencies: 3931 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 3932 + 3933 + '@vitest/pretty-format@3.2.4': 3934 + dependencies: 3935 + tinyrainbow: 2.0.0 3936 + 3937 + '@vitest/runner@3.2.4': 3938 + dependencies: 3939 + '@vitest/utils': 3.2.4 3940 + pathe: 2.0.3 3941 + strip-literal: 3.0.0 3942 + 3943 + '@vitest/snapshot@3.2.4': 3944 + dependencies: 3945 + '@vitest/pretty-format': 3.2.4 3946 + magic-string: 0.30.18 3947 + pathe: 2.0.3 3948 + 3949 + '@vitest/spy@3.2.4': 3950 + dependencies: 3951 + tinyspy: 4.0.3 3952 + 3953 + '@vitest/utils@3.2.4': 3954 + dependencies: 3955 + '@vitest/pretty-format': 3.2.4 3956 + loupe: 3.2.1 3957 + tinyrainbow: 2.0.0 3958 + 3959 + '@vue/compiler-core@3.5.19': 3960 + dependencies: 3961 + '@babel/parser': 7.28.3 3962 + '@vue/shared': 3.5.19 3963 + entities: 4.5.0 3964 + estree-walker: 2.0.2 3965 + source-map-js: 1.2.1 3966 + 3967 + '@vue/compiler-dom@3.5.19': 3968 + dependencies: 3969 + '@vue/compiler-core': 3.5.19 3970 + '@vue/shared': 3.5.19 3971 + 3972 + '@vue/compiler-sfc@3.5.19': 3973 + dependencies: 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 3979 + estree-walker: 2.0.2 3980 + magic-string: 0.30.18 3981 + postcss: 8.5.6 3982 + source-map-js: 1.2.1 3983 + 3984 + '@vue/compiler-ssr@3.5.19': 3985 + dependencies: 3986 + '@vue/compiler-dom': 3.5.19 3987 + '@vue/shared': 3.5.19 3988 + 3989 + '@vue/reactivity@3.5.19': 3990 + dependencies: 3991 + '@vue/shared': 3.5.19 3992 + 3993 + '@vue/runtime-core@3.5.19': 3994 + dependencies: 3995 + '@vue/reactivity': 3.5.19 3996 + '@vue/shared': 3.5.19 3997 + 3998 + '@vue/runtime-dom@3.5.19': 3999 + dependencies: 4000 + '@vue/reactivity': 3.5.19 4001 + '@vue/runtime-core': 3.5.19 4002 + '@vue/shared': 3.5.19 4003 + csstype: 3.1.3 4004 + 4005 + '@vue/server-renderer@3.5.19(vue@3.5.19(typescript@5.9.2))': 4006 + dependencies: 4007 + '@vue/compiler-ssr': 3.5.19 4008 + '@vue/shared': 3.5.19 4009 + vue: 3.5.19(typescript@5.9.2) 4010 + 4011 + '@vue/shared@3.5.19': {} 4012 + 4013 + '@vueuse/core@10.11.1(vue@3.5.19(typescript@5.9.2))': 4014 + dependencies: 4015 + '@types/web-bluetooth': 0.0.20 4016 + '@vueuse/metadata': 10.11.1 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)) 4029 + transitivePeerDependencies: 4030 + - '@vue/composition-api' 4031 + - vue 4032 + 4033 + '@vueuse/metadata@10.11.1': {} 4034 + 4035 + '@vueuse/metadata@11.3.0': {} 4036 + 4037 + '@vueuse/shared@10.11.1(vue@3.5.19(typescript@5.9.2))': 4038 + dependencies: 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)) 4047 + transitivePeerDependencies: 4048 + - '@vue/composition-api' 4049 + - vue 4050 + 2296 4051 acorn-jsx@5.3.2(acorn@8.15.0): 2297 4052 dependencies: 2298 4053 acorn: 8.15.0 2299 4054 2300 4055 acorn@8.15.0: {} 2301 4056 4057 + ajv-draft-04@1.0.0(ajv@8.17.1): 4058 + optionalDependencies: 4059 + ajv: 8.17.1 4060 + 4061 + ajv-formats@3.0.1(ajv@8.17.1): 4062 + optionalDependencies: 4063 + ajv: 8.17.1 4064 + 2302 4065 ajv@6.12.6: 2303 4066 dependencies: 2304 4067 fast-deep-equal: 3.1.3 ··· 2306 4069 json-schema-traverse: 0.4.1 2307 4070 uri-js: 4.4.1 2308 4071 4072 + ajv@8.17.1: 4073 + dependencies: 4074 + fast-deep-equal: 3.1.3 4075 + fast-uri: 3.0.6 4076 + json-schema-traverse: 1.0.0 4077 + require-from-string: 2.0.2 4078 + 2309 4079 ansi-styles@4.3.0: 2310 4080 dependencies: 2311 4081 color-convert: 2.0.1 2312 4082 2313 4083 argparse@2.0.1: {} 2314 4084 4085 + aria-hidden@1.2.6: 4086 + dependencies: 4087 + tslib: 2.8.1 4088 + 2315 4089 array-buffer-byte-length@1.0.2: 2316 4090 dependencies: 2317 4091 call-bound: 1.0.4 ··· 2362 4136 get-intrinsic: 1.3.0 2363 4137 is-array-buffer: 3.0.5 2364 4138 4139 + assertion-error@2.0.1: {} 4140 + 2365 4141 async-function@1.0.0: {} 2366 4142 2367 4143 async@3.2.6: {} ··· 2369 4145 available-typed-arrays@1.0.7: 2370 4146 dependencies: 2371 4147 possible-typed-array-names: 1.1.0 4148 + 4149 + bail@2.0.2: {} 2372 4150 2373 4151 balanced-match@1.0.2: {} 2374 4152 ··· 2389 4167 2390 4168 bun-types@1.2.17: 2391 4169 dependencies: 2392 - '@types/node': 24.0.10 4170 + '@types/node': 24.3.0 2393 4171 optional: true 4172 + 4173 + cac@6.7.14: {} 2394 4174 2395 4175 call-bind-apply-helpers@1.0.2: 2396 4176 dependencies: ··· 2411 4191 2412 4192 callsites@3.1.0: {} 2413 4193 4194 + camel-case@4.1.2: 4195 + dependencies: 4196 + pascal-case: 3.1.2 4197 + tslib: 2.8.1 4198 + 4199 + ccount@2.0.1: {} 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 + 2414 4209 chalk@4.1.2: 2415 4210 dependencies: 2416 4211 ansi-styles: 4.3.0 2417 4212 supports-color: 7.2.0 2418 4213 4214 + chalk@5.6.0: {} 4215 + 4216 + character-entities-html4@2.1.0: {} 4217 + 4218 + character-entities-legacy@3.0.0: {} 4219 + 4220 + character-entities@2.0.2: {} 4221 + 4222 + check-error@2.1.1: {} 4223 + 4224 + clean-css@5.3.3: 4225 + dependencies: 4226 + source-map: 0.6.1 4227 + 4228 + clsx@2.1.1: {} 4229 + 2419 4230 color-convert@1.9.3: 2420 4231 dependencies: 2421 4232 color-name: 1.1.3 ··· 2443 4254 color: 3.2.1 2444 4255 text-hex: 1.0.0 2445 4256 4257 + comma-separated-tokens@2.0.3: {} 4258 + 4259 + commander@10.0.1: {} 4260 + 4261 + commander@2.20.3: {} 4262 + 2446 4263 concat-map@0.0.1: {} 4264 + 4265 + content-type@1.0.5: {} 2447 4266 2448 4267 cross-spawn@7.0.6: 2449 4268 dependencies: ··· 2451 4270 shebang-command: 2.0.0 2452 4271 which: 2.0.2 2453 4272 4273 + csstype@3.1.3: {} 4274 + 4275 + cva@1.0.0-beta.2(typescript@5.9.2): 4276 + dependencies: 4277 + clsx: 2.1.1 4278 + optionalDependencies: 4279 + typescript: 5.9.2 4280 + 4281 + dank-each@1.0.0: {} 4282 + 4283 + dank-map@0.1.0: {} 4284 + 2454 4285 data-uri-to-buffer@4.0.1: {} 2455 4286 2456 4287 data-view-buffer@1.0.2: ··· 2479 4310 dependencies: 2480 4311 ms: 2.1.3 2481 4312 4313 + decode-named-character-reference@1.2.0: 4314 + dependencies: 4315 + character-entities: 2.0.2 4316 + 4317 + deep-eql@5.0.2: {} 4318 + 2482 4319 deep-is@0.1.4: {} 2483 4320 2484 4321 define-data-property@1.1.4: ··· 2493 4330 has-property-descriptors: 1.0.2 2494 4331 object-keys: 1.1.1 2495 4332 4333 + defu@6.1.4: {} 4334 + 4335 + dequal@2.0.3: {} 4336 + 2496 4337 detect-libc@2.0.2: {} 2497 4338 4339 + devlop@1.1.0: 4340 + dependencies: 4341 + dequal: 2.0.3 4342 + 2498 4343 doctrine@2.1.0: 2499 4344 dependencies: 2500 4345 esutils: 2.0.3 2501 4346 4347 + dot-case@3.0.4: 4348 + dependencies: 4349 + no-case: 3.0.4 4350 + tslib: 2.8.1 4351 + 2502 4352 drizzle-kit@0.31.4: 2503 4353 dependencies: 2504 4354 '@drizzle-team/brocli': 0.10.2 2505 4355 '@esbuild-kit/esm-loader': 2.6.5 2506 - esbuild: 0.25.5 2507 - esbuild-register: 3.6.0(esbuild@0.25.5) 4356 + esbuild: 0.25.9 4357 + esbuild-register: 3.6.0(esbuild@0.25.9) 2508 4358 transitivePeerDependencies: 2509 4359 - supports-color 2510 4360 2511 - 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): 2512 4362 optionalDependencies: 2513 - '@libsql/client': 0.15.9 4363 + '@libsql/client': 0.15.12 2514 4364 bun-types: 1.2.17 2515 4365 2516 4366 dunder-proto@1.0.1: ··· 2520 4370 gopd: 1.2.0 2521 4371 2522 4372 enabled@2.0.0: {} 4373 + 4374 + entities@4.5.0: {} 4375 + 4376 + entities@6.0.1: {} 2523 4377 2524 4378 es-abstract@1.24.0: 2525 4379 dependencies: ··· 2582 4436 2583 4437 es-errors@1.3.0: {} 2584 4438 4439 + es-module-lexer@1.7.0: {} 4440 + 2585 4441 es-object-atoms@1.1.1: 2586 4442 dependencies: 2587 4443 es-errors: 1.3.0 ··· 2603 4459 is-date-object: 1.1.0 2604 4460 is-symbol: 1.1.1 2605 4461 2606 - esbuild-register@3.6.0(esbuild@0.25.5): 4462 + esbuild-register@3.6.0(esbuild@0.25.9): 2607 4463 dependencies: 2608 4464 debug: 4.4.1 2609 - esbuild: 0.25.5 4465 + esbuild: 0.25.9 2610 4466 transitivePeerDependencies: 2611 4467 - supports-color 2612 4468 ··· 2635 4491 '@esbuild/win32-ia32': 0.18.20 2636 4492 '@esbuild/win32-x64': 0.18.20 2637 4493 2638 - esbuild@0.25.5: 4494 + esbuild@0.25.9: 2639 4495 optionalDependencies: 2640 - '@esbuild/aix-ppc64': 0.25.5 2641 - '@esbuild/android-arm': 0.25.5 2642 - '@esbuild/android-arm64': 0.25.5 2643 - '@esbuild/android-x64': 0.25.5 2644 - '@esbuild/darwin-arm64': 0.25.5 2645 - '@esbuild/darwin-x64': 0.25.5 2646 - '@esbuild/freebsd-arm64': 0.25.5 2647 - '@esbuild/freebsd-x64': 0.25.5 2648 - '@esbuild/linux-arm': 0.25.5 2649 - '@esbuild/linux-arm64': 0.25.5 2650 - '@esbuild/linux-ia32': 0.25.5 2651 - '@esbuild/linux-loong64': 0.25.5 2652 - '@esbuild/linux-mips64el': 0.25.5 2653 - '@esbuild/linux-ppc64': 0.25.5 2654 - '@esbuild/linux-riscv64': 0.25.5 2655 - '@esbuild/linux-s390x': 0.25.5 2656 - '@esbuild/linux-x64': 0.25.5 2657 - '@esbuild/netbsd-arm64': 0.25.5 2658 - '@esbuild/netbsd-x64': 0.25.5 2659 - '@esbuild/openbsd-arm64': 0.25.5 2660 - '@esbuild/openbsd-x64': 0.25.5 2661 - '@esbuild/sunos-x64': 0.25.5 2662 - '@esbuild/win32-arm64': 0.25.5 2663 - '@esbuild/win32-ia32': 0.25.5 2664 - '@esbuild/win32-x64': 0.25.5 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 2665 4522 2666 4523 escape-string-regexp@4.0.0: {} 2667 4524 2668 - eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)): 4525 + escape-string-regexp@5.0.0: {} 4526 + 4527 + eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)): 2669 4528 dependencies: 2670 - eslint: 9.30.1(jiti@2.4.2) 4529 + eslint: 9.33.0(jiti@2.5.1) 2671 4530 2672 4531 eslint-import-resolver-node@0.3.9: 2673 4532 dependencies: ··· 2677 4536 transitivePeerDependencies: 2678 4537 - supports-color 2679 4538 2680 - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2)): 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)): 2681 4540 dependencies: 2682 4541 debug: 3.2.7 2683 4542 optionalDependencies: 2684 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 2685 - eslint: 9.30.1(jiti@2.4.2) 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) 2686 4545 eslint-import-resolver-node: 0.3.9 2687 4546 transitivePeerDependencies: 2688 4547 - supports-color 2689 4548 2690 - 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)): 2691 4550 dependencies: 2692 - eslint: 9.30.1(jiti@2.4.2) 4551 + eslint: 9.33.0(jiti@2.5.1) 2693 4552 2694 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)): 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)): 2695 4554 dependencies: 2696 4555 '@rtsao/scc': 1.1.0 2697 4556 array-includes: 3.1.9 ··· 2700 4559 array.prototype.flatmap: 1.3.3 2701 4560 debug: 3.2.7 2702 4561 doctrine: 2.1.0 2703 - eslint: 9.30.1(jiti@2.4.2) 4562 + eslint: 9.33.0(jiti@2.5.1) 2704 4563 eslint-import-resolver-node: 0.3.9 2705 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2)) 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)) 2706 4565 hasown: 2.0.2 2707 4566 is-core-module: 2.16.1 2708 4567 is-glob: 4.0.3 ··· 2714 4573 string.prototype.trimend: 1.0.9 2715 4574 tsconfig-paths: 3.15.0 2716 4575 optionalDependencies: 2717 - '@typescript-eslint/parser': 8.35.1(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) 2718 4577 transitivePeerDependencies: 2719 4578 - eslint-import-resolver-typescript 2720 4579 - eslint-import-resolver-webpack 2721 4580 - supports-color 2722 4581 2723 - eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2): 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): 2724 4583 dependencies: 2725 - eslint: 9.30.1(jiti@2.4.2) 4584 + eslint: 9.33.0(jiti@2.5.1) 2726 4585 prettier: 3.6.2 2727 4586 prettier-linter-helpers: 1.0.0 2728 - synckit: 0.11.8 4587 + synckit: 0.11.11 2729 4588 optionalDependencies: 2730 - 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)) 2731 4590 2732 4591 eslint-scope@8.4.0: 2733 4592 dependencies: ··· 2738 4597 2739 4598 eslint-visitor-keys@4.2.1: {} 2740 4599 2741 - eslint@9.30.1(jiti@2.4.2): 4600 + eslint@9.33.0(jiti@2.5.1): 2742 4601 dependencies: 2743 - '@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)) 2744 4603 '@eslint-community/regexpp': 4.12.1 2745 4604 '@eslint/config-array': 0.21.0 2746 - '@eslint/config-helpers': 0.3.0 2747 - '@eslint/core': 0.14.0 4605 + '@eslint/config-helpers': 0.3.1 4606 + '@eslint/core': 0.15.2 2748 4607 '@eslint/eslintrc': 3.3.1 2749 - '@eslint/js': 9.30.1 2750 - '@eslint/plugin-kit': 0.3.3 4608 + '@eslint/js': 9.33.0 4609 + '@eslint/plugin-kit': 0.3.5 2751 4610 '@humanfs/node': 0.16.6 2752 4611 '@humanwhocodes/module-importer': 1.0.1 2753 4612 '@humanwhocodes/retry': 0.4.3 ··· 2776 4635 natural-compare: 1.4.0 2777 4636 optionator: 0.9.4 2778 4637 optionalDependencies: 2779 - jiti: 2.4.2 4638 + jiti: 2.5.1 2780 4639 transitivePeerDependencies: 2781 4640 - supports-color 2782 4641 ··· 2798 4657 2799 4658 estraverse@5.3.0: {} 2800 4659 4660 + estree-walker@2.0.2: {} 4661 + 4662 + estree-walker@3.0.3: 4663 + dependencies: 4664 + '@types/estree': 1.0.8 4665 + 2801 4666 esutils@2.0.3: {} 2802 4667 2803 4668 event-target-polyfill@0.0.4: {} 2804 4669 4670 + expect-type@1.2.2: {} 4671 + 4672 + extend@3.0.2: {} 4673 + 2805 4674 fast-deep-equal@3.1.3: {} 2806 4675 2807 4676 fast-diff@1.3.0: {} ··· 2818 4687 2819 4688 fast-levenshtein@2.0.6: {} 2820 4689 4690 + fast-uri@3.0.6: {} 4691 + 2821 4692 fastq@1.19.1: 2822 4693 dependencies: 2823 4694 reusify: 1.1.0 2824 4695 4696 + fdir@6.5.0(picomatch@4.0.3): 4697 + optionalDependencies: 4698 + picomatch: 4.0.3 4699 + 2825 4700 fecha@4.2.3: {} 2826 4701 2827 4702 fetch-blob@3.2.0: ··· 2888 4763 hasown: 2.0.2 2889 4764 math-intrinsics: 1.1.0 2890 4765 4766 + get-own-enumerable-keys@1.0.0: {} 4767 + 2891 4768 get-proto@1.0.1: 2892 4769 dependencies: 2893 4770 dunder-proto: 1.0.1 ··· 2902 4779 get-tsconfig@4.10.1: 2903 4780 dependencies: 2904 4781 resolve-pkg-maps: 1.0.0 4782 + 4783 + github-slugger@2.0.0: {} 2905 4784 2906 4785 glob-parent@5.1.2: 2907 4786 dependencies: ··· 2946 4825 dependencies: 2947 4826 function-bind: 1.1.2 2948 4827 2949 - hono@4.8.4: {} 4828 + hast-util-embedded@3.0.0: 4829 + dependencies: 4830 + '@types/hast': 3.0.4 4831 + hast-util-is-element: 3.0.0 4832 + 4833 + hast-util-format@1.1.0: 4834 + dependencies: 4835 + '@types/hast': 3.0.4 4836 + hast-util-embedded: 3.0.0 4837 + hast-util-minify-whitespace: 1.0.1 4838 + hast-util-phrasing: 3.0.1 4839 + hast-util-whitespace: 3.0.0 4840 + html-whitespace-sensitive-tag-names: 3.0.1 4841 + unist-util-visit-parents: 6.0.1 4842 + 4843 + hast-util-from-html@2.0.3: 4844 + dependencies: 4845 + '@types/hast': 3.0.4 4846 + devlop: 1.1.0 4847 + hast-util-from-parse5: 8.0.3 4848 + parse5: 7.3.0 4849 + vfile: 6.0.3 4850 + vfile-message: 4.0.3 4851 + 4852 + hast-util-from-parse5@8.0.3: 4853 + dependencies: 4854 + '@types/hast': 3.0.4 4855 + '@types/unist': 3.0.3 4856 + devlop: 1.1.0 4857 + hastscript: 9.0.1 4858 + property-information: 7.1.0 4859 + vfile: 6.0.3 4860 + vfile-location: 5.0.3 4861 + web-namespaces: 2.0.1 4862 + 4863 + hast-util-has-property@3.0.0: 4864 + dependencies: 4865 + '@types/hast': 3.0.4 4866 + 4867 + hast-util-is-body-ok-link@3.0.1: 4868 + dependencies: 4869 + '@types/hast': 3.0.4 4870 + 4871 + hast-util-is-element@3.0.0: 4872 + dependencies: 4873 + '@types/hast': 3.0.4 4874 + 4875 + hast-util-minify-whitespace@1.0.1: 4876 + dependencies: 4877 + '@types/hast': 3.0.4 4878 + hast-util-embedded: 3.0.0 4879 + hast-util-is-element: 3.0.0 4880 + hast-util-whitespace: 3.0.0 4881 + unist-util-is: 6.0.0 4882 + 4883 + hast-util-parse-selector@4.0.0: 4884 + dependencies: 4885 + '@types/hast': 3.0.4 4886 + 4887 + hast-util-phrasing@3.0.1: 4888 + dependencies: 4889 + '@types/hast': 3.0.4 4890 + hast-util-embedded: 3.0.0 4891 + hast-util-has-property: 3.0.0 4892 + hast-util-is-body-ok-link: 3.0.1 4893 + hast-util-is-element: 3.0.0 4894 + 4895 + hast-util-raw@9.1.0: 4896 + dependencies: 4897 + '@types/hast': 3.0.4 4898 + '@types/unist': 3.0.3 4899 + '@ungap/structured-clone': 1.3.0 4900 + hast-util-from-parse5: 8.0.3 4901 + hast-util-to-parse5: 8.0.0 4902 + html-void-elements: 3.0.0 4903 + mdast-util-to-hast: 13.2.0 4904 + parse5: 7.3.0 4905 + unist-util-position: 5.0.0 4906 + unist-util-visit: 5.0.0 4907 + vfile: 6.0.3 4908 + web-namespaces: 2.0.1 4909 + zwitch: 2.0.4 4910 + 4911 + hast-util-sanitize@5.0.2: 4912 + dependencies: 4913 + '@types/hast': 3.0.4 4914 + '@ungap/structured-clone': 1.3.0 4915 + unist-util-position: 5.0.0 4916 + 4917 + hast-util-to-html@9.0.5: 4918 + dependencies: 4919 + '@types/hast': 3.0.4 4920 + '@types/unist': 3.0.3 4921 + ccount: 2.0.1 4922 + comma-separated-tokens: 2.0.3 4923 + hast-util-whitespace: 3.0.0 4924 + html-void-elements: 3.0.0 4925 + mdast-util-to-hast: 13.2.0 4926 + property-information: 7.1.0 4927 + space-separated-tokens: 2.0.2 4928 + stringify-entities: 4.0.4 4929 + zwitch: 2.0.4 4930 + 4931 + hast-util-to-mdast@10.1.2: 4932 + dependencies: 4933 + '@types/hast': 3.0.4 4934 + '@types/mdast': 4.0.4 4935 + '@ungap/structured-clone': 1.3.0 4936 + hast-util-phrasing: 3.0.1 4937 + hast-util-to-html: 9.0.5 4938 + hast-util-to-text: 4.0.2 4939 + hast-util-whitespace: 3.0.0 4940 + mdast-util-phrasing: 4.1.0 4941 + mdast-util-to-hast: 13.2.0 4942 + mdast-util-to-string: 4.0.0 4943 + rehype-minify-whitespace: 6.0.2 4944 + trim-trailing-lines: 2.1.0 4945 + unist-util-position: 5.0.0 4946 + unist-util-visit: 5.0.0 4947 + 4948 + hast-util-to-parse5@8.0.0: 4949 + dependencies: 4950 + '@types/hast': 3.0.4 4951 + comma-separated-tokens: 2.0.3 4952 + devlop: 1.1.0 4953 + property-information: 6.5.0 4954 + space-separated-tokens: 2.0.2 4955 + web-namespaces: 2.0.1 4956 + zwitch: 2.0.4 4957 + 4958 + hast-util-to-text@4.0.2: 4959 + dependencies: 4960 + '@types/hast': 3.0.4 4961 + '@types/unist': 3.0.3 4962 + hast-util-is-element: 3.0.0 4963 + unist-util-find-after: 5.0.0 4964 + 4965 + hast-util-whitespace@3.0.0: 4966 + dependencies: 4967 + '@types/hast': 3.0.4 4968 + 4969 + hastscript@9.0.1: 4970 + dependencies: 4971 + '@types/hast': 3.0.4 4972 + comma-separated-tokens: 2.0.3 4973 + hast-util-parse-selector: 4.0.0 4974 + property-information: 7.1.0 4975 + space-separated-tokens: 2.0.2 4976 + 4977 + highlight.js@11.11.1: {} 4978 + 4979 + highlightjs-curl@1.3.0: {} 4980 + 4981 + highlightjs-vue@1.0.0: {} 4982 + 4983 + hono@4.9.4: {} 4984 + 4985 + html-minifier-terser@7.2.0: 4986 + dependencies: 4987 + camel-case: 4.1.2 4988 + clean-css: 5.3.3 4989 + commander: 10.0.1 4990 + entities: 4.5.0 4991 + param-case: 3.0.4 4992 + relateurl: 0.2.7 4993 + terser: 5.43.1 4994 + 4995 + html-void-elements@3.0.0: {} 4996 + 4997 + html-whitespace-sensitive-tag-names@3.0.1: {} 2950 4998 2951 4999 ignore@5.3.2: {} 2952 5000 ··· 2966 5014 es-errors: 1.3.0 2967 5015 hasown: 2.0.2 2968 5016 side-channel: 1.1.0 5017 + 5018 + is-absolute-url@4.0.1: {} 2969 5019 2970 5020 is-array-buffer@3.0.5: 2971 5021 dependencies: ··· 3037 5087 3038 5088 is-number@7.0.0: {} 3039 5089 5090 + is-obj@3.0.0: {} 5091 + 5092 + is-plain-obj@4.1.0: {} 5093 + 3040 5094 is-regex@1.2.1: 3041 5095 dependencies: 3042 5096 call-bound: 1.0.4 3043 5097 gopd: 1.2.0 3044 5098 has-tostringtag: 1.0.2 3045 5099 hasown: 2.0.2 5100 + 5101 + is-regexp@3.1.0: {} 3046 5102 3047 5103 is-set@2.0.3: {} 3048 5104 ··· 3082 5138 3083 5139 isexe@2.0.0: {} 3084 5140 3085 - jiti@2.4.2: {} 5141 + jiti@2.5.1: {} 3086 5142 3087 - js-base64@3.7.7: {} 5143 + js-base64@3.7.8: {} 5144 + 5145 + js-tokens@9.0.1: {} 3088 5146 3089 5147 js-yaml@4.1.0: 3090 5148 dependencies: ··· 3094 5152 3095 5153 json-schema-traverse@0.4.1: {} 3096 5154 5155 + json-schema-traverse@1.0.0: {} 5156 + 3097 5157 json-stable-stringify-without-jsonify@1.0.1: {} 3098 5158 5159 + json-stringify-deterministic@1.0.12: {} 5160 + 3099 5161 json5@1.0.2: 3100 5162 dependencies: 3101 5163 minimist: 1.2.8 3102 5164 5165 + jsonpointer@5.0.1: {} 5166 + 5167 + just-clone@6.2.0: {} 5168 + 5169 + just-curry-it@5.3.0: {} 5170 + 3103 5171 keyv@4.5.4: 3104 5172 dependencies: 3105 5173 json-buffer: 3.0.1 3106 5174 3107 5175 kuler@2.0.0: {} 5176 + 5177 + leven@4.0.0: {} 3108 5178 3109 5179 levn@0.4.1: 3110 5180 dependencies: 3111 5181 prelude-ls: 1.2.1 3112 5182 type-check: 0.4.0 3113 5183 3114 - libsql@0.5.13: 5184 + libsql@0.5.17: 3115 5185 dependencies: 3116 5186 '@neon-rs/load': 0.0.4 3117 5187 detect-libc: 2.0.2 3118 5188 optionalDependencies: 3119 - '@libsql/darwin-arm64': 0.5.13 3120 - '@libsql/darwin-x64': 0.5.13 3121 - '@libsql/linux-arm-gnueabihf': 0.5.13 3122 - '@libsql/linux-arm-musleabihf': 0.5.13 3123 - '@libsql/linux-arm64-gnu': 0.5.13 3124 - '@libsql/linux-arm64-musl': 0.5.13 3125 - '@libsql/linux-x64-gnu': 0.5.13 3126 - '@libsql/linux-x64-musl': 0.5.13 3127 - '@libsql/win32-x64-msvc': 0.5.13 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 3128 5198 3129 5199 locate-path@6.0.0: 3130 5200 dependencies: ··· 3141 5211 safe-stable-stringify: 2.5.0 3142 5212 triple-beam: 1.4.1 3143 5213 5214 + longest-streak@3.1.0: {} 5215 + 5216 + loupe@3.2.1: {} 5217 + 5218 + lower-case@2.0.2: 5219 + dependencies: 5220 + tslib: 2.8.1 5221 + 5222 + lowlight@3.3.0: 5223 + dependencies: 5224 + '@types/hast': 3.0.4 5225 + devlop: 1.1.0 5226 + highlight.js: 11.11.1 5227 + 5228 + magic-string@0.30.18: 5229 + dependencies: 5230 + '@jridgewell/sourcemap-codec': 1.5.5 5231 + 5232 + markdown-table@3.0.4: {} 5233 + 3144 5234 math-intrinsics@1.1.0: {} 3145 5235 5236 + mdast-util-find-and-replace@3.0.2: 5237 + dependencies: 5238 + '@types/mdast': 4.0.4 5239 + escape-string-regexp: 5.0.0 5240 + unist-util-is: 6.0.0 5241 + unist-util-visit-parents: 6.0.1 5242 + 5243 + mdast-util-from-markdown@2.0.2: 5244 + dependencies: 5245 + '@types/mdast': 4.0.4 5246 + '@types/unist': 3.0.3 5247 + decode-named-character-reference: 1.2.0 5248 + devlop: 1.1.0 5249 + mdast-util-to-string: 4.0.0 5250 + micromark: 4.0.2 5251 + micromark-util-decode-numeric-character-reference: 2.0.2 5252 + micromark-util-decode-string: 2.0.1 5253 + micromark-util-normalize-identifier: 2.0.1 5254 + micromark-util-symbol: 2.0.1 5255 + micromark-util-types: 2.0.2 5256 + unist-util-stringify-position: 4.0.0 5257 + transitivePeerDependencies: 5258 + - supports-color 5259 + 5260 + mdast-util-gfm-autolink-literal@2.0.1: 5261 + dependencies: 5262 + '@types/mdast': 4.0.4 5263 + ccount: 2.0.1 5264 + devlop: 1.1.0 5265 + mdast-util-find-and-replace: 3.0.2 5266 + micromark-util-character: 2.1.1 5267 + 5268 + mdast-util-gfm-footnote@2.1.0: 5269 + dependencies: 5270 + '@types/mdast': 4.0.4 5271 + devlop: 1.1.0 5272 + mdast-util-from-markdown: 2.0.2 5273 + mdast-util-to-markdown: 2.1.2 5274 + micromark-util-normalize-identifier: 2.0.1 5275 + transitivePeerDependencies: 5276 + - supports-color 5277 + 5278 + mdast-util-gfm-strikethrough@2.0.0: 5279 + dependencies: 5280 + '@types/mdast': 4.0.4 5281 + mdast-util-from-markdown: 2.0.2 5282 + mdast-util-to-markdown: 2.1.2 5283 + transitivePeerDependencies: 5284 + - supports-color 5285 + 5286 + mdast-util-gfm-table@2.0.0: 5287 + dependencies: 5288 + '@types/mdast': 4.0.4 5289 + devlop: 1.1.0 5290 + markdown-table: 3.0.4 5291 + mdast-util-from-markdown: 2.0.2 5292 + mdast-util-to-markdown: 2.1.2 5293 + transitivePeerDependencies: 5294 + - supports-color 5295 + 5296 + mdast-util-gfm-task-list-item@2.0.0: 5297 + dependencies: 5298 + '@types/mdast': 4.0.4 5299 + devlop: 1.1.0 5300 + mdast-util-from-markdown: 2.0.2 5301 + mdast-util-to-markdown: 2.1.2 5302 + transitivePeerDependencies: 5303 + - supports-color 5304 + 5305 + mdast-util-gfm@3.1.0: 5306 + dependencies: 5307 + mdast-util-from-markdown: 2.0.2 5308 + mdast-util-gfm-autolink-literal: 2.0.1 5309 + mdast-util-gfm-footnote: 2.1.0 5310 + mdast-util-gfm-strikethrough: 2.0.0 5311 + mdast-util-gfm-table: 2.0.0 5312 + mdast-util-gfm-task-list-item: 2.0.0 5313 + mdast-util-to-markdown: 2.1.2 5314 + transitivePeerDependencies: 5315 + - supports-color 5316 + 5317 + mdast-util-phrasing@4.1.0: 5318 + dependencies: 5319 + '@types/mdast': 4.0.4 5320 + unist-util-is: 6.0.0 5321 + 5322 + mdast-util-to-hast@13.2.0: 5323 + dependencies: 5324 + '@types/hast': 3.0.4 5325 + '@types/mdast': 4.0.4 5326 + '@ungap/structured-clone': 1.3.0 5327 + devlop: 1.1.0 5328 + micromark-util-sanitize-uri: 2.0.1 5329 + trim-lines: 3.0.1 5330 + unist-util-position: 5.0.0 5331 + unist-util-visit: 5.0.0 5332 + vfile: 6.0.3 5333 + 5334 + mdast-util-to-markdown@2.1.2: 5335 + dependencies: 5336 + '@types/mdast': 4.0.4 5337 + '@types/unist': 3.0.3 5338 + longest-streak: 3.1.0 5339 + mdast-util-phrasing: 4.1.0 5340 + mdast-util-to-string: 4.0.0 5341 + micromark-util-classify-character: 2.0.1 5342 + micromark-util-decode-string: 2.0.1 5343 + unist-util-visit: 5.0.0 5344 + zwitch: 2.0.4 5345 + 5346 + mdast-util-to-string@4.0.0: 5347 + dependencies: 5348 + '@types/mdast': 4.0.4 5349 + 3146 5350 merge2@1.4.1: {} 3147 5351 5352 + microdiff@1.5.0: {} 5353 + 5354 + micromark-core-commonmark@2.0.3: 5355 + dependencies: 5356 + decode-named-character-reference: 1.2.0 5357 + devlop: 1.1.0 5358 + micromark-factory-destination: 2.0.1 5359 + micromark-factory-label: 2.0.1 5360 + micromark-factory-space: 2.0.1 5361 + micromark-factory-title: 2.0.1 5362 + micromark-factory-whitespace: 2.0.1 5363 + micromark-util-character: 2.1.1 5364 + micromark-util-chunked: 2.0.1 5365 + micromark-util-classify-character: 2.0.1 5366 + micromark-util-html-tag-name: 2.0.1 5367 + micromark-util-normalize-identifier: 2.0.1 5368 + micromark-util-resolve-all: 2.0.1 5369 + micromark-util-subtokenize: 2.1.0 5370 + micromark-util-symbol: 2.0.1 5371 + micromark-util-types: 2.0.2 5372 + 5373 + micromark-extension-gfm-autolink-literal@2.1.0: 5374 + dependencies: 5375 + micromark-util-character: 2.1.1 5376 + micromark-util-sanitize-uri: 2.0.1 5377 + micromark-util-symbol: 2.0.1 5378 + micromark-util-types: 2.0.2 5379 + 5380 + micromark-extension-gfm-footnote@2.1.0: 5381 + dependencies: 5382 + devlop: 1.1.0 5383 + micromark-core-commonmark: 2.0.3 5384 + micromark-factory-space: 2.0.1 5385 + micromark-util-character: 2.1.1 5386 + micromark-util-normalize-identifier: 2.0.1 5387 + micromark-util-sanitize-uri: 2.0.1 5388 + micromark-util-symbol: 2.0.1 5389 + micromark-util-types: 2.0.2 5390 + 5391 + micromark-extension-gfm-strikethrough@2.1.0: 5392 + dependencies: 5393 + devlop: 1.1.0 5394 + micromark-util-chunked: 2.0.1 5395 + micromark-util-classify-character: 2.0.1 5396 + micromark-util-resolve-all: 2.0.1 5397 + micromark-util-symbol: 2.0.1 5398 + micromark-util-types: 2.0.2 5399 + 5400 + micromark-extension-gfm-table@2.1.1: 5401 + dependencies: 5402 + devlop: 1.1.0 5403 + micromark-factory-space: 2.0.1 5404 + micromark-util-character: 2.1.1 5405 + micromark-util-symbol: 2.0.1 5406 + micromark-util-types: 2.0.2 5407 + 5408 + micromark-extension-gfm-tagfilter@2.0.0: 5409 + dependencies: 5410 + micromark-util-types: 2.0.2 5411 + 5412 + micromark-extension-gfm-task-list-item@2.1.0: 5413 + dependencies: 5414 + devlop: 1.1.0 5415 + micromark-factory-space: 2.0.1 5416 + micromark-util-character: 2.1.1 5417 + micromark-util-symbol: 2.0.1 5418 + micromark-util-types: 2.0.2 5419 + 5420 + micromark-extension-gfm@3.0.0: 5421 + dependencies: 5422 + micromark-extension-gfm-autolink-literal: 2.1.0 5423 + micromark-extension-gfm-footnote: 2.1.0 5424 + micromark-extension-gfm-strikethrough: 2.1.0 5425 + micromark-extension-gfm-table: 2.1.1 5426 + micromark-extension-gfm-tagfilter: 2.0.0 5427 + micromark-extension-gfm-task-list-item: 2.1.0 5428 + micromark-util-combine-extensions: 2.0.1 5429 + micromark-util-types: 2.0.2 5430 + 5431 + micromark-factory-destination@2.0.1: 5432 + dependencies: 5433 + micromark-util-character: 2.1.1 5434 + micromark-util-symbol: 2.0.1 5435 + micromark-util-types: 2.0.2 5436 + 5437 + micromark-factory-label@2.0.1: 5438 + dependencies: 5439 + devlop: 1.1.0 5440 + micromark-util-character: 2.1.1 5441 + micromark-util-symbol: 2.0.1 5442 + micromark-util-types: 2.0.2 5443 + 5444 + micromark-factory-space@2.0.1: 5445 + dependencies: 5446 + micromark-util-character: 2.1.1 5447 + micromark-util-types: 2.0.2 5448 + 5449 + micromark-factory-title@2.0.1: 5450 + dependencies: 5451 + micromark-factory-space: 2.0.1 5452 + micromark-util-character: 2.1.1 5453 + micromark-util-symbol: 2.0.1 5454 + micromark-util-types: 2.0.2 5455 + 5456 + micromark-factory-whitespace@2.0.1: 5457 + dependencies: 5458 + micromark-factory-space: 2.0.1 5459 + micromark-util-character: 2.1.1 5460 + micromark-util-symbol: 2.0.1 5461 + micromark-util-types: 2.0.2 5462 + 5463 + micromark-util-character@2.1.1: 5464 + dependencies: 5465 + micromark-util-symbol: 2.0.1 5466 + micromark-util-types: 2.0.2 5467 + 5468 + micromark-util-chunked@2.0.1: 5469 + dependencies: 5470 + micromark-util-symbol: 2.0.1 5471 + 5472 + micromark-util-classify-character@2.0.1: 5473 + dependencies: 5474 + micromark-util-character: 2.1.1 5475 + micromark-util-symbol: 2.0.1 5476 + micromark-util-types: 2.0.2 5477 + 5478 + micromark-util-combine-extensions@2.0.1: 5479 + dependencies: 5480 + micromark-util-chunked: 2.0.1 5481 + micromark-util-types: 2.0.2 5482 + 5483 + micromark-util-decode-numeric-character-reference@2.0.2: 5484 + dependencies: 5485 + micromark-util-symbol: 2.0.1 5486 + 5487 + micromark-util-decode-string@2.0.1: 5488 + dependencies: 5489 + decode-named-character-reference: 1.2.0 5490 + micromark-util-character: 2.1.1 5491 + micromark-util-decode-numeric-character-reference: 2.0.2 5492 + micromark-util-symbol: 2.0.1 5493 + 5494 + micromark-util-encode@2.0.1: {} 5495 + 5496 + micromark-util-html-tag-name@2.0.1: {} 5497 + 5498 + micromark-util-normalize-identifier@2.0.1: 5499 + dependencies: 5500 + micromark-util-symbol: 2.0.1 5501 + 5502 + micromark-util-resolve-all@2.0.1: 5503 + dependencies: 5504 + micromark-util-types: 2.0.2 5505 + 5506 + micromark-util-sanitize-uri@2.0.1: 5507 + dependencies: 5508 + micromark-util-character: 2.1.1 5509 + micromark-util-encode: 2.0.1 5510 + micromark-util-symbol: 2.0.1 5511 + 5512 + micromark-util-subtokenize@2.1.0: 5513 + dependencies: 5514 + devlop: 1.1.0 5515 + micromark-util-chunked: 2.0.1 5516 + micromark-util-symbol: 2.0.1 5517 + micromark-util-types: 2.0.2 5518 + 5519 + micromark-util-symbol@2.0.1: {} 5520 + 5521 + micromark-util-types@2.0.2: {} 5522 + 5523 + micromark@4.0.2: 5524 + dependencies: 5525 + '@types/debug': 4.1.12 5526 + debug: 4.4.1 5527 + decode-named-character-reference: 1.2.0 5528 + devlop: 1.1.0 5529 + micromark-core-commonmark: 2.0.3 5530 + micromark-factory-space: 2.0.1 5531 + micromark-util-character: 2.1.1 5532 + micromark-util-chunked: 2.0.1 5533 + micromark-util-combine-extensions: 2.0.1 5534 + micromark-util-decode-numeric-character-reference: 2.0.2 5535 + micromark-util-encode: 2.0.1 5536 + micromark-util-normalize-identifier: 2.0.1 5537 + micromark-util-resolve-all: 2.0.1 5538 + micromark-util-sanitize-uri: 2.0.1 5539 + micromark-util-subtokenize: 2.1.0 5540 + micromark-util-symbol: 2.0.1 5541 + micromark-util-types: 2.0.2 5542 + transitivePeerDependencies: 5543 + - supports-color 5544 + 3148 5545 micromatch@4.0.8: 3149 5546 dependencies: 3150 5547 braces: 3.0.3 ··· 3161 5558 minimist@1.2.8: {} 3162 5559 3163 5560 ms@2.1.3: {} 5561 + 5562 + nanoid@3.3.11: {} 5563 + 5564 + nanoid@5.1.5: {} 3164 5565 3165 5566 natural-compare@1.4.0: {} 3166 5567 5568 + no-case@3.0.4: 5569 + dependencies: 5570 + lower-case: 2.0.2 5571 + tslib: 2.8.1 5572 + 3167 5573 node-domexception@1.0.0: {} 3168 5574 3169 5575 node-fetch@3.3.2: ··· 3175 5581 object-inspect@1.13.4: {} 3176 5582 3177 5583 object-keys@1.1.1: {} 5584 + 5585 + object-to-xml@2.0.0: 5586 + dependencies: 5587 + dank-each: 1.0.0 5588 + dank-map: 0.1.0 5589 + sanitizer: 0.1.3 3178 5590 3179 5591 object.assign@4.1.7: 3180 5592 dependencies: ··· 3232 5644 dependencies: 3233 5645 p-limit: 3.1.0 3234 5646 5647 + param-case@3.0.4: 5648 + dependencies: 5649 + dot-case: 3.0.4 5650 + tslib: 2.8.1 5651 + 3235 5652 parent-module@1.0.1: 3236 5653 dependencies: 3237 5654 callsites: 3.1.0 3238 5655 3239 - partysocket@1.1.4: 5656 + parse5@7.3.0: 5657 + dependencies: 5658 + entities: 6.0.1 5659 + 5660 + partysocket@1.1.5: 3240 5661 dependencies: 3241 5662 event-target-polyfill: 0.0.4 3242 5663 5664 + pascal-case@3.1.2: 5665 + dependencies: 5666 + no-case: 3.0.4 5667 + tslib: 2.8.1 5668 + 3243 5669 path-exists@4.0.0: {} 3244 5670 3245 5671 path-key@3.1.1: {} 3246 5672 3247 5673 path-parse@1.0.7: {} 3248 5674 5675 + pathe@2.0.3: {} 5676 + 5677 + pathval@2.0.1: {} 5678 + 3249 5679 picocolors@1.1.1: {} 3250 5680 3251 5681 picomatch@2.3.1: {} 3252 5682 5683 + picomatch@4.0.3: {} 5684 + 3253 5685 possible-typed-array-names@1.1.0: {} 3254 5686 5687 + postcss@8.5.6: 5688 + dependencies: 5689 + nanoid: 3.3.11 5690 + picocolors: 1.1.1 5691 + source-map-js: 1.2.1 5692 + 3255 5693 prelude-ls@1.2.1: {} 3256 5694 3257 5695 prettier-linter-helpers@1.0.0: ··· 3260 5698 3261 5699 prettier@3.6.2: {} 3262 5700 5701 + pretty-bytes@6.1.1: {} 5702 + 3263 5703 promise-limit@2.7.0: {} 3264 5704 5705 + property-information@6.5.0: {} 5706 + 5707 + property-information@7.1.0: {} 5708 + 3265 5709 punycode@2.3.1: {} 3266 5710 3267 5711 queue-microtask@1.2.3: {} 3268 5712 5713 + radix-vue@1.9.17(vue@3.5.19(typescript@5.9.2)): 5714 + dependencies: 5715 + '@floating-ui/dom': 1.7.4 5716 + '@floating-ui/vue': 1.1.9(vue@3.5.19(typescript@5.9.2)) 5717 + '@internationalized/date': 3.8.2 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)) 5722 + aria-hidden: 1.2.6 5723 + defu: 6.1.4 5724 + fast-deep-equal: 3.1.3 5725 + nanoid: 5.1.5 5726 + vue: 3.5.19(typescript@5.9.2) 5727 + transitivePeerDependencies: 5728 + - '@vue/composition-api' 5729 + 3269 5730 readable-stream@3.6.2: 3270 5731 dependencies: 3271 5732 inherits: 2.0.4 ··· 3292 5753 gopd: 1.2.0 3293 5754 set-function-name: 2.0.2 3294 5755 5756 + rehype-external-links@3.0.0: 5757 + dependencies: 5758 + '@types/hast': 3.0.4 5759 + '@ungap/structured-clone': 1.3.0 5760 + hast-util-is-element: 3.0.0 5761 + is-absolute-url: 4.0.1 5762 + space-separated-tokens: 2.0.2 5763 + unist-util-visit: 5.0.0 5764 + 5765 + rehype-format@5.0.1: 5766 + dependencies: 5767 + '@types/hast': 3.0.4 5768 + hast-util-format: 1.1.0 5769 + 5770 + rehype-minify-whitespace@6.0.2: 5771 + dependencies: 5772 + '@types/hast': 3.0.4 5773 + hast-util-minify-whitespace: 1.0.1 5774 + 5775 + rehype-parse@9.0.1: 5776 + dependencies: 5777 + '@types/hast': 3.0.4 5778 + hast-util-from-html: 2.0.3 5779 + unified: 11.0.5 5780 + 5781 + rehype-raw@7.0.0: 5782 + dependencies: 5783 + '@types/hast': 3.0.4 5784 + hast-util-raw: 9.1.0 5785 + vfile: 6.0.3 5786 + 5787 + rehype-remark@10.0.1: 5788 + dependencies: 5789 + '@types/hast': 3.0.4 5790 + '@types/mdast': 4.0.4 5791 + hast-util-to-mdast: 10.1.2 5792 + unified: 11.0.5 5793 + vfile: 6.0.3 5794 + 5795 + rehype-sanitize@6.0.0: 5796 + dependencies: 5797 + '@types/hast': 3.0.4 5798 + hast-util-sanitize: 5.0.2 5799 + 5800 + rehype-stringify@10.0.1: 5801 + dependencies: 5802 + '@types/hast': 3.0.4 5803 + hast-util-to-html: 9.0.5 5804 + unified: 11.0.5 5805 + 5806 + relateurl@0.2.7: {} 5807 + 5808 + remark-gfm@4.0.1: 5809 + dependencies: 5810 + '@types/mdast': 4.0.4 5811 + mdast-util-gfm: 3.1.0 5812 + micromark-extension-gfm: 3.0.0 5813 + remark-parse: 11.0.0 5814 + remark-stringify: 11.0.0 5815 + unified: 11.0.5 5816 + transitivePeerDependencies: 5817 + - supports-color 5818 + 5819 + remark-parse@11.0.0: 5820 + dependencies: 5821 + '@types/mdast': 4.0.4 5822 + mdast-util-from-markdown: 2.0.2 5823 + micromark-util-types: 2.0.2 5824 + unified: 11.0.5 5825 + transitivePeerDependencies: 5826 + - supports-color 5827 + 5828 + remark-rehype@11.1.2: 5829 + dependencies: 5830 + '@types/hast': 3.0.4 5831 + '@types/mdast': 4.0.4 5832 + mdast-util-to-hast: 13.2.0 5833 + unified: 11.0.5 5834 + vfile: 6.0.3 5835 + 5836 + remark-stringify@11.0.0: 5837 + dependencies: 5838 + '@types/mdast': 4.0.4 5839 + mdast-util-to-markdown: 2.1.2 5840 + unified: 11.0.5 5841 + 5842 + require-from-string@2.0.2: {} 5843 + 3295 5844 resolve-from@4.0.0: {} 3296 5845 3297 5846 resolve-pkg-maps@1.0.0: {} ··· 3304 5853 3305 5854 reusify@1.1.0: {} 3306 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 + 3307 5883 run-parallel@1.2.0: 3308 5884 dependencies: 3309 5885 queue-microtask: 1.2.3 ··· 3330 5906 is-regex: 1.2.1 3331 5907 3332 5908 safe-stable-stringify@2.5.0: {} 5909 + 5910 + sanitizer@0.1.3: {} 3333 5911 3334 5912 semver@6.3.1: {} 3335 5913 ··· 3391 5969 side-channel-map: 1.0.1 3392 5970 side-channel-weakmap: 1.0.2 3393 5971 5972 + siginfo@2.0.0: {} 5973 + 3394 5974 simple-swizzle@0.2.2: 3395 5975 dependencies: 3396 5976 is-arrayish: 0.3.2 5977 + 5978 + source-map-js@1.2.1: {} 3397 5979 3398 5980 source-map-support@0.5.21: 3399 5981 dependencies: ··· 3402 5984 3403 5985 source-map@0.6.1: {} 3404 5986 5987 + space-separated-tokens@2.0.2: {} 5988 + 3405 5989 stack-trace@0.0.10: {} 5990 + 5991 + stackback@0.0.2: {} 5992 + 5993 + std-env@3.9.0: {} 3406 5994 3407 5995 stop-iteration-iterator@1.1.0: 3408 5996 dependencies: ··· 3436 6024 dependencies: 3437 6025 safe-buffer: 5.2.1 3438 6026 6027 + stringify-entities@4.0.4: 6028 + dependencies: 6029 + character-entities-html4: 2.1.0 6030 + character-entities-legacy: 3.0.0 6031 + 6032 + stringify-object@5.0.0: 6033 + dependencies: 6034 + get-own-enumerable-keys: 1.0.0 6035 + is-obj: 3.0.0 6036 + is-regexp: 3.1.0 6037 + 3439 6038 strip-bom@3.0.0: {} 3440 6039 3441 6040 strip-json-comments@3.1.1: {} 3442 6041 6042 + strip-literal@3.0.0: 6043 + dependencies: 6044 + js-tokens: 9.0.1 6045 + 3443 6046 supports-color@7.2.0: 3444 6047 dependencies: 3445 6048 has-flag: 4.0.0 3446 6049 3447 6050 supports-preserve-symlinks-flag@1.0.0: {} 3448 6051 3449 - synckit@0.11.8: 6052 + synckit@0.11.11: 6053 + dependencies: 6054 + '@pkgr/core': 0.2.9 6055 + 6056 + tailwind-merge@2.6.0: {} 6057 + 6058 + terser@5.43.1: 3450 6059 dependencies: 3451 - '@pkgr/core': 0.2.7 6060 + '@jridgewell/source-map': 0.3.11 6061 + acorn: 8.15.0 6062 + commander: 2.20.3 6063 + source-map-support: 0.5.21 3452 6064 3453 6065 text-hex@1.0.0: {} 3454 6066 6067 + tiny-emitter@2.1.0: {} 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 + 3455 6084 to-regex-range@5.0.1: 3456 6085 dependencies: 3457 6086 is-number: 7.0.0 3458 6087 3459 6088 toml@3.0.0: {} 3460 6089 6090 + trim-lines@3.0.1: {} 6091 + 6092 + trim-trailing-lines@2.1.0: {} 6093 + 3461 6094 triple-beam@1.4.1: {} 3462 6095 3463 - ts-api-utils@2.1.0(typescript@5.8.3): 6096 + trough@2.2.0: {} 6097 + 6098 + ts-api-utils@2.1.0(typescript@5.9.2): 3464 6099 dependencies: 3465 - typescript: 5.8.3 6100 + typescript: 5.9.2 6101 + 6102 + ts-deepmerge@7.0.3: {} 3466 6103 3467 6104 tsconfig-paths@3.15.0: 3468 6105 dependencies: ··· 3471 6108 minimist: 1.2.8 3472 6109 strip-bom: 3.0.0 3473 6110 3474 - tsx@4.20.3: 6111 + tslib@2.8.1: {} 6112 + 6113 + tsx@4.20.4: 3475 6114 dependencies: 3476 - esbuild: 0.25.5 6115 + esbuild: 0.25.9 3477 6116 get-tsconfig: 4.10.1 3478 6117 optionalDependencies: 3479 6118 fsevents: 2.3.3 ··· 3481 6120 type-check@0.4.0: 3482 6121 dependencies: 3483 6122 prelude-ls: 1.2.1 6123 + 6124 + type-fest@4.41.0: {} 3484 6125 3485 6126 typed-array-buffer@1.0.3: 3486 6127 dependencies: ··· 3515 6156 possible-typed-array-names: 1.1.0 3516 6157 reflect.getprototypeof: 1.0.10 3517 6158 3518 - typescript-eslint@8.35.1(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): 3519 6160 dependencies: 3520 - '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3521 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3522 - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) 3523 - eslint: 9.30.1(jiti@2.4.2) 3524 - typescript: 5.8.3 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 3525 6167 transitivePeerDependencies: 3526 6168 - supports-color 3527 6169 3528 - typescript@5.8.3: {} 6170 + typescript@5.9.2: {} 3529 6171 3530 6172 unbox-primitive@1.1.0: 3531 6173 dependencies: ··· 3534 6176 has-symbols: 1.1.0 3535 6177 which-boxed-primitive: 1.1.1 3536 6178 3537 - undici-types@7.8.0: {} 6179 + undici-types@6.21.0: {} 6180 + 6181 + undici-types@7.10.0: {} 6182 + 6183 + unified@11.0.5: 6184 + dependencies: 6185 + '@types/unist': 3.0.3 6186 + bail: 2.0.2 6187 + devlop: 1.1.0 6188 + extend: 3.0.2 6189 + is-plain-obj: 4.1.0 6190 + trough: 2.2.0 6191 + vfile: 6.0.3 6192 + 6193 + unist-util-find-after@5.0.0: 6194 + dependencies: 6195 + '@types/unist': 3.0.3 6196 + unist-util-is: 6.0.0 6197 + 6198 + unist-util-is@6.0.0: 6199 + dependencies: 6200 + '@types/unist': 3.0.3 6201 + 6202 + unist-util-position@5.0.0: 6203 + dependencies: 6204 + '@types/unist': 3.0.3 6205 + 6206 + unist-util-stringify-position@4.0.0: 6207 + dependencies: 6208 + '@types/unist': 3.0.3 6209 + 6210 + unist-util-visit-parents@6.0.1: 6211 + dependencies: 6212 + '@types/unist': 3.0.3 6213 + unist-util-is: 6.0.0 6214 + 6215 + unist-util-visit@5.0.0: 6216 + dependencies: 6217 + '@types/unist': 3.0.3 6218 + unist-util-is: 6.0.0 6219 + unist-util-visit-parents: 6.0.1 3538 6220 3539 6221 uri-js@4.4.1: 3540 6222 dependencies: ··· 3542 6224 3543 6225 util-deprecate@1.0.2: {} 3544 6226 6227 + uuid@9.0.1: {} 6228 + 6229 + vfile-location@5.0.3: 6230 + dependencies: 6231 + '@types/unist': 3.0.3 6232 + vfile: 6.0.3 6233 + 6234 + vfile-message@4.0.3: 6235 + dependencies: 6236 + '@types/unist': 3.0.3 6237 + unist-util-stringify-position: 4.0.0 6238 + 6239 + vfile@6.0.3: 6240 + dependencies: 6241 + '@types/unist': 3.0.3 6242 + vfile-message: 4.0.3 6243 + 6244 + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0): 6245 + dependencies: 6246 + cac: 6.7.14 6247 + debug: 4.4.1 6248 + es-module-lexer: 1.7.0 6249 + pathe: 2.0.3 6250 + vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0) 6251 + transitivePeerDependencies: 6252 + - '@types/node' 6253 + - jiti 6254 + - less 6255 + - lightningcss 6256 + - sass 6257 + - sass-embedded 6258 + - stylus 6259 + - sugarss 6260 + - supports-color 6261 + - terser 6262 + - tsx 6263 + - yaml 6264 + 6265 + vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0): 6266 + dependencies: 6267 + esbuild: 0.25.9 6268 + fdir: 6.5.0(picomatch@4.0.3) 6269 + picomatch: 4.0.3 6270 + postcss: 8.5.6 6271 + rollup: 4.50.0 6272 + tinyglobby: 0.2.15 6273 + optionalDependencies: 6274 + '@types/node': 24.3.0 6275 + fsevents: 2.3.3 6276 + jiti: 2.5.1 6277 + terser: 5.43.1 6278 + tsx: 4.20.4 6279 + yaml: 2.8.0 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) 6328 + 6329 + vue-sonner@1.3.2: {} 6330 + 6331 + vue@3.5.19(typescript@5.9.2): 6332 + dependencies: 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 6338 + optionalDependencies: 6339 + typescript: 5.9.2 6340 + 6341 + web-namespaces@2.0.1: {} 6342 + 3545 6343 web-streams-polyfill@3.3.3: {} 3546 6344 3547 6345 which-boxed-primitive@1.1.1: ··· 3589 6387 dependencies: 3590 6388 isexe: 2.0.0 3591 6389 6390 + why-is-node-running@2.3.0: 6391 + dependencies: 6392 + siginfo: 2.0.0 6393 + stackback: 0.0.2 6394 + 3592 6395 winston-transport@4.9.0: 3593 6396 dependencies: 3594 6397 logform: 2.7.0 ··· 3615 6418 3616 6419 xxhash-wasm@1.1.0: {} 3617 6420 6421 + yaml@2.8.0: {} 6422 + 3618 6423 yocto-queue@0.1.0: {} 6424 + 6425 + zod@3.24.1: {} 6426 + 6427 + zwitch@2.0.4: {}
+1
backend/pnpm-workspace.yaml
··· 1 1 onlyBuiltDependencies: 2 2 - esbuild 3 + - vue-demi
+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(
+13 -8
backend/src/main.ts
··· 6 6 7 7 import { serve, type ServerType } from "@hono/node-server"; 8 8 import { Config } from "./config.js"; 9 - import { readFromFirehose, startFirehose, stopFirehose } from "./network/jetstream.js"; 9 + import { 10 + readFromFirehose, 11 + startFirehose, 12 + stopFirehose, 13 + } from "./network/jetstream.js"; 10 14 import app from "./server.js"; 11 15 import { Database } from "./db/database.js"; 12 16 import Logger from "./logger.js"; 13 17 14 18 async function main() { 15 19 const logger = Logger; 16 - logger.info("Clippr-BE starting..."); 20 + logger.info(`Clippr-BE v${process.env.npm_package_version} starting...`); 17 21 18 - logger.verbose("Reading configuration..."); 19 - const config = Config.getInstance(); 22 + // Config is already loaded into the app (when preparing logger) 23 + const config = Config.getInstance().getConfig(); 20 24 21 25 logger.verbose("Initializing database..."); 22 26 Database.getInstance(); ··· 25 29 startFirehose(); 26 30 readFromFirehose(); 27 31 32 + logger.verbose("Starting XRPC server..."); 28 33 const server: ServerType = serve({ 29 - port: config.get("port"), 30 - hostname: config.get("hostname"), 34 + port: config.port, 35 + hostname: config.hostname, 31 36 fetch: app.fetch, 32 37 }); 33 38 34 39 logger.info( 35 - `XRPC server launched at http://${config.get("hostname")}:${config.get("port")}`, 40 + `XRPC server launched at http://${config.hostname}:${config.port}`, 36 41 ); 37 42 38 43 process.removeAllListeners("SIGINT"); ··· 43 48 44 49 function gracefulShutdown(signal: string) { 45 50 logger.info(`Received ${signal}, shutting down...`); 46 - stopFirehose(); 47 51 server.close(); 52 + stopFirehose(); 48 53 logger.info("Bye!"); 49 54 process.exit(0); 50 55 }
+142 -44
backend/src/network/commit.ts
··· 8 8 import { Database } from "../db/database.js"; 9 9 import { clipsTable, tagsTable, usersTable } from "../db/schema.js"; 10 10 import { is } from "@atcute/lexicons"; 11 - import { SocialClipprActorProfile, SocialClipprFeedClip, SocialClipprFeedTag } from "@clipprjs/lexicons"; 12 - import type { At } from "@atcute/client/lexicons"; 11 + import { 12 + SocialClipprActorProfile, 13 + SocialClipprFeedClip, 14 + SocialClipprFeedTag, 15 + } from "@clipprjs/lexicons"; 13 16 import Logger from "../logger.js"; 14 17 import { isBlob } from "@atcute/lexicons/interfaces"; 15 18 import { validateClip, validateProfile, validateTag } from "./validator.js"; 16 - import xxhash from "xxhash-wasm"; 19 + import { convertDidToString } from "./converters.js"; 20 + import { hashString } from "../hasher.js"; 21 + import { and, eq } from "drizzle-orm"; 22 + import type { TagRef } from "../api/types.js"; 17 23 18 24 const db = Database.getInstance().getDb(); 19 25 20 - /// Converts an ``At.DID`` type to a proper string, for type reasons. 21 - function convertDidToString(did: At.DID): string { 22 - return did.toString(); 23 - } 24 - 25 26 /// Converts a microsecond Unix date to a Date object, for type reasons. 26 27 function convertMicroToDate(micro: number): Date { 27 28 return new Date(micro / 1000); ··· 30 31 export async function handleClip( 31 32 event: CommitEvent<`social.clippr.${string}`>, 32 33 ): Promise<void> { 33 - if (event.commit.operation !== "create") { 34 - Logger.warn( 35 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 36 - ); 34 + if (event.commit.operation === "delete") { 35 + await db 36 + .delete(clipsTable) 37 + .where( 38 + and( 39 + eq(clipsTable.did, event.did), 40 + eq(clipsTable.recordKey, event.commit.rkey), 41 + ), 42 + ); 43 + Logger.verbose(`Deleted clip: ${event.did}/${event.commit.rkey}`, event); 37 44 return; 38 - } // We currently do not handle these. 45 + } 39 46 40 47 if (event.commit.record.$type !== "social.clippr.feed.clip") { 41 48 Logger.verbose( 42 - "Invalid type for incoming clip record", 49 + `Mismatched type for incoming clip record (${event.did}/${event.commit.rkey})`, 43 50 event.commit.record, 44 51 ); 45 52 } 46 53 47 54 if (!is(SocialClipprFeedClip.mainSchema, event.commit.record)) { 48 55 Logger.verbose( 49 - "Invalid schema for incoming clip record", 56 + `Invalid schema for incoming clip record (${event.did}/${event.commit.rkey})`, 50 57 event.commit.record, 51 58 ); 52 59 return; ··· 66 73 }; 67 74 68 75 // xxh64, NOT xxh3 learned that the hard way 69 - const { h64 } = await xxhash(); 70 - const urlHash = h64(record.url).toString(16); 76 + const urlHash: string = await hashString(record.url); 71 77 72 78 if (urlHash !== event.commit.rkey) { 73 79 Logger.verbose( 74 - `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})`, 75 81 event.commit.record, 76 82 ); 77 83 return; 78 84 } 79 85 80 - 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); 81 114 return; 82 115 } 83 116 84 117 await db.insert(clipsTable).values({ 85 118 // @ts-expect-error Weird type error despite being a normal string. 86 119 did: convertDidToString(event.did), 120 + cid: event.commit.cid, 87 121 timestamp: convertMicroToDate(event.time_us), 88 122 recordKey: event.commit.rkey, 89 123 createdAt: new Date(record.createdAt), 124 + indexedAt: new Date(), 90 125 url: record.url, 91 126 title: record.title, 92 127 description: record.description, ··· 97 132 languages: record.languages, 98 133 }); 99 134 100 - Logger.verbose("Indexed new clip:", event.did, event.commit.rkey); 135 + Logger.verbose(`Indexed new clip: ${event.did}/${event.commit.rkey}`, event); 101 136 } 102 137 103 138 export async function handleTag( 104 139 event: CommitEvent<`social.clippr.${string}`>, 105 140 ): Promise<void> { 106 - if (event.commit.operation !== "create") { 107 - Logger.warn( 108 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 109 - ); 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); 110 151 return; 111 - } // We currently do not handle these. 152 + } 112 153 113 154 if (event.commit.record.$type !== "social.clippr.feed.tag") { 114 - 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 + ); 115 159 return; 116 160 } 117 161 118 162 if (!is(SocialClipprFeedTag.mainSchema, event.commit.record)) { 119 163 Logger.verbose( 120 - "Invalid schema for incoming tag record", 164 + `Invalid schema for incoming tag record (${event.did}/${event.commit.rkey})`, 121 165 event.commit.record, 122 166 ); 123 167 return; ··· 128 172 createdAt: event.commit.record.createdAt, 129 173 name: event.commit.record.name, 130 174 color: event.commit.record.color, 175 + description: event.commit.record.description, 131 176 }; 132 177 133 178 if (record.name !== event.commit.rkey) { 134 179 Logger.verbose( 135 - "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})`, 136 181 event.commit.record, 137 182 ); 138 183 return; ··· 143 188 return; 144 189 } 145 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 + 146 215 await db.insert(tagsTable).values({ 147 - did: convertDidToString(event.did), 148 216 timestamp: convertMicroToDate(event.time_us), 217 + did: convertDidToString(event.did), 218 + cid: event.commit.cid, 149 219 recordKey: event.commit.rkey, 150 - createdAt: new Date(record.createdAt), 151 220 name: record.name, 221 + description: record.description, 152 222 color: record.color, 223 + createdAt: new Date(record.createdAt), 224 + indexedAt: new Date(), 153 225 }); 154 226 155 - Logger.verbose("Indexed new tag:", event.did, event.commit.rkey); 227 + Logger.verbose(`Indexed new tag: ${event.did}/${event.commit.rkey}`, event); 156 228 } 157 229 158 230 export async function handleProfile( 159 231 event: CommitEvent<`social.clippr.${string}`>, 160 232 ): Promise<void> { 161 - if (event.commit.operation !== "create") { 162 - Logger.warn( 163 - `Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`, 164 - ); 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); 165 236 return; 166 - } // We currently do not handle these. 237 + } 167 238 168 239 if (event.commit.record.$type !== "social.clippr.actor.profile") { 169 240 Logger.verbose( 170 - "Invalid type for incoming profile record", 241 + `Mismatched type for incoming profile record (${event.did})`, 171 242 event.commit.record, 172 243 ); 173 244 return; ··· 175 246 176 247 if (!is(SocialClipprActorProfile.mainSchema, event.commit.record)) { 177 248 Logger.verbose( 178 - "Invalid schema for incoming profile record", 249 + `Invalid schema for incoming profile record (${event.did})`, 179 250 event.commit.record, 180 251 ); 181 252 return; ··· 191 262 192 263 if (event.commit.rkey !== "self") { 193 264 Logger.verbose( 194 - "Record key of incoming profile record does not match 'self'", 265 + `Record key of incoming profile record does not match 'self' (${event.did})`, 195 266 event.commit.record, 196 267 ); 197 268 return; ··· 200 271 // This needs to be here so the avatar can be recognized as a proper blob. 201 272 if (record.avatar) { 202 273 if (!isBlob(record.avatar)) { 203 - 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 + ); 204 278 return; 205 279 } 206 280 207 281 if (record.avatar.mimeType.match(/^image\/(png|jpeg)$/i) === null) { 208 282 Logger.verbose( 209 - "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})`, 210 284 record, 211 285 ); 212 286 return; ··· 214 288 215 289 if (record.avatar.ref?.$link === undefined) { 216 290 Logger.verbose( 217 - "Avatar in incoming profile record has no link to blob", 291 + `Avatar in incoming profile record has no link to blob (${event.did})`, 218 292 record, 219 293 ); 220 294 return; 221 295 } 222 296 223 297 if (record.avatar.size > 1000000) { 224 - 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 + ); 225 302 return; 226 303 } 227 304 } ··· 231 308 return; 232 309 } 233 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 + 234 328 await db.insert(usersTable).values({ 235 329 did: convertDidToString(event.did), 330 + cid: event.commit.cid, 236 331 timestamp: convertMicroToDate(event.time_us), 237 332 createdAt: new Date(record.createdAt), 238 333 displayName: record.displayName, ··· 240 335 description: record.description, 241 336 }); 242 337 243 - Logger.verbose("Indexed new profile for:", convertDidToString(event.did)); 338 + Logger.verbose( 339 + `Indexed new profile: ${convertDidToString(event.did)}`, 340 + event, 341 + ); 244 342 }
+85
backend/src/network/converters.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { Client, simpleFetchHandler } from "@atcute/client"; 8 + import { getDidDocument } from "../api/did.js"; 9 + 10 + /// Converts an ``At.DID`` type to a proper string, for type reasons. 11 + export function convertDidToString(did: `did:${string}`): string { 12 + return did.toString(); 13 + } 14 + 15 + export function convertStringToTypedDid(did: string) { 16 + if (did.startsWith("did:plc:")) { 17 + return did as `did:plc:${string}`; 18 + } else if (did.startsWith("did:web:")) { 19 + return did as `did:web:${string}`; 20 + } else { 21 + return did as `did:plc:${string}`; 22 + } 23 + } 24 + 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! 28 + export async function getHandleFromDid(did: string): Promise<string> { 29 + const doc = await getDidDocument(convertStringToTypedDid(did)); 30 + 31 + if (!doc?.alsoKnownAs) { 32 + throw new Error("No handles found"); 33 + } 34 + 35 + if (doc?.alsoKnownAs[0] === undefined) { 36 + throw new Error("No handles found"); 37 + } 38 + 39 + return doc?.alsoKnownAs[0].substring( 40 + doc?.alsoKnownAs[0].lastIndexOf("/" + 1), 41 + ); 42 + } 43 + 44 + // Get a user's DID from their handle. 45 + export async function getDidFromHandle(handle: string): Promise<string> { 46 + const handler = simpleFetchHandler({ 47 + service: "https://public.api.bsky.app", 48 + }); 49 + const rpc = new Client({ handler }); 50 + 51 + const { ok, data } = await rpc.get("com.atproto.identity.resolveHandle", { 52 + params: { 53 + handle: handle as `${string}.${string}`, 54 + }, 55 + }); 56 + 57 + if (!ok) { 58 + switch (data.error) { 59 + case "InvalidRequest": { 60 + throw new Error("InvalidRequest", { cause: data.message }); 61 + } 62 + case "AccountTakedown": { 63 + throw new Error("AccountTakedown", { cause: data.message }); 64 + } 65 + case "AccountDeactivated": { 66 + throw new Error("AccountDeactivated", { cause: data.message }); 67 + } 68 + default: { 69 + throw new Error(data.error, { cause: data.message }); 70 + } 71 + } 72 + } 73 + 74 + let actorDid; 75 + 76 + if (ok) { 77 + actorDid = data.did as string; 78 + } 79 + 80 + if (actorDid === undefined) { 81 + throw new Error("InvalidRequest"); 82 + } 83 + 84 + return actorDid; 85 + }
+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`,
+64 -7
backend/src/network/validator.ts
··· 4 4 * SPDX-License-Identifier: AGPL-3.0-only 5 5 */ 6 6 7 - import {SocialClipprActorProfile, SocialClipprFeedClip, SocialClipprFeedTag,} from "@clipprjs/lexicons"; 8 - import {isDatetime, isLanguageCode} from "@atcute/lexicons/syntax"; 7 + import { 8 + SocialClipprActorProfile, 9 + SocialClipprFeedClip, 10 + SocialClipprFeedTag, 11 + } from "@clipprjs/lexicons"; 12 + import { 13 + isDatetime, 14 + isGenericUri, 15 + isLanguageCode, 16 + } from "@atcute/lexicons/syntax"; 9 17 import Logger from "../logger.js"; 18 + import { ComAtprotoRepoStrongRef } from "@atcute/atproto"; 19 + import { is } from "@atcute/lexicons"; 10 20 11 21 export async function validateProfile( 12 22 record: SocialClipprActorProfile.Main, ··· 27 37 ); 28 38 return false; 29 39 } 40 + 41 + if (record.displayName.length < 1) { 42 + Logger.verbose( 43 + "Too short displayName from incoming profile record", 44 + record, 45 + ); 46 + return false; 47 + } 30 48 } else { 31 49 Logger.verbose("No displayName from incoming profile record", record); 32 50 return false; ··· 40 58 ); 41 59 return false; 42 60 } 61 + 62 + if (record.description.length < 1) { 63 + Logger.verbose( 64 + "Too short description from incoming profile record", 65 + record, 66 + ); 67 + return false; 68 + } 43 69 } 44 70 45 71 return true; ··· 57 83 } 58 84 59 85 if (record.name.length > 64) { 60 - Logger.verbose("Invalid name length for incoming tag record", record); 86 + Logger.verbose("Name from incoming tag record is too long", record); 61 87 return false; 62 88 } 63 89 64 90 if (record.color) { 65 91 if (record.color.length > 7) { 66 - Logger.verbose("Invalid color length for incoming tag record", record); 92 + Logger.verbose("Color from incoming tag record is too long", record); 67 93 return false; 68 94 } 69 95 ··· 76 102 } 77 103 } 78 104 105 + if (record.description) { 106 + if (record.description.length > 500) { 107 + Logger.verbose( 108 + "Description from incoming tag record is too long", 109 + record, 110 + ); 111 + return false; 112 + } 113 + } 114 + 79 115 return true; 80 116 } 81 117 82 118 export async function validateClip( 83 119 record: SocialClipprFeedClip.Main, 84 120 ): Promise<boolean> { 121 + if (!isGenericUri(record.url)) { 122 + Logger.verbose("Invalid url from incoming clip record", record); 123 + return false; 124 + } 125 + 85 126 if (record.url.length > 2000) { 86 127 Logger.verbose("Too long url from incoming clip record", record); 87 128 return false; ··· 105 146 } 106 147 107 148 if (record.tags) { 108 - if (record.tags.some((tag) => tag.$type !== "com.atproto.repo.strongRef")) { 149 + if ( 150 + record.tags.some((tag) => { 151 + return tag.$type !== "com.atproto.repo.strongRef"; 152 + }) 153 + ) { 154 + Logger.verbose( 155 + "A tag from incoming clip record is not typed as strongRef", 156 + record, 157 + ); 158 + return false; 159 + } 160 + 161 + if ( 162 + record.tags.some((tag) => { 163 + return !is(ComAtprotoRepoStrongRef.mainSchema, tag); 164 + }) 165 + ) { 109 166 Logger.verbose( 110 - "A tag ref from incoming clip record is not a strongRef", 167 + "A tag from incoming clip record is not a valid strongRef", 111 168 record, 112 169 ); 113 170 return false; 114 171 } 115 172 116 - // There should be more tests here, but I'm not exactly sure what to add... 173 + // There should definitely be more tests here, but I'm not exactly sure what to add... 117 174 } 118 175 119 176 if (typeof record.unlisted !== "boolean") {
+44
backend/src/routes/openapi.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { Hono } from "hono"; 8 + import { Scalar } from "@scalar/hono-api-reference"; 9 + import { createMarkdownFromOpenApi } from "@scalar/openapi-to-markdown"; 10 + import { serveStatic } from "@hono/node-server/serve-static"; 11 + import { readFileSync } from "fs"; 12 + 13 + const app = new Hono(); 14 + 15 + app.get( 16 + "/api.json", 17 + serveStatic({ 18 + path: "./static/api.json", 19 + }), 20 + ); 21 + 22 + app.on( 23 + "GET", 24 + ["/scalar", "/docs"], 25 + Scalar({ 26 + url: "/api.json", 27 + theme: "bluePlanet", 28 + pageTitle: "Clippr AppView API documentation", 29 + layout: "modern", 30 + hideClientButton: true, 31 + forceDarkModeState: "dark", 32 + }), 33 + ); 34 + 35 + /** 36 + * Create a Markdown document for LLMs to read 37 + * @see https://llmstxt.org/ 38 + */ 39 + const markdown = await createMarkdownFromOpenApi( 40 + readFileSync("./static/api.json", "utf-8"), 41 + ); 42 + app.get("/llms.txt", (c) => c.text(markdown)); 43 + 44 + export default app;
+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;
+237
backend/src/routes/xrpc.ts
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + import { Hono } from "hono"; 8 + import { Database } from "../db/database.js"; 9 + import { usersTable } from "../db/schema.js"; 10 + import { eq } from "drizzle-orm"; 11 + import { getDidFromHandle, getHandleFromDid } from "../network/converters.js"; 12 + import { createClipView } from "../api/feed.js"; 13 + import { type ClipViewQuery, type ErrorResponse } from "../api/types.js"; 14 + import { createAvatarLink } from "../api/profile.js"; 15 + import { SocialClipprFeedDefs } from "@clipprjs/lexicons"; 16 + import { is } from "@atcute/lexicons"; 17 + 18 + const app = new Hono(); 19 + const db = Database.getInstance().getDb(); 20 + 21 + app.get("/social.clippr.actor.getProfile", async (c) => { 22 + const actor = c.req.query("actor"); 23 + if (actor === undefined || actor.trim().length === 0) { 24 + return c.json( 25 + { 26 + error: "InvalidRequest", 27 + message: "Error: Parameters must have the actor property included", 28 + }, 29 + 400, 30 + ); 31 + } 32 + 33 + let actorDid = actor; 34 + 35 + if (!actor.startsWith("did:")) { 36 + try { 37 + actorDid = await getDidFromHandle(actor); 38 + } catch (e: unknown) { 39 + if (e instanceof Error) { 40 + return c.json( 41 + { 42 + error: e.message, 43 + message: e.cause, 44 + }, 45 + 400, 46 + ); 47 + } else { 48 + return c.json( 49 + { 50 + error: "InvalidRequest" as string, 51 + message: "Unknown error while resolving DID from handle" as string, 52 + }, 53 + 400, 54 + ); 55 + } 56 + } 57 + } 58 + 59 + const profileSearch = await db 60 + .selectDistinct() 61 + .from(usersTable) 62 + .where(eq(usersTable.did, actorDid)); 63 + 64 + if (profileSearch.length === 0) { 65 + return c.json( 66 + { 67 + error: "InvalidRequest", 68 + message: "Profile not found", 69 + }, 70 + 400, 71 + ); 72 + } 73 + 74 + let actorHandle; 75 + 76 + if (actor.startsWith("did:")) { 77 + try { 78 + actorHandle = await getHandleFromDid(actor); 79 + } catch (e: unknown) { 80 + if (e instanceof Error) { 81 + return c.json( 82 + { 83 + error: "InvalidRequest", 84 + message: `${e.message}`, 85 + }, 86 + 400, 87 + ); 88 + } else { 89 + return c.json( 90 + { 91 + error: "InvalidRequest" as string, 92 + message: "Unknown error while resolving handle from DID" as string, 93 + }, 94 + 400, 95 + ); 96 + } 97 + } 98 + 99 + if (actorHandle === undefined) { 100 + actorHandle = "invalid.handle"; 101 + } 102 + } else actorHandle = actor; 103 + 104 + // TODO: Add placeholder avatar 105 + // This is a mess and should be replaced with a real solution! 106 + const avatarCid: string = 107 + profileSearch[0]?.avatar || "https://missing.avatar"; 108 + let actorAvatar; 109 + if (avatarCid !== "https://missing.avatar") { 110 + actorAvatar = await createAvatarLink(actorDid, avatarCid); 111 + } else actorAvatar = avatarCid; 112 + 113 + // Right now we don't do de-duplication in the database, so we just take the 114 + // first result and use that for our return call. 115 + return c.json({ 116 + did: actorDid, 117 + handle: actorHandle, 118 + displayName: profileSearch[0]?.displayName, 119 + avatar: actorAvatar, 120 + description: profileSearch[0]?.description || null, 121 + createdAt: profileSearch[0]?.createdAt, 122 + }); 123 + }); 124 + 125 + app.get("/social.clippr.feed.getClips", async (c) => { 126 + const uris = c.req.query("uris"); 127 + if (uris === undefined || uris.trim().length === 0) { 128 + return c.json( 129 + { 130 + error: "InvalidRequest", 131 + message: "Error: Parameters must have the uris property included", 132 + }, 133 + 400, 134 + ); 135 + } 136 + 137 + const rawUriArray: string[] = uris.split(","); 138 + 139 + if (rawUriArray.length > 25) { 140 + return c.json( 141 + { 142 + error: "InvalidRequest", 143 + message: "Error: More than 25 URIs have been provided", 144 + }, 145 + 400, 146 + ); 147 + } 148 + 149 + if ( 150 + rawUriArray.some((value) => { 151 + return !value.startsWith("at://"); 152 + }) 153 + ) { 154 + return c.json( 155 + { 156 + error: "InvalidRequest", 157 + message: "Error: A queried URI is missing the at:// identifier", 158 + }, 159 + 400, 160 + ); 161 + } 162 + 163 + const parsedUriArray: object[] = []; 164 + 165 + for (let value of rawUriArray) { 166 + value = value.replace("at://", ""); 167 + const splitUri: string[] = value.split("/"); 168 + 169 + if (splitUri.length !== 3) { 170 + c.json( 171 + { 172 + error: "InvalidRequest", 173 + message: "Error: A queried URI is not a proper clip", 174 + }, 175 + 400, 176 + ); 177 + } 178 + 179 + let splitUriObject: ClipViewQuery = { 180 + did: "", 181 + collection: "", 182 + recordKey: "", 183 + }; 184 + 185 + // validate type 186 + if ( 187 + !splitUri[0] || 188 + !splitUri[1] || 189 + !splitUri[2] || 190 + typeof splitUri[0] !== "string" || 191 + typeof splitUri[1] !== "string" || 192 + typeof splitUri[2] !== "string" 193 + ) { 194 + c.json( 195 + { 196 + error: "InvalidRequest", 197 + message: "Error: A queried URI is not a proper clip", 198 + }, 199 + 400, 200 + ); 201 + } else { 202 + splitUriObject = { 203 + did: splitUri[0], 204 + collection: splitUri[1], 205 + recordKey: splitUri[2], 206 + }; 207 + } 208 + 209 + const clipView = await createClipView(splitUriObject); 210 + 211 + if (!is(SocialClipprFeedDefs.clipViewSchema, value)) { 212 + c.json(clipView, 400); 213 + } 214 + 215 + parsedUriArray.push(clipView); 216 + } 217 + 218 + if (parsedUriArray.length === 0) { 219 + return c.json( 220 + { 221 + error: "InvalidRequest", 222 + message: "No queried URIs exist", 223 + } as ErrorResponse, 224 + 400, 225 + ); 226 + } 227 + 228 + return c.json(parsedUriArray, 200); 229 + }); 230 + 231 + app.get("/_health", async (c) => { 232 + return c.json({ 233 + version: process.env.npm_package_version, 234 + }); 235 + }); 236 + 237 + export default app;
+8
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"; 10 + import xrpc from "./routes/xrpc.js"; 11 + import wellKnown from "./routes/well-known.js"; 9 12 import Logger from "./logger.js"; 10 13 import { logger } from "hono/logger"; 14 + import { cors } from "hono/cors"; 11 15 12 16 export function winstonLogger(message: string, ...rest: unknown[]) { 13 17 Logger.http(message, ...rest); ··· 15 19 16 20 const app = new Hono(); 17 21 app.use(logger(winstonLogger)); 22 + app.use(cors()); 18 23 19 24 // Link all routes up 20 25 app.route("/", misc); 26 + app.route("/", openapi); 27 + app.route("/", wellKnown); 28 + app.route("/xrpc", xrpc); 21 29 22 30 export default app;
+1228
backend/static/api.json
··· 1 + { 2 + "openapi": "3.1.1", 3 + "info": { 4 + "title": "Clippr AppView API", 5 + "version": "1.0.1", 6 + "description": "API reference documentation for Clippr's backend.", 7 + "license": { 8 + "name": "GNU Affero General Public License v3.0 only", 9 + "identifier": "AGPL-3.0-only" 10 + } 11 + }, 12 + "servers": [ 13 + { 14 + "url": "http://localhost:9090", 15 + "description": "Development server" 16 + }, 17 + { 18 + "url": "https://api.clippr.social", 19 + "description": "Production server" 20 + } 21 + ], 22 + "tags": [ 23 + { 24 + "name": "Clips", 25 + "description": "API paths that relate to user bookmarks, or 'clips'." 26 + }, 27 + { 28 + "name": "Tags", 29 + "description": "API paths that relate to user tags." 30 + }, 31 + { 32 + "name": "Profile", 33 + "description": "API paths that relate to user profiles." 34 + }, 35 + { 36 + "name": "Misc", 37 + "description": "API paths that don't fit into any other category." 38 + } 39 + ], 40 + "paths": { 41 + "/xrpc/social.clippr.actor.getPreferences": { 42 + "get": { 43 + "tags": ["Profile"], 44 + "summary": "Get a user's preferences", 45 + "operationId": "social.clippr.actor.getPreferences", 46 + "description": "Get a user's private preferences. Requires authentication.", 47 + "security": [ 48 + { 49 + "Bearer": [] 50 + } 51 + ], 52 + "responses": { 53 + "200": { 54 + "description": "OK", 55 + "content": { 56 + "application/json": { 57 + "schema": { 58 + "$ref": "#/components/schemas/social.clippr.actor.defs.preferences" 59 + } 60 + } 61 + } 62 + }, 63 + "400": { 64 + "description": "Bad Request", 65 + "content": { 66 + "application/json": { 67 + "schema": { 68 + "type": "object", 69 + "properties": { 70 + "error": { 71 + "type": "string", 72 + "description": "A general error code", 73 + "oneOf": [ 74 + { 75 + "const": "InvalidRequest" 76 + }, 77 + { 78 + "const": "ExpiredToken" 79 + }, 80 + { 81 + "const": "InvalidToken" 82 + } 83 + ] 84 + }, 85 + "message": { 86 + "type": "string", 87 + "description": "A detailed description of the error" 88 + } 89 + } 90 + } 91 + } 92 + } 93 + }, 94 + "401": { 95 + "description": "Unauthorized", 96 + "content": { 97 + "application/json": { 98 + "schema": { 99 + "type": "object", 100 + "properties": { 101 + "error": { 102 + "type": "string", 103 + "description": "A general error code", 104 + "oneOf": [ 105 + { 106 + "const": "AuthMissing" 107 + } 108 + ] 109 + }, 110 + "message": { 111 + "type": "string", 112 + "description": "A detailed description of the error" 113 + } 114 + } 115 + } 116 + } 117 + } 118 + } 119 + } 120 + } 121 + }, 122 + "/xrpc/social.clippr.actor.getProfile": { 123 + "get": { 124 + "tags": ["Profile"], 125 + "summary": "Get a profile", 126 + "operationId": "social.clippr.actor.getProfile", 127 + "description": "Get a user's profile based on a given DID or handle.", 128 + "parameters": [ 129 + { 130 + "name": "actor", 131 + "in": "query", 132 + "description": "Handle or DID of account to fetch profile of", 133 + "required": true, 134 + "content": { 135 + "schema": { 136 + "type": "string", 137 + "description": "Handle or DID of account to fetch profile of", 138 + "format": "at-identifier" 139 + } 140 + }, 141 + "deprecated": false, 142 + "allowEmptyValue": false 143 + } 144 + ], 145 + "responses": { 146 + "200": { 147 + "description": "OK", 148 + "content": { 149 + "application/json": { 150 + "schema": { 151 + "type": "object", 152 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 153 + } 154 + } 155 + } 156 + }, 157 + "400": { 158 + "description": "Bad Request", 159 + "content": { 160 + "application/json": { 161 + "schema": { 162 + "type": "object", 163 + "properties": { 164 + "error": { 165 + "type": "string", 166 + "description": "A general error code", 167 + "oneOf": [ 168 + { 169 + "const": "InvalidRequest" 170 + } 171 + ] 172 + }, 173 + "message": { 174 + "type": "string", 175 + "description": "A detailed description of the error" 176 + } 177 + } 178 + } 179 + } 180 + } 181 + } 182 + } 183 + } 184 + }, 185 + "/xrpc/social.clippr.actor.putPreferences": { 186 + "post": { 187 + "tags": ["Profile"], 188 + "summary": "Set a user's preferences", 189 + "operationId": "social.clippr.actor.putPreferences", 190 + "description": "Sets the private preferences attached to the account. Requires authentication.", 191 + "security": [ 192 + { 193 + "Bearer": [] 194 + } 195 + ], 196 + "requestBody": { 197 + "required": true, 198 + "content": { 199 + "application/json": { 200 + "schema": { 201 + "type": "object", 202 + "properties": { 203 + "preferences": { 204 + "$ref": "#/components/schemas/social.clippr.actor.defs.preferences" 205 + } 206 + } 207 + } 208 + } 209 + } 210 + }, 211 + "responses": { 212 + "200": { 213 + "description": "OK" 214 + }, 215 + "400": { 216 + "description": "Bad Request", 217 + "content": { 218 + "application/json": { 219 + "schema": { 220 + "type": "object", 221 + "properties": { 222 + "error": { 223 + "type": "string", 224 + "oneOf": [ 225 + { 226 + "const": "InvalidRequest" 227 + }, 228 + { 229 + "const": "ExpiredToken" 230 + }, 231 + { 232 + "const": "InvalidToken" 233 + } 234 + ], 235 + "description": "A general error code" 236 + }, 237 + "message": { 238 + "type": "string", 239 + "description": "A detailed description of the error" 240 + } 241 + } 242 + } 243 + } 244 + } 245 + }, 246 + "401": { 247 + "description": "Unauthorized", 248 + "content": { 249 + "application/json": { 250 + "schema": { 251 + "type": "object", 252 + "properties": { 253 + "error": { 254 + "type": "string", 255 + "description": "A general error code", 256 + "oneOf": [ 257 + { 258 + "const": "AuthMissing" 259 + } 260 + ] 261 + }, 262 + "message": { 263 + "type": "string", 264 + "description": "A detailed description of the error" 265 + } 266 + } 267 + } 268 + } 269 + } 270 + } 271 + } 272 + } 273 + }, 274 + "/xrpc/social.clippr.actor.searchClips": { 275 + "get": { 276 + "tags": ["Clips"], 277 + "summary": "Search clips", 278 + "operationId": "social.clippr.actor.searchClips", 279 + "description": "Find clips matching search criteria.", 280 + "parameters": [ 281 + { 282 + "name": "q", 283 + "in": "query", 284 + "description": "Search query string", 285 + "required": true, 286 + "schema": { 287 + "type": "string", 288 + "description": "Search query string" 289 + } 290 + }, 291 + { 292 + "name": "limit", 293 + "in": "query", 294 + "description": "How many clips to return in the query output", 295 + "required": false, 296 + "schema": { 297 + "type": "integer", 298 + "minimum": 1, 299 + "maximum": 100, 300 + "default": 25 301 + } 302 + }, 303 + { 304 + "name": "actor", 305 + "in": "query", 306 + "description": "An actor to filter results to", 307 + "required": false, 308 + "schema": { 309 + "type": "string", 310 + "description": "An actor to filter results to", 311 + "format": "at-identifier" 312 + } 313 + }, 314 + { 315 + "name": "cursor", 316 + "in": "query", 317 + "description": "A parameter to paginate results", 318 + "required": false, 319 + "schema": { 320 + "type": "string", 321 + "description": "A parameter to paginate results" 322 + } 323 + } 324 + ], 325 + "responses": { 326 + "200": { 327 + "description": "OK", 328 + "content": { 329 + "application/json": { 330 + "schema": { 331 + "type": "object", 332 + "properties": { 333 + "cursor": { 334 + "type": "string", 335 + "description": "A parameter to paginate results" 336 + }, 337 + "clips": { 338 + "type": "array", 339 + "items": { 340 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 341 + } 342 + } 343 + } 344 + } 345 + } 346 + } 347 + }, 348 + "400": { 349 + "description": "Bad Request", 350 + "content": { 351 + "application/json": { 352 + "schema": { 353 + "type": "object", 354 + "properties": { 355 + "error": { 356 + "type": "string", 357 + "description": "A general error code", 358 + "oneOf": [ 359 + { 360 + "const": "InvalidRequest" 361 + } 362 + ] 363 + }, 364 + "message": { 365 + "type": "string", 366 + "description": "A detailed description of the error" 367 + } 368 + } 369 + } 370 + } 371 + } 372 + } 373 + } 374 + } 375 + }, 376 + "/xrpc/social.clippr.actor.searchProfiles": { 377 + "get": { 378 + "tags": ["Profile"], 379 + "summary": "Search profiles", 380 + "operationId": "social.clippr.actor.searchProfiles", 381 + "description": "Find profiles matching search criteria.", 382 + "parameters": [ 383 + { 384 + "name": "q", 385 + "in": "query", 386 + "description": "Search query string", 387 + "required": false, 388 + "schema": { 389 + "type": "string", 390 + "description": "Search query string" 391 + } 392 + }, 393 + { 394 + "name": "limit", 395 + "in": "query", 396 + "description": "The number of profiles to be returned in the query", 397 + "required": false, 398 + "schema": { 399 + "type": "integer", 400 + "minimum": 1, 401 + "maximum": 100, 402 + "default": 25 403 + } 404 + }, 405 + { 406 + "name": "cursor", 407 + "in": "query", 408 + "description": "A parameter used for pagination", 409 + "required": false, 410 + "schema": { 411 + "type": "string", 412 + "description": "A parameter used for pagination" 413 + } 414 + } 415 + ], 416 + "responses": { 417 + "200": { 418 + "description": "OK", 419 + "content": { 420 + "application/json": { 421 + "schema": { 422 + "type": "object", 423 + "properties": { 424 + "cursor": { 425 + "type": "string", 426 + "description": "A parameter used for pagination" 427 + }, 428 + "actors": { 429 + "type": "array", 430 + "items": { 431 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 432 + } 433 + } 434 + } 435 + } 436 + } 437 + } 438 + }, 439 + "400": { 440 + "description": "Bad Request", 441 + "content": { 442 + "application/json": { 443 + "schema": { 444 + "type": "object", 445 + "properties": { 446 + "error": { 447 + "type": "string", 448 + "description": "A general error code", 449 + "oneOf": [ 450 + { 451 + "const": "InvalidRequest" 452 + } 453 + ] 454 + }, 455 + "message": { 456 + "type": "string", 457 + "description": "A detailed description of the error" 458 + } 459 + } 460 + } 461 + } 462 + } 463 + } 464 + } 465 + } 466 + }, 467 + "/xrpc/social.clippr.actor.searchTags": { 468 + "get": { 469 + "tags": ["Tags"], 470 + "summary": "Search tags", 471 + "operationId": "social.clippr.actor.searchTags", 472 + "description": "Find tags matching search criteria.", 473 + "parameters": [ 474 + { 475 + "name": "q", 476 + "in": "query", 477 + "description": "Search query string", 478 + "required": true, 479 + "schema": { 480 + "type": "string", 481 + "description": "Search query string" 482 + } 483 + }, 484 + { 485 + "name": "limit", 486 + "in": "query", 487 + "description": "How many tags to return in the query output", 488 + "required": false, 489 + "schema": { 490 + "type": "integer", 491 + "minimum": 1, 492 + "maximum": 100, 493 + "default": 25 494 + } 495 + }, 496 + { 497 + "name": "actor", 498 + "in": "query", 499 + "description": "An actor to filter results to", 500 + "required": false, 501 + "schema": { 502 + "type": "string", 503 + "description": "An actor to filter results to", 504 + "format": "at-identifier" 505 + } 506 + }, 507 + { 508 + "name": "cursor", 509 + "in": "query", 510 + "description": "A parameter to paginate results", 511 + "required": false, 512 + "schema": { 513 + "type": "string", 514 + "description": "A parameter to paginate results" 515 + } 516 + } 517 + ], 518 + "responses": { 519 + "200": { 520 + "description": "OK", 521 + "content": { 522 + "application/json": { 523 + "schema": { 524 + "type": "object", 525 + "properties": { 526 + "cursor": { 527 + "type": "string", 528 + "description": "A parameter to paginate results" 529 + }, 530 + "tags": { 531 + "type": "array", 532 + "items": { 533 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 534 + } 535 + } 536 + } 537 + } 538 + } 539 + } 540 + }, 541 + "400": { 542 + "description": "Bad Request", 543 + "content": { 544 + "application/json": { 545 + "schema": { 546 + "type": "object", 547 + "properties": { 548 + "error": { 549 + "type": "string", 550 + "description": "A general error code", 551 + "oneOf": [ 552 + { 553 + "const": "InvalidRequest" 554 + } 555 + ] 556 + }, 557 + "message": { 558 + "type": "string", 559 + "description": "A detailed description of the error" 560 + } 561 + } 562 + } 563 + } 564 + } 565 + } 566 + } 567 + } 568 + }, 569 + "/xrpc/social.clippr.feed.getClips": { 570 + "get": { 571 + "tags": ["Clips"], 572 + "summary": "Get clips", 573 + "operationId": "social.clippr.feed.getClips", 574 + "description": "Get the hydrated views of a list of clips from their AT URIs.", 575 + "parameters": [ 576 + { 577 + "name": "uris", 578 + "in": "query", 579 + "description": "List of tag AT-URIs to return hydrated views for", 580 + "required": true, 581 + "schema": { 582 + "type": "array", 583 + "items": { 584 + "type": "string", 585 + "format": "at-uri" 586 + }, 587 + "maxItems": 25 588 + } 589 + } 590 + ], 591 + "responses": { 592 + "200": { 593 + "description": "OK", 594 + "content": { 595 + "application/json": { 596 + "schema": { 597 + "type": "array", 598 + "items": { 599 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 600 + } 601 + } 602 + } 603 + } 604 + }, 605 + "400": { 606 + "description": "Bad Request", 607 + "content": { 608 + "application/json": { 609 + "schema": { 610 + "type": "object", 611 + "properties": { 612 + "error": { 613 + "type": "string", 614 + "description": "A general error code", 615 + "oneOf": [ 616 + { 617 + "const": "InvalidRequest" 618 + } 619 + ] 620 + }, 621 + "message": { 622 + "type": "string", 623 + "description": "A detailed description of the error" 624 + } 625 + } 626 + } 627 + } 628 + } 629 + } 630 + } 631 + } 632 + }, 633 + "/xrpc/social.clippr.feed.getTags": { 634 + "get": { 635 + "tags": ["Tags"], 636 + "summary": "Get tags", 637 + "operationId": "social.clippr.feed.getTags", 638 + "description": "Get a the hydrated views of a list of tags from their AT URIs.", 639 + "parameters": [ 640 + { 641 + "name": "uris", 642 + "in": "query", 643 + "description": "List of tag AT-URIs to return hydrated views for", 644 + "required": true, 645 + "schema": { 646 + "type": "array", 647 + "items": { 648 + "type": "string", 649 + "format": "at-uri" 650 + }, 651 + "maxItems": 25 652 + } 653 + } 654 + ], 655 + "responses": { 656 + "200": { 657 + "description": "OK", 658 + "content": { 659 + "application/json": { 660 + "schema": { 661 + "type": "array", 662 + "items": { 663 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 664 + } 665 + } 666 + } 667 + } 668 + }, 669 + "400": { 670 + "description": "Bad Request", 671 + "content": { 672 + "application/json": { 673 + "schema": { 674 + "type": "object", 675 + "properties": { 676 + "error": { 677 + "type": "string", 678 + "description": "A general error code", 679 + "oneOf": [ 680 + { 681 + "const": "InvalidRequest" 682 + } 683 + ] 684 + }, 685 + "message": { 686 + "type": "string", 687 + "description": "A detailed description of the error" 688 + } 689 + } 690 + } 691 + } 692 + } 693 + } 694 + } 695 + } 696 + }, 697 + "/xrpc/social.clippr.feed.getProfileClips": { 698 + "get": { 699 + "tags": ["Clips"], 700 + "summary": "Get a profile's clip feed", 701 + "operationId": "social.clippr.feed.getProfileClips", 702 + "description": "Get a view of a profile's reverse-chronological clips feed.", 703 + "parameters": [ 704 + { 705 + "name": "actor", 706 + "in": "query", 707 + "description": "An actor to get feed data from", 708 + "required": true, 709 + "schema": { 710 + "type": "string", 711 + "description": "An actor to get feed data from", 712 + "format": "at-identifier" 713 + } 714 + }, 715 + { 716 + "name": "limit", 717 + "in": "query", 718 + "description": "How many results to return with the query", 719 + "required": false, 720 + "schema": { 721 + "type": "integer", 722 + "minimum": 1, 723 + "maximum": 100, 724 + "default": 50 725 + } 726 + }, 727 + { 728 + "name": "cursor", 729 + "in": "query", 730 + "description": "A parameter to paginate results", 731 + "required": false, 732 + "schema": { 733 + "type": "string", 734 + "description": "A parameter to paginate results" 735 + } 736 + }, 737 + { 738 + "name": "filter", 739 + "in": "query", 740 + "description": "What types to include in response", 741 + "required": false, 742 + "schema": { 743 + "type": "string", 744 + "description": "What types of clips to include in response", 745 + "default": "all_clips", 746 + "enum": ["all_clips", "tagged_clips", "untagged_clips"] 747 + } 748 + } 749 + ], 750 + "responses": { 751 + "200": { 752 + "description": "OK", 753 + "content": { 754 + "application/json": { 755 + "schema": { 756 + "type": "object", 757 + "properties": { 758 + "cursor": { 759 + "type": "string" 760 + }, 761 + "feed": { 762 + "type": "array", 763 + "items": { 764 + "$ref": "#/components/schemas/social.clippr.feed.defs.clipView" 765 + } 766 + } 767 + } 768 + } 769 + } 770 + } 771 + }, 772 + "400": { 773 + "description": "Bad Request", 774 + "content": { 775 + "application/json": { 776 + "schema": { 777 + "type": "object", 778 + "properties": { 779 + "error": { 780 + "type": "string", 781 + "description": "A general error code", 782 + "oneOf": [ 783 + { 784 + "const": "InvalidRequest" 785 + } 786 + ] 787 + }, 788 + "message": { 789 + "type": "string", 790 + "description": "A detailed description of the error" 791 + } 792 + } 793 + } 794 + } 795 + } 796 + } 797 + } 798 + } 799 + }, 800 + "/xrpc/social.clippr.feed.getProfileTags": { 801 + "get": { 802 + "tags": ["Tags"], 803 + "summary": "Get a profile's tag feed", 804 + "operationId": "social.clippr.feed.getProfileTags", 805 + "description": "Get a view of a profile's reverse-chronological clips feed.", 806 + "parameters": [ 807 + { 808 + "name": "actor", 809 + "in": "query", 810 + "description": "An actor to get feed data from", 811 + "required": true, 812 + "schema": { 813 + "type": "string", 814 + "description": "An actor to get feed data from", 815 + "format": "at-identifier" 816 + } 817 + }, 818 + { 819 + "name": "limit", 820 + "in": "query", 821 + "description": "How many results to return with the query", 822 + "required": false, 823 + "schema": { 824 + "type": "integer", 825 + "minimum": 1, 826 + "maximum": 100, 827 + "default": 50 828 + } 829 + }, 830 + { 831 + "name": "cursor", 832 + "in": "query", 833 + "description": "A parameter to paginate results", 834 + "required": false, 835 + "schema": { 836 + "type": "string", 837 + "description": "A parameter to paginate results" 838 + } 839 + } 840 + ], 841 + "responses": { 842 + "200": { 843 + "description": "OK", 844 + "content": { 845 + "application/json": { 846 + "schema": { 847 + "type": "object", 848 + "properties": { 849 + "cursor": { 850 + "type": "string" 851 + }, 852 + "feed": { 853 + "type": "array", 854 + "items": { 855 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 856 + } 857 + } 858 + } 859 + } 860 + } 861 + } 862 + }, 863 + "400": { 864 + "description": "Bad Request", 865 + "content": { 866 + "application/json": { 867 + "schema": { 868 + "type": "object", 869 + "properties": { 870 + "error": { 871 + "type": "string", 872 + "description": "A general error code", 873 + "oneOf": [ 874 + { 875 + "const": "InvalidRequest" 876 + } 877 + ] 878 + }, 879 + "message": { 880 + "type": "string", 881 + "description": "A detailed description of the error" 882 + } 883 + } 884 + } 885 + } 886 + } 887 + } 888 + } 889 + } 890 + }, 891 + "/xrpc/social.clippr.feed.getTagList": { 892 + "get": { 893 + "tags": ["Tags"], 894 + "summary": "Get a profile's tag list", 895 + "operationId": "social.clippr.feed.getProfileTags", 896 + "description": "Get a profile's complete list of tags.", 897 + "parameters": [ 898 + { 899 + "name": "actor", 900 + "in": "query", 901 + "description": "An actor to fetch the tag list from", 902 + "required": false, 903 + "schema": { 904 + "type": "string", 905 + "description": "An actor to fetch the tag list from", 906 + "format": "at-identifier" 907 + } 908 + } 909 + ], 910 + "responses": { 911 + "200": { 912 + "description": "OK", 913 + "content": { 914 + "application/json": { 915 + "schema": { 916 + "type": "object", 917 + "properties": { 918 + "tags": { 919 + "type": "array", 920 + "items": { 921 + "$ref": "#/components/schemas/social.clippr.feed.defs.tagView" 922 + } 923 + } 924 + } 925 + } 926 + } 927 + } 928 + }, 929 + "400": { 930 + "description": "Bad Request", 931 + "content": { 932 + "application/json": { 933 + "schema": { 934 + "type": "object", 935 + "properties": { 936 + "error": { 937 + "type": "string", 938 + "description": "A general error code", 939 + "oneOf": [ 940 + { 941 + "error": "InvalidRequest" 942 + } 943 + ] 944 + }, 945 + "message": { 946 + "type": "string", 947 + "description": "A detailed description of the error" 948 + } 949 + } 950 + } 951 + } 952 + } 953 + } 954 + } 955 + } 956 + }, 957 + "/xrpc/_health": { 958 + "get": { 959 + "summary": "Health check", 960 + "description": "Check the health of the server. If it is functioning properly, you will receive the server's version number.", 961 + "responses": { 962 + "200": { 963 + "description": "OK", 964 + "content": { 965 + "application/json": { 966 + "schema": { 967 + "type": "object", 968 + "properties": { 969 + "version": { 970 + "type": "string", 971 + "description": "The version number of the AppView." 972 + } 973 + } 974 + } 975 + } 976 + } 977 + } 978 + }, 979 + "tags": ["Misc"] 980 + } 981 + } 982 + }, 983 + "components": { 984 + "schemas": { 985 + "com.atproto.repo.strongRef": { 986 + "type": "object", 987 + "required": ["uri", "cid"], 988 + "properties": { 989 + "uri": { 990 + "type": "string", 991 + "format": "at-uri" 992 + }, 993 + "cid": { 994 + "type": "string", 995 + "format": "cid" 996 + } 997 + } 998 + }, 999 + "social.clippr.actor.defs.profileView": { 1000 + "type": "object", 1001 + "description": "A view of an actor's profile", 1002 + "required": ["did", "handle", "displayName"], 1003 + "properties": { 1004 + "did": { 1005 + "type": "string", 1006 + "description": "The DID of the profile", 1007 + "format": "did" 1008 + }, 1009 + "handle": { 1010 + "type": "string", 1011 + "description": "The handle of the profile", 1012 + "format": "handle" 1013 + }, 1014 + "displayName": { 1015 + "type": "string", 1016 + "description": "The display name associated to the profile", 1017 + "maxLength": 64 1018 + }, 1019 + "description": { 1020 + "type": "string", 1021 + "description": "The biography associated to the profile", 1022 + "maxLength": 500 1023 + }, 1024 + "avatar": { 1025 + "type": "string", 1026 + "description": "A link to the profile's avatar", 1027 + "format": "uri" 1028 + }, 1029 + "createdAt": { 1030 + "type": "string", 1031 + "description": "When the profile record was first created", 1032 + "format": "date-time" 1033 + } 1034 + } 1035 + }, 1036 + "social.clippr.actor.defs.preferences": { 1037 + "type": "array", 1038 + "items": { 1039 + "oneOf": [ 1040 + { 1041 + "$ref": "#/components/schemas/social.clippr.actor.defs.publishingScopesPref" 1042 + } 1043 + ] 1044 + } 1045 + }, 1046 + "social.clippr.actor.defs.publishingScopesPref": { 1047 + "type": "object", 1048 + "description": "Preferences for a user's publishing scopes", 1049 + "required": ["defaultScope"], 1050 + "properties": { 1051 + "defaultScope": { 1052 + "type": "string", 1053 + "description": "What publishing scope to mark a clip as by default", 1054 + "enum": ["public", "unlisted"] 1055 + } 1056 + } 1057 + }, 1058 + "social.clippr.feed.defs.clipView": { 1059 + "type": "object", 1060 + "description": "A view of a single bookmark (or 'clip')", 1061 + "required": ["uri", "cid", "author", "record", "indexedAt"], 1062 + "properties": { 1063 + "uri": { 1064 + "type": "string", 1065 + "description": "The AT-URI of the clip", 1066 + "format": "at-uri" 1067 + }, 1068 + "cid": { 1069 + "type": "string", 1070 + "description": "The CID of the clip", 1071 + "format": "cid" 1072 + }, 1073 + "author": { 1074 + "description": "A reference to the actor's profile", 1075 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 1076 + }, 1077 + "record": { 1078 + "type": "object", 1079 + "description": "The raw record of the clip" 1080 + }, 1081 + "indexedAt": { 1082 + "type": "string", 1083 + "description": "The time in which the clip's record was indexed by the AppView", 1084 + "format": "date-time" 1085 + } 1086 + } 1087 + }, 1088 + "social.clippr.feed.defs.tagView": { 1089 + "type": "object", 1090 + "description": "A view of a single tag", 1091 + "required": ["uri", "cid", "author", "record", "indexedAt"], 1092 + "properties": { 1093 + "uri": { 1094 + "type": "string", 1095 + "description": "The AT-URI to the tag", 1096 + "format": "at-uri" 1097 + }, 1098 + "cid": { 1099 + "type": "string", 1100 + "description": "The CID of the tag", 1101 + "format": "cid" 1102 + }, 1103 + "author": { 1104 + "description": "A reference to the actor's profile", 1105 + "$ref": "#/components/schemas/social.clippr.actor.defs.profileView" 1106 + }, 1107 + "record": { 1108 + "type": "object", 1109 + "description": "The raw record of the clip" 1110 + }, 1111 + "indexedAt": { 1112 + "type": "string", 1113 + "description": "The time in which the tag's record was indexed by the AppView", 1114 + "format": "date-time" 1115 + } 1116 + } 1117 + }, 1118 + "social.clippr.actor.profile": { 1119 + "type": "object", 1120 + "required": ["createdAt", "displayName"], 1121 + "properties": { 1122 + "displayName": { 1123 + "type": "string", 1124 + "description": "A display name to be shown on a profile", 1125 + "maxLength": 64 1126 + }, 1127 + "description": { 1128 + "type": "string", 1129 + "description": "Text for user to describe themselves", 1130 + "maxLength": 500 1131 + }, 1132 + "avatar": { 1133 + "type": "blob", 1134 + "maxSize": 1000000, 1135 + "description": "Image to show on user's profiles" 1136 + }, 1137 + "createdAt": { 1138 + "type": "string", 1139 + "description": "The creation date of the profile", 1140 + "format": "date-time" 1141 + } 1142 + } 1143 + }, 1144 + "social.clippr.feed.clip": { 1145 + "type": "object", 1146 + "required": ["url", "title", "description", "unlisted", "createdAt"], 1147 + "properties": { 1148 + "url": { 1149 + "type": "string", 1150 + "description": "The URL of the bookmark. Cannot be left empty or be modified after creation.", 1151 + "format": "uri", 1152 + "maxLength": 2000 1153 + }, 1154 + "title": { 1155 + "type": "string", 1156 + "description": "The title of the bookmark. If left empty, reuse the URL.", 1157 + "maxLength": 2048 1158 + }, 1159 + "description": { 1160 + "type": "string", 1161 + "description": "A description of the bookmark's content. This should be ripped from the URL metadata and be static for all records using the URL.", 1162 + "maxLength": 4096 1163 + }, 1164 + "notes": { 1165 + "type": "string", 1166 + "description": "User-written notes for the bookmark. Public and personal.", 1167 + "maxLength": 10000 1168 + }, 1169 + "tags": { 1170 + "type": "array", 1171 + "description": "An array of tags. A format of solely alphanumeric characters and dashes should be used.", 1172 + "items": { 1173 + "$ref": "#/components/schemas/com.atproto.repo.strongRef" 1174 + } 1175 + }, 1176 + "unlisted": { 1177 + "type": "boolean", 1178 + "description": "Whether the bookmark can be used for feed indexing and aggregation" 1179 + }, 1180 + "unread": { 1181 + "type": "boolean", 1182 + "description": "Whether the bookmark has been read by the user", 1183 + "default": true 1184 + }, 1185 + "languages": { 1186 + "type": "array", 1187 + "items": { 1188 + "type": "string", 1189 + "format": "language" 1190 + }, 1191 + "maxItems": 5 1192 + }, 1193 + "createdAt": { 1194 + "type": "string", 1195 + "description": "Client-declared timestamp when the bookmark is created", 1196 + "format": "date-time" 1197 + } 1198 + } 1199 + }, 1200 + "social.clippr.feed.tag": { 1201 + "type": "object", 1202 + "required": ["name", "createdAt"], 1203 + "properties": { 1204 + "name": { 1205 + "type": "string", 1206 + "description": "A de-duplicated string containing the name of the tag", 1207 + "maxLength": 64 1208 + }, 1209 + "color": { 1210 + "type": "string", 1211 + "description": "A hexadecimal color code", 1212 + "maxLength": 7 1213 + }, 1214 + "description": { 1215 + "type": "string", 1216 + "description": "A description of the tag for additional context", 1217 + "maxLength": 5000 1218 + }, 1219 + "createdAt": { 1220 + "type": "string", 1221 + "description": "A client-defined timestamp for the creation of the tag", 1222 + "format": "date-time" 1223 + } 1224 + } 1225 + } 1226 + } 1227 + } 1228 + }
+39 -29
backend/static/index.html
··· 6 6 7 7 <!doctype html> 8 8 <html lang="en"> 9 - <head> 10 - <meta charset="UTF-8"/> 11 - <meta content="IE=edge" http-equiv="X-UA-Compatible"/> 12 - <meta content="width=device-width, initial-scale=1.0" name="viewport"/> 13 - <link href="main.css" rel="stylesheet"/> 14 - <title>clippr-BE</title> 15 - </head> 16 - <body> 17 - <div id="container"> 18 - <header> 19 - <p>clippr-BE</p> 20 - </header> 21 - <main> 22 - <p>welcome to the <b>clippr</b> appview!</p> 23 - <p>the API routes live under <code>/xrpc</code></p> 24 - <a href="http://tangled.sh/@hexmani.ac/clippr-ts">source code</a> 25 - </main> 26 - <footer> 27 - <br/> 28 - <small> 29 - copyright ยฉ clippr contributors 2025 | this software is released 30 - under the 31 - <a href="https://www.gnu.org/licenses/agpl-3.0.en.html#license-text" 32 - >AGPL</a 33 - > 34 - </small> 35 - </footer> 36 - </div> 37 - </body> 9 + <head> 10 + <meta charset="UTF-8" /> 11 + <meta content="IE=edge" http-equiv="X-UA-Compatible" /> 12 + <meta content="width=device-width, initial-scale=1.0" name="viewport" /> 13 + <link href="main.css" rel="stylesheet" /> 14 + <title>clippr-BE</title> 15 + </head> 16 + <body> 17 + <div id="container"> 18 + <header> 19 + <p>clippr-BE</p> 20 + </header> 21 + <main> 22 + <p>Welcome to the <b>clippr</b> appview!</p> 23 + <h3>Links</h3> 24 + <ul> 25 + <li> 26 + <a href="/docs">API Documentation</a> 27 + </li> 28 + <li> 29 + <a href="/llms.txt">LLMs.txt</a> 30 + </li> 31 + <li> 32 + <a href="http://tangled.sh/@hexmani.ac/clippr">Source Code</a> 33 + </li> 34 + </ul> 35 + </main> 36 + <footer> 37 + <br /> 38 + <small> 39 + Copyright ยฉ clippr contributors 2025 | This software is released 40 + under the 41 + <a href="https://www.gnu.org/licenses/agpl-3.0.en.html#license-text" 42 + >AGPL</a 43 + > 44 + </small> 45 + </footer> 46 + </div> 47 + </body> 38 48 </html>
+21 -29
backend/tsconfig.json
··· 1 1 { 2 - "compilerOptions": { 3 - "esModuleInterop": true, 4 - "skipLibCheck": true, 5 - "target": "ESNext", 6 - "module": "NodeNext", 7 - "moduleResolution": "NodeNext", 8 - "allowJs": true, 9 - "resolveJsonModule": true, 10 - "moduleDetection": "force", 11 - "isolatedModules": true, 12 - "verbatimModuleSyntax": true, 13 - "types": [ 14 - "node", 15 - "@atcute/atproto", 16 - "@clipprjs/lexicons" 17 - ], 18 - "strict": true, 19 - "noUncheckedIndexedAccess": true, 20 - "noImplicitOverride": true, 21 - "jsx": "react-jsx", 22 - "jsxImportSource": "hono/jsx", 23 - "outDir": "dist/", 24 - "lib": [ 25 - "ESNext" 26 - ] 27 - }, 28 - "exclude": [ 29 - "node_modules" 30 - ] 2 + "compilerOptions": { 3 + "esModuleInterop": true, 4 + "skipLibCheck": true, 5 + "target": "ESNext", 6 + "module": "NodeNext", 7 + "moduleResolution": "NodeNext", 8 + "allowJs": true, 9 + "resolveJsonModule": true, 10 + "moduleDetection": "force", 11 + "isolatedModules": true, 12 + "verbatimModuleSyntax": true, 13 + "types": ["node", "@atcute/atproto", "@clipprjs/lexicons"], 14 + "strict": true, 15 + "noUncheckedIndexedAccess": true, 16 + "noImplicitOverride": true, 17 + "jsx": "react-jsx", 18 + "jsxImportSource": "hono/jsx", 19 + "outDir": "dist/", 20 + "lib": ["ESNext"], 21 + }, 22 + "exclude": ["node_modules", "dist/"], 31 23 }
+2 -23
frontend/.gitignore
··· 1 - # build output 1 + node_modules/ 2 2 dist/ 3 - # generated types 4 - .astro/ 5 - 6 - # dependencies 7 - node_modules/ 8 - 9 - # logs 10 - npm-debug.log* 11 - yarn-debug.log* 12 - yarn-error.log* 13 - pnpm-debug.log* 14 - 15 - 16 - # environment variables 17 - .env 18 - .env.production 19 - 20 - # macOS-specific files 21 - .DS_Store 22 - 23 - # jetbrains setting folder 24 - .idea/ 3 + did.json
+2
frontend/.prettierignore
··· 1 + pnpm-lock.yaml 2 + dist/*
+24
frontend/.prettierrc
··· 1 + { 2 + "trailingComma": "all", 3 + "useTabs": true, 4 + "tabWidth": 2, 5 + "printWidth": 80, 6 + "semi": true, 7 + "singleQuote": false, 8 + "bracketSpacing": true, 9 + "overrides": [ 10 + { 11 + "files": ["tsconfig.json", "jsconfig.json"], 12 + "options": { 13 + "parser": "jsonc" 14 + } 15 + }, 16 + { 17 + "files": ["*.md"], 18 + "options": { 19 + "printWidth": 100, 20 + "proseWrap": "always" 21 + } 22 + } 23 + ] 24 + }
-4
frontend/.vscode/extensions.json
··· 1 - { 2 - "recommendations": ["astro-build.astro-vscode"], 3 - "unwantedRecommendations": [] 4 - }
-11
frontend/.vscode/launch.json
··· 1 - { 2 - "version": "0.2.0", 3 - "configurations": [ 4 - { 5 - "command": "./node_modules/.bin/astro dev", 6 - "name": "Development server", 7 - "request": "launch", 8 - "type": "node-terminal" 9 - } 10 - ] 11 - }
+25 -6
frontend/README.md
··· 1 - # clippr-fe 2 - Astro-based reference frontend for clippr 1 + # @clipprjs/client 3 2 4 - ## run 5 - ```bash 3 + This is a reference implementation for the Clippr frontend using Solid. 4 + 5 + ## development 6 + 7 + If you are testing the frontend in conjunction with the AppView, you might want to change the 8 + following: 9 + 10 + - OAuth automatically adapts to whether the frontend is built or in dev mode. 11 + - `VITE_CLIPPR_APPVIEW` is set to the defaults for both production and development, however, if you 12 + are hosting the appview from another location, you will need to change this. 13 + 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.
-41
lexdocs/clippr/social/clippr/actor/defs.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.actor.defs", 4 - "defs": { 5 - "profileView": { 6 - "type": "object", 7 - "required": [ 8 - "did", 9 - "handle" 10 - ], 11 - "properties": { 12 - "did": { 13 - "type": "string", 14 - "format": "did" 15 - }, 16 - "handle": { 17 - "type": "string", 18 - "format": "handle" 19 - }, 20 - "displayName": { 21 - "type": "string", 22 - "maxGraphemes": 64, 23 - "maxLength": 640 24 - }, 25 - "description": { 26 - "type": "string", 27 - "maxGraphemes": 500, 28 - "maxLength": 5000 29 - }, 30 - "avatar": { 31 - "type": "string", 32 - "format": "uri" 33 - }, 34 - "createdAt": { 35 - "type": "string", 36 - "format": "datetime" 37 - } 38 - } 39 - } 40 - } 41 - }
-30
lexdocs/clippr/social/clippr/actor/getProfile.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.actor.getProfile", 4 - "defs": { 5 - "main": { 6 - "type": "query", 7 - "description": "Get profile view of an actor. Does not require auth.", 8 - "parameters": { 9 - "type": "params", 10 - "required": [ 11 - "actor" 12 - ], 13 - "properties": { 14 - "actor": { 15 - "type": "string", 16 - "format": "at-identifier", 17 - "description": "Handle or DID of account to fetch profile of." 18 - } 19 - } 20 - }, 21 - "output": { 22 - "encoding": "application/json", 23 - "schema": { 24 - "type": "ref", 25 - "ref": "social.clippr.actor.defs#profileView" 26 - } 27 - } 28 - } 29 - } 30 - }
-45
lexdocs/clippr/social/clippr/actor/profile.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.actor.profile", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "description": "A declaration of a Clippr account's profile.", 8 - "key": "literal:self", 9 - "record": { 10 - "type": "object", 11 - "required": [ 12 - "createdAt", 13 - "displayName" 14 - ], 15 - "properties": { 16 - "displayName": { 17 - "type": "string", 18 - "description": "A display name to be shown on a profile.", 19 - "maxGraphemes": 64, 20 - "maxLength": 640 21 - }, 22 - "description": { 23 - "type": "string", 24 - "description": "Text for user to describe themselves", 25 - "maxGraphemes": 500, 26 - "maxLength": 5000 27 - }, 28 - "avatar": { 29 - "type": "blob", 30 - "description": "Image to show on user's profiles.", 31 - "accept": [ 32 - "image/png", 33 - "image/jpeg" 34 - ], 35 - "maxSize": 1000000 36 - }, 37 - "createdAt": { 38 - "type": "string", 39 - "format": "datetime" 40 - } 41 - } 42 - } 43 - } 44 - } 45 - }
-79
lexdocs/clippr/social/clippr/feed/clip.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.feed.clip", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "description": "Record containing a bookmark item, or 'clip'.", 8 - "key": "any", 9 - "record": { 10 - "type": "object", 11 - "required": [ 12 - "url", 13 - "title", 14 - "description", 15 - "unlisted", 16 - "createdAt" 17 - ], 18 - "properties": { 19 - "url": { 20 - "type": "string", 21 - "description": "The URL of the bookmark. Cannot be left empty or be modified after creation.", 22 - "maxGraphemes": 2000, 23 - "maxLength": 20000 24 - }, 25 - "title": { 26 - "type": "string", 27 - "description": "The title of the bookmark. If left empty, reuse the URL.", 28 - "maxGraphemes": 2048, 29 - "maxLength": 20480 30 - }, 31 - "description": { 32 - "type": "string", 33 - "description": "A description of the bookmark's content. This should be ripped from the URL metadata and be static for all records using the URL.", 34 - "maxGraphemes": 4096, 35 - "maxLength": 40960 36 - }, 37 - "notes": { 38 - "type": "string", 39 - "description": "User-written notes for the bookmark. Public and personal.", 40 - "maxGraphemes": 10000, 41 - "maxLength": 100000 42 - }, 43 - "tags": { 44 - "type": "array", 45 - "description": "An array of tags. A format of solely alphanumeric characters and dashes should be used.", 46 - "items": { 47 - "type": "ref", 48 - "ref": "com.atproto.repo.strongRef" 49 - } 50 - }, 51 - "unlisted": { 52 - "type": "boolean", 53 - "description": "Whether the bookmark can be used for feed indexing and aggregation.", 54 - "default": false 55 - }, 56 - "unread": { 57 - "type": "boolean", 58 - "description": "Whether the bookmark has been read by the user.", 59 - "default": true 60 - }, 61 - "languages": { 62 - "type": "array", 63 - "description": "Indicates human language of the given URL.", 64 - "maxLength": 5, 65 - "items": { 66 - "type": "string", 67 - "format": "language" 68 - } 69 - }, 70 - "createdAt": { 71 - "type": "string", 72 - "description": "Client-declared timestamp when the bookmark is created.", 73 - "format": "datetime" 74 - } 75 - } 76 - } 77 - } 78 - } 79 - }
-37
lexdocs/clippr/social/clippr/feed/tag.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "social.clippr.feed.tag", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "description": "A record containing a bookmark tag for organization.", 8 - "key": "any", 9 - "record": { 10 - "type": "object", 11 - "required": [ 12 - "name", 13 - "createdAt" 14 - ], 15 - "properties": { 16 - "name": { 17 - "type": "string", 18 - "description": "A de-duplicated string containing the name of the tag.", 19 - "maxGraphemes": 64, 20 - "maxLength": 640 21 - }, 22 - "color": { 23 - "type": "string", 24 - "description": "A hexadecimal color code.", 25 - "maxGraphemes": 7, 26 - "maxLength": 70 27 - }, 28 - "createdAt": { 29 - "type": "string", 30 - "description": "A client-defined timestamp for the creation of the tag.", 31 - "format": "datetime" 32 - } 33 - } 34 - } 35 - } 36 - } 37 - }
+76
lexdocs/social/clippr/actor/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.defs", 4 + "defs": { 5 + "profileView": { 6 + "type": "object", 7 + "description": "A view of an actor's profile.", 8 + "required": [ 9 + "did", 10 + "handle", 11 + "displayName" 12 + ], 13 + "properties": { 14 + "did": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "The DID of the profile" 18 + }, 19 + "handle": { 20 + "type": "string", 21 + "format": "handle", 22 + "description": "The handle of the profile" 23 + }, 24 + "displayName": { 25 + "type": "string", 26 + "maxGraphemes": 64, 27 + "maxLength": 640, 28 + "description": "The display name associated to the profile" 29 + }, 30 + "description": { 31 + "type": "string", 32 + "maxGraphemes": 500, 33 + "maxLength": 5000, 34 + "description": "A description (or 'bio') associated to the profile" 35 + }, 36 + "avatar": { 37 + "type": "string", 38 + "format": "uri", 39 + "description": "A link to the profile's avatar" 40 + }, 41 + "createdAt": { 42 + "type": "string", 43 + "format": "datetime", 44 + "description": "When the profile record was first created" 45 + } 46 + } 47 + }, 48 + "preferences": { 49 + "type": "array", 50 + "description": "An array of refs to various preferences.", 51 + "items": { 52 + "type": "union", 53 + "refs": [ 54 + "#publishingScopesPref" 55 + ] 56 + } 57 + }, 58 + "publishingScopesPref": { 59 + "type": "object", 60 + "description": "Preferences for an user's publishing scopes.", 61 + "required": [ 62 + "defaultScope" 63 + ], 64 + "properties": { 65 + "defaultScope": { 66 + "type": "string", 67 + "knownValues": [ 68 + "public", 69 + "unlisted" 70 + ], 71 + "description": "What publishing scope to mark a clip as by default" 72 + } 73 + } 74 + } 75 + } 76 + }
+30
lexdocs/social/clippr/actor/getPreferences.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.getPreferences", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get the private user preferences associated to the requesting account.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": {} 11 + }, 12 + "output": { 13 + "encoding": "application/json", 14 + "schema": { 15 + "type": "object", 16 + "required": [ 17 + "preferences" 18 + ], 19 + "properties": { 20 + "preferences": { 21 + "type": "ref", 22 + "ref": "social.clippr.actor.defs#preferences", 23 + "description": "A ref to the user's preferences" 24 + } 25 + } 26 + } 27 + } 28 + } 29 + } 30 + }
+31
lexdocs/social/clippr/actor/getProfile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.getProfile", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get profile view of an actor. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "Handle or DID of account to fetch profile of" 18 + } 19 + } 20 + }, 21 + "output": { 22 + "encoding": "application/json", 23 + "schema": { 24 + "type": "ref", 25 + "ref": "social.clippr.actor.defs#profileView", 26 + "description": "A ref to the hydrated profile view of the actor" 27 + } 28 + } 29 + } 30 + } 31 + }
+46
lexdocs/social/clippr/actor/profile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.profile", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A declaration of a Clippr account's profile.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "createdAt", 13 + "displayName" 14 + ], 15 + "properties": { 16 + "displayName": { 17 + "type": "string", 18 + "description": "A display name to be shown on a profile", 19 + "maxGraphemes": 64, 20 + "maxLength": 640 21 + }, 22 + "description": { 23 + "type": "string", 24 + "description": "Text for user to describe themselves", 25 + "maxGraphemes": 500, 26 + "maxLength": 5000 27 + }, 28 + "avatar": { 29 + "type": "blob", 30 + "description": "Image to show on user's profiles", 31 + "accept": [ 32 + "image/png", 33 + "image/jpeg" 34 + ], 35 + "maxSize": 1000000 36 + }, 37 + "createdAt": { 38 + "type": "string", 39 + "format": "datetime", 40 + "description": "The creation date of the profile" 41 + } 42 + } 43 + } 44 + } 45 + } 46 + }
+26
lexdocs/social/clippr/actor/putPreferences.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.putPreferences", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Set the private user preferences associated to the requesting account.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": [ 13 + "preferences" 14 + ], 15 + "properties": { 16 + "preferences": { 17 + "type": "ref", 18 + "ref": "social.clippr.actor.defs#preferences", 19 + "description": "A ref to the user's preferences" 20 + } 21 + } 22 + } 23 + } 24 + } 25 + } 26 + }
+56
lexdocs/social/clippr/actor/searchProfiles.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.searchProfiles", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Find profiles matching search criteria. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "q" 12 + ], 13 + "properties": { 14 + "q": { 15 + "type": "string", 16 + "description": "Search query string" 17 + }, 18 + "limit": { 19 + "type": "integer", 20 + "minimum": 1, 21 + "maximum": 100, 22 + "default": 25, 23 + "description": "The number of profiles to be returned in the query" 24 + }, 25 + "cursor": { 26 + "type": "string", 27 + "description": "A parameter used for pagination" 28 + } 29 + } 30 + }, 31 + "output": { 32 + "encoding": "application/json", 33 + "schema": { 34 + "type": "object", 35 + "required": [ 36 + "actors" 37 + ], 38 + "properties": { 39 + "cursor": { 40 + "type": "string", 41 + "description": "A parameter used for pagination" 42 + }, 43 + "actors": { 44 + "type": "array", 45 + "items": { 46 + "type": "ref", 47 + "ref": "social.clippr.actor.defs#profileView" 48 + }, 49 + "description": "An array of hydrated profile views" 50 + } 51 + } 52 + } 53 + } 54 + } 55 + } 56 + }
+80
lexdocs/social/clippr/feed/clip.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.clip", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Record containing a bookmarked item, or 'clip'.", 8 + "key": "any", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "url", 13 + "title", 14 + "description", 15 + "unlisted", 16 + "createdAt" 17 + ], 18 + "properties": { 19 + "url": { 20 + "type": "string", 21 + "format": "uri", 22 + "description": "The URL of the bookmark. Cannot be left empty or be modified after creation.", 23 + "maxGraphemes": 2000, 24 + "maxLength": 20000 25 + }, 26 + "title": { 27 + "type": "string", 28 + "description": "The title of the bookmark. If left empty, reuse the URL.", 29 + "maxGraphemes": 2048, 30 + "maxLength": 20480 31 + }, 32 + "description": { 33 + "type": "string", 34 + "description": "A description of the bookmark's content. This should be ripped from the URL metadata and be static for all records using the URL.", 35 + "maxGraphemes": 4096, 36 + "maxLength": 40960 37 + }, 38 + "notes": { 39 + "type": "string", 40 + "description": "User-written notes for the bookmark. Public and personal.", 41 + "maxGraphemes": 10000, 42 + "maxLength": 100000 43 + }, 44 + "tags": { 45 + "type": "array", 46 + "description": "An array of tags. A format of solely alphanumeric characters and dashes should be used.", 47 + "items": { 48 + "type": "ref", 49 + "ref": "com.atproto.repo.strongRef" 50 + } 51 + }, 52 + "unlisted": { 53 + "type": "boolean", 54 + "description": "Whether the bookmark can be used for feed indexing and aggregation", 55 + "default": false 56 + }, 57 + "unread": { 58 + "type": "boolean", 59 + "description": "Whether the bookmark has been read by the user", 60 + "default": true 61 + }, 62 + "languages": { 63 + "type": "array", 64 + "description": "Indicates human language of the given URL", 65 + "maxLength": 5, 66 + "items": { 67 + "type": "string", 68 + "format": "language" 69 + } 70 + }, 71 + "createdAt": { 72 + "type": "string", 73 + "description": "Client-declared timestamp when the bookmark is created", 74 + "format": "datetime" 75 + } 76 + } 77 + } 78 + } 79 + } 80 + }
+80
lexdocs/social/clippr/feed/defs.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.defs", 4 + "defs": { 5 + "clipView": { 6 + "type": "object", 7 + "description": "A view of a single bookmark (or 'clip').", 8 + "required": [ 9 + "uri", 10 + "cid", 11 + "author", 12 + "record", 13 + "indexedAt" 14 + ], 15 + "properties": { 16 + "uri": { 17 + "type": "string", 18 + "format": "at-uri", 19 + "description": "The AT-URI of the clip" 20 + }, 21 + "cid": { 22 + "type": "string", 23 + "format": "cid", 24 + "description": "The CID of the clip" 25 + }, 26 + "author": { 27 + "type": "ref", 28 + "ref": "social.clippr.actor.defs#profileView", 29 + "description": "A ref to the actor's profile" 30 + }, 31 + "record": { 32 + "type": "unknown", 33 + "description": "The raw record of the clip" 34 + }, 35 + "indexedAt": { 36 + "type": "string", 37 + "format": "datetime", 38 + "description": "When the tag was first indexed by the AppView" 39 + } 40 + } 41 + }, 42 + "tagView": { 43 + "type": "object", 44 + "description": "A view of a single tag.", 45 + "required": [ 46 + "uri", 47 + "cid", 48 + "author", 49 + "record", 50 + "indexedAt" 51 + ], 52 + "properties": { 53 + "uri": { 54 + "type": "string", 55 + "format": "at-uri", 56 + "description": "The AT-URI to the tag" 57 + }, 58 + "cid": { 59 + "type": "string", 60 + "format": "cid", 61 + "description": "The CID of the tag" 62 + }, 63 + "author": { 64 + "type": "ref", 65 + "ref": "social.clippr.actor.defs#profileView", 66 + "description": "A ref to the actor's profile" 67 + }, 68 + "record": { 69 + "type": "unknown", 70 + "description": "The raw record of the tag" 71 + }, 72 + "indexedAt": { 73 + "type": "string", 74 + "format": "datetime", 75 + "description": "When the tag was first indexed by the AppView" 76 + } 77 + } 78 + } 79 + } 80 + }
+46
lexdocs/social/clippr/feed/getClips.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getClips", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a list of hydrated clips. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uris" 12 + ], 13 + "properties": { 14 + "uris": { 15 + "type": "array", 16 + "description": "List of clip AT-URIs to return hydrated views for", 17 + "items": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "maxLength": 25 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": [ 30 + "clips" 31 + ], 32 + "properties": { 33 + "clips": { 34 + "type": "array", 35 + "items": { 36 + "type": "ref", 37 + "ref": "social.clippr.feed.defs#clipView" 38 + }, 39 + "description": "An array of hydrated clip views" 40 + } 41 + } 42 + } 43 + } 44 + } 45 + } 46 + }
+67
lexdocs/social/clippr/feed/getProfileClips.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getProfileClips", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a view of a profile's reverse-chronological feed containing their clips. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "An actor to get feed data from" 18 + }, 19 + "limit": { 20 + "type": "integer", 21 + "minimum": 1, 22 + "maximum": 100, 23 + "default": 50, 24 + "description": "How many results to return with the query" 25 + }, 26 + "cursor": { 27 + "type": "string", 28 + "description": "A parameter to paginate results" 29 + }, 30 + "filter": { 31 + "type": "string", 32 + "knownValues": [ 33 + "all_clips", 34 + "tagged_clips", 35 + "untagged_clips" 36 + ], 37 + "default": "all_clips", 38 + "description": "What types of clips to include in response" 39 + } 40 + } 41 + }, 42 + "output": { 43 + "encoding": "application/json", 44 + "schema": { 45 + "type": "object", 46 + "required": [ 47 + "feed" 48 + ], 49 + "properties": { 50 + "cursor": { 51 + "type": "string", 52 + "description": "A parameter to paginate results" 53 + }, 54 + "feed": { 55 + "type": "array", 56 + "items": { 57 + "type": "ref", 58 + "ref": "social.clippr.feed.defs#clipView" 59 + }, 60 + "description": "An array of hydrated clip views" 61 + } 62 + } 63 + } 64 + } 65 + } 66 + } 67 + }
+57
lexdocs/social/clippr/feed/getProfileTags.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getProfileTags", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a view of a profile's reverse-chronological feed containing their tags. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "actor" 12 + ], 13 + "properties": { 14 + "actor": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "An actor to get feed data from" 18 + }, 19 + "limit": { 20 + "type": "integer", 21 + "minimum": 1, 22 + "maximum": 100, 23 + "default": 50, 24 + "description": "How many results to return with the query" 25 + }, 26 + "cursor": { 27 + "type": "string", 28 + "description": "A parameter to paginate results" 29 + } 30 + } 31 + }, 32 + "output": { 33 + "encoding": "application/json", 34 + "schema": { 35 + "type": "object", 36 + "required": [ 37 + "feed" 38 + ], 39 + "properties": { 40 + "cursor": { 41 + "type": "string", 42 + "description": "A parameter to paginate results" 43 + }, 44 + "feed": { 45 + "type": "array", 46 + "items": { 47 + "type": "ref", 48 + "ref": "social.clippr.feed.defs#tagView" 49 + }, 50 + "description": "An array of hydrated tag views" 51 + } 52 + } 53 + } 54 + } 55 + } 56 + } 57 + }
+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 + }
+39
lexdocs/social/clippr/feed/getTagList.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getTagList", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a user's list of tags. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": { 11 + "actor": { 12 + "type": "string", 13 + "format": "at-identifier", 14 + "description": "An actor to fetch the tag list from" 15 + } 16 + } 17 + }, 18 + "output": { 19 + "encoding": "application/json", 20 + "schema": { 21 + "type": "object", 22 + "required": [ 23 + "tags" 24 + ], 25 + "properties": { 26 + "tags": { 27 + "type": "array", 28 + "items": { 29 + "type": "ref", 30 + "ref": "social.clippr.feed.defs#tagView" 31 + }, 32 + "description": "A list of tags and their associated details" 33 + } 34 + } 35 + } 36 + } 37 + } 38 + } 39 + }
+46
lexdocs/social/clippr/feed/getTags.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.getTags", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get a list of tags. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "uris" 12 + ], 13 + "properties": { 14 + "uris": { 15 + "type": "array", 16 + "description": "List of tag AT-URIs to return hydrated views for", 17 + "items": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "maxLength": 25 22 + } 23 + } 24 + }, 25 + "output": { 26 + "encoding": "application/json", 27 + "schema": { 28 + "type": "object", 29 + "required": [ 30 + "tags" 31 + ], 32 + "properties": { 33 + "tags": { 34 + "type": "array", 35 + "items": { 36 + "type": "ref", 37 + "ref": "social.clippr.feed.defs#tagView" 38 + }, 39 + "description": "An array of hydrated tag views" 40 + } 41 + } 42 + } 43 + } 44 + } 45 + } 46 + }
+61
lexdocs/social/clippr/feed/searchClips.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.searchClips", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Find clips matching search criteria. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "q" 12 + ], 13 + "properties": { 14 + "q": { 15 + "type": "string", 16 + "description": "Search query string" 17 + }, 18 + "limit": { 19 + "type": "integer", 20 + "minimum": 1, 21 + "maximum": 100, 22 + "default": 25, 23 + "description": "How many clips to return in the query output" 24 + }, 25 + "actor": { 26 + "type": "string", 27 + "format": "at-identifier", 28 + "description": "An actor to filter results to" 29 + }, 30 + "cursor": { 31 + "type": "string", 32 + "description": "A parameter to paginate results" 33 + } 34 + } 35 + }, 36 + "output": { 37 + "encoding": "application/json", 38 + "schema": { 39 + "type": "object", 40 + "required": [ 41 + "clips" 42 + ], 43 + "properties": { 44 + "cursor": { 45 + "type": "string", 46 + "description": "A parameter to paginate results" 47 + }, 48 + "clips": { 49 + "type": "array", 50 + "items": { 51 + "type": "ref", 52 + "ref": "social.clippr.feed.defs#clipView" 53 + }, 54 + "description": "An array of hydrated clip views" 55 + } 56 + } 57 + } 58 + } 59 + } 60 + } 61 + }
+61
lexdocs/social/clippr/feed/searchTags.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.actor.searchTags", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Find tags matching search criteria. Does not require auth.", 8 + "parameters": { 9 + "type": "params", 10 + "required": [ 11 + "q" 12 + ], 13 + "properties": { 14 + "q": { 15 + "type": "string", 16 + "description": "Search query string" 17 + }, 18 + "limit": { 19 + "type": "integer", 20 + "minimum": 1, 21 + "maximum": 100, 22 + "default": 25, 23 + "description": "How many tags to return in the query output" 24 + }, 25 + "actor": { 26 + "type": "string", 27 + "format": "at-identifier", 28 + "description": "An actor to filter results to" 29 + }, 30 + "cursor": { 31 + "type": "string", 32 + "description": "A parameter to paginate results" 33 + } 34 + } 35 + }, 36 + "output": { 37 + "encoding": "application/json", 38 + "schema": { 39 + "type": "object", 40 + "required": [ 41 + "tags" 42 + ], 43 + "properties": { 44 + "cursor": { 45 + "type": "string", 46 + "description": "A parameter to paginate results" 47 + }, 48 + "tags": { 49 + "type": "array", 50 + "items": { 51 + "type": "ref", 52 + "ref": "social.clippr.feed.defs#tagView" 53 + }, 54 + "description": "An array of hydrated tag views" 55 + } 56 + } 57 + } 58 + } 59 + } 60 + } 61 + }
+43
lexdocs/social/clippr/feed/tag.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "social.clippr.feed.tag", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A record containing a bookmark tag for organization.", 8 + "key": "any", 9 + "record": { 10 + "type": "object", 11 + "required": [ 12 + "name", 13 + "createdAt" 14 + ], 15 + "properties": { 16 + "name": { 17 + "type": "string", 18 + "maxGraphemes": 64, 19 + "maxLength": 640, 20 + "description": "A de-duplicated string containing the name of the tag" 21 + }, 22 + "color": { 23 + "type": "string", 24 + "maxGraphemes": 7, 25 + "maxLength": 70, 26 + "description": "A hexadecimal color code" 27 + }, 28 + "description": { 29 + "type": "string", 30 + "maxGraphemes": 5000, 31 + "maxLength": 50000, 32 + "description": "A description of the tag for additional context" 33 + }, 34 + "createdAt": { 35 + "type": "string", 36 + "format": "datetime", 37 + "description": "A client-defined timestamp for the creation of the tag" 38 + } 39 + } 40 + } 41 + } 42 + } 43 + }
+46
lexicons/CHANGELOG.md
··· 1 + # changelog for @clipprjs/lexicons 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 + 18 + ## v1.0.0 19 + 20 + > this version should be considered as the starting point for a usable Lexicon API. previous versions should be ignored. 21 + 22 + * added search queries for clips, tags and profiles 23 + * added `social.clippr.actor.defs#preferences` with an accompanying query and procedure lexicon 24 + * added more inline documentation to previously existing lexicons 25 + * added query lexicons for having a clip and tag feed on a profile 26 + * added general query lexicons for at:// URIs linking to clips and tags 27 + 28 + ## v0.1.4 29 + 30 + * added length constraints to more strings in record lexicons 31 + 32 + ## v0.1.3 33 + 34 + * made `displayName` required for profile records 35 + 36 + ## v0.1.2 37 + 38 + * added npm tags.. i guess 39 + 40 + ## v0.1.1 41 + 42 + * something(?) 43 + 44 + ## v0.1.0 45 + 46 + * initial record and `social.clippr.actor.getProfile` query lexicons
+3 -5
lexicons/README.md
··· 2 2 3 3 Lexicon package auto-generated with `@atcute/lex-cli` 4 4 5 - > [!WARNING] 6 - > This package is *very* unstable. Lexicon attributes can be modified at any moment. 5 + > This package is *somewhat* unstable. Lexicon attributes can be modified at any moment. 7 6 > Please do not use this package for anything until the [Clippr server](https://tangled.sh/@hexmani.ac/clippr) has been 8 - > deployed. 7 + > deployed for either public or developer usage. 9 8 10 9 ## Usage 11 10 12 - > [!NOTE] 13 11 > This section has been shamelessly lifted from 14 12 > the [atcute definitions](https://github.com/mary-ext/atcute/tree/trunk/packages/definitions/bluesky) packages. We 15 13 > recommend using this package with other atcute libraries for maximum compatibility. ··· 60 58 import type {} from '@clipprjs/lexicons'; 61 59 ``` 62 60 63 - 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.
+27
lexicons/lex.config.js
··· 1 + /* 2 + * clippr: a social bookmarking service for the AT Protocol 3 + * Copyright (c) 2025 clippr contributors. 4 + * SPDX-License-Identifier: AGPL-3.0-only 5 + */ 6 + 7 + // @ts-ignore 8 + import {defineLexiconConfig} from "@atcute/lex-cli"; 9 + 10 + export default defineLexiconConfig({ 11 + files: ["../lexdocs/**/*.json"], 12 + outdir: "lib/lexicons", 13 + mappings: [ 14 + { 15 + nsid: ["com.atproto.*"], 16 + imports: (nsid) => { 17 + const specifier = nsid 18 + .slice("com.atproto.".length) 19 + .replaceAll(".", "/"); 20 + return { 21 + type: "namespace", 22 + from: `@atcute/atproto/types/${specifier}`, 23 + }; 24 + }, 25 + }, 26 + ], 27 + });
-27
lexicons/lex.config.ts
··· 1 - /* 2 - * clippr: a social bookmarking service for the AT Protocol 3 - * Copyright (c) 2025 clippr contributors. 4 - * SPDX-License-Identifier: AGPL-3.0-only 5 - */ 6 - 7 - // @ts-ignore 8 - import {defineLexiconConfig} from "@atcute/lex-cli"; 9 - 10 - export default defineLexiconConfig({ 11 - files: ["../lexdocs/**/*.json"], 12 - outdir: "lib/lexicons", 13 - mappings: [ 14 - { 15 - nsid: ["com.atproto.*"], 16 - imports: (nsid) => { 17 - const specifier = nsid 18 - .slice("com.atproto.".length) 19 - .replaceAll(".", "/"); 20 - return { 21 - type: "namespace", 22 - from: `@atcute/atproto/types/${specifier}`, 23 - }; 24 - }, 25 - }, 26 - ], 27 - });
+12 -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"; 2 + export * as SocialClipprActorGetPreferences from "./types/social/clippr/actor/getPreferences.js"; 8 3 export * as SocialClipprActorGetProfile from "./types/social/clippr/actor/getProfile.js"; 9 4 export * as SocialClipprActorProfile from "./types/social/clippr/actor/profile.js"; 5 + export * as SocialClipprActorPutPreferences from "./types/social/clippr/actor/putPreferences.js"; 6 + export * as SocialClipprActorSearchClips from "./types/social/clippr/actor/searchClips.js"; 7 + export * as SocialClipprActorSearchProfiles from "./types/social/clippr/actor/searchProfiles.js"; 8 + export * as SocialClipprActorSearchTags from "./types/social/clippr/actor/searchTags.js"; 10 9 export * as SocialClipprFeedClip from "./types/social/clippr/feed/clip.js"; 10 + export * as SocialClipprFeedDefs from "./types/social/clippr/feed/defs.js"; 11 + export * as SocialClipprFeedGetClips from "./types/social/clippr/feed/getClips.js"; 12 + export * as SocialClipprFeedGetProfileClips from "./types/social/clippr/feed/getProfileClips.js"; 13 + export * as SocialClipprFeedGetProfileTags from "./types/social/clippr/feed/getProfileTags.js"; 14 + export * as SocialClipprFeedGetTagClips from "./types/social/clippr/feed/getTagClips.js"; 15 + export * as SocialClipprFeedGetTagList from "./types/social/clippr/feed/getTagList.js"; 16 + export * as SocialClipprFeedGetTags from "./types/social/clippr/feed/getTags.js"; 11 17 export * as SocialClipprFeedTag from "./types/social/clippr/feed/tag.js";
+40 -29
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 - 1 + import type {} from "@atcute/lexicons"; 7 2 import * as v from "@atcute/lexicons/validations"; 8 3 4 + const _preferencesSchema = /*#__PURE__*/ v.array(() => { 5 + return /*#__PURE__*/ v.variant([publishingScopesPrefSchema]); 6 + }); 9 7 const _profileViewSchema = /*#__PURE__*/ v.object({ 10 - $type: /*#__PURE__*/ v.optional( 11 - /*#__PURE__*/ v.literal("social.clippr.actor.defs#profileView"), 12 - ), 13 - avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 14 - createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 15 - description: /*#__PURE__*/ v.optional( 16 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 - /*#__PURE__*/ v.stringLength(0, 5000), 18 - /*#__PURE__*/ v.stringGraphemes(0, 500), 19 - ]), 20 - ), 21 - did: /*#__PURE__*/ v.didString(), 22 - displayName: /*#__PURE__*/ v.optional( 23 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 24 - /*#__PURE__*/ v.stringLength(0, 640), 25 - /*#__PURE__*/ v.stringGraphemes(0, 64), 26 - ]), 27 - ), 28 - handle: /*#__PURE__*/ v.handleString(), 8 + $type: /*#__PURE__*/ v.optional( 9 + /*#__PURE__*/ v.literal("social.clippr.actor.defs#profileView"), 10 + ), 11 + avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 12 + createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 13 + description: /*#__PURE__*/ v.optional( 14 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 15 + /*#__PURE__*/ v.stringLength(0, 5000), 16 + /*#__PURE__*/ v.stringGraphemes(0, 500), 17 + ]), 18 + ), 19 + did: /*#__PURE__*/ v.didString(), 20 + displayName: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 21 + /*#__PURE__*/ v.stringLength(0, 640), 22 + /*#__PURE__*/ v.stringGraphemes(0, 64), 23 + ]), 24 + handle: /*#__PURE__*/ v.handleString(), 25 + }); 26 + const _publishingScopesPrefSchema = /*#__PURE__*/ v.object({ 27 + $type: /*#__PURE__*/ v.optional( 28 + /*#__PURE__*/ v.literal("social.clippr.actor.defs#publishingScopesPref"), 29 + ), 30 + defaultScope: /*#__PURE__*/ v.string<"public" | "unlisted" | (string & {})>(), 29 31 }); 30 32 33 + type preferences$schematype = typeof _preferencesSchema; 31 34 type profileView$schematype = typeof _profileViewSchema; 35 + type publishingScopesPref$schematype = typeof _publishingScopesPrefSchema; 32 36 33 - export interface profileViewSchema extends profileView$schematype { 34 - } 37 + export interface preferencesSchema extends preferences$schematype {} 38 + export interface profileViewSchema extends profileView$schematype {} 39 + export interface publishingScopesPrefSchema 40 + extends publishingScopesPref$schematype {} 35 41 42 + export const preferencesSchema = _preferencesSchema as preferencesSchema; 36 43 export const profileViewSchema = _profileViewSchema as profileViewSchema; 44 + export const publishingScopesPrefSchema = 45 + _publishingScopesPrefSchema as publishingScopesPrefSchema; 37 46 38 - export interface ProfileView extends v.InferInput<typeof profileViewSchema> { 39 - } 47 + export interface Preferences extends v.InferInput<typeof preferencesSchema> {} 48 + export interface ProfileView extends v.InferInput<typeof profileViewSchema> {} 49 + export interface PublishingScopesPref 50 + extends v.InferInput<typeof publishingScopesPrefSchema> {}
+34
lexicons/lib/lexicons/types/social/clippr/actor/getPreferences.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 SocialClipprActorDefs from "./defs.js"; 5 + 6 + const _mainSchema = /*#__PURE__*/ v.query( 7 + "social.clippr.actor.getPreferences", 8 + { 9 + params: /*#__PURE__*/ v.object({}), 10 + output: { 11 + type: "lex", 12 + schema: /*#__PURE__*/ v.object({ 13 + get preferences() { 14 + return SocialClipprActorDefs.preferencesSchema; 15 + }, 16 + }), 17 + }, 18 + }, 19 + ); 20 + 21 + type main$schematype = typeof _mainSchema; 22 + 23 + export interface mainSchema extends main$schematype {} 24 + 25 + export const mainSchema = _mainSchema as mainSchema; 26 + 27 + export interface $params extends v.InferInput<mainSchema["params"]> {} 28 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 29 + 30 + declare module "@atcute/lexicons/ambient" { 31 + interface XRPCQueries { 32 + "social.clippr.actor.getPreferences": mainSchema; 33 + } 34 + }
+15 -21
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 - 1 + import type {} from "@atcute/lexicons"; 7 2 import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 8 4 import * as SocialClipprActorDefs from "./defs.js"; 9 5 10 6 const _mainSchema = /*#__PURE__*/ v.query("social.clippr.actor.getProfile", { 11 - params: /*#__PURE__*/ v.object({ 12 - actor: /*#__PURE__*/ v.actorIdentifierString(), 13 - }), 14 - output: { 15 - type: "lex", 16 - get schema() { 17 - return SocialClipprActorDefs.profileViewSchema; 18 - }, 7 + params: /*#__PURE__*/ v.object({ 8 + actor: /*#__PURE__*/ v.actorIdentifierString(), 9 + }), 10 + output: { 11 + type: "lex", 12 + get schema() { 13 + return SocialClipprActorDefs.profileViewSchema; 19 14 }, 15 + }, 20 16 }); 21 17 22 18 type main$schematype = typeof _mainSchema; 23 19 24 - export interface mainSchema extends main$schematype { 25 - } 20 + export interface mainSchema extends main$schematype {} 26 21 27 22 export const mainSchema = _mainSchema as mainSchema; 28 23 29 - export interface $params extends v.InferInput<mainSchema["params"]> { 30 - } 24 + export interface $params extends v.InferInput<mainSchema["params"]> {} 31 25 export type $output = v.InferXRPCBodyInput<mainSchema["output"]>; 32 26 33 27 declare module "@atcute/lexicons/ambient" { 34 - interface XRPCQueries { 35 - "social.clippr.actor.getProfile": mainSchema; 36 - } 28 + interface XRPCQueries { 29 + "social.clippr.actor.getProfile": mainSchema; 30 + } 37 31 }
+23 -29
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 - 1 + import type {} from "@atcute/lexicons"; 7 2 import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 8 4 9 5 const _mainSchema = /*#__PURE__*/ v.record( 10 - /*#__PURE__*/ v.literal("self"), 11 - /*#__PURE__*/ v.object({ 12 - $type: /*#__PURE__*/ v.literal("social.clippr.actor.profile"), 13 - avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.blob()), 14 - createdAt: /*#__PURE__*/ v.datetimeString(), 15 - description: /*#__PURE__*/ v.optional( 16 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 - /*#__PURE__*/ v.stringLength(0, 5000), 18 - /*#__PURE__*/ v.stringGraphemes(0, 500), 19 - ]), 20 - ), 21 - displayName: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 22 - /*#__PURE__*/ v.stringLength(0, 640), 23 - /*#__PURE__*/ v.stringGraphemes(0, 64), 24 - ]), 25 - }), 6 + /*#__PURE__*/ v.literal("self"), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("social.clippr.actor.profile"), 9 + avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.blob()), 10 + createdAt: /*#__PURE__*/ v.datetimeString(), 11 + description: /*#__PURE__*/ v.optional( 12 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 13 + /*#__PURE__*/ v.stringLength(0, 5000), 14 + /*#__PURE__*/ v.stringGraphemes(0, 500), 15 + ]), 16 + ), 17 + displayName: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 18 + /*#__PURE__*/ v.stringLength(0, 640), 19 + /*#__PURE__*/ v.stringGraphemes(0, 64), 20 + ]), 21 + }), 26 22 ); 27 23 28 24 type main$schematype = typeof _mainSchema; 29 25 30 - export interface mainSchema extends main$schematype { 31 - } 26 + export interface mainSchema extends main$schematype {} 32 27 33 28 export const mainSchema = _mainSchema as mainSchema; 34 29 35 - export interface Main extends v.InferInput<typeof mainSchema> { 36 - } 30 + export interface Main extends v.InferInput<typeof mainSchema> {} 37 31 38 32 declare module "@atcute/lexicons/ambient" { 39 - interface Records { 40 - "social.clippr.actor.profile": mainSchema; 41 - } 33 + interface Records { 34 + "social.clippr.actor.profile": mainSchema; 35 + } 42 36 }
+35
lexicons/lib/lexicons/types/social/clippr/actor/putPreferences.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 SocialClipprActorDefs from "./defs.js"; 5 + 6 + const _mainSchema = /*#__PURE__*/ v.procedure( 7 + "social.clippr.actor.putPreferences", 8 + { 9 + params: null, 10 + input: { 11 + type: "lex", 12 + schema: /*#__PURE__*/ v.object({ 13 + get preferences() { 14 + return SocialClipprActorDefs.preferencesSchema; 15 + }, 16 + }), 17 + }, 18 + output: null, 19 + }, 20 + ); 21 + 22 + type main$schematype = typeof _mainSchema; 23 + 24 + export interface mainSchema extends main$schematype {} 25 + 26 + export const mainSchema = _mainSchema as mainSchema; 27 + 28 + export interface $params {} 29 + export interface $input extends v.InferXRPCBodyInput<mainSchema["input"]> {} 30 + 31 + declare module "@atcute/lexicons/ambient" { 32 + interface XRPCProcedures { 33 + "social.clippr.actor.putPreferences": mainSchema; 34 + } 35 + }
+42
lexicons/lib/lexicons/types/social/clippr/actor/searchClips.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 "../feed/defs.js"; 5 + 6 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.actor.searchClips", { 7 + params: /*#__PURE__*/ v.object({ 8 + actor: /*#__PURE__*/ v.optional(/*#__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, 100), 13 + ]), 14 + 25, 15 + ), 16 + q: /*#__PURE__*/ v.string(), 17 + }), 18 + output: { 19 + type: "lex", 20 + schema: /*#__PURE__*/ v.object({ 21 + get clips() { 22 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.clipViewSchema); 23 + }, 24 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 25 + }), 26 + }, 27 + }); 28 + 29 + type main$schematype = typeof _mainSchema; 30 + 31 + export interface mainSchema extends main$schematype {} 32 + 33 + export const mainSchema = _mainSchema as mainSchema; 34 + 35 + export interface $params extends v.InferInput<mainSchema["params"]> {} 36 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 37 + 38 + declare module "@atcute/lexicons/ambient" { 39 + interface XRPCQueries { 40 + "social.clippr.actor.searchClips": mainSchema; 41 + } 42 + }
+44
lexicons/lib/lexicons/types/social/clippr/actor/searchProfiles.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 SocialClipprActorDefs from "./defs.js"; 5 + 6 + const _mainSchema = /*#__PURE__*/ v.query( 7 + "social.clippr.actor.searchProfiles", 8 + { 9 + params: /*#__PURE__*/ v.object({ 10 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 11 + limit: /*#__PURE__*/ v.optional( 12 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 13 + /*#__PURE__*/ v.integerRange(1, 100), 14 + ]), 15 + 25, 16 + ), 17 + q: /*#__PURE__*/ v.string(), 18 + }), 19 + output: { 20 + type: "lex", 21 + schema: /*#__PURE__*/ v.object({ 22 + get actors() { 23 + return /*#__PURE__*/ v.array(SocialClipprActorDefs.profileViewSchema); 24 + }, 25 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 26 + }), 27 + }, 28 + }, 29 + ); 30 + 31 + type main$schematype = typeof _mainSchema; 32 + 33 + export interface mainSchema extends main$schematype {} 34 + 35 + export const mainSchema = _mainSchema as mainSchema; 36 + 37 + export interface $params extends v.InferInput<mainSchema["params"]> {} 38 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 39 + 40 + declare module "@atcute/lexicons/ambient" { 41 + interface XRPCQueries { 42 + "social.clippr.actor.searchProfiles": mainSchema; 43 + } 44 + }
+42
lexicons/lib/lexicons/types/social/clippr/actor/searchTags.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 "../feed/defs.js"; 5 + 6 + const _mainSchema = /*#__PURE__*/ v.query("social.clippr.actor.searchTags", { 7 + params: /*#__PURE__*/ v.object({ 8 + actor: /*#__PURE__*/ v.optional(/*#__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, 100), 13 + ]), 14 + 25, 15 + ), 16 + q: /*#__PURE__*/ v.string(), 17 + }), 18 + output: { 19 + type: "lex", 20 + schema: /*#__PURE__*/ v.object({ 21 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 22 + get tags() { 23 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.tagViewSchema); 24 + }, 25 + }), 26 + }, 27 + }); 28 + 29 + type main$schematype = typeof _mainSchema; 30 + 31 + export interface mainSchema extends main$schematype {} 32 + 33 + export const mainSchema = _mainSchema as mainSchema; 34 + 35 + export interface $params extends v.InferInput<mainSchema["params"]> {} 36 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 37 + 38 + declare module "@atcute/lexicons/ambient" { 39 + interface XRPCQueries { 40 + "social.clippr.actor.searchTags": mainSchema; 41 + } 42 + }
+43 -49
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 - 1 + import type {} from "@atcute/lexicons"; 7 2 import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 8 4 import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 9 5 10 6 const _mainSchema = /*#__PURE__*/ v.record( 11 - /*#__PURE__*/ v.string(), 12 - /*#__PURE__*/ v.object({ 13 - $type: /*#__PURE__*/ v.literal("social.clippr.feed.clip"), 14 - createdAt: /*#__PURE__*/ v.datetimeString(), 15 - description: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 16 - /*#__PURE__*/ v.stringLength(0, 40960), 17 - /*#__PURE__*/ v.stringGraphemes(0, 4096), 18 - ]), 19 - languages: /*#__PURE__*/ v.optional( 20 - /*#__PURE__*/ v.constrain( 21 - /*#__PURE__*/ v.array(/*#__PURE__*/ v.languageCodeString()), 22 - [/*#__PURE__*/ v.arrayLength(0, 5)], 23 - ), 24 - ), 25 - notes: /*#__PURE__*/ v.optional( 26 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 27 - /*#__PURE__*/ v.stringLength(0, 100000), 28 - /*#__PURE__*/ v.stringGraphemes(0, 10000), 29 - ]), 30 - ), 31 - get tags() { 32 - return /*#__PURE__*/ v.optional( 33 - /*#__PURE__*/ v.array(ComAtprotoRepoStrongRef.mainSchema), 34 - ); 35 - }, 36 - title: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 37 - /*#__PURE__*/ v.stringLength(0, 20480), 38 - /*#__PURE__*/ v.stringGraphemes(0, 2048), 39 - ]), 40 - unlisted: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), false), 41 - unread: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), true), 42 - url: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 - /*#__PURE__*/ v.stringLength(0, 20000), 44 - /*#__PURE__*/ v.stringGraphemes(0, 2000), 45 - ]), 46 - }), 7 + /*#__PURE__*/ v.string(), 8 + /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.literal("social.clippr.feed.clip"), 10 + createdAt: /*#__PURE__*/ v.datetimeString(), 11 + description: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 12 + /*#__PURE__*/ v.stringLength(0, 40960), 13 + /*#__PURE__*/ v.stringGraphemes(0, 4096), 14 + ]), 15 + languages: /*#__PURE__*/ v.optional( 16 + /*#__PURE__*/ v.constrain( 17 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.languageCodeString()), 18 + [/*#__PURE__*/ v.arrayLength(0, 5)], 19 + ), 20 + ), 21 + notes: /*#__PURE__*/ v.optional( 22 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 23 + /*#__PURE__*/ v.stringLength(0, 100000), 24 + /*#__PURE__*/ v.stringGraphemes(0, 10000), 25 + ]), 26 + ), 27 + get tags() { 28 + return /*#__PURE__*/ v.optional( 29 + /*#__PURE__*/ v.array(ComAtprotoRepoStrongRef.mainSchema), 30 + ); 31 + }, 32 + title: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 33 + /*#__PURE__*/ v.stringLength(0, 20480), 34 + /*#__PURE__*/ v.stringGraphemes(0, 2048), 35 + ]), 36 + unlisted: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), false), 37 + unread: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean(), true), 38 + url: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.genericUriString(), [ 39 + /*#__PURE__*/ v.stringLength(0, 20000), 40 + /*#__PURE__*/ v.stringGraphemes(0, 2000), 41 + ]), 42 + }), 47 43 ); 48 44 49 45 type main$schematype = typeof _mainSchema; 50 46 51 - export interface mainSchema extends main$schematype { 52 - } 47 + export interface mainSchema extends main$schematype {} 53 48 54 49 export const mainSchema = _mainSchema as mainSchema; 55 50 56 - export interface Main extends v.InferInput<typeof mainSchema> { 57 - } 51 + export interface Main extends v.InferInput<typeof mainSchema> {} 58 52 59 53 declare module "@atcute/lexicons/ambient" { 60 - interface Records { 61 - "social.clippr.feed.clip": mainSchema; 62 - } 54 + interface Records { 55 + "social.clippr.feed.clip": mainSchema; 56 + } 63 57 }
+40
lexicons/lib/lexicons/types/social/clippr/feed/defs.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import * as SocialClipprActorDefs from "../actor/defs.js"; 4 + 5 + const _clipViewSchema = /*#__PURE__*/ v.object({ 6 + $type: /*#__PURE__*/ v.optional( 7 + /*#__PURE__*/ v.literal("social.clippr.feed.defs#clipView"), 8 + ), 9 + get author() { 10 + return SocialClipprActorDefs.profileViewSchema; 11 + }, 12 + cid: /*#__PURE__*/ v.cidString(), 13 + indexedAt: /*#__PURE__*/ v.datetimeString(), 14 + record: /*#__PURE__*/ v.unknown(), 15 + uri: /*#__PURE__*/ v.resourceUriString(), 16 + }); 17 + const _tagViewSchema = /*#__PURE__*/ v.object({ 18 + $type: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.literal("social.clippr.feed.defs#tagView"), 20 + ), 21 + get author() { 22 + return SocialClipprActorDefs.profileViewSchema; 23 + }, 24 + cid: /*#__PURE__*/ v.cidString(), 25 + indexedAt: /*#__PURE__*/ v.datetimeString(), 26 + record: /*#__PURE__*/ v.unknown(), 27 + uri: /*#__PURE__*/ v.resourceUriString(), 28 + }); 29 + 30 + type clipView$schematype = typeof _clipViewSchema; 31 + type tagView$schematype = typeof _tagViewSchema; 32 + 33 + export interface clipViewSchema extends clipView$schematype {} 34 + export interface tagViewSchema extends tagView$schematype {} 35 + 36 + export const clipViewSchema = _clipViewSchema as clipViewSchema; 37 + export const tagViewSchema = _tagViewSchema as tagViewSchema; 38 + 39 + export interface ClipView extends v.InferInput<typeof clipViewSchema> {} 40 + export interface TagView extends v.InferInput<typeof tagViewSchema> {}
+36
lexicons/lib/lexicons/types/social/clippr/feed/getClips.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.getClips", { 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 clips() { 17 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.clipViewSchema); 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.getClips": mainSchema; 35 + } 36 + }
+50
lexicons/lib/lexicons/types/social/clippr/feed/getProfileClips.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( 7 + "social.clippr.feed.getProfileClips", 8 + { 9 + params: /*#__PURE__*/ v.object({ 10 + actor: /*#__PURE__*/ v.actorIdentifierString(), 11 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 12 + filter: /*#__PURE__*/ v.optional( 13 + /*#__PURE__*/ v.string< 14 + "all_clips" | "tagged_clips" | "untagged_clips" | (string & {}) 15 + >(), 16 + "all_clips", 17 + ), 18 + limit: /*#__PURE__*/ v.optional( 19 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ 20 + /*#__PURE__*/ v.integerRange(1, 100), 21 + ]), 22 + 50, 23 + ), 24 + }), 25 + output: { 26 + type: "lex", 27 + schema: /*#__PURE__*/ v.object({ 28 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 29 + get feed() { 30 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.clipViewSchema); 31 + }, 32 + }), 33 + }, 34 + }, 35 + ); 36 + 37 + type main$schematype = typeof _mainSchema; 38 + 39 + export interface mainSchema extends main$schematype {} 40 + 41 + export const mainSchema = _mainSchema as mainSchema; 42 + 43 + export interface $params extends v.InferInput<mainSchema["params"]> {} 44 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 45 + 46 + declare module "@atcute/lexicons/ambient" { 47 + interface XRPCQueries { 48 + "social.clippr.feed.getProfileClips": mainSchema; 49 + } 50 + }
+41
lexicons/lib/lexicons/types/social/clippr/feed/getProfileTags.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.getProfileTags", { 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, 100), 13 + ]), 14 + 50, 15 + ), 16 + }), 17 + output: { 18 + type: "lex", 19 + schema: /*#__PURE__*/ v.object({ 20 + cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 21 + get feed() { 22 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.tagViewSchema); 23 + }, 24 + }), 25 + }, 26 + }); 27 + 28 + type main$schematype = typeof _mainSchema; 29 + 30 + export interface mainSchema extends main$schematype {} 31 + 32 + export const mainSchema = _mainSchema as mainSchema; 33 + 34 + export interface $params extends v.InferInput<mainSchema["params"]> {} 35 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 36 + 37 + declare module "@atcute/lexicons/ambient" { 38 + interface XRPCQueries { 39 + "social.clippr.feed.getProfileTags": mainSchema; 40 + } 41 + }
+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 + }
+33
lexicons/lib/lexicons/types/social/clippr/feed/getTagList.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.getTagList", { 7 + params: /*#__PURE__*/ v.object({ 8 + actor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), 9 + }), 10 + output: { 11 + type: "lex", 12 + schema: /*#__PURE__*/ v.object({ 13 + get tags() { 14 + return /*#__PURE__*/ v.array(SocialClipprFeedDefs.tagViewSchema); 15 + }, 16 + }), 17 + }, 18 + }); 19 + 20 + type main$schematype = typeof _mainSchema; 21 + 22 + export interface mainSchema extends main$schematype {} 23 + 24 + export const mainSchema = _mainSchema as mainSchema; 25 + 26 + export interface $params extends v.InferInput<mainSchema["params"]> {} 27 + export interface $output extends v.InferXRPCBodyInput<mainSchema["output"]> {} 28 + 29 + declare module "@atcute/lexicons/ambient" { 30 + interface XRPCQueries { 31 + "social.clippr.feed.getTagList": mainSchema; 32 + } 33 + }
+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 + }
+28 -28
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 - 1 + import type {} from "@atcute/lexicons"; 7 2 import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 8 4 9 5 const _mainSchema = /*#__PURE__*/ v.record( 10 - /*#__PURE__*/ v.string(), 11 - /*#__PURE__*/ v.object({ 12 - $type: /*#__PURE__*/ v.literal("social.clippr.feed.tag"), 13 - color: /*#__PURE__*/ v.optional( 14 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 15 - /*#__PURE__*/ v.stringLength(0, 70), 16 - /*#__PURE__*/ v.stringGraphemes(0, 7), 17 - ]), 18 - ), 19 - createdAt: /*#__PURE__*/ v.datetimeString(), 20 - name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 21 - /*#__PURE__*/ v.stringLength(0, 640), 22 - /*#__PURE__*/ v.stringGraphemes(0, 64), 23 - ]), 24 - }), 6 + /*#__PURE__*/ v.string(), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("social.clippr.feed.tag"), 9 + color: /*#__PURE__*/ v.optional( 10 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 11 + /*#__PURE__*/ v.stringLength(0, 70), 12 + /*#__PURE__*/ v.stringGraphemes(0, 7), 13 + ]), 14 + ), 15 + createdAt: /*#__PURE__*/ v.datetimeString(), 16 + description: /*#__PURE__*/ v.optional( 17 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 18 + /*#__PURE__*/ v.stringLength(0, 50000), 19 + /*#__PURE__*/ v.stringGraphemes(0, 5000), 20 + ]), 21 + ), 22 + name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 23 + /*#__PURE__*/ v.stringLength(0, 640), 24 + /*#__PURE__*/ v.stringGraphemes(0, 64), 25 + ]), 26 + }), 25 27 ); 26 28 27 29 type main$schematype = typeof _mainSchema; 28 30 29 - export interface mainSchema extends main$schematype { 30 - } 31 + export interface mainSchema extends main$schematype {} 31 32 32 33 export const mainSchema = _mainSchema as mainSchema; 33 34 34 - export interface Main extends v.InferInput<typeof mainSchema> { 35 - } 35 + export interface Main extends v.InferInput<typeof mainSchema> {} 36 36 37 37 declare module "@atcute/lexicons/ambient" { 38 - interface Records { 39 - "social.clippr.feed.tag": mainSchema; 40 - } 38 + interface Records { 39 + "social.clippr.feed.tag": mainSchema; 40 + } 41 41 }
+6 -6
lexicons/package.json
··· 1 1 { 2 2 "type": "module", 3 3 "name": "@clipprjs/lexicons", 4 - "version": "0.1.3", 4 + "version": "1.0.3", 5 5 "description": "Clippr schema definitions", 6 6 "license": "AGPL-3.0-only", 7 7 "private": false, ··· 21 21 ], 22 22 "exports": { 23 23 ".": "./dist/index.js", 24 - "./types/social/clippr/*": "./dist/lexicons/types/social/clippr/*.js" 24 + "./types/*": "./dist/lexicons/types/social/clippr/*.js" 25 25 }, 26 26 "scripts": { 27 27 "build": "tsc --project tsconfig.json", 28 - "generate": "rm -r lib/lexicons; lex-cli generate -c ./lex.config.ts", 28 + "generate": "rm -r lib/lexicons; lex-cli generate -c lex.config.js", 29 29 "prepublish": "rm -rf dist; pnpm run build" 30 30 }, 31 31 "dependencies": { 32 - "@atcute/atproto": "^3.1.0", 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: {}