new template who dis

+10
.dockerignore
··· 1 + node_modules 2 + local.db 3 + .svelte-kit 4 + build 5 + 6 + # Env 7 + .env 8 + .env.* 9 + !.env.example 10 + !.env.test
+21
.env.example
··· 1 + #Required, your sqlite db location 2 + DATABASE_URL=local.db 3 + 4 + #OAuth Setup 5 + 6 + #Most likely 127.0.01:5173 if it's dev (empty is also that), or if you have a domain on prod like pdsmoover.com 7 + #OAUTH_DOMAIN=127.0.01:5173 8 + #Optional 9 + #OAUTH_CLIENT_NAME="SvelteKit template" 10 + #OAUTH_LOGO_URI="url to a picture" 11 + #OAUTH_SCOPES="atproto transition:generic" 12 + #node ./bin/gen-jwk.js and only if you want the confendenial client which gets you longer logins 13 + #OAUTH_JWK= 14 + 15 + #DEV set means it will always use the local loop back release 16 + DEV=true 17 + 18 + #Optional microcosm settings if you'd like to have a differnt instance. Defaults to these if not set 19 + #PUBLIC_SLINGSHOT_ENDPOINT=https://slingshot.microcosm.blue 20 + #PUBLIC_CONSTELLATION_ENDPOINT=https://constellation.microcosm.blue 21 +
+26
.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 + .idea 26 + local.db
+1
.npmrc
··· 1 + engine-strict=true
.tangled/images/crash.png

This is a binary file and will not be displayed.

.tangled/images/railway-custom-domain.png

This is a binary file and will not be displayed.

.tangled/images/railway-dashboard.png

This is a binary file and will not be displayed.

+3
Caddyfile
··· 1 + {$OAUTH_DOMAIN} { 2 + reverse_proxy localhost:3000 3 + }
+23
Dockerfile
··· 1 + FROM node:24-slim AS builder 2 + WORKDIR /app 3 + 4 + COPY package.json ./ 5 + RUN npm install 6 + 7 + COPY . . 8 + #Needs a place holder during build 9 + ENV DATABASE_URL="placeholder" 10 + RUN npm run build 11 + 12 + FROM node:24-alpine3.22 AS web-app 13 + WORKDIR /app 14 + 15 + COPY --from=builder /app/build /app/dist 16 + COPY --from=builder /app/package.json /app/ 17 + COPY ./drizzle /app/drizzle 18 + ENV MIGRATIONS_FOLDER="/app/drizzle" 19 + 20 + RUN npm install --prod 21 + 22 + #This is saying run what's in the dist folder 23 + CMD ["node", "/app/dist/index.js"]
+54
README.md
··· 1 + # ATProto SvelteKit Template 2 + 3 + 4 + OAuth already figured out for you, a minimal template with ease of use oauth confidential client and local development. Along with a demo how to use the logged-in client. This is just a starting point, it's up to you to build the application. 5 + 6 + ## Features 7 + - OAuth client configured from `.env` variables 8 + - `DEV=true` allows local development, do not need a public url 9 + - removing `DEV=true` and setting `OAUTH_DOMAIN` is production and requires a public url like [demo.atpoke.xyz](https://demo.atpoke.xyz) 10 + - Setting `OAUTH_JWK` allows for the confidential client that lasts much longer (forever if you refresh the tokens, 180 for indivudal refresh tokens). Can get a value for it from running `node ./bin/gen-jwk.js` 11 + - Server side sessions and automatic loading of the atproto client from `event.locals.atpAgent` on server side components. 12 + - Examples on how to create atproto records with [pokes or making a Bluesky post](./src/routes/demo/+page.server.ts) 13 + - Examples showing how to use [microcosm.blue](https://microcosm.blue/) tooling for an appview like experince without the appview. 14 + - See how many people and who [have poked](./src/routes/demo/+page.svelte) you with [constellation](https://constellation.microcosm.blue/) 15 + - Find the [handles from the did](./src/routes/demo/+page.svelte) easily with [slingshot](https://slingshot.microcosm.blue/) 16 + 17 + ## Dev Setup 18 + 1. Copy [.env.example](.env.example) to [.env](.env), .env.example is dev settings 19 + 2. `pnpm install` 20 + 3. May need to run `pnpm approve-builds` for the build scripts for sqlite 21 + 4. `pnpm run dev` or `pnpm run dev:logging` with [pino-pretty](https://github.com/pinojs/pino-pretty) for pretty logging 22 + 23 + > If you are running locally on a different port than `5173` or something else odd can set `OAUTH_DOMAIN` .env to the domain and port. Just make sure to use either `127.0.0.1` or `[::1]`(ipv6) for oauth to work for local development. 24 + 25 + ## Production 26 + 27 + > Sign up for Railway with my referral code [z49xDi](https://railway.com?referralCode=z49xDi) to get $20 in credits, and if you spend anything, I get 15% in credits. 28 + 29 + ### Railway 30 + 1. Install the railway cli ([directions here](https://docs.railway.com/guides/cli#installing-the-cli)) 31 + 2. Login with `railway login` 32 + 3. Create a new project with `railway init`, set your project name 33 + 4. Deploy your webapp with `railway up`, this will create a new deployment. This will crash on the first run since we still have some changes to make. This is what uploads your code to railway. That is expected since we don't have a volume and our variables yet. 34 + ![crash](.tangled/images/crash.png) 35 + 5. `railway service` select the service you deployed earlier, name is most likely the same as the project name. 36 + 6. Run `railway volume add -m /app_data` to create a persistent volume for the sqlite database. 37 + 7. If you do not already have your project dashboard open you can open it with `railway open`, this opens it in a web browser. 38 + 8. Click on your service, then Variables. Add the following variables: 39 + * `OAUTH_DOMAIN` - your domain name 40 + * `OAUTH_JWK` - the value from `node ./bin/gen-jwk.js` 41 + * `DATABASE_URL` - `/app_data/local.db` 42 + ![railway dashboard](.tangled/images/railway-dashboard.png) 43 + 9. Go to settings and select "Custom Domain" to add your domain name. Follow the directions there 44 + ![railway custom domain](.tangled/images/railway-custom-domain.png) 45 + 46 + And then to update your project going forward you can run `railway up` again. 47 + 48 + ### Local server like a VPS 49 + 1. [Install docker](https://docs.docker.com/engine/install/) 50 + 2. Copy [.env.example](.env.example) to [.env](.env) and fill in the variables. Make sure to remove `DEV=true` 51 + 3. `docker-compose up` 52 + 53 + > The docker compose comes with Caddy, if you have another reverse proxy you can remove it from the docker compose and just reverse proxy to port 3000. 54 + > You may also have to play around with the Caddyfile depending on your setup.
+13
bin/gen-jwk.js
··· 1 + // forked from https://github.com/bluesky-social/statusphere-example-app/blob/main/bin/gen-jwk 2 + 3 + import { JoseKey } from '@atproto/oauth-client-node'; 4 + 5 + 6 + async function main() { 7 + const kid = Date.now().toString(); 8 + const key = await JoseKey.generate(['ES256'], kid); 9 + const jwk = key.privateJwk; 10 + console.log(JSON.stringify([jwk])); 11 + } 12 + 13 + await main();
+24
docker-compose.yml
··· 1 + services: 2 + app: 3 + env_file: .env 4 + build: . 5 + ports: 6 + - "3000:3000" 7 + volumes: 8 + - app_data:/app_data 9 + caddy: 10 + image: caddy:2-alpine 11 + network_mode: host 12 + environment: 13 + OAUTH_DOMAIN: '${OAUTH_DOMAIN}' 14 + ports: 15 + - "80:80" 16 + - "443:443" 17 + volumes: 18 + - ./Caddyfile:/etc/caddy/Caddyfile 19 + - caddy_data:/data 20 + - caddy_config:/config 21 + volumes: 22 + caddy_data: 23 + caddy_config: 24 + app_data:
+11
drizzle.config.ts
··· 1 + import { defineConfig } from 'drizzle-kit'; 2 + 3 + if (!process.env.DATABASE_URL) throw new Error('DATABASE_URL is not set'); 4 + 5 + export default defineConfig({ 6 + schema: './src/lib/server/db/schema.ts', 7 + dialect: 'sqlite', 8 + dbCredentials: { url: process.env.DATABASE_URL }, 9 + verbose: true, 10 + strict: true 11 + });
+14
drizzle/0000_cultured_thor_girl.sql
··· 1 + CREATE TABLE `key_value_store` ( 2 + `key` text PRIMARY KEY NOT NULL, 3 + `value` text, 4 + `storeName` text, 5 + `createdAt` integer 6 + ); 7 + --> statement-breakpoint 8 + CREATE TABLE `session_store` ( 9 + `id` text PRIMARY KEY NOT NULL, 10 + `did` text NOT NULL, 11 + `handle` text NOT NULL, 12 + `createdAt` integer NOT NULL, 13 + `expiresAt` integer NOT NULL 14 + );
+101
drizzle/meta/0000_snapshot.json
··· 1 + { 2 + "version": "6", 3 + "dialect": "sqlite", 4 + "id": "a1fafe21-58d6-4360-80a9-ab14cdefb1d6", 5 + "prevId": "00000000-0000-0000-0000-000000000000", 6 + "tables": { 7 + "key_value_store": { 8 + "name": "key_value_store", 9 + "columns": { 10 + "key": { 11 + "name": "key", 12 + "type": "text", 13 + "primaryKey": true, 14 + "notNull": true, 15 + "autoincrement": false 16 + }, 17 + "value": { 18 + "name": "value", 19 + "type": "text", 20 + "primaryKey": false, 21 + "notNull": false, 22 + "autoincrement": false 23 + }, 24 + "storeName": { 25 + "name": "storeName", 26 + "type": "text", 27 + "primaryKey": false, 28 + "notNull": false, 29 + "autoincrement": false 30 + }, 31 + "createdAt": { 32 + "name": "createdAt", 33 + "type": "integer", 34 + "primaryKey": false, 35 + "notNull": false, 36 + "autoincrement": false 37 + } 38 + }, 39 + "indexes": {}, 40 + "foreignKeys": {}, 41 + "compositePrimaryKeys": {}, 42 + "uniqueConstraints": {}, 43 + "checkConstraints": {} 44 + }, 45 + "session_store": { 46 + "name": "session_store", 47 + "columns": { 48 + "id": { 49 + "name": "id", 50 + "type": "text", 51 + "primaryKey": true, 52 + "notNull": true, 53 + "autoincrement": false 54 + }, 55 + "did": { 56 + "name": "did", 57 + "type": "text", 58 + "primaryKey": false, 59 + "notNull": true, 60 + "autoincrement": false 61 + }, 62 + "handle": { 63 + "name": "handle", 64 + "type": "text", 65 + "primaryKey": false, 66 + "notNull": true, 67 + "autoincrement": false 68 + }, 69 + "createdAt": { 70 + "name": "createdAt", 71 + "type": "integer", 72 + "primaryKey": false, 73 + "notNull": true, 74 + "autoincrement": false 75 + }, 76 + "expiresAt": { 77 + "name": "expiresAt", 78 + "type": "integer", 79 + "primaryKey": false, 80 + "notNull": true, 81 + "autoincrement": false 82 + } 83 + }, 84 + "indexes": {}, 85 + "foreignKeys": {}, 86 + "compositePrimaryKeys": {}, 87 + "uniqueConstraints": {}, 88 + "checkConstraints": {} 89 + } 90 + }, 91 + "views": {}, 92 + "enums": {}, 93 + "_meta": { 94 + "schemas": {}, 95 + "tables": {}, 96 + "columns": {} 97 + }, 98 + "internal": { 99 + "indexes": {} 100 + } 101 + }
+13
drizzle/meta/_journal.json
··· 1 + { 2 + "version": "7", 3 + "dialect": "sqlite", 4 + "entries": [ 5 + { 6 + "idx": 0, 7 + "version": "6", 8 + "when": 1765476251050, 9 + "tag": "0000_cultured_thor_girl", 10 + "breakpoints": true 11 + } 12 + ] 13 + }
+44
eslint.config.js
··· 1 + import { fileURLToPath } from 'node:url'; 2 + import { includeIgnoreFile } from '@eslint/compat'; 3 + import js from '@eslint/js'; 4 + import svelte from 'eslint-plugin-svelte'; 5 + import { defineConfig } from 'eslint/config'; 6 + import globals from 'globals'; 7 + import ts from 'typescript-eslint'; 8 + import svelteConfig from './svelte.config.js'; 9 + 10 + const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); 11 + 12 + export default defineConfig( 13 + includeIgnoreFile(gitignorePath), 14 + js.configs.recommended, 15 + ...ts.configs.recommended, 16 + ...svelte.configs.recommended, 17 + { 18 + languageOptions: { 19 + globals: { ...globals.browser, ...globals.node } 20 + }, 21 + rules: { // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. 22 + // 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 23 + 'no-undef': 'off', 24 + 'quotes': ['error', 'single'], 25 + 'semi': ['error', 'always'], 26 + 'object-curly-spacing': ['error', 'always'] 27 + } 28 + }, 29 + { 30 + files: [ 31 + '**/*.svelte', 32 + '**/*.svelte.ts', 33 + '**/*.svelte.js' 34 + ], 35 + languageOptions: { 36 + parserOptions: { 37 + projectService: true, 38 + extraFileExtensions: ['.svelte'], 39 + parser: ts.parser, 40 + svelteConfig 41 + } 42 + } 43 + } 44 + );
+60
package.json
··· 1 + { 2 + "name": "atproto-sveltekit-template", 3 + "private": true, 4 + "version": "0.0.1", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite dev", 8 + "dev:logging": "vite dev | pino-pretty", 9 + "build": "vite build", 10 + "preview": "vite preview", 11 + "start": "vite start", 12 + "prepare": "svelte-kit sync || echo ''", 13 + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 14 + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 15 + "lint": "eslint .", 16 + "db:push": "drizzle-kit push", 17 + "db:generate": "drizzle-kit generate", 18 + "db:migrate": "drizzle-kit migrate", 19 + "db:studio": "drizzle-kit studio" 20 + }, 21 + "devDependencies": { 22 + "@eslint/compat": "^1.4.0", 23 + "@eslint/js": "^9.39.1", 24 + "@sveltejs/adapter-auto": "^7.0.0", 25 + "@sveltejs/kit": "^2.48.5", 26 + "@sveltejs/vite-plugin-svelte": "^6.2.1", 27 + "@types/better-sqlite3": "^7.6.13", 28 + "@types/node": "^24", 29 + "dotenv": "^17.2.3", 30 + "drizzle-kit": "^0.31.7", 31 + "drizzle-orm": "^0.44.7", 32 + "eslint": "^9.39.1", 33 + "eslint-plugin-svelte": "^3.13.0", 34 + "globals": "^16.5.0", 35 + "svelte": "^5.43.8", 36 + "svelte-check": "^4.3.4", 37 + "typescript": "^5.9.3", 38 + "typescript-eslint": "^8.47.0", 39 + "vite": "^7.2.2" 40 + }, 41 + "dependencies": { 42 + "@atcute/client": "^4.1.1", 43 + "@atcute/microcosm": "^1.0.0", 44 + "@atproto/api": "^0.18.6", 45 + "@atproto/common": "^0.5.3", 46 + "@atproto/crypto": "^0.4.5", 47 + "@atproto/jwk-jose": "^0.1.11", 48 + "@atproto/oauth-client-node": "^0.3.13", 49 + "@atproto/oauth-types": "^0.5.2", 50 + "@oslojs/crypto": "^1.0.1", 51 + "@oslojs/encoding": "^1.1.0", 52 + "@sveltejs/adapter-node": "^5.4.0", 53 + "better-sqlite3": "12.4.1", 54 + "node-schedule": "^2.1.1", 55 + "pino": "^10.1.0" 56 + }, 57 + "optionalDependencies": { 58 + "@rollup/rollup-linux-x64-musl": "^4.52.5" 59 + } 60 + }
+3505
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@atcute/client': 12 + specifier: ^4.1.1 13 + version: 4.1.1 14 + '@atcute/microcosm': 15 + specifier: ^1.0.0 16 + version: 1.0.0 17 + '@atproto/api': 18 + specifier: ^0.18.6 19 + version: 0.18.6 20 + '@atproto/common': 21 + specifier: ^0.5.3 22 + version: 0.5.3 23 + '@atproto/crypto': 24 + specifier: ^0.4.5 25 + version: 0.4.5 26 + '@atproto/jwk-jose': 27 + specifier: ^0.1.11 28 + version: 0.1.11 29 + '@atproto/oauth-client-node': 30 + specifier: ^0.3.13 31 + version: 0.3.13 32 + '@atproto/oauth-types': 33 + specifier: ^0.5.2 34 + version: 0.5.2 35 + '@oslojs/crypto': 36 + specifier: ^1.0.1 37 + version: 1.0.1 38 + '@oslojs/encoding': 39 + specifier: ^1.1.0 40 + version: 1.1.0 41 + '@sveltejs/adapter-node': 42 + specifier: ^5.4.0 43 + version: 5.4.0(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2))) 44 + better-sqlite3: 45 + specifier: 12.4.1 46 + version: 12.4.1 47 + node-schedule: 48 + specifier: ^2.1.1 49 + version: 2.1.1 50 + pino: 51 + specifier: ^10.1.0 52 + version: 10.1.0 53 + devDependencies: 54 + '@eslint/compat': 55 + specifier: ^1.4.0 56 + version: 1.4.1(eslint@9.39.1) 57 + '@eslint/js': 58 + specifier: ^9.39.1 59 + version: 9.39.1 60 + '@sveltejs/adapter-auto': 61 + specifier: ^7.0.0 62 + version: 7.0.0(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2))) 63 + '@sveltejs/kit': 64 + specifier: ^2.48.5 65 + version: 2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)) 66 + '@sveltejs/vite-plugin-svelte': 67 + specifier: ^6.2.1 68 + version: 6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)) 69 + '@types/better-sqlite3': 70 + specifier: ^7.6.13 71 + version: 7.6.13 72 + '@types/node': 73 + specifier: ^24 74 + version: 24.10.2 75 + dotenv: 76 + specifier: ^17.2.3 77 + version: 17.2.3 78 + drizzle-kit: 79 + specifier: ^0.31.7 80 + version: 0.31.8 81 + drizzle-orm: 82 + specifier: ^0.44.7 83 + version: 0.44.7(@types/better-sqlite3@7.6.13)(better-sqlite3@12.4.1) 84 + eslint: 85 + specifier: ^9.39.1 86 + version: 9.39.1 87 + eslint-plugin-svelte: 88 + specifier: ^3.13.0 89 + version: 3.13.1(eslint@9.39.1)(svelte@5.45.8) 90 + globals: 91 + specifier: ^16.5.0 92 + version: 16.5.0 93 + svelte: 94 + specifier: ^5.43.8 95 + version: 5.45.8 96 + svelte-check: 97 + specifier: ^4.3.4 98 + version: 4.3.4(picomatch@4.0.3)(svelte@5.45.8)(typescript@5.9.3) 99 + typescript: 100 + specifier: ^5.9.3 101 + version: 5.9.3 102 + typescript-eslint: 103 + specifier: ^8.47.0 104 + version: 8.49.0(eslint@9.39.1)(typescript@5.9.3) 105 + vite: 106 + specifier: ^7.2.2 107 + version: 7.2.7(@types/node@24.10.2) 108 + optionalDependencies: 109 + '@rollup/rollup-linux-x64-musl': 110 + specifier: ^4.52.5 111 + version: 4.53.3 112 + 113 + packages: 114 + 115 + '@atcute/client@4.1.1': 116 + resolution: {integrity: sha512-FROCbTTCeL5u4tO/n72jDEKyKqjdlXMB56Ehve3W/gnnLGCYWvN42sS7tvL1Mgu6sbO3yZwsXKDrmM2No4XpjA==} 117 + 118 + '@atcute/identity@1.1.3': 119 + resolution: {integrity: sha512-oIqPoI8TwWeQxvcLmFEZLdN2XdWcaLVtlm8pNk0E72As9HNzzD9pwKPrLr3rmTLRIoULPPFmq9iFNsTeCIU9ng==} 120 + 121 + '@atcute/lexicons@1.2.5': 122 + resolution: {integrity: sha512-9yO9WdgxW8jZ7SbzUycH710z+JmsQ9W9n5S6i6eghYju32kkluFmgBeS47r8e8p2+Dv4DemS7o/3SUGsX9FR5Q==} 123 + 124 + '@atcute/microcosm@1.0.0': 125 + resolution: {integrity: sha512-XJW+TMvdktH2maTkVcNU6wKmnHpmNwhmg0Xj4ZY36plHpqNHfxR4kAAcXGSJcjH9CS8I1+cTHiyUQykdeOPeGg==} 126 + 127 + '@atproto-labs/did-resolver@0.2.4': 128 + resolution: {integrity: sha512-sbXxBnAJWsKv/FEGG6a/WLz7zQYUr1vA2TXvNnPwwJQJCjPwEJMOh1vM22wBr185Phy7D2GD88PcRokn7eUVyw==} 129 + 130 + '@atproto-labs/fetch-node@0.2.0': 131 + resolution: {integrity: sha512-Krq09nH/aeoiU2s9xdHA0FjTEFWG9B5FFenipv1iRixCcPc7V3DhTNDawxG9gI8Ny0k4dBVS9WTRN/IDzBx86Q==} 132 + engines: {node: '>=18.7.0'} 133 + 134 + '@atproto-labs/fetch@0.2.3': 135 + resolution: {integrity: sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==} 136 + 137 + '@atproto-labs/handle-resolver-node@0.1.23': 138 + resolution: {integrity: sha512-tBRr2LCgzn3klk+DL0xrTFv4zg5tEszdeW6vSIFVebBYSb3MLdfhievmSqZdIQ4c9UCC4hN7YXTlZCXj8+2YmQ==} 139 + engines: {node: '>=18.7.0'} 140 + 141 + '@atproto-labs/handle-resolver@0.3.4': 142 + resolution: {integrity: sha512-wsNopfzfgO3uPvfnFDgNeXgDufXxSXhjBjp2WEiSzEiLrMy0Jodnqggw4OzD9MJKf0a4Iu2/ydd537qdy91LrQ==} 143 + 144 + '@atproto-labs/identity-resolver@0.3.4': 145 + resolution: {integrity: sha512-HNUEFQIo2ws6iATxmgHd5D5rAsWYupgxZucgwolVHPiMjE1SY+EmxEsfbEN1wDEzM8/u9AKUg/jrxxPEwsgbew==} 146 + 147 + '@atproto-labs/pipe@0.1.1': 148 + resolution: {integrity: sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==} 149 + 150 + '@atproto-labs/simple-store-memory@0.1.4': 151 + resolution: {integrity: sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==} 152 + 153 + '@atproto-labs/simple-store@0.3.0': 154 + resolution: {integrity: sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==} 155 + 156 + '@atproto/api@0.18.6': 157 + resolution: {integrity: sha512-dkzy2OHSAGgzG9GExvOiwRY73EzVD2AiD3nksng+V6erG0kwLfbmVYjoP9mq9Y16BCXr/7q9lekfogthqU614Q==} 158 + 159 + '@atproto/common-web@0.4.7': 160 + resolution: {integrity: sha512-vjw2+81KPo2/SAbbARGn64Ln+6JTI0FTI4xk8if0ebBfDxFRmHb2oSN1y77hzNq/ybGHqA2mecfhS03pxC5+lg==} 161 + 162 + '@atproto/common@0.5.3': 163 + resolution: {integrity: sha512-jMC9ikl8QbJcnh21upe9Gb9mIaSJWsdp8sgaelmntUtChWnxxvCC/pI3TBX11PT7XlHUE6UyuvY+S3hh6WZVEg==} 164 + engines: {node: '>=18.7.0'} 165 + 166 + '@atproto/crypto@0.4.5': 167 + resolution: {integrity: sha512-n40aKkMoCatP0u9Yvhrdk6fXyOHFDDbkdm4h4HCyWW+KlKl8iXfD5iV+ECq+w5BM+QH25aIpt3/j6EUNerhLxw==} 168 + engines: {node: '>=18.7.0'} 169 + 170 + '@atproto/did@0.2.3': 171 + resolution: {integrity: sha512-VI8JJkSizvM2cHYJa37WlbzeCm5tWpojyc1/Zy8q8OOjyoy6X4S4BEfoP941oJcpxpMTObamibQIXQDo7tnIjg==} 172 + 173 + '@atproto/jwk-jose@0.1.11': 174 + resolution: {integrity: sha512-i4Fnr2sTBYmMmHXl7NJh8GrCH+tDQEVWrcDMDnV5DjJfkgT17wIqvojIw9SNbSL4Uf0OtfEv6AgG0A+mgh8b5Q==} 175 + 176 + '@atproto/jwk-webcrypto@0.2.0': 177 + resolution: {integrity: sha512-UmgRrrEAkWvxwhlwe30UmDOdTEFidlIzBC7C3cCbeJMcBN1x8B3KH+crXrsTqfWQBG58mXgt8wgSK3Kxs2LhFg==} 178 + 179 + '@atproto/jwk@0.6.0': 180 + resolution: {integrity: sha512-bDoJPvt7TrQVi/rBfBrSSpGykhtIriKxeYCYQTiPRKFfyRhbgpElF0wPXADjIswnbzZdOwbY63az4E/CFVT3Tw==} 181 + 182 + '@atproto/lex-cbor@0.0.3': 183 + resolution: {integrity: sha512-N8lCV3kK5ZcjSOWxKLWqzlnaSpK4isjXRZ0EqApl/5y9KB64s78hQ/U3KIE5qnPRlBbW5kSH3YACoU27u9nTOA==} 184 + 185 + '@atproto/lex-data@0.0.3': 186 + resolution: {integrity: sha512-ivo1IpY/EX+RIpxPgCf4cPhQo5bfu4nrpa1vJCt8hCm9SfoonJkDFGa0n4SMw4JnXZoUcGcrJ46L+D8bH6GI2g==} 187 + 188 + '@atproto/lex-json@0.0.3': 189 + resolution: {integrity: sha512-ZVcY7XlRfdPYvQQ2WroKUepee0+NCovrSXgXURM3Xv+n5jflJCoczguROeRr8sN0xvT0ZbzMrDNHCUYKNnxcjw==} 190 + 191 + '@atproto/lexicon@0.6.0': 192 + resolution: {integrity: sha512-5veb8aD+J5M0qszLJ+73KSFsFrJBgAY/nM1TSAJvGY7fNc9ZAT+PSUlmIyrdye9YznAZ07yktalls/TwNV7cHQ==} 193 + 194 + '@atproto/oauth-client-node@0.3.13': 195 + resolution: {integrity: sha512-k2qT5QM6Mj5I412IZOnktShmI1A5YbwLmLM4BkeEcbcOm7kU1Cr/H/zUC/zniCIj641ZudiXU80Bsyw4A6tejA==} 196 + engines: {node: '>=18.7.0'} 197 + 198 + '@atproto/oauth-client@0.5.11': 199 + resolution: {integrity: sha512-KyxKpnF988BI3m+4NNYDgkN6a2sPORD9uaOEGP4tnJLOvhMVHyATWwq3Jx4LOYotTFDOvLdheWcI1G9DozE88w==} 200 + 201 + '@atproto/oauth-types@0.5.2': 202 + resolution: {integrity: sha512-9DCDvtvCanTwAaU5UakYDO0hzcOITS3RutK5zfLytE5Y9unj0REmTDdN8Xd8YCfUJl7T/9pYpf04Uyq7bFTASg==} 203 + 204 + '@atproto/syntax@0.4.2': 205 + resolution: {integrity: sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA==} 206 + 207 + '@atproto/xrpc@0.7.7': 208 + resolution: {integrity: sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==} 209 + 210 + '@badrap/valita@0.4.6': 211 + resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==} 212 + engines: {node: '>= 18'} 213 + 214 + '@drizzle-team/brocli@0.10.2': 215 + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} 216 + 217 + '@esbuild-kit/core-utils@3.3.2': 218 + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} 219 + deprecated: 'Merged into tsx: https://tsx.is' 220 + 221 + '@esbuild-kit/esm-loader@2.6.5': 222 + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} 223 + deprecated: 'Merged into tsx: https://tsx.is' 224 + 225 + '@esbuild/aix-ppc64@0.25.12': 226 + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} 227 + engines: {node: '>=18'} 228 + cpu: [ppc64] 229 + os: [aix] 230 + 231 + '@esbuild/android-arm64@0.18.20': 232 + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 233 + engines: {node: '>=12'} 234 + cpu: [arm64] 235 + os: [android] 236 + 237 + '@esbuild/android-arm64@0.25.12': 238 + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} 239 + engines: {node: '>=18'} 240 + cpu: [arm64] 241 + os: [android] 242 + 243 + '@esbuild/android-arm@0.18.20': 244 + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 245 + engines: {node: '>=12'} 246 + cpu: [arm] 247 + os: [android] 248 + 249 + '@esbuild/android-arm@0.25.12': 250 + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} 251 + engines: {node: '>=18'} 252 + cpu: [arm] 253 + os: [android] 254 + 255 + '@esbuild/android-x64@0.18.20': 256 + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 257 + engines: {node: '>=12'} 258 + cpu: [x64] 259 + os: [android] 260 + 261 + '@esbuild/android-x64@0.25.12': 262 + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} 263 + engines: {node: '>=18'} 264 + cpu: [x64] 265 + os: [android] 266 + 267 + '@esbuild/darwin-arm64@0.18.20': 268 + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 269 + engines: {node: '>=12'} 270 + cpu: [arm64] 271 + os: [darwin] 272 + 273 + '@esbuild/darwin-arm64@0.25.12': 274 + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} 275 + engines: {node: '>=18'} 276 + cpu: [arm64] 277 + os: [darwin] 278 + 279 + '@esbuild/darwin-x64@0.18.20': 280 + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 281 + engines: {node: '>=12'} 282 + cpu: [x64] 283 + os: [darwin] 284 + 285 + '@esbuild/darwin-x64@0.25.12': 286 + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} 287 + engines: {node: '>=18'} 288 + cpu: [x64] 289 + os: [darwin] 290 + 291 + '@esbuild/freebsd-arm64@0.18.20': 292 + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 293 + engines: {node: '>=12'} 294 + cpu: [arm64] 295 + os: [freebsd] 296 + 297 + '@esbuild/freebsd-arm64@0.25.12': 298 + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} 299 + engines: {node: '>=18'} 300 + cpu: [arm64] 301 + os: [freebsd] 302 + 303 + '@esbuild/freebsd-x64@0.18.20': 304 + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 305 + engines: {node: '>=12'} 306 + cpu: [x64] 307 + os: [freebsd] 308 + 309 + '@esbuild/freebsd-x64@0.25.12': 310 + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} 311 + engines: {node: '>=18'} 312 + cpu: [x64] 313 + os: [freebsd] 314 + 315 + '@esbuild/linux-arm64@0.18.20': 316 + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 317 + engines: {node: '>=12'} 318 + cpu: [arm64] 319 + os: [linux] 320 + 321 + '@esbuild/linux-arm64@0.25.12': 322 + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} 323 + engines: {node: '>=18'} 324 + cpu: [arm64] 325 + os: [linux] 326 + 327 + '@esbuild/linux-arm@0.18.20': 328 + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 329 + engines: {node: '>=12'} 330 + cpu: [arm] 331 + os: [linux] 332 + 333 + '@esbuild/linux-arm@0.25.12': 334 + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} 335 + engines: {node: '>=18'} 336 + cpu: [arm] 337 + os: [linux] 338 + 339 + '@esbuild/linux-ia32@0.18.20': 340 + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 341 + engines: {node: '>=12'} 342 + cpu: [ia32] 343 + os: [linux] 344 + 345 + '@esbuild/linux-ia32@0.25.12': 346 + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} 347 + engines: {node: '>=18'} 348 + cpu: [ia32] 349 + os: [linux] 350 + 351 + '@esbuild/linux-loong64@0.18.20': 352 + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 353 + engines: {node: '>=12'} 354 + cpu: [loong64] 355 + os: [linux] 356 + 357 + '@esbuild/linux-loong64@0.25.12': 358 + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} 359 + engines: {node: '>=18'} 360 + cpu: [loong64] 361 + os: [linux] 362 + 363 + '@esbuild/linux-mips64el@0.18.20': 364 + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 365 + engines: {node: '>=12'} 366 + cpu: [mips64el] 367 + os: [linux] 368 + 369 + '@esbuild/linux-mips64el@0.25.12': 370 + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} 371 + engines: {node: '>=18'} 372 + cpu: [mips64el] 373 + os: [linux] 374 + 375 + '@esbuild/linux-ppc64@0.18.20': 376 + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 377 + engines: {node: '>=12'} 378 + cpu: [ppc64] 379 + os: [linux] 380 + 381 + '@esbuild/linux-ppc64@0.25.12': 382 + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} 383 + engines: {node: '>=18'} 384 + cpu: [ppc64] 385 + os: [linux] 386 + 387 + '@esbuild/linux-riscv64@0.18.20': 388 + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 389 + engines: {node: '>=12'} 390 + cpu: [riscv64] 391 + os: [linux] 392 + 393 + '@esbuild/linux-riscv64@0.25.12': 394 + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} 395 + engines: {node: '>=18'} 396 + cpu: [riscv64] 397 + os: [linux] 398 + 399 + '@esbuild/linux-s390x@0.18.20': 400 + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 401 + engines: {node: '>=12'} 402 + cpu: [s390x] 403 + os: [linux] 404 + 405 + '@esbuild/linux-s390x@0.25.12': 406 + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} 407 + engines: {node: '>=18'} 408 + cpu: [s390x] 409 + os: [linux] 410 + 411 + '@esbuild/linux-x64@0.18.20': 412 + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 413 + engines: {node: '>=12'} 414 + cpu: [x64] 415 + os: [linux] 416 + 417 + '@esbuild/linux-x64@0.25.12': 418 + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} 419 + engines: {node: '>=18'} 420 + cpu: [x64] 421 + os: [linux] 422 + 423 + '@esbuild/netbsd-arm64@0.25.12': 424 + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} 425 + engines: {node: '>=18'} 426 + cpu: [arm64] 427 + os: [netbsd] 428 + 429 + '@esbuild/netbsd-x64@0.18.20': 430 + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 431 + engines: {node: '>=12'} 432 + cpu: [x64] 433 + os: [netbsd] 434 + 435 + '@esbuild/netbsd-x64@0.25.12': 436 + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} 437 + engines: {node: '>=18'} 438 + cpu: [x64] 439 + os: [netbsd] 440 + 441 + '@esbuild/openbsd-arm64@0.25.12': 442 + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} 443 + engines: {node: '>=18'} 444 + cpu: [arm64] 445 + os: [openbsd] 446 + 447 + '@esbuild/openbsd-x64@0.18.20': 448 + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 449 + engines: {node: '>=12'} 450 + cpu: [x64] 451 + os: [openbsd] 452 + 453 + '@esbuild/openbsd-x64@0.25.12': 454 + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} 455 + engines: {node: '>=18'} 456 + cpu: [x64] 457 + os: [openbsd] 458 + 459 + '@esbuild/openharmony-arm64@0.25.12': 460 + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} 461 + engines: {node: '>=18'} 462 + cpu: [arm64] 463 + os: [openharmony] 464 + 465 + '@esbuild/sunos-x64@0.18.20': 466 + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 467 + engines: {node: '>=12'} 468 + cpu: [x64] 469 + os: [sunos] 470 + 471 + '@esbuild/sunos-x64@0.25.12': 472 + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} 473 + engines: {node: '>=18'} 474 + cpu: [x64] 475 + os: [sunos] 476 + 477 + '@esbuild/win32-arm64@0.18.20': 478 + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 479 + engines: {node: '>=12'} 480 + cpu: [arm64] 481 + os: [win32] 482 + 483 + '@esbuild/win32-arm64@0.25.12': 484 + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} 485 + engines: {node: '>=18'} 486 + cpu: [arm64] 487 + os: [win32] 488 + 489 + '@esbuild/win32-ia32@0.18.20': 490 + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 491 + engines: {node: '>=12'} 492 + cpu: [ia32] 493 + os: [win32] 494 + 495 + '@esbuild/win32-ia32@0.25.12': 496 + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} 497 + engines: {node: '>=18'} 498 + cpu: [ia32] 499 + os: [win32] 500 + 501 + '@esbuild/win32-x64@0.18.20': 502 + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 503 + engines: {node: '>=12'} 504 + cpu: [x64] 505 + os: [win32] 506 + 507 + '@esbuild/win32-x64@0.25.12': 508 + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} 509 + engines: {node: '>=18'} 510 + cpu: [x64] 511 + os: [win32] 512 + 513 + '@eslint-community/eslint-utils@4.9.0': 514 + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 515 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 516 + peerDependencies: 517 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 518 + 519 + '@eslint-community/regexpp@4.12.2': 520 + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 521 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 522 + 523 + '@eslint/compat@1.4.1': 524 + resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} 525 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 526 + peerDependencies: 527 + eslint: ^8.40 || 9 528 + peerDependenciesMeta: 529 + eslint: 530 + optional: true 531 + 532 + '@eslint/config-array@0.21.1': 533 + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 534 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 535 + 536 + '@eslint/config-helpers@0.4.2': 537 + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 538 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 539 + 540 + '@eslint/core@0.17.0': 541 + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 542 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 543 + 544 + '@eslint/eslintrc@3.3.3': 545 + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} 546 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 547 + 548 + '@eslint/js@9.39.1': 549 + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} 550 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 551 + 552 + '@eslint/object-schema@2.1.7': 553 + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 554 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 555 + 556 + '@eslint/plugin-kit@0.4.1': 557 + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 558 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 559 + 560 + '@humanfs/core@0.19.1': 561 + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 562 + engines: {node: '>=18.18.0'} 563 + 564 + '@humanfs/node@0.16.7': 565 + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 566 + engines: {node: '>=18.18.0'} 567 + 568 + '@humanwhocodes/module-importer@1.0.1': 569 + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 570 + engines: {node: '>=12.22'} 571 + 572 + '@humanwhocodes/retry@0.4.3': 573 + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 574 + engines: {node: '>=18.18'} 575 + 576 + '@jridgewell/gen-mapping@0.3.13': 577 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 578 + 579 + '@jridgewell/remapping@2.3.5': 580 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 581 + 582 + '@jridgewell/resolve-uri@3.1.2': 583 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 584 + engines: {node: '>=6.0.0'} 585 + 586 + '@jridgewell/sourcemap-codec@1.5.5': 587 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 588 + 589 + '@jridgewell/trace-mapping@0.3.31': 590 + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 591 + 592 + '@noble/curves@1.9.7': 593 + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} 594 + engines: {node: ^14.21.3 || >=16} 595 + 596 + '@noble/hashes@1.8.0': 597 + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} 598 + engines: {node: ^14.21.3 || >=16} 599 + 600 + '@oslojs/asn1@1.0.0': 601 + resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} 602 + 603 + '@oslojs/binary@1.0.0': 604 + resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} 605 + 606 + '@oslojs/crypto@1.0.1': 607 + resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} 608 + 609 + '@oslojs/encoding@1.1.0': 610 + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} 611 + 612 + '@pinojs/redact@0.4.0': 613 + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} 614 + 615 + '@polka/url@1.0.0-next.29': 616 + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 617 + 618 + '@rollup/plugin-commonjs@28.0.9': 619 + resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==} 620 + engines: {node: '>=16.0.0 || 14 >= 14.17'} 621 + peerDependencies: 622 + rollup: ^2.68.0||^3.0.0||^4.0.0 623 + peerDependenciesMeta: 624 + rollup: 625 + optional: true 626 + 627 + '@rollup/plugin-json@6.1.0': 628 + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} 629 + engines: {node: '>=14.0.0'} 630 + peerDependencies: 631 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 632 + peerDependenciesMeta: 633 + rollup: 634 + optional: true 635 + 636 + '@rollup/plugin-node-resolve@16.0.3': 637 + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} 638 + engines: {node: '>=14.0.0'} 639 + peerDependencies: 640 + rollup: ^2.78.0||^3.0.0||^4.0.0 641 + peerDependenciesMeta: 642 + rollup: 643 + optional: true 644 + 645 + '@rollup/pluginutils@5.3.0': 646 + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} 647 + engines: {node: '>=14.0.0'} 648 + peerDependencies: 649 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 650 + peerDependenciesMeta: 651 + rollup: 652 + optional: true 653 + 654 + '@rollup/rollup-android-arm-eabi@4.53.3': 655 + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} 656 + cpu: [arm] 657 + os: [android] 658 + 659 + '@rollup/rollup-android-arm64@4.53.3': 660 + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} 661 + cpu: [arm64] 662 + os: [android] 663 + 664 + '@rollup/rollup-darwin-arm64@4.53.3': 665 + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} 666 + cpu: [arm64] 667 + os: [darwin] 668 + 669 + '@rollup/rollup-darwin-x64@4.53.3': 670 + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} 671 + cpu: [x64] 672 + os: [darwin] 673 + 674 + '@rollup/rollup-freebsd-arm64@4.53.3': 675 + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} 676 + cpu: [arm64] 677 + os: [freebsd] 678 + 679 + '@rollup/rollup-freebsd-x64@4.53.3': 680 + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} 681 + cpu: [x64] 682 + os: [freebsd] 683 + 684 + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 685 + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} 686 + cpu: [arm] 687 + os: [linux] 688 + 689 + '@rollup/rollup-linux-arm-musleabihf@4.53.3': 690 + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} 691 + cpu: [arm] 692 + os: [linux] 693 + 694 + '@rollup/rollup-linux-arm64-gnu@4.53.3': 695 + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} 696 + cpu: [arm64] 697 + os: [linux] 698 + 699 + '@rollup/rollup-linux-arm64-musl@4.53.3': 700 + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} 701 + cpu: [arm64] 702 + os: [linux] 703 + 704 + '@rollup/rollup-linux-loong64-gnu@4.53.3': 705 + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} 706 + cpu: [loong64] 707 + os: [linux] 708 + 709 + '@rollup/rollup-linux-ppc64-gnu@4.53.3': 710 + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} 711 + cpu: [ppc64] 712 + os: [linux] 713 + 714 + '@rollup/rollup-linux-riscv64-gnu@4.53.3': 715 + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} 716 + cpu: [riscv64] 717 + os: [linux] 718 + 719 + '@rollup/rollup-linux-riscv64-musl@4.53.3': 720 + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} 721 + cpu: [riscv64] 722 + os: [linux] 723 + 724 + '@rollup/rollup-linux-s390x-gnu@4.53.3': 725 + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} 726 + cpu: [s390x] 727 + os: [linux] 728 + 729 + '@rollup/rollup-linux-x64-gnu@4.53.3': 730 + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} 731 + cpu: [x64] 732 + os: [linux] 733 + 734 + '@rollup/rollup-linux-x64-musl@4.53.3': 735 + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} 736 + cpu: [x64] 737 + os: [linux] 738 + 739 + '@rollup/rollup-openharmony-arm64@4.53.3': 740 + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} 741 + cpu: [arm64] 742 + os: [openharmony] 743 + 744 + '@rollup/rollup-win32-arm64-msvc@4.53.3': 745 + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} 746 + cpu: [arm64] 747 + os: [win32] 748 + 749 + '@rollup/rollup-win32-ia32-msvc@4.53.3': 750 + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} 751 + cpu: [ia32] 752 + os: [win32] 753 + 754 + '@rollup/rollup-win32-x64-gnu@4.53.3': 755 + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} 756 + cpu: [x64] 757 + os: [win32] 758 + 759 + '@rollup/rollup-win32-x64-msvc@4.53.3': 760 + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} 761 + cpu: [x64] 762 + os: [win32] 763 + 764 + '@standard-schema/spec@1.0.0': 765 + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} 766 + 767 + '@sveltejs/acorn-typescript@1.0.8': 768 + resolution: {integrity: sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==} 769 + peerDependencies: 770 + acorn: ^8.9.0 771 + 772 + '@sveltejs/adapter-auto@7.0.0': 773 + resolution: {integrity: sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw==} 774 + peerDependencies: 775 + '@sveltejs/kit': ^2.0.0 776 + 777 + '@sveltejs/adapter-node@5.4.0': 778 + resolution: {integrity: sha512-NMsrwGVPEn+J73zH83Uhss/hYYZN6zT3u31R3IHAn3MiKC3h8fjmIAhLfTSOeNHr5wPYfjjMg8E+1gyFgyrEcQ==} 779 + peerDependencies: 780 + '@sveltejs/kit': ^2.4.0 781 + 782 + '@sveltejs/kit@2.49.2': 783 + resolution: {integrity: sha512-Vp3zX/qlwerQmHMP6x0Ry1oY7eKKRcOWGc2P59srOp4zcqyn+etJyQpELgOi4+ZSUgteX8Y387NuwruLgGXLUQ==} 784 + engines: {node: '>=18.13'} 785 + hasBin: true 786 + peerDependencies: 787 + '@opentelemetry/api': ^1.0.0 788 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 789 + svelte: ^4.0.0 || ^5.0.0-next.0 790 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 791 + peerDependenciesMeta: 792 + '@opentelemetry/api': 793 + optional: true 794 + 795 + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': 796 + resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} 797 + engines: {node: ^20.19 || ^22.12 || >=24} 798 + peerDependencies: 799 + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 800 + svelte: ^5.0.0 801 + vite: ^6.3.0 || ^7.0.0 802 + 803 + '@sveltejs/vite-plugin-svelte@6.2.1': 804 + resolution: {integrity: sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==} 805 + engines: {node: ^20.19 || ^22.12 || >=24} 806 + peerDependencies: 807 + svelte: ^5.0.0 808 + vite: ^6.3.0 || ^7.0.0 809 + 810 + '@types/better-sqlite3@7.6.13': 811 + resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} 812 + 813 + '@types/cookie@0.6.0': 814 + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 815 + 816 + '@types/estree@1.0.8': 817 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 818 + 819 + '@types/json-schema@7.0.15': 820 + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 821 + 822 + '@types/node@24.10.2': 823 + resolution: {integrity: sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==} 824 + 825 + '@types/resolve@1.20.2': 826 + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 827 + 828 + '@typescript-eslint/eslint-plugin@8.49.0': 829 + resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==} 830 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 831 + peerDependencies: 832 + '@typescript-eslint/parser': ^8.49.0 833 + eslint: ^8.57.0 || ^9.0.0 834 + typescript: '>=4.8.4 <6.0.0' 835 + 836 + '@typescript-eslint/parser@8.49.0': 837 + resolution: {integrity: sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==} 838 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 839 + peerDependencies: 840 + eslint: ^8.57.0 || ^9.0.0 841 + typescript: '>=4.8.4 <6.0.0' 842 + 843 + '@typescript-eslint/project-service@8.49.0': 844 + resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} 845 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 846 + peerDependencies: 847 + typescript: '>=4.8.4 <6.0.0' 848 + 849 + '@typescript-eslint/scope-manager@8.49.0': 850 + resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} 851 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 852 + 853 + '@typescript-eslint/tsconfig-utils@8.49.0': 854 + resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==} 855 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 856 + peerDependencies: 857 + typescript: '>=4.8.4 <6.0.0' 858 + 859 + '@typescript-eslint/type-utils@8.49.0': 860 + resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==} 861 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 862 + peerDependencies: 863 + eslint: ^8.57.0 || ^9.0.0 864 + typescript: '>=4.8.4 <6.0.0' 865 + 866 + '@typescript-eslint/types@8.49.0': 867 + resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} 868 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 869 + 870 + '@typescript-eslint/typescript-estree@8.49.0': 871 + resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==} 872 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 873 + peerDependencies: 874 + typescript: '>=4.8.4 <6.0.0' 875 + 876 + '@typescript-eslint/utils@8.49.0': 877 + resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==} 878 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 879 + peerDependencies: 880 + eslint: ^8.57.0 || ^9.0.0 881 + typescript: '>=4.8.4 <6.0.0' 882 + 883 + '@typescript-eslint/visitor-keys@8.49.0': 884 + resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} 885 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 886 + 887 + abort-controller@3.0.0: 888 + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 889 + engines: {node: '>=6.5'} 890 + 891 + acorn-jsx@5.3.2: 892 + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 893 + peerDependencies: 894 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 895 + 896 + acorn@8.15.0: 897 + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 898 + engines: {node: '>=0.4.0'} 899 + hasBin: true 900 + 901 + ajv@6.12.6: 902 + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 903 + 904 + ansi-styles@4.3.0: 905 + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 906 + engines: {node: '>=8'} 907 + 908 + argparse@2.0.1: 909 + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 910 + 911 + aria-query@5.3.2: 912 + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 913 + engines: {node: '>= 0.4'} 914 + 915 + atomic-sleep@1.0.0: 916 + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 917 + engines: {node: '>=8.0.0'} 918 + 919 + await-lock@2.2.2: 920 + resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} 921 + 922 + axobject-query@4.1.0: 923 + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 924 + engines: {node: '>= 0.4'} 925 + 926 + balanced-match@1.0.2: 927 + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 928 + 929 + base64-js@1.5.1: 930 + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 931 + 932 + better-sqlite3@12.4.1: 933 + resolution: {integrity: sha512-3yVdyZhklTiNrtg+4WqHpJpFDd+WHTg2oM7UcR80GqL05AOV0xEJzc6qNvFYoEtE+hRp1n9MpN6/+4yhlGkDXQ==} 934 + engines: {node: 20.x || 22.x || 23.x || 24.x} 935 + 936 + bindings@1.5.0: 937 + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 938 + 939 + bl@4.1.0: 940 + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 941 + 942 + brace-expansion@1.1.12: 943 + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 944 + 945 + brace-expansion@2.0.2: 946 + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 947 + 948 + buffer-from@1.1.2: 949 + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 950 + 951 + buffer@5.7.1: 952 + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 953 + 954 + buffer@6.0.3: 955 + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 956 + 957 + callsites@3.1.0: 958 + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 959 + engines: {node: '>=6'} 960 + 961 + chalk@4.1.2: 962 + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 963 + engines: {node: '>=10'} 964 + 965 + chokidar@4.0.3: 966 + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 967 + engines: {node: '>= 14.16.0'} 968 + 969 + chownr@1.1.4: 970 + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 971 + 972 + clsx@2.1.1: 973 + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 974 + engines: {node: '>=6'} 975 + 976 + color-convert@2.0.1: 977 + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 978 + engines: {node: '>=7.0.0'} 979 + 980 + color-name@1.1.4: 981 + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 982 + 983 + commondir@1.0.1: 984 + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 985 + 986 + concat-map@0.0.1: 987 + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 988 + 989 + cookie@0.6.0: 990 + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 991 + engines: {node: '>= 0.6'} 992 + 993 + core-js@3.47.0: 994 + resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} 995 + 996 + cron-parser@4.9.0: 997 + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} 998 + engines: {node: '>=12.0.0'} 999 + 1000 + cross-spawn@7.0.6: 1001 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1002 + engines: {node: '>= 8'} 1003 + 1004 + cssesc@3.0.0: 1005 + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1006 + engines: {node: '>=4'} 1007 + hasBin: true 1008 + 1009 + debug@4.4.3: 1010 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 1011 + engines: {node: '>=6.0'} 1012 + peerDependencies: 1013 + supports-color: '*' 1014 + peerDependenciesMeta: 1015 + supports-color: 1016 + optional: true 1017 + 1018 + decompress-response@6.0.0: 1019 + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 1020 + engines: {node: '>=10'} 1021 + 1022 + deep-extend@0.6.0: 1023 + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 1024 + engines: {node: '>=4.0.0'} 1025 + 1026 + deep-is@0.1.4: 1027 + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1028 + 1029 + deepmerge@4.3.1: 1030 + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1031 + engines: {node: '>=0.10.0'} 1032 + 1033 + detect-libc@2.1.2: 1034 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 1035 + engines: {node: '>=8'} 1036 + 1037 + devalue@5.6.0: 1038 + resolution: {integrity: sha512-BaD1s81TFFqbD6Uknni42TrolvEWA1Ih5L+OiHWmi4OYMJVwAYPGtha61I9KxTf52OvVHozHyjPu8zljqdF3uA==} 1039 + 1040 + dotenv@17.2.3: 1041 + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} 1042 + engines: {node: '>=12'} 1043 + 1044 + drizzle-kit@0.31.8: 1045 + resolution: {integrity: sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==} 1046 + hasBin: true 1047 + 1048 + drizzle-orm@0.44.7: 1049 + resolution: {integrity: sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==} 1050 + peerDependencies: 1051 + '@aws-sdk/client-rds-data': '>=3' 1052 + '@cloudflare/workers-types': '>=4' 1053 + '@electric-sql/pglite': '>=0.2.0' 1054 + '@libsql/client': '>=0.10.0' 1055 + '@libsql/client-wasm': '>=0.10.0' 1056 + '@neondatabase/serverless': '>=0.10.0' 1057 + '@op-engineering/op-sqlite': '>=2' 1058 + '@opentelemetry/api': ^1.4.1 1059 + '@planetscale/database': '>=1.13' 1060 + '@prisma/client': '*' 1061 + '@tidbcloud/serverless': '*' 1062 + '@types/better-sqlite3': '*' 1063 + '@types/pg': '*' 1064 + '@types/sql.js': '*' 1065 + '@upstash/redis': '>=1.34.7' 1066 + '@vercel/postgres': '>=0.8.0' 1067 + '@xata.io/client': '*' 1068 + better-sqlite3: '>=7' 1069 + bun-types: '*' 1070 + expo-sqlite: '>=14.0.0' 1071 + gel: '>=2' 1072 + knex: '*' 1073 + kysely: '*' 1074 + mysql2: '>=2' 1075 + pg: '>=8' 1076 + postgres: '>=3' 1077 + prisma: '*' 1078 + sql.js: '>=1' 1079 + sqlite3: '>=5' 1080 + peerDependenciesMeta: 1081 + '@aws-sdk/client-rds-data': 1082 + optional: true 1083 + '@cloudflare/workers-types': 1084 + optional: true 1085 + '@electric-sql/pglite': 1086 + optional: true 1087 + '@libsql/client': 1088 + optional: true 1089 + '@libsql/client-wasm': 1090 + optional: true 1091 + '@neondatabase/serverless': 1092 + optional: true 1093 + '@op-engineering/op-sqlite': 1094 + optional: true 1095 + '@opentelemetry/api': 1096 + optional: true 1097 + '@planetscale/database': 1098 + optional: true 1099 + '@prisma/client': 1100 + optional: true 1101 + '@tidbcloud/serverless': 1102 + optional: true 1103 + '@types/better-sqlite3': 1104 + optional: true 1105 + '@types/pg': 1106 + optional: true 1107 + '@types/sql.js': 1108 + optional: true 1109 + '@upstash/redis': 1110 + optional: true 1111 + '@vercel/postgres': 1112 + optional: true 1113 + '@xata.io/client': 1114 + optional: true 1115 + better-sqlite3: 1116 + optional: true 1117 + bun-types: 1118 + optional: true 1119 + expo-sqlite: 1120 + optional: true 1121 + gel: 1122 + optional: true 1123 + knex: 1124 + optional: true 1125 + kysely: 1126 + optional: true 1127 + mysql2: 1128 + optional: true 1129 + pg: 1130 + optional: true 1131 + postgres: 1132 + optional: true 1133 + prisma: 1134 + optional: true 1135 + sql.js: 1136 + optional: true 1137 + sqlite3: 1138 + optional: true 1139 + 1140 + end-of-stream@1.4.5: 1141 + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} 1142 + 1143 + esbuild-register@3.6.0: 1144 + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} 1145 + peerDependencies: 1146 + esbuild: '>=0.12 <1' 1147 + 1148 + esbuild@0.18.20: 1149 + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 1150 + engines: {node: '>=12'} 1151 + hasBin: true 1152 + 1153 + esbuild@0.25.12: 1154 + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} 1155 + engines: {node: '>=18'} 1156 + hasBin: true 1157 + 1158 + escape-string-regexp@4.0.0: 1159 + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1160 + engines: {node: '>=10'} 1161 + 1162 + eslint-plugin-svelte@3.13.1: 1163 + resolution: {integrity: sha512-Ng+kV/qGS8P/isbNYVE3sJORtubB+yLEcYICMkUWNaDTb0SwZni/JhAYXh/Dz/q2eThUwWY0VMPZ//KYD1n3eQ==} 1164 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1165 + peerDependencies: 1166 + eslint: ^8.57.1 || ^9.0.0 1167 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 1168 + peerDependenciesMeta: 1169 + svelte: 1170 + optional: true 1171 + 1172 + eslint-scope@8.4.0: 1173 + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 1174 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1175 + 1176 + eslint-visitor-keys@3.4.3: 1177 + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1178 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1179 + 1180 + eslint-visitor-keys@4.2.1: 1181 + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 1182 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1183 + 1184 + eslint@9.39.1: 1185 + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} 1186 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1187 + hasBin: true 1188 + peerDependencies: 1189 + jiti: '*' 1190 + peerDependenciesMeta: 1191 + jiti: 1192 + optional: true 1193 + 1194 + esm-env@1.2.2: 1195 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 1196 + 1197 + espree@10.4.0: 1198 + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 1199 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1200 + 1201 + esquery@1.6.0: 1202 + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 1203 + engines: {node: '>=0.10'} 1204 + 1205 + esrap@2.2.1: 1206 + resolution: {integrity: sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==} 1207 + 1208 + esrecurse@4.3.0: 1209 + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1210 + engines: {node: '>=4.0'} 1211 + 1212 + estraverse@5.3.0: 1213 + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1214 + engines: {node: '>=4.0'} 1215 + 1216 + estree-walker@2.0.2: 1217 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1218 + 1219 + esutils@2.0.3: 1220 + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1221 + engines: {node: '>=0.10.0'} 1222 + 1223 + event-target-shim@5.0.1: 1224 + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 1225 + engines: {node: '>=6'} 1226 + 1227 + events@3.3.0: 1228 + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 1229 + engines: {node: '>=0.8.x'} 1230 + 1231 + expand-template@2.0.3: 1232 + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 1233 + engines: {node: '>=6'} 1234 + 1235 + fast-deep-equal@3.1.3: 1236 + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1237 + 1238 + fast-json-stable-stringify@2.1.0: 1239 + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1240 + 1241 + fast-levenshtein@2.0.6: 1242 + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1243 + 1244 + fast-redact@3.5.0: 1245 + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} 1246 + engines: {node: '>=6'} 1247 + 1248 + fdir@6.5.0: 1249 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 1250 + engines: {node: '>=12.0.0'} 1251 + peerDependencies: 1252 + picomatch: ^3 || ^4 1253 + peerDependenciesMeta: 1254 + picomatch: 1255 + optional: true 1256 + 1257 + file-entry-cache@8.0.0: 1258 + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1259 + engines: {node: '>=16.0.0'} 1260 + 1261 + file-uri-to-path@1.0.0: 1262 + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 1263 + 1264 + find-up@5.0.0: 1265 + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1266 + engines: {node: '>=10'} 1267 + 1268 + flat-cache@4.0.1: 1269 + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1270 + engines: {node: '>=16'} 1271 + 1272 + flatted@3.3.3: 1273 + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 1274 + 1275 + fs-constants@1.0.0: 1276 + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 1277 + 1278 + fsevents@2.3.3: 1279 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1280 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1281 + os: [darwin] 1282 + 1283 + function-bind@1.1.2: 1284 + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1285 + 1286 + get-tsconfig@4.13.0: 1287 + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 1288 + 1289 + github-from-package@0.0.0: 1290 + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} 1291 + 1292 + glob-parent@6.0.2: 1293 + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1294 + engines: {node: '>=10.13.0'} 1295 + 1296 + globals@14.0.0: 1297 + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1298 + engines: {node: '>=18'} 1299 + 1300 + globals@16.5.0: 1301 + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} 1302 + engines: {node: '>=18'} 1303 + 1304 + has-flag@4.0.0: 1305 + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1306 + engines: {node: '>=8'} 1307 + 1308 + hasown@2.0.2: 1309 + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1310 + engines: {node: '>= 0.4'} 1311 + 1312 + ieee754@1.2.1: 1313 + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1314 + 1315 + ignore@5.3.2: 1316 + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1317 + engines: {node: '>= 4'} 1318 + 1319 + ignore@7.0.5: 1320 + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 1321 + engines: {node: '>= 4'} 1322 + 1323 + import-fresh@3.3.1: 1324 + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1325 + engines: {node: '>=6'} 1326 + 1327 + imurmurhash@0.1.4: 1328 + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1329 + engines: {node: '>=0.8.19'} 1330 + 1331 + inherits@2.0.4: 1332 + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1333 + 1334 + ini@1.3.8: 1335 + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1336 + 1337 + ipaddr.js@2.3.0: 1338 + resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} 1339 + engines: {node: '>= 10'} 1340 + 1341 + is-core-module@2.16.1: 1342 + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1343 + engines: {node: '>= 0.4'} 1344 + 1345 + is-extglob@2.1.1: 1346 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1347 + engines: {node: '>=0.10.0'} 1348 + 1349 + is-glob@4.0.3: 1350 + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1351 + engines: {node: '>=0.10.0'} 1352 + 1353 + is-module@1.0.0: 1354 + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 1355 + 1356 + is-reference@1.2.1: 1357 + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 1358 + 1359 + is-reference@3.0.3: 1360 + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 1361 + 1362 + isexe@2.0.0: 1363 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1364 + 1365 + iso-datestring-validator@2.2.2: 1366 + resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} 1367 + 1368 + jose@5.10.0: 1369 + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} 1370 + 1371 + js-yaml@4.1.1: 1372 + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 1373 + hasBin: true 1374 + 1375 + json-buffer@3.0.1: 1376 + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1377 + 1378 + json-schema-traverse@0.4.1: 1379 + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1380 + 1381 + json-stable-stringify-without-jsonify@1.0.1: 1382 + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1383 + 1384 + keyv@4.5.4: 1385 + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1386 + 1387 + kleur@4.1.5: 1388 + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1389 + engines: {node: '>=6'} 1390 + 1391 + known-css-properties@0.37.0: 1392 + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} 1393 + 1394 + levn@0.4.1: 1395 + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1396 + engines: {node: '>= 0.8.0'} 1397 + 1398 + lilconfig@2.1.0: 1399 + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1400 + engines: {node: '>=10'} 1401 + 1402 + locate-character@3.0.0: 1403 + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 1404 + 1405 + locate-path@6.0.0: 1406 + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1407 + engines: {node: '>=10'} 1408 + 1409 + lodash.merge@4.6.2: 1410 + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1411 + 1412 + long-timeout@0.1.1: 1413 + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} 1414 + 1415 + lru-cache@10.4.3: 1416 + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1417 + 1418 + luxon@3.7.2: 1419 + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} 1420 + engines: {node: '>=12'} 1421 + 1422 + magic-string@0.30.21: 1423 + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1424 + 1425 + mimic-response@3.1.0: 1426 + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1427 + engines: {node: '>=10'} 1428 + 1429 + minimatch@3.1.2: 1430 + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1431 + 1432 + minimatch@9.0.5: 1433 + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1434 + engines: {node: '>=16 || 14 >=14.17'} 1435 + 1436 + minimist@1.2.8: 1437 + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1438 + 1439 + mkdirp-classic@0.5.3: 1440 + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1441 + 1442 + mri@1.2.0: 1443 + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1444 + engines: {node: '>=4'} 1445 + 1446 + mrmime@2.0.1: 1447 + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1448 + engines: {node: '>=10'} 1449 + 1450 + ms@2.1.3: 1451 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1452 + 1453 + multiformats@9.9.0: 1454 + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} 1455 + 1456 + nanoid@3.3.11: 1457 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1458 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1459 + hasBin: true 1460 + 1461 + napi-build-utils@2.0.0: 1462 + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} 1463 + 1464 + natural-compare@1.4.0: 1465 + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1466 + 1467 + node-abi@3.85.0: 1468 + resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==} 1469 + engines: {node: '>=10'} 1470 + 1471 + node-schedule@2.1.1: 1472 + resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} 1473 + engines: {node: '>=6'} 1474 + 1475 + on-exit-leak-free@2.1.2: 1476 + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} 1477 + engines: {node: '>=14.0.0'} 1478 + 1479 + once@1.4.0: 1480 + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1481 + 1482 + optionator@0.9.4: 1483 + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1484 + engines: {node: '>= 0.8.0'} 1485 + 1486 + p-limit@3.1.0: 1487 + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1488 + engines: {node: '>=10'} 1489 + 1490 + p-locate@5.0.0: 1491 + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1492 + engines: {node: '>=10'} 1493 + 1494 + parent-module@1.0.1: 1495 + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1496 + engines: {node: '>=6'} 1497 + 1498 + path-exists@4.0.0: 1499 + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1500 + engines: {node: '>=8'} 1501 + 1502 + path-key@3.1.1: 1503 + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1504 + engines: {node: '>=8'} 1505 + 1506 + path-parse@1.0.7: 1507 + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1508 + 1509 + picocolors@1.1.1: 1510 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1511 + 1512 + picomatch@4.0.3: 1513 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1514 + engines: {node: '>=12'} 1515 + 1516 + pino-abstract-transport@1.2.0: 1517 + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} 1518 + 1519 + pino-abstract-transport@2.0.0: 1520 + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} 1521 + 1522 + pino-std-serializers@6.2.2: 1523 + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} 1524 + 1525 + pino-std-serializers@7.0.0: 1526 + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} 1527 + 1528 + pino@10.1.0: 1529 + resolution: {integrity: sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==} 1530 + hasBin: true 1531 + 1532 + pino@8.21.0: 1533 + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} 1534 + hasBin: true 1535 + 1536 + postcss-load-config@3.1.4: 1537 + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1538 + engines: {node: '>= 10'} 1539 + peerDependencies: 1540 + postcss: '>=8.0.9' 1541 + ts-node: '>=9.0.0' 1542 + peerDependenciesMeta: 1543 + postcss: 1544 + optional: true 1545 + ts-node: 1546 + optional: true 1547 + 1548 + postcss-safe-parser@7.0.1: 1549 + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} 1550 + engines: {node: '>=18.0'} 1551 + peerDependencies: 1552 + postcss: ^8.4.31 1553 + 1554 + postcss-scss@4.0.9: 1555 + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} 1556 + engines: {node: '>=12.0'} 1557 + peerDependencies: 1558 + postcss: ^8.4.29 1559 + 1560 + postcss-selector-parser@7.1.1: 1561 + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} 1562 + engines: {node: '>=4'} 1563 + 1564 + postcss@8.5.6: 1565 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1566 + engines: {node: ^10 || ^12 || >=14} 1567 + 1568 + prebuild-install@7.1.3: 1569 + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} 1570 + engines: {node: '>=10'} 1571 + hasBin: true 1572 + 1573 + prelude-ls@1.2.1: 1574 + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1575 + engines: {node: '>= 0.8.0'} 1576 + 1577 + process-warning@3.0.0: 1578 + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} 1579 + 1580 + process-warning@5.0.0: 1581 + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} 1582 + 1583 + process@0.11.10: 1584 + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 1585 + engines: {node: '>= 0.6.0'} 1586 + 1587 + pump@3.0.3: 1588 + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} 1589 + 1590 + punycode@2.3.1: 1591 + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1592 + engines: {node: '>=6'} 1593 + 1594 + quick-format-unescaped@4.0.4: 1595 + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 1596 + 1597 + rc@1.2.8: 1598 + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1599 + hasBin: true 1600 + 1601 + readable-stream@3.6.2: 1602 + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1603 + engines: {node: '>= 6'} 1604 + 1605 + readable-stream@4.7.0: 1606 + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} 1607 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1608 + 1609 + readdirp@4.1.2: 1610 + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1611 + engines: {node: '>= 14.18.0'} 1612 + 1613 + real-require@0.2.0: 1614 + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 1615 + engines: {node: '>= 12.13.0'} 1616 + 1617 + resolve-from@4.0.0: 1618 + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1619 + engines: {node: '>=4'} 1620 + 1621 + resolve-pkg-maps@1.0.0: 1622 + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1623 + 1624 + resolve@1.22.11: 1625 + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} 1626 + engines: {node: '>= 0.4'} 1627 + hasBin: true 1628 + 1629 + rollup@4.53.3: 1630 + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} 1631 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1632 + hasBin: true 1633 + 1634 + sade@1.8.1: 1635 + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1636 + engines: {node: '>=6'} 1637 + 1638 + safe-buffer@5.2.1: 1639 + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1640 + 1641 + safe-stable-stringify@2.5.0: 1642 + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 1643 + engines: {node: '>=10'} 1644 + 1645 + semver@7.7.3: 1646 + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1647 + engines: {node: '>=10'} 1648 + hasBin: true 1649 + 1650 + set-cookie-parser@2.7.2: 1651 + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} 1652 + 1653 + shebang-command@2.0.0: 1654 + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1655 + engines: {node: '>=8'} 1656 + 1657 + shebang-regex@3.0.0: 1658 + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1659 + engines: {node: '>=8'} 1660 + 1661 + simple-concat@1.0.1: 1662 + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 1663 + 1664 + simple-get@4.0.1: 1665 + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} 1666 + 1667 + sirv@3.0.2: 1668 + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} 1669 + engines: {node: '>=18'} 1670 + 1671 + sonic-boom@3.8.1: 1672 + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} 1673 + 1674 + sonic-boom@4.2.0: 1675 + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} 1676 + 1677 + sorted-array-functions@1.3.0: 1678 + resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} 1679 + 1680 + source-map-js@1.2.1: 1681 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1682 + engines: {node: '>=0.10.0'} 1683 + 1684 + source-map-support@0.5.21: 1685 + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1686 + 1687 + source-map@0.6.1: 1688 + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1689 + engines: {node: '>=0.10.0'} 1690 + 1691 + split2@4.2.0: 1692 + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 1693 + engines: {node: '>= 10.x'} 1694 + 1695 + string_decoder@1.3.0: 1696 + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1697 + 1698 + strip-json-comments@2.0.1: 1699 + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 1700 + engines: {node: '>=0.10.0'} 1701 + 1702 + strip-json-comments@3.1.1: 1703 + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1704 + engines: {node: '>=8'} 1705 + 1706 + supports-color@7.2.0: 1707 + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1708 + engines: {node: '>=8'} 1709 + 1710 + supports-preserve-symlinks-flag@1.0.0: 1711 + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1712 + engines: {node: '>= 0.4'} 1713 + 1714 + svelte-check@4.3.4: 1715 + resolution: {integrity: sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw==} 1716 + engines: {node: '>= 18.0.0'} 1717 + hasBin: true 1718 + peerDependencies: 1719 + svelte: ^4.0.0 || ^5.0.0-next.0 1720 + typescript: '>=5.0.0' 1721 + 1722 + svelte-eslint-parser@1.4.1: 1723 + resolution: {integrity: sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA==} 1724 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.24.0} 1725 + peerDependencies: 1726 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 1727 + peerDependenciesMeta: 1728 + svelte: 1729 + optional: true 1730 + 1731 + svelte@5.45.8: 1732 + resolution: {integrity: sha512-1Jh7FwVh/2Uxg0T7SeE1qFKMhwYH45b2v53bcZpW7qHa6O8iU1ByEj56PF0IQ6dU4HE5gRkic6h+vx+tclHeiw==} 1733 + engines: {node: '>=18'} 1734 + 1735 + tar-fs@2.1.4: 1736 + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} 1737 + 1738 + tar-stream@2.2.0: 1739 + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 1740 + engines: {node: '>=6'} 1741 + 1742 + thread-stream@2.7.0: 1743 + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} 1744 + 1745 + thread-stream@3.1.0: 1746 + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} 1747 + 1748 + tinyglobby@0.2.15: 1749 + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1750 + engines: {node: '>=12.0.0'} 1751 + 1752 + tlds@1.261.0: 1753 + resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==} 1754 + hasBin: true 1755 + 1756 + totalist@3.0.1: 1757 + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1758 + engines: {node: '>=6'} 1759 + 1760 + ts-api-utils@2.1.0: 1761 + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1762 + engines: {node: '>=18.12'} 1763 + peerDependencies: 1764 + typescript: '>=4.8.4' 1765 + 1766 + tslib@2.8.1: 1767 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1768 + 1769 + tunnel-agent@0.6.0: 1770 + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 1771 + 1772 + type-check@0.4.0: 1773 + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1774 + engines: {node: '>= 0.8.0'} 1775 + 1776 + typescript-eslint@8.49.0: 1777 + resolution: {integrity: sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==} 1778 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1779 + peerDependencies: 1780 + eslint: ^8.57.0 || ^9.0.0 1781 + typescript: '>=4.8.4 <6.0.0' 1782 + 1783 + typescript@5.9.3: 1784 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1785 + engines: {node: '>=14.17'} 1786 + hasBin: true 1787 + 1788 + uint8arrays@3.0.0: 1789 + resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==} 1790 + 1791 + undici-types@7.16.0: 1792 + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 1793 + 1794 + undici@6.22.0: 1795 + resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} 1796 + engines: {node: '>=18.17'} 1797 + 1798 + unicode-segmenter@0.14.1: 1799 + resolution: {integrity: sha512-yHedxlEpUyD+u1UE8qAuCMXVdMLn7yUdlmd8WN7FGmO1ICnpE7LJfnmuXBB+T0zkie3qHsy8fSucqceI/MylOg==} 1800 + 1801 + uri-js@4.4.1: 1802 + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1803 + 1804 + util-deprecate@1.0.2: 1805 + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1806 + 1807 + vite@7.2.7: 1808 + resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==} 1809 + engines: {node: ^20.19.0 || >=22.12.0} 1810 + hasBin: true 1811 + peerDependencies: 1812 + '@types/node': ^20.19.0 || >=22.12.0 1813 + jiti: '>=1.21.0' 1814 + less: ^4.0.0 1815 + lightningcss: ^1.21.0 1816 + sass: ^1.70.0 1817 + sass-embedded: ^1.70.0 1818 + stylus: '>=0.54.8' 1819 + sugarss: ^5.0.0 1820 + terser: ^5.16.0 1821 + tsx: ^4.8.1 1822 + yaml: ^2.4.2 1823 + peerDependenciesMeta: 1824 + '@types/node': 1825 + optional: true 1826 + jiti: 1827 + optional: true 1828 + less: 1829 + optional: true 1830 + lightningcss: 1831 + optional: true 1832 + sass: 1833 + optional: true 1834 + sass-embedded: 1835 + optional: true 1836 + stylus: 1837 + optional: true 1838 + sugarss: 1839 + optional: true 1840 + terser: 1841 + optional: true 1842 + tsx: 1843 + optional: true 1844 + yaml: 1845 + optional: true 1846 + 1847 + vitefu@1.1.1: 1848 + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} 1849 + peerDependencies: 1850 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 1851 + peerDependenciesMeta: 1852 + vite: 1853 + optional: true 1854 + 1855 + which@2.0.2: 1856 + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1857 + engines: {node: '>= 8'} 1858 + hasBin: true 1859 + 1860 + word-wrap@1.2.5: 1861 + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1862 + engines: {node: '>=0.10.0'} 1863 + 1864 + wrappy@1.0.2: 1865 + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1866 + 1867 + yaml@1.10.2: 1868 + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1869 + engines: {node: '>= 6'} 1870 + 1871 + yocto-queue@0.1.0: 1872 + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1873 + engines: {node: '>=10'} 1874 + 1875 + zimmerframe@1.1.4: 1876 + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} 1877 + 1878 + zod@3.25.76: 1879 + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 1880 + 1881 + snapshots: 1882 + 1883 + '@atcute/client@4.1.1': 1884 + dependencies: 1885 + '@atcute/identity': 1.1.3 1886 + '@atcute/lexicons': 1.2.5 1887 + 1888 + '@atcute/identity@1.1.3': 1889 + dependencies: 1890 + '@atcute/lexicons': 1.2.5 1891 + '@badrap/valita': 0.4.6 1892 + 1893 + '@atcute/lexicons@1.2.5': 1894 + dependencies: 1895 + '@standard-schema/spec': 1.0.0 1896 + esm-env: 1.2.2 1897 + 1898 + '@atcute/microcosm@1.0.0': 1899 + dependencies: 1900 + '@atcute/lexicons': 1.2.5 1901 + 1902 + '@atproto-labs/did-resolver@0.2.4': 1903 + dependencies: 1904 + '@atproto-labs/fetch': 0.2.3 1905 + '@atproto-labs/pipe': 0.1.1 1906 + '@atproto-labs/simple-store': 0.3.0 1907 + '@atproto-labs/simple-store-memory': 0.1.4 1908 + '@atproto/did': 0.2.3 1909 + zod: 3.25.76 1910 + 1911 + '@atproto-labs/fetch-node@0.2.0': 1912 + dependencies: 1913 + '@atproto-labs/fetch': 0.2.3 1914 + '@atproto-labs/pipe': 0.1.1 1915 + ipaddr.js: 2.3.0 1916 + undici: 6.22.0 1917 + 1918 + '@atproto-labs/fetch@0.2.3': 1919 + dependencies: 1920 + '@atproto-labs/pipe': 0.1.1 1921 + 1922 + '@atproto-labs/handle-resolver-node@0.1.23': 1923 + dependencies: 1924 + '@atproto-labs/fetch-node': 0.2.0 1925 + '@atproto-labs/handle-resolver': 0.3.4 1926 + '@atproto/did': 0.2.3 1927 + 1928 + '@atproto-labs/handle-resolver@0.3.4': 1929 + dependencies: 1930 + '@atproto-labs/simple-store': 0.3.0 1931 + '@atproto-labs/simple-store-memory': 0.1.4 1932 + '@atproto/did': 0.2.3 1933 + zod: 3.25.76 1934 + 1935 + '@atproto-labs/identity-resolver@0.3.4': 1936 + dependencies: 1937 + '@atproto-labs/did-resolver': 0.2.4 1938 + '@atproto-labs/handle-resolver': 0.3.4 1939 + 1940 + '@atproto-labs/pipe@0.1.1': {} 1941 + 1942 + '@atproto-labs/simple-store-memory@0.1.4': 1943 + dependencies: 1944 + '@atproto-labs/simple-store': 0.3.0 1945 + lru-cache: 10.4.3 1946 + 1947 + '@atproto-labs/simple-store@0.3.0': {} 1948 + 1949 + '@atproto/api@0.18.6': 1950 + dependencies: 1951 + '@atproto/common-web': 0.4.7 1952 + '@atproto/lexicon': 0.6.0 1953 + '@atproto/syntax': 0.4.2 1954 + '@atproto/xrpc': 0.7.7 1955 + await-lock: 2.2.2 1956 + multiformats: 9.9.0 1957 + tlds: 1.261.0 1958 + zod: 3.25.76 1959 + 1960 + '@atproto/common-web@0.4.7': 1961 + dependencies: 1962 + '@atproto/lex-data': 0.0.3 1963 + '@atproto/lex-json': 0.0.3 1964 + zod: 3.25.76 1965 + 1966 + '@atproto/common@0.5.3': 1967 + dependencies: 1968 + '@atproto/common-web': 0.4.7 1969 + '@atproto/lex-cbor': 0.0.3 1970 + '@atproto/lex-data': 0.0.3 1971 + iso-datestring-validator: 2.2.2 1972 + multiformats: 9.9.0 1973 + pino: 8.21.0 1974 + 1975 + '@atproto/crypto@0.4.5': 1976 + dependencies: 1977 + '@noble/curves': 1.9.7 1978 + '@noble/hashes': 1.8.0 1979 + uint8arrays: 3.0.0 1980 + 1981 + '@atproto/did@0.2.3': 1982 + dependencies: 1983 + zod: 3.25.76 1984 + 1985 + '@atproto/jwk-jose@0.1.11': 1986 + dependencies: 1987 + '@atproto/jwk': 0.6.0 1988 + jose: 5.10.0 1989 + 1990 + '@atproto/jwk-webcrypto@0.2.0': 1991 + dependencies: 1992 + '@atproto/jwk': 0.6.0 1993 + '@atproto/jwk-jose': 0.1.11 1994 + zod: 3.25.76 1995 + 1996 + '@atproto/jwk@0.6.0': 1997 + dependencies: 1998 + multiformats: 9.9.0 1999 + zod: 3.25.76 2000 + 2001 + '@atproto/lex-cbor@0.0.3': 2002 + dependencies: 2003 + '@atproto/lex-data': 0.0.3 2004 + multiformats: 9.9.0 2005 + tslib: 2.8.1 2006 + 2007 + '@atproto/lex-data@0.0.3': 2008 + dependencies: 2009 + '@atproto/syntax': 0.4.2 2010 + multiformats: 9.9.0 2011 + tslib: 2.8.1 2012 + uint8arrays: 3.0.0 2013 + unicode-segmenter: 0.14.1 2014 + 2015 + '@atproto/lex-json@0.0.3': 2016 + dependencies: 2017 + '@atproto/lex-data': 0.0.3 2018 + tslib: 2.8.1 2019 + 2020 + '@atproto/lexicon@0.6.0': 2021 + dependencies: 2022 + '@atproto/common-web': 0.4.7 2023 + '@atproto/syntax': 0.4.2 2024 + iso-datestring-validator: 2.2.2 2025 + multiformats: 9.9.0 2026 + zod: 3.25.76 2027 + 2028 + '@atproto/oauth-client-node@0.3.13': 2029 + dependencies: 2030 + '@atproto-labs/did-resolver': 0.2.4 2031 + '@atproto-labs/handle-resolver-node': 0.1.23 2032 + '@atproto-labs/simple-store': 0.3.0 2033 + '@atproto/did': 0.2.3 2034 + '@atproto/jwk': 0.6.0 2035 + '@atproto/jwk-jose': 0.1.11 2036 + '@atproto/jwk-webcrypto': 0.2.0 2037 + '@atproto/oauth-client': 0.5.11 2038 + '@atproto/oauth-types': 0.5.2 2039 + 2040 + '@atproto/oauth-client@0.5.11': 2041 + dependencies: 2042 + '@atproto-labs/did-resolver': 0.2.4 2043 + '@atproto-labs/fetch': 0.2.3 2044 + '@atproto-labs/handle-resolver': 0.3.4 2045 + '@atproto-labs/identity-resolver': 0.3.4 2046 + '@atproto-labs/simple-store': 0.3.0 2047 + '@atproto-labs/simple-store-memory': 0.1.4 2048 + '@atproto/did': 0.2.3 2049 + '@atproto/jwk': 0.6.0 2050 + '@atproto/oauth-types': 0.5.2 2051 + '@atproto/xrpc': 0.7.7 2052 + core-js: 3.47.0 2053 + multiformats: 9.9.0 2054 + zod: 3.25.76 2055 + 2056 + '@atproto/oauth-types@0.5.2': 2057 + dependencies: 2058 + '@atproto/did': 0.2.3 2059 + '@atproto/jwk': 0.6.0 2060 + zod: 3.25.76 2061 + 2062 + '@atproto/syntax@0.4.2': {} 2063 + 2064 + '@atproto/xrpc@0.7.7': 2065 + dependencies: 2066 + '@atproto/lexicon': 0.6.0 2067 + zod: 3.25.76 2068 + 2069 + '@badrap/valita@0.4.6': {} 2070 + 2071 + '@drizzle-team/brocli@0.10.2': {} 2072 + 2073 + '@esbuild-kit/core-utils@3.3.2': 2074 + dependencies: 2075 + esbuild: 0.18.20 2076 + source-map-support: 0.5.21 2077 + 2078 + '@esbuild-kit/esm-loader@2.6.5': 2079 + dependencies: 2080 + '@esbuild-kit/core-utils': 3.3.2 2081 + get-tsconfig: 4.13.0 2082 + 2083 + '@esbuild/aix-ppc64@0.25.12': 2084 + optional: true 2085 + 2086 + '@esbuild/android-arm64@0.18.20': 2087 + optional: true 2088 + 2089 + '@esbuild/android-arm64@0.25.12': 2090 + optional: true 2091 + 2092 + '@esbuild/android-arm@0.18.20': 2093 + optional: true 2094 + 2095 + '@esbuild/android-arm@0.25.12': 2096 + optional: true 2097 + 2098 + '@esbuild/android-x64@0.18.20': 2099 + optional: true 2100 + 2101 + '@esbuild/android-x64@0.25.12': 2102 + optional: true 2103 + 2104 + '@esbuild/darwin-arm64@0.18.20': 2105 + optional: true 2106 + 2107 + '@esbuild/darwin-arm64@0.25.12': 2108 + optional: true 2109 + 2110 + '@esbuild/darwin-x64@0.18.20': 2111 + optional: true 2112 + 2113 + '@esbuild/darwin-x64@0.25.12': 2114 + optional: true 2115 + 2116 + '@esbuild/freebsd-arm64@0.18.20': 2117 + optional: true 2118 + 2119 + '@esbuild/freebsd-arm64@0.25.12': 2120 + optional: true 2121 + 2122 + '@esbuild/freebsd-x64@0.18.20': 2123 + optional: true 2124 + 2125 + '@esbuild/freebsd-x64@0.25.12': 2126 + optional: true 2127 + 2128 + '@esbuild/linux-arm64@0.18.20': 2129 + optional: true 2130 + 2131 + '@esbuild/linux-arm64@0.25.12': 2132 + optional: true 2133 + 2134 + '@esbuild/linux-arm@0.18.20': 2135 + optional: true 2136 + 2137 + '@esbuild/linux-arm@0.25.12': 2138 + optional: true 2139 + 2140 + '@esbuild/linux-ia32@0.18.20': 2141 + optional: true 2142 + 2143 + '@esbuild/linux-ia32@0.25.12': 2144 + optional: true 2145 + 2146 + '@esbuild/linux-loong64@0.18.20': 2147 + optional: true 2148 + 2149 + '@esbuild/linux-loong64@0.25.12': 2150 + optional: true 2151 + 2152 + '@esbuild/linux-mips64el@0.18.20': 2153 + optional: true 2154 + 2155 + '@esbuild/linux-mips64el@0.25.12': 2156 + optional: true 2157 + 2158 + '@esbuild/linux-ppc64@0.18.20': 2159 + optional: true 2160 + 2161 + '@esbuild/linux-ppc64@0.25.12': 2162 + optional: true 2163 + 2164 + '@esbuild/linux-riscv64@0.18.20': 2165 + optional: true 2166 + 2167 + '@esbuild/linux-riscv64@0.25.12': 2168 + optional: true 2169 + 2170 + '@esbuild/linux-s390x@0.18.20': 2171 + optional: true 2172 + 2173 + '@esbuild/linux-s390x@0.25.12': 2174 + optional: true 2175 + 2176 + '@esbuild/linux-x64@0.18.20': 2177 + optional: true 2178 + 2179 + '@esbuild/linux-x64@0.25.12': 2180 + optional: true 2181 + 2182 + '@esbuild/netbsd-arm64@0.25.12': 2183 + optional: true 2184 + 2185 + '@esbuild/netbsd-x64@0.18.20': 2186 + optional: true 2187 + 2188 + '@esbuild/netbsd-x64@0.25.12': 2189 + optional: true 2190 + 2191 + '@esbuild/openbsd-arm64@0.25.12': 2192 + optional: true 2193 + 2194 + '@esbuild/openbsd-x64@0.18.20': 2195 + optional: true 2196 + 2197 + '@esbuild/openbsd-x64@0.25.12': 2198 + optional: true 2199 + 2200 + '@esbuild/openharmony-arm64@0.25.12': 2201 + optional: true 2202 + 2203 + '@esbuild/sunos-x64@0.18.20': 2204 + optional: true 2205 + 2206 + '@esbuild/sunos-x64@0.25.12': 2207 + optional: true 2208 + 2209 + '@esbuild/win32-arm64@0.18.20': 2210 + optional: true 2211 + 2212 + '@esbuild/win32-arm64@0.25.12': 2213 + optional: true 2214 + 2215 + '@esbuild/win32-ia32@0.18.20': 2216 + optional: true 2217 + 2218 + '@esbuild/win32-ia32@0.25.12': 2219 + optional: true 2220 + 2221 + '@esbuild/win32-x64@0.18.20': 2222 + optional: true 2223 + 2224 + '@esbuild/win32-x64@0.25.12': 2225 + optional: true 2226 + 2227 + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': 2228 + dependencies: 2229 + eslint: 9.39.1 2230 + eslint-visitor-keys: 3.4.3 2231 + 2232 + '@eslint-community/regexpp@4.12.2': {} 2233 + 2234 + '@eslint/compat@1.4.1(eslint@9.39.1)': 2235 + dependencies: 2236 + '@eslint/core': 0.17.0 2237 + optionalDependencies: 2238 + eslint: 9.39.1 2239 + 2240 + '@eslint/config-array@0.21.1': 2241 + dependencies: 2242 + '@eslint/object-schema': 2.1.7 2243 + debug: 4.4.3 2244 + minimatch: 3.1.2 2245 + transitivePeerDependencies: 2246 + - supports-color 2247 + 2248 + '@eslint/config-helpers@0.4.2': 2249 + dependencies: 2250 + '@eslint/core': 0.17.0 2251 + 2252 + '@eslint/core@0.17.0': 2253 + dependencies: 2254 + '@types/json-schema': 7.0.15 2255 + 2256 + '@eslint/eslintrc@3.3.3': 2257 + dependencies: 2258 + ajv: 6.12.6 2259 + debug: 4.4.3 2260 + espree: 10.4.0 2261 + globals: 14.0.0 2262 + ignore: 5.3.2 2263 + import-fresh: 3.3.1 2264 + js-yaml: 4.1.1 2265 + minimatch: 3.1.2 2266 + strip-json-comments: 3.1.1 2267 + transitivePeerDependencies: 2268 + - supports-color 2269 + 2270 + '@eslint/js@9.39.1': {} 2271 + 2272 + '@eslint/object-schema@2.1.7': {} 2273 + 2274 + '@eslint/plugin-kit@0.4.1': 2275 + dependencies: 2276 + '@eslint/core': 0.17.0 2277 + levn: 0.4.1 2278 + 2279 + '@humanfs/core@0.19.1': {} 2280 + 2281 + '@humanfs/node@0.16.7': 2282 + dependencies: 2283 + '@humanfs/core': 0.19.1 2284 + '@humanwhocodes/retry': 0.4.3 2285 + 2286 + '@humanwhocodes/module-importer@1.0.1': {} 2287 + 2288 + '@humanwhocodes/retry@0.4.3': {} 2289 + 2290 + '@jridgewell/gen-mapping@0.3.13': 2291 + dependencies: 2292 + '@jridgewell/sourcemap-codec': 1.5.5 2293 + '@jridgewell/trace-mapping': 0.3.31 2294 + 2295 + '@jridgewell/remapping@2.3.5': 2296 + dependencies: 2297 + '@jridgewell/gen-mapping': 0.3.13 2298 + '@jridgewell/trace-mapping': 0.3.31 2299 + 2300 + '@jridgewell/resolve-uri@3.1.2': {} 2301 + 2302 + '@jridgewell/sourcemap-codec@1.5.5': {} 2303 + 2304 + '@jridgewell/trace-mapping@0.3.31': 2305 + dependencies: 2306 + '@jridgewell/resolve-uri': 3.1.2 2307 + '@jridgewell/sourcemap-codec': 1.5.5 2308 + 2309 + '@noble/curves@1.9.7': 2310 + dependencies: 2311 + '@noble/hashes': 1.8.0 2312 + 2313 + '@noble/hashes@1.8.0': {} 2314 + 2315 + '@oslojs/asn1@1.0.0': 2316 + dependencies: 2317 + '@oslojs/binary': 1.0.0 2318 + 2319 + '@oslojs/binary@1.0.0': {} 2320 + 2321 + '@oslojs/crypto@1.0.1': 2322 + dependencies: 2323 + '@oslojs/asn1': 1.0.0 2324 + '@oslojs/binary': 1.0.0 2325 + 2326 + '@oslojs/encoding@1.1.0': {} 2327 + 2328 + '@pinojs/redact@0.4.0': {} 2329 + 2330 + '@polka/url@1.0.0-next.29': {} 2331 + 2332 + '@rollup/plugin-commonjs@28.0.9(rollup@4.53.3)': 2333 + dependencies: 2334 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) 2335 + commondir: 1.0.1 2336 + estree-walker: 2.0.2 2337 + fdir: 6.5.0(picomatch@4.0.3) 2338 + is-reference: 1.2.1 2339 + magic-string: 0.30.21 2340 + picomatch: 4.0.3 2341 + optionalDependencies: 2342 + rollup: 4.53.3 2343 + 2344 + '@rollup/plugin-json@6.1.0(rollup@4.53.3)': 2345 + dependencies: 2346 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) 2347 + optionalDependencies: 2348 + rollup: 4.53.3 2349 + 2350 + '@rollup/plugin-node-resolve@16.0.3(rollup@4.53.3)': 2351 + dependencies: 2352 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) 2353 + '@types/resolve': 1.20.2 2354 + deepmerge: 4.3.1 2355 + is-module: 1.0.0 2356 + resolve: 1.22.11 2357 + optionalDependencies: 2358 + rollup: 4.53.3 2359 + 2360 + '@rollup/pluginutils@5.3.0(rollup@4.53.3)': 2361 + dependencies: 2362 + '@types/estree': 1.0.8 2363 + estree-walker: 2.0.2 2364 + picomatch: 4.0.3 2365 + optionalDependencies: 2366 + rollup: 4.53.3 2367 + 2368 + '@rollup/rollup-android-arm-eabi@4.53.3': 2369 + optional: true 2370 + 2371 + '@rollup/rollup-android-arm64@4.53.3': 2372 + optional: true 2373 + 2374 + '@rollup/rollup-darwin-arm64@4.53.3': 2375 + optional: true 2376 + 2377 + '@rollup/rollup-darwin-x64@4.53.3': 2378 + optional: true 2379 + 2380 + '@rollup/rollup-freebsd-arm64@4.53.3': 2381 + optional: true 2382 + 2383 + '@rollup/rollup-freebsd-x64@4.53.3': 2384 + optional: true 2385 + 2386 + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': 2387 + optional: true 2388 + 2389 + '@rollup/rollup-linux-arm-musleabihf@4.53.3': 2390 + optional: true 2391 + 2392 + '@rollup/rollup-linux-arm64-gnu@4.53.3': 2393 + optional: true 2394 + 2395 + '@rollup/rollup-linux-arm64-musl@4.53.3': 2396 + optional: true 2397 + 2398 + '@rollup/rollup-linux-loong64-gnu@4.53.3': 2399 + optional: true 2400 + 2401 + '@rollup/rollup-linux-ppc64-gnu@4.53.3': 2402 + optional: true 2403 + 2404 + '@rollup/rollup-linux-riscv64-gnu@4.53.3': 2405 + optional: true 2406 + 2407 + '@rollup/rollup-linux-riscv64-musl@4.53.3': 2408 + optional: true 2409 + 2410 + '@rollup/rollup-linux-s390x-gnu@4.53.3': 2411 + optional: true 2412 + 2413 + '@rollup/rollup-linux-x64-gnu@4.53.3': 2414 + optional: true 2415 + 2416 + '@rollup/rollup-linux-x64-musl@4.53.3': 2417 + optional: true 2418 + 2419 + '@rollup/rollup-openharmony-arm64@4.53.3': 2420 + optional: true 2421 + 2422 + '@rollup/rollup-win32-arm64-msvc@4.53.3': 2423 + optional: true 2424 + 2425 + '@rollup/rollup-win32-ia32-msvc@4.53.3': 2426 + optional: true 2427 + 2428 + '@rollup/rollup-win32-x64-gnu@4.53.3': 2429 + optional: true 2430 + 2431 + '@rollup/rollup-win32-x64-msvc@4.53.3': 2432 + optional: true 2433 + 2434 + '@standard-schema/spec@1.0.0': {} 2435 + 2436 + '@sveltejs/acorn-typescript@1.0.8(acorn@8.15.0)': 2437 + dependencies: 2438 + acorn: 8.15.0 2439 + 2440 + '@sveltejs/adapter-auto@7.0.0(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))': 2441 + dependencies: 2442 + '@sveltejs/kit': 2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)) 2443 + 2444 + '@sveltejs/adapter-node@5.4.0(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))': 2445 + dependencies: 2446 + '@rollup/plugin-commonjs': 28.0.9(rollup@4.53.3) 2447 + '@rollup/plugin-json': 6.1.0(rollup@4.53.3) 2448 + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.53.3) 2449 + '@sveltejs/kit': 2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)) 2450 + rollup: 4.53.3 2451 + 2452 + '@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2))': 2453 + dependencies: 2454 + '@standard-schema/spec': 1.0.0 2455 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) 2456 + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)) 2457 + '@types/cookie': 0.6.0 2458 + acorn: 8.15.0 2459 + cookie: 0.6.0 2460 + devalue: 5.6.0 2461 + esm-env: 1.2.2 2462 + kleur: 4.1.5 2463 + magic-string: 0.30.21 2464 + mrmime: 2.0.1 2465 + sade: 1.8.1 2466 + set-cookie-parser: 2.7.2 2467 + sirv: 3.0.2 2468 + svelte: 5.45.8 2469 + vite: 7.2.7(@types/node@24.10.2) 2470 + 2471 + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2))': 2472 + dependencies: 2473 + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)) 2474 + debug: 4.4.3 2475 + svelte: 5.45.8 2476 + vite: 7.2.7(@types/node@24.10.2) 2477 + transitivePeerDependencies: 2478 + - supports-color 2479 + 2480 + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2))': 2481 + dependencies: 2482 + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.2)) 2483 + debug: 4.4.3 2484 + deepmerge: 4.3.1 2485 + magic-string: 0.30.21 2486 + svelte: 5.45.8 2487 + vite: 7.2.7(@types/node@24.10.2) 2488 + vitefu: 1.1.1(vite@7.2.7(@types/node@24.10.2)) 2489 + transitivePeerDependencies: 2490 + - supports-color 2491 + 2492 + '@types/better-sqlite3@7.6.13': 2493 + dependencies: 2494 + '@types/node': 24.10.2 2495 + 2496 + '@types/cookie@0.6.0': {} 2497 + 2498 + '@types/estree@1.0.8': {} 2499 + 2500 + '@types/json-schema@7.0.15': {} 2501 + 2502 + '@types/node@24.10.2': 2503 + dependencies: 2504 + undici-types: 7.16.0 2505 + 2506 + '@types/resolve@1.20.2': {} 2507 + 2508 + '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': 2509 + dependencies: 2510 + '@eslint-community/regexpp': 4.12.2 2511 + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 2512 + '@typescript-eslint/scope-manager': 8.49.0 2513 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 2514 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 2515 + '@typescript-eslint/visitor-keys': 8.49.0 2516 + eslint: 9.39.1 2517 + ignore: 7.0.5 2518 + natural-compare: 1.4.0 2519 + ts-api-utils: 2.1.0(typescript@5.9.3) 2520 + typescript: 5.9.3 2521 + transitivePeerDependencies: 2522 + - supports-color 2523 + 2524 + '@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3)': 2525 + dependencies: 2526 + '@typescript-eslint/scope-manager': 8.49.0 2527 + '@typescript-eslint/types': 8.49.0 2528 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) 2529 + '@typescript-eslint/visitor-keys': 8.49.0 2530 + debug: 4.4.3 2531 + eslint: 9.39.1 2532 + typescript: 5.9.3 2533 + transitivePeerDependencies: 2534 + - supports-color 2535 + 2536 + '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)': 2537 + dependencies: 2538 + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) 2539 + '@typescript-eslint/types': 8.49.0 2540 + debug: 4.4.3 2541 + typescript: 5.9.3 2542 + transitivePeerDependencies: 2543 + - supports-color 2544 + 2545 + '@typescript-eslint/scope-manager@8.49.0': 2546 + dependencies: 2547 + '@typescript-eslint/types': 8.49.0 2548 + '@typescript-eslint/visitor-keys': 8.49.0 2549 + 2550 + '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)': 2551 + dependencies: 2552 + typescript: 5.9.3 2553 + 2554 + '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1)(typescript@5.9.3)': 2555 + dependencies: 2556 + '@typescript-eslint/types': 8.49.0 2557 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) 2558 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 2559 + debug: 4.4.3 2560 + eslint: 9.39.1 2561 + ts-api-utils: 2.1.0(typescript@5.9.3) 2562 + typescript: 5.9.3 2563 + transitivePeerDependencies: 2564 + - supports-color 2565 + 2566 + '@typescript-eslint/types@8.49.0': {} 2567 + 2568 + '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)': 2569 + dependencies: 2570 + '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3) 2571 + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) 2572 + '@typescript-eslint/types': 8.49.0 2573 + '@typescript-eslint/visitor-keys': 8.49.0 2574 + debug: 4.4.3 2575 + minimatch: 9.0.5 2576 + semver: 7.7.3 2577 + tinyglobby: 0.2.15 2578 + ts-api-utils: 2.1.0(typescript@5.9.3) 2579 + typescript: 5.9.3 2580 + transitivePeerDependencies: 2581 + - supports-color 2582 + 2583 + '@typescript-eslint/utils@8.49.0(eslint@9.39.1)(typescript@5.9.3)': 2584 + dependencies: 2585 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) 2586 + '@typescript-eslint/scope-manager': 8.49.0 2587 + '@typescript-eslint/types': 8.49.0 2588 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) 2589 + eslint: 9.39.1 2590 + typescript: 5.9.3 2591 + transitivePeerDependencies: 2592 + - supports-color 2593 + 2594 + '@typescript-eslint/visitor-keys@8.49.0': 2595 + dependencies: 2596 + '@typescript-eslint/types': 8.49.0 2597 + eslint-visitor-keys: 4.2.1 2598 + 2599 + abort-controller@3.0.0: 2600 + dependencies: 2601 + event-target-shim: 5.0.1 2602 + 2603 + acorn-jsx@5.3.2(acorn@8.15.0): 2604 + dependencies: 2605 + acorn: 8.15.0 2606 + 2607 + acorn@8.15.0: {} 2608 + 2609 + ajv@6.12.6: 2610 + dependencies: 2611 + fast-deep-equal: 3.1.3 2612 + fast-json-stable-stringify: 2.1.0 2613 + json-schema-traverse: 0.4.1 2614 + uri-js: 4.4.1 2615 + 2616 + ansi-styles@4.3.0: 2617 + dependencies: 2618 + color-convert: 2.0.1 2619 + 2620 + argparse@2.0.1: {} 2621 + 2622 + aria-query@5.3.2: {} 2623 + 2624 + atomic-sleep@1.0.0: {} 2625 + 2626 + await-lock@2.2.2: {} 2627 + 2628 + axobject-query@4.1.0: {} 2629 + 2630 + balanced-match@1.0.2: {} 2631 + 2632 + base64-js@1.5.1: {} 2633 + 2634 + better-sqlite3@12.4.1: 2635 + dependencies: 2636 + bindings: 1.5.0 2637 + prebuild-install: 7.1.3 2638 + 2639 + bindings@1.5.0: 2640 + dependencies: 2641 + file-uri-to-path: 1.0.0 2642 + 2643 + bl@4.1.0: 2644 + dependencies: 2645 + buffer: 5.7.1 2646 + inherits: 2.0.4 2647 + readable-stream: 3.6.2 2648 + 2649 + brace-expansion@1.1.12: 2650 + dependencies: 2651 + balanced-match: 1.0.2 2652 + concat-map: 0.0.1 2653 + 2654 + brace-expansion@2.0.2: 2655 + dependencies: 2656 + balanced-match: 1.0.2 2657 + 2658 + buffer-from@1.1.2: {} 2659 + 2660 + buffer@5.7.1: 2661 + dependencies: 2662 + base64-js: 1.5.1 2663 + ieee754: 1.2.1 2664 + 2665 + buffer@6.0.3: 2666 + dependencies: 2667 + base64-js: 1.5.1 2668 + ieee754: 1.2.1 2669 + 2670 + callsites@3.1.0: {} 2671 + 2672 + chalk@4.1.2: 2673 + dependencies: 2674 + ansi-styles: 4.3.0 2675 + supports-color: 7.2.0 2676 + 2677 + chokidar@4.0.3: 2678 + dependencies: 2679 + readdirp: 4.1.2 2680 + 2681 + chownr@1.1.4: {} 2682 + 2683 + clsx@2.1.1: {} 2684 + 2685 + color-convert@2.0.1: 2686 + dependencies: 2687 + color-name: 1.1.4 2688 + 2689 + color-name@1.1.4: {} 2690 + 2691 + commondir@1.0.1: {} 2692 + 2693 + concat-map@0.0.1: {} 2694 + 2695 + cookie@0.6.0: {} 2696 + 2697 + core-js@3.47.0: {} 2698 + 2699 + cron-parser@4.9.0: 2700 + dependencies: 2701 + luxon: 3.7.2 2702 + 2703 + cross-spawn@7.0.6: 2704 + dependencies: 2705 + path-key: 3.1.1 2706 + shebang-command: 2.0.0 2707 + which: 2.0.2 2708 + 2709 + cssesc@3.0.0: {} 2710 + 2711 + debug@4.4.3: 2712 + dependencies: 2713 + ms: 2.1.3 2714 + 2715 + decompress-response@6.0.0: 2716 + dependencies: 2717 + mimic-response: 3.1.0 2718 + 2719 + deep-extend@0.6.0: {} 2720 + 2721 + deep-is@0.1.4: {} 2722 + 2723 + deepmerge@4.3.1: {} 2724 + 2725 + detect-libc@2.1.2: {} 2726 + 2727 + devalue@5.6.0: {} 2728 + 2729 + dotenv@17.2.3: {} 2730 + 2731 + drizzle-kit@0.31.8: 2732 + dependencies: 2733 + '@drizzle-team/brocli': 0.10.2 2734 + '@esbuild-kit/esm-loader': 2.6.5 2735 + esbuild: 0.25.12 2736 + esbuild-register: 3.6.0(esbuild@0.25.12) 2737 + transitivePeerDependencies: 2738 + - supports-color 2739 + 2740 + drizzle-orm@0.44.7(@types/better-sqlite3@7.6.13)(better-sqlite3@12.4.1): 2741 + optionalDependencies: 2742 + '@types/better-sqlite3': 7.6.13 2743 + better-sqlite3: 12.4.1 2744 + 2745 + end-of-stream@1.4.5: 2746 + dependencies: 2747 + once: 1.4.0 2748 + 2749 + esbuild-register@3.6.0(esbuild@0.25.12): 2750 + dependencies: 2751 + debug: 4.4.3 2752 + esbuild: 0.25.12 2753 + transitivePeerDependencies: 2754 + - supports-color 2755 + 2756 + esbuild@0.18.20: 2757 + optionalDependencies: 2758 + '@esbuild/android-arm': 0.18.20 2759 + '@esbuild/android-arm64': 0.18.20 2760 + '@esbuild/android-x64': 0.18.20 2761 + '@esbuild/darwin-arm64': 0.18.20 2762 + '@esbuild/darwin-x64': 0.18.20 2763 + '@esbuild/freebsd-arm64': 0.18.20 2764 + '@esbuild/freebsd-x64': 0.18.20 2765 + '@esbuild/linux-arm': 0.18.20 2766 + '@esbuild/linux-arm64': 0.18.20 2767 + '@esbuild/linux-ia32': 0.18.20 2768 + '@esbuild/linux-loong64': 0.18.20 2769 + '@esbuild/linux-mips64el': 0.18.20 2770 + '@esbuild/linux-ppc64': 0.18.20 2771 + '@esbuild/linux-riscv64': 0.18.20 2772 + '@esbuild/linux-s390x': 0.18.20 2773 + '@esbuild/linux-x64': 0.18.20 2774 + '@esbuild/netbsd-x64': 0.18.20 2775 + '@esbuild/openbsd-x64': 0.18.20 2776 + '@esbuild/sunos-x64': 0.18.20 2777 + '@esbuild/win32-arm64': 0.18.20 2778 + '@esbuild/win32-ia32': 0.18.20 2779 + '@esbuild/win32-x64': 0.18.20 2780 + 2781 + esbuild@0.25.12: 2782 + optionalDependencies: 2783 + '@esbuild/aix-ppc64': 0.25.12 2784 + '@esbuild/android-arm': 0.25.12 2785 + '@esbuild/android-arm64': 0.25.12 2786 + '@esbuild/android-x64': 0.25.12 2787 + '@esbuild/darwin-arm64': 0.25.12 2788 + '@esbuild/darwin-x64': 0.25.12 2789 + '@esbuild/freebsd-arm64': 0.25.12 2790 + '@esbuild/freebsd-x64': 0.25.12 2791 + '@esbuild/linux-arm': 0.25.12 2792 + '@esbuild/linux-arm64': 0.25.12 2793 + '@esbuild/linux-ia32': 0.25.12 2794 + '@esbuild/linux-loong64': 0.25.12 2795 + '@esbuild/linux-mips64el': 0.25.12 2796 + '@esbuild/linux-ppc64': 0.25.12 2797 + '@esbuild/linux-riscv64': 0.25.12 2798 + '@esbuild/linux-s390x': 0.25.12 2799 + '@esbuild/linux-x64': 0.25.12 2800 + '@esbuild/netbsd-arm64': 0.25.12 2801 + '@esbuild/netbsd-x64': 0.25.12 2802 + '@esbuild/openbsd-arm64': 0.25.12 2803 + '@esbuild/openbsd-x64': 0.25.12 2804 + '@esbuild/openharmony-arm64': 0.25.12 2805 + '@esbuild/sunos-x64': 0.25.12 2806 + '@esbuild/win32-arm64': 0.25.12 2807 + '@esbuild/win32-ia32': 0.25.12 2808 + '@esbuild/win32-x64': 0.25.12 2809 + 2810 + escape-string-regexp@4.0.0: {} 2811 + 2812 + eslint-plugin-svelte@3.13.1(eslint@9.39.1)(svelte@5.45.8): 2813 + dependencies: 2814 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) 2815 + '@jridgewell/sourcemap-codec': 1.5.5 2816 + eslint: 9.39.1 2817 + esutils: 2.0.3 2818 + globals: 16.5.0 2819 + known-css-properties: 0.37.0 2820 + postcss: 8.5.6 2821 + postcss-load-config: 3.1.4(postcss@8.5.6) 2822 + postcss-safe-parser: 7.0.1(postcss@8.5.6) 2823 + semver: 7.7.3 2824 + svelte-eslint-parser: 1.4.1(svelte@5.45.8) 2825 + optionalDependencies: 2826 + svelte: 5.45.8 2827 + transitivePeerDependencies: 2828 + - ts-node 2829 + 2830 + eslint-scope@8.4.0: 2831 + dependencies: 2832 + esrecurse: 4.3.0 2833 + estraverse: 5.3.0 2834 + 2835 + eslint-visitor-keys@3.4.3: {} 2836 + 2837 + eslint-visitor-keys@4.2.1: {} 2838 + 2839 + eslint@9.39.1: 2840 + dependencies: 2841 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) 2842 + '@eslint-community/regexpp': 4.12.2 2843 + '@eslint/config-array': 0.21.1 2844 + '@eslint/config-helpers': 0.4.2 2845 + '@eslint/core': 0.17.0 2846 + '@eslint/eslintrc': 3.3.3 2847 + '@eslint/js': 9.39.1 2848 + '@eslint/plugin-kit': 0.4.1 2849 + '@humanfs/node': 0.16.7 2850 + '@humanwhocodes/module-importer': 1.0.1 2851 + '@humanwhocodes/retry': 0.4.3 2852 + '@types/estree': 1.0.8 2853 + ajv: 6.12.6 2854 + chalk: 4.1.2 2855 + cross-spawn: 7.0.6 2856 + debug: 4.4.3 2857 + escape-string-regexp: 4.0.0 2858 + eslint-scope: 8.4.0 2859 + eslint-visitor-keys: 4.2.1 2860 + espree: 10.4.0 2861 + esquery: 1.6.0 2862 + esutils: 2.0.3 2863 + fast-deep-equal: 3.1.3 2864 + file-entry-cache: 8.0.0 2865 + find-up: 5.0.0 2866 + glob-parent: 6.0.2 2867 + ignore: 5.3.2 2868 + imurmurhash: 0.1.4 2869 + is-glob: 4.0.3 2870 + json-stable-stringify-without-jsonify: 1.0.1 2871 + lodash.merge: 4.6.2 2872 + minimatch: 3.1.2 2873 + natural-compare: 1.4.0 2874 + optionator: 0.9.4 2875 + transitivePeerDependencies: 2876 + - supports-color 2877 + 2878 + esm-env@1.2.2: {} 2879 + 2880 + espree@10.4.0: 2881 + dependencies: 2882 + acorn: 8.15.0 2883 + acorn-jsx: 5.3.2(acorn@8.15.0) 2884 + eslint-visitor-keys: 4.2.1 2885 + 2886 + esquery@1.6.0: 2887 + dependencies: 2888 + estraverse: 5.3.0 2889 + 2890 + esrap@2.2.1: 2891 + dependencies: 2892 + '@jridgewell/sourcemap-codec': 1.5.5 2893 + 2894 + esrecurse@4.3.0: 2895 + dependencies: 2896 + estraverse: 5.3.0 2897 + 2898 + estraverse@5.3.0: {} 2899 + 2900 + estree-walker@2.0.2: {} 2901 + 2902 + esutils@2.0.3: {} 2903 + 2904 + event-target-shim@5.0.1: {} 2905 + 2906 + events@3.3.0: {} 2907 + 2908 + expand-template@2.0.3: {} 2909 + 2910 + fast-deep-equal@3.1.3: {} 2911 + 2912 + fast-json-stable-stringify@2.1.0: {} 2913 + 2914 + fast-levenshtein@2.0.6: {} 2915 + 2916 + fast-redact@3.5.0: {} 2917 + 2918 + fdir@6.5.0(picomatch@4.0.3): 2919 + optionalDependencies: 2920 + picomatch: 4.0.3 2921 + 2922 + file-entry-cache@8.0.0: 2923 + dependencies: 2924 + flat-cache: 4.0.1 2925 + 2926 + file-uri-to-path@1.0.0: {} 2927 + 2928 + find-up@5.0.0: 2929 + dependencies: 2930 + locate-path: 6.0.0 2931 + path-exists: 4.0.0 2932 + 2933 + flat-cache@4.0.1: 2934 + dependencies: 2935 + flatted: 3.3.3 2936 + keyv: 4.5.4 2937 + 2938 + flatted@3.3.3: {} 2939 + 2940 + fs-constants@1.0.0: {} 2941 + 2942 + fsevents@2.3.3: 2943 + optional: true 2944 + 2945 + function-bind@1.1.2: {} 2946 + 2947 + get-tsconfig@4.13.0: 2948 + dependencies: 2949 + resolve-pkg-maps: 1.0.0 2950 + 2951 + github-from-package@0.0.0: {} 2952 + 2953 + glob-parent@6.0.2: 2954 + dependencies: 2955 + is-glob: 4.0.3 2956 + 2957 + globals@14.0.0: {} 2958 + 2959 + globals@16.5.0: {} 2960 + 2961 + has-flag@4.0.0: {} 2962 + 2963 + hasown@2.0.2: 2964 + dependencies: 2965 + function-bind: 1.1.2 2966 + 2967 + ieee754@1.2.1: {} 2968 + 2969 + ignore@5.3.2: {} 2970 + 2971 + ignore@7.0.5: {} 2972 + 2973 + import-fresh@3.3.1: 2974 + dependencies: 2975 + parent-module: 1.0.1 2976 + resolve-from: 4.0.0 2977 + 2978 + imurmurhash@0.1.4: {} 2979 + 2980 + inherits@2.0.4: {} 2981 + 2982 + ini@1.3.8: {} 2983 + 2984 + ipaddr.js@2.3.0: {} 2985 + 2986 + is-core-module@2.16.1: 2987 + dependencies: 2988 + hasown: 2.0.2 2989 + 2990 + is-extglob@2.1.1: {} 2991 + 2992 + is-glob@4.0.3: 2993 + dependencies: 2994 + is-extglob: 2.1.1 2995 + 2996 + is-module@1.0.0: {} 2997 + 2998 + is-reference@1.2.1: 2999 + dependencies: 3000 + '@types/estree': 1.0.8 3001 + 3002 + is-reference@3.0.3: 3003 + dependencies: 3004 + '@types/estree': 1.0.8 3005 + 3006 + isexe@2.0.0: {} 3007 + 3008 + iso-datestring-validator@2.2.2: {} 3009 + 3010 + jose@5.10.0: {} 3011 + 3012 + js-yaml@4.1.1: 3013 + dependencies: 3014 + argparse: 2.0.1 3015 + 3016 + json-buffer@3.0.1: {} 3017 + 3018 + json-schema-traverse@0.4.1: {} 3019 + 3020 + json-stable-stringify-without-jsonify@1.0.1: {} 3021 + 3022 + keyv@4.5.4: 3023 + dependencies: 3024 + json-buffer: 3.0.1 3025 + 3026 + kleur@4.1.5: {} 3027 + 3028 + known-css-properties@0.37.0: {} 3029 + 3030 + levn@0.4.1: 3031 + dependencies: 3032 + prelude-ls: 1.2.1 3033 + type-check: 0.4.0 3034 + 3035 + lilconfig@2.1.0: {} 3036 + 3037 + locate-character@3.0.0: {} 3038 + 3039 + locate-path@6.0.0: 3040 + dependencies: 3041 + p-locate: 5.0.0 3042 + 3043 + lodash.merge@4.6.2: {} 3044 + 3045 + long-timeout@0.1.1: {} 3046 + 3047 + lru-cache@10.4.3: {} 3048 + 3049 + luxon@3.7.2: {} 3050 + 3051 + magic-string@0.30.21: 3052 + dependencies: 3053 + '@jridgewell/sourcemap-codec': 1.5.5 3054 + 3055 + mimic-response@3.1.0: {} 3056 + 3057 + minimatch@3.1.2: 3058 + dependencies: 3059 + brace-expansion: 1.1.12 3060 + 3061 + minimatch@9.0.5: 3062 + dependencies: 3063 + brace-expansion: 2.0.2 3064 + 3065 + minimist@1.2.8: {} 3066 + 3067 + mkdirp-classic@0.5.3: {} 3068 + 3069 + mri@1.2.0: {} 3070 + 3071 + mrmime@2.0.1: {} 3072 + 3073 + ms@2.1.3: {} 3074 + 3075 + multiformats@9.9.0: {} 3076 + 3077 + nanoid@3.3.11: {} 3078 + 3079 + napi-build-utils@2.0.0: {} 3080 + 3081 + natural-compare@1.4.0: {} 3082 + 3083 + node-abi@3.85.0: 3084 + dependencies: 3085 + semver: 7.7.3 3086 + 3087 + node-schedule@2.1.1: 3088 + dependencies: 3089 + cron-parser: 4.9.0 3090 + long-timeout: 0.1.1 3091 + sorted-array-functions: 1.3.0 3092 + 3093 + on-exit-leak-free@2.1.2: {} 3094 + 3095 + once@1.4.0: 3096 + dependencies: 3097 + wrappy: 1.0.2 3098 + 3099 + optionator@0.9.4: 3100 + dependencies: 3101 + deep-is: 0.1.4 3102 + fast-levenshtein: 2.0.6 3103 + levn: 0.4.1 3104 + prelude-ls: 1.2.1 3105 + type-check: 0.4.0 3106 + word-wrap: 1.2.5 3107 + 3108 + p-limit@3.1.0: 3109 + dependencies: 3110 + yocto-queue: 0.1.0 3111 + 3112 + p-locate@5.0.0: 3113 + dependencies: 3114 + p-limit: 3.1.0 3115 + 3116 + parent-module@1.0.1: 3117 + dependencies: 3118 + callsites: 3.1.0 3119 + 3120 + path-exists@4.0.0: {} 3121 + 3122 + path-key@3.1.1: {} 3123 + 3124 + path-parse@1.0.7: {} 3125 + 3126 + picocolors@1.1.1: {} 3127 + 3128 + picomatch@4.0.3: {} 3129 + 3130 + pino-abstract-transport@1.2.0: 3131 + dependencies: 3132 + readable-stream: 4.7.0 3133 + split2: 4.2.0 3134 + 3135 + pino-abstract-transport@2.0.0: 3136 + dependencies: 3137 + split2: 4.2.0 3138 + 3139 + pino-std-serializers@6.2.2: {} 3140 + 3141 + pino-std-serializers@7.0.0: {} 3142 + 3143 + pino@10.1.0: 3144 + dependencies: 3145 + '@pinojs/redact': 0.4.0 3146 + atomic-sleep: 1.0.0 3147 + on-exit-leak-free: 2.1.2 3148 + pino-abstract-transport: 2.0.0 3149 + pino-std-serializers: 7.0.0 3150 + process-warning: 5.0.0 3151 + quick-format-unescaped: 4.0.4 3152 + real-require: 0.2.0 3153 + safe-stable-stringify: 2.5.0 3154 + sonic-boom: 4.2.0 3155 + thread-stream: 3.1.0 3156 + 3157 + pino@8.21.0: 3158 + dependencies: 3159 + atomic-sleep: 1.0.0 3160 + fast-redact: 3.5.0 3161 + on-exit-leak-free: 2.1.2 3162 + pino-abstract-transport: 1.2.0 3163 + pino-std-serializers: 6.2.2 3164 + process-warning: 3.0.0 3165 + quick-format-unescaped: 4.0.4 3166 + real-require: 0.2.0 3167 + safe-stable-stringify: 2.5.0 3168 + sonic-boom: 3.8.1 3169 + thread-stream: 2.7.0 3170 + 3171 + postcss-load-config@3.1.4(postcss@8.5.6): 3172 + dependencies: 3173 + lilconfig: 2.1.0 3174 + yaml: 1.10.2 3175 + optionalDependencies: 3176 + postcss: 8.5.6 3177 + 3178 + postcss-safe-parser@7.0.1(postcss@8.5.6): 3179 + dependencies: 3180 + postcss: 8.5.6 3181 + 3182 + postcss-scss@4.0.9(postcss@8.5.6): 3183 + dependencies: 3184 + postcss: 8.5.6 3185 + 3186 + postcss-selector-parser@7.1.1: 3187 + dependencies: 3188 + cssesc: 3.0.0 3189 + util-deprecate: 1.0.2 3190 + 3191 + postcss@8.5.6: 3192 + dependencies: 3193 + nanoid: 3.3.11 3194 + picocolors: 1.1.1 3195 + source-map-js: 1.2.1 3196 + 3197 + prebuild-install@7.1.3: 3198 + dependencies: 3199 + detect-libc: 2.1.2 3200 + expand-template: 2.0.3 3201 + github-from-package: 0.0.0 3202 + minimist: 1.2.8 3203 + mkdirp-classic: 0.5.3 3204 + napi-build-utils: 2.0.0 3205 + node-abi: 3.85.0 3206 + pump: 3.0.3 3207 + rc: 1.2.8 3208 + simple-get: 4.0.1 3209 + tar-fs: 2.1.4 3210 + tunnel-agent: 0.6.0 3211 + 3212 + prelude-ls@1.2.1: {} 3213 + 3214 + process-warning@3.0.0: {} 3215 + 3216 + process-warning@5.0.0: {} 3217 + 3218 + process@0.11.10: {} 3219 + 3220 + pump@3.0.3: 3221 + dependencies: 3222 + end-of-stream: 1.4.5 3223 + once: 1.4.0 3224 + 3225 + punycode@2.3.1: {} 3226 + 3227 + quick-format-unescaped@4.0.4: {} 3228 + 3229 + rc@1.2.8: 3230 + dependencies: 3231 + deep-extend: 0.6.0 3232 + ini: 1.3.8 3233 + minimist: 1.2.8 3234 + strip-json-comments: 2.0.1 3235 + 3236 + readable-stream@3.6.2: 3237 + dependencies: 3238 + inherits: 2.0.4 3239 + string_decoder: 1.3.0 3240 + util-deprecate: 1.0.2 3241 + 3242 + readable-stream@4.7.0: 3243 + dependencies: 3244 + abort-controller: 3.0.0 3245 + buffer: 6.0.3 3246 + events: 3.3.0 3247 + process: 0.11.10 3248 + string_decoder: 1.3.0 3249 + 3250 + readdirp@4.1.2: {} 3251 + 3252 + real-require@0.2.0: {} 3253 + 3254 + resolve-from@4.0.0: {} 3255 + 3256 + resolve-pkg-maps@1.0.0: {} 3257 + 3258 + resolve@1.22.11: 3259 + dependencies: 3260 + is-core-module: 2.16.1 3261 + path-parse: 1.0.7 3262 + supports-preserve-symlinks-flag: 1.0.0 3263 + 3264 + rollup@4.53.3: 3265 + dependencies: 3266 + '@types/estree': 1.0.8 3267 + optionalDependencies: 3268 + '@rollup/rollup-android-arm-eabi': 4.53.3 3269 + '@rollup/rollup-android-arm64': 4.53.3 3270 + '@rollup/rollup-darwin-arm64': 4.53.3 3271 + '@rollup/rollup-darwin-x64': 4.53.3 3272 + '@rollup/rollup-freebsd-arm64': 4.53.3 3273 + '@rollup/rollup-freebsd-x64': 4.53.3 3274 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 3275 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 3276 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 3277 + '@rollup/rollup-linux-arm64-musl': 4.53.3 3278 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 3279 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 3280 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 3281 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 3282 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 3283 + '@rollup/rollup-linux-x64-gnu': 4.53.3 3284 + '@rollup/rollup-linux-x64-musl': 4.53.3 3285 + '@rollup/rollup-openharmony-arm64': 4.53.3 3286 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 3287 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 3288 + '@rollup/rollup-win32-x64-gnu': 4.53.3 3289 + '@rollup/rollup-win32-x64-msvc': 4.53.3 3290 + fsevents: 2.3.3 3291 + 3292 + sade@1.8.1: 3293 + dependencies: 3294 + mri: 1.2.0 3295 + 3296 + safe-buffer@5.2.1: {} 3297 + 3298 + safe-stable-stringify@2.5.0: {} 3299 + 3300 + semver@7.7.3: {} 3301 + 3302 + set-cookie-parser@2.7.2: {} 3303 + 3304 + shebang-command@2.0.0: 3305 + dependencies: 3306 + shebang-regex: 3.0.0 3307 + 3308 + shebang-regex@3.0.0: {} 3309 + 3310 + simple-concat@1.0.1: {} 3311 + 3312 + simple-get@4.0.1: 3313 + dependencies: 3314 + decompress-response: 6.0.0 3315 + once: 1.4.0 3316 + simple-concat: 1.0.1 3317 + 3318 + sirv@3.0.2: 3319 + dependencies: 3320 + '@polka/url': 1.0.0-next.29 3321 + mrmime: 2.0.1 3322 + totalist: 3.0.1 3323 + 3324 + sonic-boom@3.8.1: 3325 + dependencies: 3326 + atomic-sleep: 1.0.0 3327 + 3328 + sonic-boom@4.2.0: 3329 + dependencies: 3330 + atomic-sleep: 1.0.0 3331 + 3332 + sorted-array-functions@1.3.0: {} 3333 + 3334 + source-map-js@1.2.1: {} 3335 + 3336 + source-map-support@0.5.21: 3337 + dependencies: 3338 + buffer-from: 1.1.2 3339 + source-map: 0.6.1 3340 + 3341 + source-map@0.6.1: {} 3342 + 3343 + split2@4.2.0: {} 3344 + 3345 + string_decoder@1.3.0: 3346 + dependencies: 3347 + safe-buffer: 5.2.1 3348 + 3349 + strip-json-comments@2.0.1: {} 3350 + 3351 + strip-json-comments@3.1.1: {} 3352 + 3353 + supports-color@7.2.0: 3354 + dependencies: 3355 + has-flag: 4.0.0 3356 + 3357 + supports-preserve-symlinks-flag@1.0.0: {} 3358 + 3359 + svelte-check@4.3.4(picomatch@4.0.3)(svelte@5.45.8)(typescript@5.9.3): 3360 + dependencies: 3361 + '@jridgewell/trace-mapping': 0.3.31 3362 + chokidar: 4.0.3 3363 + fdir: 6.5.0(picomatch@4.0.3) 3364 + picocolors: 1.1.1 3365 + sade: 1.8.1 3366 + svelte: 5.45.8 3367 + typescript: 5.9.3 3368 + transitivePeerDependencies: 3369 + - picomatch 3370 + 3371 + svelte-eslint-parser@1.4.1(svelte@5.45.8): 3372 + dependencies: 3373 + eslint-scope: 8.4.0 3374 + eslint-visitor-keys: 4.2.1 3375 + espree: 10.4.0 3376 + postcss: 8.5.6 3377 + postcss-scss: 4.0.9(postcss@8.5.6) 3378 + postcss-selector-parser: 7.1.1 3379 + optionalDependencies: 3380 + svelte: 5.45.8 3381 + 3382 + svelte@5.45.8: 3383 + dependencies: 3384 + '@jridgewell/remapping': 2.3.5 3385 + '@jridgewell/sourcemap-codec': 1.5.5 3386 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) 3387 + '@types/estree': 1.0.8 3388 + acorn: 8.15.0 3389 + aria-query: 5.3.2 3390 + axobject-query: 4.1.0 3391 + clsx: 2.1.1 3392 + devalue: 5.6.0 3393 + esm-env: 1.2.2 3394 + esrap: 2.2.1 3395 + is-reference: 3.0.3 3396 + locate-character: 3.0.0 3397 + magic-string: 0.30.21 3398 + zimmerframe: 1.1.4 3399 + 3400 + tar-fs@2.1.4: 3401 + dependencies: 3402 + chownr: 1.1.4 3403 + mkdirp-classic: 0.5.3 3404 + pump: 3.0.3 3405 + tar-stream: 2.2.0 3406 + 3407 + tar-stream@2.2.0: 3408 + dependencies: 3409 + bl: 4.1.0 3410 + end-of-stream: 1.4.5 3411 + fs-constants: 1.0.0 3412 + inherits: 2.0.4 3413 + readable-stream: 3.6.2 3414 + 3415 + thread-stream@2.7.0: 3416 + dependencies: 3417 + real-require: 0.2.0 3418 + 3419 + thread-stream@3.1.0: 3420 + dependencies: 3421 + real-require: 0.2.0 3422 + 3423 + tinyglobby@0.2.15: 3424 + dependencies: 3425 + fdir: 6.5.0(picomatch@4.0.3) 3426 + picomatch: 4.0.3 3427 + 3428 + tlds@1.261.0: {} 3429 + 3430 + totalist@3.0.1: {} 3431 + 3432 + ts-api-utils@2.1.0(typescript@5.9.3): 3433 + dependencies: 3434 + typescript: 5.9.3 3435 + 3436 + tslib@2.8.1: {} 3437 + 3438 + tunnel-agent@0.6.0: 3439 + dependencies: 3440 + safe-buffer: 5.2.1 3441 + 3442 + type-check@0.4.0: 3443 + dependencies: 3444 + prelude-ls: 1.2.1 3445 + 3446 + typescript-eslint@8.49.0(eslint@9.39.1)(typescript@5.9.3): 3447 + dependencies: 3448 + '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) 3449 + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 3450 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) 3451 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 3452 + eslint: 9.39.1 3453 + typescript: 5.9.3 3454 + transitivePeerDependencies: 3455 + - supports-color 3456 + 3457 + typescript@5.9.3: {} 3458 + 3459 + uint8arrays@3.0.0: 3460 + dependencies: 3461 + multiformats: 9.9.0 3462 + 3463 + undici-types@7.16.0: {} 3464 + 3465 + undici@6.22.0: {} 3466 + 3467 + unicode-segmenter@0.14.1: {} 3468 + 3469 + uri-js@4.4.1: 3470 + dependencies: 3471 + punycode: 2.3.1 3472 + 3473 + util-deprecate@1.0.2: {} 3474 + 3475 + vite@7.2.7(@types/node@24.10.2): 3476 + dependencies: 3477 + esbuild: 0.25.12 3478 + fdir: 6.5.0(picomatch@4.0.3) 3479 + picomatch: 4.0.3 3480 + postcss: 8.5.6 3481 + rollup: 4.53.3 3482 + tinyglobby: 0.2.15 3483 + optionalDependencies: 3484 + '@types/node': 24.10.2 3485 + fsevents: 2.3.3 3486 + 3487 + vitefu@1.1.1(vite@7.2.7(@types/node@24.10.2)): 3488 + optionalDependencies: 3489 + vite: 7.2.7(@types/node@24.10.2) 3490 + 3491 + which@2.0.2: 3492 + dependencies: 3493 + isexe: 2.0.0 3494 + 3495 + word-wrap@1.2.5: {} 3496 + 3497 + wrappy@1.0.2: {} 3498 + 3499 + yaml@1.10.2: {} 3500 + 3501 + yocto-queue@0.1.0: {} 3502 + 3503 + zimmerframe@1.1.4: {} 3504 + 3505 + zod@3.25.76: {}
+4
pnpm-workspace.yaml
··· 1 + onlyBuiltDependencies: 2 + - better-sqlite3 3 + - core-js 4 + - esbuild
+21
src/app.d.ts
··· 1 + import type { Agent } from '@atproto/api'; 2 + // See https://svelte.dev/docs/kit/types#app.d.ts 3 + // for information about these interfaces 4 + declare global { 5 + namespace App { 6 + // interface Error {} 7 + interface Session { 8 + did: string; 9 + handle: string; 10 + } 11 + interface Locals { 12 + session: Session | null; 13 + atpAgent: Agent | null; 14 + } 15 + // interface PageData {} 16 + // interface PageState {} 17 + // interface Platform {} 18 + } 19 + } 20 + 21 + export {};
+11
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 + %sveltekit.head% 7 + </head> 8 + <body data-sveltekit-preload-data="hover"> 9 + <div style="display: contents">%sveltekit.body%</div> 10 + </body> 11 + </html>
+72
src/hooks.server.ts
··· 1 + import { db } from '$lib/server/db'; 2 + import type { Handle, ServerInit } from '@sveltejs/kit'; 3 + import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; 4 + import { env } from '$env/dynamic/private'; 5 + import { keyValueStore } from '$lib/server/db/schema'; 6 + import { and, eq, lt } from 'drizzle-orm'; 7 + import { STATE_STORE } from '$lib/server/cache'; 8 + import { logger } from '$lib/server/logger'; 9 + import { HOUR } from '@atproto/common'; 10 + import { getSessionManager } from '$lib/server/session'; 11 + 12 + const clearExpiredStates = async () => { 13 + try { 14 + logger.info('Running cleanup of the state store'); 15 + const oneHourAgo = new Date(Date.now() - HOUR); 16 + const result = await db 17 + .delete(keyValueStore) 18 + .where( 19 + and( 20 + eq(keyValueStore.storeName, STATE_STORE), 21 + lt(keyValueStore.createdAt, oneHourAgo)) 22 + ); 23 + 24 + if (result.changes > 0) { 25 + logger.info(`Cleaned up ${result.changes} expired key(s) from keyValueStore`); 26 + } 27 + } catch (err) { 28 + logger.error(`${(err as Error).message}`); 29 + } 30 + }; 31 + 32 + 33 + export const init: ServerInit = async () => { 34 + // Run Drizzle migrations on server startup 35 + migrate(db, { migrationsFolder: env.MIGRATIONS_FOLDER ?? 'drizzle' }); 36 + 37 + await clearExpiredStates(); 38 + 39 + // Start a background job to clean up state every hour, which is recommended in the oauth docs 40 + setInterval(async () => { 41 + await clearExpiredStates(); 42 + //TODO prob should do one for the session store as well for expired sessions 43 + }, HOUR); // Run every hour 44 + }; 45 + 46 + export const handle: Handle = async ({ event, resolve }) => { 47 + const token = event.cookies.get('session') ?? null; 48 + if (token === null) { 49 + event.locals.session = null; 50 + event.locals.atpAgent = null; 51 + return resolve(event); 52 + } 53 + const sessionManager = await getSessionManager(); 54 + const { atpAgent, did, handle } = await sessionManager.getSessionFromRequest(event); 55 + 56 + if(atpAgent == null){ 57 + event.locals.session = null; 58 + event.locals.atpAgent = null; 59 + return resolve(event); 60 + } 61 + 62 + // Store atpAgent in locals (server-side only, not serialized) 63 + event.locals.atpAgent = atpAgent; 64 + 65 + // Store only serializable data in session (gets passed to client via load functions) 66 + event.locals.session = { 67 + did, 68 + handle 69 + }; 70 + 71 + return resolve(event); 72 + };
+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>
+116
src/lib/components/HandleInput.svelte
··· 1 + <script lang="ts"> 2 + type ActorSuggestion = { handle: string; displayName?: string }; 3 + type TypeaheadResponse = { actors?: ActorSuggestion[] }; 4 + 5 + let { 6 + value = $bindable(''), 7 + name = 'handle', 8 + placeholder = 'Handle or Display name', 9 + required = true, 10 + id = 'handle-input', 11 + showDisplayName = false 12 + }: { 13 + value?: string; 14 + name?: string; 15 + placeholder?: string; 16 + required?: boolean; 17 + id?: string; 18 + showDisplayName?: boolean; 19 + } = $props(); 20 + 21 + let suggestions = $state<ActorSuggestion[]>([]); 22 + let loading = $state(false); 23 + let fetchError = $state<string | null>(null); 24 + 25 + let debounceTimer: ReturnType<typeof setTimeout> | null = null; 26 + let currentAbort: AbortController | null = null; 27 + 28 + async function fetchSuggestions(q: string) { 29 + if (currentAbort) currentAbort.abort(); 30 + currentAbort = new AbortController(); 31 + loading = true; 32 + fetchError = null; 33 + 34 + if(suggestions.length > 0) { 35 + const isThereAnExactMatch = suggestions.find(s => s.handle === q); 36 + if (isThereAnExactMatch) { 37 + loading = false; 38 + return; 39 + } 40 + } 41 + 42 + try { 43 + const url = `https://public.api.bsky.app/xrpc/app.bsky.actor.searchActorsTypeahead?q=${encodeURIComponent(q)}&limit=5`; 44 + const res = await fetch(url, { signal: currentAbort.signal }); 45 + if (!res.ok) throw new Error(`HTTP ${res.status}`); 46 + const data: TypeaheadResponse = await res.json(); 47 + suggestions = data.actors ?? []; 48 + if(suggestions.length === 1){ 49 + value = suggestions[0].handle; 50 + } 51 + } catch (e) { 52 + if (e instanceof DOMException && e.name === 'AbortError') return; 53 + fetchError = e instanceof Error ? e.message : 'Failed to load suggestions'; 54 + suggestions = []; 55 + } finally { 56 + loading = false; 57 + } 58 + } 59 + 60 + function onHandleInput(ev: Event) { 61 + const target = ev.target as HTMLInputElement; 62 + value = target.value; 63 + 64 + if (debounceTimer) clearTimeout(debounceTimer); 65 + 66 + if (value.trim().length >= 3) { 67 + debounceTimer = setTimeout(() => { 68 + fetchSuggestions(value.trim()); 69 + }, 300); 70 + } else { 71 + suggestions = []; 72 + fetchError = null; 73 + if (currentAbort) { 74 + currentAbort.abort(); 75 + currentAbort = null; 76 + } 77 + } 78 + } 79 + 80 + const datalistId = `${() => id}-suggestions`; 81 + </script> 82 + <style> 83 + .handle-input { 84 + display: flex; 85 + flex-direction: column; 86 + /*gap: 0.75rem;*/ 87 + } 88 + </style> 89 + <div class="handle-input"> 90 + <input 91 + type="text" 92 + {name} 93 + {id} 94 + {placeholder} 95 + {required} 96 + bind:value 97 + oninput={onHandleInput} 98 + list={datalistId} 99 + autocomplete="off" 100 + spellcheck="false" 101 + /> 102 + <datalist id={datalistId}> 103 + {#each suggestions as s, index (s.handle + index)} 104 + <option value={s.handle}> 105 + {#if s.displayName && showDisplayName}{`(${s.displayName})`}{/if} {s.handle} 106 + </option> 107 + {/each} 108 + </datalist> 109 + 110 + {#if loading} 111 + <p>Searching…</p> 112 + {/if} 113 + {#if fetchError} 114 + <p>{fetchError}</p> 115 + {/if} 116 + </div>
+43
src/lib/constellation.ts
··· 1 + // This wrappers around https://tangled.org/mary.my.id/atcute packages that call https://constellation.microcosm.blue 2 + // Constellation is a great way to get how records are connected without an appview, like seeing who and how many people has poked you! 3 + import { Client, ok, simpleFetchHandler } from '@atcute/client'; 4 + import { env } from '$env/dynamic/public'; 5 + import type {} from '@atcute/microcosm'; 6 + import type { Did } from '@atproto/api'; 7 + 8 + //Loads who has poked you using https://constellation.microcosm.blue 9 + export const getPokes = async (did: string, count: number = 10, cursor: string | undefined = undefined) => { 10 + const constellation = new Client({ 11 + handler: simpleFetchHandler({ service: env.PUBLIC_CONSTELLATION_ENDPOINT ?? 'https://constellation.microcosm.blue' }), 12 + }); 13 + const backlinks = await ok( 14 + constellation.get('blue.microcosm.links.getBacklinks', { 15 + params: { 16 + subject: did as Did, 17 + source: 'xyz.atpoke.graph.poke:subject', 18 + limit: count, 19 + cursor 20 + }, 21 + }), 22 + ); 23 + 24 + return backlinks; 25 + }; 26 + 27 + //Gets the users handle via https://slingshot.microcosm.blue 28 + //You will want to somewhat cache the results from this. I am on the front end so if someone pokes someone 10 times it only resolves the handle once 29 + export const getHandle = async (did: string) => { 30 + const slingshot = new Client({ 31 + handler: simpleFetchHandler({ service: env.PUBLIC_SLINGSHOT_ENDPOINT ?? 'https://slingshot.microcosm.blue' }), 32 + }); 33 + 34 + const resolved = await ok( 35 + slingshot.get('com.bad-example.identity.resolveMiniDoc', { 36 + params: { 37 + identifier: did as Did, 38 + }, 39 + }), 40 + ); 41 + 42 + return resolved.handle; 43 + };
+1
src/lib/index.ts
··· 1 + // place files you want to import through the `$lib` alias in this folder.
+79
src/lib/server/atproto/client.ts
··· 1 + // Loads all your OAuth settings from here and then uses the client everywhere else. metadata endpoint, jwks, etc 2 + 3 + import { atprotoLoopbackClientMetadata, Keyset, NodeOAuthClient } from '@atproto/oauth-client-node'; 4 + import { JoseKey } from '@atproto/jwk-jose'; 5 + import { db } from '$lib/server/db'; 6 + import { SessionStore, StateStore } from '$lib/server/atproto/storage'; 7 + import { env } from '$env/dynamic/private'; 8 + import type { OAuthClientMetadataInput } from '@atproto/oauth-types'; 9 + 10 + //You will need to change these if you are using another collection, can also change by setting the env OAUTH_SCOPES 11 + //For permission to all you can uncomment below 12 + // const DEFAULT_SCOPES = 'atproto transition:generic'; 13 + const DEFAULT_SCOPES = 'atproto repo:app.bsky.feed.post?action=create repo:xyz.atpoke.graph.poke'; 14 + const loadJwk = async () => { 15 + const raw = env.OAUTH_JWK; 16 + if (!raw) return undefined; 17 + const json = JSON.parse(raw); 18 + if (!json) return undefined; 19 + const keys = await Promise.all( 20 + json.map((jwk: string | Record<string, unknown>) => JoseKey.fromJWK(jwk)), 21 + ); 22 + return new Keyset(keys); 23 + }; 24 + 25 + 26 + let client: Promise<NodeOAuthClient> | null = null; 27 + 28 + export const atpOAuthClient = async () => { 29 + if (!client) { 30 + client = (async () => { 31 + const rootDomain = env.OAUTH_DOMAIN ?? '127.0.0.1:5173'; 32 + const dev = env.DEV !== undefined; 33 + const isConfidential = env.OAUTH_JWK !== undefined; 34 + 35 + if(!dev && env.OAUTH_DOMAIN === undefined){ 36 + throw new Error('OAUTH_DOMAIN must be set in production'); 37 + } 38 + 39 + const keyset = env.OAUTH_JWK && env.OAUTH_DOMAIN 40 + ? await loadJwk() 41 + : undefined; 42 + // @ts-expect-error I have no idea why it doesn't like use 43 + const pk = keyset?.findPrivateKey({ use: 'sig' }); 44 + const rootUrl = `https://${rootDomain}`; 45 + const clientMetadata: OAuthClientMetadataInput = dev 46 + ? atprotoLoopbackClientMetadata( 47 + `http://localhost?${new URLSearchParams([ 48 + ['redirect_uri', `http://${rootDomain}/oauth/callback`], 49 + ['scope', env.OAUTH_SCOPES ?? DEFAULT_SCOPES], 50 + ])}`, 51 + ) : 52 + { 53 + client_name: env.OAUTH_CLIENT_NAME, 54 + logo_uri: env.OAUTH_LOGO_URI, 55 + client_id: `${rootUrl}/oauth-client-metadata.json`, 56 + client_uri: rootUrl, 57 + redirect_uris: [`${rootUrl}/oauth/callback`], 58 + scope: env.OAUTH_SCOPES ?? DEFAULT_SCOPES, 59 + grant_types: ['authorization_code', 'refresh_token'], 60 + application_type: 'web', 61 + token_endpoint_auth_method: isConfidential ? 'private_key_jwt' : 'none', 62 + dpop_bound_access_tokens: true, 63 + jwks_uri: isConfidential ? `${rootUrl}/.well-known/jwks.json` : undefined, 64 + token_endpoint_auth_signing_alg: isConfidential ? pk?.alg : undefined 65 + }; 66 + 67 + return new NodeOAuthClient({ 68 + stateStore: new StateStore(db), 69 + sessionStore: new SessionStore(db), 70 + keyset, 71 + clientMetadata, 72 + // Not needed since this all runs locally to one machine I believe. But if you do run multiple instances and change out the DB from sqlite may need this 73 + // https://github.com/bluesky-social/atproto/tree/main/packages/oauth/oauth-client-node#requestlock 74 + requestLock: undefined, 75 + }); 76 + })(); 77 + } 78 + return client; 79 + };
+56
src/lib/server/atproto/storage.ts
··· 1 + //Inter faces required by oquth-client-node for storing sessions and state 2 + 3 + import type { 4 + NodeSavedSession, 5 + NodeSavedSessionStore, 6 + NodeSavedState, 7 + NodeSavedStateStore 8 + } from '@atproto/oauth-client-node'; 9 + import { Cache, SESSION_STORE, STATE_STORE } from '$lib/server/cache'; 10 + import { db } from '$lib/server/db'; 11 + 12 + export class StateStore implements NodeSavedStateStore{ 13 + 14 + cache: Cache; 15 + 16 + constructor(database: typeof db) { 17 + this.cache = new Cache(database, STATE_STORE); 18 + } 19 + 20 + async del(key: string) { 21 + await this.cache.delete(key); 22 + } 23 + 24 + async get(key: string){ 25 + const value = await this.cache.get(key); 26 + return value ? JSON.parse(value) as NodeSavedState : undefined; 27 + } 28 + 29 + async set(key: string, value: NodeSavedState) { 30 + const json = JSON.stringify(value); 31 + await this.cache.set(key, json); 32 + } 33 + } 34 + 35 + export class SessionStore implements NodeSavedSessionStore{ 36 + 37 + cache: Cache; 38 + 39 + constructor(database: typeof db) { 40 + this.cache = new Cache(database, SESSION_STORE); 41 + } 42 + 43 + async del(key: string) { 44 + await this.cache.delete(key); 45 + } 46 + 47 + async get(key: string){ 48 + const value = await this.cache.get(key); 49 + return value ? JSON.parse(value) as NodeSavedSession : undefined; 50 + } 51 + 52 + async set(key: string, value: NodeSavedSession) { 53 + const json = JSON.stringify(value); 54 + await this.cache.set(key, json); 55 + } 56 + }
+45
src/lib/server/cache.ts
··· 1 + // A key value key to the database that is mostly used for atproto session storage and state storage during the oauth session creation 2 + // The "stores" are divided up by a where on the store type so it can share the same interface just with that 3 + 4 + import { db } from './db'; 5 + import { keyValueStore } from './db/schema'; 6 + import { and, eq } from 'drizzle-orm'; 7 + 8 + export const SESSION_STORE = 'sessions'; 9 + export const STATE_STORE = 'states'; 10 + 11 + export class Cache { 12 + 13 + db: typeof db; 14 + cacheName: string; 15 + 16 + constructor(database: typeof db, cacheName: string) { 17 + this.db = database; 18 + this.cacheName = cacheName; 19 + } 20 + 21 + async get(key: string) { 22 + const result = await this.db.select().from(keyValueStore).where(and( 23 + eq(keyValueStore.key, key), 24 + eq(keyValueStore.storeName, this.cacheName) 25 + )).limit(1); 26 + if(result.length > 0){ 27 + return result[0].value; 28 + } 29 + return null; 30 + } 31 + 32 + async set(key: string, value: string) { 33 + return this.db.insert(keyValueStore) 34 + .values({ key, value, storeName: this.cacheName, createdAt: new Date() }) 35 + .onConflictDoUpdate({ 36 + target: keyValueStore.key, 37 + set: { value, createdAt: new Date() } 38 + }); 39 + } 40 + 41 + async delete(key: string) { 42 + return this.db.delete(keyValueStore).where(eq(keyValueStore.key, key)); 43 + } 44 + 45 + }
+11
src/lib/server/db/index.ts
··· 1 + import { drizzle } from 'drizzle-orm/better-sqlite3'; 2 + import Database from 'better-sqlite3'; 3 + import * as schema from './schema'; 4 + import { env } from '$env/dynamic/private'; 5 + import { logger } from '$lib/server/logger'; 6 + 7 + if (!env.DATABASE_URL) throw new Error('DATABASE_URL is not set'); 8 + 9 + const client = new Database(env.DATABASE_URL); 10 + logger.info('Connected to database'); 11 + export const db = drizzle(client, { schema });
+19
src/lib/server/db/schema.ts
··· 1 + import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'; 2 + 3 + export const keyValueStore = sqliteTable('key_value_store', { 4 + key: text('key').primaryKey(), 5 + value: text('value'), 6 + storeName: text('storeName'), 7 + createdAt: integer({ mode: 'timestamp' }) // Date 8 + }); 9 + 10 + 11 + export const sessionStore = sqliteTable('session_store', { 12 + id: text('id').primaryKey(), 13 + //Not leaving unique since it could be multiple logins from the same user across browsers 14 + did: text('did').notNull(), 15 + handle: text('handle').notNull(), 16 + createdAt: integer({ mode: 'timestamp' }).notNull(), // Date 17 + expiresAt: integer({ mode: 'timestamp' }).notNull() // Date 18 + 19 + });
+3
src/lib/server/logger.ts
··· 1 + import pino from 'pino'; 2 + 3 + export const logger = pino();
+137
src/lib/server/session.ts
··· 1 + // A cookie session store based on https://lucia-auth.com/ examples which is recommended from Svelte's docs 2 + // Creates a cookie that links to a session store inside the database allowing the atproto oauth session to be loaded 3 + 4 + import { db } from './db'; 5 + import { atpOAuthClient } from './atproto/client'; 6 + import { encodeBase32LowerCaseNoPadding, encodeHexLowerCase } from '@oslojs/encoding'; 7 + import { sha256 } from '@oslojs/crypto/sha2'; 8 + import { DAY } from '@atproto/common'; 9 + import { sessionStore } from '$lib/server/db/schema'; 10 + import type { RequestEvent } from '@sveltejs/kit'; 11 + import { eq } from 'drizzle-orm'; 12 + import { Agent } from '@atproto/api'; 13 + import type { NodeOAuthClient } from '@atproto/oauth-client-node'; 14 + import { logger } from '$lib/server/logger'; 15 + 16 + 17 + // This is a sliding expiration for the cookie session. Can change it if you want it to be less or more. 18 + // The actual atproto session goes for a while if it's a confidential client as long as it's refreshed 19 + // https://atproto.com/specs/oauth#tokens-and-session-lifetime 20 + const DEFAULT_EXPIRY = 30 * DAY; 21 + 22 + const NULL_SESSION_RESPONSE = { atpAgent: null, did: null, handle: null }; 23 + 24 + 25 + export class Session { 26 + db: typeof db; 27 + atpOAuthClient: NodeOAuthClient; 28 + 29 + constructor(database: typeof db, oauthClient: NodeOAuthClient) { 30 + this.db = database; 31 + this.atpOAuthClient = oauthClient; 32 + } 33 + 34 + 35 + async validateSessionToken(token: string): Promise<SessionValidationResult> { 36 + const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token))); 37 + const result = await this.db.select().from(sessionStore).where(eq(sessionStore.id, sessionId)).limit(1); 38 + if(result.length > 1){ 39 + throw new Error('Multiple sessions found for token. Should not happen'); 40 + } 41 + if(result.length === 0){ 42 + return NULL_SESSION_RESPONSE; 43 + } 44 + const session = result[0]; 45 + 46 + if (Date.now() >= session.expiresAt.getTime()) { 47 + await this.invalidateSession(session.id); 48 + logger.warn(`Session expired for the did: ${session.did}`); 49 + return NULL_SESSION_RESPONSE; 50 + } 51 + if (Date.now() >= session.expiresAt.getTime() - 1000 * 60 * 60 * 24 * 15) { 52 + session.expiresAt = new Date(Date.now() + DEFAULT_EXPIRY); 53 + await this.db.update(sessionStore).set(session).where(eq(sessionStore.id, sessionId)); 54 + } 55 + 56 + const oAuthSession = await this.atpOAuthClient.restore(session.did); 57 + const agent = new Agent(oAuthSession); 58 + return { atpAgent: agent, did: session.did, handle: session.handle }; 59 + } 60 + 61 + private setSessionTokenCookie(event: RequestEvent, token: string, expiresAt: Date): void { 62 + event.cookies.set('session', token, { 63 + httpOnly: true, 64 + path: '/', 65 + secure: import.meta.env.PROD, 66 + sameSite: 'lax', 67 + expires: expiresAt 68 + }); 69 + } 70 + 71 + deleteSessionTokenCookie(event: RequestEvent): void { 72 + event.cookies.set('session', '', { 73 + httpOnly: true, 74 + path: '/', 75 + secure: import.meta.env.PROD, 76 + sameSite: 'lax', 77 + maxAge: 0 78 + }); 79 + } 80 + 81 + async invalidateSession(sessionId: string) { 82 + await this.db.delete(sessionStore).where(eq(sessionStore.id, sessionId)); 83 + } 84 + 85 + async invalidateSessionByToken(token: string) { 86 + const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token))); 87 + await this.invalidateSession(sessionId); 88 + } 89 + 90 + async invalidateUserSessions(did: string) { 91 + await this.db.delete(sessionStore).where(eq(sessionStore.did, did)); 92 + } 93 + 94 + private async createSession(token: string, did: string, handle: string) { 95 + const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token))); 96 + const expiresAt = new Date(Date.now() + DEFAULT_EXPIRY); 97 + const session = { id: sessionId, did, handle, expiresAt, createdAt: new Date() }; 98 + await this.db.insert(sessionStore).values(session); 99 + return session; 100 + } 101 + 102 + private generateSessionToken(): string { 103 + const tokenBytes = new Uint8Array(20); 104 + crypto.getRandomValues(tokenBytes); 105 + return encodeBase32LowerCaseNoPadding(tokenBytes); 106 + } 107 + 108 + async createAndSetSession(event: RequestEvent, did: string, handle: string) { 109 + const token = this.generateSessionToken(); 110 + const session = await this.createSession(token, did, handle); 111 + this.setSessionTokenCookie(event, token, session.expiresAt); 112 + return session; 113 + } 114 + 115 + async getSessionFromRequest(event: RequestEvent): Promise<SessionValidationResult> { 116 + const token = event.cookies.get('session'); 117 + if (!token) { 118 + return NULL_SESSION_RESPONSE; 119 + } 120 + return this.validateSessionToken(token); 121 + } 122 + 123 + } 124 + 125 + type SessionValidationResult = { atpAgent: Agent, did: string, handle: string } | { atpAgent: null, did: null, handle: null }; 126 + 127 + let sessionManager: Promise<Session> | null = null; 128 + 129 + export const getSessionManager = async (): Promise<Session> => { 130 + if (!sessionManager) { 131 + sessionManager = (async () => { 132 + const client = await atpOAuthClient(); 133 + return new Session(db, client); 134 + })(); 135 + } 136 + return sessionManager; 137 + };
+7
src/routes/+layout.server.ts
··· 1 + import type { LayoutServerLoad } from './$types'; 2 + 3 + export const load: LayoutServerLoad = async (event) => { 4 + return { 5 + session: event.locals.session 6 + }; 7 + };
+61
src/routes/+layout.svelte
··· 1 + <script lang="ts"> 2 + import favicon from '$lib/assets/favicon.svg'; 3 + let { children, data } = $props(); 4 + import { enhance } from '$app/forms'; 5 + </script> 6 + 7 + <style> 8 + nav { 9 + border-bottom: 1px solid black; 10 + } 11 + 12 + .navbar ol { 13 + list-style-type: none; 14 + padding-left: 0; 15 + margin: 0; 16 + display: flex; 17 + flex-direction: row; 18 + align-items: center; 19 + gap: 0.75rem; 20 + padding-bottom: 1%; 21 + } 22 + 23 + .link { 24 + display: inline-block; 25 + } 26 + 27 + .welcome { 28 + font-weight: bold; 29 + margin-bottom: 10px; 30 + } 31 + 32 + </style> 33 + 34 + <svelte:head> 35 + <link rel="icon" href={favicon} /> 36 + </svelte:head> 37 + 38 + {#if data.session} 39 + <nav class="navbar"> 40 + {#if data.session.did} 41 + <h3 class="welcome"> Welcome {data.session.handle} </h3> 42 + {/if} 43 + <ol> 44 + <li> 45 + <form method="POST" action="/logout" use:enhance> 46 + <button class="link" type="submit" >logout</button> 47 + </form> 48 + </li> 49 + <li> 50 + <a href="/">Home</a> 51 + </li> 52 + 53 + <li> 54 + <a href="/demo">Demo</a> 55 + </li> 56 + </ol> 57 + </nav> 58 + {/if} 59 + <main> 60 + {@render children()} 61 + </main>
+7
src/routes/+page.server.ts
··· 1 + import type { PageServerLoad } from './$types'; 2 + 3 + export const load: PageServerLoad = async (event) => { 4 + return { 5 + session: event.locals.session 6 + }; 7 + };
+31
src/routes/+page.svelte
··· 1 + <script lang="ts"> 2 + import type { PageProps } from './$types'; 3 + let { data }: PageProps = $props(); 4 + </script> 5 + 6 + <style> 7 + a { 8 + text-decoration: underline darkblue; 9 + } 10 + </style> 11 + 12 + <div> 13 + <h1>SvelteKit ATProtocol OAuth template</h1> 14 + <h3>A build your own ATProto adventure</h3> 15 + <p> It's up to you on what this project should be and what it looks like. This is mostly just a technical preview showing a demo of what the application looks like and how it works. But if you <a href="/login">Login</a> you can poke people or see who poked you, so there's that at least.</p> 16 + <h3>A bare minimal SvelteKit demo that...</h3> 17 + <ul> 18 + <li>Can have local dev oauth with setting the <code>.env</code> variable <code>DEV=true</code></li> 19 + <li>Can switch to production oauth when you set the <code>OAUTH_DOMAIN</code> 20 + variable to a domain like <code>mycoolwebsite.xyz</code> 21 + and making sure the website is server to the internet</li> 22 + <li>A persistent session store using <a href="https://orm.drizzle.team/">drizzle</a> with sqlite</li> 23 + <li>A docker compose and documentation on how to deploy to <a href="https://railway.com/">railway</a></li> 24 + <li><a href="/demo">An example page using the atproto Agent where you can make a post or poke someone</a> </li> 25 + <li>Source code can be found on <a href="https://tangled.org/baileytownsend.dev/atproto-sveltekit-template">tangled.org</a> </li> 26 + </ul> 27 + <br/> 28 + {#if !data.session} 29 + <a href="/login">Login</a> 30 + {/if} 31 + </div>
+14
src/routes/.well-known/jwks.json/+server.ts
··· 1 + //Loads the public jwk's which are needed for a confidential client 2 + import type { RequestHandler } from './$types'; 3 + import { json } from '@sveltejs/kit'; 4 + import { atpOAuthClient } from '$lib/server/atproto/client'; 5 + 6 + export const GET: RequestHandler = async () => { 7 + const client = await atpOAuthClient(); 8 + 9 + return json(client.jwks, { 10 + headers: { 11 + 'Cache-Control': 'no-store' 12 + } 13 + }); 14 + };
+93
src/routes/demo/+page.server.ts
··· 1 + import type { PageServerLoad } from './$types'; 2 + import { type Actions, fail, redirect } from '@sveltejs/kit'; 3 + import { RichText } from '@atproto/api'; 4 + import { logger } from '$lib/server/logger'; 5 + 6 + export const load: PageServerLoad = async (event) => { 7 + if(!event.locals.session) { 8 + return redirect(302, '/login'); 9 + } 10 + return { usersDid: event.locals.session.did }; 11 + }; 12 + 13 + 14 + export const actions = { 15 + makeAPost: async (event) => { 16 + try{ 17 + const agent = event.locals.atpAgent; 18 + if (!agent) { 19 + return fail(401, { error: 'Not authenticated' }); 20 + } 21 + 22 + const form = await event.request.formData(); 23 + const text = String(form.get('post_text') ?? '').trim(); 24 + const rt = new RichText({ text }); 25 + // Automatically detect mentions, links, hashtags 26 + await rt.detectFacets(agent); 27 + 28 + const record = { 29 + $type: 'app.bsky.feed.post', 30 + text: rt.text, 31 + facets: rt.facets, 32 + createdAt: new Date().toISOString(), 33 + }; 34 + 35 + const result = await agent.com.atproto.repo.createRecord({ 36 + repo: event.locals.session!.did, 37 + collection: 'app.bsky.feed.post', 38 + record: record, 39 + //Since this is a known lexicon to the PDS we can validate it on creation 40 + validate: true 41 + }); 42 + 43 + 44 + return { success: true, result: result.data }; 45 + 46 + } 47 + catch (err) { 48 + const errorMessage = (err as Error).message; 49 + logger.error(errorMessage); 50 + return fail(400, { error: errorMessage }); 51 + } 52 + }, 53 + poke: async (event) => { 54 + try{ 55 + const agent = event.locals.atpAgent; 56 + if (!agent) { 57 + return fail(401, { error: 'Not authenticated' }); 58 + } 59 + 60 + const form = await event.request.formData(); 61 + const handle = String(form.get('handle') ?? '').trim(); 62 + 63 + 64 + const toPokesDid = await agent.com.atproto.identity.resolveHandle({ handle }); 65 + 66 + // Can view the lexicon schema at the below url. just doing plain json for now instead of a strong type 67 + // https://selfhosted.social/xrpc/com.atproto.repo.getRecord?repo=did:plc:rnpkyqnmsw4ipey6eotbdnnf&collection=com.atproto.lexicon.schema&rkey=xyz.atpoke.graph.poke 68 + // Ideally you should type it and pull it in and all that good stuff, but yeah you can just send json as well 69 + // The correct way would be using something like this https://github.com/bluesky-social/atproto/tree/main/packages/lex/lex 70 + 71 + const record = { 72 + $type: 'xyz.atpoke.graph.poke', 73 + subject: toPokesDid.data.did, 74 + createdAt: new Date().toISOString(), 75 + }; 76 + 77 + await agent.com.atproto.repo.createRecord({ 78 + repo: event.locals.session!.did, 79 + collection: 'xyz.atpoke.graph.poke', 80 + record: record, 81 + }); 82 + 83 + return { pokeResult: `You just poked ${handle}!`, pokedHandle: handle }; 84 + 85 + } 86 + catch (err) { 87 + const errorMessage = (err as Error).message; 88 + logger.error(errorMessage); 89 + return fail(400, { error: errorMessage }); 90 + } 91 + } 92 + } satisfies Actions; 93 +
+120
src/routes/demo/+page.svelte
··· 1 + <script lang="ts"> 2 + import type { PageProps } from './$types'; 3 + import { enhance } from '$app/forms'; 4 + import HandleInput from '$lib/components/HandleInput.svelte'; 5 + import { getHandle, getPokes } from '$lib/constellation'; 6 + 7 + type Poker = { handle: string, did: string, pokes: number }; 8 + let pokers = $state<Poker[]>([]); 9 + let { form, data }: PageProps = $props(); 10 + let handleQuery = $state(''); 11 + let constellationCursor = $state<string | undefined>(undefined); 12 + 13 + const bskyPostText = (handle: string) => encodeURIComponent(`I just poked @${handle} with demo.atpoke.xyz`); 14 + 15 + const didWeAlreadyFindTheHandle = (did: string) => pokers.find((p) => p.did === did); 16 + 17 + //Shows how you can load backlinks from constellation to see who has poked you. 18 + const loadWhoPoked = async () => { 19 + //Gets a list of who all has poked you from constellation 20 + const backLinks = await getPokes(data.usersDid, 25, constellationCursor); 21 + constellationCursor = backLinks.cursor; 22 + if(backLinks.records.length > 0 ){ 23 + for (const record of backLinks.records) { 24 + //No need to do a second call if we already found the handle 25 + const alreadyFoundHandle = didWeAlreadyFindTheHandle(record.did); 26 + if(alreadyFoundHandle){ 27 + alreadyFoundHandle.pokes++; 28 + }else{ 29 + pokers.push({ 30 + //Example showing you how you can easily get a handle from a did with slingshot 31 + handle: await getHandle(record.did), 32 + did: record.did, 33 + pokes: 1 34 + }); 35 + } 36 + } 37 + } 38 + }; 39 + 40 + 41 + </script> 42 + 43 + <style> 44 + .error { 45 + color: red; 46 + } 47 + 48 + textarea { 49 + width: 75%; 50 + height: 100px; 51 + } 52 + 53 + .poke-form { 54 + display: flex; 55 + flex-direction: row; 56 + align-items: center; 57 + } 58 + 59 + .poke-button { 60 + align-self: start; 61 + } 62 + 63 + .give-me-some-space { 64 + margin-bottom: 10px 65 + } 66 + </style> 67 + 68 + {#if form?.error} 69 + <p class="error">{form.error}</p> 70 + {/if} 71 + 72 + <!--Make a bluesky post demo--> 73 + 74 + <form method="POST" action="/demo?/makeAPost" use:enhance> 75 + <h1>Make a Bluesky post</h1> 76 + <textarea name="post_text" rows="5" cols="60"> 77 + I am trying out @baileytownsend.dev's new atproto SvelteKit template. 78 + 79 + https://tangled.org/baileytownsend.dev/atproto-sveltekit-template 80 + </textarea> 81 + <br /> 82 + <button type="submit">Post</button> 83 + {#if form?.success} 84 + <p>Success! The post has been made</p> 85 + {/if} 86 + {#if form?.result} 87 + <pre>{JSON.stringify(form.result, null, 2)}</pre> 88 + {/if} 89 + </form> 90 + 91 + <!--Poke demo--> 92 + <h1>Poke someone</h1> 93 + <h3>You have been poked {data.totalPoked} times</h3> 94 + <div> 95 + <a href="https://ufos.microcosm.blue/collection/?nsid=xyz.atpoke.graph.poke">View xyz.atproto.graph.pokes on ufos</a> 96 + </div> 97 + 98 + <br/> 99 + {#if pokers.length > 0} 100 + <ul> 101 + {#each pokers as poker, index (index)} 102 + <li> <a href="{`https://bsky.app/profile/${poker.did}`}">{poker.handle}</a> {poker.pokes} times </li> 103 + {/each} 104 + </ul> 105 + {/if} 106 + {#if data.totalPoked > 0 && constellationCursor !== null} 107 + <button class="give-me-some-space" type="submit" onclick={loadWhoPoked}>{constellationCursor === undefined ? 'Load who poked you': 'Load more'}</button> 108 + {/if} 109 + <br/> 110 + 111 + <form method="POST" action="/demo?/poke" use:enhance> 112 + <div class="poke-form"> 113 + <HandleInput name="handle" bind:value={handleQuery} placeholder="Handle to poke" required showDisplayName/> 114 + <button class="poke-button" type="submit">Poke</button> 115 + </div> 116 + {#if form?.pokeResult} 117 + <span>{form.pokeResult}</span> 118 + <a href={`https://bsky.app/intent/compose?text=${bskyPostText(form?.pokedHandle)}`}>Tell them about it on Bluesky!</a> 119 + {/if} 120 + </form>
+11
src/routes/demo/+page.ts
··· 1 + import type { PageLoad } from './$types'; 2 + import { getPokes } from '$lib/constellation'; 3 + 4 + export const load: PageLoad = async (event) => { 5 + 6 + const backlinks = await getPokes(event.data.usersDid); 7 + return { 8 + totalPoked: backlinks.total, 9 + usersDid: event.data.usersDid 10 + }; 11 + };
+32
src/routes/login/+page.server.ts
··· 1 + import { isRedirect, redirect } from '@sveltejs/kit'; 2 + import { atpOAuthClient } from '$lib/server/atproto/client'; 3 + import type { Actions, PageServerLoad } from './$types'; 4 + import { fail } from '@sveltejs/kit'; 5 + import { logger } from '$lib/server/logger'; 6 + 7 + export const load: PageServerLoad = async (event) => { 8 + if(event.locals.session) { 9 + return redirect(302, '/demo'); 10 + } 11 + return; 12 + }; 13 + 14 + export const actions = { 15 + default: async ({ request }) => { 16 + try { 17 + const form = await request.formData(); 18 + const handle = String(form.get('handle') ?? '').trim(); 19 + const client = await atpOAuthClient(); 20 + const url = await client.authorize(handle); 21 + redirect(303, url); 22 + } 23 + catch (err) { 24 + //redirects are errors, so this passes it along 25 + if (isRedirect(err)) throw err; 26 + 27 + const errorMessage = (err as Error).message; 28 + logger.error(errorMessage); 29 + return fail(400, { error: errorMessage }); 30 + } 31 + } 32 + } satisfies Actions;
+35
src/routes/login/+page.svelte
··· 1 + <script lang="ts"> 2 + import type { PageProps } from './$types'; 3 + import { enhance } from '$app/forms'; 4 + import HandleInput from '$lib/components/HandleInput.svelte'; 5 + 6 + let { form }: PageProps = $props(); 7 + 8 + let handle = $state(''); 9 + </script> 10 + 11 + <style> 12 + .login-form { 13 + display: flex; 14 + flex-direction: row; 15 + align-items: center; 16 + } 17 + 18 + .login-button { 19 + align-self: start; 20 + } 21 + </style> 22 + 23 + <h1>ATProtocol OAuth Login</h1> 24 + 25 + <form action="/login" method="POST" use:enhance> 26 + <label for="handle">ATProtocol Handle</label> 27 + <div class="login-form"> 28 + <HandleInput bind:value={handle} id="handle" required placeholder="jcsalterego.bsky.social" /> 29 + <button class="login-button" type="submit">Submit</button> 30 + </div> 31 + <br /> 32 + {#if form?.error} 33 + <p>{form.error}</p> 34 + {/if} 35 + </form>
+23
src/routes/logout/+page.server.ts
··· 1 + import type { Actions } from './$types'; 2 + import { getSessionManager } from '$lib/server/session'; 3 + import { redirect } from '@sveltejs/kit'; 4 + import { atpOAuthClient } from '$lib/server/atproto/client'; 5 + 6 + export const actions: Actions = { 7 + default: async (event) => { 8 + const token = event.cookies.get('session'); 9 + 10 + if (token) { 11 + const sessionManager = await getSessionManager(); 12 + await sessionManager.invalidateSessionByToken(token); 13 + sessionManager.deleteSessionTokenCookie(event); 14 + 15 + const oauthClient = await atpOAuthClient(); 16 + if(event.locals.did) { 17 + await oauthClient.revoke(event.locals.did); 18 + } 19 + } 20 + 21 + redirect(303, '/'); 22 + } 23 + };
+13
src/routes/oauth-client-metadata.json/+server.ts
··· 1 + import type { RequestHandler } from './$types'; 2 + import { json } from '@sveltejs/kit'; 3 + import { atpOAuthClient } from '$lib/server/atproto/client'; 4 + 5 + export const GET: RequestHandler = async () => { 6 + const client = await atpOAuthClient(); 7 + 8 + return json(client.clientMetadata, { 9 + headers: { 10 + 'Cache-Control': 'no-store' 11 + } 12 + }); 13 + };
+57
src/routes/oauth/callback/+server.ts
··· 1 + import type { RequestHandler } from './$types'; 2 + import { isRedirect, type RequestEvent } from '@sveltejs/kit'; 3 + import { atpOAuthClient } from '$lib/server/atproto/client'; 4 + import { getSessionManager } from '$lib/server/session'; 5 + import { error, redirect } from '@sveltejs/kit'; 6 + import { logger } from '$lib/server/logger'; 7 + import { Agent } from '@atproto/api'; 8 + 9 + export const GET: RequestHandler = async (event: RequestEvent) => { 10 + try{ 11 + const params = new URLSearchParams(event.request.url.split('?')[1]); 12 + const client = await atpOAuthClient(); 13 + const { session } = await client.callback(params); 14 + 15 + //Should error out if we can't make a successful getSession call 16 + const agent = new Agent(session); 17 + const atpSession = await agent.com.atproto.server.getSession(); 18 + const sessionManager = await getSessionManager(); 19 + await sessionManager.createAndSetSession(event, session.did, atpSession.data.handle); 20 + 21 + // const agent = new Agent(session); 22 + // const dateStamp = new Date().toISOString(); 23 + // let token 24 + // await agent.com.atproto.repo.createRecord({ 25 + // collection: 'app.bsky.feed.post', 26 + // record: { 27 + // $type: 'app.bsky.feed.post', 28 + // text: 'I found Bailey\'s new SvelteKit template before he finished it and wrote documentation for it. I probably should of checked what it did first.', 29 + // langs: [ 30 + // 'en' 31 + // ], 32 + // reply: { 33 + // root: { 34 + // cid: 'bafyreigxcmxkn6egt5ykybaaztnbbkq74facddwva65bwxfyfqrevtpk64', 35 + // uri: 'at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/app.bsky.feed.post/3m7mi36bsp22u' 36 + // }, 37 + // parent: { 38 + // cid: 'bafyreigxcmxkn6egt5ykybaaztnbbkq74facddwva65bwxfyfqrevtpk64', 39 + // uri: 'at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/app.bsky.feed.post/3m7mi36bsp22u' 40 + // } 41 + // }, 42 + // createdAt: dateStamp, 43 + // }, repo: session.did, validate: true 44 + // 45 + // } 46 + 47 + return redirect(302, '/demo'); 48 + 49 + }catch (err){ 50 + //redirects are errors, so this passes it along 51 + if (isRedirect(err)) throw err; 52 + 53 + const errorMessage = (err as Error).message; 54 + logger.error(`Error on oauth callback: ${errorMessage}`); 55 + return error(500, { message: (err as Error).message }); 56 + } 57 + };
+3
static/robots.txt
··· 1 + # allow crawling everything by default 2 + User-agent: * 3 + Disallow:
+18
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 + // Consult https://svelte.dev/docs/kit/integrations 7 + // for more information about preprocessors 8 + preprocess: vitePreprocess(), 9 + 10 + kit: { 11 + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. 12 + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. 13 + // See https://svelte.dev/docs/kit/adapters for more information about adapters. 14 + adapter: adapter() 15 + } 16 + }; 17 + 18 + 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 + }
+11
vite.config.ts
··· 1 + import { sveltekit } from '@sveltejs/kit/vite'; 2 + import { defineConfig } from 'vite'; 3 + import 'dotenv/config'; 4 + 5 + export default defineConfig({ 6 + plugins: [sveltekit()], 7 + server: { 8 + host: '0.0.0.0', 9 + allowedHosts: process.env.OAUTH_DOMAIN ? [process.env.OAUTH_DOMAIN] : [] 10 + } 11 + });