+10
.dockerignore
+10
.dockerignore
+21
.env.example
+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
+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
.npmrc
···
1
+
engine-strict=true
.tangled/images/crash.png
.tangled/images/crash.png
This is a binary file and will not be displayed.
.tangled/images/railway-custom-domain.png
.tangled/images/railway-custom-domain.png
This is a binary file and will not be displayed.
.tangled/images/railway-dashboard.png
.tangled/images/railway-dashboard.png
This is a binary file and will not be displayed.
+23
Dockerfile
+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
+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
+

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
+

43
+
9. Go to settings and select "Custom Domain" to add your domain name. Follow the directions there
44
+

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
+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
+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
+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
+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
+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
+13
drizzle/meta/_journal.json
+44
eslint.config.js
+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
+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
+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
+4
pnpm-workspace.yaml
+21
src/app.d.ts
+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
+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
+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
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
+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
+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
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
+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
+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
+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
+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
+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
+
});
+137
src/lib/server/session.ts
+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
+7
src/routes/+layout.server.ts
+61
src/routes/+layout.svelte
+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
+7
src/routes/+page.server.ts
+31
src/routes/+page.svelte
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+
};
+18
svelte.config.js
+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
+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
+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
+
});