an atproto based link aggregator
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial commit: papili.one ATProto link aggregator

- SvelteKit app with Fly.io deployment (SQLite + persistent volume)
- ATProto OAuth authentication with granular scopes
- Lexicons for posts and comments (one.papili.post, one.papili.comment)
- Base ATProto and Bluesky lexicons installed via @atproto/lex
- Avatar component with profile fetching from Bluesky API
- Drizzle ORM for database with auth state/session storage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Austin Parker 7f259537

+10054
+1
.env.example
··· 1 + DATABASE_URL=file:local.db
+33
.gitignore
··· 1 + node_modules 2 + 3 + # Output 4 + .output 5 + .vercel 6 + .netlify 7 + .wrangler 8 + /.svelte-kit 9 + /build 10 + 11 + # OS 12 + .DS_Store 13 + Thumbs.db 14 + 15 + # Env 16 + .env 17 + .env.* 18 + !.env.example 19 + !.env.test 20 + 21 + # Vite 22 + vite.config.js.timestamp-* 23 + vite.config.ts.timestamp-* 24 + 25 + # Local config 26 + .mcp.json 27 + 28 + # SQLite / Data 29 + *.db 30 + /data/ 31 + 32 + # Generated lexicon types 33 + /src/lib/lexicons/
+2
.npmrc
··· 1 + engine-strict=true 2 + onlyBuiltDependencies[]=better-sqlite3
+1
.pnpm-allowed-builds
··· 1 + better-sqlite3
+10
.prettierignore
··· 1 + # Package Managers 2 + package-lock.json 3 + pnpm-lock.yaml 4 + yarn.lock 5 + bun.lock 6 + bun.lockb 7 + 8 + # Miscellaneous 9 + /static/ 10 + /drizzle/
+17
.prettierrc
··· 1 + { 2 + "useTabs": true, 3 + "singleQuote": true, 4 + "trailingComma": "none", 5 + "printWidth": 100, 6 + "plugins": [ 7 + "prettier-plugin-svelte" 8 + ], 9 + "overrides": [ 10 + { 11 + "files": "*.svelte", 12 + "options": { 13 + "parser": "svelte" 14 + } 15 + } 16 + ] 17 + }
+70
CLAUDE.md
··· 1 + # papili.one 2 + 3 + ATProto-based link aggregator built with SvelteKit + Cloudflare. 4 + 5 + ## Commands 6 + 7 + ```bash 8 + # Package manager: pnpm (NOT npm) 9 + pnpm install # Install dependencies 10 + pnpm dev # Start dev server (no D1, basic testing) 11 + pnpm dev:wrangler # Start dev with D1 bindings (for auth testing) 12 + pnpm build # Build for production 13 + pnpm preview # Preview production build 14 + pnpm check # Type check 15 + pnpm test # Run tests once 16 + pnpm test:unit # Run tests in watch mode 17 + pnpm lint # Check formatting + linting 18 + pnpm format # Auto-format code 19 + 20 + # Database (D1) 21 + pnpm db:local # Create local D1 tables 22 + pnpm db:push # Push schema to database 23 + pnpm db:generate # Generate migrations 24 + pnpm db:migrate # Run migrations 25 + pnpm db:studio # Open Drizzle Studio 26 + 27 + # Cloudflare 28 + pnpm wrangler d1 create papili-db # Create D1 database (first time, needs CF auth) 29 + pnpm wrangler pages deploy # Deploy to Cloudflare Pages 30 + ``` 31 + 32 + ## Local Development with Auth 33 + 34 + ATProto OAuth requires `127.0.0.1` (not localhost). To test auth locally: 35 + 36 + 1. Run `pnpm db:local` to create tables 37 + 2. Run `pnpm dev:wrangler` to start with D1 bindings 38 + 3. Visit `http://127.0.0.1:5173` (NOT localhost) 39 + 40 + ## Key Files 41 + 42 + - `wrangler.toml` - Cloudflare config (D1 binding) 43 + - `src/lib/server/db/schema.ts` - Database schema 44 + - `docs/implementation_plan.md` - Full implementation roadmap 45 + 46 + --- 47 + 48 + You are able to use the Svelte MCP server, where you have access to comprehensive Svelte 5 and SvelteKit documentation. Here's how to use the available tools effectively: 49 + 50 + ## Available MCP Tools: 51 + 52 + ### 1. list-sections 53 + 54 + Use this FIRST to discover all available documentation sections. Returns a structured list with titles, use_cases, and paths. 55 + When asked about Svelte or SvelteKit topics, ALWAYS use this tool at the start of the chat to find relevant sections. 56 + 57 + ### 2. get-documentation 58 + 59 + Retrieves full documentation content for specific sections. Accepts single or multiple sections. 60 + After calling the list-sections tool, you MUST analyze the returned documentation sections (especially the use_cases field) and then use the get-documentation tool to fetch ALL documentation sections that are relevant for the user's task. 61 + 62 + ### 3. svelte-autofixer 63 + 64 + Analyzes Svelte code and returns issues and suggestions. 65 + You MUST use this tool whenever writing Svelte code before sending it to the user. Keep calling it until no issues or suggestions are returned. 66 + 67 + ### 4. playground-link 68 + 69 + Generates a Svelte Playground link with the provided code. 70 + After completing the code, ask the user if they want a playground link. Only call this tool after user confirmation and NEVER if code was written to files in their project.
+34
Dockerfile
··· 1 + FROM node:22-slim AS base 2 + ENV PNPM_HOME="/pnpm" 3 + ENV PATH="$PNPM_HOME:$PATH" 4 + RUN corepack enable 5 + 6 + WORKDIR /app 7 + 8 + # Build stage 9 + FROM base AS build 10 + 11 + COPY package.json pnpm-lock.yaml ./ 12 + RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile 13 + 14 + COPY . . 15 + RUN pnpm build 16 + RUN pnpm prune --prod 17 + 18 + # Production stage 19 + FROM base AS production 20 + 21 + COPY --from=build /app/build ./build 22 + COPY --from=build /app/node_modules ./node_modules 23 + COPY --from=build /app/package.json ./ 24 + COPY --from=build /app/drizzle ./drizzle 25 + 26 + # Create data directory (will be mounted from Fly volume) 27 + RUN mkdir -p /data 28 + 29 + ENV NODE_ENV=production 30 + ENV PORT=3000 31 + ENV DATABASE_PATH=/data/papili.db 32 + 33 + EXPOSE 3000 34 + CMD ["node", "build"]
+38
README.md
··· 1 + # sv 2 + 3 + Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). 4 + 5 + ## Creating a project 6 + 7 + If you're seeing this, you've probably already done this step. Congrats! 8 + 9 + ```sh 10 + # create a new project in the current directory 11 + npx sv create 12 + 13 + # create a new project in my-app 14 + npx sv create my-app 15 + ``` 16 + 17 + ## Developing 18 + 19 + Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 + 21 + ```sh 22 + npm run dev 23 + 24 + # or start the server and open the app in a new browser tab 25 + npm run dev -- --open 26 + ``` 27 + 28 + ## Building 29 + 30 + To create a production version of your app: 31 + 32 + ```sh 33 + npm run build 34 + ``` 35 + 36 + You can preview the production build with `npm run preview`. 37 + 38 + > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
+10
drizzle.config.ts
··· 1 + import { defineConfig } from 'drizzle-kit'; 2 + 3 + export default defineConfig({ 4 + schema: './src/lib/server/db/schema.ts', 5 + out: './drizzle', 6 + dialect: 'sqlite', 7 + dbCredentials: { 8 + url: process.env.DATABASE_PATH || './data/papili.db' 9 + } 10 + });
+27
drizzle/0001_initial.sql
··· 1 + -- Initial schema for papili.one 2 + -- Auth tables 3 + 4 + CREATE TABLE IF NOT EXISTS auth_state ( 5 + key TEXT PRIMARY KEY, 6 + state TEXT NOT NULL, 7 + created_at TEXT NOT NULL 8 + ); 9 + 10 + CREATE TABLE IF NOT EXISTS auth_session ( 11 + key TEXT PRIMARY KEY, 12 + session TEXT NOT NULL, 13 + created_at TEXT NOT NULL, 14 + updated_at TEXT NOT NULL 15 + ); 16 + 17 + CREATE TABLE IF NOT EXISTS accounts ( 18 + did TEXT PRIMARY KEY, 19 + handle TEXT, 20 + active INTEGER NOT NULL DEFAULT 1, 21 + status TEXT, 22 + updated_at TEXT NOT NULL 23 + ); 24 + 25 + -- Indexes 26 + CREATE INDEX IF NOT EXISTS idx_auth_state_created ON auth_state(created_at); 27 + CREATE INDEX IF NOT EXISTS idx_accounts_handle ON accounts(handle);
+43
eslint.config.js
··· 1 + import prettier from 'eslint-config-prettier'; 2 + import { fileURLToPath } from 'node:url'; 3 + import { includeIgnoreFile } from '@eslint/compat'; 4 + import js from '@eslint/js'; 5 + import svelte from 'eslint-plugin-svelte'; 6 + import { defineConfig } from 'eslint/config'; 7 + import globals from 'globals'; 8 + import ts from 'typescript-eslint'; 9 + import svelteConfig from './svelte.config.js'; 10 + 11 + const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); 12 + 13 + export default defineConfig( 14 + includeIgnoreFile(gitignorePath), 15 + js.configs.recommended, 16 + ...ts.configs.recommended, 17 + ...svelte.configs.recommended, 18 + prettier, 19 + ...svelte.configs.prettier, 20 + { 21 + languageOptions: { 22 + globals: { ...globals.browser, ...globals.node } 23 + }, 24 + rules: { // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. 25 + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors 26 + "no-undef": 'off' } 27 + }, 28 + { 29 + files: [ 30 + '**/*.svelte', 31 + '**/*.svelte.ts', 32 + '**/*.svelte.js' 33 + ], 34 + languageOptions: { 35 + parserOptions: { 36 + projectService: true, 37 + extraFileExtensions: ['.svelte'], 38 + parser: ts.parser, 39 + svelteConfig 40 + } 41 + } 42 + } 43 + );
+25
fly.toml
··· 1 + app = 'papili-one' 2 + primary_region = 'sjc' 3 + 4 + [build] 5 + 6 + [env] 7 + NODE_ENV = 'production' 8 + DATABASE_PATH = '/data/papili.db' 9 + 10 + [http_service] 11 + internal_port = 3000 12 + force_https = true 13 + auto_stop_machines = 'stop' 14 + auto_start_machines = true 15 + min_machines_running = 0 16 + processes = ['app'] 17 + 18 + [[vm]] 19 + memory = '512mb' 20 + cpu_kind = 'shared' 21 + cpus = 1 22 + 23 + [mounts] 24 + source = 'papili_data' 25 + destination = '/data'
+129
lexicons.json
··· 1 + { 2 + "version": 1, 3 + "lexicons": [ 4 + "app.bsky.actor.defs", 5 + "app.bsky.actor.getProfile", 6 + "app.bsky.actor.profile", 7 + "com.atproto.identity.resolveHandle", 8 + "com.atproto.repo.applyWrites", 9 + "com.atproto.repo.createRecord", 10 + "com.atproto.repo.deleteRecord", 11 + "com.atproto.repo.getRecord", 12 + "com.atproto.repo.listRecords", 13 + "com.atproto.repo.strongRef" 14 + ], 15 + "resolutions": { 16 + "app.bsky.actor.defs": { 17 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.defs", 18 + "cid": "bafyreihj55sr6x22fqtqre74cqmkflxwdtvx5f5wwuv26zzyki5hg2qo5m" 19 + }, 20 + "app.bsky.actor.getProfile": { 21 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.getProfile", 22 + "cid": "bafyreigrtosreva7e5m7bwbbfsmw77gkdnieizgxwpobw5iobuck3j54xa" 23 + }, 24 + "app.bsky.actor.profile": { 25 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.profile", 26 + "cid": "bafyreia6umzg3a6d7mjbow4p57tviey45muohklhgsvjoamcctoiusr4pe" 27 + }, 28 + "app.bsky.actor.status": { 29 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.status", 30 + "cid": "bafyreifdg4b64wohpwkh5lydc6tckvol2rspnpni6dec6recy2rhvlnz4a" 31 + }, 32 + "app.bsky.embed.defs": { 33 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.defs", 34 + "cid": "bafyreia42uud4qil67wknywzbxfyxc3b7woewsii54cakq2ould3ldetei" 35 + }, 36 + "app.bsky.embed.external": { 37 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.external", 38 + "cid": "bafyreiblxmpzgwg4fbr45b4xzts3h4k72k7cdnrxy2ub2w5d7mnwzznkwi" 39 + }, 40 + "app.bsky.embed.images": { 41 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.images", 42 + "cid": "bafyreifrntpx63uebiskpooozv6hji62swectq3pocw5h5gpkkqynmazdm" 43 + }, 44 + "app.bsky.embed.record": { 45 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.record", 46 + "cid": "bafyreigdtmu53blwxoygphg5zh5zpmlftz64c3jyqpv2yqpx3nrichkyla" 47 + }, 48 + "app.bsky.embed.recordWithMedia": { 49 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.recordWithMedia", 50 + "cid": "bafyreia7jrw2p73egm7vrunssgzeyj2rwmk3s4dymfhgzcavxjfaje3qfi" 51 + }, 52 + "app.bsky.embed.video": { 53 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.video", 54 + "cid": "bafyreib7cq67zkhasxlwomomskgnbuxvhzzde5brdkpv26fucbv3r7c5ue" 55 + }, 56 + "app.bsky.feed.defs": { 57 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.defs", 58 + "cid": "bafyreiadwvxawxifsnm7ae6l56aq23qs7ndih7npgs6pxmkoin7gi3k6pu" 59 + }, 60 + "app.bsky.feed.postgate": { 61 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.postgate", 62 + "cid": "bafyreiai5efexyluyptv5tbl6kqbqlnneczqzexcqnxmitmulyjfaftgva" 63 + }, 64 + "app.bsky.feed.threadgate": { 65 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.threadgate", 66 + "cid": "bafyreiht77wd6duduz4yqp62m6dwma5dy7gdihps4g2nd73acfzqlglvdi" 67 + }, 68 + "app.bsky.graph.defs": { 69 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.graph.defs", 70 + "cid": "bafyreierp3kbyh5oq7n5zvw3uqniiivbxlh4iibniyd7pf4qqmlhha6agm" 71 + }, 72 + "app.bsky.labeler.defs": { 73 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.labeler.defs", 74 + "cid": "bafyreicxx5i36v5dbqk5vvfzhnta5gajrvc544mnepux4wksrkid7mw3q4" 75 + }, 76 + "app.bsky.notification.defs": { 77 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.notification.defs", 78 + "cid": "bafyreickbpnayydlyfakliahgf23jjuesllh6qrslyofk5yz5xizjavhui" 79 + }, 80 + "app.bsky.richtext.facet": { 81 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.richtext.facet", 82 + "cid": "bafyreidg56eo7zynf6ihz4xb627vwoqf5idnevkmwp7sxc4tijg6xngbu4" 83 + }, 84 + "com.atproto.identity.resolveHandle": { 85 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.identity.resolveHandle", 86 + "cid": "bafyreigckmqtt3jrtzd7tvigjatnz6ajqyafs26h5pwcudwag2anedxnmu" 87 + }, 88 + "com.atproto.label.defs": { 89 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.label.defs", 90 + "cid": "bafyreig4hmnb2xkecyg4aaqfhr2rrcxxb3gsr4xks4rqb7rscrycalbrji" 91 + }, 92 + "com.atproto.moderation.defs": { 93 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.moderation.defs", 94 + "cid": "bafyreideawy4rlpgces2oebk5q4kpurbonhb5qtl4pes7dvxsc5osaiksy" 95 + }, 96 + "com.atproto.repo.applyWrites": { 97 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.applyWrites", 98 + "cid": "bafyreidwfwif7k5uncwqxhpxpxhvdkgedbvp6kqy6r4nozii433lwlajba" 99 + }, 100 + "com.atproto.repo.createRecord": { 101 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.createRecord", 102 + "cid": "bafyreihyvpmy2l4ou2v5etx25j5lbqty6tvna7gsxdqge76rbb7gltulei" 103 + }, 104 + "com.atproto.repo.defs": { 105 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.defs", 106 + "cid": "bafyreigmp5xfpkhnmwr3l5o626ued2gc2ouioykj2tpgqjqqajvbvm3wlm" 107 + }, 108 + "com.atproto.repo.deleteRecord": { 109 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.deleteRecord", 110 + "cid": "bafyreibwdxbyhuuljujl7g4ylwdso2x2ov6yv6nk3ext3sr7kjvvubkula" 111 + }, 112 + "com.atproto.repo.getRecord": { 113 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.getRecord", 114 + "cid": "bafyreihdnm3v25uaptt5vjvnpfsfgb6fbhxew2ye3l6q4ndm7xi5wpc4vy" 115 + }, 116 + "com.atproto.repo.listRecords": { 117 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.listRecords", 118 + "cid": "bafyreihv666jp6lxncj6amcgsu5qrvwq4rwmtc7xbxzndxqdwxamlsatee" 119 + }, 120 + "com.atproto.repo.strongRef": { 121 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.strongRef", 122 + "cid": "bafyreifrkdbnkvfjujntdaeigolnrjj3srrs53tfixjhmacclps72qlov4" 123 + }, 124 + "tools.ozone.report.defs": { 125 + "uri": "at://did:plc:33dt5kftu3jq2h5h4jjlqezt/com.atproto.lexicon.schema/tools.ozone.report.defs", 126 + "cid": "bafyreic3l2rmh2ugirt3jz372wcvy333m7t2ynlyzj2k54oshijs6lxdfu" 127 + } 128 + } 129 + }
+883
lexicons/app/bsky/actor/defs.json
··· 1 + { 2 + "id": "app.bsky.actor.defs", 3 + "defs": { 4 + "nux": { 5 + "type": "object", 6 + "required": [ 7 + "id", 8 + "completed" 9 + ], 10 + "properties": { 11 + "id": { 12 + "type": "string", 13 + "maxLength": 100 14 + }, 15 + "data": { 16 + "type": "string", 17 + "maxLength": 3000, 18 + "description": "Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters.", 19 + "maxGraphemes": 300 20 + }, 21 + "completed": { 22 + "type": "boolean", 23 + "default": false 24 + }, 25 + "expiresAt": { 26 + "type": "string", 27 + "format": "datetime", 28 + "description": "The date and time at which the NUX will expire and should be considered completed." 29 + } 30 + }, 31 + "description": "A new user experiences (NUX) storage object" 32 + }, 33 + "mutedWord": { 34 + "type": "object", 35 + "required": [ 36 + "value", 37 + "targets" 38 + ], 39 + "properties": { 40 + "id": { 41 + "type": "string" 42 + }, 43 + "value": { 44 + "type": "string", 45 + "maxLength": 10000, 46 + "description": "The muted word itself.", 47 + "maxGraphemes": 1000 48 + }, 49 + "targets": { 50 + "type": "array", 51 + "items": { 52 + "ref": "app.bsky.actor.defs#mutedWordTarget", 53 + "type": "ref" 54 + }, 55 + "description": "The intended targets of the muted word." 56 + }, 57 + "expiresAt": { 58 + "type": "string", 59 + "format": "datetime", 60 + "description": "The date and time at which the muted word will expire and no longer be applied." 61 + }, 62 + "actorTarget": { 63 + "type": "string", 64 + "default": "all", 65 + "description": "Groups of users to apply the muted word to. If undefined, applies to all users.", 66 + "knownValues": [ 67 + "all", 68 + "exclude-following" 69 + ] 70 + } 71 + }, 72 + "description": "A word that the account owner has muted." 73 + }, 74 + "savedFeed": { 75 + "type": "object", 76 + "required": [ 77 + "id", 78 + "type", 79 + "value", 80 + "pinned" 81 + ], 82 + "properties": { 83 + "id": { 84 + "type": "string" 85 + }, 86 + "type": { 87 + "type": "string", 88 + "knownValues": [ 89 + "feed", 90 + "list", 91 + "timeline" 92 + ] 93 + }, 94 + "value": { 95 + "type": "string" 96 + }, 97 + "pinned": { 98 + "type": "boolean" 99 + } 100 + } 101 + }, 102 + "statusView": { 103 + "type": "object", 104 + "required": [ 105 + "status", 106 + "record" 107 + ], 108 + "properties": { 109 + "embed": { 110 + "refs": [ 111 + "app.bsky.embed.external#view" 112 + ], 113 + "type": "union", 114 + "description": "An optional embed associated with the status." 115 + }, 116 + "record": { 117 + "type": "unknown" 118 + }, 119 + "status": { 120 + "type": "string", 121 + "description": "The status for the account.", 122 + "knownValues": [ 123 + "app.bsky.actor.status#live" 124 + ] 125 + }, 126 + "isActive": { 127 + "type": "boolean", 128 + "description": "True if the status is not expired, false if it is expired. Only present if expiration was set." 129 + }, 130 + "expiresAt": { 131 + "type": "string", 132 + "format": "datetime", 133 + "description": "The date when this status will expire. The application might choose to no longer return the status after expiration." 134 + } 135 + } 136 + }, 137 + "preferences": { 138 + "type": "array", 139 + "items": { 140 + "refs": [ 141 + "#adultContentPref", 142 + "#contentLabelPref", 143 + "#savedFeedsPref", 144 + "#savedFeedsPrefV2", 145 + "#personalDetailsPref", 146 + "#feedViewPref", 147 + "#threadViewPref", 148 + "#interestsPref", 149 + "#mutedWordsPref", 150 + "#hiddenPostsPref", 151 + "#bskyAppStatePref", 152 + "#labelersPref", 153 + "#postInteractionSettingsPref", 154 + "#verificationPrefs" 155 + ], 156 + "type": "union" 157 + } 158 + }, 159 + "profileView": { 160 + "type": "object", 161 + "required": [ 162 + "did", 163 + "handle" 164 + ], 165 + "properties": { 166 + "did": { 167 + "type": "string", 168 + "format": "did" 169 + }, 170 + "debug": { 171 + "type": "unknown", 172 + "description": "Debug information for internal development" 173 + }, 174 + "avatar": { 175 + "type": "string", 176 + "format": "uri" 177 + }, 178 + "handle": { 179 + "type": "string", 180 + "format": "handle" 181 + }, 182 + "labels": { 183 + "type": "array", 184 + "items": { 185 + "ref": "com.atproto.label.defs#label", 186 + "type": "ref" 187 + } 188 + }, 189 + "status": { 190 + "ref": "#statusView", 191 + "type": "ref" 192 + }, 193 + "viewer": { 194 + "ref": "#viewerState", 195 + "type": "ref" 196 + }, 197 + "pronouns": { 198 + "type": "string" 199 + }, 200 + "createdAt": { 201 + "type": "string", 202 + "format": "datetime" 203 + }, 204 + "indexedAt": { 205 + "type": "string", 206 + "format": "datetime" 207 + }, 208 + "associated": { 209 + "ref": "#profileAssociated", 210 + "type": "ref" 211 + }, 212 + "description": { 213 + "type": "string", 214 + "maxLength": 2560, 215 + "maxGraphemes": 256 216 + }, 217 + "displayName": { 218 + "type": "string", 219 + "maxLength": 640, 220 + "maxGraphemes": 64 221 + }, 222 + "verification": { 223 + "ref": "#verificationState", 224 + "type": "ref" 225 + } 226 + } 227 + }, 228 + "viewerState": { 229 + "type": "object", 230 + "properties": { 231 + "muted": { 232 + "type": "boolean" 233 + }, 234 + "blocking": { 235 + "type": "string", 236 + "format": "at-uri" 237 + }, 238 + "blockedBy": { 239 + "type": "boolean" 240 + }, 241 + "following": { 242 + "type": "string", 243 + "format": "at-uri" 244 + }, 245 + "followedBy": { 246 + "type": "string", 247 + "format": "at-uri" 248 + }, 249 + "mutedByList": { 250 + "ref": "app.bsky.graph.defs#listViewBasic", 251 + "type": "ref" 252 + }, 253 + "blockingByList": { 254 + "ref": "app.bsky.graph.defs#listViewBasic", 255 + "type": "ref" 256 + }, 257 + "knownFollowers": { 258 + "ref": "#knownFollowers", 259 + "type": "ref", 260 + "description": "This property is present only in selected cases, as an optimization." 261 + }, 262 + "activitySubscription": { 263 + "ref": "app.bsky.notification.defs#activitySubscription", 264 + "type": "ref", 265 + "description": "This property is present only in selected cases, as an optimization." 266 + } 267 + }, 268 + "description": "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests." 269 + }, 270 + "feedViewPref": { 271 + "type": "object", 272 + "required": [ 273 + "feed" 274 + ], 275 + "properties": { 276 + "feed": { 277 + "type": "string", 278 + "description": "The URI of the feed, or an identifier which describes the feed." 279 + }, 280 + "hideReplies": { 281 + "type": "boolean", 282 + "description": "Hide replies in the feed." 283 + }, 284 + "hideReposts": { 285 + "type": "boolean", 286 + "description": "Hide reposts in the feed." 287 + }, 288 + "hideQuotePosts": { 289 + "type": "boolean", 290 + "description": "Hide quote posts in the feed." 291 + }, 292 + "hideRepliesByLikeCount": { 293 + "type": "integer", 294 + "description": "Hide replies in the feed if they do not have this number of likes." 295 + }, 296 + "hideRepliesByUnfollowed": { 297 + "type": "boolean", 298 + "default": true, 299 + "description": "Hide replies in the feed if they are not by followed users." 300 + } 301 + } 302 + }, 303 + "labelersPref": { 304 + "type": "object", 305 + "required": [ 306 + "labelers" 307 + ], 308 + "properties": { 309 + "labelers": { 310 + "type": "array", 311 + "items": { 312 + "ref": "#labelerPrefItem", 313 + "type": "ref" 314 + } 315 + } 316 + } 317 + }, 318 + "interestsPref": { 319 + "type": "object", 320 + "required": [ 321 + "tags" 322 + ], 323 + "properties": { 324 + "tags": { 325 + "type": "array", 326 + "items": { 327 + "type": "string", 328 + "maxLength": 640, 329 + "maxGraphemes": 64 330 + }, 331 + "maxLength": 100, 332 + "description": "A list of tags which describe the account owner's interests gathered during onboarding." 333 + } 334 + } 335 + }, 336 + "knownFollowers": { 337 + "type": "object", 338 + "required": [ 339 + "count", 340 + "followers" 341 + ], 342 + "properties": { 343 + "count": { 344 + "type": "integer" 345 + }, 346 + "followers": { 347 + "type": "array", 348 + "items": { 349 + "ref": "#profileViewBasic", 350 + "type": "ref" 351 + }, 352 + "maxLength": 5, 353 + "minLength": 0 354 + } 355 + }, 356 + "description": "The subject's followers whom you also follow" 357 + }, 358 + "mutedWordsPref": { 359 + "type": "object", 360 + "required": [ 361 + "items" 362 + ], 363 + "properties": { 364 + "items": { 365 + "type": "array", 366 + "items": { 367 + "ref": "app.bsky.actor.defs#mutedWord", 368 + "type": "ref" 369 + }, 370 + "description": "A list of words the account owner has muted." 371 + } 372 + } 373 + }, 374 + "savedFeedsPref": { 375 + "type": "object", 376 + "required": [ 377 + "pinned", 378 + "saved" 379 + ], 380 + "properties": { 381 + "saved": { 382 + "type": "array", 383 + "items": { 384 + "type": "string", 385 + "format": "at-uri" 386 + } 387 + }, 388 + "pinned": { 389 + "type": "array", 390 + "items": { 391 + "type": "string", 392 + "format": "at-uri" 393 + } 394 + }, 395 + "timelineIndex": { 396 + "type": "integer" 397 + } 398 + } 399 + }, 400 + "threadViewPref": { 401 + "type": "object", 402 + "properties": { 403 + "sort": { 404 + "type": "string", 405 + "description": "Sorting mode for threads.", 406 + "knownValues": [ 407 + "oldest", 408 + "newest", 409 + "most-likes", 410 + "random", 411 + "hotness" 412 + ] 413 + } 414 + } 415 + }, 416 + "hiddenPostsPref": { 417 + "type": "object", 418 + "required": [ 419 + "items" 420 + ], 421 + "properties": { 422 + "items": { 423 + "type": "array", 424 + "items": { 425 + "type": "string", 426 + "format": "at-uri" 427 + }, 428 + "description": "A list of URIs of posts the account owner has hidden." 429 + } 430 + } 431 + }, 432 + "labelerPrefItem": { 433 + "type": "object", 434 + "required": [ 435 + "did" 436 + ], 437 + "properties": { 438 + "did": { 439 + "type": "string", 440 + "format": "did" 441 + } 442 + } 443 + }, 444 + "mutedWordTarget": { 445 + "type": "string", 446 + "maxLength": 640, 447 + "knownValues": [ 448 + "content", 449 + "tag" 450 + ], 451 + "maxGraphemes": 64 452 + }, 453 + "adultContentPref": { 454 + "type": "object", 455 + "required": [ 456 + "enabled" 457 + ], 458 + "properties": { 459 + "enabled": { 460 + "type": "boolean", 461 + "default": false 462 + } 463 + } 464 + }, 465 + "bskyAppStatePref": { 466 + "type": "object", 467 + "properties": { 468 + "nuxs": { 469 + "type": "array", 470 + "items": { 471 + "ref": "app.bsky.actor.defs#nux", 472 + "type": "ref" 473 + }, 474 + "maxLength": 100, 475 + "description": "Storage for NUXs the user has encountered." 476 + }, 477 + "queuedNudges": { 478 + "type": "array", 479 + "items": { 480 + "type": "string", 481 + "maxLength": 100 482 + }, 483 + "maxLength": 1000, 484 + "description": "An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user." 485 + }, 486 + "activeProgressGuide": { 487 + "ref": "#bskyAppProgressGuide", 488 + "type": "ref" 489 + } 490 + }, 491 + "description": "A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this." 492 + }, 493 + "contentLabelPref": { 494 + "type": "object", 495 + "required": [ 496 + "label", 497 + "visibility" 498 + ], 499 + "properties": { 500 + "label": { 501 + "type": "string" 502 + }, 503 + "labelerDid": { 504 + "type": "string", 505 + "format": "did", 506 + "description": "Which labeler does this preference apply to? If undefined, applies globally." 507 + }, 508 + "visibility": { 509 + "type": "string", 510 + "knownValues": [ 511 + "ignore", 512 + "show", 513 + "warn", 514 + "hide" 515 + ] 516 + } 517 + } 518 + }, 519 + "profileViewBasic": { 520 + "type": "object", 521 + "required": [ 522 + "did", 523 + "handle" 524 + ], 525 + "properties": { 526 + "did": { 527 + "type": "string", 528 + "format": "did" 529 + }, 530 + "debug": { 531 + "type": "unknown", 532 + "description": "Debug information for internal development" 533 + }, 534 + "avatar": { 535 + "type": "string", 536 + "format": "uri" 537 + }, 538 + "handle": { 539 + "type": "string", 540 + "format": "handle" 541 + }, 542 + "labels": { 543 + "type": "array", 544 + "items": { 545 + "ref": "com.atproto.label.defs#label", 546 + "type": "ref" 547 + } 548 + }, 549 + "status": { 550 + "ref": "#statusView", 551 + "type": "ref" 552 + }, 553 + "viewer": { 554 + "ref": "#viewerState", 555 + "type": "ref" 556 + }, 557 + "pronouns": { 558 + "type": "string" 559 + }, 560 + "createdAt": { 561 + "type": "string", 562 + "format": "datetime" 563 + }, 564 + "associated": { 565 + "ref": "#profileAssociated", 566 + "type": "ref" 567 + }, 568 + "displayName": { 569 + "type": "string", 570 + "maxLength": 640, 571 + "maxGraphemes": 64 572 + }, 573 + "verification": { 574 + "ref": "#verificationState", 575 + "type": "ref" 576 + } 577 + } 578 + }, 579 + "savedFeedsPrefV2": { 580 + "type": "object", 581 + "required": [ 582 + "items" 583 + ], 584 + "properties": { 585 + "items": { 586 + "type": "array", 587 + "items": { 588 + "ref": "app.bsky.actor.defs#savedFeed", 589 + "type": "ref" 590 + } 591 + } 592 + } 593 + }, 594 + "verificationView": { 595 + "type": "object", 596 + "required": [ 597 + "issuer", 598 + "uri", 599 + "isValid", 600 + "createdAt" 601 + ], 602 + "properties": { 603 + "uri": { 604 + "type": "string", 605 + "format": "at-uri", 606 + "description": "The AT-URI of the verification record." 607 + }, 608 + "issuer": { 609 + "type": "string", 610 + "format": "did", 611 + "description": "The user who issued this verification." 612 + }, 613 + "isValid": { 614 + "type": "boolean", 615 + "description": "True if the verification passes validation, otherwise false." 616 + }, 617 + "createdAt": { 618 + "type": "string", 619 + "format": "datetime", 620 + "description": "Timestamp when the verification was created." 621 + } 622 + }, 623 + "description": "An individual verification for an associated subject." 624 + }, 625 + "profileAssociated": { 626 + "type": "object", 627 + "properties": { 628 + "chat": { 629 + "ref": "#profileAssociatedChat", 630 + "type": "ref" 631 + }, 632 + "lists": { 633 + "type": "integer" 634 + }, 635 + "labeler": { 636 + "type": "boolean" 637 + }, 638 + "feedgens": { 639 + "type": "integer" 640 + }, 641 + "starterPacks": { 642 + "type": "integer" 643 + }, 644 + "activitySubscription": { 645 + "ref": "#profileAssociatedActivitySubscription", 646 + "type": "ref" 647 + } 648 + } 649 + }, 650 + "verificationPrefs": { 651 + "type": "object", 652 + "required": [], 653 + "properties": { 654 + "hideBadges": { 655 + "type": "boolean", 656 + "default": false, 657 + "description": "Hide the blue check badges for verified accounts and trusted verifiers." 658 + } 659 + }, 660 + "description": "Preferences for how verified accounts appear in the app." 661 + }, 662 + "verificationState": { 663 + "type": "object", 664 + "required": [ 665 + "verifications", 666 + "verifiedStatus", 667 + "trustedVerifierStatus" 668 + ], 669 + "properties": { 670 + "verifications": { 671 + "type": "array", 672 + "items": { 673 + "ref": "#verificationView", 674 + "type": "ref" 675 + }, 676 + "description": "All verifications issued by trusted verifiers on behalf of this user. Verifications by untrusted verifiers are not included." 677 + }, 678 + "verifiedStatus": { 679 + "type": "string", 680 + "description": "The user's status as a verified account.", 681 + "knownValues": [ 682 + "valid", 683 + "invalid", 684 + "none" 685 + ] 686 + }, 687 + "trustedVerifierStatus": { 688 + "type": "string", 689 + "description": "The user's status as a trusted verifier.", 690 + "knownValues": [ 691 + "valid", 692 + "invalid", 693 + "none" 694 + ] 695 + } 696 + }, 697 + "description": "Represents the verification information about the user this object is attached to." 698 + }, 699 + "personalDetailsPref": { 700 + "type": "object", 701 + "properties": { 702 + "birthDate": { 703 + "type": "string", 704 + "format": "datetime", 705 + "description": "The birth date of account owner." 706 + } 707 + } 708 + }, 709 + "profileViewDetailed": { 710 + "type": "object", 711 + "required": [ 712 + "did", 713 + "handle" 714 + ], 715 + "properties": { 716 + "did": { 717 + "type": "string", 718 + "format": "did" 719 + }, 720 + "debug": { 721 + "type": "unknown", 722 + "description": "Debug information for internal development" 723 + }, 724 + "avatar": { 725 + "type": "string", 726 + "format": "uri" 727 + }, 728 + "banner": { 729 + "type": "string", 730 + "format": "uri" 731 + }, 732 + "handle": { 733 + "type": "string", 734 + "format": "handle" 735 + }, 736 + "labels": { 737 + "type": "array", 738 + "items": { 739 + "ref": "com.atproto.label.defs#label", 740 + "type": "ref" 741 + } 742 + }, 743 + "status": { 744 + "ref": "#statusView", 745 + "type": "ref" 746 + }, 747 + "viewer": { 748 + "ref": "#viewerState", 749 + "type": "ref" 750 + }, 751 + "website": { 752 + "type": "string", 753 + "format": "uri" 754 + }, 755 + "pronouns": { 756 + "type": "string" 757 + }, 758 + "createdAt": { 759 + "type": "string", 760 + "format": "datetime" 761 + }, 762 + "indexedAt": { 763 + "type": "string", 764 + "format": "datetime" 765 + }, 766 + "associated": { 767 + "ref": "#profileAssociated", 768 + "type": "ref" 769 + }, 770 + "pinnedPost": { 771 + "ref": "com.atproto.repo.strongRef", 772 + "type": "ref" 773 + }, 774 + "postsCount": { 775 + "type": "integer" 776 + }, 777 + "description": { 778 + "type": "string", 779 + "maxLength": 2560, 780 + "maxGraphemes": 256 781 + }, 782 + "displayName": { 783 + "type": "string", 784 + "maxLength": 640, 785 + "maxGraphemes": 64 786 + }, 787 + "followsCount": { 788 + "type": "integer" 789 + }, 790 + "verification": { 791 + "ref": "#verificationState", 792 + "type": "ref" 793 + }, 794 + "followersCount": { 795 + "type": "integer" 796 + }, 797 + "joinedViaStarterPack": { 798 + "ref": "app.bsky.graph.defs#starterPackViewBasic", 799 + "type": "ref" 800 + } 801 + } 802 + }, 803 + "bskyAppProgressGuide": { 804 + "type": "object", 805 + "required": [ 806 + "guide" 807 + ], 808 + "properties": { 809 + "guide": { 810 + "type": "string", 811 + "maxLength": 100 812 + } 813 + }, 814 + "description": "If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress." 815 + }, 816 + "profileAssociatedChat": { 817 + "type": "object", 818 + "required": [ 819 + "allowIncoming" 820 + ], 821 + "properties": { 822 + "allowIncoming": { 823 + "type": "string", 824 + "knownValues": [ 825 + "all", 826 + "none", 827 + "following" 828 + ] 829 + } 830 + } 831 + }, 832 + "postInteractionSettingsPref": { 833 + "type": "object", 834 + "required": [], 835 + "properties": { 836 + "threadgateAllowRules": { 837 + "type": "array", 838 + "items": { 839 + "refs": [ 840 + "app.bsky.feed.threadgate#mentionRule", 841 + "app.bsky.feed.threadgate#followerRule", 842 + "app.bsky.feed.threadgate#followingRule", 843 + "app.bsky.feed.threadgate#listRule" 844 + ], 845 + "type": "union" 846 + }, 847 + "maxLength": 5, 848 + "description": "Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply." 849 + }, 850 + "postgateEmbeddingRules": { 851 + "type": "array", 852 + "items": { 853 + "refs": [ 854 + "app.bsky.feed.postgate#disableRule" 855 + ], 856 + "type": "union" 857 + }, 858 + "maxLength": 5, 859 + "description": "Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed." 860 + } 861 + }, 862 + "description": "Default post interaction settings for the account. These values should be applied as default values when creating new posts. These refs should mirror the threadgate and postgate records exactly." 863 + }, 864 + "profileAssociatedActivitySubscription": { 865 + "type": "object", 866 + "required": [ 867 + "allowSubscriptions" 868 + ], 869 + "properties": { 870 + "allowSubscriptions": { 871 + "type": "string", 872 + "knownValues": [ 873 + "followers", 874 + "mutuals", 875 + "none" 876 + ] 877 + } 878 + } 879 + } 880 + }, 881 + "$type": "com.atproto.lexicon.schema", 882 + "lexicon": 1 883 + }
+31
lexicons/app/bsky/actor/getProfile.json
··· 1 + { 2 + "id": "app.bsky.actor.getProfile", 3 + "defs": { 4 + "main": { 5 + "type": "query", 6 + "output": { 7 + "schema": { 8 + "ref": "app.bsky.actor.defs#profileViewDetailed", 9 + "type": "ref" 10 + }, 11 + "encoding": "application/json" 12 + }, 13 + "parameters": { 14 + "type": "params", 15 + "required": [ 16 + "actor" 17 + ], 18 + "properties": { 19 + "actor": { 20 + "type": "string", 21 + "format": "at-identifier", 22 + "description": "Handle or DID of account to fetch profile of." 23 + } 24 + } 25 + }, 26 + "description": "Get detailed profile view of an actor. Does not require auth, but contains relevant metadata with auth." 27 + } 28 + }, 29 + "$type": "com.atproto.lexicon.schema", 30 + "lexicon": 1 31 + }
+75
lexicons/app/bsky/actor/profile.json
··· 1 + { 2 + "id": "app.bsky.actor.profile", 3 + "defs": { 4 + "main": { 5 + "key": "literal:self", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "properties": { 10 + "avatar": { 11 + "type": "blob", 12 + "accept": [ 13 + "image/png", 14 + "image/jpeg" 15 + ], 16 + "maxSize": 1000000, 17 + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 18 + }, 19 + "banner": { 20 + "type": "blob", 21 + "accept": [ 22 + "image/png", 23 + "image/jpeg" 24 + ], 25 + "maxSize": 1000000, 26 + "description": "Larger horizontal image to display behind profile view." 27 + }, 28 + "labels": { 29 + "refs": [ 30 + "com.atproto.label.defs#selfLabels" 31 + ], 32 + "type": "union", 33 + "description": "Self-label values, specific to the Bluesky application, on the overall account." 34 + }, 35 + "website": { 36 + "type": "string", 37 + "format": "uri" 38 + }, 39 + "pronouns": { 40 + "type": "string", 41 + "maxLength": 200, 42 + "description": "Free-form pronouns text.", 43 + "maxGraphemes": 20 44 + }, 45 + "createdAt": { 46 + "type": "string", 47 + "format": "datetime" 48 + }, 49 + "pinnedPost": { 50 + "ref": "com.atproto.repo.strongRef", 51 + "type": "ref" 52 + }, 53 + "description": { 54 + "type": "string", 55 + "maxLength": 2560, 56 + "description": "Free-form profile description text.", 57 + "maxGraphemes": 256 58 + }, 59 + "displayName": { 60 + "type": "string", 61 + "maxLength": 640, 62 + "maxGraphemes": 64 63 + }, 64 + "joinedViaStarterPack": { 65 + "ref": "com.atproto.repo.strongRef", 66 + "type": "ref" 67 + } 68 + } 69 + }, 70 + "description": "A declaration of a Bluesky account profile." 71 + } 72 + }, 73 + "$type": "com.atproto.lexicon.schema", 74 + "lexicon": 1 75 + }
+48
lexicons/app/bsky/actor/status.json
··· 1 + { 2 + "id": "app.bsky.actor.status", 3 + "defs": { 4 + "live": { 5 + "type": "token", 6 + "description": "Advertises an account as currently offering live content." 7 + }, 8 + "main": { 9 + "key": "literal:self", 10 + "type": "record", 11 + "record": { 12 + "type": "object", 13 + "required": [ 14 + "status", 15 + "createdAt" 16 + ], 17 + "properties": { 18 + "embed": { 19 + "refs": [ 20 + "app.bsky.embed.external" 21 + ], 22 + "type": "union", 23 + "description": "An optional embed associated with the status." 24 + }, 25 + "status": { 26 + "type": "string", 27 + "description": "The status for the account.", 28 + "knownValues": [ 29 + "app.bsky.actor.status#live" 30 + ] 31 + }, 32 + "createdAt": { 33 + "type": "string", 34 + "format": "datetime" 35 + }, 36 + "durationMinutes": { 37 + "type": "integer", 38 + "minimum": 1, 39 + "description": "The duration of the status in minutes. Applications can choose to impose minimum and maximum limits." 40 + } 41 + } 42 + }, 43 + "description": "A declaration of a Bluesky account status." 44 + } 45 + }, 46 + "$type": "com.atproto.lexicon.schema", 47 + "lexicon": 1 48 + }
+25
lexicons/app/bsky/embed/defs.json
··· 1 + { 2 + "id": "app.bsky.embed.defs", 3 + "defs": { 4 + "aspectRatio": { 5 + "type": "object", 6 + "required": [ 7 + "width", 8 + "height" 9 + ], 10 + "properties": { 11 + "width": { 12 + "type": "integer", 13 + "minimum": 1 14 + }, 15 + "height": { 16 + "type": "integer", 17 + "minimum": 1 18 + } 19 + }, 20 + "description": "width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit." 21 + } 22 + }, 23 + "$type": "com.atproto.lexicon.schema", 24 + "lexicon": 1 25 + }
+83
lexicons/app/bsky/embed/external.json
··· 1 + { 2 + "id": "app.bsky.embed.external", 3 + "defs": { 4 + "main": { 5 + "type": "object", 6 + "required": [ 7 + "external" 8 + ], 9 + "properties": { 10 + "external": { 11 + "ref": "#external", 12 + "type": "ref" 13 + } 14 + }, 15 + "description": "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post)." 16 + }, 17 + "view": { 18 + "type": "object", 19 + "required": [ 20 + "external" 21 + ], 22 + "properties": { 23 + "external": { 24 + "ref": "#viewExternal", 25 + "type": "ref" 26 + } 27 + } 28 + }, 29 + "external": { 30 + "type": "object", 31 + "required": [ 32 + "uri", 33 + "title", 34 + "description" 35 + ], 36 + "properties": { 37 + "uri": { 38 + "type": "string", 39 + "format": "uri" 40 + }, 41 + "thumb": { 42 + "type": "blob", 43 + "accept": [ 44 + "image/*" 45 + ], 46 + "maxSize": 1000000 47 + }, 48 + "title": { 49 + "type": "string" 50 + }, 51 + "description": { 52 + "type": "string" 53 + } 54 + } 55 + }, 56 + "viewExternal": { 57 + "type": "object", 58 + "required": [ 59 + "uri", 60 + "title", 61 + "description" 62 + ], 63 + "properties": { 64 + "uri": { 65 + "type": "string", 66 + "format": "uri" 67 + }, 68 + "thumb": { 69 + "type": "string", 70 + "format": "uri" 71 + }, 72 + "title": { 73 + "type": "string" 74 + }, 75 + "description": { 76 + "type": "string" 77 + } 78 + } 79 + } 80 + }, 81 + "$type": "com.atproto.lexicon.schema", 82 + "lexicon": 1 83 + }
+92
lexicons/app/bsky/embed/images.json
··· 1 + { 2 + "id": "app.bsky.embed.images", 3 + "defs": { 4 + "main": { 5 + "type": "object", 6 + "required": [ 7 + "images" 8 + ], 9 + "properties": { 10 + "images": { 11 + "type": "array", 12 + "items": { 13 + "ref": "#image", 14 + "type": "ref" 15 + }, 16 + "maxLength": 4 17 + } 18 + } 19 + }, 20 + "view": { 21 + "type": "object", 22 + "required": [ 23 + "images" 24 + ], 25 + "properties": { 26 + "images": { 27 + "type": "array", 28 + "items": { 29 + "ref": "#viewImage", 30 + "type": "ref" 31 + }, 32 + "maxLength": 4 33 + } 34 + } 35 + }, 36 + "image": { 37 + "type": "object", 38 + "required": [ 39 + "image", 40 + "alt" 41 + ], 42 + "properties": { 43 + "alt": { 44 + "type": "string", 45 + "description": "Alt text description of the image, for accessibility." 46 + }, 47 + "image": { 48 + "type": "blob", 49 + "accept": [ 50 + "image/*" 51 + ], 52 + "maxSize": 1000000 53 + }, 54 + "aspectRatio": { 55 + "ref": "app.bsky.embed.defs#aspectRatio", 56 + "type": "ref" 57 + } 58 + } 59 + }, 60 + "viewImage": { 61 + "type": "object", 62 + "required": [ 63 + "thumb", 64 + "fullsize", 65 + "alt" 66 + ], 67 + "properties": { 68 + "alt": { 69 + "type": "string", 70 + "description": "Alt text description of the image, for accessibility." 71 + }, 72 + "thumb": { 73 + "type": "string", 74 + "format": "uri", 75 + "description": "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View." 76 + }, 77 + "fullsize": { 78 + "type": "string", 79 + "format": "uri", 80 + "description": "Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View." 81 + }, 82 + "aspectRatio": { 83 + "ref": "app.bsky.embed.defs#aspectRatio", 84 + "type": "ref" 85 + } 86 + } 87 + } 88 + }, 89 + "$type": "com.atproto.lexicon.schema", 90 + "lexicon": 1, 91 + "description": "A set of images embedded in a Bluesky record (eg, a post)." 92 + }
+161
lexicons/app/bsky/embed/record.json
··· 1 + { 2 + "id": "app.bsky.embed.record", 3 + "defs": { 4 + "main": { 5 + "type": "object", 6 + "required": [ 7 + "record" 8 + ], 9 + "properties": { 10 + "record": { 11 + "ref": "com.atproto.repo.strongRef", 12 + "type": "ref" 13 + } 14 + } 15 + }, 16 + "view": { 17 + "type": "object", 18 + "required": [ 19 + "record" 20 + ], 21 + "properties": { 22 + "record": { 23 + "refs": [ 24 + "#viewRecord", 25 + "#viewNotFound", 26 + "#viewBlocked", 27 + "#viewDetached", 28 + "app.bsky.feed.defs#generatorView", 29 + "app.bsky.graph.defs#listView", 30 + "app.bsky.labeler.defs#labelerView", 31 + "app.bsky.graph.defs#starterPackViewBasic" 32 + ], 33 + "type": "union" 34 + } 35 + } 36 + }, 37 + "viewRecord": { 38 + "type": "object", 39 + "required": [ 40 + "uri", 41 + "cid", 42 + "author", 43 + "value", 44 + "indexedAt" 45 + ], 46 + "properties": { 47 + "cid": { 48 + "type": "string", 49 + "format": "cid" 50 + }, 51 + "uri": { 52 + "type": "string", 53 + "format": "at-uri" 54 + }, 55 + "value": { 56 + "type": "unknown", 57 + "description": "The record data itself." 58 + }, 59 + "author": { 60 + "ref": "app.bsky.actor.defs#profileViewBasic", 61 + "type": "ref" 62 + }, 63 + "embeds": { 64 + "type": "array", 65 + "items": { 66 + "refs": [ 67 + "app.bsky.embed.images#view", 68 + "app.bsky.embed.video#view", 69 + "app.bsky.embed.external#view", 70 + "app.bsky.embed.record#view", 71 + "app.bsky.embed.recordWithMedia#view" 72 + ], 73 + "type": "union" 74 + } 75 + }, 76 + "labels": { 77 + "type": "array", 78 + "items": { 79 + "ref": "com.atproto.label.defs#label", 80 + "type": "ref" 81 + } 82 + }, 83 + "indexedAt": { 84 + "type": "string", 85 + "format": "datetime" 86 + }, 87 + "likeCount": { 88 + "type": "integer" 89 + }, 90 + "quoteCount": { 91 + "type": "integer" 92 + }, 93 + "replyCount": { 94 + "type": "integer" 95 + }, 96 + "repostCount": { 97 + "type": "integer" 98 + } 99 + } 100 + }, 101 + "viewBlocked": { 102 + "type": "object", 103 + "required": [ 104 + "uri", 105 + "blocked", 106 + "author" 107 + ], 108 + "properties": { 109 + "uri": { 110 + "type": "string", 111 + "format": "at-uri" 112 + }, 113 + "author": { 114 + "ref": "app.bsky.feed.defs#blockedAuthor", 115 + "type": "ref" 116 + }, 117 + "blocked": { 118 + "type": "boolean", 119 + "const": true 120 + } 121 + } 122 + }, 123 + "viewDetached": { 124 + "type": "object", 125 + "required": [ 126 + "uri", 127 + "detached" 128 + ], 129 + "properties": { 130 + "uri": { 131 + "type": "string", 132 + "format": "at-uri" 133 + }, 134 + "detached": { 135 + "type": "boolean", 136 + "const": true 137 + } 138 + } 139 + }, 140 + "viewNotFound": { 141 + "type": "object", 142 + "required": [ 143 + "uri", 144 + "notFound" 145 + ], 146 + "properties": { 147 + "uri": { 148 + "type": "string", 149 + "format": "at-uri" 150 + }, 151 + "notFound": { 152 + "type": "boolean", 153 + "const": true 154 + } 155 + } 156 + } 157 + }, 158 + "$type": "com.atproto.lexicon.schema", 159 + "lexicon": 1, 160 + "description": "A representation of a record embedded in a Bluesky record (eg, a post). For example, a quote-post, or sharing a feed generator record." 161 + }
+50
lexicons/app/bsky/embed/recordWithMedia.json
··· 1 + { 2 + "id": "app.bsky.embed.recordWithMedia", 3 + "defs": { 4 + "main": { 5 + "type": "object", 6 + "required": [ 7 + "record", 8 + "media" 9 + ], 10 + "properties": { 11 + "media": { 12 + "refs": [ 13 + "app.bsky.embed.images", 14 + "app.bsky.embed.video", 15 + "app.bsky.embed.external" 16 + ], 17 + "type": "union" 18 + }, 19 + "record": { 20 + "ref": "app.bsky.embed.record", 21 + "type": "ref" 22 + } 23 + } 24 + }, 25 + "view": { 26 + "type": "object", 27 + "required": [ 28 + "record", 29 + "media" 30 + ], 31 + "properties": { 32 + "media": { 33 + "refs": [ 34 + "app.bsky.embed.images#view", 35 + "app.bsky.embed.video#view", 36 + "app.bsky.embed.external#view" 37 + ], 38 + "type": "union" 39 + }, 40 + "record": { 41 + "ref": "app.bsky.embed.record#view", 42 + "type": "ref" 43 + } 44 + } 45 + } 46 + }, 47 + "$type": "com.atproto.lexicon.schema", 48 + "lexicon": 1, 49 + "description": "A representation of a record embedded in a Bluesky record (eg, a post), alongside other compatible embeds. For example, a quote post and image, or a quote post and external URL card." 50 + }
+92
lexicons/app/bsky/embed/video.json
··· 1 + { 2 + "id": "app.bsky.embed.video", 3 + "defs": { 4 + "main": { 5 + "type": "object", 6 + "required": [ 7 + "video" 8 + ], 9 + "properties": { 10 + "alt": { 11 + "type": "string", 12 + "maxLength": 10000, 13 + "description": "Alt text description of the video, for accessibility.", 14 + "maxGraphemes": 1000 15 + }, 16 + "video": { 17 + "type": "blob", 18 + "accept": [ 19 + "video/mp4" 20 + ], 21 + "maxSize": 100000000, 22 + "description": "The mp4 video file. May be up to 100mb, formerly limited to 50mb." 23 + }, 24 + "captions": { 25 + "type": "array", 26 + "items": { 27 + "ref": "#caption", 28 + "type": "ref" 29 + }, 30 + "maxLength": 20 31 + }, 32 + "aspectRatio": { 33 + "ref": "app.bsky.embed.defs#aspectRatio", 34 + "type": "ref" 35 + } 36 + } 37 + }, 38 + "view": { 39 + "type": "object", 40 + "required": [ 41 + "cid", 42 + "playlist" 43 + ], 44 + "properties": { 45 + "alt": { 46 + "type": "string", 47 + "maxLength": 10000, 48 + "maxGraphemes": 1000 49 + }, 50 + "cid": { 51 + "type": "string", 52 + "format": "cid" 53 + }, 54 + "playlist": { 55 + "type": "string", 56 + "format": "uri" 57 + }, 58 + "thumbnail": { 59 + "type": "string", 60 + "format": "uri" 61 + }, 62 + "aspectRatio": { 63 + "ref": "app.bsky.embed.defs#aspectRatio", 64 + "type": "ref" 65 + } 66 + } 67 + }, 68 + "caption": { 69 + "type": "object", 70 + "required": [ 71 + "lang", 72 + "file" 73 + ], 74 + "properties": { 75 + "file": { 76 + "type": "blob", 77 + "accept": [ 78 + "text/vtt" 79 + ], 80 + "maxSize": 20000 81 + }, 82 + "lang": { 83 + "type": "string", 84 + "format": "language" 85 + } 86 + } 87 + } 88 + }, 89 + "$type": "com.atproto.lexicon.schema", 90 + "lexicon": 1, 91 + "description": "A video embedded in a Bluesky record (eg, a post)." 92 + }
+544
lexicons/app/bsky/feed/defs.json
··· 1 + { 2 + "id": "app.bsky.feed.defs", 3 + "defs": { 4 + "postView": { 5 + "type": "object", 6 + "required": [ 7 + "uri", 8 + "cid", 9 + "author", 10 + "record", 11 + "indexedAt" 12 + ], 13 + "properties": { 14 + "cid": { 15 + "type": "string", 16 + "format": "cid" 17 + }, 18 + "uri": { 19 + "type": "string", 20 + "format": "at-uri" 21 + }, 22 + "debug": { 23 + "type": "unknown", 24 + "description": "Debug information for internal development" 25 + }, 26 + "embed": { 27 + "refs": [ 28 + "app.bsky.embed.images#view", 29 + "app.bsky.embed.video#view", 30 + "app.bsky.embed.external#view", 31 + "app.bsky.embed.record#view", 32 + "app.bsky.embed.recordWithMedia#view" 33 + ], 34 + "type": "union" 35 + }, 36 + "author": { 37 + "ref": "app.bsky.actor.defs#profileViewBasic", 38 + "type": "ref" 39 + }, 40 + "labels": { 41 + "type": "array", 42 + "items": { 43 + "ref": "com.atproto.label.defs#label", 44 + "type": "ref" 45 + } 46 + }, 47 + "record": { 48 + "type": "unknown" 49 + }, 50 + "viewer": { 51 + "ref": "#viewerState", 52 + "type": "ref" 53 + }, 54 + "indexedAt": { 55 + "type": "string", 56 + "format": "datetime" 57 + }, 58 + "likeCount": { 59 + "type": "integer" 60 + }, 61 + "quoteCount": { 62 + "type": "integer" 63 + }, 64 + "replyCount": { 65 + "type": "integer" 66 + }, 67 + "threadgate": { 68 + "ref": "#threadgateView", 69 + "type": "ref" 70 + }, 71 + "repostCount": { 72 + "type": "integer" 73 + }, 74 + "bookmarkCount": { 75 + "type": "integer" 76 + } 77 + } 78 + }, 79 + "replyRef": { 80 + "type": "object", 81 + "required": [ 82 + "root", 83 + "parent" 84 + ], 85 + "properties": { 86 + "root": { 87 + "refs": [ 88 + "#postView", 89 + "#notFoundPost", 90 + "#blockedPost" 91 + ], 92 + "type": "union" 93 + }, 94 + "parent": { 95 + "refs": [ 96 + "#postView", 97 + "#notFoundPost", 98 + "#blockedPost" 99 + ], 100 + "type": "union" 101 + }, 102 + "grandparentAuthor": { 103 + "ref": "app.bsky.actor.defs#profileViewBasic", 104 + "type": "ref", 105 + "description": "When parent is a reply to another post, this is the author of that post." 106 + } 107 + } 108 + }, 109 + "reasonPin": { 110 + "type": "object", 111 + "properties": {} 112 + }, 113 + "blockedPost": { 114 + "type": "object", 115 + "required": [ 116 + "uri", 117 + "blocked", 118 + "author" 119 + ], 120 + "properties": { 121 + "uri": { 122 + "type": "string", 123 + "format": "at-uri" 124 + }, 125 + "author": { 126 + "ref": "#blockedAuthor", 127 + "type": "ref" 128 + }, 129 + "blocked": { 130 + "type": "boolean", 131 + "const": true 132 + } 133 + } 134 + }, 135 + "interaction": { 136 + "type": "object", 137 + "properties": { 138 + "item": { 139 + "type": "string", 140 + "format": "at-uri" 141 + }, 142 + "event": { 143 + "type": "string", 144 + "knownValues": [ 145 + "app.bsky.feed.defs#requestLess", 146 + "app.bsky.feed.defs#requestMore", 147 + "app.bsky.feed.defs#clickthroughItem", 148 + "app.bsky.feed.defs#clickthroughAuthor", 149 + "app.bsky.feed.defs#clickthroughReposter", 150 + "app.bsky.feed.defs#clickthroughEmbed", 151 + "app.bsky.feed.defs#interactionSeen", 152 + "app.bsky.feed.defs#interactionLike", 153 + "app.bsky.feed.defs#interactionRepost", 154 + "app.bsky.feed.defs#interactionReply", 155 + "app.bsky.feed.defs#interactionQuote", 156 + "app.bsky.feed.defs#interactionShare" 157 + ] 158 + }, 159 + "reqId": { 160 + "type": "string", 161 + "maxLength": 100, 162 + "description": "Unique identifier per request that may be passed back alongside interactions." 163 + }, 164 + "feedContext": { 165 + "type": "string", 166 + "maxLength": 2000, 167 + "description": "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton." 168 + } 169 + } 170 + }, 171 + "requestLess": { 172 + "type": "token", 173 + "description": "Request that less content like the given feed item be shown in the feed" 174 + }, 175 + "requestMore": { 176 + "type": "token", 177 + "description": "Request that more content like the given feed item be shown in the feed" 178 + }, 179 + "viewerState": { 180 + "type": "object", 181 + "properties": { 182 + "like": { 183 + "type": "string", 184 + "format": "at-uri" 185 + }, 186 + "pinned": { 187 + "type": "boolean" 188 + }, 189 + "repost": { 190 + "type": "string", 191 + "format": "at-uri" 192 + }, 193 + "bookmarked": { 194 + "type": "boolean" 195 + }, 196 + "threadMuted": { 197 + "type": "boolean" 198 + }, 199 + "replyDisabled": { 200 + "type": "boolean" 201 + }, 202 + "embeddingDisabled": { 203 + "type": "boolean" 204 + } 205 + }, 206 + "description": "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests." 207 + }, 208 + "feedViewPost": { 209 + "type": "object", 210 + "required": [ 211 + "post" 212 + ], 213 + "properties": { 214 + "post": { 215 + "ref": "#postView", 216 + "type": "ref" 217 + }, 218 + "reply": { 219 + "ref": "#replyRef", 220 + "type": "ref" 221 + }, 222 + "reqId": { 223 + "type": "string", 224 + "maxLength": 100, 225 + "description": "Unique identifier per request that may be passed back alongside interactions." 226 + }, 227 + "reason": { 228 + "refs": [ 229 + "#reasonRepost", 230 + "#reasonPin" 231 + ], 232 + "type": "union" 233 + }, 234 + "feedContext": { 235 + "type": "string", 236 + "maxLength": 2000, 237 + "description": "Context provided by feed generator that may be passed back alongside interactions." 238 + } 239 + } 240 + }, 241 + "notFoundPost": { 242 + "type": "object", 243 + "required": [ 244 + "uri", 245 + "notFound" 246 + ], 247 + "properties": { 248 + "uri": { 249 + "type": "string", 250 + "format": "at-uri" 251 + }, 252 + "notFound": { 253 + "type": "boolean", 254 + "const": true 255 + } 256 + } 257 + }, 258 + "reasonRepost": { 259 + "type": "object", 260 + "required": [ 261 + "by", 262 + "indexedAt" 263 + ], 264 + "properties": { 265 + "by": { 266 + "ref": "app.bsky.actor.defs#profileViewBasic", 267 + "type": "ref" 268 + }, 269 + "cid": { 270 + "type": "string", 271 + "format": "cid" 272 + }, 273 + "uri": { 274 + "type": "string", 275 + "format": "at-uri" 276 + }, 277 + "indexedAt": { 278 + "type": "string", 279 + "format": "datetime" 280 + } 281 + } 282 + }, 283 + "blockedAuthor": { 284 + "type": "object", 285 + "required": [ 286 + "did" 287 + ], 288 + "properties": { 289 + "did": { 290 + "type": "string", 291 + "format": "did" 292 + }, 293 + "viewer": { 294 + "ref": "app.bsky.actor.defs#viewerState", 295 + "type": "ref" 296 + } 297 + } 298 + }, 299 + "generatorView": { 300 + "type": "object", 301 + "required": [ 302 + "uri", 303 + "cid", 304 + "did", 305 + "creator", 306 + "displayName", 307 + "indexedAt" 308 + ], 309 + "properties": { 310 + "cid": { 311 + "type": "string", 312 + "format": "cid" 313 + }, 314 + "did": { 315 + "type": "string", 316 + "format": "did" 317 + }, 318 + "uri": { 319 + "type": "string", 320 + "format": "at-uri" 321 + }, 322 + "avatar": { 323 + "type": "string", 324 + "format": "uri" 325 + }, 326 + "labels": { 327 + "type": "array", 328 + "items": { 329 + "ref": "com.atproto.label.defs#label", 330 + "type": "ref" 331 + } 332 + }, 333 + "viewer": { 334 + "ref": "#generatorViewerState", 335 + "type": "ref" 336 + }, 337 + "creator": { 338 + "ref": "app.bsky.actor.defs#profileView", 339 + "type": "ref" 340 + }, 341 + "indexedAt": { 342 + "type": "string", 343 + "format": "datetime" 344 + }, 345 + "likeCount": { 346 + "type": "integer", 347 + "minimum": 0 348 + }, 349 + "contentMode": { 350 + "type": "string", 351 + "knownValues": [ 352 + "app.bsky.feed.defs#contentModeUnspecified", 353 + "app.bsky.feed.defs#contentModeVideo" 354 + ] 355 + }, 356 + "description": { 357 + "type": "string", 358 + "maxLength": 3000, 359 + "maxGraphemes": 300 360 + }, 361 + "displayName": { 362 + "type": "string" 363 + }, 364 + "descriptionFacets": { 365 + "type": "array", 366 + "items": { 367 + "ref": "app.bsky.richtext.facet", 368 + "type": "ref" 369 + } 370 + }, 371 + "acceptsInteractions": { 372 + "type": "boolean" 373 + } 374 + } 375 + }, 376 + "threadContext": { 377 + "type": "object", 378 + "properties": { 379 + "rootAuthorLike": { 380 + "type": "string", 381 + "format": "at-uri" 382 + } 383 + }, 384 + "description": "Metadata about this post within the context of the thread it is in." 385 + }, 386 + "threadViewPost": { 387 + "type": "object", 388 + "required": [ 389 + "post" 390 + ], 391 + "properties": { 392 + "post": { 393 + "ref": "#postView", 394 + "type": "ref" 395 + }, 396 + "parent": { 397 + "refs": [ 398 + "#threadViewPost", 399 + "#notFoundPost", 400 + "#blockedPost" 401 + ], 402 + "type": "union" 403 + }, 404 + "replies": { 405 + "type": "array", 406 + "items": { 407 + "refs": [ 408 + "#threadViewPost", 409 + "#notFoundPost", 410 + "#blockedPost" 411 + ], 412 + "type": "union" 413 + } 414 + }, 415 + "threadContext": { 416 + "ref": "#threadContext", 417 + "type": "ref" 418 + } 419 + } 420 + }, 421 + "threadgateView": { 422 + "type": "object", 423 + "properties": { 424 + "cid": { 425 + "type": "string", 426 + "format": "cid" 427 + }, 428 + "uri": { 429 + "type": "string", 430 + "format": "at-uri" 431 + }, 432 + "lists": { 433 + "type": "array", 434 + "items": { 435 + "ref": "app.bsky.graph.defs#listViewBasic", 436 + "type": "ref" 437 + } 438 + }, 439 + "record": { 440 + "type": "unknown" 441 + } 442 + } 443 + }, 444 + "interactionLike": { 445 + "type": "token", 446 + "description": "User liked the feed item" 447 + }, 448 + "interactionSeen": { 449 + "type": "token", 450 + "description": "Feed item was seen by user" 451 + }, 452 + "clickthroughItem": { 453 + "type": "token", 454 + "description": "User clicked through to the feed item" 455 + }, 456 + "contentModeVideo": { 457 + "type": "token", 458 + "description": "Declares the feed generator returns posts containing app.bsky.embed.video embeds." 459 + }, 460 + "interactionQuote": { 461 + "type": "token", 462 + "description": "User quoted the feed item" 463 + }, 464 + "interactionReply": { 465 + "type": "token", 466 + "description": "User replied to the feed item" 467 + }, 468 + "interactionShare": { 469 + "type": "token", 470 + "description": "User shared the feed item" 471 + }, 472 + "skeletonFeedPost": { 473 + "type": "object", 474 + "required": [ 475 + "post" 476 + ], 477 + "properties": { 478 + "post": { 479 + "type": "string", 480 + "format": "at-uri" 481 + }, 482 + "reason": { 483 + "refs": [ 484 + "#skeletonReasonRepost", 485 + "#skeletonReasonPin" 486 + ], 487 + "type": "union" 488 + }, 489 + "feedContext": { 490 + "type": "string", 491 + "maxLength": 2000, 492 + "description": "Context that will be passed through to client and may be passed to feed generator back alongside interactions." 493 + } 494 + } 495 + }, 496 + "clickthroughEmbed": { 497 + "type": "token", 498 + "description": "User clicked through to the embedded content of the feed item" 499 + }, 500 + "interactionRepost": { 501 + "type": "token", 502 + "description": "User reposted the feed item" 503 + }, 504 + "skeletonReasonPin": { 505 + "type": "object", 506 + "properties": {} 507 + }, 508 + "clickthroughAuthor": { 509 + "type": "token", 510 + "description": "User clicked through to the author of the feed item" 511 + }, 512 + "clickthroughReposter": { 513 + "type": "token", 514 + "description": "User clicked through to the reposter of the feed item" 515 + }, 516 + "generatorViewerState": { 517 + "type": "object", 518 + "properties": { 519 + "like": { 520 + "type": "string", 521 + "format": "at-uri" 522 + } 523 + } 524 + }, 525 + "skeletonReasonRepost": { 526 + "type": "object", 527 + "required": [ 528 + "repost" 529 + ], 530 + "properties": { 531 + "repost": { 532 + "type": "string", 533 + "format": "at-uri" 534 + } 535 + } 536 + }, 537 + "contentModeUnspecified": { 538 + "type": "token", 539 + "description": "Declares the feed generator returns any types of posts." 540 + } 541 + }, 542 + "$type": "com.atproto.lexicon.schema", 543 + "lexicon": 1 544 + }
+55
lexicons/app/bsky/feed/postgate.json
··· 1 + { 2 + "id": "app.bsky.feed.postgate", 3 + "defs": { 4 + "main": { 5 + "key": "tid", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": [ 10 + "post", 11 + "createdAt" 12 + ], 13 + "properties": { 14 + "post": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "Reference (AT-URI) to the post record." 18 + }, 19 + "createdAt": { 20 + "type": "string", 21 + "format": "datetime" 22 + }, 23 + "embeddingRules": { 24 + "type": "array", 25 + "items": { 26 + "refs": [ 27 + "#disableRule" 28 + ], 29 + "type": "union" 30 + }, 31 + "maxLength": 5, 32 + "description": "List of rules defining who can embed this post. If value is an empty array or is undefined, no particular rules apply and anyone can embed." 33 + }, 34 + "detachedEmbeddingUris": { 35 + "type": "array", 36 + "items": { 37 + "type": "string", 38 + "format": "at-uri" 39 + }, 40 + "maxLength": 50, 41 + "description": "List of AT-URIs embedding this post that the author has detached from." 42 + } 43 + } 44 + }, 45 + "description": "Record defining interaction rules for a post. The record key (rkey) of the postgate record must match the record key of the post, and that record must be in the same repository." 46 + }, 47 + "disableRule": { 48 + "type": "object", 49 + "properties": {}, 50 + "description": "Disables embedding of this post." 51 + } 52 + }, 53 + "$type": "com.atproto.lexicon.schema", 54 + "lexicon": 1 55 + }
+81
lexicons/app/bsky/feed/threadgate.json
··· 1 + { 2 + "id": "app.bsky.feed.threadgate", 3 + "defs": { 4 + "main": { 5 + "key": "tid", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": [ 10 + "post", 11 + "createdAt" 12 + ], 13 + "properties": { 14 + "post": { 15 + "type": "string", 16 + "format": "at-uri", 17 + "description": "Reference (AT-URI) to the post record." 18 + }, 19 + "allow": { 20 + "type": "array", 21 + "items": { 22 + "refs": [ 23 + "#mentionRule", 24 + "#followerRule", 25 + "#followingRule", 26 + "#listRule" 27 + ], 28 + "type": "union" 29 + }, 30 + "maxLength": 5, 31 + "description": "List of rules defining who can reply to this post. If value is an empty array, no one can reply. If value is undefined, anyone can reply." 32 + }, 33 + "createdAt": { 34 + "type": "string", 35 + "format": "datetime" 36 + }, 37 + "hiddenReplies": { 38 + "type": "array", 39 + "items": { 40 + "type": "string", 41 + "format": "at-uri" 42 + }, 43 + "maxLength": 300, 44 + "description": "List of hidden reply URIs." 45 + } 46 + } 47 + }, 48 + "description": "Record defining interaction gating rules for a thread (aka, reply controls). The record key (rkey) of the threadgate record must match the record key of the thread's root post, and that record must be in the same repository." 49 + }, 50 + "listRule": { 51 + "type": "object", 52 + "required": [ 53 + "list" 54 + ], 55 + "properties": { 56 + "list": { 57 + "type": "string", 58 + "format": "at-uri" 59 + } 60 + }, 61 + "description": "Allow replies from actors on a list." 62 + }, 63 + "mentionRule": { 64 + "type": "object", 65 + "properties": {}, 66 + "description": "Allow replies from actors mentioned in your post." 67 + }, 68 + "followerRule": { 69 + "type": "object", 70 + "properties": {}, 71 + "description": "Allow replies from actors who follow you." 72 + }, 73 + "followingRule": { 74 + "type": "object", 75 + "properties": {}, 76 + "description": "Allow replies from actors you follow." 77 + } 78 + }, 79 + "$type": "com.atproto.lexicon.schema", 80 + "lexicon": 1 81 + }
+333
lexicons/app/bsky/graph/defs.json
··· 1 + { 2 + "id": "app.bsky.graph.defs", 3 + "defs": { 4 + "modlist": { 5 + "type": "token", 6 + "description": "A list of actors to apply an aggregate moderation action (mute/block) on." 7 + }, 8 + "listView": { 9 + "type": "object", 10 + "required": [ 11 + "uri", 12 + "cid", 13 + "creator", 14 + "name", 15 + "purpose", 16 + "indexedAt" 17 + ], 18 + "properties": { 19 + "cid": { 20 + "type": "string", 21 + "format": "cid" 22 + }, 23 + "uri": { 24 + "type": "string", 25 + "format": "at-uri" 26 + }, 27 + "name": { 28 + "type": "string", 29 + "maxLength": 64, 30 + "minLength": 1 31 + }, 32 + "avatar": { 33 + "type": "string", 34 + "format": "uri" 35 + }, 36 + "labels": { 37 + "type": "array", 38 + "items": { 39 + "ref": "com.atproto.label.defs#label", 40 + "type": "ref" 41 + } 42 + }, 43 + "viewer": { 44 + "ref": "#listViewerState", 45 + "type": "ref" 46 + }, 47 + "creator": { 48 + "ref": "app.bsky.actor.defs#profileView", 49 + "type": "ref" 50 + }, 51 + "purpose": { 52 + "ref": "#listPurpose", 53 + "type": "ref" 54 + }, 55 + "indexedAt": { 56 + "type": "string", 57 + "format": "datetime" 58 + }, 59 + "description": { 60 + "type": "string", 61 + "maxLength": 3000, 62 + "maxGraphemes": 300 63 + }, 64 + "listItemCount": { 65 + "type": "integer", 66 + "minimum": 0 67 + }, 68 + "descriptionFacets": { 69 + "type": "array", 70 + "items": { 71 + "ref": "app.bsky.richtext.facet", 72 + "type": "ref" 73 + } 74 + } 75 + } 76 + }, 77 + "curatelist": { 78 + "type": "token", 79 + "description": "A list of actors used for curation purposes such as list feeds or interaction gating." 80 + }, 81 + "listPurpose": { 82 + "type": "string", 83 + "knownValues": [ 84 + "app.bsky.graph.defs#modlist", 85 + "app.bsky.graph.defs#curatelist", 86 + "app.bsky.graph.defs#referencelist" 87 + ] 88 + }, 89 + "listItemView": { 90 + "type": "object", 91 + "required": [ 92 + "uri", 93 + "subject" 94 + ], 95 + "properties": { 96 + "uri": { 97 + "type": "string", 98 + "format": "at-uri" 99 + }, 100 + "subject": { 101 + "ref": "app.bsky.actor.defs#profileView", 102 + "type": "ref" 103 + } 104 + } 105 + }, 106 + "relationship": { 107 + "type": "object", 108 + "required": [ 109 + "did" 110 + ], 111 + "properties": { 112 + "did": { 113 + "type": "string", 114 + "format": "did" 115 + }, 116 + "following": { 117 + "type": "string", 118 + "format": "at-uri", 119 + "description": "if the actor follows this DID, this is the AT-URI of the follow record" 120 + }, 121 + "followedBy": { 122 + "type": "string", 123 + "format": "at-uri", 124 + "description": "if the actor is followed by this DID, contains the AT-URI of the follow record" 125 + } 126 + }, 127 + "description": "lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object)" 128 + }, 129 + "listViewBasic": { 130 + "type": "object", 131 + "required": [ 132 + "uri", 133 + "cid", 134 + "name", 135 + "purpose" 136 + ], 137 + "properties": { 138 + "cid": { 139 + "type": "string", 140 + "format": "cid" 141 + }, 142 + "uri": { 143 + "type": "string", 144 + "format": "at-uri" 145 + }, 146 + "name": { 147 + "type": "string", 148 + "maxLength": 64, 149 + "minLength": 1 150 + }, 151 + "avatar": { 152 + "type": "string", 153 + "format": "uri" 154 + }, 155 + "labels": { 156 + "type": "array", 157 + "items": { 158 + "ref": "com.atproto.label.defs#label", 159 + "type": "ref" 160 + } 161 + }, 162 + "viewer": { 163 + "ref": "#listViewerState", 164 + "type": "ref" 165 + }, 166 + "purpose": { 167 + "ref": "#listPurpose", 168 + "type": "ref" 169 + }, 170 + "indexedAt": { 171 + "type": "string", 172 + "format": "datetime" 173 + }, 174 + "listItemCount": { 175 + "type": "integer", 176 + "minimum": 0 177 + } 178 + } 179 + }, 180 + "notFoundActor": { 181 + "type": "object", 182 + "required": [ 183 + "actor", 184 + "notFound" 185 + ], 186 + "properties": { 187 + "actor": { 188 + "type": "string", 189 + "format": "at-identifier" 190 + }, 191 + "notFound": { 192 + "type": "boolean", 193 + "const": true 194 + } 195 + }, 196 + "description": "indicates that a handle or DID could not be resolved" 197 + }, 198 + "referencelist": { 199 + "type": "token", 200 + "description": "A list of actors used for only for reference purposes such as within a starter pack." 201 + }, 202 + "listViewerState": { 203 + "type": "object", 204 + "properties": { 205 + "muted": { 206 + "type": "boolean" 207 + }, 208 + "blocked": { 209 + "type": "string", 210 + "format": "at-uri" 211 + } 212 + } 213 + }, 214 + "starterPackView": { 215 + "type": "object", 216 + "required": [ 217 + "uri", 218 + "cid", 219 + "record", 220 + "creator", 221 + "indexedAt" 222 + ], 223 + "properties": { 224 + "cid": { 225 + "type": "string", 226 + "format": "cid" 227 + }, 228 + "uri": { 229 + "type": "string", 230 + "format": "at-uri" 231 + }, 232 + "list": { 233 + "ref": "#listViewBasic", 234 + "type": "ref" 235 + }, 236 + "feeds": { 237 + "type": "array", 238 + "items": { 239 + "ref": "app.bsky.feed.defs#generatorView", 240 + "type": "ref" 241 + }, 242 + "maxLength": 3 243 + }, 244 + "labels": { 245 + "type": "array", 246 + "items": { 247 + "ref": "com.atproto.label.defs#label", 248 + "type": "ref" 249 + } 250 + }, 251 + "record": { 252 + "type": "unknown" 253 + }, 254 + "creator": { 255 + "ref": "app.bsky.actor.defs#profileViewBasic", 256 + "type": "ref" 257 + }, 258 + "indexedAt": { 259 + "type": "string", 260 + "format": "datetime" 261 + }, 262 + "joinedWeekCount": { 263 + "type": "integer", 264 + "minimum": 0 265 + }, 266 + "listItemsSample": { 267 + "type": "array", 268 + "items": { 269 + "ref": "#listItemView", 270 + "type": "ref" 271 + }, 272 + "maxLength": 12 273 + }, 274 + "joinedAllTimeCount": { 275 + "type": "integer", 276 + "minimum": 0 277 + } 278 + } 279 + }, 280 + "starterPackViewBasic": { 281 + "type": "object", 282 + "required": [ 283 + "uri", 284 + "cid", 285 + "record", 286 + "creator", 287 + "indexedAt" 288 + ], 289 + "properties": { 290 + "cid": { 291 + "type": "string", 292 + "format": "cid" 293 + }, 294 + "uri": { 295 + "type": "string", 296 + "format": "at-uri" 297 + }, 298 + "labels": { 299 + "type": "array", 300 + "items": { 301 + "ref": "com.atproto.label.defs#label", 302 + "type": "ref" 303 + } 304 + }, 305 + "record": { 306 + "type": "unknown" 307 + }, 308 + "creator": { 309 + "ref": "app.bsky.actor.defs#profileViewBasic", 310 + "type": "ref" 311 + }, 312 + "indexedAt": { 313 + "type": "string", 314 + "format": "datetime" 315 + }, 316 + "listItemCount": { 317 + "type": "integer", 318 + "minimum": 0 319 + }, 320 + "joinedWeekCount": { 321 + "type": "integer", 322 + "minimum": 0 323 + }, 324 + "joinedAllTimeCount": { 325 + "type": "integer", 326 + "minimum": 0 327 + } 328 + } 329 + } 330 + }, 331 + "$type": "com.atproto.lexicon.schema", 332 + "lexicon": 1 333 + }
+153
lexicons/app/bsky/labeler/defs.json
··· 1 + { 2 + "id": "app.bsky.labeler.defs", 3 + "defs": { 4 + "labelerView": { 5 + "type": "object", 6 + "required": [ 7 + "uri", 8 + "cid", 9 + "creator", 10 + "indexedAt" 11 + ], 12 + "properties": { 13 + "cid": { 14 + "type": "string", 15 + "format": "cid" 16 + }, 17 + "uri": { 18 + "type": "string", 19 + "format": "at-uri" 20 + }, 21 + "labels": { 22 + "type": "array", 23 + "items": { 24 + "ref": "com.atproto.label.defs#label", 25 + "type": "ref" 26 + } 27 + }, 28 + "viewer": { 29 + "ref": "#labelerViewerState", 30 + "type": "ref" 31 + }, 32 + "creator": { 33 + "ref": "app.bsky.actor.defs#profileView", 34 + "type": "ref" 35 + }, 36 + "indexedAt": { 37 + "type": "string", 38 + "format": "datetime" 39 + }, 40 + "likeCount": { 41 + "type": "integer", 42 + "minimum": 0 43 + } 44 + } 45 + }, 46 + "labelerPolicies": { 47 + "type": "object", 48 + "required": [ 49 + "labelValues" 50 + ], 51 + "properties": { 52 + "labelValues": { 53 + "type": "array", 54 + "items": { 55 + "ref": "com.atproto.label.defs#labelValue", 56 + "type": "ref" 57 + }, 58 + "description": "The label values which this labeler publishes. May include global or custom labels." 59 + }, 60 + "labelValueDefinitions": { 61 + "type": "array", 62 + "items": { 63 + "ref": "com.atproto.label.defs#labelValueDefinition", 64 + "type": "ref" 65 + }, 66 + "description": "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler." 67 + } 68 + } 69 + }, 70 + "labelerViewerState": { 71 + "type": "object", 72 + "properties": { 73 + "like": { 74 + "type": "string", 75 + "format": "at-uri" 76 + } 77 + } 78 + }, 79 + "labelerViewDetailed": { 80 + "type": "object", 81 + "required": [ 82 + "uri", 83 + "cid", 84 + "creator", 85 + "policies", 86 + "indexedAt" 87 + ], 88 + "properties": { 89 + "cid": { 90 + "type": "string", 91 + "format": "cid" 92 + }, 93 + "uri": { 94 + "type": "string", 95 + "format": "at-uri" 96 + }, 97 + "labels": { 98 + "type": "array", 99 + "items": { 100 + "ref": "com.atproto.label.defs#label", 101 + "type": "ref" 102 + } 103 + }, 104 + "viewer": { 105 + "ref": "#labelerViewerState", 106 + "type": "ref" 107 + }, 108 + "creator": { 109 + "ref": "app.bsky.actor.defs#profileView", 110 + "type": "ref" 111 + }, 112 + "policies": { 113 + "ref": "app.bsky.labeler.defs#labelerPolicies", 114 + "type": "ref" 115 + }, 116 + "indexedAt": { 117 + "type": "string", 118 + "format": "datetime" 119 + }, 120 + "likeCount": { 121 + "type": "integer", 122 + "minimum": 0 123 + }, 124 + "reasonTypes": { 125 + "type": "array", 126 + "items": { 127 + "ref": "com.atproto.moderation.defs#reasonType", 128 + "type": "ref" 129 + }, 130 + "description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed." 131 + }, 132 + "subjectTypes": { 133 + "type": "array", 134 + "items": { 135 + "ref": "com.atproto.moderation.defs#subjectType", 136 + "type": "ref" 137 + }, 138 + "description": "The set of subject types (account, record, etc) this service accepts reports on." 139 + }, 140 + "subjectCollections": { 141 + "type": "array", 142 + "items": { 143 + "type": "string", 144 + "format": "nsid" 145 + }, 146 + "description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type." 147 + } 148 + } 149 + } 150 + }, 151 + "$type": "com.atproto.lexicon.schema", 152 + "lexicon": 1 153 + }
+173
lexicons/app/bsky/notification/defs.json
··· 1 + { 2 + "id": "app.bsky.notification.defs", 3 + "defs": { 4 + "preference": { 5 + "type": "object", 6 + "required": [ 7 + "list", 8 + "push" 9 + ], 10 + "properties": { 11 + "list": { 12 + "type": "boolean" 13 + }, 14 + "push": { 15 + "type": "boolean" 16 + } 17 + } 18 + }, 19 + "preferences": { 20 + "type": "object", 21 + "required": [ 22 + "chat", 23 + "follow", 24 + "like", 25 + "likeViaRepost", 26 + "mention", 27 + "quote", 28 + "reply", 29 + "repost", 30 + "repostViaRepost", 31 + "starterpackJoined", 32 + "subscribedPost", 33 + "unverified", 34 + "verified" 35 + ], 36 + "properties": { 37 + "chat": { 38 + "ref": "#chatPreference", 39 + "type": "ref" 40 + }, 41 + "like": { 42 + "ref": "#filterablePreference", 43 + "type": "ref" 44 + }, 45 + "quote": { 46 + "ref": "#filterablePreference", 47 + "type": "ref" 48 + }, 49 + "reply": { 50 + "ref": "#filterablePreference", 51 + "type": "ref" 52 + }, 53 + "follow": { 54 + "ref": "#filterablePreference", 55 + "type": "ref" 56 + }, 57 + "repost": { 58 + "ref": "#filterablePreference", 59 + "type": "ref" 60 + }, 61 + "mention": { 62 + "ref": "#filterablePreference", 63 + "type": "ref" 64 + }, 65 + "verified": { 66 + "ref": "#preference", 67 + "type": "ref" 68 + }, 69 + "unverified": { 70 + "ref": "#preference", 71 + "type": "ref" 72 + }, 73 + "likeViaRepost": { 74 + "ref": "#filterablePreference", 75 + "type": "ref" 76 + }, 77 + "subscribedPost": { 78 + "ref": "#preference", 79 + "type": "ref" 80 + }, 81 + "repostViaRepost": { 82 + "ref": "#filterablePreference", 83 + "type": "ref" 84 + }, 85 + "starterpackJoined": { 86 + "ref": "#preference", 87 + "type": "ref" 88 + } 89 + } 90 + }, 91 + "recordDeleted": { 92 + "type": "object", 93 + "properties": {} 94 + }, 95 + "chatPreference": { 96 + "type": "object", 97 + "required": [ 98 + "include", 99 + "push" 100 + ], 101 + "properties": { 102 + "push": { 103 + "type": "boolean" 104 + }, 105 + "include": { 106 + "type": "string", 107 + "knownValues": [ 108 + "all", 109 + "accepted" 110 + ] 111 + } 112 + } 113 + }, 114 + "activitySubscription": { 115 + "type": "object", 116 + "required": [ 117 + "post", 118 + "reply" 119 + ], 120 + "properties": { 121 + "post": { 122 + "type": "boolean" 123 + }, 124 + "reply": { 125 + "type": "boolean" 126 + } 127 + } 128 + }, 129 + "filterablePreference": { 130 + "type": "object", 131 + "required": [ 132 + "include", 133 + "list", 134 + "push" 135 + ], 136 + "properties": { 137 + "list": { 138 + "type": "boolean" 139 + }, 140 + "push": { 141 + "type": "boolean" 142 + }, 143 + "include": { 144 + "type": "string", 145 + "knownValues": [ 146 + "all", 147 + "follows" 148 + ] 149 + } 150 + } 151 + }, 152 + "subjectActivitySubscription": { 153 + "type": "object", 154 + "required": [ 155 + "subject", 156 + "activitySubscription" 157 + ], 158 + "properties": { 159 + "subject": { 160 + "type": "string", 161 + "format": "did" 162 + }, 163 + "activitySubscription": { 164 + "ref": "#activitySubscription", 165 + "type": "ref" 166 + } 167 + }, 168 + "description": "Object used to store activity subscription data in stash." 169 + } 170 + }, 171 + "$type": "com.atproto.lexicon.schema", 172 + "lexicon": 1 173 + }
+90
lexicons/app/bsky/richtext/facet.json
··· 1 + { 2 + "id": "app.bsky.richtext.facet", 3 + "defs": { 4 + "tag": { 5 + "type": "object", 6 + "required": [ 7 + "tag" 8 + ], 9 + "properties": { 10 + "tag": { 11 + "type": "string", 12 + "maxLength": 640, 13 + "maxGraphemes": 64 14 + } 15 + }, 16 + "description": "Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags')." 17 + }, 18 + "link": { 19 + "type": "object", 20 + "required": [ 21 + "uri" 22 + ], 23 + "properties": { 24 + "uri": { 25 + "type": "string", 26 + "format": "uri" 27 + } 28 + }, 29 + "description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL." 30 + }, 31 + "main": { 32 + "type": "object", 33 + "required": [ 34 + "index", 35 + "features" 36 + ], 37 + "properties": { 38 + "index": { 39 + "ref": "#byteSlice", 40 + "type": "ref" 41 + }, 42 + "features": { 43 + "type": "array", 44 + "items": { 45 + "refs": [ 46 + "#mention", 47 + "#link", 48 + "#tag" 49 + ], 50 + "type": "union" 51 + } 52 + } 53 + }, 54 + "description": "Annotation of a sub-string within rich text." 55 + }, 56 + "mention": { 57 + "type": "object", 58 + "required": [ 59 + "did" 60 + ], 61 + "properties": { 62 + "did": { 63 + "type": "string", 64 + "format": "did" 65 + } 66 + }, 67 + "description": "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID." 68 + }, 69 + "byteSlice": { 70 + "type": "object", 71 + "required": [ 72 + "byteStart", 73 + "byteEnd" 74 + ], 75 + "properties": { 76 + "byteEnd": { 77 + "type": "integer", 78 + "minimum": 0 79 + }, 80 + "byteStart": { 81 + "type": "integer", 82 + "minimum": 0 83 + } 84 + }, 85 + "description": "Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets." 86 + } 87 + }, 88 + "$type": "com.atproto.lexicon.schema", 89 + "lexicon": 1 90 + }
+45
lexicons/com/atproto/identity/resolveHandle.json
··· 1 + { 2 + "id": "com.atproto.identity.resolveHandle", 3 + "defs": { 4 + "main": { 5 + "type": "query", 6 + "errors": [ 7 + { 8 + "name": "HandleNotFound", 9 + "description": "The resolution process confirmed that the handle does not resolve to any DID." 10 + } 11 + ], 12 + "output": { 13 + "schema": { 14 + "type": "object", 15 + "required": [ 16 + "did" 17 + ], 18 + "properties": { 19 + "did": { 20 + "type": "string", 21 + "format": "did" 22 + } 23 + } 24 + }, 25 + "encoding": "application/json" 26 + }, 27 + "parameters": { 28 + "type": "params", 29 + "required": [ 30 + "handle" 31 + ], 32 + "properties": { 33 + "handle": { 34 + "type": "string", 35 + "format": "handle", 36 + "description": "The handle to resolve." 37 + } 38 + } 39 + }, 40 + "description": "Resolves an atproto handle (hostname) to a DID. Does not necessarily bi-directionally verify against the the DID document." 41 + } 42 + }, 43 + "$type": "com.atproto.lexicon.schema", 44 + "lexicon": 1 45 + }
+193
lexicons/com/atproto/label/defs.json
··· 1 + { 2 + "id": "com.atproto.label.defs", 3 + "defs": { 4 + "label": { 5 + "type": "object", 6 + "required": [ 7 + "src", 8 + "uri", 9 + "val", 10 + "cts" 11 + ], 12 + "properties": { 13 + "cid": { 14 + "type": "string", 15 + "format": "cid", 16 + "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." 17 + }, 18 + "cts": { 19 + "type": "string", 20 + "format": "datetime", 21 + "description": "Timestamp when this label was created." 22 + }, 23 + "exp": { 24 + "type": "string", 25 + "format": "datetime", 26 + "description": "Timestamp at which this label expires (no longer applies)." 27 + }, 28 + "neg": { 29 + "type": "boolean", 30 + "description": "If true, this is a negation label, overwriting a previous label." 31 + }, 32 + "sig": { 33 + "type": "bytes", 34 + "description": "Signature of dag-cbor encoded label." 35 + }, 36 + "src": { 37 + "type": "string", 38 + "format": "did", 39 + "description": "DID of the actor who created this label." 40 + }, 41 + "uri": { 42 + "type": "string", 43 + "format": "uri", 44 + "description": "AT URI of the record, repository (account), or other resource that this label applies to." 45 + }, 46 + "val": { 47 + "type": "string", 48 + "maxLength": 128, 49 + "description": "The short string name of the value or type of this label." 50 + }, 51 + "ver": { 52 + "type": "integer", 53 + "description": "The AT Protocol version of the label object." 54 + } 55 + }, 56 + "description": "Metadata tag on an atproto resource (eg, repo or record)." 57 + }, 58 + "selfLabel": { 59 + "type": "object", 60 + "required": [ 61 + "val" 62 + ], 63 + "properties": { 64 + "val": { 65 + "type": "string", 66 + "maxLength": 128, 67 + "description": "The short string name of the value or type of this label." 68 + } 69 + }, 70 + "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel." 71 + }, 72 + "labelValue": { 73 + "type": "string", 74 + "knownValues": [ 75 + "!hide", 76 + "!no-promote", 77 + "!warn", 78 + "!no-unauthenticated", 79 + "dmca-violation", 80 + "doxxing", 81 + "porn", 82 + "sexual", 83 + "nudity", 84 + "nsfl", 85 + "gore" 86 + ] 87 + }, 88 + "selfLabels": { 89 + "type": "object", 90 + "required": [ 91 + "values" 92 + ], 93 + "properties": { 94 + "values": { 95 + "type": "array", 96 + "items": { 97 + "ref": "#selfLabel", 98 + "type": "ref" 99 + }, 100 + "maxLength": 10 101 + } 102 + }, 103 + "description": "Metadata tags on an atproto record, published by the author within the record." 104 + }, 105 + "labelValueDefinition": { 106 + "type": "object", 107 + "required": [ 108 + "identifier", 109 + "severity", 110 + "blurs", 111 + "locales" 112 + ], 113 + "properties": { 114 + "blurs": { 115 + "type": "string", 116 + "description": "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", 117 + "knownValues": [ 118 + "content", 119 + "media", 120 + "none" 121 + ] 122 + }, 123 + "locales": { 124 + "type": "array", 125 + "items": { 126 + "ref": "#labelValueDefinitionStrings", 127 + "type": "ref" 128 + } 129 + }, 130 + "severity": { 131 + "type": "string", 132 + "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 133 + "knownValues": [ 134 + "inform", 135 + "alert", 136 + "none" 137 + ] 138 + }, 139 + "adultOnly": { 140 + "type": "boolean", 141 + "description": "Does the user need to have adult content enabled in order to configure this label?" 142 + }, 143 + "identifier": { 144 + "type": "string", 145 + "maxLength": 100, 146 + "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 147 + "maxGraphemes": 100 148 + }, 149 + "defaultSetting": { 150 + "type": "string", 151 + "default": "warn", 152 + "description": "The default setting for this label.", 153 + "knownValues": [ 154 + "ignore", 155 + "warn", 156 + "hide" 157 + ] 158 + } 159 + }, 160 + "description": "Declares a label value and its expected interpretations and behaviors." 161 + }, 162 + "labelValueDefinitionStrings": { 163 + "type": "object", 164 + "required": [ 165 + "lang", 166 + "name", 167 + "description" 168 + ], 169 + "properties": { 170 + "lang": { 171 + "type": "string", 172 + "format": "language", 173 + "description": "The code of the language these strings are written in." 174 + }, 175 + "name": { 176 + "type": "string", 177 + "maxLength": 640, 178 + "description": "A short human-readable name for the label.", 179 + "maxGraphemes": 64 180 + }, 181 + "description": { 182 + "type": "string", 183 + "maxLength": 100000, 184 + "description": "A longer description of what the label means and why it might be applied.", 185 + "maxGraphemes": 10000 186 + } 187 + }, 188 + "description": "Strings which describe the label in the UI, localized into a specific language." 189 + } 190 + }, 191 + "$type": "com.atproto.lexicon.schema", 192 + "lexicon": 1 193 + }
+96
lexicons/com/atproto/moderation/defs.json
··· 1 + { 2 + "id": "com.atproto.moderation.defs", 3 + "defs": { 4 + "reasonRude": { 5 + "type": "token", 6 + "description": "Rude, harassing, explicit, or otherwise unwelcoming behavior. Prefer new lexicon definition `tools.ozone.report.defs#reasonHarassmentOther`." 7 + }, 8 + "reasonSpam": { 9 + "type": "token", 10 + "description": "Spam: frequent unwanted promotion, replies, mentions. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingSpam`." 11 + }, 12 + "reasonType": { 13 + "type": "string", 14 + "knownValues": [ 15 + "com.atproto.moderation.defs#reasonSpam", 16 + "com.atproto.moderation.defs#reasonViolation", 17 + "com.atproto.moderation.defs#reasonMisleading", 18 + "com.atproto.moderation.defs#reasonSexual", 19 + "com.atproto.moderation.defs#reasonRude", 20 + "com.atproto.moderation.defs#reasonOther", 21 + "com.atproto.moderation.defs#reasonAppeal", 22 + "tools.ozone.report.defs#reasonAppeal", 23 + "tools.ozone.report.defs#reasonOther", 24 + "tools.ozone.report.defs#reasonViolenceAnimal", 25 + "tools.ozone.report.defs#reasonViolenceThreats", 26 + "tools.ozone.report.defs#reasonViolenceGraphicContent", 27 + "tools.ozone.report.defs#reasonViolenceGlorification", 28 + "tools.ozone.report.defs#reasonViolenceExtremistContent", 29 + "tools.ozone.report.defs#reasonViolenceTrafficking", 30 + "tools.ozone.report.defs#reasonViolenceOther", 31 + "tools.ozone.report.defs#reasonSexualAbuseContent", 32 + "tools.ozone.report.defs#reasonSexualNCII", 33 + "tools.ozone.report.defs#reasonSexualDeepfake", 34 + "tools.ozone.report.defs#reasonSexualAnimal", 35 + "tools.ozone.report.defs#reasonSexualUnlabeled", 36 + "tools.ozone.report.defs#reasonSexualOther", 37 + "tools.ozone.report.defs#reasonChildSafetyCSAM", 38 + "tools.ozone.report.defs#reasonChildSafetyGroom", 39 + "tools.ozone.report.defs#reasonChildSafetyPrivacy", 40 + "tools.ozone.report.defs#reasonChildSafetyHarassment", 41 + "tools.ozone.report.defs#reasonChildSafetyOther", 42 + "tools.ozone.report.defs#reasonHarassmentTroll", 43 + "tools.ozone.report.defs#reasonHarassmentTargeted", 44 + "tools.ozone.report.defs#reasonHarassmentHateSpeech", 45 + "tools.ozone.report.defs#reasonHarassmentDoxxing", 46 + "tools.ozone.report.defs#reasonHarassmentOther", 47 + "tools.ozone.report.defs#reasonMisleadingBot", 48 + "tools.ozone.report.defs#reasonMisleadingImpersonation", 49 + "tools.ozone.report.defs#reasonMisleadingSpam", 50 + "tools.ozone.report.defs#reasonMisleadingScam", 51 + "tools.ozone.report.defs#reasonMisleadingElections", 52 + "tools.ozone.report.defs#reasonMisleadingOther", 53 + "tools.ozone.report.defs#reasonRuleSiteSecurity", 54 + "tools.ozone.report.defs#reasonRuleProhibitedSales", 55 + "tools.ozone.report.defs#reasonRuleBanEvasion", 56 + "tools.ozone.report.defs#reasonRuleOther", 57 + "tools.ozone.report.defs#reasonSelfHarmContent", 58 + "tools.ozone.report.defs#reasonSelfHarmED", 59 + "tools.ozone.report.defs#reasonSelfHarmStunts", 60 + "tools.ozone.report.defs#reasonSelfHarmSubstances", 61 + "tools.ozone.report.defs#reasonSelfHarmOther" 62 + ] 63 + }, 64 + "reasonOther": { 65 + "type": "token", 66 + "description": "Reports not falling under another report category. Prefer new lexicon definition `tools.ozone.report.defs#reasonOther`." 67 + }, 68 + "subjectType": { 69 + "type": "string", 70 + "description": "Tag describing a type of subject that might be reported.", 71 + "knownValues": [ 72 + "account", 73 + "record", 74 + "chat" 75 + ] 76 + }, 77 + "reasonAppeal": { 78 + "type": "token", 79 + "description": "Appeal a previously taken moderation action" 80 + }, 81 + "reasonSexual": { 82 + "type": "token", 83 + "description": "Unwanted or mislabeled sexual content. Prefer new lexicon definition `tools.ozone.report.defs#reasonSexualUnlabeled`." 84 + }, 85 + "reasonViolation": { 86 + "type": "token", 87 + "description": "Direct violation of server rules, laws, terms of service. Prefer new lexicon definition `tools.ozone.report.defs#reasonRuleOther`." 88 + }, 89 + "reasonMisleading": { 90 + "type": "token", 91 + "description": "Misleading identity, affiliation, or content. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingOther`." 92 + } 93 + }, 94 + "$type": "com.atproto.lexicon.schema", 95 + "lexicon": 1 96 + }
+196
lexicons/com/atproto/repo/applyWrites.json
··· 1 + { 2 + "id": "com.atproto.repo.applyWrites", 3 + "defs": { 4 + "main": { 5 + "type": "procedure", 6 + "input": { 7 + "schema": { 8 + "type": "object", 9 + "required": [ 10 + "repo", 11 + "writes" 12 + ], 13 + "properties": { 14 + "repo": { 15 + "type": "string", 16 + "format": "at-identifier", 17 + "description": "The handle or DID of the repo (aka, current account)." 18 + }, 19 + "writes": { 20 + "type": "array", 21 + "items": { 22 + "refs": [ 23 + "#create", 24 + "#update", 25 + "#delete" 26 + ], 27 + "type": "union", 28 + "closed": true 29 + } 30 + }, 31 + "validate": { 32 + "type": "boolean", 33 + "description": "Can be set to 'false' to skip Lexicon schema validation of record data across all operations, 'true' to require it, or leave unset to validate only for known Lexicons." 34 + }, 35 + "swapCommit": { 36 + "type": "string", 37 + "format": "cid", 38 + "description": "If provided, the entire operation will fail if the current repo commit CID does not match this value. Used to prevent conflicting repo mutations." 39 + } 40 + } 41 + }, 42 + "encoding": "application/json" 43 + }, 44 + "errors": [ 45 + { 46 + "name": "InvalidSwap", 47 + "description": "Indicates that the 'swapCommit' parameter did not match current commit." 48 + } 49 + ], 50 + "output": { 51 + "schema": { 52 + "type": "object", 53 + "required": [], 54 + "properties": { 55 + "commit": { 56 + "ref": "com.atproto.repo.defs#commitMeta", 57 + "type": "ref" 58 + }, 59 + "results": { 60 + "type": "array", 61 + "items": { 62 + "refs": [ 63 + "#createResult", 64 + "#updateResult", 65 + "#deleteResult" 66 + ], 67 + "type": "union", 68 + "closed": true 69 + } 70 + } 71 + } 72 + }, 73 + "encoding": "application/json" 74 + }, 75 + "description": "Apply a batch transaction of repository creates, updates, and deletes. Requires auth, implemented by PDS." 76 + }, 77 + "create": { 78 + "type": "object", 79 + "required": [ 80 + "collection", 81 + "value" 82 + ], 83 + "properties": { 84 + "rkey": { 85 + "type": "string", 86 + "format": "record-key", 87 + "maxLength": 512, 88 + "description": "NOTE: maxLength is redundant with record-key format. Keeping it temporarily to ensure backwards compatibility." 89 + }, 90 + "value": { 91 + "type": "unknown" 92 + }, 93 + "collection": { 94 + "type": "string", 95 + "format": "nsid" 96 + } 97 + }, 98 + "description": "Operation which creates a new record." 99 + }, 100 + "delete": { 101 + "type": "object", 102 + "required": [ 103 + "collection", 104 + "rkey" 105 + ], 106 + "properties": { 107 + "rkey": { 108 + "type": "string", 109 + "format": "record-key" 110 + }, 111 + "collection": { 112 + "type": "string", 113 + "format": "nsid" 114 + } 115 + }, 116 + "description": "Operation which deletes an existing record." 117 + }, 118 + "update": { 119 + "type": "object", 120 + "required": [ 121 + "collection", 122 + "rkey", 123 + "value" 124 + ], 125 + "properties": { 126 + "rkey": { 127 + "type": "string", 128 + "format": "record-key" 129 + }, 130 + "value": { 131 + "type": "unknown" 132 + }, 133 + "collection": { 134 + "type": "string", 135 + "format": "nsid" 136 + } 137 + }, 138 + "description": "Operation which updates an existing record." 139 + }, 140 + "createResult": { 141 + "type": "object", 142 + "required": [ 143 + "uri", 144 + "cid" 145 + ], 146 + "properties": { 147 + "cid": { 148 + "type": "string", 149 + "format": "cid" 150 + }, 151 + "uri": { 152 + "type": "string", 153 + "format": "at-uri" 154 + }, 155 + "validationStatus": { 156 + "type": "string", 157 + "knownValues": [ 158 + "valid", 159 + "unknown" 160 + ] 161 + } 162 + } 163 + }, 164 + "deleteResult": { 165 + "type": "object", 166 + "required": [], 167 + "properties": {} 168 + }, 169 + "updateResult": { 170 + "type": "object", 171 + "required": [ 172 + "uri", 173 + "cid" 174 + ], 175 + "properties": { 176 + "cid": { 177 + "type": "string", 178 + "format": "cid" 179 + }, 180 + "uri": { 181 + "type": "string", 182 + "format": "at-uri" 183 + }, 184 + "validationStatus": { 185 + "type": "string", 186 + "knownValues": [ 187 + "valid", 188 + "unknown" 189 + ] 190 + } 191 + } 192 + } 193 + }, 194 + "$type": "com.atproto.lexicon.schema", 195 + "lexicon": 1 196 + }
+90
lexicons/com/atproto/repo/createRecord.json
··· 1 + { 2 + "id": "com.atproto.repo.createRecord", 3 + "defs": { 4 + "main": { 5 + "type": "procedure", 6 + "input": { 7 + "schema": { 8 + "type": "object", 9 + "required": [ 10 + "repo", 11 + "collection", 12 + "record" 13 + ], 14 + "properties": { 15 + "repo": { 16 + "type": "string", 17 + "format": "at-identifier", 18 + "description": "The handle or DID of the repo (aka, current account)." 19 + }, 20 + "rkey": { 21 + "type": "string", 22 + "format": "record-key", 23 + "maxLength": 512, 24 + "description": "The Record Key." 25 + }, 26 + "record": { 27 + "type": "unknown", 28 + "description": "The record itself. Must contain a $type field." 29 + }, 30 + "validate": { 31 + "type": "boolean", 32 + "description": "Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons." 33 + }, 34 + "collection": { 35 + "type": "string", 36 + "format": "nsid", 37 + "description": "The NSID of the record collection." 38 + }, 39 + "swapCommit": { 40 + "type": "string", 41 + "format": "cid", 42 + "description": "Compare and swap with the previous commit by CID." 43 + } 44 + } 45 + }, 46 + "encoding": "application/json" 47 + }, 48 + "errors": [ 49 + { 50 + "name": "InvalidSwap", 51 + "description": "Indicates that 'swapCommit' didn't match current repo commit." 52 + } 53 + ], 54 + "output": { 55 + "schema": { 56 + "type": "object", 57 + "required": [ 58 + "uri", 59 + "cid" 60 + ], 61 + "properties": { 62 + "cid": { 63 + "type": "string", 64 + "format": "cid" 65 + }, 66 + "uri": { 67 + "type": "string", 68 + "format": "at-uri" 69 + }, 70 + "commit": { 71 + "ref": "com.atproto.repo.defs#commitMeta", 72 + "type": "ref" 73 + }, 74 + "validationStatus": { 75 + "type": "string", 76 + "knownValues": [ 77 + "valid", 78 + "unknown" 79 + ] 80 + } 81 + } 82 + }, 83 + "encoding": "application/json" 84 + }, 85 + "description": "Create a single new repository record. Requires auth, implemented by PDS." 86 + } 87 + }, 88 + "$type": "com.atproto.lexicon.schema", 89 + "lexicon": 1 90 + }
+24
lexicons/com/atproto/repo/defs.json
··· 1 + { 2 + "id": "com.atproto.repo.defs", 3 + "defs": { 4 + "commitMeta": { 5 + "type": "object", 6 + "required": [ 7 + "cid", 8 + "rev" 9 + ], 10 + "properties": { 11 + "cid": { 12 + "type": "string", 13 + "format": "cid" 14 + }, 15 + "rev": { 16 + "type": "string", 17 + "format": "tid" 18 + } 19 + } 20 + } 21 + }, 22 + "$type": "com.atproto.lexicon.schema", 23 + "lexicon": 1 24 + }
+66
lexicons/com/atproto/repo/deleteRecord.json
··· 1 + { 2 + "id": "com.atproto.repo.deleteRecord", 3 + "defs": { 4 + "main": { 5 + "type": "procedure", 6 + "input": { 7 + "schema": { 8 + "type": "object", 9 + "required": [ 10 + "repo", 11 + "collection", 12 + "rkey" 13 + ], 14 + "properties": { 15 + "repo": { 16 + "type": "string", 17 + "format": "at-identifier", 18 + "description": "The handle or DID of the repo (aka, current account)." 19 + }, 20 + "rkey": { 21 + "type": "string", 22 + "format": "record-key", 23 + "description": "The Record Key." 24 + }, 25 + "collection": { 26 + "type": "string", 27 + "format": "nsid", 28 + "description": "The NSID of the record collection." 29 + }, 30 + "swapCommit": { 31 + "type": "string", 32 + "format": "cid", 33 + "description": "Compare and swap with the previous commit by CID." 34 + }, 35 + "swapRecord": { 36 + "type": "string", 37 + "format": "cid", 38 + "description": "Compare and swap with the previous record by CID." 39 + } 40 + } 41 + }, 42 + "encoding": "application/json" 43 + }, 44 + "errors": [ 45 + { 46 + "name": "InvalidSwap" 47 + } 48 + ], 49 + "output": { 50 + "schema": { 51 + "type": "object", 52 + "properties": { 53 + "commit": { 54 + "ref": "com.atproto.repo.defs#commitMeta", 55 + "type": "ref" 56 + } 57 + } 58 + }, 59 + "encoding": "application/json" 60 + }, 61 + "description": "Delete a repository record, or ensure it doesn't exist. Requires auth, implemented by PDS." 62 + } 63 + }, 64 + "$type": "com.atproto.lexicon.schema", 65 + "lexicon": 1 66 + }
+69
lexicons/com/atproto/repo/getRecord.json
··· 1 + { 2 + "id": "com.atproto.repo.getRecord", 3 + "defs": { 4 + "main": { 5 + "type": "query", 6 + "errors": [ 7 + { 8 + "name": "RecordNotFound" 9 + } 10 + ], 11 + "output": { 12 + "schema": { 13 + "type": "object", 14 + "required": [ 15 + "uri", 16 + "value" 17 + ], 18 + "properties": { 19 + "cid": { 20 + "type": "string", 21 + "format": "cid" 22 + }, 23 + "uri": { 24 + "type": "string", 25 + "format": "at-uri" 26 + }, 27 + "value": { 28 + "type": "unknown" 29 + } 30 + } 31 + }, 32 + "encoding": "application/json" 33 + }, 34 + "parameters": { 35 + "type": "params", 36 + "required": [ 37 + "repo", 38 + "collection", 39 + "rkey" 40 + ], 41 + "properties": { 42 + "cid": { 43 + "type": "string", 44 + "format": "cid", 45 + "description": "The CID of the version of the record. If not specified, then return the most recent version." 46 + }, 47 + "repo": { 48 + "type": "string", 49 + "format": "at-identifier", 50 + "description": "The handle or DID of the repo." 51 + }, 52 + "rkey": { 53 + "type": "string", 54 + "format": "record-key", 55 + "description": "The Record Key." 56 + }, 57 + "collection": { 58 + "type": "string", 59 + "format": "nsid", 60 + "description": "The NSID of the record collection." 61 + } 62 + } 63 + }, 64 + "description": "Get a single record from a repository. Does not require auth." 65 + } 66 + }, 67 + "$type": "com.atproto.lexicon.schema", 68 + "lexicon": 1 69 + }
+86
lexicons/com/atproto/repo/listRecords.json
··· 1 + { 2 + "id": "com.atproto.repo.listRecords", 3 + "defs": { 4 + "main": { 5 + "type": "query", 6 + "output": { 7 + "schema": { 8 + "type": "object", 9 + "required": [ 10 + "records" 11 + ], 12 + "properties": { 13 + "cursor": { 14 + "type": "string" 15 + }, 16 + "records": { 17 + "type": "array", 18 + "items": { 19 + "ref": "#record", 20 + "type": "ref" 21 + } 22 + } 23 + } 24 + }, 25 + "encoding": "application/json" 26 + }, 27 + "parameters": { 28 + "type": "params", 29 + "required": [ 30 + "repo", 31 + "collection" 32 + ], 33 + "properties": { 34 + "repo": { 35 + "type": "string", 36 + "format": "at-identifier", 37 + "description": "The handle or DID of the repo." 38 + }, 39 + "limit": { 40 + "type": "integer", 41 + "default": 50, 42 + "maximum": 100, 43 + "minimum": 1, 44 + "description": "The number of records to return." 45 + }, 46 + "cursor": { 47 + "type": "string" 48 + }, 49 + "reverse": { 50 + "type": "boolean", 51 + "description": "Flag to reverse the order of the returned records." 52 + }, 53 + "collection": { 54 + "type": "string", 55 + "format": "nsid", 56 + "description": "The NSID of the record type." 57 + } 58 + } 59 + }, 60 + "description": "List a range of records in a repository, matching a specific collection. Does not require auth." 61 + }, 62 + "record": { 63 + "type": "object", 64 + "required": [ 65 + "uri", 66 + "cid", 67 + "value" 68 + ], 69 + "properties": { 70 + "cid": { 71 + "type": "string", 72 + "format": "cid" 73 + }, 74 + "uri": { 75 + "type": "string", 76 + "format": "at-uri" 77 + }, 78 + "value": { 79 + "type": "unknown" 80 + } 81 + } 82 + } 83 + }, 84 + "$type": "com.atproto.lexicon.schema", 85 + "lexicon": 1 86 + }
+25
lexicons/com/atproto/repo/strongRef.json
··· 1 + { 2 + "id": "com.atproto.repo.strongRef", 3 + "defs": { 4 + "main": { 5 + "type": "object", 6 + "required": [ 7 + "uri", 8 + "cid" 9 + ], 10 + "properties": { 11 + "cid": { 12 + "type": "string", 13 + "format": "cid" 14 + }, 15 + "uri": { 16 + "type": "string", 17 + "format": "at-uri" 18 + } 19 + } 20 + } 21 + }, 22 + "$type": "com.atproto.lexicon.schema", 23 + "lexicon": 1, 24 + "description": "A URI with a content-hash fingerprint." 25 + }
+37
lexicons/one/papili/comment.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "one.papili.comment", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "description": "A comment on a papili.one post or another comment", 9 + "record": { 10 + "type": "object", 11 + "required": ["post", "text", "createdAt"], 12 + "properties": { 13 + "post": { 14 + "type": "ref", 15 + "ref": "com.atproto.repo.strongRef", 16 + "description": "Reference to the root post (uri + cid)" 17 + }, 18 + "parent": { 19 + "type": "ref", 20 + "ref": "com.atproto.repo.strongRef", 21 + "description": "Reference to parent comment if this is a reply" 22 + }, 23 + "text": { 24 + "type": "string", 25 + "maxLength": 10000, 26 + "description": "The comment text" 27 + }, 28 + "createdAt": { 29 + "type": "string", 30 + "format": "datetime", 31 + "description": "Timestamp of creation" 32 + } 33 + } 34 + } 35 + } 36 + } 37 + }
+37
lexicons/one/papili/post.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "one.papili.post", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "key": "tid", 8 + "description": "A link submission to papili.one", 9 + "record": { 10 + "type": "object", 11 + "required": ["url", "title", "createdAt"], 12 + "properties": { 13 + "url": { 14 + "type": "string", 15 + "format": "uri", 16 + "description": "The URL being submitted" 17 + }, 18 + "title": { 19 + "type": "string", 20 + "maxLength": 300, 21 + "description": "Title of the submission" 22 + }, 23 + "text": { 24 + "type": "string", 25 + "maxLength": 10000, 26 + "description": "Optional description or commentary" 27 + }, 28 + "createdAt": { 29 + "type": "string", 30 + "format": "datetime", 31 + "description": "Timestamp of creation" 32 + } 33 + } 34 + } 35 + } 36 + } 37 + }
+212
lexicons/tools/ozone/report/defs.json
··· 1 + { 2 + "id": "tools.ozone.report.defs", 3 + "defs": { 4 + "reasonType": { 5 + "type": "string", 6 + "knownValues": [ 7 + "tools.ozone.report.defs#reasonAppeal", 8 + "tools.ozone.report.defs#reasonOther", 9 + "tools.ozone.report.defs#reasonViolenceAnimal", 10 + "tools.ozone.report.defs#reasonViolenceThreats", 11 + "tools.ozone.report.defs#reasonViolenceGraphicContent", 12 + "tools.ozone.report.defs#reasonViolenceGlorification", 13 + "tools.ozone.report.defs#reasonViolenceExtremistContent", 14 + "tools.ozone.report.defs#reasonViolenceTrafficking", 15 + "tools.ozone.report.defs#reasonViolenceOther", 16 + "tools.ozone.report.defs#reasonSexualAbuseContent", 17 + "tools.ozone.report.defs#reasonSexualNCII", 18 + "tools.ozone.report.defs#reasonSexualDeepfake", 19 + "tools.ozone.report.defs#reasonSexualAnimal", 20 + "tools.ozone.report.defs#reasonSexualUnlabeled", 21 + "tools.ozone.report.defs#reasonSexualOther", 22 + "tools.ozone.report.defs#reasonChildSafetyCSAM", 23 + "tools.ozone.report.defs#reasonChildSafetyGroom", 24 + "tools.ozone.report.defs#reasonChildSafetyPrivacy", 25 + "tools.ozone.report.defs#reasonChildSafetyHarassment", 26 + "tools.ozone.report.defs#reasonChildSafetyOther", 27 + "tools.ozone.report.defs#reasonHarassmentTroll", 28 + "tools.ozone.report.defs#reasonHarassmentTargeted", 29 + "tools.ozone.report.defs#reasonHarassmentHateSpeech", 30 + "tools.ozone.report.defs#reasonHarassmentDoxxing", 31 + "tools.ozone.report.defs#reasonHarassmentOther", 32 + "tools.ozone.report.defs#reasonMisleadingBot", 33 + "tools.ozone.report.defs#reasonMisleadingImpersonation", 34 + "tools.ozone.report.defs#reasonMisleadingSpam", 35 + "tools.ozone.report.defs#reasonMisleadingScam", 36 + "tools.ozone.report.defs#reasonMisleadingElections", 37 + "tools.ozone.report.defs#reasonMisleadingOther", 38 + "tools.ozone.report.defs#reasonRuleSiteSecurity", 39 + "tools.ozone.report.defs#reasonRuleProhibitedSales", 40 + "tools.ozone.report.defs#reasonRuleBanEvasion", 41 + "tools.ozone.report.defs#reasonRuleOther", 42 + "tools.ozone.report.defs#reasonSelfHarmContent", 43 + "tools.ozone.report.defs#reasonSelfHarmED", 44 + "tools.ozone.report.defs#reasonSelfHarmStunts", 45 + "tools.ozone.report.defs#reasonSelfHarmSubstances", 46 + "tools.ozone.report.defs#reasonSelfHarmOther" 47 + ] 48 + }, 49 + "reasonOther": { 50 + "type": "token", 51 + "description": "An issue not included in these options" 52 + }, 53 + "reasonAppeal": { 54 + "type": "token", 55 + "description": "Appeal a previously taken moderation action" 56 + }, 57 + "reasonRuleOther": { 58 + "type": "token", 59 + "description": "Other" 60 + }, 61 + "reasonSelfHarmED": { 62 + "type": "token", 63 + "description": "Eating disorders" 64 + }, 65 + "reasonSexualNCII": { 66 + "type": "token", 67 + "description": "Non-consensual intimate imagery" 68 + }, 69 + "reasonSexualOther": { 70 + "type": "token", 71 + "description": "Other sexual violence content" 72 + }, 73 + "reasonSexualAnimal": { 74 + "type": "token", 75 + "description": "Animal sexual abuse" 76 + }, 77 + "reasonMisleadingBot": { 78 + "type": "token", 79 + "description": "Fake account or bot" 80 + }, 81 + "reasonSelfHarmOther": { 82 + "type": "token", 83 + "description": "Other dangerous content" 84 + }, 85 + "reasonViolenceOther": { 86 + "type": "token", 87 + "description": "Other violent content" 88 + }, 89 + "reasonMisleadingScam": { 90 + "type": "token", 91 + "description": "Scam" 92 + }, 93 + "reasonMisleadingSpam": { 94 + "type": "token", 95 + "description": "Spam" 96 + }, 97 + "reasonRuleBanEvasion": { 98 + "type": "token", 99 + "description": "Banned user returning" 100 + }, 101 + "reasonSelfHarmStunts": { 102 + "type": "token", 103 + "description": "Dangerous challenges or activities" 104 + }, 105 + "reasonSexualDeepfake": { 106 + "type": "token", 107 + "description": "Deepfake adult content" 108 + }, 109 + "reasonViolenceAnimal": { 110 + "type": "token", 111 + "description": "Animal welfare violations" 112 + }, 113 + "reasonChildSafetyCSAM": { 114 + "type": "token", 115 + "description": "Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority." 116 + }, 117 + "reasonHarassmentOther": { 118 + "type": "token", 119 + "description": "Other harassing or hateful content" 120 + }, 121 + "reasonHarassmentTroll": { 122 + "type": "token", 123 + "description": "Trolling" 124 + }, 125 + "reasonMisleadingOther": { 126 + "type": "token", 127 + "description": "Other misleading content" 128 + }, 129 + "reasonSelfHarmContent": { 130 + "type": "token", 131 + "description": "Content promoting or depicting self-harm" 132 + }, 133 + "reasonSexualUnlabeled": { 134 + "type": "token", 135 + "description": "Unlabelled adult content" 136 + }, 137 + "reasonViolenceThreats": { 138 + "type": "token", 139 + "description": "Threats or incitement" 140 + }, 141 + "reasonChildSafetyGroom": { 142 + "type": "token", 143 + "description": "Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority." 144 + }, 145 + "reasonChildSafetyOther": { 146 + "type": "token", 147 + "description": "Other child safety. These reports will be sent only be sent to the application's Moderation Authority." 148 + }, 149 + "reasonRuleSiteSecurity": { 150 + "type": "token", 151 + "description": "Hacking or system attacks" 152 + }, 153 + "reasonHarassmentDoxxing": { 154 + "type": "token", 155 + "description": "Doxxing" 156 + }, 157 + "reasonChildSafetyPrivacy": { 158 + "type": "token", 159 + "description": "Privacy violation involving a minor" 160 + }, 161 + "reasonHarassmentTargeted": { 162 + "type": "token", 163 + "description": "Targeted harassment" 164 + }, 165 + "reasonSelfHarmSubstances": { 166 + "type": "token", 167 + "description": "Dangerous substances or drug abuse" 168 + }, 169 + "reasonSexualAbuseContent": { 170 + "type": "token", 171 + "description": "Adult sexual abuse content" 172 + }, 173 + "reasonMisleadingElections": { 174 + "type": "token", 175 + "description": "False information about elections" 176 + }, 177 + "reasonRuleProhibitedSales": { 178 + "type": "token", 179 + "description": "Promoting or selling prohibited items or services" 180 + }, 181 + "reasonViolenceTrafficking": { 182 + "type": "token", 183 + "description": "Human trafficking" 184 + }, 185 + "reasonHarassmentHateSpeech": { 186 + "type": "token", 187 + "description": "Hate speech" 188 + }, 189 + "reasonChildSafetyHarassment": { 190 + "type": "token", 191 + "description": "Harassment or bullying of minors" 192 + }, 193 + "reasonViolenceGlorification": { 194 + "type": "token", 195 + "description": "Glorification of violence" 196 + }, 197 + "reasonViolenceGraphicContent": { 198 + "type": "token", 199 + "description": "Graphic violent content" 200 + }, 201 + "reasonMisleadingImpersonation": { 202 + "type": "token", 203 + "description": "Impersonation" 204 + }, 205 + "reasonViolenceExtremistContent": { 206 + "type": "token", 207 + "description": "Extremist content. These reports will be sent only be sent to the application's Moderation Authority." 208 + } 209 + }, 210 + "$type": "com.atproto.lexicon.schema", 211 + "lexicon": 1 212 + }
+64
package.json
··· 1 + { 2 + "name": "papili.one", 3 + "private": true, 4 + "version": "0.0.1", 5 + "type": "module", 6 + "pnpm": { 7 + "onlyBuiltDependencies": [ 8 + "better-sqlite3" 9 + ] 10 + }, 11 + "scripts": { 12 + "dev": "vite dev", 13 + "build": "pnpm lex:build && vite build", 14 + "preview": "vite preview", 15 + "start": "node build", 16 + "prepare": "svelte-kit sync || echo ''", 17 + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 18 + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 19 + "test:unit": "vitest", 20 + "test": "pnpm test:unit -- --run", 21 + "format": "prettier --write .", 22 + "lint": "prettier --check . && eslint .", 23 + "lex:build": "lex build --lexicons ./lexicons --out ./src/lib/lexicons --clear", 24 + "db:push": "drizzle-kit push", 25 + "db:generate": "drizzle-kit generate", 26 + "db:migrate": "drizzle-kit migrate", 27 + "db:studio": "drizzle-kit studio" 28 + }, 29 + "devDependencies": { 30 + "@atproto/lex": "^0.0.5", 31 + "@eslint/compat": "^1.4.0", 32 + "@eslint/js": "^9.39.1", 33 + "@libsql/client": "^0.15.15", 34 + "@sveltejs/adapter-auto": "^7.0.0", 35 + "@sveltejs/adapter-node": "^5.4.0", 36 + "@sveltejs/kit": "^2.48.5", 37 + "@sveltejs/vite-plugin-svelte": "^6.2.1", 38 + "@tailwindcss/vite": "^4.1.17", 39 + "@types/node": "^22", 40 + "@vitest/browser-playwright": "^4.0.10", 41 + "better-sqlite3": "^12.5.0", 42 + "drizzle-kit": "^0.31.7", 43 + "drizzle-orm": "^0.44.7", 44 + "eslint": "^9.39.1", 45 + "eslint-config-prettier": "^10.1.8", 46 + "eslint-plugin-svelte": "^3.13.0", 47 + "globals": "^16.5.0", 48 + "playwright": "^1.56.1", 49 + "prettier": "^3.6.2", 50 + "prettier-plugin-svelte": "^3.4.0", 51 + "svelte": "^5.43.8", 52 + "svelte-check": "^4.3.4", 53 + "tailwindcss": "^4.1.17", 54 + "typescript": "^5.9.3", 55 + "typescript-eslint": "^8.47.0", 56 + "vite": "^7.2.2", 57 + "vitest": "^4.0.10", 58 + "vitest-browser-svelte": "^2.0.1" 59 + }, 60 + "dependencies": { 61 + "@atproto/oauth-client-node": "^0.3.12", 62 + "iron-session": "^8.0.4" 63 + } 64 + }
+4507
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@atproto/oauth-client-node': 12 + specifier: ^0.3.12 13 + version: 0.3.12 14 + iron-session: 15 + specifier: ^8.0.4 16 + version: 8.0.4 17 + devDependencies: 18 + '@atproto/lex': 19 + specifier: ^0.0.5 20 + version: 0.0.5 21 + '@eslint/compat': 22 + specifier: ^1.4.0 23 + version: 1.4.1(eslint@9.39.1(jiti@2.6.1)) 24 + '@eslint/js': 25 + specifier: ^9.39.1 26 + version: 9.39.1 27 + '@libsql/client': 28 + specifier: ^0.15.15 29 + version: 0.15.15 30 + '@sveltejs/adapter-auto': 31 + specifier: ^7.0.0 32 + version: 7.0.0(@sveltejs/kit@2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))) 33 + '@sveltejs/adapter-node': 34 + specifier: ^5.4.0 35 + version: 5.4.0(@sveltejs/kit@2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))) 36 + '@sveltejs/kit': 37 + specifier: ^2.48.5 38 + version: 2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 39 + '@sveltejs/vite-plugin-svelte': 40 + specifier: ^6.2.1 41 + version: 6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 42 + '@tailwindcss/vite': 43 + specifier: ^4.1.17 44 + version: 4.1.17(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 45 + '@types/node': 46 + specifier: ^22 47 + version: 22.19.1 48 + '@vitest/browser-playwright': 49 + specifier: ^4.0.10 50 + version: 4.0.14(playwright@1.57.0)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.14) 51 + better-sqlite3: 52 + specifier: ^12.5.0 53 + version: 12.5.0 54 + drizzle-kit: 55 + specifier: ^0.31.7 56 + version: 0.31.7 57 + drizzle-orm: 58 + specifier: ^0.44.7 59 + version: 0.44.7(@cloudflare/workers-types@4.20251205.0)(@libsql/client@0.15.15)(better-sqlite3@12.5.0) 60 + eslint: 61 + specifier: ^9.39.1 62 + version: 9.39.1(jiti@2.6.1) 63 + eslint-config-prettier: 64 + specifier: ^10.1.8 65 + version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) 66 + eslint-plugin-svelte: 67 + specifier: ^3.13.0 68 + version: 3.13.0(eslint@9.39.1(jiti@2.6.1))(svelte@5.45.2) 69 + globals: 70 + specifier: ^16.5.0 71 + version: 16.5.0 72 + playwright: 73 + specifier: ^1.56.1 74 + version: 1.57.0 75 + prettier: 76 + specifier: ^3.6.2 77 + version: 3.7.3 78 + prettier-plugin-svelte: 79 + specifier: ^3.4.0 80 + version: 3.4.0(prettier@3.7.3)(svelte@5.45.2) 81 + svelte: 82 + specifier: ^5.43.8 83 + version: 5.45.2 84 + svelte-check: 85 + specifier: ^4.3.4 86 + version: 4.3.4(picomatch@4.0.3)(svelte@5.45.2)(typescript@5.9.3) 87 + tailwindcss: 88 + specifier: ^4.1.17 89 + version: 4.1.17 90 + typescript: 91 + specifier: ^5.9.3 92 + version: 5.9.3 93 + typescript-eslint: 94 + specifier: ^8.47.0 95 + version: 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) 96 + vite: 97 + specifier: ^7.2.2 98 + version: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2) 99 + vitest: 100 + specifier: ^4.0.10 101 + version: 4.0.14(@types/node@22.19.1)(@vitest/browser-playwright@4.0.14)(jiti@2.6.1)(lightningcss@1.30.2) 102 + vitest-browser-svelte: 103 + specifier: ^2.0.1 104 + version: 2.0.1(svelte@5.45.2)(vitest@4.0.14) 105 + 106 + packages: 107 + 108 + '@atproto-labs/did-resolver@0.2.4': 109 + resolution: {integrity: sha512-sbXxBnAJWsKv/FEGG6a/WLz7zQYUr1vA2TXvNnPwwJQJCjPwEJMOh1vM22wBr185Phy7D2GD88PcRokn7eUVyw==} 110 + 111 + '@atproto-labs/fetch-node@0.2.0': 112 + resolution: {integrity: sha512-Krq09nH/aeoiU2s9xdHA0FjTEFWG9B5FFenipv1iRixCcPc7V3DhTNDawxG9gI8Ny0k4dBVS9WTRN/IDzBx86Q==} 113 + engines: {node: '>=18.7.0'} 114 + 115 + '@atproto-labs/fetch@0.2.3': 116 + resolution: {integrity: sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==} 117 + 118 + '@atproto-labs/handle-resolver-node@0.1.23': 119 + resolution: {integrity: sha512-tBRr2LCgzn3klk+DL0xrTFv4zg5tEszdeW6vSIFVebBYSb3MLdfhievmSqZdIQ4c9UCC4hN7YXTlZCXj8+2YmQ==} 120 + engines: {node: '>=18.7.0'} 121 + 122 + '@atproto-labs/handle-resolver@0.3.4': 123 + resolution: {integrity: sha512-wsNopfzfgO3uPvfnFDgNeXgDufXxSXhjBjp2WEiSzEiLrMy0Jodnqggw4OzD9MJKf0a4Iu2/ydd537qdy91LrQ==} 124 + 125 + '@atproto-labs/identity-resolver@0.3.4': 126 + resolution: {integrity: sha512-HNUEFQIo2ws6iATxmgHd5D5rAsWYupgxZucgwolVHPiMjE1SY+EmxEsfbEN1wDEzM8/u9AKUg/jrxxPEwsgbew==} 127 + 128 + '@atproto-labs/pipe@0.1.1': 129 + resolution: {integrity: sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==} 130 + 131 + '@atproto-labs/simple-store-memory@0.1.4': 132 + resolution: {integrity: sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==} 133 + 134 + '@atproto-labs/simple-store@0.3.0': 135 + resolution: {integrity: sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==} 136 + 137 + '@atproto/common-web@0.4.6': 138 + resolution: {integrity: sha512-+2mG/1oBcB/ZmYIU1ltrFMIiuy9aByKAkb2Fos/0eTdczcLBaH17k0KoxMGvhfsujN2r62XlanOAMzysa7lv1g==} 139 + 140 + '@atproto/common@0.5.2': 141 + resolution: {integrity: sha512-7KdU8FcIfnwS2kmv7M86pKxtw/fLvPY2bSI1rXpG+AmA8O++IUGlSCujBGzbrPwnQvY/z++f6Le4rdBzu8bFaA==} 142 + engines: {node: '>=18.7.0'} 143 + 144 + '@atproto/crypto@0.4.5': 145 + resolution: {integrity: sha512-n40aKkMoCatP0u9Yvhrdk6fXyOHFDDbkdm4h4HCyWW+KlKl8iXfD5iV+ECq+w5BM+QH25aIpt3/j6EUNerhLxw==} 146 + engines: {node: '>=18.7.0'} 147 + 148 + '@atproto/did@0.2.3': 149 + resolution: {integrity: sha512-VI8JJkSizvM2cHYJa37WlbzeCm5tWpojyc1/Zy8q8OOjyoy6X4S4BEfoP941oJcpxpMTObamibQIXQDo7tnIjg==} 150 + 151 + '@atproto/jwk-jose@0.1.11': 152 + resolution: {integrity: sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q==} 153 + 154 + '@atproto/jwk-webcrypto@0.2.0': 155 + resolution: {integrity: sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg==} 156 + 157 + '@atproto/jwk@0.6.0': 158 + resolution: {integrity: sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw==} 159 + 160 + '@atproto/lex-builder@0.0.5': 161 + resolution: {integrity: sha512-29PoERIzsMlNpSv+BcSs57MyQsb+WPtXi9olAWWExFNsLv/qgYhgT8q5CPpfKm9juFgZAECjQxDKSrAfI5VQkw==} 162 + 163 + '@atproto/lex-cbor@0.0.2': 164 + resolution: {integrity: sha512-sTr3UCL2SgxEoYVpzJGgWTnNl4TpngP5tMcRyaOvi21Se4m3oR4RDsoVDPz8AS6XphiteRwzwPstquN7aWWMbA==} 165 + 166 + '@atproto/lex-client@0.0.3': 167 + resolution: {integrity: sha512-EvS6tmRA5jJwsWleVpxRYpbNpfm9a9VT2A/muFdPuvUuYRPzVKm2cKCperwEnQmT7HuTA7p35dIg/0if75V0Qw==} 168 + 169 + '@atproto/lex-data@0.0.2': 170 + resolution: {integrity: sha512-euV2rDGi+coH8qvZOU+ieUOEbwPwff9ca6IiXIqjZJ76AvlIpj7vtAyIRCxHUW2BoU6h9yqyJgn9MKD2a7oIwg==} 171 + 172 + '@atproto/lex-document@0.0.4': 173 + resolution: {integrity: sha512-oYT3MHcAkXgPfgSzSgZuBy6R/kxkIdFAr4ohcykGquyxm0ZLWFWilgKzqKiOSzFHY0SX+Q9sWKGVt5y45ebLIw==} 174 + 175 + '@atproto/lex-installer@0.0.5': 176 + resolution: {integrity: sha512-lXXSsBNkDtwlBXLMQnT339gXsltsblSpgDsCFe+wjLtxYB/ClZoduIkD8tlb1JXuIyXnfbe//66/krQUdmQr1A==} 177 + 178 + '@atproto/lex-json@0.0.2': 179 + resolution: {integrity: sha512-Pd72lO+l2rhOTutnf11omh9ZkoB/elbzE3HSmn2wuZlyH1mRhTYvoH8BOGokWQwbZkCE8LL3nOqMT3gHCD2l7g==} 180 + 181 + '@atproto/lex-resolver@0.0.4': 182 + resolution: {integrity: sha512-ZEZYXGCYXhDy9kxPOr/WacXr62gg4R9zNf2VNk6Y/BZ+9hycW/rlEoLMo6rAsG8PxvA6D3h3o87z6xQZEI/oyw==} 183 + 184 + '@atproto/lex-schema@0.0.3': 185 + resolution: {integrity: sha512-GI0YWGRxTa/qQMHfkIrWzdEALN64ZMcKjD5lHIwuggDg8a2TwLvaN0WafSnivJGZ9m7oUNu5b97MJiDoJdeAUw==} 186 + 187 + '@atproto/lex@0.0.5': 188 + resolution: {integrity: sha512-lYONWITlTbv8LwWxF9AgjHhSmZLKIYOvw5ePK/jCxaWjh8n//fq0BppYoMJiHvwtxZp2JIrOfYQt7QB5mz5npw==} 189 + hasBin: true 190 + 191 + '@atproto/lexicon@0.5.2': 192 + resolution: {integrity: sha512-lRmJgMA8f5j7VB5Iu5cp188ald5FuI4FlmZ7nn6EBrk1dgOstWVrI5Ft6K3z2vjyLZRG6nzknlsw+tDP63p7bQ==} 193 + 194 + '@atproto/oauth-client-node@0.3.12': 195 + resolution: {integrity: sha512-9ejfO1H8qo3EbiAJgxKcdcR5Ay/9hgaC5OdxtTN63bcOrkIhvBN0xpVPGZYLL1iJQyNeK1T5m/LDrv4gUS1B+g==} 196 + engines: {node: '>=18.7.0'} 197 + 198 + '@atproto/oauth-client@0.5.10': 199 + resolution: {integrity: sha512-2mdJFyYbaOw3e/1KMBOQ2/J9p+MfWW8kE6FKdExWrJ7JPJpTJw2ZF2EmdGHCVeXw386dQgXbLkr+w4vbgSqfMQ==} 200 + 201 + '@atproto/oauth-types@0.5.2': 202 + resolution: {integrity: sha512-9DCDvtvCanTwAaU5UakYDO0hzcOITS3RutK5zfLytE5Y9unj0REmTDdN8Xd8YCfUJl7T/9pYpf04Uyq7bFTASg==} 203 + 204 + '@atproto/repo@0.8.11': 205 + resolution: {integrity: sha512-b/WCu5ITws4ILHoXiZz0XXB5U9C08fUVzkBQDwpnme62GXv8gUaAPL/ttG61OusW09ARwMMQm4vxoP0hTFg+zA==} 206 + engines: {node: '>=18.7.0'} 207 + 208 + '@atproto/syntax@0.4.2': 209 + resolution: {integrity: sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==} 210 + 211 + '@atproto/xrpc@0.7.6': 212 + resolution: {integrity: sha512-RvCf4j0JnKYWuz3QzsYCntJi3VuiAAybQsMIUw2wLWcHhchO9F7UaBZINLL2z0qc/cYWPv5NSwcVydMseoCZLA==} 213 + 214 + '@cloudflare/workers-types@4.20251205.0': 215 + resolution: {integrity: sha512-7pup7fYkuQW5XD8RUS/vkxF9SXlrGyCXuZ4ro3uVQvca/GTeSa+8bZ8T4wbq1Aea5lmLIGSlKbhl2msME7bRBA==} 216 + 217 + '@drizzle-team/brocli@0.10.2': 218 + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} 219 + 220 + '@esbuild-kit/core-utils@3.3.2': 221 + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} 222 + deprecated: 'Merged into tsx: https://tsx.is' 223 + 224 + '@esbuild-kit/esm-loader@2.6.5': 225 + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} 226 + deprecated: 'Merged into tsx: https://tsx.is' 227 + 228 + '@esbuild/aix-ppc64@0.25.12': 229 + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 230 + engines: {node: '>=18'} 231 + cpu: [ppc64] 232 + os: [aix] 233 + 234 + '@esbuild/android-arm64@0.18.20': 235 + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 236 + engines: {node: '>=12'} 237 + cpu: [arm64] 238 + os: [android] 239 + 240 + '@esbuild/android-arm64@0.25.12': 241 + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 242 + engines: {node: '>=18'} 243 + cpu: [arm64] 244 + os: [android] 245 + 246 + '@esbuild/android-arm@0.18.20': 247 + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 248 + engines: {node: '>=12'} 249 + cpu: [arm] 250 + os: [android] 251 + 252 + '@esbuild/android-arm@0.25.12': 253 + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 254 + engines: {node: '>=18'} 255 + cpu: [arm] 256 + os: [android] 257 + 258 + '@esbuild/android-x64@0.18.20': 259 + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 260 + engines: {node: '>=12'} 261 + cpu: [x64] 262 + os: [android] 263 + 264 + '@esbuild/android-x64@0.25.12': 265 + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 266 + engines: {node: '>=18'} 267 + cpu: [x64] 268 + os: [android] 269 + 270 + '@esbuild/darwin-arm64@0.18.20': 271 + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 272 + engines: {node: '>=12'} 273 + cpu: [arm64] 274 + os: [darwin] 275 + 276 + '@esbuild/darwin-arm64@0.25.12': 277 + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 278 + engines: {node: '>=18'} 279 + cpu: [arm64] 280 + os: [darwin] 281 + 282 + '@esbuild/darwin-x64@0.18.20': 283 + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 284 + engines: {node: '>=12'} 285 + cpu: [x64] 286 + os: [darwin] 287 + 288 + '@esbuild/darwin-x64@0.25.12': 289 + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 290 + engines: {node: '>=18'} 291 + cpu: [x64] 292 + os: [darwin] 293 + 294 + '@esbuild/freebsd-arm64@0.18.20': 295 + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 296 + engines: {node: '>=12'} 297 + cpu: [arm64] 298 + os: [freebsd] 299 + 300 + '@esbuild/freebsd-arm64@0.25.12': 301 + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 302 + engines: {node: '>=18'} 303 + cpu: [arm64] 304 + os: [freebsd] 305 + 306 + '@esbuild/freebsd-x64@0.18.20': 307 + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 308 + engines: {node: '>=12'} 309 + cpu: [x64] 310 + os: [freebsd] 311 + 312 + '@esbuild/freebsd-x64@0.25.12': 313 + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 314 + engines: {node: '>=18'} 315 + cpu: [x64] 316 + os: [freebsd] 317 + 318 + '@esbuild/linux-arm64@0.18.20': 319 + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 320 + engines: {node: '>=12'} 321 + cpu: [arm64] 322 + os: [linux] 323 + 324 + '@esbuild/linux-arm64@0.25.12': 325 + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 326 + engines: {node: '>=18'} 327 + cpu: [arm64] 328 + os: [linux] 329 + 330 + '@esbuild/linux-arm@0.18.20': 331 + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 332 + engines: {node: '>=12'} 333 + cpu: [arm] 334 + os: [linux] 335 + 336 + '@esbuild/linux-arm@0.25.12': 337 + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 338 + engines: {node: '>=18'} 339 + cpu: [arm] 340 + os: [linux] 341 + 342 + '@esbuild/linux-ia32@0.18.20': 343 + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 344 + engines: {node: '>=12'} 345 + cpu: [ia32] 346 + os: [linux] 347 + 348 + '@esbuild/linux-ia32@0.25.12': 349 + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 350 + engines: {node: '>=18'} 351 + cpu: [ia32] 352 + os: [linux] 353 + 354 + '@esbuild/linux-loong64@0.18.20': 355 + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 356 + engines: {node: '>=12'} 357 + cpu: [loong64] 358 + os: [linux] 359 + 360 + '@esbuild/linux-loong64@0.25.12': 361 + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 362 + engines: {node: '>=18'} 363 + cpu: [loong64] 364 + os: [linux] 365 + 366 + '@esbuild/linux-mips64el@0.18.20': 367 + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 368 + engines: {node: '>=12'} 369 + cpu: [mips64el] 370 + os: [linux] 371 + 372 + '@esbuild/linux-mips64el@0.25.12': 373 + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 374 + engines: {node: '>=18'} 375 + cpu: [mips64el] 376 + os: [linux] 377 + 378 + '@esbuild/linux-ppc64@0.18.20': 379 + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 380 + engines: {node: '>=12'} 381 + cpu: [ppc64] 382 + os: [linux] 383 + 384 + '@esbuild/linux-ppc64@0.25.12': 385 + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 386 + engines: {node: '>=18'} 387 + cpu: [ppc64] 388 + os: [linux] 389 + 390 + '@esbuild/linux-riscv64@0.18.20': 391 + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 392 + engines: {node: '>=12'} 393 + cpu: [riscv64] 394 + os: [linux] 395 + 396 + '@esbuild/linux-riscv64@0.25.12': 397 + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 398 + engines: {node: '>=18'} 399 + cpu: [riscv64] 400 + os: [linux] 401 + 402 + '@esbuild/linux-s390x@0.18.20': 403 + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 404 + engines: {node: '>=12'} 405 + cpu: [s390x] 406 + os: [linux] 407 + 408 + '@esbuild/linux-s390x@0.25.12': 409 + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 410 + engines: {node: '>=18'} 411 + cpu: [s390x] 412 + os: [linux] 413 + 414 + '@esbuild/linux-x64@0.18.20': 415 + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 416 + engines: {node: '>=12'} 417 + cpu: [x64] 418 + os: [linux] 419 + 420 + '@esbuild/linux-x64@0.25.12': 421 + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 422 + engines: {node: '>=18'} 423 + cpu: [x64] 424 + os: [linux] 425 + 426 + '@esbuild/netbsd-arm64@0.25.12': 427 + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 428 + engines: {node: '>=18'} 429 + cpu: [arm64] 430 + os: [netbsd] 431 + 432 + '@esbuild/netbsd-x64@0.18.20': 433 + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 434 + engines: {node: '>=12'} 435 + cpu: [x64] 436 + os: [netbsd] 437 + 438 + '@esbuild/netbsd-x64@0.25.12': 439 + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 440 + engines: {node: '>=18'} 441 + cpu: [x64] 442 + os: [netbsd] 443 + 444 + '@esbuild/openbsd-arm64@0.25.12': 445 + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 446 + engines: {node: '>=18'} 447 + cpu: [arm64] 448 + os: [openbsd] 449 + 450 + '@esbuild/openbsd-x64@0.18.20': 451 + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 452 + engines: {node: '>=12'} 453 + cpu: [x64] 454 + os: [openbsd] 455 + 456 + '@esbuild/openbsd-x64@0.25.12': 457 + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 458 + engines: {node: '>=18'} 459 + cpu: [x64] 460 + os: [openbsd] 461 + 462 + '@esbuild/openharmony-arm64@0.25.12': 463 + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 464 + engines: {node: '>=18'} 465 + cpu: [arm64] 466 + os: [openharmony] 467 + 468 + '@esbuild/sunos-x64@0.18.20': 469 + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 470 + engines: {node: '>=12'} 471 + cpu: [x64] 472 + os: [sunos] 473 + 474 + '@esbuild/sunos-x64@0.25.12': 475 + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 476 + engines: {node: '>=18'} 477 + cpu: [x64] 478 + os: [sunos] 479 + 480 + '@esbuild/win32-arm64@0.18.20': 481 + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 482 + engines: {node: '>=12'} 483 + cpu: [arm64] 484 + os: [win32] 485 + 486 + '@esbuild/win32-arm64@0.25.12': 487 + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 488 + engines: {node: '>=18'} 489 + cpu: [arm64] 490 + os: [win32] 491 + 492 + '@esbuild/win32-ia32@0.18.20': 493 + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 494 + engines: {node: '>=12'} 495 + cpu: [ia32] 496 + os: [win32] 497 + 498 + '@esbuild/win32-ia32@0.25.12': 499 + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 500 + engines: {node: '>=18'} 501 + cpu: [ia32] 502 + os: [win32] 503 + 504 + '@esbuild/win32-x64@0.18.20': 505 + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 506 + engines: {node: '>=12'} 507 + cpu: [x64] 508 + os: [win32] 509 + 510 + '@esbuild/win32-x64@0.25.12': 511 + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 512 + engines: {node: '>=18'} 513 + cpu: [x64] 514 + os: [win32] 515 + 516 + '@eslint-community/eslint-utils@4.9.0': 517 + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 518 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 519 + peerDependencies: 520 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 521 + 522 + '@eslint-community/regexpp@4.12.2': 523 + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 524 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 525 + 526 + '@eslint/compat@1.4.1': 527 + resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} 528 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 529 + peerDependencies: 530 + eslint: ^8.40 || 9 531 + peerDependenciesMeta: 532 + eslint: 533 + optional: true 534 + 535 + '@eslint/config-array@0.21.1': 536 + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 537 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 538 + 539 + '@eslint/config-helpers@0.4.2': 540 + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 541 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 542 + 543 + '@eslint/core@0.17.0': 544 + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 545 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 546 + 547 + '@eslint/eslintrc@3.3.3': 548 + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} 549 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 550 + 551 + '@eslint/js@9.39.1': 552 + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} 553 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 554 + 555 + '@eslint/object-schema@2.1.7': 556 + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 557 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 558 + 559 + '@eslint/plugin-kit@0.4.1': 560 + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 561 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 562 + 563 + '@humanfs/core@0.19.1': 564 + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 565 + engines: {node: '>=18.18.0'} 566 + 567 + '@humanfs/node@0.16.7': 568 + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 569 + engines: {node: '>=18.18.0'} 570 + 571 + '@humanwhocodes/module-importer@1.0.1': 572 + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 573 + engines: {node: '>=12.22'} 574 + 575 + '@humanwhocodes/retry@0.4.3': 576 + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 577 + engines: {node: '>=18.18'} 578 + 579 + '@ipld/dag-cbor@7.0.3': 580 + resolution: {integrity: sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==} 581 + 582 + '@isaacs/balanced-match@4.0.1': 583 + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} 584 + engines: {node: 20 || >=22} 585 + 586 + '@isaacs/brace-expansion@5.0.0': 587 + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} 588 + engines: {node: 20 || >=22} 589 + 590 + '@jridgewell/gen-mapping@0.3.13': 591 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 592 + 593 + '@jridgewell/remapping@2.3.5': 594 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 595 + 596 + '@jridgewell/resolve-uri@3.1.2': 597 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 598 + engines: {node: '>=6.0.0'} 599 + 600 + '@jridgewell/sourcemap-codec@1.5.5': 601 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 602 + 603 + '@jridgewell/trace-mapping@0.3.31': 604 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 605 + 606 + '@libsql/client@0.15.15': 607 + resolution: {integrity: sha512-twC0hQxPNHPKfeOv3sNT6u2pturQjLcI+CnpTM0SjRpocEGgfiZ7DWKXLNnsothjyJmDqEsBQJ5ztq9Wlu470w==} 608 + 609 + '@libsql/core@0.15.15': 610 + resolution: {integrity: sha512-C88Z6UKl+OyuKKPwz224riz02ih/zHYI3Ho/LAcVOgjsunIRZoBw7fjRfaH9oPMmSNeQfhGklSG2il1URoOIsA==} 611 + 612 + '@libsql/darwin-arm64@0.5.22': 613 + resolution: {integrity: sha512-4B8ZlX3nIDPndfct7GNe0nI3Yw6ibocEicWdC4fvQbSs/jdq/RC2oCsoJxJ4NzXkvktX70C1J4FcmmoBy069UA==} 614 + cpu: [arm64] 615 + os: [darwin] 616 + 617 + '@libsql/darwin-x64@0.5.22': 618 + resolution: {integrity: sha512-ny2HYWt6lFSIdNFzUFIJ04uiW6finXfMNJ7wypkAD8Pqdm6nAByO+Fdqu8t7sD0sqJGeUCiOg480icjyQ2/8VA==} 619 + cpu: [x64] 620 + os: [darwin] 621 + 622 + '@libsql/hrana-client@0.7.0': 623 + resolution: {integrity: sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==} 624 + 625 + '@libsql/isomorphic-fetch@0.3.1': 626 + resolution: {integrity: sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==} 627 + engines: {node: '>=18.0.0'} 628 + 629 + '@libsql/isomorphic-ws@0.1.5': 630 + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} 631 + 632 + '@libsql/linux-arm-gnueabihf@0.5.22': 633 + resolution: {integrity: sha512-3Uo3SoDPJe/zBnyZKosziRGtszXaEtv57raWrZIahtQDsjxBVjuzYQinCm9LRCJCUT5t2r5Z5nLDPJi2CwZVoA==} 634 + cpu: [arm] 635 + os: [linux] 636 + 637 + '@libsql/linux-arm-musleabihf@0.5.22': 638 + resolution: {integrity: sha512-LCsXh07jvSojTNJptT9CowOzwITznD+YFGGW+1XxUr7fS+7/ydUrpDfsMX7UqTqjm7xG17eq86VkWJgHJfvpNg==} 639 + cpu: [arm] 640 + os: [linux] 641 + 642 + '@libsql/linux-arm64-gnu@0.5.22': 643 + resolution: {integrity: sha512-KSdnOMy88c9mpOFKUEzPskSaF3VLflfSUCBwas/pn1/sV3pEhtMF6H8VUCd2rsedwoukeeCSEONqX7LLnQwRMA==} 644 + cpu: [arm64] 645 + os: [linux] 646 + 647 + '@libsql/linux-arm64-musl@0.5.22': 648 + resolution: {integrity: sha512-mCHSMAsDTLK5YH//lcV3eFEgiR23Ym0U9oEvgZA0667gqRZg/2px+7LshDvErEKv2XZ8ixzw3p1IrBzLQHGSsw==} 649 + cpu: [arm64] 650 + os: [linux] 651 + 652 + '@libsql/linux-x64-gnu@0.5.22': 653 + resolution: {integrity: sha512-kNBHaIkSg78Y4BqAdgjcR2mBilZXs4HYkAmi58J+4GRwDQZh5fIUWbnQvB9f95DkWUIGVeenqLRFY2pcTmlsew==} 654 + cpu: [x64] 655 + os: [linux] 656 + 657 + '@libsql/linux-x64-musl@0.5.22': 658 + resolution: {integrity: sha512-UZ4Xdxm4pu3pQXjvfJiyCzZop/9j/eA2JjmhMaAhe3EVLH2g11Fy4fwyUp9sT1QJYR1kpc2JLuybPM0kuXv/Tg==} 659 + cpu: [x64] 660 + os: [linux] 661 + 662 + '@libsql/win32-x64-msvc@0.5.22': 663 + resolution: {integrity: sha512-Fj0j8RnBpo43tVZUVoNK6BV/9AtDUM5S7DF3LB4qTYg1LMSZqi3yeCneUTLJD6XomQJlZzbI4mst89yspVSAnA==} 664 + cpu: [x64] 665 + os: [win32] 666 + 667 + '@neon-rs/load@0.0.4': 668 + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} 669 + 670 + '@noble/curves@1.9.7': 671 + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} 672 + engines: {node: ^14.21.3 || >=16} 673 + 674 + '@noble/hashes@1.8.0': 675 + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} 676 + engines: {node: ^14.21.3 || >=16} 677 + 678 + '@polka/url@1.0.0-next.29': 679 + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 680 + 681 + '@rollup/plugin-commonjs@28.0.9': 682 + resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==} 683 + engines: {node: '>=16.0.0 || 14 >= 14.17'} 684 + peerDependencies: 685 + rollup: ^2.68.0||^3.0.0||^4.0.0 686 + peerDependenciesMeta: 687 + rollup: 688 + optional: true 689 + 690 + '@rollup/plugin-json@6.1.0': 691 + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} 692 + engines: {node: '>=14.0.0'} 693 + peerDependencies: 694 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 695 + peerDependenciesMeta: 696 + rollup: 697 + optional: true 698 + 699 + '@rollup/plugin-node-resolve@16.0.3': 700 + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} 701 + engines: {node: '>=14.0.0'} 702 + peerDependencies: 703 + rollup: ^2.78.0||^3.0.0||^4.0.0 704 + peerDependenciesMeta: 705 + rollup: 706 + optional: true 707 + 708 + '@rollup/pluginutils@5.3.0': 709 + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} 710 + engines: {node: '>=14.0.0'} 711 + peerDependencies: 712 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 713 + peerDependenciesMeta: 714 + rollup: 715 + optional: true 716 + 717 + '@rollup/rollup-android-arm-eabi@4.53.3': 718 + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} 719 + cpu: [arm] 720 + os: [android] 721 + 722 + '@rollup/rollup-android-arm64@4.53.3': 723 + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} 724 + cpu: [arm64] 725 + os: [android] 726 + 727 + '@rollup/rollup-darwin-arm64@4.53.3': 728 + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} 729 + cpu: [arm64] 730 + os: [darwin] 731 + 732 + '@rollup/rollup-darwin-x64@4.53.3': 733 + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} 734 + cpu: [x64] 735 + os: [darwin] 736 + 737 + '@rollup/rollup-freebsd-arm64@4.53.3': 738 + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} 739 + cpu: [arm64] 740 + os: [freebsd] 741 + 742 + '@rollup/rollup-freebsd-x64@4.53.3': 743 + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} 744 + cpu: [x64] 745 + os: [freebsd] 746 + 747 + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 748 + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} 749 + cpu: [arm] 750 + os: [linux] 751 + 752 + '@rollup/rollup-linux-arm-musleabihf@4.53.3': 753 + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} 754 + cpu: [arm] 755 + os: [linux] 756 + 757 + '@rollup/rollup-linux-arm64-gnu@4.53.3': 758 + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} 759 + cpu: [arm64] 760 + os: [linux] 761 + 762 + '@rollup/rollup-linux-arm64-musl@4.53.3': 763 + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} 764 + cpu: [arm64] 765 + os: [linux] 766 + 767 + '@rollup/rollup-linux-loong64-gnu@4.53.3': 768 + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} 769 + cpu: [loong64] 770 + os: [linux] 771 + 772 + '@rollup/rollup-linux-ppc64-gnu@4.53.3': 773 + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} 774 + cpu: [ppc64] 775 + os: [linux] 776 + 777 + '@rollup/rollup-linux-riscv64-gnu@4.53.3': 778 + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} 779 + cpu: [riscv64] 780 + os: [linux] 781 + 782 + '@rollup/rollup-linux-riscv64-musl@4.53.3': 783 + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} 784 + cpu: [riscv64] 785 + os: [linux] 786 + 787 + '@rollup/rollup-linux-s390x-gnu@4.53.3': 788 + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} 789 + cpu: [s390x] 790 + os: [linux] 791 + 792 + '@rollup/rollup-linux-x64-gnu@4.53.3': 793 + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} 794 + cpu: [x64] 795 + os: [linux] 796 + 797 + '@rollup/rollup-linux-x64-musl@4.53.3': 798 + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} 799 + cpu: [x64] 800 + os: [linux] 801 + 802 + '@rollup/rollup-openharmony-arm64@4.53.3': 803 + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} 804 + cpu: [arm64] 805 + os: [openharmony] 806 + 807 + '@rollup/rollup-win32-arm64-msvc@4.53.3': 808 + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} 809 + cpu: [arm64] 810 + os: [win32] 811 + 812 + '@rollup/rollup-win32-ia32-msvc@4.53.3': 813 + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} 814 + cpu: [ia32] 815 + os: [win32] 816 + 817 + '@rollup/rollup-win32-x64-gnu@4.53.3': 818 + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} 819 + cpu: [x64] 820 + os: [win32] 821 + 822 + '@rollup/rollup-win32-x64-msvc@4.53.3': 823 + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} 824 + cpu: [x64] 825 + os: [win32] 826 + 827 + '@standard-schema/spec@1.0.0': 828 + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} 829 + 830 + '@sveltejs/acorn-typescript@1.0.8': 831 + resolution: {integrity: sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==} 832 + peerDependencies: 833 + acorn: ^8.9.0 834 + 835 + '@sveltejs/adapter-auto@7.0.0': 836 + resolution: {integrity: sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw==} 837 + peerDependencies: 838 + '@sveltejs/kit': ^2.0.0 839 + 840 + '@sveltejs/adapter-node@5.4.0': 841 + resolution: {integrity: sha512-NMsrwGVPEn+J73zH83Uhss/hYYZN6zT3u31R3IHAn3MiKC3h8fjmIAhLfTSOeNHr5wPYfjjMg8E+1gyFgyrEcQ==} 842 + peerDependencies: 843 + '@sveltejs/kit': ^2.4.0 844 + 845 + '@sveltejs/kit@2.49.0': 846 + resolution: {integrity: sha512-oH8tXw7EZnie8FdOWYrF7Yn4IKrqTFHhXvl8YxXxbKwTMcD/5NNCryUSEXRk2ZR4ojnub0P8rNrsVGHXWqIDtA==} 847 + engines: {node: '>=18.13'} 848 + hasBin: true 849 + peerDependencies: 850 + '@opentelemetry/api': ^1.0.0 851 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 852 + svelte: ^4.0.0 || ^5.0.0-next.0 853 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 854 + peerDependenciesMeta: 855 + '@opentelemetry/api': 856 + optional: true 857 + 858 + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': 859 + resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} 860 + engines: {node: ^20.19 || ^22.12 || >=24} 861 + peerDependencies: 862 + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 863 + svelte: ^5.0.0 864 + vite: ^6.3.0 || ^7.0.0 865 + 866 + '@sveltejs/vite-plugin-svelte@6.2.1': 867 + resolution: {integrity: sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==} 868 + engines: {node: ^20.19 || ^22.12 || >=24} 869 + peerDependencies: 870 + svelte: ^5.0.0 871 + vite: ^6.3.0 || ^7.0.0 872 + 873 + '@tailwindcss/node@4.1.17': 874 + resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} 875 + 876 + '@tailwindcss/oxide-android-arm64@4.1.17': 877 + resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} 878 + engines: {node: '>= 10'} 879 + cpu: [arm64] 880 + os: [android] 881 + 882 + '@tailwindcss/oxide-darwin-arm64@4.1.17': 883 + resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} 884 + engines: {node: '>= 10'} 885 + cpu: [arm64] 886 + os: [darwin] 887 + 888 + '@tailwindcss/oxide-darwin-x64@4.1.17': 889 + resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} 890 + engines: {node: '>= 10'} 891 + cpu: [x64] 892 + os: [darwin] 893 + 894 + '@tailwindcss/oxide-freebsd-x64@4.1.17': 895 + resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} 896 + engines: {node: '>= 10'} 897 + cpu: [x64] 898 + os: [freebsd] 899 + 900 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': 901 + resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} 902 + engines: {node: '>= 10'} 903 + cpu: [arm] 904 + os: [linux] 905 + 906 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': 907 + resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} 908 + engines: {node: '>= 10'} 909 + cpu: [arm64] 910 + os: [linux] 911 + 912 + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': 913 + resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} 914 + engines: {node: '>= 10'} 915 + cpu: [arm64] 916 + os: [linux] 917 + 918 + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': 919 + resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} 920 + engines: {node: '>= 10'} 921 + cpu: [x64] 922 + os: [linux] 923 + 924 + '@tailwindcss/oxide-linux-x64-musl@4.1.17': 925 + resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} 926 + engines: {node: '>= 10'} 927 + cpu: [x64] 928 + os: [linux] 929 + 930 + '@tailwindcss/oxide-wasm32-wasi@4.1.17': 931 + resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} 932 + engines: {node: '>=14.0.0'} 933 + cpu: [wasm32] 934 + bundledDependencies: 935 + - '@napi-rs/wasm-runtime' 936 + - '@emnapi/core' 937 + - '@emnapi/runtime' 938 + - '@tybys/wasm-util' 939 + - '@emnapi/wasi-threads' 940 + - tslib 941 + 942 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': 943 + resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} 944 + engines: {node: '>= 10'} 945 + cpu: [arm64] 946 + os: [win32] 947 + 948 + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': 949 + resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} 950 + engines: {node: '>= 10'} 951 + cpu: [x64] 952 + os: [win32] 953 + 954 + '@tailwindcss/oxide@4.1.17': 955 + resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} 956 + engines: {node: '>= 10'} 957 + 958 + '@tailwindcss/vite@4.1.17': 959 + resolution: {integrity: sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==} 960 + peerDependencies: 961 + vite: ^5.2.0 || ^6 || ^7 962 + 963 + '@ts-morph/common@0.28.1': 964 + resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} 965 + 966 + '@types/chai@5.2.3': 967 + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} 968 + 969 + '@types/cookie@0.6.0': 970 + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 971 + 972 + '@types/deep-eql@4.0.2': 973 + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 974 + 975 + '@types/estree@1.0.8': 976 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 977 + 978 + '@types/json-schema@7.0.15': 979 + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 980 + 981 + '@types/node@22.19.1': 982 + resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} 983 + 984 + '@types/resolve@1.20.2': 985 + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 986 + 987 + '@types/ws@8.18.1': 988 + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} 989 + 990 + '@typescript-eslint/eslint-plugin@8.48.0': 991 + resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==} 992 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 993 + peerDependencies: 994 + '@typescript-eslint/parser': ^8.48.0 995 + eslint: ^8.57.0 || ^9.0.0 996 + typescript: '>=4.8.4 <6.0.0' 997 + 998 + '@typescript-eslint/parser@8.48.0': 999 + resolution: {integrity: sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==} 1000 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1001 + peerDependencies: 1002 + eslint: ^8.57.0 || ^9.0.0 1003 + typescript: '>=4.8.4 <6.0.0' 1004 + 1005 + '@typescript-eslint/project-service@8.48.0': 1006 + resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==} 1007 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1008 + peerDependencies: 1009 + typescript: '>=4.8.4 <6.0.0' 1010 + 1011 + '@typescript-eslint/scope-manager@8.48.0': 1012 + resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==} 1013 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1014 + 1015 + '@typescript-eslint/tsconfig-utils@8.48.0': 1016 + resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==} 1017 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1018 + peerDependencies: 1019 + typescript: '>=4.8.4 <6.0.0' 1020 + 1021 + '@typescript-eslint/type-utils@8.48.0': 1022 + resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} 1023 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1024 + peerDependencies: 1025 + eslint: ^8.57.0 || ^9.0.0 1026 + typescript: '>=4.8.4 <6.0.0' 1027 + 1028 + '@typescript-eslint/types@8.48.0': 1029 + resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==} 1030 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1031 + 1032 + '@typescript-eslint/typescript-estree@8.48.0': 1033 + resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==} 1034 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1035 + peerDependencies: 1036 + typescript: '>=4.8.4 <6.0.0' 1037 + 1038 + '@typescript-eslint/utils@8.48.0': 1039 + resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==} 1040 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1041 + peerDependencies: 1042 + eslint: ^8.57.0 || ^9.0.0 1043 + typescript: '>=4.8.4 <6.0.0' 1044 + 1045 + '@typescript-eslint/visitor-keys@8.48.0': 1046 + resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} 1047 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1048 + 1049 + '@vitest/browser-playwright@4.0.14': 1050 + resolution: {integrity: sha512-rUvyz6wX6wDjcYzf/7fgXYfca2bAu0Axoq/v9LYdELzcBSS9UKjnZ7MaMY4UDP78HHHCdmdtceuSao1s51ON8A==} 1051 + peerDependencies: 1052 + playwright: '*' 1053 + vitest: 4.0.14 1054 + 1055 + '@vitest/browser@4.0.14': 1056 + resolution: {integrity: sha512-vO0uqR8SnPTd8ykp14yaIuUyMZ9HEBYuoZrVdUp7RrEp76VEnkrX9fDkGnK0NyBdfWXB6cqp7BmqVekd8yKHFQ==} 1057 + peerDependencies: 1058 + vitest: 4.0.14 1059 + 1060 + '@vitest/expect@4.0.14': 1061 + resolution: {integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==} 1062 + 1063 + '@vitest/mocker@4.0.14': 1064 + resolution: {integrity: sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==} 1065 + peerDependencies: 1066 + msw: ^2.4.9 1067 + vite: ^6.0.0 || ^7.0.0-0 1068 + peerDependenciesMeta: 1069 + msw: 1070 + optional: true 1071 + vite: 1072 + optional: true 1073 + 1074 + '@vitest/pretty-format@4.0.14': 1075 + resolution: {integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==} 1076 + 1077 + '@vitest/runner@4.0.14': 1078 + resolution: {integrity: sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==} 1079 + 1080 + '@vitest/snapshot@4.0.14': 1081 + resolution: {integrity: sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==} 1082 + 1083 + '@vitest/spy@4.0.14': 1084 + resolution: {integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==} 1085 + 1086 + '@vitest/utils@4.0.14': 1087 + resolution: {integrity: sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==} 1088 + 1089 + abort-controller@3.0.0: 1090 + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 1091 + engines: {node: '>=6.5'} 1092 + 1093 + acorn-jsx@5.3.2: 1094 + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 1095 + peerDependencies: 1096 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 1097 + 1098 + acorn@8.15.0: 1099 + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 1100 + engines: {node: '>=0.4.0'} 1101 + hasBin: true 1102 + 1103 + ajv@6.12.6: 1104 + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 1105 + 1106 + ansi-regex@5.0.1: 1107 + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1108 + engines: {node: '>=8'} 1109 + 1110 + ansi-styles@4.3.0: 1111 + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1112 + engines: {node: '>=8'} 1113 + 1114 + argparse@2.0.1: 1115 + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1116 + 1117 + aria-query@5.3.2: 1118 + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 1119 + engines: {node: '>= 0.4'} 1120 + 1121 + assertion-error@2.0.1: 1122 + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 1123 + engines: {node: '>=12'} 1124 + 1125 + atomic-sleep@1.0.0: 1126 + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 1127 + engines: {node: '>=8.0.0'} 1128 + 1129 + axobject-query@4.1.0: 1130 + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 1131 + engines: {node: '>= 0.4'} 1132 + 1133 + balanced-match@1.0.2: 1134 + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1135 + 1136 + base64-js@1.5.1: 1137 + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 1138 + 1139 + better-sqlite3@12.5.0: 1140 + resolution: {integrity: sha512-WwCZ/5Diz7rsF29o27o0Gcc1Du+l7Zsv7SYtVPG0X3G/uUI1LqdxrQI7c9Hs2FWpqXXERjW9hp6g3/tH7DlVKg==} 1141 + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} 1142 + 1143 + bindings@1.5.0: 1144 + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 1145 + 1146 + bl@4.1.0: 1147 + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 1148 + 1149 + brace-expansion@1.1.12: 1150 + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 1151 + 1152 + brace-expansion@2.0.2: 1153 + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 1154 + 1155 + buffer-from@1.1.2: 1156 + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1157 + 1158 + buffer@5.7.1: 1159 + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 1160 + 1161 + buffer@6.0.3: 1162 + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 1163 + 1164 + callsites@3.1.0: 1165 + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1166 + engines: {node: '>=6'} 1167 + 1168 + cborg@1.10.2: 1169 + resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==} 1170 + hasBin: true 1171 + 1172 + chai@6.2.1: 1173 + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} 1174 + engines: {node: '>=18'} 1175 + 1176 + chalk@4.1.2: 1177 + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1178 + engines: {node: '>=10'} 1179 + 1180 + chokidar@4.0.3: 1181 + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 1182 + engines: {node: '>= 14.16.0'} 1183 + 1184 + chownr@1.1.4: 1185 + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 1186 + 1187 + cliui@8.0.1: 1188 + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 1189 + engines: {node: '>=12'} 1190 + 1191 + clsx@2.1.1: 1192 + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 1193 + engines: {node: '>=6'} 1194 + 1195 + code-block-writer@13.0.3: 1196 + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} 1197 + 1198 + color-convert@2.0.1: 1199 + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1200 + engines: {node: '>=7.0.0'} 1201 + 1202 + color-name@1.1.4: 1203 + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1204 + 1205 + commondir@1.0.1: 1206 + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 1207 + 1208 + concat-map@0.0.1: 1209 + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1210 + 1211 + cookie@0.6.0: 1212 + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 1213 + engines: {node: '>= 0.6'} 1214 + 1215 + cookie@0.7.2: 1216 + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 1217 + engines: {node: '>= 0.6'} 1218 + 1219 + core-js@3.47.0: 1220 + resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} 1221 + 1222 + cross-spawn@7.0.6: 1223 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1224 + engines: {node: '>= 8'} 1225 + 1226 + cssesc@3.0.0: 1227 + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1228 + engines: {node: '>=4'} 1229 + hasBin: true 1230 + 1231 + data-uri-to-buffer@4.0.1: 1232 + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 1233 + engines: {node: '>= 12'} 1234 + 1235 + debug@4.4.3: 1236 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 1237 + engines: {node: '>=6.0'} 1238 + peerDependencies: 1239 + supports-color: '*' 1240 + peerDependenciesMeta: 1241 + supports-color: 1242 + optional: true 1243 + 1244 + decompress-response@6.0.0: 1245 + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 1246 + engines: {node: '>=10'} 1247 + 1248 + deep-extend@0.6.0: 1249 + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 1250 + engines: {node: '>=4.0.0'} 1251 + 1252 + deep-is@0.1.4: 1253 + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1254 + 1255 + deepmerge@4.3.1: 1256 + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1257 + engines: {node: '>=0.10.0'} 1258 + 1259 + detect-libc@2.0.2: 1260 + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} 1261 + engines: {node: '>=8'} 1262 + 1263 + detect-libc@2.1.2: 1264 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 1265 + engines: {node: '>=8'} 1266 + 1267 + devalue@5.5.0: 1268 + resolution: {integrity: sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==} 1269 + 1270 + drizzle-kit@0.31.7: 1271 + resolution: {integrity: sha512-hOzRGSdyKIU4FcTSFYGKdXEjFsncVwHZ43gY3WU5Bz9j5Iadp6Rh6hxLSQ1IWXpKLBKt/d5y1cpSPcV+FcoQ1A==} 1272 + hasBin: true 1273 + 1274 + drizzle-orm@0.44.7: 1275 + resolution: {integrity: sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==} 1276 + peerDependencies: 1277 + '@aws-sdk/client-rds-data': '>=3' 1278 + '@cloudflare/workers-types': '>=4' 1279 + '@electric-sql/pglite': '>=0.2.0' 1280 + '@libsql/client': '>=0.10.0' 1281 + '@libsql/client-wasm': '>=0.10.0' 1282 + '@neondatabase/serverless': '>=0.10.0' 1283 + '@op-engineering/op-sqlite': '>=2' 1284 + '@opentelemetry/api': ^1.4.1 1285 + '@planetscale/database': '>=1.13' 1286 + '@prisma/client': '*' 1287 + '@tidbcloud/serverless': '*' 1288 + '@types/better-sqlite3': '*' 1289 + '@types/pg': '*' 1290 + '@types/sql.js': '*' 1291 + '@upstash/redis': '>=1.34.7' 1292 + '@vercel/postgres': '>=0.8.0' 1293 + '@xata.io/client': '*' 1294 + better-sqlite3: '>=7' 1295 + bun-types: '*' 1296 + expo-sqlite: '>=14.0.0' 1297 + gel: '>=2' 1298 + knex: '*' 1299 + kysely: '*' 1300 + mysql2: '>=2' 1301 + pg: '>=8' 1302 + postgres: '>=3' 1303 + prisma: '*' 1304 + sql.js: '>=1' 1305 + sqlite3: '>=5' 1306 + peerDependenciesMeta: 1307 + '@aws-sdk/client-rds-data': 1308 + optional: true 1309 + '@cloudflare/workers-types': 1310 + optional: true 1311 + '@electric-sql/pglite': 1312 + optional: true 1313 + '@libsql/client': 1314 + optional: true 1315 + '@libsql/client-wasm': 1316 + optional: true 1317 + '@neondatabase/serverless': 1318 + optional: true 1319 + '@op-engineering/op-sqlite': 1320 + optional: true 1321 + '@opentelemetry/api': 1322 + optional: true 1323 + '@planetscale/database': 1324 + optional: true 1325 + '@prisma/client': 1326 + optional: true 1327 + '@tidbcloud/serverless': 1328 + optional: true 1329 + '@types/better-sqlite3': 1330 + optional: true 1331 + '@types/pg': 1332 + optional: true 1333 + '@types/sql.js': 1334 + optional: true 1335 + '@upstash/redis': 1336 + optional: true 1337 + '@vercel/postgres': 1338 + optional: true 1339 + '@xata.io/client': 1340 + optional: true 1341 + better-sqlite3: 1342 + optional: true 1343 + bun-types: 1344 + optional: true 1345 + expo-sqlite: 1346 + optional: true 1347 + gel: 1348 + optional: true 1349 + knex: 1350 + optional: true 1351 + kysely: 1352 + optional: true 1353 + mysql2: 1354 + optional: true 1355 + pg: 1356 + optional: true 1357 + postgres: 1358 + optional: true 1359 + prisma: 1360 + optional: true 1361 + sql.js: 1362 + optional: true 1363 + sqlite3: 1364 + optional: true 1365 + 1366 + emoji-regex@8.0.0: 1367 + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1368 + 1369 + end-of-stream@1.4.5: 1370 + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} 1371 + 1372 + enhanced-resolve@5.18.3: 1373 + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} 1374 + engines: {node: '>=10.13.0'} 1375 + 1376 + es-module-lexer@1.7.0: 1377 + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 1378 + 1379 + esbuild-register@3.6.0: 1380 + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} 1381 + peerDependencies: 1382 + esbuild: '>=0.12 <1' 1383 + 1384 + esbuild@0.18.20: 1385 + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 1386 + engines: {node: '>=12'} 1387 + hasBin: true 1388 + 1389 + esbuild@0.25.12: 1390 + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 1391 + engines: {node: '>=18'} 1392 + hasBin: true 1393 + 1394 + escalade@3.2.0: 1395 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1396 + engines: {node: '>=6'} 1397 + 1398 + escape-string-regexp@4.0.0: 1399 + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1400 + engines: {node: '>=10'} 1401 + 1402 + eslint-config-prettier@10.1.8: 1403 + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} 1404 + hasBin: true 1405 + peerDependencies: 1406 + eslint: '>=7.0.0' 1407 + 1408 + eslint-plugin-svelte@3.13.0: 1409 + resolution: {integrity: sha512-2ohCCQJJTNbIpQCSDSTWj+FN0OVfPmSO03lmSNT7ytqMaWF6kpT86LdzDqtm4sh7TVPl/OEWJ/d7R87bXP2Vjg==} 1410 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1411 + peerDependencies: 1412 + eslint: ^8.57.1 || ^9.0.0 1413 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 1414 + peerDependenciesMeta: 1415 + svelte: 1416 + optional: true 1417 + 1418 + eslint-scope@8.4.0: 1419 + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 1420 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1421 + 1422 + eslint-visitor-keys@3.4.3: 1423 + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1424 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1425 + 1426 + eslint-visitor-keys@4.2.1: 1427 + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 1428 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1429 + 1430 + eslint@9.39.1: 1431 + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} 1432 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1433 + hasBin: true 1434 + peerDependencies: 1435 + jiti: '*' 1436 + peerDependenciesMeta: 1437 + jiti: 1438 + optional: true 1439 + 1440 + esm-env@1.2.2: 1441 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 1442 + 1443 + espree@10.4.0: 1444 + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 1445 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1446 + 1447 + esquery@1.6.0: 1448 + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 1449 + engines: {node: '>=0.10'} 1450 + 1451 + esrap@2.2.0: 1452 + resolution: {integrity: sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg==} 1453 + 1454 + esrecurse@4.3.0: 1455 + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1456 + engines: {node: '>=4.0'} 1457 + 1458 + estraverse@5.3.0: 1459 + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1460 + engines: {node: '>=4.0'} 1461 + 1462 + estree-walker@2.0.2: 1463 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1464 + 1465 + estree-walker@3.0.3: 1466 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1467 + 1468 + esutils@2.0.3: 1469 + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1470 + engines: {node: '>=0.10.0'} 1471 + 1472 + event-target-shim@5.0.1: 1473 + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 1474 + engines: {node: '>=6'} 1475 + 1476 + events@3.3.0: 1477 + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 1478 + engines: {node: '>=0.8.x'} 1479 + 1480 + expand-template@2.0.3: 1481 + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 1482 + engines: {node: '>=6'} 1483 + 1484 + expect-type@1.2.2: 1485 + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 1486 + engines: {node: '>=12.0.0'} 1487 + 1488 + fast-deep-equal@3.1.3: 1489 + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1490 + 1491 + fast-json-stable-stringify@2.1.0: 1492 + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1493 + 1494 + fast-levenshtein@2.0.6: 1495 + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1496 + 1497 + fast-redact@3.5.0: 1498 + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} 1499 + engines: {node: '>=6'} 1500 + 1501 + fdir@6.5.0: 1502 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 1503 + engines: {node: '>=12.0.0'} 1504 + peerDependencies: 1505 + picomatch: ^3 || ^4 1506 + peerDependenciesMeta: 1507 + picomatch: 1508 + optional: true 1509 + 1510 + fetch-blob@3.2.0: 1511 + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 1512 + engines: {node: ^12.20 || >= 14.13} 1513 + 1514 + file-entry-cache@8.0.0: 1515 + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1516 + engines: {node: '>=16.0.0'} 1517 + 1518 + file-uri-to-path@1.0.0: 1519 + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 1520 + 1521 + find-up@5.0.0: 1522 + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1523 + engines: {node: '>=10'} 1524 + 1525 + flat-cache@4.0.1: 1526 + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1527 + engines: {node: '>=16'} 1528 + 1529 + flatted@3.3.3: 1530 + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 1531 + 1532 + formdata-polyfill@4.0.10: 1533 + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 1534 + engines: {node: '>=12.20.0'} 1535 + 1536 + fs-constants@1.0.0: 1537 + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 1538 + 1539 + fsevents@2.3.2: 1540 + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1541 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1542 + os: [darwin] 1543 + 1544 + fsevents@2.3.3: 1545 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1546 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1547 + os: [darwin] 1548 + 1549 + function-bind@1.1.2: 1550 + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1551 + 1552 + get-caller-file@2.0.5: 1553 + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1554 + engines: {node: 6.* || 8.* || >= 10.*} 1555 + 1556 + get-tsconfig@4.13.0: 1557 + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 1558 + 1559 + github-from-package@0.0.0: 1560 + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} 1561 + 1562 + glob-parent@6.0.2: 1563 + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1564 + engines: {node: '>=10.13.0'} 1565 + 1566 + globals@14.0.0: 1567 + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1568 + engines: {node: '>=18'} 1569 + 1570 + globals@16.5.0: 1571 + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} 1572 + engines: {node: '>=18'} 1573 + 1574 + graceful-fs@4.2.11: 1575 + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1576 + 1577 + graphemer@1.4.0: 1578 + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1579 + 1580 + has-flag@4.0.0: 1581 + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1582 + engines: {node: '>=8'} 1583 + 1584 + hasown@2.0.2: 1585 + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1586 + engines: {node: '>= 0.4'} 1587 + 1588 + ieee754@1.2.1: 1589 + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1590 + 1591 + ignore@5.3.2: 1592 + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1593 + engines: {node: '>= 4'} 1594 + 1595 + ignore@7.0.5: 1596 + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 1597 + engines: {node: '>= 4'} 1598 + 1599 + import-fresh@3.3.1: 1600 + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1601 + engines: {node: '>=6'} 1602 + 1603 + imurmurhash@0.1.4: 1604 + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1605 + engines: {node: '>=0.8.19'} 1606 + 1607 + inherits@2.0.4: 1608 + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1609 + 1610 + ini@1.3.8: 1611 + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1612 + 1613 + ipaddr.js@2.3.0: 1614 + resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} 1615 + engines: {node: '>= 10'} 1616 + 1617 + iron-session@8.0.4: 1618 + resolution: {integrity: sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA==} 1619 + 1620 + iron-webcrypto@1.2.1: 1621 + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} 1622 + 1623 + is-core-module@2.16.1: 1624 + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1625 + engines: {node: '>= 0.4'} 1626 + 1627 + is-extglob@2.1.1: 1628 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1629 + engines: {node: '>=0.10.0'} 1630 + 1631 + is-fullwidth-code-point@3.0.0: 1632 + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1633 + engines: {node: '>=8'} 1634 + 1635 + is-glob@4.0.3: 1636 + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1637 + engines: {node: '>=0.10.0'} 1638 + 1639 + is-module@1.0.0: 1640 + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 1641 + 1642 + is-reference@1.2.1: 1643 + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 1644 + 1645 + is-reference@3.0.3: 1646 + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 1647 + 1648 + isexe@2.0.0: 1649 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1650 + 1651 + iso-datestring-validator@2.2.2: 1652 + resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} 1653 + 1654 + jiti@2.6.1: 1655 + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 1656 + hasBin: true 1657 + 1658 + jose@5.10.0: 1659 + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} 1660 + 1661 + js-base64@3.7.8: 1662 + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} 1663 + 1664 + js-yaml@4.1.1: 1665 + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 1666 + hasBin: true 1667 + 1668 + json-buffer@3.0.1: 1669 + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1670 + 1671 + json-schema-traverse@0.4.1: 1672 + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1673 + 1674 + json-stable-stringify-without-jsonify@1.0.1: 1675 + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1676 + 1677 + keyv@4.5.4: 1678 + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1679 + 1680 + kleur@4.1.5: 1681 + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1682 + engines: {node: '>=6'} 1683 + 1684 + known-css-properties@0.37.0: 1685 + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} 1686 + 1687 + levn@0.4.1: 1688 + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1689 + engines: {node: '>= 0.8.0'} 1690 + 1691 + libsql@0.5.22: 1692 + resolution: {integrity: sha512-NscWthMQt7fpU8lqd7LXMvT9pi+KhhmTHAJWUB/Lj6MWa0MKFv0F2V4C6WKKpjCVZl0VwcDz4nOI3CyaT1DDiA==} 1693 + os: [darwin, linux, win32] 1694 + 1695 + lightningcss-android-arm64@1.30.2: 1696 + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} 1697 + engines: {node: '>= 12.0.0'} 1698 + cpu: [arm64] 1699 + os: [android] 1700 + 1701 + lightningcss-darwin-arm64@1.30.2: 1702 + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} 1703 + engines: {node: '>= 12.0.0'} 1704 + cpu: [arm64] 1705 + os: [darwin] 1706 + 1707 + lightningcss-darwin-x64@1.30.2: 1708 + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} 1709 + engines: {node: '>= 12.0.0'} 1710 + cpu: [x64] 1711 + os: [darwin] 1712 + 1713 + lightningcss-freebsd-x64@1.30.2: 1714 + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} 1715 + engines: {node: '>= 12.0.0'} 1716 + cpu: [x64] 1717 + os: [freebsd] 1718 + 1719 + lightningcss-linux-arm-gnueabihf@1.30.2: 1720 + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} 1721 + engines: {node: '>= 12.0.0'} 1722 + cpu: [arm] 1723 + os: [linux] 1724 + 1725 + lightningcss-linux-arm64-gnu@1.30.2: 1726 + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} 1727 + engines: {node: '>= 12.0.0'} 1728 + cpu: [arm64] 1729 + os: [linux] 1730 + 1731 + lightningcss-linux-arm64-musl@1.30.2: 1732 + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} 1733 + engines: {node: '>= 12.0.0'} 1734 + cpu: [arm64] 1735 + os: [linux] 1736 + 1737 + lightningcss-linux-x64-gnu@1.30.2: 1738 + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} 1739 + engines: {node: '>= 12.0.0'} 1740 + cpu: [x64] 1741 + os: [linux] 1742 + 1743 + lightningcss-linux-x64-musl@1.30.2: 1744 + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} 1745 + engines: {node: '>= 12.0.0'} 1746 + cpu: [x64] 1747 + os: [linux] 1748 + 1749 + lightningcss-win32-arm64-msvc@1.30.2: 1750 + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} 1751 + engines: {node: '>= 12.0.0'} 1752 + cpu: [arm64] 1753 + os: [win32] 1754 + 1755 + lightningcss-win32-x64-msvc@1.30.2: 1756 + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} 1757 + engines: {node: '>= 12.0.0'} 1758 + cpu: [x64] 1759 + os: [win32] 1760 + 1761 + lightningcss@1.30.2: 1762 + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} 1763 + engines: {node: '>= 12.0.0'} 1764 + 1765 + lilconfig@2.1.0: 1766 + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1767 + engines: {node: '>=10'} 1768 + 1769 + locate-character@3.0.0: 1770 + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 1771 + 1772 + locate-path@6.0.0: 1773 + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1774 + engines: {node: '>=10'} 1775 + 1776 + lodash.merge@4.6.2: 1777 + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1778 + 1779 + lru-cache@10.4.3: 1780 + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1781 + 1782 + magic-string@0.30.21: 1783 + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1784 + 1785 + mimic-response@3.1.0: 1786 + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1787 + engines: {node: '>=10'} 1788 + 1789 + minimatch@10.1.1: 1790 + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} 1791 + engines: {node: 20 || >=22} 1792 + 1793 + minimatch@3.1.2: 1794 + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1795 + 1796 + minimatch@9.0.5: 1797 + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1798 + engines: {node: '>=16 || 14 >=14.17'} 1799 + 1800 + minimist@1.2.8: 1801 + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1802 + 1803 + mkdirp-classic@0.5.3: 1804 + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1805 + 1806 + mri@1.2.0: 1807 + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1808 + engines: {node: '>=4'} 1809 + 1810 + mrmime@2.0.1: 1811 + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1812 + engines: {node: '>=10'} 1813 + 1814 + ms@2.1.3: 1815 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1816 + 1817 + multiformats@9.9.0: 1818 + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} 1819 + 1820 + nanoid@3.3.11: 1821 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1822 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1823 + hasBin: true 1824 + 1825 + napi-build-utils@2.0.0: 1826 + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} 1827 + 1828 + natural-compare@1.4.0: 1829 + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1830 + 1831 + node-abi@3.85.0: 1832 + resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==} 1833 + engines: {node: '>=10'} 1834 + 1835 + node-domexception@1.0.0: 1836 + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1837 + engines: {node: '>=10.5.0'} 1838 + deprecated: Use your platform's native DOMException instead 1839 + 1840 + node-fetch@3.3.2: 1841 + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 1842 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1843 + 1844 + obug@2.1.1: 1845 + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} 1846 + 1847 + on-exit-leak-free@2.1.2: 1848 + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} 1849 + engines: {node: '>=14.0.0'} 1850 + 1851 + once@1.4.0: 1852 + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1853 + 1854 + optionator@0.9.4: 1855 + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1856 + engines: {node: '>= 0.8.0'} 1857 + 1858 + p-limit@3.1.0: 1859 + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1860 + engines: {node: '>=10'} 1861 + 1862 + p-locate@5.0.0: 1863 + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1864 + engines: {node: '>=10'} 1865 + 1866 + parent-module@1.0.1: 1867 + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1868 + engines: {node: '>=6'} 1869 + 1870 + path-browserify@1.0.1: 1871 + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 1872 + 1873 + path-exists@4.0.0: 1874 + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1875 + engines: {node: '>=8'} 1876 + 1877 + path-key@3.1.1: 1878 + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1879 + engines: {node: '>=8'} 1880 + 1881 + path-parse@1.0.7: 1882 + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1883 + 1884 + pathe@2.0.3: 1885 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1886 + 1887 + picocolors@1.1.1: 1888 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1889 + 1890 + picomatch@4.0.3: 1891 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1892 + engines: {node: '>=12'} 1893 + 1894 + pino-abstract-transport@1.2.0: 1895 + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} 1896 + 1897 + pino-std-serializers@6.2.2: 1898 + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} 1899 + 1900 + pino@8.21.0: 1901 + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} 1902 + hasBin: true 1903 + 1904 + pixelmatch@7.1.0: 1905 + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} 1906 + hasBin: true 1907 + 1908 + playwright-core@1.57.0: 1909 + resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} 1910 + engines: {node: '>=18'} 1911 + hasBin: true 1912 + 1913 + playwright@1.57.0: 1914 + resolution: {integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==} 1915 + engines: {node: '>=18'} 1916 + hasBin: true 1917 + 1918 + pngjs@7.0.0: 1919 + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} 1920 + engines: {node: '>=14.19.0'} 1921 + 1922 + postcss-load-config@3.1.4: 1923 + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1924 + engines: {node: '>= 10'} 1925 + peerDependencies: 1926 + postcss: '>=8.0.9' 1927 + ts-node: '>=9.0.0' 1928 + peerDependenciesMeta: 1929 + postcss: 1930 + optional: true 1931 + ts-node: 1932 + optional: true 1933 + 1934 + postcss-safe-parser@7.0.1: 1935 + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} 1936 + engines: {node: '>=18.0'} 1937 + peerDependencies: 1938 + postcss: ^8.4.31 1939 + 1940 + postcss-scss@4.0.9: 1941 + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} 1942 + engines: {node: '>=12.0'} 1943 + peerDependencies: 1944 + postcss: ^8.4.29 1945 + 1946 + postcss-selector-parser@7.1.1: 1947 + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} 1948 + engines: {node: '>=4'} 1949 + 1950 + postcss@8.5.6: 1951 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1952 + engines: {node: ^10 || ^12 || >=14} 1953 + 1954 + prebuild-install@7.1.3: 1955 + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} 1956 + engines: {node: '>=10'} 1957 + hasBin: true 1958 + 1959 + prelude-ls@1.2.1: 1960 + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1961 + engines: {node: '>= 0.8.0'} 1962 + 1963 + prettier-plugin-svelte@3.4.0: 1964 + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} 1965 + peerDependencies: 1966 + prettier: ^3.0.0 1967 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 1968 + 1969 + prettier@3.7.3: 1970 + resolution: {integrity: sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==} 1971 + engines: {node: '>=14'} 1972 + hasBin: true 1973 + 1974 + process-warning@3.0.0: 1975 + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} 1976 + 1977 + process@0.11.10: 1978 + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 1979 + engines: {node: '>= 0.6.0'} 1980 + 1981 + promise-limit@2.7.0: 1982 + resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} 1983 + 1984 + pump@3.0.3: 1985 + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} 1986 + 1987 + punycode@2.3.1: 1988 + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1989 + engines: {node: '>=6'} 1990 + 1991 + quick-format-unescaped@4.0.4: 1992 + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 1993 + 1994 + rc@1.2.8: 1995 + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1996 + hasBin: true 1997 + 1998 + readable-stream@3.6.2: 1999 + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 2000 + engines: {node: '>= 6'} 2001 + 2002 + readable-stream@4.7.0: 2003 + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} 2004 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 2005 + 2006 + readdirp@4.1.2: 2007 + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 2008 + engines: {node: '>= 14.18.0'} 2009 + 2010 + real-require@0.2.0: 2011 + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 2012 + engines: {node: '>= 12.13.0'} 2013 + 2014 + require-directory@2.1.1: 2015 + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2016 + engines: {node: '>=0.10.0'} 2017 + 2018 + resolve-from@4.0.0: 2019 + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2020 + engines: {node: '>=4'} 2021 + 2022 + resolve-pkg-maps@1.0.0: 2023 + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 2024 + 2025 + resolve@1.22.11: 2026 + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} 2027 + engines: {node: '>= 0.4'} 2028 + hasBin: true 2029 + 2030 + rollup@4.53.3: 2031 + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} 2032 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2033 + hasBin: true 2034 + 2035 + sade@1.8.1: 2036 + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 2037 + engines: {node: '>=6'} 2038 + 2039 + safe-buffer@5.2.1: 2040 + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2041 + 2042 + safe-stable-stringify@2.5.0: 2043 + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 2044 + engines: {node: '>=10'} 2045 + 2046 + semver@7.7.3: 2047 + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 2048 + engines: {node: '>=10'} 2049 + hasBin: true 2050 + 2051 + set-cookie-parser@2.7.2: 2052 + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} 2053 + 2054 + shebang-command@2.0.0: 2055 + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2056 + engines: {node: '>=8'} 2057 + 2058 + shebang-regex@3.0.0: 2059 + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2060 + engines: {node: '>=8'} 2061 + 2062 + siginfo@2.0.0: 2063 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2064 + 2065 + simple-concat@1.0.1: 2066 + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 2067 + 2068 + simple-get@4.0.1: 2069 + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} 2070 + 2071 + sirv@3.0.2: 2072 + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} 2073 + engines: {node: '>=18'} 2074 + 2075 + sonic-boom@3.8.1: 2076 + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} 2077 + 2078 + source-map-js@1.2.1: 2079 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 2080 + engines: {node: '>=0.10.0'} 2081 + 2082 + source-map-support@0.5.21: 2083 + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 2084 + 2085 + source-map@0.6.1: 2086 + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2087 + engines: {node: '>=0.10.0'} 2088 + 2089 + split2@4.2.0: 2090 + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 2091 + engines: {node: '>= 10.x'} 2092 + 2093 + stackback@0.0.2: 2094 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 2095 + 2096 + std-env@3.10.0: 2097 + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} 2098 + 2099 + string-width@4.2.3: 2100 + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2101 + engines: {node: '>=8'} 2102 + 2103 + string_decoder@1.3.0: 2104 + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2105 + 2106 + strip-ansi@6.0.1: 2107 + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2108 + engines: {node: '>=8'} 2109 + 2110 + strip-json-comments@2.0.1: 2111 + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 2112 + engines: {node: '>=0.10.0'} 2113 + 2114 + strip-json-comments@3.1.1: 2115 + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2116 + engines: {node: '>=8'} 2117 + 2118 + supports-color@7.2.0: 2119 + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2120 + engines: {node: '>=8'} 2121 + 2122 + supports-preserve-symlinks-flag@1.0.0: 2123 + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2124 + engines: {node: '>= 0.4'} 2125 + 2126 + svelte-check@4.3.4: 2127 + resolution: {integrity: sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw==} 2128 + engines: {node: '>= 18.0.0'} 2129 + hasBin: true 2130 + peerDependencies: 2131 + svelte: ^4.0.0 || ^5.0.0-next.0 2132 + typescript: '>=5.0.0' 2133 + 2134 + svelte-eslint-parser@1.4.0: 2135 + resolution: {integrity: sha512-fjPzOfipR5S7gQ/JvI9r2H8y9gMGXO3JtmrylHLLyahEMquXI0lrebcjT+9/hNgDej0H7abTyox5HpHmW1PSWA==} 2136 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.18.3} 2137 + peerDependencies: 2138 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 2139 + peerDependenciesMeta: 2140 + svelte: 2141 + optional: true 2142 + 2143 + svelte@5.45.2: 2144 + resolution: {integrity: sha512-yyXdW2u3H0H/zxxWoGwJoQlRgaSJLp+Vhktv12iRw2WRDlKqUPT54Fi0K/PkXqrdkcQ98aBazpy0AH4BCBVfoA==} 2145 + engines: {node: '>=18'} 2146 + 2147 + tailwindcss@4.1.17: 2148 + resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} 2149 + 2150 + tapable@2.3.0: 2151 + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} 2152 + engines: {node: '>=6'} 2153 + 2154 + tar-fs@2.1.4: 2155 + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} 2156 + 2157 + tar-stream@2.2.0: 2158 + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 2159 + engines: {node: '>=6'} 2160 + 2161 + thread-stream@2.7.0: 2162 + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} 2163 + 2164 + tinybench@2.9.0: 2165 + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 2166 + 2167 + tinyexec@0.3.2: 2168 + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 2169 + 2170 + tinyglobby@0.2.15: 2171 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 2172 + engines: {node: '>=12.0.0'} 2173 + 2174 + tinyrainbow@3.0.3: 2175 + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} 2176 + engines: {node: '>=14.0.0'} 2177 + 2178 + totalist@3.0.1: 2179 + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 2180 + engines: {node: '>=6'} 2181 + 2182 + ts-api-utils@2.1.0: 2183 + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 2184 + engines: {node: '>=18.12'} 2185 + peerDependencies: 2186 + typescript: '>=4.8.4' 2187 + 2188 + ts-morph@27.0.2: 2189 + resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} 2190 + 2191 + tslib@2.8.1: 2192 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2193 + 2194 + tunnel-agent@0.6.0: 2195 + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 2196 + 2197 + type-check@0.4.0: 2198 + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2199 + engines: {node: '>= 0.8.0'} 2200 + 2201 + typescript-eslint@8.48.0: 2202 + resolution: {integrity: sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==} 2203 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2204 + peerDependencies: 2205 + eslint: ^8.57.0 || ^9.0.0 2206 + typescript: '>=4.8.4 <6.0.0' 2207 + 2208 + typescript@5.9.3: 2209 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 2210 + engines: {node: '>=14.17'} 2211 + hasBin: true 2212 + 2213 + uint8arrays@3.0.0: 2214 + resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==} 2215 + 2216 + uncrypto@0.1.3: 2217 + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} 2218 + 2219 + undici-types@6.21.0: 2220 + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 2221 + 2222 + undici@6.22.0: 2223 + resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} 2224 + engines: {node: '>=18.17'} 2225 + 2226 + unicode-segmenter@0.14.1: 2227 + resolution: {integrity: sha512-yHedxlEpUyD+u1UE8qAuCMXVdMLn7yUdlmd8WN7FGmO1ICnpE7LJfnmuXBB+T0zkie3qHsy8fSucqceI/MylOg==} 2228 + 2229 + uri-js@4.4.1: 2230 + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2231 + 2232 + util-deprecate@1.0.2: 2233 + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2234 + 2235 + varint@6.0.0: 2236 + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} 2237 + 2238 + vite@7.2.4: 2239 + resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==} 2240 + engines: {node: ^20.19.0 || >=22.12.0} 2241 + hasBin: true 2242 + peerDependencies: 2243 + '@types/node': ^20.19.0 || >=22.12.0 2244 + jiti: '>=1.21.0' 2245 + less: ^4.0.0 2246 + lightningcss: ^1.21.0 2247 + sass: ^1.70.0 2248 + sass-embedded: ^1.70.0 2249 + stylus: '>=0.54.8' 2250 + sugarss: ^5.0.0 2251 + terser: ^5.16.0 2252 + tsx: ^4.8.1 2253 + yaml: ^2.4.2 2254 + peerDependenciesMeta: 2255 + '@types/node': 2256 + optional: true 2257 + jiti: 2258 + optional: true 2259 + less: 2260 + optional: true 2261 + lightningcss: 2262 + optional: true 2263 + sass: 2264 + optional: true 2265 + sass-embedded: 2266 + optional: true 2267 + stylus: 2268 + optional: true 2269 + sugarss: 2270 + optional: true 2271 + terser: 2272 + optional: true 2273 + tsx: 2274 + optional: true 2275 + yaml: 2276 + optional: true 2277 + 2278 + vitefu@1.1.1: 2279 + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} 2280 + peerDependencies: 2281 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 2282 + peerDependenciesMeta: 2283 + vite: 2284 + optional: true 2285 + 2286 + vitest-browser-svelte@2.0.1: 2287 + resolution: {integrity: sha512-z7GFio7vxaOolY+xwPUMEKuwL4KcPzB8+bepA9F0Phqag/TJ4j7IAGSwm4Y/FBh7KznsP+7aEIllMay0qDpFXw==} 2288 + peerDependencies: 2289 + svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 2290 + vitest: ^4.0.0 2291 + 2292 + vitest@4.0.14: 2293 + resolution: {integrity: sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==} 2294 + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} 2295 + hasBin: true 2296 + peerDependencies: 2297 + '@edge-runtime/vm': '*' 2298 + '@opentelemetry/api': ^1.9.0 2299 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 2300 + '@vitest/browser-playwright': 4.0.14 2301 + '@vitest/browser-preview': 4.0.14 2302 + '@vitest/browser-webdriverio': 4.0.14 2303 + '@vitest/ui': 4.0.14 2304 + happy-dom: '*' 2305 + jsdom: '*' 2306 + peerDependenciesMeta: 2307 + '@edge-runtime/vm': 2308 + optional: true 2309 + '@opentelemetry/api': 2310 + optional: true 2311 + '@types/node': 2312 + optional: true 2313 + '@vitest/browser-playwright': 2314 + optional: true 2315 + '@vitest/browser-preview': 2316 + optional: true 2317 + '@vitest/browser-webdriverio': 2318 + optional: true 2319 + '@vitest/ui': 2320 + optional: true 2321 + happy-dom: 2322 + optional: true 2323 + jsdom: 2324 + optional: true 2325 + 2326 + web-streams-polyfill@3.3.3: 2327 + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 2328 + engines: {node: '>= 8'} 2329 + 2330 + which@2.0.2: 2331 + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2332 + engines: {node: '>= 8'} 2333 + hasBin: true 2334 + 2335 + why-is-node-running@2.3.0: 2336 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 2337 + engines: {node: '>=8'} 2338 + hasBin: true 2339 + 2340 + word-wrap@1.2.5: 2341 + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 2342 + engines: {node: '>=0.10.0'} 2343 + 2344 + wrap-ansi@7.0.0: 2345 + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2346 + engines: {node: '>=10'} 2347 + 2348 + wrappy@1.0.2: 2349 + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2350 + 2351 + ws@8.18.3: 2352 + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} 2353 + engines: {node: '>=10.0.0'} 2354 + peerDependencies: 2355 + bufferutil: ^4.0.1 2356 + utf-8-validate: '>=5.0.2' 2357 + peerDependenciesMeta: 2358 + bufferutil: 2359 + optional: true 2360 + utf-8-validate: 2361 + optional: true 2362 + 2363 + y18n@5.0.8: 2364 + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2365 + engines: {node: '>=10'} 2366 + 2367 + yaml@1.10.2: 2368 + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 2369 + engines: {node: '>= 6'} 2370 + 2371 + yargs-parser@21.1.1: 2372 + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 2373 + engines: {node: '>=12'} 2374 + 2375 + yargs@17.7.2: 2376 + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 2377 + engines: {node: '>=12'} 2378 + 2379 + yocto-queue@0.1.0: 2380 + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2381 + engines: {node: '>=10'} 2382 + 2383 + zimmerframe@1.1.4: 2384 + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} 2385 + 2386 + zod@3.25.76: 2387 + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 2388 + 2389 + snapshots: 2390 + 2391 + '@atproto-labs/did-resolver@0.2.4': 2392 + dependencies: 2393 + '@atproto-labs/fetch': 0.2.3 2394 + '@atproto-labs/pipe': 0.1.1 2395 + '@atproto-labs/simple-store': 0.3.0 2396 + '@atproto-labs/simple-store-memory': 0.1.4 2397 + '@atproto/did': 0.2.3 2398 + zod: 3.25.76 2399 + 2400 + '@atproto-labs/fetch-node@0.2.0': 2401 + dependencies: 2402 + '@atproto-labs/fetch': 0.2.3 2403 + '@atproto-labs/pipe': 0.1.1 2404 + ipaddr.js: 2.3.0 2405 + undici: 6.22.0 2406 + 2407 + '@atproto-labs/fetch@0.2.3': 2408 + dependencies: 2409 + '@atproto-labs/pipe': 0.1.1 2410 + 2411 + '@atproto-labs/handle-resolver-node@0.1.23': 2412 + dependencies: 2413 + '@atproto-labs/fetch-node': 0.2.0 2414 + '@atproto-labs/handle-resolver': 0.3.4 2415 + '@atproto/did': 0.2.3 2416 + 2417 + '@atproto-labs/handle-resolver@0.3.4': 2418 + dependencies: 2419 + '@atproto-labs/simple-store': 0.3.0 2420 + '@atproto-labs/simple-store-memory': 0.1.4 2421 + '@atproto/did': 0.2.3 2422 + zod: 3.25.76 2423 + 2424 + '@atproto-labs/identity-resolver@0.3.4': 2425 + dependencies: 2426 + '@atproto-labs/did-resolver': 0.2.4 2427 + '@atproto-labs/handle-resolver': 0.3.4 2428 + 2429 + '@atproto-labs/pipe@0.1.1': {} 2430 + 2431 + '@atproto-labs/simple-store-memory@0.1.4': 2432 + dependencies: 2433 + '@atproto-labs/simple-store': 0.3.0 2434 + lru-cache: 10.4.3 2435 + 2436 + '@atproto-labs/simple-store@0.3.0': {} 2437 + 2438 + '@atproto/common-web@0.4.6': 2439 + dependencies: 2440 + '@atproto/lex-data': 0.0.2 2441 + '@atproto/lex-json': 0.0.2 2442 + zod: 3.25.76 2443 + 2444 + '@atproto/common@0.5.2': 2445 + dependencies: 2446 + '@atproto/common-web': 0.4.6 2447 + '@atproto/lex-cbor': 0.0.2 2448 + '@atproto/lex-data': 0.0.2 2449 + iso-datestring-validator: 2.2.2 2450 + multiformats: 9.9.0 2451 + pino: 8.21.0 2452 + 2453 + '@atproto/crypto@0.4.5': 2454 + dependencies: 2455 + '@noble/curves': 1.9.7 2456 + '@noble/hashes': 1.8.0 2457 + uint8arrays: 3.0.0 2458 + 2459 + '@atproto/did@0.2.3': 2460 + dependencies: 2461 + zod: 3.25.76 2462 + 2463 + '@atproto/jwk-jose@0.1.11': 2464 + dependencies: 2465 + '@atproto/jwk': 0.6.0 2466 + jose: 5.10.0 2467 + 2468 + '@atproto/jwk-webcrypto@0.2.0': 2469 + dependencies: 2470 + '@atproto/jwk': 0.6.0 2471 + '@atproto/jwk-jose': 0.1.11 2472 + zod: 3.25.76 2473 + 2474 + '@atproto/jwk@0.6.0': 2475 + dependencies: 2476 + multiformats: 9.9.0 2477 + zod: 3.25.76 2478 + 2479 + '@atproto/lex-builder@0.0.5': 2480 + dependencies: 2481 + '@atproto/lex-document': 0.0.4 2482 + '@atproto/lex-schema': 0.0.3 2483 + prettier: 3.7.3 2484 + ts-morph: 27.0.2 2485 + tslib: 2.8.1 2486 + 2487 + '@atproto/lex-cbor@0.0.2': 2488 + dependencies: 2489 + '@atproto/lex-data': 0.0.2 2490 + multiformats: 9.9.0 2491 + tslib: 2.8.1 2492 + 2493 + '@atproto/lex-client@0.0.3': 2494 + dependencies: 2495 + '@atproto/lex-data': 0.0.2 2496 + '@atproto/lex-json': 0.0.2 2497 + '@atproto/lex-schema': 0.0.3 2498 + tslib: 2.8.1 2499 + 2500 + '@atproto/lex-data@0.0.2': 2501 + dependencies: 2502 + '@atproto/syntax': 0.4.2 2503 + multiformats: 9.9.0 2504 + tslib: 2.8.1 2505 + uint8arrays: 3.0.0 2506 + unicode-segmenter: 0.14.1 2507 + 2508 + '@atproto/lex-document@0.0.4': 2509 + dependencies: 2510 + '@atproto/lex-schema': 0.0.3 2511 + core-js: 3.47.0 2512 + tslib: 2.8.1 2513 + 2514 + '@atproto/lex-installer@0.0.5': 2515 + dependencies: 2516 + '@atproto/lex-builder': 0.0.5 2517 + '@atproto/lex-cbor': 0.0.2 2518 + '@atproto/lex-data': 0.0.2 2519 + '@atproto/lex-document': 0.0.4 2520 + '@atproto/lex-resolver': 0.0.4 2521 + '@atproto/lex-schema': 0.0.3 2522 + '@atproto/syntax': 0.4.2 2523 + tslib: 2.8.1 2524 + 2525 + '@atproto/lex-json@0.0.2': 2526 + dependencies: 2527 + '@atproto/lex-data': 0.0.2 2528 + tslib: 2.8.1 2529 + 2530 + '@atproto/lex-resolver@0.0.4': 2531 + dependencies: 2532 + '@atproto-labs/did-resolver': 0.2.4 2533 + '@atproto/crypto': 0.4.5 2534 + '@atproto/lex-client': 0.0.3 2535 + '@atproto/lex-data': 0.0.2 2536 + '@atproto/lex-document': 0.0.4 2537 + '@atproto/lex-schema': 0.0.3 2538 + '@atproto/repo': 0.8.11 2539 + '@atproto/syntax': 0.4.2 2540 + tslib: 2.8.1 2541 + 2542 + '@atproto/lex-schema@0.0.3': 2543 + dependencies: 2544 + '@atproto/lex-data': 0.0.2 2545 + '@atproto/syntax': 0.4.2 2546 + tslib: 2.8.1 2547 + 2548 + '@atproto/lex@0.0.5': 2549 + dependencies: 2550 + '@atproto/lex-builder': 0.0.5 2551 + '@atproto/lex-client': 0.0.3 2552 + '@atproto/lex-installer': 0.0.5 2553 + '@atproto/lex-schema': 0.0.3 2554 + yargs: 17.7.2 2555 + 2556 + '@atproto/lexicon@0.5.2': 2557 + dependencies: 2558 + '@atproto/common-web': 0.4.6 2559 + '@atproto/syntax': 0.4.2 2560 + iso-datestring-validator: 2.2.2 2561 + multiformats: 9.9.0 2562 + zod: 3.25.76 2563 + 2564 + '@atproto/oauth-client-node@0.3.12': 2565 + dependencies: 2566 + '@atproto-labs/did-resolver': 0.2.4 2567 + '@atproto-labs/handle-resolver-node': 0.1.23 2568 + '@atproto-labs/simple-store': 0.3.0 2569 + '@atproto/did': 0.2.3 2570 + '@atproto/jwk': 0.6.0 2571 + '@atproto/jwk-jose': 0.1.11 2572 + '@atproto/jwk-webcrypto': 0.2.0 2573 + '@atproto/oauth-client': 0.5.10 2574 + '@atproto/oauth-types': 0.5.2 2575 + 2576 + '@atproto/oauth-client@0.5.10': 2577 + dependencies: 2578 + '@atproto-labs/did-resolver': 0.2.4 2579 + '@atproto-labs/fetch': 0.2.3 2580 + '@atproto-labs/handle-resolver': 0.3.4 2581 + '@atproto-labs/identity-resolver': 0.3.4 2582 + '@atproto-labs/simple-store': 0.3.0 2583 + '@atproto-labs/simple-store-memory': 0.1.4 2584 + '@atproto/did': 0.2.3 2585 + '@atproto/jwk': 0.6.0 2586 + '@atproto/oauth-types': 0.5.2 2587 + '@atproto/xrpc': 0.7.6 2588 + core-js: 3.47.0 2589 + multiformats: 9.9.0 2590 + zod: 3.25.76 2591 + 2592 + '@atproto/oauth-types@0.5.2': 2593 + dependencies: 2594 + '@atproto/did': 0.2.3 2595 + '@atproto/jwk': 0.6.0 2596 + zod: 3.25.76 2597 + 2598 + '@atproto/repo@0.8.11': 2599 + dependencies: 2600 + '@atproto/common': 0.5.2 2601 + '@atproto/common-web': 0.4.6 2602 + '@atproto/crypto': 0.4.5 2603 + '@atproto/lexicon': 0.5.2 2604 + '@ipld/dag-cbor': 7.0.3 2605 + multiformats: 9.9.0 2606 + uint8arrays: 3.0.0 2607 + varint: 6.0.0 2608 + zod: 3.25.76 2609 + 2610 + '@atproto/syntax@0.4.2': {} 2611 + 2612 + '@atproto/xrpc@0.7.6': 2613 + dependencies: 2614 + '@atproto/lexicon': 0.5.2 2615 + zod: 3.25.76 2616 + 2617 + '@cloudflare/workers-types@4.20251205.0': 2618 + optional: true 2619 + 2620 + '@drizzle-team/brocli@0.10.2': {} 2621 + 2622 + '@esbuild-kit/core-utils@3.3.2': 2623 + dependencies: 2624 + esbuild: 0.18.20 2625 + source-map-support: 0.5.21 2626 + 2627 + '@esbuild-kit/esm-loader@2.6.5': 2628 + dependencies: 2629 + '@esbuild-kit/core-utils': 3.3.2 2630 + get-tsconfig: 4.13.0 2631 + 2632 + '@esbuild/aix-ppc64@0.25.12': 2633 + optional: true 2634 + 2635 + '@esbuild/android-arm64@0.18.20': 2636 + optional: true 2637 + 2638 + '@esbuild/android-arm64@0.25.12': 2639 + optional: true 2640 + 2641 + '@esbuild/android-arm@0.18.20': 2642 + optional: true 2643 + 2644 + '@esbuild/android-arm@0.25.12': 2645 + optional: true 2646 + 2647 + '@esbuild/android-x64@0.18.20': 2648 + optional: true 2649 + 2650 + '@esbuild/android-x64@0.25.12': 2651 + optional: true 2652 + 2653 + '@esbuild/darwin-arm64@0.18.20': 2654 + optional: true 2655 + 2656 + '@esbuild/darwin-arm64@0.25.12': 2657 + optional: true 2658 + 2659 + '@esbuild/darwin-x64@0.18.20': 2660 + optional: true 2661 + 2662 + '@esbuild/darwin-x64@0.25.12': 2663 + optional: true 2664 + 2665 + '@esbuild/freebsd-arm64@0.18.20': 2666 + optional: true 2667 + 2668 + '@esbuild/freebsd-arm64@0.25.12': 2669 + optional: true 2670 + 2671 + '@esbuild/freebsd-x64@0.18.20': 2672 + optional: true 2673 + 2674 + '@esbuild/freebsd-x64@0.25.12': 2675 + optional: true 2676 + 2677 + '@esbuild/linux-arm64@0.18.20': 2678 + optional: true 2679 + 2680 + '@esbuild/linux-arm64@0.25.12': 2681 + optional: true 2682 + 2683 + '@esbuild/linux-arm@0.18.20': 2684 + optional: true 2685 + 2686 + '@esbuild/linux-arm@0.25.12': 2687 + optional: true 2688 + 2689 + '@esbuild/linux-ia32@0.18.20': 2690 + optional: true 2691 + 2692 + '@esbuild/linux-ia32@0.25.12': 2693 + optional: true 2694 + 2695 + '@esbuild/linux-loong64@0.18.20': 2696 + optional: true 2697 + 2698 + '@esbuild/linux-loong64@0.25.12': 2699 + optional: true 2700 + 2701 + '@esbuild/linux-mips64el@0.18.20': 2702 + optional: true 2703 + 2704 + '@esbuild/linux-mips64el@0.25.12': 2705 + optional: true 2706 + 2707 + '@esbuild/linux-ppc64@0.18.20': 2708 + optional: true 2709 + 2710 + '@esbuild/linux-ppc64@0.25.12': 2711 + optional: true 2712 + 2713 + '@esbuild/linux-riscv64@0.18.20': 2714 + optional: true 2715 + 2716 + '@esbuild/linux-riscv64@0.25.12': 2717 + optional: true 2718 + 2719 + '@esbuild/linux-s390x@0.18.20': 2720 + optional: true 2721 + 2722 + '@esbuild/linux-s390x@0.25.12': 2723 + optional: true 2724 + 2725 + '@esbuild/linux-x64@0.18.20': 2726 + optional: true 2727 + 2728 + '@esbuild/linux-x64@0.25.12': 2729 + optional: true 2730 + 2731 + '@esbuild/netbsd-arm64@0.25.12': 2732 + optional: true 2733 + 2734 + '@esbuild/netbsd-x64@0.18.20': 2735 + optional: true 2736 + 2737 + '@esbuild/netbsd-x64@0.25.12': 2738 + optional: true 2739 + 2740 + '@esbuild/openbsd-arm64@0.25.12': 2741 + optional: true 2742 + 2743 + '@esbuild/openbsd-x64@0.18.20': 2744 + optional: true 2745 + 2746 + '@esbuild/openbsd-x64@0.25.12': 2747 + optional: true 2748 + 2749 + '@esbuild/openharmony-arm64@0.25.12': 2750 + optional: true 2751 + 2752 + '@esbuild/sunos-x64@0.18.20': 2753 + optional: true 2754 + 2755 + '@esbuild/sunos-x64@0.25.12': 2756 + optional: true 2757 + 2758 + '@esbuild/win32-arm64@0.18.20': 2759 + optional: true 2760 + 2761 + '@esbuild/win32-arm64@0.25.12': 2762 + optional: true 2763 + 2764 + '@esbuild/win32-ia32@0.18.20': 2765 + optional: true 2766 + 2767 + '@esbuild/win32-ia32@0.25.12': 2768 + optional: true 2769 + 2770 + '@esbuild/win32-x64@0.18.20': 2771 + optional: true 2772 + 2773 + '@esbuild/win32-x64@0.25.12': 2774 + optional: true 2775 + 2776 + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': 2777 + dependencies: 2778 + eslint: 9.39.1(jiti@2.6.1) 2779 + eslint-visitor-keys: 3.4.3 2780 + 2781 + '@eslint-community/regexpp@4.12.2': {} 2782 + 2783 + '@eslint/compat@1.4.1(eslint@9.39.1(jiti@2.6.1))': 2784 + dependencies: 2785 + '@eslint/core': 0.17.0 2786 + optionalDependencies: 2787 + eslint: 9.39.1(jiti@2.6.1) 2788 + 2789 + '@eslint/config-array@0.21.1': 2790 + dependencies: 2791 + '@eslint/object-schema': 2.1.7 2792 + debug: 4.4.3 2793 + minimatch: 3.1.2 2794 + transitivePeerDependencies: 2795 + - supports-color 2796 + 2797 + '@eslint/config-helpers@0.4.2': 2798 + dependencies: 2799 + '@eslint/core': 0.17.0 2800 + 2801 + '@eslint/core@0.17.0': 2802 + dependencies: 2803 + '@types/json-schema': 7.0.15 2804 + 2805 + '@eslint/eslintrc@3.3.3': 2806 + dependencies: 2807 + ajv: 6.12.6 2808 + debug: 4.4.3 2809 + espree: 10.4.0 2810 + globals: 14.0.0 2811 + ignore: 5.3.2 2812 + import-fresh: 3.3.1 2813 + js-yaml: 4.1.1 2814 + minimatch: 3.1.2 2815 + strip-json-comments: 3.1.1 2816 + transitivePeerDependencies: 2817 + - supports-color 2818 + 2819 + '@eslint/js@9.39.1': {} 2820 + 2821 + '@eslint/object-schema@2.1.7': {} 2822 + 2823 + '@eslint/plugin-kit@0.4.1': 2824 + dependencies: 2825 + '@eslint/core': 0.17.0 2826 + levn: 0.4.1 2827 + 2828 + '@humanfs/core@0.19.1': {} 2829 + 2830 + '@humanfs/node@0.16.7': 2831 + dependencies: 2832 + '@humanfs/core': 0.19.1 2833 + '@humanwhocodes/retry': 0.4.3 2834 + 2835 + '@humanwhocodes/module-importer@1.0.1': {} 2836 + 2837 + '@humanwhocodes/retry@0.4.3': {} 2838 + 2839 + '@ipld/dag-cbor@7.0.3': 2840 + dependencies: 2841 + cborg: 1.10.2 2842 + multiformats: 9.9.0 2843 + 2844 + '@isaacs/balanced-match@4.0.1': {} 2845 + 2846 + '@isaacs/brace-expansion@5.0.0': 2847 + dependencies: 2848 + '@isaacs/balanced-match': 4.0.1 2849 + 2850 + '@jridgewell/gen-mapping@0.3.13': 2851 + dependencies: 2852 + '@jridgewell/sourcemap-codec': 1.5.5 2853 + '@jridgewell/trace-mapping': 0.3.31 2854 + 2855 + '@jridgewell/remapping@2.3.5': 2856 + dependencies: 2857 + '@jridgewell/gen-mapping': 0.3.13 2858 + '@jridgewell/trace-mapping': 0.3.31 2859 + 2860 + '@jridgewell/resolve-uri@3.1.2': {} 2861 + 2862 + '@jridgewell/sourcemap-codec@1.5.5': {} 2863 + 2864 + '@jridgewell/trace-mapping@0.3.31': 2865 + dependencies: 2866 + '@jridgewell/resolve-uri': 3.1.2 2867 + '@jridgewell/sourcemap-codec': 1.5.5 2868 + 2869 + '@libsql/client@0.15.15': 2870 + dependencies: 2871 + '@libsql/core': 0.15.15 2872 + '@libsql/hrana-client': 0.7.0 2873 + js-base64: 3.7.8 2874 + libsql: 0.5.22 2875 + promise-limit: 2.7.0 2876 + transitivePeerDependencies: 2877 + - bufferutil 2878 + - utf-8-validate 2879 + 2880 + '@libsql/core@0.15.15': 2881 + dependencies: 2882 + js-base64: 3.7.8 2883 + 2884 + '@libsql/darwin-arm64@0.5.22': 2885 + optional: true 2886 + 2887 + '@libsql/darwin-x64@0.5.22': 2888 + optional: true 2889 + 2890 + '@libsql/hrana-client@0.7.0': 2891 + dependencies: 2892 + '@libsql/isomorphic-fetch': 0.3.1 2893 + '@libsql/isomorphic-ws': 0.1.5 2894 + js-base64: 3.7.8 2895 + node-fetch: 3.3.2 2896 + transitivePeerDependencies: 2897 + - bufferutil 2898 + - utf-8-validate 2899 + 2900 + '@libsql/isomorphic-fetch@0.3.1': {} 2901 + 2902 + '@libsql/isomorphic-ws@0.1.5': 2903 + dependencies: 2904 + '@types/ws': 8.18.1 2905 + ws: 8.18.3 2906 + transitivePeerDependencies: 2907 + - bufferutil 2908 + - utf-8-validate 2909 + 2910 + '@libsql/linux-arm-gnueabihf@0.5.22': 2911 + optional: true 2912 + 2913 + '@libsql/linux-arm-musleabihf@0.5.22': 2914 + optional: true 2915 + 2916 + '@libsql/linux-arm64-gnu@0.5.22': 2917 + optional: true 2918 + 2919 + '@libsql/linux-arm64-musl@0.5.22': 2920 + optional: true 2921 + 2922 + '@libsql/linux-x64-gnu@0.5.22': 2923 + optional: true 2924 + 2925 + '@libsql/linux-x64-musl@0.5.22': 2926 + optional: true 2927 + 2928 + '@libsql/win32-x64-msvc@0.5.22': 2929 + optional: true 2930 + 2931 + '@neon-rs/load@0.0.4': {} 2932 + 2933 + '@noble/curves@1.9.7': 2934 + dependencies: 2935 + '@noble/hashes': 1.8.0 2936 + 2937 + '@noble/hashes@1.8.0': {} 2938 + 2939 + '@polka/url@1.0.0-next.29': {} 2940 + 2941 + '@rollup/plugin-commonjs@28.0.9(rollup@4.53.3)': 2942 + dependencies: 2943 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) 2944 + commondir: 1.0.1 2945 + estree-walker: 2.0.2 2946 + fdir: 6.5.0(picomatch@4.0.3) 2947 + is-reference: 1.2.1 2948 + magic-string: 0.30.21 2949 + picomatch: 4.0.3 2950 + optionalDependencies: 2951 + rollup: 4.53.3 2952 + 2953 + '@rollup/plugin-json@6.1.0(rollup@4.53.3)': 2954 + dependencies: 2955 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) 2956 + optionalDependencies: 2957 + rollup: 4.53.3 2958 + 2959 + '@rollup/plugin-node-resolve@16.0.3(rollup@4.53.3)': 2960 + dependencies: 2961 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) 2962 + '@types/resolve': 1.20.2 2963 + deepmerge: 4.3.1 2964 + is-module: 1.0.0 2965 + resolve: 1.22.11 2966 + optionalDependencies: 2967 + rollup: 4.53.3 2968 + 2969 + '@rollup/pluginutils@5.3.0(rollup@4.53.3)': 2970 + dependencies: 2971 + '@types/estree': 1.0.8 2972 + estree-walker: 2.0.2 2973 + picomatch: 4.0.3 2974 + optionalDependencies: 2975 + rollup: 4.53.3 2976 + 2977 + '@rollup/rollup-android-arm-eabi@4.53.3': 2978 + optional: true 2979 + 2980 + '@rollup/rollup-android-arm64@4.53.3': 2981 + optional: true 2982 + 2983 + '@rollup/rollup-darwin-arm64@4.53.3': 2984 + optional: true 2985 + 2986 + '@rollup/rollup-darwin-x64@4.53.3': 2987 + optional: true 2988 + 2989 + '@rollup/rollup-freebsd-arm64@4.53.3': 2990 + optional: true 2991 + 2992 + '@rollup/rollup-freebsd-x64@4.53.3': 2993 + optional: true 2994 + 2995 + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 2996 + optional: true 2997 + 2998 + '@rollup/rollup-linux-arm-musleabihf@4.53.3': 2999 + optional: true 3000 + 3001 + '@rollup/rollup-linux-arm64-gnu@4.53.3': 3002 + optional: true 3003 + 3004 + '@rollup/rollup-linux-arm64-musl@4.53.3': 3005 + optional: true 3006 + 3007 + '@rollup/rollup-linux-loong64-gnu@4.53.3': 3008 + optional: true 3009 + 3010 + '@rollup/rollup-linux-ppc64-gnu@4.53.3': 3011 + optional: true 3012 + 3013 + '@rollup/rollup-linux-riscv64-gnu@4.53.3': 3014 + optional: true 3015 + 3016 + '@rollup/rollup-linux-riscv64-musl@4.53.3': 3017 + optional: true 3018 + 3019 + '@rollup/rollup-linux-s390x-gnu@4.53.3': 3020 + optional: true 3021 + 3022 + '@rollup/rollup-linux-x64-gnu@4.53.3': 3023 + optional: true 3024 + 3025 + '@rollup/rollup-linux-x64-musl@4.53.3': 3026 + optional: true 3027 + 3028 + '@rollup/rollup-openharmony-arm64@4.53.3': 3029 + optional: true 3030 + 3031 + '@rollup/rollup-win32-arm64-msvc@4.53.3': 3032 + optional: true 3033 + 3034 + '@rollup/rollup-win32-ia32-msvc@4.53.3': 3035 + optional: true 3036 + 3037 + '@rollup/rollup-win32-x64-gnu@4.53.3': 3038 + optional: true 3039 + 3040 + '@rollup/rollup-win32-x64-msvc@4.53.3': 3041 + optional: true 3042 + 3043 + '@standard-schema/spec@1.0.0': {} 3044 + 3045 + '@sveltejs/acorn-typescript@1.0.8(acorn@8.15.0)': 3046 + dependencies: 3047 + acorn: 8.15.0 3048 + 3049 + '@sveltejs/adapter-auto@7.0.0(@sveltejs/kit@2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))': 3050 + dependencies: 3051 + '@sveltejs/kit': 2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 3052 + 3053 + '@sveltejs/adapter-node@5.4.0(@sveltejs/kit@2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))': 3054 + dependencies: 3055 + '@rollup/plugin-commonjs': 28.0.9(rollup@4.53.3) 3056 + '@rollup/plugin-json': 6.1.0(rollup@4.53.3) 3057 + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.53.3) 3058 + '@sveltejs/kit': 2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 3059 + rollup: 4.53.3 3060 + 3061 + '@sveltejs/kit@2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))': 3062 + dependencies: 3063 + '@standard-schema/spec': 1.0.0 3064 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) 3065 + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 3066 + '@types/cookie': 0.6.0 3067 + acorn: 8.15.0 3068 + cookie: 0.6.0 3069 + devalue: 5.5.0 3070 + esm-env: 1.2.2 3071 + kleur: 4.1.5 3072 + magic-string: 0.30.21 3073 + mrmime: 2.0.1 3074 + sade: 1.8.1 3075 + set-cookie-parser: 2.7.2 3076 + sirv: 3.0.2 3077 + svelte: 5.45.2 3078 + vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2) 3079 + 3080 + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))': 3081 + dependencies: 3082 + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 3083 + debug: 4.4.3 3084 + svelte: 5.45.2 3085 + vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2) 3086 + transitivePeerDependencies: 3087 + - supports-color 3088 + 3089 + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))': 3090 + dependencies: 3091 + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.45.2)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 3092 + debug: 4.4.3 3093 + deepmerge: 4.3.1 3094 + magic-string: 0.30.21 3095 + svelte: 5.45.2 3096 + vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2) 3097 + vitefu: 1.1.1(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 3098 + transitivePeerDependencies: 3099 + - supports-color 3100 + 3101 + '@tailwindcss/node@4.1.17': 3102 + dependencies: 3103 + '@jridgewell/remapping': 2.3.5 3104 + enhanced-resolve: 5.18.3 3105 + jiti: 2.6.1 3106 + lightningcss: 1.30.2 3107 + magic-string: 0.30.21 3108 + source-map-js: 1.2.1 3109 + tailwindcss: 4.1.17 3110 + 3111 + '@tailwindcss/oxide-android-arm64@4.1.17': 3112 + optional: true 3113 + 3114 + '@tailwindcss/oxide-darwin-arm64@4.1.17': 3115 + optional: true 3116 + 3117 + '@tailwindcss/oxide-darwin-x64@4.1.17': 3118 + optional: true 3119 + 3120 + '@tailwindcss/oxide-freebsd-x64@4.1.17': 3121 + optional: true 3122 + 3123 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': 3124 + optional: true 3125 + 3126 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': 3127 + optional: true 3128 + 3129 + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': 3130 + optional: true 3131 + 3132 + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': 3133 + optional: true 3134 + 3135 + '@tailwindcss/oxide-linux-x64-musl@4.1.17': 3136 + optional: true 3137 + 3138 + '@tailwindcss/oxide-wasm32-wasi@4.1.17': 3139 + optional: true 3140 + 3141 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': 3142 + optional: true 3143 + 3144 + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': 3145 + optional: true 3146 + 3147 + '@tailwindcss/oxide@4.1.17': 3148 + optionalDependencies: 3149 + '@tailwindcss/oxide-android-arm64': 4.1.17 3150 + '@tailwindcss/oxide-darwin-arm64': 4.1.17 3151 + '@tailwindcss/oxide-darwin-x64': 4.1.17 3152 + '@tailwindcss/oxide-freebsd-x64': 4.1.17 3153 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 3154 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 3155 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 3156 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 3157 + '@tailwindcss/oxide-linux-x64-musl': 4.1.17 3158 + '@tailwindcss/oxide-wasm32-wasi': 4.1.17 3159 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 3160 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 3161 + 3162 + '@tailwindcss/vite@4.1.17(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))': 3163 + dependencies: 3164 + '@tailwindcss/node': 4.1.17 3165 + '@tailwindcss/oxide': 4.1.17 3166 + tailwindcss: 4.1.17 3167 + vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2) 3168 + 3169 + '@ts-morph/common@0.28.1': 3170 + dependencies: 3171 + minimatch: 10.1.1 3172 + path-browserify: 1.0.1 3173 + tinyglobby: 0.2.15 3174 + 3175 + '@types/chai@5.2.3': 3176 + dependencies: 3177 + '@types/deep-eql': 4.0.2 3178 + assertion-error: 2.0.1 3179 + 3180 + '@types/cookie@0.6.0': {} 3181 + 3182 + '@types/deep-eql@4.0.2': {} 3183 + 3184 + '@types/estree@1.0.8': {} 3185 + 3186 + '@types/json-schema@7.0.15': {} 3187 + 3188 + '@types/node@22.19.1': 3189 + dependencies: 3190 + undici-types: 6.21.0 3191 + 3192 + '@types/resolve@1.20.2': {} 3193 + 3194 + '@types/ws@8.18.1': 3195 + dependencies: 3196 + '@types/node': 22.19.1 3197 + 3198 + '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': 3199 + dependencies: 3200 + '@eslint-community/regexpp': 4.12.2 3201 + '@typescript-eslint/parser': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) 3202 + '@typescript-eslint/scope-manager': 8.48.0 3203 + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) 3204 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) 3205 + '@typescript-eslint/visitor-keys': 8.48.0 3206 + eslint: 9.39.1(jiti@2.6.1) 3207 + graphemer: 1.4.0 3208 + ignore: 7.0.5 3209 + natural-compare: 1.4.0 3210 + ts-api-utils: 2.1.0(typescript@5.9.3) 3211 + typescript: 5.9.3 3212 + transitivePeerDependencies: 3213 + - supports-color 3214 + 3215 + '@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': 3216 + dependencies: 3217 + '@typescript-eslint/scope-manager': 8.48.0 3218 + '@typescript-eslint/types': 8.48.0 3219 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) 3220 + '@typescript-eslint/visitor-keys': 8.48.0 3221 + debug: 4.4.3 3222 + eslint: 9.39.1(jiti@2.6.1) 3223 + typescript: 5.9.3 3224 + transitivePeerDependencies: 3225 + - supports-color 3226 + 3227 + '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)': 3228 + dependencies: 3229 + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) 3230 + '@typescript-eslint/types': 8.48.0 3231 + debug: 4.4.3 3232 + typescript: 5.9.3 3233 + transitivePeerDependencies: 3234 + - supports-color 3235 + 3236 + '@typescript-eslint/scope-manager@8.48.0': 3237 + dependencies: 3238 + '@typescript-eslint/types': 8.48.0 3239 + '@typescript-eslint/visitor-keys': 8.48.0 3240 + 3241 + '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)': 3242 + dependencies: 3243 + typescript: 5.9.3 3244 + 3245 + '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': 3246 + dependencies: 3247 + '@typescript-eslint/types': 8.48.0 3248 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) 3249 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) 3250 + debug: 4.4.3 3251 + eslint: 9.39.1(jiti@2.6.1) 3252 + ts-api-utils: 2.1.0(typescript@5.9.3) 3253 + typescript: 5.9.3 3254 + transitivePeerDependencies: 3255 + - supports-color 3256 + 3257 + '@typescript-eslint/types@8.48.0': {} 3258 + 3259 + '@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)': 3260 + dependencies: 3261 + '@typescript-eslint/project-service': 8.48.0(typescript@5.9.3) 3262 + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) 3263 + '@typescript-eslint/types': 8.48.0 3264 + '@typescript-eslint/visitor-keys': 8.48.0 3265 + debug: 4.4.3 3266 + minimatch: 9.0.5 3267 + semver: 7.7.3 3268 + tinyglobby: 0.2.15 3269 + ts-api-utils: 2.1.0(typescript@5.9.3) 3270 + typescript: 5.9.3 3271 + transitivePeerDependencies: 3272 + - supports-color 3273 + 3274 + '@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': 3275 + dependencies: 3276 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) 3277 + '@typescript-eslint/scope-manager': 8.48.0 3278 + '@typescript-eslint/types': 8.48.0 3279 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) 3280 + eslint: 9.39.1(jiti@2.6.1) 3281 + typescript: 5.9.3 3282 + transitivePeerDependencies: 3283 + - supports-color 3284 + 3285 + '@typescript-eslint/visitor-keys@8.48.0': 3286 + dependencies: 3287 + '@typescript-eslint/types': 8.48.0 3288 + eslint-visitor-keys: 4.2.1 3289 + 3290 + '@vitest/browser-playwright@4.0.14(playwright@1.57.0)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.14)': 3291 + dependencies: 3292 + '@vitest/browser': 4.0.14(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.14) 3293 + '@vitest/mocker': 4.0.14(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 3294 + playwright: 1.57.0 3295 + tinyrainbow: 3.0.3 3296 + vitest: 4.0.14(@types/node@22.19.1)(@vitest/browser-playwright@4.0.14)(jiti@2.6.1)(lightningcss@1.30.2) 3297 + transitivePeerDependencies: 3298 + - bufferutil 3299 + - msw 3300 + - utf-8-validate 3301 + - vite 3302 + 3303 + '@vitest/browser@4.0.14(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.14)': 3304 + dependencies: 3305 + '@vitest/mocker': 4.0.14(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 3306 + '@vitest/utils': 4.0.14 3307 + magic-string: 0.30.21 3308 + pixelmatch: 7.1.0 3309 + pngjs: 7.0.0 3310 + sirv: 3.0.2 3311 + tinyrainbow: 3.0.3 3312 + vitest: 4.0.14(@types/node@22.19.1)(@vitest/browser-playwright@4.0.14)(jiti@2.6.1)(lightningcss@1.30.2) 3313 + ws: 8.18.3 3314 + transitivePeerDependencies: 3315 + - bufferutil 3316 + - msw 3317 + - utf-8-validate 3318 + - vite 3319 + 3320 + '@vitest/expect@4.0.14': 3321 + dependencies: 3322 + '@standard-schema/spec': 1.0.0 3323 + '@types/chai': 5.2.3 3324 + '@vitest/spy': 4.0.14 3325 + '@vitest/utils': 4.0.14 3326 + chai: 6.2.1 3327 + tinyrainbow: 3.0.3 3328 + 3329 + '@vitest/mocker@4.0.14(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))': 3330 + dependencies: 3331 + '@vitest/spy': 4.0.14 3332 + estree-walker: 3.0.3 3333 + magic-string: 0.30.21 3334 + optionalDependencies: 3335 + vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2) 3336 + 3337 + '@vitest/pretty-format@4.0.14': 3338 + dependencies: 3339 + tinyrainbow: 3.0.3 3340 + 3341 + '@vitest/runner@4.0.14': 3342 + dependencies: 3343 + '@vitest/utils': 4.0.14 3344 + pathe: 2.0.3 3345 + 3346 + '@vitest/snapshot@4.0.14': 3347 + dependencies: 3348 + '@vitest/pretty-format': 4.0.14 3349 + magic-string: 0.30.21 3350 + pathe: 2.0.3 3351 + 3352 + '@vitest/spy@4.0.14': {} 3353 + 3354 + '@vitest/utils@4.0.14': 3355 + dependencies: 3356 + '@vitest/pretty-format': 4.0.14 3357 + tinyrainbow: 3.0.3 3358 + 3359 + abort-controller@3.0.0: 3360 + dependencies: 3361 + event-target-shim: 5.0.1 3362 + 3363 + acorn-jsx@5.3.2(acorn@8.15.0): 3364 + dependencies: 3365 + acorn: 8.15.0 3366 + 3367 + acorn@8.15.0: {} 3368 + 3369 + ajv@6.12.6: 3370 + dependencies: 3371 + fast-deep-equal: 3.1.3 3372 + fast-json-stable-stringify: 2.1.0 3373 + json-schema-traverse: 0.4.1 3374 + uri-js: 4.4.1 3375 + 3376 + ansi-regex@5.0.1: {} 3377 + 3378 + ansi-styles@4.3.0: 3379 + dependencies: 3380 + color-convert: 2.0.1 3381 + 3382 + argparse@2.0.1: {} 3383 + 3384 + aria-query@5.3.2: {} 3385 + 3386 + assertion-error@2.0.1: {} 3387 + 3388 + atomic-sleep@1.0.0: {} 3389 + 3390 + axobject-query@4.1.0: {} 3391 + 3392 + balanced-match@1.0.2: {} 3393 + 3394 + base64-js@1.5.1: {} 3395 + 3396 + better-sqlite3@12.5.0: 3397 + dependencies: 3398 + bindings: 1.5.0 3399 + prebuild-install: 7.1.3 3400 + 3401 + bindings@1.5.0: 3402 + dependencies: 3403 + file-uri-to-path: 1.0.0 3404 + 3405 + bl@4.1.0: 3406 + dependencies: 3407 + buffer: 5.7.1 3408 + inherits: 2.0.4 3409 + readable-stream: 3.6.2 3410 + 3411 + brace-expansion@1.1.12: 3412 + dependencies: 3413 + balanced-match: 1.0.2 3414 + concat-map: 0.0.1 3415 + 3416 + brace-expansion@2.0.2: 3417 + dependencies: 3418 + balanced-match: 1.0.2 3419 + 3420 + buffer-from@1.1.2: {} 3421 + 3422 + buffer@5.7.1: 3423 + dependencies: 3424 + base64-js: 1.5.1 3425 + ieee754: 1.2.1 3426 + 3427 + buffer@6.0.3: 3428 + dependencies: 3429 + base64-js: 1.5.1 3430 + ieee754: 1.2.1 3431 + 3432 + callsites@3.1.0: {} 3433 + 3434 + cborg@1.10.2: {} 3435 + 3436 + chai@6.2.1: {} 3437 + 3438 + chalk@4.1.2: 3439 + dependencies: 3440 + ansi-styles: 4.3.0 3441 + supports-color: 7.2.0 3442 + 3443 + chokidar@4.0.3: 3444 + dependencies: 3445 + readdirp: 4.1.2 3446 + 3447 + chownr@1.1.4: {} 3448 + 3449 + cliui@8.0.1: 3450 + dependencies: 3451 + string-width: 4.2.3 3452 + strip-ansi: 6.0.1 3453 + wrap-ansi: 7.0.0 3454 + 3455 + clsx@2.1.1: {} 3456 + 3457 + code-block-writer@13.0.3: {} 3458 + 3459 + color-convert@2.0.1: 3460 + dependencies: 3461 + color-name: 1.1.4 3462 + 3463 + color-name@1.1.4: {} 3464 + 3465 + commondir@1.0.1: {} 3466 + 3467 + concat-map@0.0.1: {} 3468 + 3469 + cookie@0.6.0: {} 3470 + 3471 + cookie@0.7.2: {} 3472 + 3473 + core-js@3.47.0: {} 3474 + 3475 + cross-spawn@7.0.6: 3476 + dependencies: 3477 + path-key: 3.1.1 3478 + shebang-command: 2.0.0 3479 + which: 2.0.2 3480 + 3481 + cssesc@3.0.0: {} 3482 + 3483 + data-uri-to-buffer@4.0.1: {} 3484 + 3485 + debug@4.4.3: 3486 + dependencies: 3487 + ms: 2.1.3 3488 + 3489 + decompress-response@6.0.0: 3490 + dependencies: 3491 + mimic-response: 3.1.0 3492 + 3493 + deep-extend@0.6.0: {} 3494 + 3495 + deep-is@0.1.4: {} 3496 + 3497 + deepmerge@4.3.1: {} 3498 + 3499 + detect-libc@2.0.2: {} 3500 + 3501 + detect-libc@2.1.2: {} 3502 + 3503 + devalue@5.5.0: {} 3504 + 3505 + drizzle-kit@0.31.7: 3506 + dependencies: 3507 + '@drizzle-team/brocli': 0.10.2 3508 + '@esbuild-kit/esm-loader': 2.6.5 3509 + esbuild: 0.25.12 3510 + esbuild-register: 3.6.0(esbuild@0.25.12) 3511 + transitivePeerDependencies: 3512 + - supports-color 3513 + 3514 + drizzle-orm@0.44.7(@cloudflare/workers-types@4.20251205.0)(@libsql/client@0.15.15)(better-sqlite3@12.5.0): 3515 + optionalDependencies: 3516 + '@cloudflare/workers-types': 4.20251205.0 3517 + '@libsql/client': 0.15.15 3518 + better-sqlite3: 12.5.0 3519 + 3520 + emoji-regex@8.0.0: {} 3521 + 3522 + end-of-stream@1.4.5: 3523 + dependencies: 3524 + once: 1.4.0 3525 + 3526 + enhanced-resolve@5.18.3: 3527 + dependencies: 3528 + graceful-fs: 4.2.11 3529 + tapable: 2.3.0 3530 + 3531 + es-module-lexer@1.7.0: {} 3532 + 3533 + esbuild-register@3.6.0(esbuild@0.25.12): 3534 + dependencies: 3535 + debug: 4.4.3 3536 + esbuild: 0.25.12 3537 + transitivePeerDependencies: 3538 + - supports-color 3539 + 3540 + esbuild@0.18.20: 3541 + optionalDependencies: 3542 + '@esbuild/android-arm': 0.18.20 3543 + '@esbuild/android-arm64': 0.18.20 3544 + '@esbuild/android-x64': 0.18.20 3545 + '@esbuild/darwin-arm64': 0.18.20 3546 + '@esbuild/darwin-x64': 0.18.20 3547 + '@esbuild/freebsd-arm64': 0.18.20 3548 + '@esbuild/freebsd-x64': 0.18.20 3549 + '@esbuild/linux-arm': 0.18.20 3550 + '@esbuild/linux-arm64': 0.18.20 3551 + '@esbuild/linux-ia32': 0.18.20 3552 + '@esbuild/linux-loong64': 0.18.20 3553 + '@esbuild/linux-mips64el': 0.18.20 3554 + '@esbuild/linux-ppc64': 0.18.20 3555 + '@esbuild/linux-riscv64': 0.18.20 3556 + '@esbuild/linux-s390x': 0.18.20 3557 + '@esbuild/linux-x64': 0.18.20 3558 + '@esbuild/netbsd-x64': 0.18.20 3559 + '@esbuild/openbsd-x64': 0.18.20 3560 + '@esbuild/sunos-x64': 0.18.20 3561 + '@esbuild/win32-arm64': 0.18.20 3562 + '@esbuild/win32-ia32': 0.18.20 3563 + '@esbuild/win32-x64': 0.18.20 3564 + 3565 + esbuild@0.25.12: 3566 + optionalDependencies: 3567 + '@esbuild/aix-ppc64': 0.25.12 3568 + '@esbuild/android-arm': 0.25.12 3569 + '@esbuild/android-arm64': 0.25.12 3570 + '@esbuild/android-x64': 0.25.12 3571 + '@esbuild/darwin-arm64': 0.25.12 3572 + '@esbuild/darwin-x64': 0.25.12 3573 + '@esbuild/freebsd-arm64': 0.25.12 3574 + '@esbuild/freebsd-x64': 0.25.12 3575 + '@esbuild/linux-arm': 0.25.12 3576 + '@esbuild/linux-arm64': 0.25.12 3577 + '@esbuild/linux-ia32': 0.25.12 3578 + '@esbuild/linux-loong64': 0.25.12 3579 + '@esbuild/linux-mips64el': 0.25.12 3580 + '@esbuild/linux-ppc64': 0.25.12 3581 + '@esbuild/linux-riscv64': 0.25.12 3582 + '@esbuild/linux-s390x': 0.25.12 3583 + '@esbuild/linux-x64': 0.25.12 3584 + '@esbuild/netbsd-arm64': 0.25.12 3585 + '@esbuild/netbsd-x64': 0.25.12 3586 + '@esbuild/openbsd-arm64': 0.25.12 3587 + '@esbuild/openbsd-x64': 0.25.12 3588 + '@esbuild/openharmony-arm64': 0.25.12 3589 + '@esbuild/sunos-x64': 0.25.12 3590 + '@esbuild/win32-arm64': 0.25.12 3591 + '@esbuild/win32-ia32': 0.25.12 3592 + '@esbuild/win32-x64': 0.25.12 3593 + 3594 + escalade@3.2.0: {} 3595 + 3596 + escape-string-regexp@4.0.0: {} 3597 + 3598 + eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)): 3599 + dependencies: 3600 + eslint: 9.39.1(jiti@2.6.1) 3601 + 3602 + eslint-plugin-svelte@3.13.0(eslint@9.39.1(jiti@2.6.1))(svelte@5.45.2): 3603 + dependencies: 3604 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) 3605 + '@jridgewell/sourcemap-codec': 1.5.5 3606 + eslint: 9.39.1(jiti@2.6.1) 3607 + esutils: 2.0.3 3608 + globals: 16.5.0 3609 + known-css-properties: 0.37.0 3610 + postcss: 8.5.6 3611 + postcss-load-config: 3.1.4(postcss@8.5.6) 3612 + postcss-safe-parser: 7.0.1(postcss@8.5.6) 3613 + semver: 7.7.3 3614 + svelte-eslint-parser: 1.4.0(svelte@5.45.2) 3615 + optionalDependencies: 3616 + svelte: 5.45.2 3617 + transitivePeerDependencies: 3618 + - ts-node 3619 + 3620 + eslint-scope@8.4.0: 3621 + dependencies: 3622 + esrecurse: 4.3.0 3623 + estraverse: 5.3.0 3624 + 3625 + eslint-visitor-keys@3.4.3: {} 3626 + 3627 + eslint-visitor-keys@4.2.1: {} 3628 + 3629 + eslint@9.39.1(jiti@2.6.1): 3630 + dependencies: 3631 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) 3632 + '@eslint-community/regexpp': 4.12.2 3633 + '@eslint/config-array': 0.21.1 3634 + '@eslint/config-helpers': 0.4.2 3635 + '@eslint/core': 0.17.0 3636 + '@eslint/eslintrc': 3.3.3 3637 + '@eslint/js': 9.39.1 3638 + '@eslint/plugin-kit': 0.4.1 3639 + '@humanfs/node': 0.16.7 3640 + '@humanwhocodes/module-importer': 1.0.1 3641 + '@humanwhocodes/retry': 0.4.3 3642 + '@types/estree': 1.0.8 3643 + ajv: 6.12.6 3644 + chalk: 4.1.2 3645 + cross-spawn: 7.0.6 3646 + debug: 4.4.3 3647 + escape-string-regexp: 4.0.0 3648 + eslint-scope: 8.4.0 3649 + eslint-visitor-keys: 4.2.1 3650 + espree: 10.4.0 3651 + esquery: 1.6.0 3652 + esutils: 2.0.3 3653 + fast-deep-equal: 3.1.3 3654 + file-entry-cache: 8.0.0 3655 + find-up: 5.0.0 3656 + glob-parent: 6.0.2 3657 + ignore: 5.3.2 3658 + imurmurhash: 0.1.4 3659 + is-glob: 4.0.3 3660 + json-stable-stringify-without-jsonify: 1.0.1 3661 + lodash.merge: 4.6.2 3662 + minimatch: 3.1.2 3663 + natural-compare: 1.4.0 3664 + optionator: 0.9.4 3665 + optionalDependencies: 3666 + jiti: 2.6.1 3667 + transitivePeerDependencies: 3668 + - supports-color 3669 + 3670 + esm-env@1.2.2: {} 3671 + 3672 + espree@10.4.0: 3673 + dependencies: 3674 + acorn: 8.15.0 3675 + acorn-jsx: 5.3.2(acorn@8.15.0) 3676 + eslint-visitor-keys: 4.2.1 3677 + 3678 + esquery@1.6.0: 3679 + dependencies: 3680 + estraverse: 5.3.0 3681 + 3682 + esrap@2.2.0: 3683 + dependencies: 3684 + '@jridgewell/sourcemap-codec': 1.5.5 3685 + 3686 + esrecurse@4.3.0: 3687 + dependencies: 3688 + estraverse: 5.3.0 3689 + 3690 + estraverse@5.3.0: {} 3691 + 3692 + estree-walker@2.0.2: {} 3693 + 3694 + estree-walker@3.0.3: 3695 + dependencies: 3696 + '@types/estree': 1.0.8 3697 + 3698 + esutils@2.0.3: {} 3699 + 3700 + event-target-shim@5.0.1: {} 3701 + 3702 + events@3.3.0: {} 3703 + 3704 + expand-template@2.0.3: {} 3705 + 3706 + expect-type@1.2.2: {} 3707 + 3708 + fast-deep-equal@3.1.3: {} 3709 + 3710 + fast-json-stable-stringify@2.1.0: {} 3711 + 3712 + fast-levenshtein@2.0.6: {} 3713 + 3714 + fast-redact@3.5.0: {} 3715 + 3716 + fdir@6.5.0(picomatch@4.0.3): 3717 + optionalDependencies: 3718 + picomatch: 4.0.3 3719 + 3720 + fetch-blob@3.2.0: 3721 + dependencies: 3722 + node-domexception: 1.0.0 3723 + web-streams-polyfill: 3.3.3 3724 + 3725 + file-entry-cache@8.0.0: 3726 + dependencies: 3727 + flat-cache: 4.0.1 3728 + 3729 + file-uri-to-path@1.0.0: {} 3730 + 3731 + find-up@5.0.0: 3732 + dependencies: 3733 + locate-path: 6.0.0 3734 + path-exists: 4.0.0 3735 + 3736 + flat-cache@4.0.1: 3737 + dependencies: 3738 + flatted: 3.3.3 3739 + keyv: 4.5.4 3740 + 3741 + flatted@3.3.3: {} 3742 + 3743 + formdata-polyfill@4.0.10: 3744 + dependencies: 3745 + fetch-blob: 3.2.0 3746 + 3747 + fs-constants@1.0.0: {} 3748 + 3749 + fsevents@2.3.2: 3750 + optional: true 3751 + 3752 + fsevents@2.3.3: 3753 + optional: true 3754 + 3755 + function-bind@1.1.2: {} 3756 + 3757 + get-caller-file@2.0.5: {} 3758 + 3759 + get-tsconfig@4.13.0: 3760 + dependencies: 3761 + resolve-pkg-maps: 1.0.0 3762 + 3763 + github-from-package@0.0.0: {} 3764 + 3765 + glob-parent@6.0.2: 3766 + dependencies: 3767 + is-glob: 4.0.3 3768 + 3769 + globals@14.0.0: {} 3770 + 3771 + globals@16.5.0: {} 3772 + 3773 + graceful-fs@4.2.11: {} 3774 + 3775 + graphemer@1.4.0: {} 3776 + 3777 + has-flag@4.0.0: {} 3778 + 3779 + hasown@2.0.2: 3780 + dependencies: 3781 + function-bind: 1.1.2 3782 + 3783 + ieee754@1.2.1: {} 3784 + 3785 + ignore@5.3.2: {} 3786 + 3787 + ignore@7.0.5: {} 3788 + 3789 + import-fresh@3.3.1: 3790 + dependencies: 3791 + parent-module: 1.0.1 3792 + resolve-from: 4.0.0 3793 + 3794 + imurmurhash@0.1.4: {} 3795 + 3796 + inherits@2.0.4: {} 3797 + 3798 + ini@1.3.8: {} 3799 + 3800 + ipaddr.js@2.3.0: {} 3801 + 3802 + iron-session@8.0.4: 3803 + dependencies: 3804 + cookie: 0.7.2 3805 + iron-webcrypto: 1.2.1 3806 + uncrypto: 0.1.3 3807 + 3808 + iron-webcrypto@1.2.1: {} 3809 + 3810 + is-core-module@2.16.1: 3811 + dependencies: 3812 + hasown: 2.0.2 3813 + 3814 + is-extglob@2.1.1: {} 3815 + 3816 + is-fullwidth-code-point@3.0.0: {} 3817 + 3818 + is-glob@4.0.3: 3819 + dependencies: 3820 + is-extglob: 2.1.1 3821 + 3822 + is-module@1.0.0: {} 3823 + 3824 + is-reference@1.2.1: 3825 + dependencies: 3826 + '@types/estree': 1.0.8 3827 + 3828 + is-reference@3.0.3: 3829 + dependencies: 3830 + '@types/estree': 1.0.8 3831 + 3832 + isexe@2.0.0: {} 3833 + 3834 + iso-datestring-validator@2.2.2: {} 3835 + 3836 + jiti@2.6.1: {} 3837 + 3838 + jose@5.10.0: {} 3839 + 3840 + js-base64@3.7.8: {} 3841 + 3842 + js-yaml@4.1.1: 3843 + dependencies: 3844 + argparse: 2.0.1 3845 + 3846 + json-buffer@3.0.1: {} 3847 + 3848 + json-schema-traverse@0.4.1: {} 3849 + 3850 + json-stable-stringify-without-jsonify@1.0.1: {} 3851 + 3852 + keyv@4.5.4: 3853 + dependencies: 3854 + json-buffer: 3.0.1 3855 + 3856 + kleur@4.1.5: {} 3857 + 3858 + known-css-properties@0.37.0: {} 3859 + 3860 + levn@0.4.1: 3861 + dependencies: 3862 + prelude-ls: 1.2.1 3863 + type-check: 0.4.0 3864 + 3865 + libsql@0.5.22: 3866 + dependencies: 3867 + '@neon-rs/load': 0.0.4 3868 + detect-libc: 2.0.2 3869 + optionalDependencies: 3870 + '@libsql/darwin-arm64': 0.5.22 3871 + '@libsql/darwin-x64': 0.5.22 3872 + '@libsql/linux-arm-gnueabihf': 0.5.22 3873 + '@libsql/linux-arm-musleabihf': 0.5.22 3874 + '@libsql/linux-arm64-gnu': 0.5.22 3875 + '@libsql/linux-arm64-musl': 0.5.22 3876 + '@libsql/linux-x64-gnu': 0.5.22 3877 + '@libsql/linux-x64-musl': 0.5.22 3878 + '@libsql/win32-x64-msvc': 0.5.22 3879 + 3880 + lightningcss-android-arm64@1.30.2: 3881 + optional: true 3882 + 3883 + lightningcss-darwin-arm64@1.30.2: 3884 + optional: true 3885 + 3886 + lightningcss-darwin-x64@1.30.2: 3887 + optional: true 3888 + 3889 + lightningcss-freebsd-x64@1.30.2: 3890 + optional: true 3891 + 3892 + lightningcss-linux-arm-gnueabihf@1.30.2: 3893 + optional: true 3894 + 3895 + lightningcss-linux-arm64-gnu@1.30.2: 3896 + optional: true 3897 + 3898 + lightningcss-linux-arm64-musl@1.30.2: 3899 + optional: true 3900 + 3901 + lightningcss-linux-x64-gnu@1.30.2: 3902 + optional: true 3903 + 3904 + lightningcss-linux-x64-musl@1.30.2: 3905 + optional: true 3906 + 3907 + lightningcss-win32-arm64-msvc@1.30.2: 3908 + optional: true 3909 + 3910 + lightningcss-win32-x64-msvc@1.30.2: 3911 + optional: true 3912 + 3913 + lightningcss@1.30.2: 3914 + dependencies: 3915 + detect-libc: 2.1.2 3916 + optionalDependencies: 3917 + lightningcss-android-arm64: 1.30.2 3918 + lightningcss-darwin-arm64: 1.30.2 3919 + lightningcss-darwin-x64: 1.30.2 3920 + lightningcss-freebsd-x64: 1.30.2 3921 + lightningcss-linux-arm-gnueabihf: 1.30.2 3922 + lightningcss-linux-arm64-gnu: 1.30.2 3923 + lightningcss-linux-arm64-musl: 1.30.2 3924 + lightningcss-linux-x64-gnu: 1.30.2 3925 + lightningcss-linux-x64-musl: 1.30.2 3926 + lightningcss-win32-arm64-msvc: 1.30.2 3927 + lightningcss-win32-x64-msvc: 1.30.2 3928 + 3929 + lilconfig@2.1.0: {} 3930 + 3931 + locate-character@3.0.0: {} 3932 + 3933 + locate-path@6.0.0: 3934 + dependencies: 3935 + p-locate: 5.0.0 3936 + 3937 + lodash.merge@4.6.2: {} 3938 + 3939 + lru-cache@10.4.3: {} 3940 + 3941 + magic-string@0.30.21: 3942 + dependencies: 3943 + '@jridgewell/sourcemap-codec': 1.5.5 3944 + 3945 + mimic-response@3.1.0: {} 3946 + 3947 + minimatch@10.1.1: 3948 + dependencies: 3949 + '@isaacs/brace-expansion': 5.0.0 3950 + 3951 + minimatch@3.1.2: 3952 + dependencies: 3953 + brace-expansion: 1.1.12 3954 + 3955 + minimatch@9.0.5: 3956 + dependencies: 3957 + brace-expansion: 2.0.2 3958 + 3959 + minimist@1.2.8: {} 3960 + 3961 + mkdirp-classic@0.5.3: {} 3962 + 3963 + mri@1.2.0: {} 3964 + 3965 + mrmime@2.0.1: {} 3966 + 3967 + ms@2.1.3: {} 3968 + 3969 + multiformats@9.9.0: {} 3970 + 3971 + nanoid@3.3.11: {} 3972 + 3973 + napi-build-utils@2.0.0: {} 3974 + 3975 + natural-compare@1.4.0: {} 3976 + 3977 + node-abi@3.85.0: 3978 + dependencies: 3979 + semver: 7.7.3 3980 + 3981 + node-domexception@1.0.0: {} 3982 + 3983 + node-fetch@3.3.2: 3984 + dependencies: 3985 + data-uri-to-buffer: 4.0.1 3986 + fetch-blob: 3.2.0 3987 + formdata-polyfill: 4.0.10 3988 + 3989 + obug@2.1.1: {} 3990 + 3991 + on-exit-leak-free@2.1.2: {} 3992 + 3993 + once@1.4.0: 3994 + dependencies: 3995 + wrappy: 1.0.2 3996 + 3997 + optionator@0.9.4: 3998 + dependencies: 3999 + deep-is: 0.1.4 4000 + fast-levenshtein: 2.0.6 4001 + levn: 0.4.1 4002 + prelude-ls: 1.2.1 4003 + type-check: 0.4.0 4004 + word-wrap: 1.2.5 4005 + 4006 + p-limit@3.1.0: 4007 + dependencies: 4008 + yocto-queue: 0.1.0 4009 + 4010 + p-locate@5.0.0: 4011 + dependencies: 4012 + p-limit: 3.1.0 4013 + 4014 + parent-module@1.0.1: 4015 + dependencies: 4016 + callsites: 3.1.0 4017 + 4018 + path-browserify@1.0.1: {} 4019 + 4020 + path-exists@4.0.0: {} 4021 + 4022 + path-key@3.1.1: {} 4023 + 4024 + path-parse@1.0.7: {} 4025 + 4026 + pathe@2.0.3: {} 4027 + 4028 + picocolors@1.1.1: {} 4029 + 4030 + picomatch@4.0.3: {} 4031 + 4032 + pino-abstract-transport@1.2.0: 4033 + dependencies: 4034 + readable-stream: 4.7.0 4035 + split2: 4.2.0 4036 + 4037 + pino-std-serializers@6.2.2: {} 4038 + 4039 + pino@8.21.0: 4040 + dependencies: 4041 + atomic-sleep: 1.0.0 4042 + fast-redact: 3.5.0 4043 + on-exit-leak-free: 2.1.2 4044 + pino-abstract-transport: 1.2.0 4045 + pino-std-serializers: 6.2.2 4046 + process-warning: 3.0.0 4047 + quick-format-unescaped: 4.0.4 4048 + real-require: 0.2.0 4049 + safe-stable-stringify: 2.5.0 4050 + sonic-boom: 3.8.1 4051 + thread-stream: 2.7.0 4052 + 4053 + pixelmatch@7.1.0: 4054 + dependencies: 4055 + pngjs: 7.0.0 4056 + 4057 + playwright-core@1.57.0: {} 4058 + 4059 + playwright@1.57.0: 4060 + dependencies: 4061 + playwright-core: 1.57.0 4062 + optionalDependencies: 4063 + fsevents: 2.3.2 4064 + 4065 + pngjs@7.0.0: {} 4066 + 4067 + postcss-load-config@3.1.4(postcss@8.5.6): 4068 + dependencies: 4069 + lilconfig: 2.1.0 4070 + yaml: 1.10.2 4071 + optionalDependencies: 4072 + postcss: 8.5.6 4073 + 4074 + postcss-safe-parser@7.0.1(postcss@8.5.6): 4075 + dependencies: 4076 + postcss: 8.5.6 4077 + 4078 + postcss-scss@4.0.9(postcss@8.5.6): 4079 + dependencies: 4080 + postcss: 8.5.6 4081 + 4082 + postcss-selector-parser@7.1.1: 4083 + dependencies: 4084 + cssesc: 3.0.0 4085 + util-deprecate: 1.0.2 4086 + 4087 + postcss@8.5.6: 4088 + dependencies: 4089 + nanoid: 3.3.11 4090 + picocolors: 1.1.1 4091 + source-map-js: 1.2.1 4092 + 4093 + prebuild-install@7.1.3: 4094 + dependencies: 4095 + detect-libc: 2.1.2 4096 + expand-template: 2.0.3 4097 + github-from-package: 0.0.0 4098 + minimist: 1.2.8 4099 + mkdirp-classic: 0.5.3 4100 + napi-build-utils: 2.0.0 4101 + node-abi: 3.85.0 4102 + pump: 3.0.3 4103 + rc: 1.2.8 4104 + simple-get: 4.0.1 4105 + tar-fs: 2.1.4 4106 + tunnel-agent: 0.6.0 4107 + 4108 + prelude-ls@1.2.1: {} 4109 + 4110 + prettier-plugin-svelte@3.4.0(prettier@3.7.3)(svelte@5.45.2): 4111 + dependencies: 4112 + prettier: 3.7.3 4113 + svelte: 5.45.2 4114 + 4115 + prettier@3.7.3: {} 4116 + 4117 + process-warning@3.0.0: {} 4118 + 4119 + process@0.11.10: {} 4120 + 4121 + promise-limit@2.7.0: {} 4122 + 4123 + pump@3.0.3: 4124 + dependencies: 4125 + end-of-stream: 1.4.5 4126 + once: 1.4.0 4127 + 4128 + punycode@2.3.1: {} 4129 + 4130 + quick-format-unescaped@4.0.4: {} 4131 + 4132 + rc@1.2.8: 4133 + dependencies: 4134 + deep-extend: 0.6.0 4135 + ini: 1.3.8 4136 + minimist: 1.2.8 4137 + strip-json-comments: 2.0.1 4138 + 4139 + readable-stream@3.6.2: 4140 + dependencies: 4141 + inherits: 2.0.4 4142 + string_decoder: 1.3.0 4143 + util-deprecate: 1.0.2 4144 + 4145 + readable-stream@4.7.0: 4146 + dependencies: 4147 + abort-controller: 3.0.0 4148 + buffer: 6.0.3 4149 + events: 3.3.0 4150 + process: 0.11.10 4151 + string_decoder: 1.3.0 4152 + 4153 + readdirp@4.1.2: {} 4154 + 4155 + real-require@0.2.0: {} 4156 + 4157 + require-directory@2.1.1: {} 4158 + 4159 + resolve-from@4.0.0: {} 4160 + 4161 + resolve-pkg-maps@1.0.0: {} 4162 + 4163 + resolve@1.22.11: 4164 + dependencies: 4165 + is-core-module: 2.16.1 4166 + path-parse: 1.0.7 4167 + supports-preserve-symlinks-flag: 1.0.0 4168 + 4169 + rollup@4.53.3: 4170 + dependencies: 4171 + '@types/estree': 1.0.8 4172 + optionalDependencies: 4173 + '@rollup/rollup-android-arm-eabi': 4.53.3 4174 + '@rollup/rollup-android-arm64': 4.53.3 4175 + '@rollup/rollup-darwin-arm64': 4.53.3 4176 + '@rollup/rollup-darwin-x64': 4.53.3 4177 + '@rollup/rollup-freebsd-arm64': 4.53.3 4178 + '@rollup/rollup-freebsd-x64': 4.53.3 4179 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 4180 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 4181 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 4182 + '@rollup/rollup-linux-arm64-musl': 4.53.3 4183 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 4184 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 4185 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 4186 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 4187 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 4188 + '@rollup/rollup-linux-x64-gnu': 4.53.3 4189 + '@rollup/rollup-linux-x64-musl': 4.53.3 4190 + '@rollup/rollup-openharmony-arm64': 4.53.3 4191 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 4192 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 4193 + '@rollup/rollup-win32-x64-gnu': 4.53.3 4194 + '@rollup/rollup-win32-x64-msvc': 4.53.3 4195 + fsevents: 2.3.3 4196 + 4197 + sade@1.8.1: 4198 + dependencies: 4199 + mri: 1.2.0 4200 + 4201 + safe-buffer@5.2.1: {} 4202 + 4203 + safe-stable-stringify@2.5.0: {} 4204 + 4205 + semver@7.7.3: {} 4206 + 4207 + set-cookie-parser@2.7.2: {} 4208 + 4209 + shebang-command@2.0.0: 4210 + dependencies: 4211 + shebang-regex: 3.0.0 4212 + 4213 + shebang-regex@3.0.0: {} 4214 + 4215 + siginfo@2.0.0: {} 4216 + 4217 + simple-concat@1.0.1: {} 4218 + 4219 + simple-get@4.0.1: 4220 + dependencies: 4221 + decompress-response: 6.0.0 4222 + once: 1.4.0 4223 + simple-concat: 1.0.1 4224 + 4225 + sirv@3.0.2: 4226 + dependencies: 4227 + '@polka/url': 1.0.0-next.29 4228 + mrmime: 2.0.1 4229 + totalist: 3.0.1 4230 + 4231 + sonic-boom@3.8.1: 4232 + dependencies: 4233 + atomic-sleep: 1.0.0 4234 + 4235 + source-map-js@1.2.1: {} 4236 + 4237 + source-map-support@0.5.21: 4238 + dependencies: 4239 + buffer-from: 1.1.2 4240 + source-map: 0.6.1 4241 + 4242 + source-map@0.6.1: {} 4243 + 4244 + split2@4.2.0: {} 4245 + 4246 + stackback@0.0.2: {} 4247 + 4248 + std-env@3.10.0: {} 4249 + 4250 + string-width@4.2.3: 4251 + dependencies: 4252 + emoji-regex: 8.0.0 4253 + is-fullwidth-code-point: 3.0.0 4254 + strip-ansi: 6.0.1 4255 + 4256 + string_decoder@1.3.0: 4257 + dependencies: 4258 + safe-buffer: 5.2.1 4259 + 4260 + strip-ansi@6.0.1: 4261 + dependencies: 4262 + ansi-regex: 5.0.1 4263 + 4264 + strip-json-comments@2.0.1: {} 4265 + 4266 + strip-json-comments@3.1.1: {} 4267 + 4268 + supports-color@7.2.0: 4269 + dependencies: 4270 + has-flag: 4.0.0 4271 + 4272 + supports-preserve-symlinks-flag@1.0.0: {} 4273 + 4274 + svelte-check@4.3.4(picomatch@4.0.3)(svelte@5.45.2)(typescript@5.9.3): 4275 + dependencies: 4276 + '@jridgewell/trace-mapping': 0.3.31 4277 + chokidar: 4.0.3 4278 + fdir: 6.5.0(picomatch@4.0.3) 4279 + picocolors: 1.1.1 4280 + sade: 1.8.1 4281 + svelte: 5.45.2 4282 + typescript: 5.9.3 4283 + transitivePeerDependencies: 4284 + - picomatch 4285 + 4286 + svelte-eslint-parser@1.4.0(svelte@5.45.2): 4287 + dependencies: 4288 + eslint-scope: 8.4.0 4289 + eslint-visitor-keys: 4.2.1 4290 + espree: 10.4.0 4291 + postcss: 8.5.6 4292 + postcss-scss: 4.0.9(postcss@8.5.6) 4293 + postcss-selector-parser: 7.1.1 4294 + optionalDependencies: 4295 + svelte: 5.45.2 4296 + 4297 + svelte@5.45.2: 4298 + dependencies: 4299 + '@jridgewell/remapping': 2.3.5 4300 + '@jridgewell/sourcemap-codec': 1.5.5 4301 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) 4302 + '@types/estree': 1.0.8 4303 + acorn: 8.15.0 4304 + aria-query: 5.3.2 4305 + axobject-query: 4.1.0 4306 + clsx: 2.1.1 4307 + devalue: 5.5.0 4308 + esm-env: 1.2.2 4309 + esrap: 2.2.0 4310 + is-reference: 3.0.3 4311 + locate-character: 3.0.0 4312 + magic-string: 0.30.21 4313 + zimmerframe: 1.1.4 4314 + 4315 + tailwindcss@4.1.17: {} 4316 + 4317 + tapable@2.3.0: {} 4318 + 4319 + tar-fs@2.1.4: 4320 + dependencies: 4321 + chownr: 1.1.4 4322 + mkdirp-classic: 0.5.3 4323 + pump: 3.0.3 4324 + tar-stream: 2.2.0 4325 + 4326 + tar-stream@2.2.0: 4327 + dependencies: 4328 + bl: 4.1.0 4329 + end-of-stream: 1.4.5 4330 + fs-constants: 1.0.0 4331 + inherits: 2.0.4 4332 + readable-stream: 3.6.2 4333 + 4334 + thread-stream@2.7.0: 4335 + dependencies: 4336 + real-require: 0.2.0 4337 + 4338 + tinybench@2.9.0: {} 4339 + 4340 + tinyexec@0.3.2: {} 4341 + 4342 + tinyglobby@0.2.15: 4343 + dependencies: 4344 + fdir: 6.5.0(picomatch@4.0.3) 4345 + picomatch: 4.0.3 4346 + 4347 + tinyrainbow@3.0.3: {} 4348 + 4349 + totalist@3.0.1: {} 4350 + 4351 + ts-api-utils@2.1.0(typescript@5.9.3): 4352 + dependencies: 4353 + typescript: 5.9.3 4354 + 4355 + ts-morph@27.0.2: 4356 + dependencies: 4357 + '@ts-morph/common': 0.28.1 4358 + code-block-writer: 13.0.3 4359 + 4360 + tslib@2.8.1: {} 4361 + 4362 + tunnel-agent@0.6.0: 4363 + dependencies: 4364 + safe-buffer: 5.2.1 4365 + 4366 + type-check@0.4.0: 4367 + dependencies: 4368 + prelude-ls: 1.2.1 4369 + 4370 + typescript-eslint@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): 4371 + dependencies: 4372 + '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) 4373 + '@typescript-eslint/parser': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) 4374 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) 4375 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) 4376 + eslint: 9.39.1(jiti@2.6.1) 4377 + typescript: 5.9.3 4378 + transitivePeerDependencies: 4379 + - supports-color 4380 + 4381 + typescript@5.9.3: {} 4382 + 4383 + uint8arrays@3.0.0: 4384 + dependencies: 4385 + multiformats: 9.9.0 4386 + 4387 + uncrypto@0.1.3: {} 4388 + 4389 + undici-types@6.21.0: {} 4390 + 4391 + undici@6.22.0: {} 4392 + 4393 + unicode-segmenter@0.14.1: {} 4394 + 4395 + uri-js@4.4.1: 4396 + dependencies: 4397 + punycode: 2.3.1 4398 + 4399 + util-deprecate@1.0.2: {} 4400 + 4401 + varint@6.0.0: {} 4402 + 4403 + vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2): 4404 + dependencies: 4405 + esbuild: 0.25.12 4406 + fdir: 6.5.0(picomatch@4.0.3) 4407 + picomatch: 4.0.3 4408 + postcss: 8.5.6 4409 + rollup: 4.53.3 4410 + tinyglobby: 0.2.15 4411 + optionalDependencies: 4412 + '@types/node': 22.19.1 4413 + fsevents: 2.3.3 4414 + jiti: 2.6.1 4415 + lightningcss: 1.30.2 4416 + 4417 + vitefu@1.1.1(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)): 4418 + optionalDependencies: 4419 + vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2) 4420 + 4421 + vitest-browser-svelte@2.0.1(svelte@5.45.2)(vitest@4.0.14): 4422 + dependencies: 4423 + svelte: 5.45.2 4424 + vitest: 4.0.14(@types/node@22.19.1)(@vitest/browser-playwright@4.0.14)(jiti@2.6.1)(lightningcss@1.30.2) 4425 + 4426 + vitest@4.0.14(@types/node@22.19.1)(@vitest/browser-playwright@4.0.14)(jiti@2.6.1)(lightningcss@1.30.2): 4427 + dependencies: 4428 + '@vitest/expect': 4.0.14 4429 + '@vitest/mocker': 4.0.14(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)) 4430 + '@vitest/pretty-format': 4.0.14 4431 + '@vitest/runner': 4.0.14 4432 + '@vitest/snapshot': 4.0.14 4433 + '@vitest/spy': 4.0.14 4434 + '@vitest/utils': 4.0.14 4435 + es-module-lexer: 1.7.0 4436 + expect-type: 1.2.2 4437 + magic-string: 0.30.21 4438 + obug: 2.1.1 4439 + pathe: 2.0.3 4440 + picomatch: 4.0.3 4441 + std-env: 3.10.0 4442 + tinybench: 2.9.0 4443 + tinyexec: 0.3.2 4444 + tinyglobby: 0.2.15 4445 + tinyrainbow: 3.0.3 4446 + vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2) 4447 + why-is-node-running: 2.3.0 4448 + optionalDependencies: 4449 + '@types/node': 22.19.1 4450 + '@vitest/browser-playwright': 4.0.14(playwright@1.57.0)(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2))(vitest@4.0.14) 4451 + transitivePeerDependencies: 4452 + - jiti 4453 + - less 4454 + - lightningcss 4455 + - msw 4456 + - sass 4457 + - sass-embedded 4458 + - stylus 4459 + - sugarss 4460 + - terser 4461 + - tsx 4462 + - yaml 4463 + 4464 + web-streams-polyfill@3.3.3: {} 4465 + 4466 + which@2.0.2: 4467 + dependencies: 4468 + isexe: 2.0.0 4469 + 4470 + why-is-node-running@2.3.0: 4471 + dependencies: 4472 + siginfo: 2.0.0 4473 + stackback: 0.0.2 4474 + 4475 + word-wrap@1.2.5: {} 4476 + 4477 + wrap-ansi@7.0.0: 4478 + dependencies: 4479 + ansi-styles: 4.3.0 4480 + string-width: 4.2.3 4481 + strip-ansi: 6.0.1 4482 + 4483 + wrappy@1.0.2: {} 4484 + 4485 + ws@8.18.3: {} 4486 + 4487 + y18n@5.0.8: {} 4488 + 4489 + yaml@1.10.2: {} 4490 + 4491 + yargs-parser@21.1.1: {} 4492 + 4493 + yargs@17.7.2: 4494 + dependencies: 4495 + cliui: 8.0.1 4496 + escalade: 3.2.0 4497 + get-caller-file: 2.0.5 4498 + require-directory: 2.1.1 4499 + string-width: 4.2.3 4500 + y18n: 5.0.8 4501 + yargs-parser: 21.1.1 4502 + 4503 + yocto-queue@0.1.0: {} 4504 + 4505 + zimmerframe@1.1.4: {} 4506 + 4507 + zod@3.25.76: {}
+2
pnpm-workspace.yaml
··· 1 + onlyBuiltDependencies: 2 + - esbuild
+8
src/app.css
··· 1 + @import 'tailwindcss'; 2 + 3 + @theme { 4 + /* Use class-based dark mode */ 5 + --color-scheme: light dark; 6 + } 7 + 8 + @custom-variant dark (&:where(.dark, .dark *));
+15
src/app.d.ts
··· 1 + // See https://svelte.dev/docs/kit/types#app.d.ts 2 + // for information about these interfaces 3 + declare global { 4 + namespace App { 5 + // interface Error {} 6 + interface Locals { 7 + did: string | null; 8 + } 9 + // interface PageData {} 10 + // interface PageState {} 11 + // interface Platform {} 12 + } 13 + } 14 + 15 + export {};
+15
src/app.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 + <meta name="theme-color" content="#000000" /> 7 + <meta name="description" content="ATProto-powered link aggregator" /> 8 + <link rel="manifest" href="/manifest.json" /> 9 + <link rel="apple-touch-icon" href="/icon-192.png" /> 10 + %sveltekit.head% 11 + </head> 12 + <body data-sveltekit-preload-data="hover"> 13 + <div style="display: contents">%sveltekit.body%</div> 14 + </body> 15 + </html>
+7
src/demo.spec.ts
··· 1 + import { describe, it, expect } from 'vitest'; 2 + 3 + describe('sum test', () => { 4 + it('adds 1 + 2 to equal 3', () => { 5 + expect(1 + 2).toBe(3); 6 + }); 7 + });
+10
src/hooks.server.ts
··· 1 + import type { Handle } from '@sveltejs/kit'; 2 + import { getCurrentDid } from '$lib/server/auth'; 3 + 4 + export const handle: Handle = async ({ event, resolve }) => { 5 + // Load the current user's DID from session cookie 6 + const did = await getCurrentDid(event.cookies); 7 + event.locals.did = did; 8 + 9 + return resolve(event); 10 + };
+1
src/lib/assets/favicon.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" width="107" height="128" viewBox="0 0 107 128"><title>svelte-logo</title><path d="M94.157 22.819c-10.4-14.885-30.94-19.297-45.792-9.835L22.282 29.608A29.92 29.92 0 0 0 8.764 49.65a31.5 31.5 0 0 0 3.108 20.231 30 30 0 0 0-4.477 11.183 31.9 31.9 0 0 0 5.448 24.116c10.402 14.887 30.942 19.297 45.791 9.835l26.083-16.624A29.92 29.92 0 0 0 98.235 78.35a31.53 31.53 0 0 0-3.105-20.232 30 30 0 0 0 4.474-11.182 31.88 31.88 0 0 0-5.447-24.116" style="fill:#ff3e00"/><path d="M45.817 106.582a20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.503 18 18 0 0 1 .624-2.435l.49-1.498 1.337.981a33.6 33.6 0 0 0 10.203 5.098l.97.294-.09.968a5.85 5.85 0 0 0 1.052 3.878 6.24 6.24 0 0 0 6.695 2.485 5.8 5.8 0 0 0 1.603-.704L69.27 76.28a5.43 5.43 0 0 0 2.45-3.631 5.8 5.8 0 0 0-.987-4.371 6.24 6.24 0 0 0-6.698-2.487 5.7 5.7 0 0 0-1.6.704l-9.953 6.345a19 19 0 0 1-5.296 2.326 20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.502 17.99 17.99 0 0 1 8.13-12.052l26.081-16.623a19 19 0 0 1 5.3-2.329 20.72 20.72 0 0 1 22.237 8.243 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-.624 2.435l-.49 1.498-1.337-.98a33.6 33.6 0 0 0-10.203-5.1l-.97-.294.09-.968a5.86 5.86 0 0 0-1.052-3.878 6.24 6.24 0 0 0-6.696-2.485 5.8 5.8 0 0 0-1.602.704L37.73 51.72a5.42 5.42 0 0 0-2.449 3.63 5.79 5.79 0 0 0 .986 4.372 6.24 6.24 0 0 0 6.698 2.486 5.8 5.8 0 0 0 1.602-.704l9.952-6.342a19 19 0 0 1 5.295-2.328 20.72 20.72 0 0 1 22.237 8.242 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-8.13 12.053l-26.081 16.622a19 19 0 0 1-5.3 2.328" style="fill:#fff"/></svg>
+62
src/lib/components/Avatar.svelte
··· 1 + <script lang="ts"> 2 + interface Props { 3 + handle: string; 4 + avatar?: string | null; 5 + did?: string; 6 + size?: 'sm' | 'md' | 'lg'; 7 + showHandle?: boolean; 8 + link?: boolean; 9 + } 10 + 11 + let { handle, avatar, did, size = 'md', showHandle = false, link = false }: Props = $props(); 12 + 13 + const sizeClasses = { 14 + sm: 'h-6 w-6 text-xs', 15 + md: 'h-8 w-8 text-sm', 16 + lg: 'h-10 w-10 text-base' 17 + }; 18 + 19 + const ringClasses = 'ring-2 ring-gray-200 ring-offset-1 ring-offset-white dark:ring-gray-600 dark:ring-offset-gray-950'; 20 + 21 + const profileUrl = did ? `/profile/${did}` : `/profile/${handle}`; 22 + </script> 23 + 24 + {#if link} 25 + <a href={profileUrl} class="flex items-center gap-2 hover:underline"> 26 + {#if avatar} 27 + <img 28 + src={avatar} 29 + alt={handle} 30 + class="{sizeClasses[size]} {ringClasses} rounded-full object-cover" 31 + /> 32 + {:else} 33 + <div class="{sizeClasses[size]} {ringClasses} flex items-center justify-center rounded-full bg-gray-200 dark:bg-gray-700"> 34 + <span class="font-medium text-gray-600 dark:text-gray-300"> 35 + {handle.charAt(0).toUpperCase()} 36 + </span> 37 + </div> 38 + {/if} 39 + {#if showHandle} 40 + <span class="text-sm font-medium">@{handle}</span> 41 + {/if} 42 + </a> 43 + {:else} 44 + <div class="flex items-center gap-2"> 45 + {#if avatar} 46 + <img 47 + src={avatar} 48 + alt={handle} 49 + class="{sizeClasses[size]} {ringClasses} rounded-full object-cover" 50 + /> 51 + {:else} 52 + <div class="{sizeClasses[size]} {ringClasses} flex items-center justify-center rounded-full bg-gray-200 dark:bg-gray-700"> 53 + <span class="font-medium text-gray-600 dark:text-gray-300"> 54 + {handle.charAt(0).toUpperCase()} 55 + </span> 56 + </div> 57 + {/if} 58 + {#if showHandle} 59 + <span class="text-sm font-medium">@{handle}</span> 60 + {/if} 61 + </div> 62 + {/if}
+56
src/lib/components/ThemeToggle.svelte
··· 1 + <script lang="ts"> 2 + import { browser } from '$app/environment'; 3 + 4 + let dark = $state(false); 5 + 6 + // Initialize from localStorage or system preference 7 + if (browser) { 8 + const stored = localStorage.getItem('theme'); 9 + if (stored) { 10 + dark = stored === 'dark'; 11 + } else { 12 + dark = window.matchMedia('(prefers-color-scheme: dark)').matches; 13 + } 14 + updateTheme(); 15 + } 16 + 17 + function updateTheme() { 18 + if (dark) { 19 + document.documentElement.classList.add('dark'); 20 + } else { 21 + document.documentElement.classList.remove('dark'); 22 + } 23 + } 24 + 25 + function toggle() { 26 + dark = !dark; 27 + localStorage.setItem('theme', dark ? 'dark' : 'light'); 28 + updateTheme(); 29 + } 30 + </script> 31 + 32 + <button 33 + onclick={toggle} 34 + class="rounded-lg p-2 hover:bg-gray-100 dark:hover:bg-gray-800" 35 + aria-label={dark ? 'Switch to light mode' : 'Switch to dark mode'} 36 + > 37 + {#if dark} 38 + <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"> 39 + <path 40 + stroke-linecap="round" 41 + stroke-linejoin="round" 42 + stroke-width="2" 43 + d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" 44 + /> 45 + </svg> 46 + {:else} 47 + <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"> 48 + <path 49 + stroke-linecap="round" 50 + stroke-linejoin="round" 51 + stroke-width="2" 52 + d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z" 53 + /> 54 + </svg> 55 + {/if} 56 + </button>
+1
src/lib/index.ts
··· 1 + // place files you want to import through the `$lib` alias in this folder.
+116
src/lib/server/auth/client.ts
··· 1 + import { 2 + NodeOAuthClient, 3 + type OAuthClientMetadataInput, 4 + Keyset, 5 + JoseKey 6 + } from '@atproto/oauth-client-node'; 7 + import { StateStore, SessionStore } from './storage'; 8 + import type { Database } from '../db'; 9 + import { env } from '$env/dynamic/private'; 10 + 11 + // Environment variables 12 + // PUBLIC_URL: e.g., https://papili.one (set in production) 13 + // PRIVATE_KEY_ES256: JWK string for signing (required in production) 14 + // COOKIE_SECRET: Secret for iron-session cookies 15 + 16 + // Granular OAuth scopes - only request access to our own collections 17 + // See: https://github.com/bluesky-social/atproto/discussions/4118 18 + const OAUTH_SCOPE = 'atproto repo:one.papili.post repo:one.papili.comment'; 19 + 20 + /** 21 + * Creates an OAuth client for the given database connection. 22 + * Handles both development (loopback) and production (confidential client) modes. 23 + */ 24 + export async function createOAuthClient(db: Database): Promise<NodeOAuthClient> { 25 + const PUBLIC_URL = env.PUBLIC_URL; 26 + const PRIVATE_KEY_ES256 = env.PRIVATE_KEY_ES256; 27 + 28 + // Build keyset for confidential client (production only) 29 + let keyset: Keyset | undefined; 30 + 31 + if (PUBLIC_URL && PRIVATE_KEY_ES256) { 32 + try { 33 + const jwk = JSON.parse(PRIVATE_KEY_ES256); 34 + const key = await JoseKey.fromJWK(jwk); 35 + keyset = new Keyset([key]); 36 + } catch (err) { 37 + console.error('Failed to parse PRIVATE_KEY_ES256:', err); 38 + throw new Error('Invalid PRIVATE_KEY_ES256. Must be a valid ES256 JWK JSON string.'); 39 + } 40 + } 41 + 42 + // For production, we need a keyset 43 + if (PUBLIC_URL && !keyset) { 44 + throw new Error( 45 + 'Production mode requires PRIVATE_KEY_ES256 environment variable. ' + 46 + 'Generate one with: npx @atproto/oauth-client-node gen-jwk' 47 + ); 48 + } 49 + 50 + const hasSigningKey = keyset && keyset.size > 0; 51 + 52 + // Build client metadata based on environment 53 + const clientMetadata: OAuthClientMetadataInput = PUBLIC_URL 54 + ? { 55 + // Production: Confidential client 56 + client_name: 'papili.one', 57 + client_id: `${PUBLIC_URL}/oauth/client-metadata.json`, 58 + client_uri: PUBLIC_URL, 59 + redirect_uris: [`${PUBLIC_URL}/oauth/callback`], 60 + scope: OAUTH_SCOPE, 61 + grant_types: ['authorization_code', 'refresh_token'], 62 + response_types: ['code'], 63 + application_type: 'web', 64 + token_endpoint_auth_method: hasSigningKey ? 'private_key_jwt' : 'none', 65 + token_endpoint_auth_signing_alg: hasSigningKey ? 'ES256' : undefined, 66 + dpop_bound_access_tokens: true, 67 + jwks_uri: `${PUBLIC_URL}/oauth/jwks.json` 68 + } 69 + : { 70 + // Development: Loopback client (RFC 8252) 71 + // ATProto requires 127.0.0.1 for loopback, not localhost 72 + client_name: 'papili.one (Development)', 73 + client_id: `http://localhost?redirect_uri=${encodeURIComponent( 74 + 'http://127.0.0.1:5173/oauth/callback' 75 + )}&scope=${encodeURIComponent(OAUTH_SCOPE)}`, 76 + redirect_uris: ['http://127.0.0.1:5173/oauth/callback'], 77 + scope: OAUTH_SCOPE, 78 + grant_types: ['authorization_code', 'refresh_token'], 79 + response_types: ['code'], 80 + application_type: 'web', 81 + token_endpoint_auth_method: 'none', 82 + dpop_bound_access_tokens: true 83 + }; 84 + 85 + return new NodeOAuthClient({ 86 + clientMetadata, 87 + keyset, 88 + stateStore: new StateStore(db), 89 + sessionStore: new SessionStore(db) 90 + // Note: D1 doesn't support advisory locks, so we skip requestLock 91 + // This means concurrent token refreshes could race, but it's acceptable for MVP 92 + }); 93 + } 94 + 95 + /** 96 + * Cookie secret for iron-session. 97 + */ 98 + export function getCookieSecret(): string { 99 + const COOKIE_SECRET = env.COOKIE_SECRET; 100 + 101 + if (!COOKIE_SECRET) { 102 + if (env.PUBLIC_URL) { 103 + throw new Error('COOKIE_SECRET is required in production'); 104 + } 105 + // Default for development 106 + return 'development-secret-at-least-32-characters-long'; 107 + } 108 + return COOKIE_SECRET; 109 + } 110 + 111 + /** 112 + * Check if we're in production mode (has PUBLIC_URL). 113 + */ 114 + export function isProduction(): boolean { 115 + return !!env.PUBLIC_URL; 116 + }
+3
src/lib/server/auth/index.ts
··· 1 + export { createOAuthClient, getCookieSecret, isProduction } from './client'; 2 + export { StateStore, SessionStore } from './storage'; 3 + export { getSession, getCurrentDid, type SessionData } from './session';
+56
src/lib/server/auth/session.ts
··· 1 + import { getIronSession, type IronSession } from 'iron-session'; 2 + import type { Cookies } from '@sveltejs/kit'; 3 + import { getCookieSecret, isProduction } from './client'; 4 + 5 + export interface SessionData { 6 + did?: string; 7 + } 8 + 9 + const COOKIE_NAME = 'papili-session'; 10 + 11 + /** 12 + * Adapter to make SvelteKit Cookies compatible with iron-session CookieStore. 13 + */ 14 + function createCookieStore(cookies: Cookies) { 15 + return { 16 + get(name: string) { 17 + const value = cookies.get(name); 18 + if (value === undefined) return undefined; 19 + return { name, value }; 20 + }, 21 + set(name: string, value: string, options?: { path?: string; httpOnly?: boolean; secure?: boolean; sameSite?: 'lax' | 'strict' | 'none'; maxAge?: number }) { 22 + cookies.set(name, value, { 23 + path: options?.path || '/', 24 + httpOnly: options?.httpOnly ?? true, 25 + secure: options?.secure ?? isProduction(), 26 + sameSite: options?.sameSite || 'lax', 27 + maxAge: options?.maxAge 28 + }); 29 + } 30 + }; 31 + } 32 + 33 + /** 34 + * Get the iron-session from SvelteKit cookies. 35 + */ 36 + export async function getSession(cookies: Cookies): Promise<IronSession<SessionData>> { 37 + // eslint-disable-next-line @typescript-eslint/no-explicit-any 38 + return getIronSession<SessionData>(createCookieStore(cookies) as any, { 39 + cookieName: COOKIE_NAME, 40 + password: getCookieSecret(), 41 + cookieOptions: { 42 + secure: isProduction(), 43 + httpOnly: true, 44 + sameSite: 'lax' as const, 45 + path: '/' 46 + } 47 + }); 48 + } 49 + 50 + /** 51 + * Get the current user's DID from session, if logged in. 52 + */ 53 + export async function getCurrentDid(cookies: Cookies): Promise<string | null> { 54 + const session = await getSession(cookies); 55 + return session.did || null; 56 + }
+81
src/lib/server/auth/storage.ts
··· 1 + import type { 2 + NodeSavedSession, 3 + NodeSavedSessionStore, 4 + NodeSavedState, 5 + NodeSavedStateStore 6 + } from '@atproto/oauth-client-node'; 7 + import { eq, lt } from 'drizzle-orm'; 8 + import type { Database } from '../db'; 9 + import { authState, authSession } from '../db/schema'; 10 + 11 + /** 12 + * Database-backed state store for OAuth flow. 13 + * States are short-lived (15 min) and used during the authorization flow. 14 + */ 15 + export class StateStore implements NodeSavedStateStore { 16 + constructor(private db: Database) {} 17 + 18 + async get(key: string): Promise<NodeSavedState | undefined> { 19 + const result = await this.db.select().from(authState).where(eq(authState.key, key)).limit(1); 20 + 21 + if (result.length === 0) return undefined; 22 + return JSON.parse(result[0].state) as NodeSavedState; 23 + } 24 + 25 + async set(key: string, val: NodeSavedState): Promise<void> { 26 + const state = JSON.stringify(val); 27 + const now = new Date().toISOString(); 28 + 29 + await this.db 30 + .insert(authState) 31 + .values({ key, state, createdAt: now }) 32 + .onConflictDoUpdate({ 33 + target: authState.key, 34 + set: { state } 35 + }); 36 + 37 + // Clean up old states (older than 15 minutes) 38 + const fifteenMinutesAgo = new Date(Date.now() - 15 * 60 * 1000).toISOString(); 39 + await this.db.delete(authState).where(lt(authState.createdAt, fifteenMinutesAgo)); 40 + } 41 + 42 + async del(key: string): Promise<void> { 43 + await this.db.delete(authState).where(eq(authState.key, key)); 44 + } 45 + } 46 + 47 + /** 48 + * Database-backed session store for OAuth sessions. 49 + * Sessions are long-lived and store the authenticated user's tokens. 50 + */ 51 + export class SessionStore implements NodeSavedSessionStore { 52 + constructor(private db: Database) {} 53 + 54 + async get(key: string): Promise<NodeSavedSession | undefined> { 55 + const result = await this.db 56 + .select() 57 + .from(authSession) 58 + .where(eq(authSession.key, key)) 59 + .limit(1); 60 + 61 + if (result.length === 0) return undefined; 62 + return JSON.parse(result[0].session) as NodeSavedSession; 63 + } 64 + 65 + async set(key: string, val: NodeSavedSession): Promise<void> { 66 + const session = JSON.stringify(val); 67 + const now = new Date().toISOString(); 68 + 69 + await this.db 70 + .insert(authSession) 71 + .values({ key, session, createdAt: now, updatedAt: now }) 72 + .onConflictDoUpdate({ 73 + target: authSession.key, 74 + set: { session, updatedAt: now } 75 + }); 76 + } 77 + 78 + async del(key: string): Promise<void> { 79 + await this.db.delete(authSession).where(eq(authSession.key, key)); 80 + } 81 + }
+13
src/lib/server/db/index.ts
··· 1 + import { createClient } from '@libsql/client'; 2 + import { drizzle } from 'drizzle-orm/libsql'; 3 + import * as schema from './schema'; 4 + 5 + const DATABASE_PATH = process.env.DATABASE_PATH || './data/papili.db'; 6 + 7 + const client = createClient({ 8 + url: `file:${DATABASE_PATH}` 9 + }); 10 + 11 + export const db = drizzle(client, { schema }); 12 + 13 + export type Database = typeof db;
+43
src/lib/server/db/schema.ts
··· 1 + import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'; 2 + 3 + // ============================================================================ 4 + // Auth tables 5 + // ============================================================================ 6 + 7 + // OAuth state tokens (short-lived, auto-cleanup after 15 min) 8 + export const authState = sqliteTable('auth_state', { 9 + key: text('key').primaryKey(), 10 + state: text('state').notNull(), // JSON serialized OAuth state 11 + createdAt: text('created_at').notNull() 12 + }); 13 + 14 + // OAuth sessions (long-lived) 15 + export const authSession = sqliteTable('auth_session', { 16 + key: text('key').primaryKey(), 17 + session: text('session').notNull(), // JSON serialized OAuth session 18 + createdAt: text('created_at').notNull(), 19 + updatedAt: text('updated_at').notNull() 20 + }); 21 + 22 + // Account lifecycle tracking 23 + // Status values follow AT Protocol account lifecycle: 24 + // - null: active account (default) 25 + // - 'deactivated': user temporarily paused account 26 + // - 'suspended': host temporarily paused account 27 + // - 'takendown': host took down account 28 + // - 'deleted': account deleted 29 + export const accounts = sqliteTable('accounts', { 30 + did: text('did').primaryKey(), 31 + handle: text('handle'), 32 + active: integer('active').notNull().default(1), // 1 = active, 0 = inactive 33 + status: text('status'), // null | 'deactivated' | 'suspended' | 'takendown' | 'deleted' 34 + updatedAt: text('updated_at').notNull() 35 + }); 36 + 37 + // ============================================================================ 38 + // Content tables (for Phase 3+) 39 + // ============================================================================ 40 + 41 + // Posts will be added in Phase 3 42 + // Comments will be added in Phase 4 43 + // Votes will be added in Phase 5
+37
src/routes/+layout.server.ts
··· 1 + import type { LayoutServerLoad } from './$types'; 2 + 3 + interface UserProfile { 4 + did: string; 5 + handle: string; 6 + avatar?: string; 7 + } 8 + 9 + async function fetchProfile(did: string): Promise<UserProfile | null> { 10 + try { 11 + const res = await fetch( 12 + `https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${encodeURIComponent(did)}` 13 + ); 14 + if (!res.ok) return null; 15 + const data = await res.json(); 16 + return { 17 + did: data.did, 18 + handle: data.handle, 19 + avatar: data.avatar 20 + }; 21 + } catch { 22 + return null; 23 + } 24 + } 25 + 26 + export const load: LayoutServerLoad = async ({ locals }) => { 27 + let user: UserProfile | null = null; 28 + 29 + if (locals.did) { 30 + user = await fetchProfile(locals.did); 31 + } 32 + 33 + return { 34 + did: locals.did, 35 + user 36 + }; 37 + };
+54
src/routes/+layout.svelte
··· 1 + <script lang="ts"> 2 + import '../app.css'; 3 + import favicon from '$lib/assets/favicon.svg'; 4 + import ThemeToggle from '$lib/components/ThemeToggle.svelte'; 5 + import Avatar from '$lib/components/Avatar.svelte'; 6 + 7 + let { children, data } = $props(); 8 + </script> 9 + 10 + <svelte:head> 11 + <link rel="icon" href={favicon} /> 12 + </svelte:head> 13 + 14 + <div class="min-h-screen bg-white text-gray-900 dark:bg-gray-950 dark:text-gray-100"> 15 + <header class="border-b border-gray-200 dark:border-gray-800"> 16 + <nav class="mx-auto flex max-w-4xl items-center justify-between px-4 py-3"> 17 + <a href="/" class="text-xl font-bold">papili</a> 18 + 19 + <div class="flex items-center gap-4"> 20 + {#if data.user} 21 + <Avatar handle={data.user.handle} avatar={data.user.avatar} did={data.user.did} /> 22 + <a 23 + href="/logout" 24 + class="rounded-lg px-3 py-1.5 text-sm hover:bg-gray-100 dark:hover:bg-gray-800" 25 + > 26 + Sign out 27 + </a> 28 + {:else if data.did} 29 + <span class="text-sm text-gray-600 dark:text-gray-400"> 30 + {data.did.slice(0, 20)}... 31 + </span> 32 + <a 33 + href="/logout" 34 + class="rounded-lg px-3 py-1.5 text-sm hover:bg-gray-100 dark:hover:bg-gray-800" 35 + > 36 + Sign out 37 + </a> 38 + {:else} 39 + <a 40 + href="/login" 41 + class="rounded-lg bg-blue-600 px-3 py-1.5 text-sm font-medium text-white hover:bg-blue-700" 42 + > 43 + Sign in 44 + </a> 45 + {/if} 46 + <ThemeToggle /> 47 + </div> 48 + </nav> 49 + </header> 50 + 51 + <main class="mx-auto max-w-4xl px-4 py-6"> 52 + {@render children()} 53 + </main> 54 + </div>
+6
src/routes/+page.svelte
··· 1 + <div class="space-y-4"> 2 + <h1 class="text-3xl font-bold">papili.one</h1> 3 + <p class="text-gray-600 dark:text-gray-400"> 4 + An ATProto-powered link aggregator. Coming soon. 5 + </p> 6 + </div>
+53
src/routes/login/+page.server.ts
··· 1 + import { fail, redirect, isRedirect } from '@sveltejs/kit'; 2 + import type { Actions, PageServerLoad } from './$types'; 3 + import { createOAuthClient } from '$lib/server/auth'; 4 + import { db } from '$lib/server/db'; 5 + 6 + export const load: PageServerLoad = async ({ url, locals }) => { 7 + // If already logged in, redirect to home 8 + if (locals.did) { 9 + redirect(302, '/'); 10 + } 11 + 12 + // Check for error from callback 13 + const error = url.searchParams.get('error'); 14 + return { error }; 15 + }; 16 + 17 + export const actions: Actions = { 18 + default: async ({ request, url }) => { 19 + const formData = await request.formData(); 20 + const handle = formData.get('handle')?.toString()?.trim(); 21 + 22 + if (!handle) { 23 + return fail(400, { error: 'Handle is required' }); 24 + } 25 + 26 + // Normalize handle (add .bsky.social if no domain) 27 + const normalizedHandle = handle.includes('.') ? handle : `${handle}.bsky.social`; 28 + 29 + try { 30 + const client = await createOAuthClient(db); 31 + 32 + // Get the return URL from query params, or default to home 33 + const returnUrl = url.searchParams.get('returnUrl') || '/'; 34 + 35 + // Start OAuth flow 36 + const authUrl = await client.authorize(normalizedHandle, { 37 + // Store returnUrl in state so we can redirect after callback 38 + state: JSON.stringify({ returnUrl }) 39 + }); 40 + 41 + // Redirect to the authorization server 42 + redirect(302, authUrl.toString()); 43 + } catch (err) { 44 + // Re-throw redirects - they're not errors 45 + if (isRedirect(err)) { 46 + throw err; 47 + } 48 + console.error('OAuth authorize error:', err); 49 + const message = err instanceof Error ? err.message : 'Failed to start authentication'; 50 + return fail(500, { error: message }); 51 + } 52 + } 53 + };
+61
src/routes/login/+page.svelte
··· 1 + <script lang="ts"> 2 + import { enhance } from '$app/forms'; 3 + 4 + let { data, form } = $props(); 5 + 6 + let handle = $state(''); 7 + let loading = $state(false); 8 + </script> 9 + 10 + <div class="mx-auto max-w-sm space-y-6 py-12"> 11 + <div class="text-center"> 12 + <h1 class="text-2xl font-bold">Sign in</h1> 13 + <p class="mt-2 text-gray-600 dark:text-gray-400">Sign in with your <a href="https://internethandle.org/" target="_blank" rel="noopener noreferrer" class="text-blue-600 hover:underline dark:text-blue-400">Internet Handle</a></p> 14 + </div> 15 + 16 + {#if form?.error} 17 + <div class="rounded-lg bg-red-50 p-4 text-red-700 dark:bg-red-900/20 dark:text-red-400"> 18 + {form.error} 19 + </div> 20 + {/if} 21 + 22 + {#if data.error} 23 + <div class="rounded-lg bg-red-50 p-4 text-red-700 dark:bg-red-900/20 dark:text-red-400"> 24 + {data.error} 25 + </div> 26 + {/if} 27 + 28 + <form 29 + method="POST" 30 + use:enhance={() => { 31 + loading = true; 32 + return async ({ update }) => { 33 + loading = false; 34 + await update(); 35 + }; 36 + }} 37 + class="space-y-4" 38 + > 39 + <div> 40 + <label for="handle" class="block text-sm font-medium">Handle</label> 41 + <input 42 + type="text" 43 + id="handle" 44 + name="handle" 45 + bind:value={handle} 46 + placeholder="you.bsky.social" 47 + required 48 + disabled={loading} 49 + class="mt-1 block w-full rounded-lg border border-gray-300 bg-white px-4 py-2 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:opacity-50 dark:border-gray-700 dark:bg-gray-900" 50 + /> 51 + </div> 52 + 53 + <button 54 + type="submit" 55 + disabled={loading || !handle} 56 + class="w-full rounded-lg bg-blue-600 px-4 py-2 font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50" 57 + > 58 + {loading ? 'Signing in...' : 'Sign in'} 59 + </button> 60 + </form> 61 + </div>
+31
src/routes/logout/+server.ts
··· 1 + import { redirect, type RequestHandler } from '@sveltejs/kit'; 2 + import { createOAuthClient, getSession } from '$lib/server/auth'; 3 + import { db } from '$lib/server/db'; 4 + 5 + export const POST: RequestHandler = async ({ cookies }) => { 6 + const session = await getSession(cookies); 7 + 8 + if (session.did) { 9 + try { 10 + // Sign out from ATProto 11 + const client = await createOAuthClient(db); 12 + const oauthSession = await client.restore(session.did); 13 + if (oauthSession) { 14 + await oauthSession.signOut(); 15 + } 16 + } catch (err) { 17 + console.error('Error signing out from ATProto:', err); 18 + } 19 + 20 + // Clear our session 21 + session.did = undefined; 22 + await session.save(); 23 + } 24 + 25 + redirect(302, '/'); 26 + }; 27 + 28 + // Also support GET for easy link-based logout 29 + export const GET: RequestHandler = async (event) => { 30 + return POST(event); 31 + };
+62
src/routes/oauth/callback/+server.ts
··· 1 + import { redirect, isRedirect, type RequestHandler } from '@sveltejs/kit'; 2 + import { createOAuthClient, getSession } from '$lib/server/auth'; 3 + import { db } from '$lib/server/db'; 4 + 5 + export const GET: RequestHandler = async ({ url, cookies }) => { 6 + const params = url.searchParams; 7 + 8 + // Check for OAuth error 9 + const error = params.get('error'); 10 + if (error) { 11 + const description = params.get('error_description') || error; 12 + redirect(302, `/login?error=${encodeURIComponent(description)}`); 13 + } 14 + 15 + try { 16 + const client = await createOAuthClient(db); 17 + 18 + // Complete the OAuth flow 19 + const { session: oauthSession, state } = await client.callback(params); 20 + 21 + // Parse returnUrl from state 22 + let returnUrl = '/'; 23 + if (state) { 24 + try { 25 + const parsed = JSON.parse(state); 26 + if (parsed.returnUrl && typeof parsed.returnUrl === 'string' && parsed.returnUrl.startsWith('/')) { 27 + returnUrl = parsed.returnUrl; 28 + } 29 + } catch { 30 + // Ignore parse errors 31 + } 32 + } 33 + 34 + // Get our session cookie 35 + const session = await getSession(cookies); 36 + 37 + // If already signed in with different account, sign out old one 38 + if (session.did && session.did !== oauthSession.did) { 39 + try { 40 + const oldSession = await client.restore(session.did); 41 + if (oldSession) await oldSession.signOut(); 42 + } catch { 43 + // Ignore errors signing out old session 44 + } 45 + } 46 + 47 + // Store the DID in our session cookie 48 + session.did = oauthSession.did; 49 + await session.save(); 50 + 51 + // Redirect to returnUrl 52 + redirect(302, returnUrl); 53 + } catch (err) { 54 + // Re-throw redirects - they're not errors 55 + if (isRedirect(err)) { 56 + throw err; 57 + } 58 + console.error('OAuth callback error:', err); 59 + const message = err instanceof Error ? err.message : 'Authentication failed'; 60 + redirect(302, `/login?error=${encodeURIComponent(message)}`); 61 + } 62 + };
+13
src/routes/page.svelte.spec.ts
··· 1 + import { page } from 'vitest/browser'; 2 + import { describe, expect, it } from 'vitest'; 3 + import { render } from 'vitest-browser-svelte'; 4 + import Page from './+page.svelte'; 5 + 6 + describe('/+page.svelte', () => { 7 + it('should render h1', async () => { 8 + render(Page); 9 + 10 + const heading = page.getByRole('heading', { level: 1 }); 11 + await expect.element(heading).toBeInTheDocument(); 12 + }); 13 + });
+21
static/manifest.json
··· 1 + { 2 + "name": "papili.one", 3 + "short_name": "papili", 4 + "description": "ATProto-powered link aggregator", 5 + "start_url": "/", 6 + "display": "standalone", 7 + "background_color": "#ffffff", 8 + "theme_color": "#000000", 9 + "icons": [ 10 + { 11 + "src": "/icon-192.png", 12 + "sizes": "192x192", 13 + "type": "image/png" 14 + }, 15 + { 16 + "src": "/icon-512.png", 17 + "sizes": "512x512", 18 + "type": "image/png" 19 + } 20 + ] 21 + }
+3
static/robots.txt
··· 1 + # allow crawling everything by default 2 + User-agent: * 3 + Disallow:
+13
svelte.config.js
··· 1 + import adapter from '@sveltejs/adapter-node'; 2 + import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 + 4 + /** @type {import('@sveltejs/kit').Config} */ 5 + const config = { 6 + preprocess: vitePreprocess(), 7 + 8 + kit: { 9 + adapter: adapter() 10 + } 11 + }; 12 + 13 + export default config;
+20
tsconfig.json
··· 1 + { 2 + "extends": "./.svelte-kit/tsconfig.json", 3 + "compilerOptions": { 4 + "rewriteRelativeImportExtensions": true, 5 + "allowJs": true, 6 + "checkJs": true, 7 + "esModuleInterop": true, 8 + "forceConsistentCasingInFileNames": true, 9 + "resolveJsonModule": true, 10 + "skipLibCheck": true, 11 + "sourceMap": true, 12 + "strict": true, 13 + "moduleResolution": "bundler" 14 + } 15 + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias 16 + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files 17 + // 18 + // To make changes to top-level options such as include and exclude, we recommend extending 19 + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript 20 + }
+35
vite.config.ts
··· 1 + import { defineConfig } from 'vitest/config'; 2 + import { playwright } from '@vitest/browser-playwright'; 3 + import { sveltekit } from '@sveltejs/kit/vite'; 4 + import tailwindcss from '@tailwindcss/vite'; 5 + 6 + export default defineConfig({ 7 + plugins: [tailwindcss(), sveltekit()], 8 + test: { 9 + expect: { requireAssertions: true }, 10 + projects: [ 11 + { 12 + extends: './vite.config.ts', 13 + test: { 14 + name: 'client', 15 + browser: { 16 + enabled: true, 17 + provider: playwright(), 18 + instances: [{ browser: 'chromium', headless: true }] 19 + }, 20 + include: ['src/**/*.svelte.{test,spec}.{js,ts}'], 21 + exclude: ['src/lib/server/**'] 22 + } 23 + }, 24 + { 25 + extends: './vite.config.ts', 26 + test: { 27 + name: 'server', 28 + environment: 'node', 29 + include: ['src/**/*.{test,spec}.{js,ts}'], 30 + exclude: ['src/**/*.svelte.{test,spec}.{js,ts}'] 31 + } 32 + } 33 + ] 34 + } 35 + });