tangled
alpha
login
or
join now
besaid.zone
/
foooodz
6
fork
atom
example restaurant review app on atproto
6
fork
atom
overview
issues
pulls
pipelines
init
besaid.zone
6 months ago
9678d2c2
+2299
19 changed files
expand all
collapse all
unified
split
.gitignore
README.md
drizzle.config.ts
lex.config.js
lexicons
review.json
package.json
pnpm-lock.yaml
pnpm-workspace.yaml
src
atproto
client.ts
storage.ts
components
index.tsx
drizzle
db.ts
schema.ts
index.tsx
ingester.ts
lexicons
index.ts
types
app
fooodz
review.ts
utils.ts
tsconfig.json
+4
.gitignore
···
1
1
+
# deps
2
2
+
node_modules/
3
3
+
foodz.db
4
4
+
.env
+1
README.md
···
1
1
+
# Fooodz (example restaurant review app on atproto)
+11
drizzle.config.ts
···
1
1
+
import { defineConfig } from "drizzle-kit";
2
2
+
3
3
+
export default defineConfig({
4
4
+
out: "./src/drizzle/migrations",
5
5
+
dialect: "sqlite",
6
6
+
schema: "./src/drizzle/schema.ts",
7
7
+
dbCredentials: {
8
8
+
url: "file:./foodz.db",
9
9
+
},
10
10
+
verbose: true,
11
11
+
});
+6
lex.config.js
···
1
1
+
import { defineLexiconConfig } from "@atcute/lex-cli";
2
2
+
3
3
+
export default defineLexiconConfig({
4
4
+
files: ["lexicons/**/*.json"],
5
5
+
outdir: "src/lexicons/",
6
6
+
});
+39
lexicons/review.json
···
1
1
+
{
2
2
+
"lexicon": 1,
3
3
+
"id": "app.fooodz.review",
4
4
+
"defs": {
5
5
+
"main": {
6
6
+
"type": "record",
7
7
+
"description": "A user's review/rating of a restaurant",
8
8
+
"record": {
9
9
+
"type": "object",
10
10
+
"required": ["place", "review", "rating", "createdAt"],
11
11
+
"properties": {
12
12
+
"place": {
13
13
+
"type": "string",
14
14
+
"description": "The name of the place that the review is for",
15
15
+
"maxLength": 200,
16
16
+
"maxGraphemes": 20
17
17
+
},
18
18
+
"review": {
19
19
+
"type": "string",
20
20
+
"description": "review of food place",
21
21
+
"maxLength": 3000,
22
22
+
"maxGraphemes": 300
23
23
+
},
24
24
+
"rating": {
25
25
+
"type": "integer",
26
26
+
"minimum": 1,
27
27
+
"maximum": 5,
28
28
+
"description": "The rating for the restaurant on a scale of 1 to 5"
29
29
+
},
30
30
+
"createdAt": {
31
31
+
"type": "string",
32
32
+
"format": "datetime",
33
33
+
"description": "When the review was written"
34
34
+
}
35
35
+
}
36
36
+
}
37
37
+
}
38
38
+
}
39
39
+
}
+30
package.json
···
1
1
+
{
2
2
+
"name": "foooodz",
3
3
+
"type": "module",
4
4
+
"scripts": {
5
5
+
"dev": "NODE_ENV=development tsx watch src/index.tsx",
6
6
+
"lexgen": "pnpm exec lex-cli generate -c ./lex.config.js",
7
7
+
"push": "drizzle-kit push",
8
8
+
"studio": "drizzle-kit studio --port=3001"
9
9
+
},
10
10
+
"dependencies": {
11
11
+
"@atcute/lex-cli": "^2.2.0",
12
12
+
"@atcute/lexicons": "^1.1.1",
13
13
+
"@atproto/api": "^0.16.7",
14
14
+
"@atproto/common": "^0.4.11",
15
15
+
"@atproto/oauth-client-node": "^0.3.7",
16
16
+
"@hono/node-server": "^1.19.1",
17
17
+
"@skyware/jetstream": "^0.2.5",
18
18
+
"better-sqlite3": "^12.2.0",
19
19
+
"dotenv": "^17.2.2",
20
20
+
"drizzle-orm": "^0.44.5",
21
21
+
"hono": "^4.9.6"
22
22
+
},
23
23
+
"devDependencies": {
24
24
+
"@types/better-sqlite3": "^7.6.13",
25
25
+
"@types/node": "^24.3.1",
26
26
+
"drizzle-kit": "^0.31.4",
27
27
+
"tsx": "^4.20.5",
28
28
+
"typescript": "^5.9.2"
29
29
+
}
30
30
+
}
+1719
pnpm-lock.yaml
···
1
1
+
lockfileVersion: '9.0'
2
2
+
3
3
+
settings:
4
4
+
autoInstallPeers: true
5
5
+
excludeLinksFromLockfile: false
6
6
+
7
7
+
importers:
8
8
+
9
9
+
.:
10
10
+
dependencies:
11
11
+
'@atcute/lex-cli':
12
12
+
specifier: ^2.2.0
13
13
+
version: 2.2.0
14
14
+
'@atcute/lexicons':
15
15
+
specifier: ^1.1.1
16
16
+
version: 1.1.1
17
17
+
'@atproto/api':
18
18
+
specifier: ^0.16.7
19
19
+
version: 0.16.7
20
20
+
'@atproto/common':
21
21
+
specifier: ^0.4.11
22
22
+
version: 0.4.11
23
23
+
'@atproto/oauth-client-node':
24
24
+
specifier: ^0.3.7
25
25
+
version: 0.3.7
26
26
+
'@hono/node-server':
27
27
+
specifier: ^1.19.1
28
28
+
version: 1.19.1(hono@4.9.6)
29
29
+
'@skyware/jetstream':
30
30
+
specifier: ^0.2.5
31
31
+
version: 0.2.5
32
32
+
better-sqlite3:
33
33
+
specifier: ^12.2.0
34
34
+
version: 12.2.0
35
35
+
dotenv:
36
36
+
specifier: ^17.2.2
37
37
+
version: 17.2.2
38
38
+
drizzle-orm:
39
39
+
specifier: ^0.44.5
40
40
+
version: 0.44.5(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(bun-types@1.2.21(@types/react@19.1.12))
41
41
+
hono:
42
42
+
specifier: ^4.9.6
43
43
+
version: 4.9.6
44
44
+
devDependencies:
45
45
+
'@types/better-sqlite3':
46
46
+
specifier: ^7.6.13
47
47
+
version: 7.6.13
48
48
+
'@types/node':
49
49
+
specifier: ^24.3.1
50
50
+
version: 24.3.1
51
51
+
drizzle-kit:
52
52
+
specifier: ^0.31.4
53
53
+
version: 0.31.4
54
54
+
tsx:
55
55
+
specifier: ^4.20.5
56
56
+
version: 4.20.5
57
57
+
typescript:
58
58
+
specifier: ^5.9.2
59
59
+
version: 5.9.2
60
60
+
61
61
+
packages:
62
62
+
63
63
+
'@atcute/atproto@3.1.3':
64
64
+
resolution: {integrity: sha512-+5u0l+8E7h6wZO7MM1HLXIPoUEbdwRtr28ZRTgsURp+Md9gkoBj9e5iMx/xM8F2Exfyb65J5RchW/WlF2mw/RQ==}
65
65
+
66
66
+
'@atcute/bluesky@3.2.2':
67
67
+
resolution: {integrity: sha512-L8RrMNeRLGvSHMq2KDIAGXrpuNGA87YOXpXHY1yhmovVCjQ5n55FrR6JoQaxhprdXdKKQiefxNwQQQybDrfgFQ==}
68
68
+
69
69
+
'@atcute/lex-cli@2.2.0':
70
70
+
resolution: {integrity: sha512-noikZui2a7zeGGp0KdQQqCkhfrgXORZ5RiFI9lyxD/SoL+g1LZBZ2vOo92kcbZT1j37Guj4+DmpFC4pWbxhuUA==}
71
71
+
hasBin: true
72
72
+
73
73
+
'@atcute/lexicon-doc@1.1.1':
74
74
+
resolution: {integrity: sha512-/6M4K34ICZWa9rRiM9YWSsDZs0Vjv05SFJBb03mD+x14W01gIVLPK2UXiP0yIodgzWHhPQ79LLdyMJ8LirC84w==}
75
75
+
76
76
+
'@atcute/lexicons@1.1.1':
77
77
+
resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==}
78
78
+
79
79
+
'@atproto-labs/did-resolver@0.2.1':
80
80
+
resolution: {integrity: sha512-zSoHyqwwRYUtMNLW+RrWsImt1U5S47nJv5FfmAXTmon6wVKjxKD/PFrD1pg/4G6THqJmQHTs1Hj+54XVupYnvQ==}
81
81
+
82
82
+
'@atproto-labs/fetch-node@0.1.10':
83
83
+
resolution: {integrity: sha512-o7hGaonA71A6p7O107VhM6UBUN/g9tTyYohMp1q0Kf6xQ4npnuZYRSHSf2g6reSfGQJ1GoFNjBObETTT1ge/jQ==}
84
84
+
engines: {node: '>=18.7.0'}
85
85
+
86
86
+
'@atproto-labs/fetch@0.2.3':
87
87
+
resolution: {integrity: sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==}
88
88
+
89
89
+
'@atproto-labs/handle-resolver-node@0.1.19':
90
90
+
resolution: {integrity: sha512-nNVCfiKudvMYfDcWCa9koOMOpCYaC0wG4Uys5dZev99s/Nka7tRlIZIV+u+GWivnG9lqCupKATkoyCd6Per8Gw==}
91
91
+
engines: {node: '>=18.7.0'}
92
92
+
93
93
+
'@atproto-labs/handle-resolver@0.3.1':
94
94
+
resolution: {integrity: sha512-mLZdMNvwomgnn9sffKO1/xr02ctgeiT0FUVw7JekbchTckub2RM7qMu8Rw1mC4bpCpW+i7DXDiOxpoajkppwYQ==}
95
95
+
96
96
+
'@atproto-labs/identity-resolver@0.3.1':
97
97
+
resolution: {integrity: sha512-jCgotRRqPykPwh4gh0FBLOqeofv1G8OH/DZ5s88HWm7biUZeksZwDrEvL5TnqEFUpXT3O9Hcyp/XEpfCAplRoQ==}
98
98
+
99
99
+
'@atproto-labs/pipe@0.1.1':
100
100
+
resolution: {integrity: sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==}
101
101
+
102
102
+
'@atproto-labs/simple-store-memory@0.1.4':
103
103
+
resolution: {integrity: sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==}
104
104
+
105
105
+
'@atproto-labs/simple-store@0.3.0':
106
106
+
resolution: {integrity: sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ==}
107
107
+
108
108
+
'@atproto/api@0.16.7':
109
109
+
resolution: {integrity: sha512-EdVWkEgaEQm1LEiiP1fW/XXXpMNmtvT5c9+cZVRiwYc4rTB66WIJJWqmaMT/tB7nccMkFjr6FtwObq5LewWfgw==}
110
110
+
111
111
+
'@atproto/common-web@0.4.2':
112
112
+
resolution: {integrity: sha512-vrXwGNoFGogodjQvJDxAeP3QbGtawgZute2ed1XdRO0wMixLk3qewtikZm06H259QDJVu6voKC5mubml+WgQUw==}
113
113
+
114
114
+
'@atproto/common@0.4.11':
115
115
+
resolution: {integrity: sha512-Knv0viYXNMfCdIE7jLUiWJKnnMfEwg+vz2epJQi8WOjqtqCFb3W/3Jn72ZiuovIfpdm13MaOiny6w2NErUQC6g==}
116
116
+
engines: {node: '>=18.7.0'}
117
117
+
118
118
+
'@atproto/did@0.2.0':
119
119
+
resolution: {integrity: sha512-BskT39KYbwY1DUsWekkHh47xS+wvJpFq5F9acsicNfYniinyAMnNTzGKQEhnjQuG7K0qQItg/SnmC+y0tJXV7Q==}
120
120
+
121
121
+
'@atproto/jwk-jose@0.1.10':
122
122
+
resolution: {integrity: sha512-Eiu/u4tZHz3IIhHZt0zneYEffSAO3Oqk/ToKwlu1TqKte6sjtPs/4uquSiAAGFYozqgo92JC/AQclWzzkHI5QQ==}
123
123
+
124
124
+
'@atproto/jwk-webcrypto@0.1.10':
125
125
+
resolution: {integrity: sha512-JZsavs6JiSmw5rgcjkGDwzr1aCJGdybZOjVfYH+m9sXRU1BrUCA30uwNfZY7eFyWXyRAnCFiYiGVZgypXyKotw==}
126
126
+
127
127
+
'@atproto/jwk@0.5.0':
128
128
+
resolution: {integrity: sha512-Qi2NtEqhkG+uz3CKia4+H05WMV/z//dz3ESo5+cyBKrOnxVTJ5ZubMyltWjoYvy6v/jLhorXdDWcjn07yky7MQ==}
129
129
+
130
130
+
'@atproto/lexicon@0.5.0':
131
131
+
resolution: {integrity: sha512-3aAzEAy9EAPs3CxznzMhEcqDd7m3vz1eze/ya9/ThbB7yleqJIhz5GY2q76tCCwHPhn5qDDMhlA9kKV6fG23gA==}
132
132
+
133
133
+
'@atproto/oauth-client-node@0.3.7':
134
134
+
resolution: {integrity: sha512-6xtOSmYwB/nfT/YWI3Syrl1ywa0MFre8FmFeiGtvZ4jVSx5aJFR7plG3RaWtu2U9InAiK2Iz7RMPZTvDGkTiWg==}
135
135
+
engines: {node: '>=18.7.0'}
136
136
+
137
137
+
'@atproto/oauth-client@0.5.5':
138
138
+
resolution: {integrity: sha512-J0WK3vKVduxUuV+0XmXjCc0QJ1pUzKYZbrtFUF7wVzXnufSRsoaZqQP25cdzgADyUOwW7dttJBi06aOkY1mTKA==}
139
139
+
140
140
+
'@atproto/oauth-types@0.4.1':
141
141
+
resolution: {integrity: sha512-c5ixf2ZOzcltOu1fDBnO/tok6Wj7JDDK66+Z0q/+bAr8LXgOnxP7zQfJ+DD4gTkB+saTqsqWtVv8qvx/IEtm1g==}
142
142
+
143
143
+
'@atproto/syntax@0.4.1':
144
144
+
resolution: {integrity: sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw==}
145
145
+
146
146
+
'@atproto/xrpc@0.7.4':
147
147
+
resolution: {integrity: sha512-sDi68+QE1XHegTaNAndlX41Gp827pouSzSs8CyAwhrqZdsJUxE3P7TMtrA0z+zAjvxVyvzscRc0TsN/fGUGrhw==}
148
148
+
149
149
+
'@badrap/valita@0.4.6':
150
150
+
resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==}
151
151
+
engines: {node: '>= 18'}
152
152
+
153
153
+
'@cbor-extract/cbor-extract-darwin-arm64@2.2.0':
154
154
+
resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==}
155
155
+
cpu: [arm64]
156
156
+
os: [darwin]
157
157
+
158
158
+
'@cbor-extract/cbor-extract-darwin-x64@2.2.0':
159
159
+
resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==}
160
160
+
cpu: [x64]
161
161
+
os: [darwin]
162
162
+
163
163
+
'@cbor-extract/cbor-extract-linux-arm64@2.2.0':
164
164
+
resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==}
165
165
+
cpu: [arm64]
166
166
+
os: [linux]
167
167
+
168
168
+
'@cbor-extract/cbor-extract-linux-arm@2.2.0':
169
169
+
resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==}
170
170
+
cpu: [arm]
171
171
+
os: [linux]
172
172
+
173
173
+
'@cbor-extract/cbor-extract-linux-x64@2.2.0':
174
174
+
resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==}
175
175
+
cpu: [x64]
176
176
+
os: [linux]
177
177
+
178
178
+
'@cbor-extract/cbor-extract-win32-x64@2.2.0':
179
179
+
resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==}
180
180
+
cpu: [x64]
181
181
+
os: [win32]
182
182
+
183
183
+
'@drizzle-team/brocli@0.10.2':
184
184
+
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
185
185
+
186
186
+
'@esbuild-kit/core-utils@3.3.2':
187
187
+
resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
188
188
+
deprecated: 'Merged into tsx: https://tsx.is'
189
189
+
190
190
+
'@esbuild-kit/esm-loader@2.6.5':
191
191
+
resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==}
192
192
+
deprecated: 'Merged into tsx: https://tsx.is'
193
193
+
194
194
+
'@esbuild/aix-ppc64@0.25.9':
195
195
+
resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==}
196
196
+
engines: {node: '>=18'}
197
197
+
cpu: [ppc64]
198
198
+
os: [aix]
199
199
+
200
200
+
'@esbuild/android-arm64@0.18.20':
201
201
+
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
202
202
+
engines: {node: '>=12'}
203
203
+
cpu: [arm64]
204
204
+
os: [android]
205
205
+
206
206
+
'@esbuild/android-arm64@0.25.9':
207
207
+
resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==}
208
208
+
engines: {node: '>=18'}
209
209
+
cpu: [arm64]
210
210
+
os: [android]
211
211
+
212
212
+
'@esbuild/android-arm@0.18.20':
213
213
+
resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
214
214
+
engines: {node: '>=12'}
215
215
+
cpu: [arm]
216
216
+
os: [android]
217
217
+
218
218
+
'@esbuild/android-arm@0.25.9':
219
219
+
resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==}
220
220
+
engines: {node: '>=18'}
221
221
+
cpu: [arm]
222
222
+
os: [android]
223
223
+
224
224
+
'@esbuild/android-x64@0.18.20':
225
225
+
resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
226
226
+
engines: {node: '>=12'}
227
227
+
cpu: [x64]
228
228
+
os: [android]
229
229
+
230
230
+
'@esbuild/android-x64@0.25.9':
231
231
+
resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==}
232
232
+
engines: {node: '>=18'}
233
233
+
cpu: [x64]
234
234
+
os: [android]
235
235
+
236
236
+
'@esbuild/darwin-arm64@0.18.20':
237
237
+
resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
238
238
+
engines: {node: '>=12'}
239
239
+
cpu: [arm64]
240
240
+
os: [darwin]
241
241
+
242
242
+
'@esbuild/darwin-arm64@0.25.9':
243
243
+
resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==}
244
244
+
engines: {node: '>=18'}
245
245
+
cpu: [arm64]
246
246
+
os: [darwin]
247
247
+
248
248
+
'@esbuild/darwin-x64@0.18.20':
249
249
+
resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
250
250
+
engines: {node: '>=12'}
251
251
+
cpu: [x64]
252
252
+
os: [darwin]
253
253
+
254
254
+
'@esbuild/darwin-x64@0.25.9':
255
255
+
resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==}
256
256
+
engines: {node: '>=18'}
257
257
+
cpu: [x64]
258
258
+
os: [darwin]
259
259
+
260
260
+
'@esbuild/freebsd-arm64@0.18.20':
261
261
+
resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
262
262
+
engines: {node: '>=12'}
263
263
+
cpu: [arm64]
264
264
+
os: [freebsd]
265
265
+
266
266
+
'@esbuild/freebsd-arm64@0.25.9':
267
267
+
resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==}
268
268
+
engines: {node: '>=18'}
269
269
+
cpu: [arm64]
270
270
+
os: [freebsd]
271
271
+
272
272
+
'@esbuild/freebsd-x64@0.18.20':
273
273
+
resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
274
274
+
engines: {node: '>=12'}
275
275
+
cpu: [x64]
276
276
+
os: [freebsd]
277
277
+
278
278
+
'@esbuild/freebsd-x64@0.25.9':
279
279
+
resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==}
280
280
+
engines: {node: '>=18'}
281
281
+
cpu: [x64]
282
282
+
os: [freebsd]
283
283
+
284
284
+
'@esbuild/linux-arm64@0.18.20':
285
285
+
resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
286
286
+
engines: {node: '>=12'}
287
287
+
cpu: [arm64]
288
288
+
os: [linux]
289
289
+
290
290
+
'@esbuild/linux-arm64@0.25.9':
291
291
+
resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==}
292
292
+
engines: {node: '>=18'}
293
293
+
cpu: [arm64]
294
294
+
os: [linux]
295
295
+
296
296
+
'@esbuild/linux-arm@0.18.20':
297
297
+
resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
298
298
+
engines: {node: '>=12'}
299
299
+
cpu: [arm]
300
300
+
os: [linux]
301
301
+
302
302
+
'@esbuild/linux-arm@0.25.9':
303
303
+
resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==}
304
304
+
engines: {node: '>=18'}
305
305
+
cpu: [arm]
306
306
+
os: [linux]
307
307
+
308
308
+
'@esbuild/linux-ia32@0.18.20':
309
309
+
resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
310
310
+
engines: {node: '>=12'}
311
311
+
cpu: [ia32]
312
312
+
os: [linux]
313
313
+
314
314
+
'@esbuild/linux-ia32@0.25.9':
315
315
+
resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==}
316
316
+
engines: {node: '>=18'}
317
317
+
cpu: [ia32]
318
318
+
os: [linux]
319
319
+
320
320
+
'@esbuild/linux-loong64@0.18.20':
321
321
+
resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
322
322
+
engines: {node: '>=12'}
323
323
+
cpu: [loong64]
324
324
+
os: [linux]
325
325
+
326
326
+
'@esbuild/linux-loong64@0.25.9':
327
327
+
resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==}
328
328
+
engines: {node: '>=18'}
329
329
+
cpu: [loong64]
330
330
+
os: [linux]
331
331
+
332
332
+
'@esbuild/linux-mips64el@0.18.20':
333
333
+
resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
334
334
+
engines: {node: '>=12'}
335
335
+
cpu: [mips64el]
336
336
+
os: [linux]
337
337
+
338
338
+
'@esbuild/linux-mips64el@0.25.9':
339
339
+
resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==}
340
340
+
engines: {node: '>=18'}
341
341
+
cpu: [mips64el]
342
342
+
os: [linux]
343
343
+
344
344
+
'@esbuild/linux-ppc64@0.18.20':
345
345
+
resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
346
346
+
engines: {node: '>=12'}
347
347
+
cpu: [ppc64]
348
348
+
os: [linux]
349
349
+
350
350
+
'@esbuild/linux-ppc64@0.25.9':
351
351
+
resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==}
352
352
+
engines: {node: '>=18'}
353
353
+
cpu: [ppc64]
354
354
+
os: [linux]
355
355
+
356
356
+
'@esbuild/linux-riscv64@0.18.20':
357
357
+
resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
358
358
+
engines: {node: '>=12'}
359
359
+
cpu: [riscv64]
360
360
+
os: [linux]
361
361
+
362
362
+
'@esbuild/linux-riscv64@0.25.9':
363
363
+
resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==}
364
364
+
engines: {node: '>=18'}
365
365
+
cpu: [riscv64]
366
366
+
os: [linux]
367
367
+
368
368
+
'@esbuild/linux-s390x@0.18.20':
369
369
+
resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
370
370
+
engines: {node: '>=12'}
371
371
+
cpu: [s390x]
372
372
+
os: [linux]
373
373
+
374
374
+
'@esbuild/linux-s390x@0.25.9':
375
375
+
resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==}
376
376
+
engines: {node: '>=18'}
377
377
+
cpu: [s390x]
378
378
+
os: [linux]
379
379
+
380
380
+
'@esbuild/linux-x64@0.18.20':
381
381
+
resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
382
382
+
engines: {node: '>=12'}
383
383
+
cpu: [x64]
384
384
+
os: [linux]
385
385
+
386
386
+
'@esbuild/linux-x64@0.25.9':
387
387
+
resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==}
388
388
+
engines: {node: '>=18'}
389
389
+
cpu: [x64]
390
390
+
os: [linux]
391
391
+
392
392
+
'@esbuild/netbsd-arm64@0.25.9':
393
393
+
resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==}
394
394
+
engines: {node: '>=18'}
395
395
+
cpu: [arm64]
396
396
+
os: [netbsd]
397
397
+
398
398
+
'@esbuild/netbsd-x64@0.18.20':
399
399
+
resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
400
400
+
engines: {node: '>=12'}
401
401
+
cpu: [x64]
402
402
+
os: [netbsd]
403
403
+
404
404
+
'@esbuild/netbsd-x64@0.25.9':
405
405
+
resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==}
406
406
+
engines: {node: '>=18'}
407
407
+
cpu: [x64]
408
408
+
os: [netbsd]
409
409
+
410
410
+
'@esbuild/openbsd-arm64@0.25.9':
411
411
+
resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==}
412
412
+
engines: {node: '>=18'}
413
413
+
cpu: [arm64]
414
414
+
os: [openbsd]
415
415
+
416
416
+
'@esbuild/openbsd-x64@0.18.20':
417
417
+
resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
418
418
+
engines: {node: '>=12'}
419
419
+
cpu: [x64]
420
420
+
os: [openbsd]
421
421
+
422
422
+
'@esbuild/openbsd-x64@0.25.9':
423
423
+
resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==}
424
424
+
engines: {node: '>=18'}
425
425
+
cpu: [x64]
426
426
+
os: [openbsd]
427
427
+
428
428
+
'@esbuild/openharmony-arm64@0.25.9':
429
429
+
resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==}
430
430
+
engines: {node: '>=18'}
431
431
+
cpu: [arm64]
432
432
+
os: [openharmony]
433
433
+
434
434
+
'@esbuild/sunos-x64@0.18.20':
435
435
+
resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
436
436
+
engines: {node: '>=12'}
437
437
+
cpu: [x64]
438
438
+
os: [sunos]
439
439
+
440
440
+
'@esbuild/sunos-x64@0.25.9':
441
441
+
resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==}
442
442
+
engines: {node: '>=18'}
443
443
+
cpu: [x64]
444
444
+
os: [sunos]
445
445
+
446
446
+
'@esbuild/win32-arm64@0.18.20':
447
447
+
resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
448
448
+
engines: {node: '>=12'}
449
449
+
cpu: [arm64]
450
450
+
os: [win32]
451
451
+
452
452
+
'@esbuild/win32-arm64@0.25.9':
453
453
+
resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==}
454
454
+
engines: {node: '>=18'}
455
455
+
cpu: [arm64]
456
456
+
os: [win32]
457
457
+
458
458
+
'@esbuild/win32-ia32@0.18.20':
459
459
+
resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
460
460
+
engines: {node: '>=12'}
461
461
+
cpu: [ia32]
462
462
+
os: [win32]
463
463
+
464
464
+
'@esbuild/win32-ia32@0.25.9':
465
465
+
resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==}
466
466
+
engines: {node: '>=18'}
467
467
+
cpu: [ia32]
468
468
+
os: [win32]
469
469
+
470
470
+
'@esbuild/win32-x64@0.18.20':
471
471
+
resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
472
472
+
engines: {node: '>=12'}
473
473
+
cpu: [x64]
474
474
+
os: [win32]
475
475
+
476
476
+
'@esbuild/win32-x64@0.25.9':
477
477
+
resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==}
478
478
+
engines: {node: '>=18'}
479
479
+
cpu: [x64]
480
480
+
os: [win32]
481
481
+
482
482
+
'@externdefs/collider@0.3.0':
483
483
+
resolution: {integrity: sha512-x5CpeZ4c8n+1wMFthUMWSQKqCGcQo52/Qbda5ES+JFRRg/D8Ep6/JOvUUq5HExFuv/wW+6UYG2U/mXzw0IAd8Q==}
484
484
+
peerDependencies:
485
485
+
'@badrap/valita': ^0.4.4
486
486
+
487
487
+
'@hono/node-server@1.19.1':
488
488
+
resolution: {integrity: sha512-h44e5s+ByUriaRIbeS/C74O8v90m0A95luyYQGMF7KEn96KkYMXO7bZAwombzTpjQTU4e0TkU8U1WBIXlwuwtA==}
489
489
+
engines: {node: '>=18.14.1'}
490
490
+
peerDependencies:
491
491
+
hono: ^4
492
492
+
493
493
+
'@ipld/dag-cbor@7.0.3':
494
494
+
resolution: {integrity: sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==}
495
495
+
496
496
+
'@skyware/jetstream@0.2.5':
497
497
+
resolution: {integrity: sha512-fM/zs03DLwqRyzZZJFWN20e76KrdqIp97Tlm8Cek+vxn96+tu5d/fx79V6H85L0QN6HvGiX2l9A8hWFqHvYlOA==}
498
498
+
499
499
+
'@types/better-sqlite3@7.6.13':
500
500
+
resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==}
501
501
+
502
502
+
'@types/node@24.3.1':
503
503
+
resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==}
504
504
+
505
505
+
'@types/react@19.1.12':
506
506
+
resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==}
507
507
+
508
508
+
abort-controller@3.0.0:
509
509
+
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
510
510
+
engines: {node: '>=6.5'}
511
511
+
512
512
+
atomic-sleep@1.0.0:
513
513
+
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
514
514
+
engines: {node: '>=8.0.0'}
515
515
+
516
516
+
await-lock@2.2.2:
517
517
+
resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==}
518
518
+
519
519
+
base64-js@1.5.1:
520
520
+
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
521
521
+
522
522
+
better-sqlite3@12.2.0:
523
523
+
resolution: {integrity: sha512-eGbYq2CT+tos1fBwLQ/tkBt9J5M3JEHjku4hbvQUePCckkvVf14xWj+1m7dGoK81M/fOjFT7yM9UMeKT/+vFLQ==}
524
524
+
engines: {node: 20.x || 22.x || 23.x || 24.x}
525
525
+
526
526
+
bindings@1.5.0:
527
527
+
resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
528
528
+
529
529
+
bl@4.1.0:
530
530
+
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
531
531
+
532
532
+
buffer-from@1.1.2:
533
533
+
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
534
534
+
535
535
+
buffer@5.7.1:
536
536
+
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
537
537
+
538
538
+
buffer@6.0.3:
539
539
+
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
540
540
+
541
541
+
bun-types@1.2.21:
542
542
+
resolution: {integrity: sha512-sa2Tj77Ijc/NTLS0/Odjq/qngmEPZfbfnOERi0KRUYhT9R8M4VBioWVmMWE5GrYbKMc+5lVybXygLdibHaqVqw==}
543
543
+
peerDependencies:
544
544
+
'@types/react': ^19
545
545
+
546
546
+
cbor-extract@2.2.0:
547
547
+
resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==}
548
548
+
hasBin: true
549
549
+
550
550
+
cbor-x@1.6.0:
551
551
+
resolution: {integrity: sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==}
552
552
+
553
553
+
cborg@1.10.2:
554
554
+
resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==}
555
555
+
hasBin: true
556
556
+
557
557
+
chownr@1.1.4:
558
558
+
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
559
559
+
560
560
+
csstype@3.1.3:
561
561
+
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
562
562
+
563
563
+
debug@4.4.1:
564
564
+
resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
565
565
+
engines: {node: '>=6.0'}
566
566
+
peerDependencies:
567
567
+
supports-color: '*'
568
568
+
peerDependenciesMeta:
569
569
+
supports-color:
570
570
+
optional: true
571
571
+
572
572
+
decompress-response@6.0.0:
573
573
+
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
574
574
+
engines: {node: '>=10'}
575
575
+
576
576
+
deep-extend@0.6.0:
577
577
+
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
578
578
+
engines: {node: '>=4.0.0'}
579
579
+
580
580
+
detect-libc@2.0.4:
581
581
+
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
582
582
+
engines: {node: '>=8'}
583
583
+
584
584
+
dotenv@17.2.2:
585
585
+
resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==}
586
586
+
engines: {node: '>=12'}
587
587
+
588
588
+
drizzle-kit@0.31.4:
589
589
+
resolution: {integrity: sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA==}
590
590
+
hasBin: true
591
591
+
592
592
+
drizzle-orm@0.44.5:
593
593
+
resolution: {integrity: sha512-jBe37K7d8ZSKptdKfakQFdeljtu3P2Cbo7tJoJSVZADzIKOBo9IAJPOmMsH2bZl90bZgh8FQlD8BjxXA/zuBkQ==}
594
594
+
peerDependencies:
595
595
+
'@aws-sdk/client-rds-data': '>=3'
596
596
+
'@cloudflare/workers-types': '>=4'
597
597
+
'@electric-sql/pglite': '>=0.2.0'
598
598
+
'@libsql/client': '>=0.10.0'
599
599
+
'@libsql/client-wasm': '>=0.10.0'
600
600
+
'@neondatabase/serverless': '>=0.10.0'
601
601
+
'@op-engineering/op-sqlite': '>=2'
602
602
+
'@opentelemetry/api': ^1.4.1
603
603
+
'@planetscale/database': '>=1.13'
604
604
+
'@prisma/client': '*'
605
605
+
'@tidbcloud/serverless': '*'
606
606
+
'@types/better-sqlite3': '*'
607
607
+
'@types/pg': '*'
608
608
+
'@types/sql.js': '*'
609
609
+
'@upstash/redis': '>=1.34.7'
610
610
+
'@vercel/postgres': '>=0.8.0'
611
611
+
'@xata.io/client': '*'
612
612
+
better-sqlite3: '>=7'
613
613
+
bun-types: '*'
614
614
+
expo-sqlite: '>=14.0.0'
615
615
+
gel: '>=2'
616
616
+
knex: '*'
617
617
+
kysely: '*'
618
618
+
mysql2: '>=2'
619
619
+
pg: '>=8'
620
620
+
postgres: '>=3'
621
621
+
prisma: '*'
622
622
+
sql.js: '>=1'
623
623
+
sqlite3: '>=5'
624
624
+
peerDependenciesMeta:
625
625
+
'@aws-sdk/client-rds-data':
626
626
+
optional: true
627
627
+
'@cloudflare/workers-types':
628
628
+
optional: true
629
629
+
'@electric-sql/pglite':
630
630
+
optional: true
631
631
+
'@libsql/client':
632
632
+
optional: true
633
633
+
'@libsql/client-wasm':
634
634
+
optional: true
635
635
+
'@neondatabase/serverless':
636
636
+
optional: true
637
637
+
'@op-engineering/op-sqlite':
638
638
+
optional: true
639
639
+
'@opentelemetry/api':
640
640
+
optional: true
641
641
+
'@planetscale/database':
642
642
+
optional: true
643
643
+
'@prisma/client':
644
644
+
optional: true
645
645
+
'@tidbcloud/serverless':
646
646
+
optional: true
647
647
+
'@types/better-sqlite3':
648
648
+
optional: true
649
649
+
'@types/pg':
650
650
+
optional: true
651
651
+
'@types/sql.js':
652
652
+
optional: true
653
653
+
'@upstash/redis':
654
654
+
optional: true
655
655
+
'@vercel/postgres':
656
656
+
optional: true
657
657
+
'@xata.io/client':
658
658
+
optional: true
659
659
+
better-sqlite3:
660
660
+
optional: true
661
661
+
bun-types:
662
662
+
optional: true
663
663
+
expo-sqlite:
664
664
+
optional: true
665
665
+
gel:
666
666
+
optional: true
667
667
+
knex:
668
668
+
optional: true
669
669
+
kysely:
670
670
+
optional: true
671
671
+
mysql2:
672
672
+
optional: true
673
673
+
pg:
674
674
+
optional: true
675
675
+
postgres:
676
676
+
optional: true
677
677
+
prisma:
678
678
+
optional: true
679
679
+
sql.js:
680
680
+
optional: true
681
681
+
sqlite3:
682
682
+
optional: true
683
683
+
684
684
+
end-of-stream@1.4.5:
685
685
+
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
686
686
+
687
687
+
esbuild-register@3.6.0:
688
688
+
resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
689
689
+
peerDependencies:
690
690
+
esbuild: '>=0.12 <1'
691
691
+
692
692
+
esbuild@0.18.20:
693
693
+
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
694
694
+
engines: {node: '>=12'}
695
695
+
hasBin: true
696
696
+
697
697
+
esbuild@0.25.9:
698
698
+
resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
699
699
+
engines: {node: '>=18'}
700
700
+
hasBin: true
701
701
+
702
702
+
esm-env@1.2.2:
703
703
+
resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
704
704
+
705
705
+
event-target-polyfill@0.0.4:
706
706
+
resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==}
707
707
+
708
708
+
event-target-shim@5.0.1:
709
709
+
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
710
710
+
engines: {node: '>=6'}
711
711
+
712
712
+
events@3.3.0:
713
713
+
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
714
714
+
engines: {node: '>=0.8.x'}
715
715
+
716
716
+
expand-template@2.0.3:
717
717
+
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
718
718
+
engines: {node: '>=6'}
719
719
+
720
720
+
fast-redact@3.5.0:
721
721
+
resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
722
722
+
engines: {node: '>=6'}
723
723
+
724
724
+
file-uri-to-path@1.0.0:
725
725
+
resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
726
726
+
727
727
+
fs-constants@1.0.0:
728
728
+
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
729
729
+
730
730
+
fsevents@2.3.3:
731
731
+
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
732
732
+
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
733
733
+
os: [darwin]
734
734
+
735
735
+
get-tsconfig@4.10.1:
736
736
+
resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==}
737
737
+
738
738
+
github-from-package@0.0.0:
739
739
+
resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
740
740
+
741
741
+
graphemer@1.4.0:
742
742
+
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
743
743
+
744
744
+
hono@4.9.6:
745
745
+
resolution: {integrity: sha512-doVjXhSFvYZ7y0dNokjwwSahcrAfdz+/BCLvAMa/vHLzjj8+CFyV5xteThGUsKdkaasgN+gF2mUxao+SGLpUeA==}
746
746
+
engines: {node: '>=16.9.0'}
747
747
+
748
748
+
ieee754@1.2.1:
749
749
+
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
750
750
+
751
751
+
inherits@2.0.4:
752
752
+
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
753
753
+
754
754
+
ini@1.3.8:
755
755
+
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
756
756
+
757
757
+
ipaddr.js@2.2.0:
758
758
+
resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==}
759
759
+
engines: {node: '>= 10'}
760
760
+
761
761
+
iso-datestring-validator@2.2.2:
762
762
+
resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==}
763
763
+
764
764
+
jose@5.10.0:
765
765
+
resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==}
766
766
+
767
767
+
lru-cache@10.4.3:
768
768
+
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
769
769
+
770
770
+
mimic-response@3.1.0:
771
771
+
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
772
772
+
engines: {node: '>=10'}
773
773
+
774
774
+
minimist@1.2.8:
775
775
+
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
776
776
+
777
777
+
mkdirp-classic@0.5.3:
778
778
+
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
779
779
+
780
780
+
ms@2.1.3:
781
781
+
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
782
782
+
783
783
+
multiformats@9.9.0:
784
784
+
resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==}
785
785
+
786
786
+
napi-build-utils@2.0.0:
787
787
+
resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==}
788
788
+
789
789
+
node-abi@3.77.0:
790
790
+
resolution: {integrity: sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==}
791
791
+
engines: {node: '>=10'}
792
792
+
793
793
+
node-gyp-build-optional-packages@5.1.1:
794
794
+
resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==}
795
795
+
hasBin: true
796
796
+
797
797
+
on-exit-leak-free@2.1.2:
798
798
+
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
799
799
+
engines: {node: '>=14.0.0'}
800
800
+
801
801
+
once@1.4.0:
802
802
+
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
803
803
+
804
804
+
partysocket@1.1.5:
805
805
+
resolution: {integrity: sha512-8uw9foq9bij4sKLCtTSHvyqMrMTQ5FJjrHc7BjoM2s95Vu7xYCN63ABpI7OZHC7ZMP5xaom/A+SsoFPXmTV6ZQ==}
806
806
+
807
807
+
picocolors@1.1.1:
808
808
+
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
809
809
+
810
810
+
pino-abstract-transport@1.2.0:
811
811
+
resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==}
812
812
+
813
813
+
pino-std-serializers@6.2.2:
814
814
+
resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==}
815
815
+
816
816
+
pino@8.21.0:
817
817
+
resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==}
818
818
+
hasBin: true
819
819
+
820
820
+
prebuild-install@7.1.3:
821
821
+
resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==}
822
822
+
engines: {node: '>=10'}
823
823
+
hasBin: true
824
824
+
825
825
+
prettier@3.6.2:
826
826
+
resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
827
827
+
engines: {node: '>=14'}
828
828
+
hasBin: true
829
829
+
830
830
+
process-warning@3.0.0:
831
831
+
resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==}
832
832
+
833
833
+
process@0.11.10:
834
834
+
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
835
835
+
engines: {node: '>= 0.6.0'}
836
836
+
837
837
+
pump@3.0.3:
838
838
+
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
839
839
+
840
840
+
quick-format-unescaped@4.0.4:
841
841
+
resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
842
842
+
843
843
+
rc@1.2.8:
844
844
+
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
845
845
+
hasBin: true
846
846
+
847
847
+
readable-stream@3.6.2:
848
848
+
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
849
849
+
engines: {node: '>= 6'}
850
850
+
851
851
+
readable-stream@4.7.0:
852
852
+
resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
853
853
+
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
854
854
+
855
855
+
real-require@0.2.0:
856
856
+
resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
857
857
+
engines: {node: '>= 12.13.0'}
858
858
+
859
859
+
resolve-pkg-maps@1.0.0:
860
860
+
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
861
861
+
862
862
+
safe-buffer@5.2.1:
863
863
+
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
864
864
+
865
865
+
safe-stable-stringify@2.5.0:
866
866
+
resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
867
867
+
engines: {node: '>=10'}
868
868
+
869
869
+
semver@7.7.2:
870
870
+
resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
871
871
+
engines: {node: '>=10'}
872
872
+
hasBin: true
873
873
+
874
874
+
simple-concat@1.0.1:
875
875
+
resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
876
876
+
877
877
+
simple-get@4.0.1:
878
878
+
resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
879
879
+
880
880
+
sonic-boom@3.8.1:
881
881
+
resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==}
882
882
+
883
883
+
source-map-support@0.5.21:
884
884
+
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
885
885
+
886
886
+
source-map@0.6.1:
887
887
+
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
888
888
+
engines: {node: '>=0.10.0'}
889
889
+
890
890
+
split2@4.2.0:
891
891
+
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
892
892
+
engines: {node: '>= 10.x'}
893
893
+
894
894
+
string_decoder@1.3.0:
895
895
+
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
896
896
+
897
897
+
strip-json-comments@2.0.1:
898
898
+
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
899
899
+
engines: {node: '>=0.10.0'}
900
900
+
901
901
+
tar-fs@2.1.3:
902
902
+
resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==}
903
903
+
904
904
+
tar-stream@2.2.0:
905
905
+
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
906
906
+
engines: {node: '>=6'}
907
907
+
908
908
+
thread-stream@2.7.0:
909
909
+
resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==}
910
910
+
911
911
+
tiny-emitter@2.1.0:
912
912
+
resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
913
913
+
914
914
+
tlds@1.260.0:
915
915
+
resolution: {integrity: sha512-78+28EWBhCEE7qlyaHA9OR3IPvbCLiDh3Ckla593TksfFc9vfTsgvH7eS+dr3o9qr31gwGbogcI16yN91PoRjQ==}
916
916
+
hasBin: true
917
917
+
918
918
+
tsx@4.20.5:
919
919
+
resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==}
920
920
+
engines: {node: '>=18.0.0'}
921
921
+
hasBin: true
922
922
+
923
923
+
tunnel-agent@0.6.0:
924
924
+
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
925
925
+
926
926
+
typescript@5.9.2:
927
927
+
resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==}
928
928
+
engines: {node: '>=14.17'}
929
929
+
hasBin: true
930
930
+
931
931
+
uint8arrays@3.0.0:
932
932
+
resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==}
933
933
+
934
934
+
undici-types@7.10.0:
935
935
+
resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==}
936
936
+
937
937
+
undici@6.21.3:
938
938
+
resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==}
939
939
+
engines: {node: '>=18.17'}
940
940
+
941
941
+
util-deprecate@1.0.2:
942
942
+
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
943
943
+
944
944
+
wrappy@1.0.2:
945
945
+
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
946
946
+
947
947
+
zod@3.25.76:
948
948
+
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
949
949
+
950
950
+
snapshots:
951
951
+
952
952
+
'@atcute/atproto@3.1.3':
953
953
+
dependencies:
954
954
+
'@atcute/lexicons': 1.1.1
955
955
+
956
956
+
'@atcute/bluesky@3.2.2':
957
957
+
dependencies:
958
958
+
'@atcute/atproto': 3.1.3
959
959
+
'@atcute/lexicons': 1.1.1
960
960
+
961
961
+
'@atcute/lex-cli@2.2.0':
962
962
+
dependencies:
963
963
+
'@atcute/lexicon-doc': 1.1.1
964
964
+
'@badrap/valita': 0.4.6
965
965
+
'@externdefs/collider': 0.3.0(@badrap/valita@0.4.6)
966
966
+
picocolors: 1.1.1
967
967
+
prettier: 3.6.2
968
968
+
969
969
+
'@atcute/lexicon-doc@1.1.1':
970
970
+
dependencies:
971
971
+
'@badrap/valita': 0.4.6
972
972
+
973
973
+
'@atcute/lexicons@1.1.1':
974
974
+
dependencies:
975
975
+
esm-env: 1.2.2
976
976
+
977
977
+
'@atproto-labs/did-resolver@0.2.1':
978
978
+
dependencies:
979
979
+
'@atproto-labs/fetch': 0.2.3
980
980
+
'@atproto-labs/pipe': 0.1.1
981
981
+
'@atproto-labs/simple-store': 0.3.0
982
982
+
'@atproto-labs/simple-store-memory': 0.1.4
983
983
+
'@atproto/did': 0.2.0
984
984
+
zod: 3.25.76
985
985
+
986
986
+
'@atproto-labs/fetch-node@0.1.10':
987
987
+
dependencies:
988
988
+
'@atproto-labs/fetch': 0.2.3
989
989
+
'@atproto-labs/pipe': 0.1.1
990
990
+
ipaddr.js: 2.2.0
991
991
+
undici: 6.21.3
992
992
+
993
993
+
'@atproto-labs/fetch@0.2.3':
994
994
+
dependencies:
995
995
+
'@atproto-labs/pipe': 0.1.1
996
996
+
997
997
+
'@atproto-labs/handle-resolver-node@0.1.19':
998
998
+
dependencies:
999
999
+
'@atproto-labs/fetch-node': 0.1.10
1000
1000
+
'@atproto-labs/handle-resolver': 0.3.1
1001
1001
+
'@atproto/did': 0.2.0
1002
1002
+
1003
1003
+
'@atproto-labs/handle-resolver@0.3.1':
1004
1004
+
dependencies:
1005
1005
+
'@atproto-labs/simple-store': 0.3.0
1006
1006
+
'@atproto-labs/simple-store-memory': 0.1.4
1007
1007
+
'@atproto/did': 0.2.0
1008
1008
+
zod: 3.25.76
1009
1009
+
1010
1010
+
'@atproto-labs/identity-resolver@0.3.1':
1011
1011
+
dependencies:
1012
1012
+
'@atproto-labs/did-resolver': 0.2.1
1013
1013
+
'@atproto-labs/handle-resolver': 0.3.1
1014
1014
+
1015
1015
+
'@atproto-labs/pipe@0.1.1': {}
1016
1016
+
1017
1017
+
'@atproto-labs/simple-store-memory@0.1.4':
1018
1018
+
dependencies:
1019
1019
+
'@atproto-labs/simple-store': 0.3.0
1020
1020
+
lru-cache: 10.4.3
1021
1021
+
1022
1022
+
'@atproto-labs/simple-store@0.3.0': {}
1023
1023
+
1024
1024
+
'@atproto/api@0.16.7':
1025
1025
+
dependencies:
1026
1026
+
'@atproto/common-web': 0.4.2
1027
1027
+
'@atproto/lexicon': 0.5.0
1028
1028
+
'@atproto/syntax': 0.4.1
1029
1029
+
'@atproto/xrpc': 0.7.4
1030
1030
+
await-lock: 2.2.2
1031
1031
+
multiformats: 9.9.0
1032
1032
+
tlds: 1.260.0
1033
1033
+
zod: 3.25.76
1034
1034
+
1035
1035
+
'@atproto/common-web@0.4.2':
1036
1036
+
dependencies:
1037
1037
+
graphemer: 1.4.0
1038
1038
+
multiformats: 9.9.0
1039
1039
+
uint8arrays: 3.0.0
1040
1040
+
zod: 3.25.76
1041
1041
+
1042
1042
+
'@atproto/common@0.4.11':
1043
1043
+
dependencies:
1044
1044
+
'@atproto/common-web': 0.4.2
1045
1045
+
'@ipld/dag-cbor': 7.0.3
1046
1046
+
cbor-x: 1.6.0
1047
1047
+
iso-datestring-validator: 2.2.2
1048
1048
+
multiformats: 9.9.0
1049
1049
+
pino: 8.21.0
1050
1050
+
1051
1051
+
'@atproto/did@0.2.0':
1052
1052
+
dependencies:
1053
1053
+
zod: 3.25.76
1054
1054
+
1055
1055
+
'@atproto/jwk-jose@0.1.10':
1056
1056
+
dependencies:
1057
1057
+
'@atproto/jwk': 0.5.0
1058
1058
+
jose: 5.10.0
1059
1059
+
1060
1060
+
'@atproto/jwk-webcrypto@0.1.10':
1061
1061
+
dependencies:
1062
1062
+
'@atproto/jwk': 0.5.0
1063
1063
+
'@atproto/jwk-jose': 0.1.10
1064
1064
+
zod: 3.25.76
1065
1065
+
1066
1066
+
'@atproto/jwk@0.5.0':
1067
1067
+
dependencies:
1068
1068
+
multiformats: 9.9.0
1069
1069
+
zod: 3.25.76
1070
1070
+
1071
1071
+
'@atproto/lexicon@0.5.0':
1072
1072
+
dependencies:
1073
1073
+
'@atproto/common-web': 0.4.2
1074
1074
+
'@atproto/syntax': 0.4.1
1075
1075
+
iso-datestring-validator: 2.2.2
1076
1076
+
multiformats: 9.9.0
1077
1077
+
zod: 3.25.76
1078
1078
+
1079
1079
+
'@atproto/oauth-client-node@0.3.7':
1080
1080
+
dependencies:
1081
1081
+
'@atproto-labs/did-resolver': 0.2.1
1082
1082
+
'@atproto-labs/handle-resolver-node': 0.1.19
1083
1083
+
'@atproto-labs/simple-store': 0.3.0
1084
1084
+
'@atproto/did': 0.2.0
1085
1085
+
'@atproto/jwk': 0.5.0
1086
1086
+
'@atproto/jwk-jose': 0.1.10
1087
1087
+
'@atproto/jwk-webcrypto': 0.1.10
1088
1088
+
'@atproto/oauth-client': 0.5.5
1089
1089
+
'@atproto/oauth-types': 0.4.1
1090
1090
+
1091
1091
+
'@atproto/oauth-client@0.5.5':
1092
1092
+
dependencies:
1093
1093
+
'@atproto-labs/did-resolver': 0.2.1
1094
1094
+
'@atproto-labs/fetch': 0.2.3
1095
1095
+
'@atproto-labs/handle-resolver': 0.3.1
1096
1096
+
'@atproto-labs/identity-resolver': 0.3.1
1097
1097
+
'@atproto-labs/simple-store': 0.3.0
1098
1098
+
'@atproto-labs/simple-store-memory': 0.1.4
1099
1099
+
'@atproto/did': 0.2.0
1100
1100
+
'@atproto/jwk': 0.5.0
1101
1101
+
'@atproto/oauth-types': 0.4.1
1102
1102
+
'@atproto/xrpc': 0.7.4
1103
1103
+
multiformats: 9.9.0
1104
1104
+
zod: 3.25.76
1105
1105
+
1106
1106
+
'@atproto/oauth-types@0.4.1':
1107
1107
+
dependencies:
1108
1108
+
'@atproto/jwk': 0.5.0
1109
1109
+
zod: 3.25.76
1110
1110
+
1111
1111
+
'@atproto/syntax@0.4.1': {}
1112
1112
+
1113
1113
+
'@atproto/xrpc@0.7.4':
1114
1114
+
dependencies:
1115
1115
+
'@atproto/lexicon': 0.5.0
1116
1116
+
zod: 3.25.76
1117
1117
+
1118
1118
+
'@badrap/valita@0.4.6': {}
1119
1119
+
1120
1120
+
'@cbor-extract/cbor-extract-darwin-arm64@2.2.0':
1121
1121
+
optional: true
1122
1122
+
1123
1123
+
'@cbor-extract/cbor-extract-darwin-x64@2.2.0':
1124
1124
+
optional: true
1125
1125
+
1126
1126
+
'@cbor-extract/cbor-extract-linux-arm64@2.2.0':
1127
1127
+
optional: true
1128
1128
+
1129
1129
+
'@cbor-extract/cbor-extract-linux-arm@2.2.0':
1130
1130
+
optional: true
1131
1131
+
1132
1132
+
'@cbor-extract/cbor-extract-linux-x64@2.2.0':
1133
1133
+
optional: true
1134
1134
+
1135
1135
+
'@cbor-extract/cbor-extract-win32-x64@2.2.0':
1136
1136
+
optional: true
1137
1137
+
1138
1138
+
'@drizzle-team/brocli@0.10.2': {}
1139
1139
+
1140
1140
+
'@esbuild-kit/core-utils@3.3.2':
1141
1141
+
dependencies:
1142
1142
+
esbuild: 0.18.20
1143
1143
+
source-map-support: 0.5.21
1144
1144
+
1145
1145
+
'@esbuild-kit/esm-loader@2.6.5':
1146
1146
+
dependencies:
1147
1147
+
'@esbuild-kit/core-utils': 3.3.2
1148
1148
+
get-tsconfig: 4.10.1
1149
1149
+
1150
1150
+
'@esbuild/aix-ppc64@0.25.9':
1151
1151
+
optional: true
1152
1152
+
1153
1153
+
'@esbuild/android-arm64@0.18.20':
1154
1154
+
optional: true
1155
1155
+
1156
1156
+
'@esbuild/android-arm64@0.25.9':
1157
1157
+
optional: true
1158
1158
+
1159
1159
+
'@esbuild/android-arm@0.18.20':
1160
1160
+
optional: true
1161
1161
+
1162
1162
+
'@esbuild/android-arm@0.25.9':
1163
1163
+
optional: true
1164
1164
+
1165
1165
+
'@esbuild/android-x64@0.18.20':
1166
1166
+
optional: true
1167
1167
+
1168
1168
+
'@esbuild/android-x64@0.25.9':
1169
1169
+
optional: true
1170
1170
+
1171
1171
+
'@esbuild/darwin-arm64@0.18.20':
1172
1172
+
optional: true
1173
1173
+
1174
1174
+
'@esbuild/darwin-arm64@0.25.9':
1175
1175
+
optional: true
1176
1176
+
1177
1177
+
'@esbuild/darwin-x64@0.18.20':
1178
1178
+
optional: true
1179
1179
+
1180
1180
+
'@esbuild/darwin-x64@0.25.9':
1181
1181
+
optional: true
1182
1182
+
1183
1183
+
'@esbuild/freebsd-arm64@0.18.20':
1184
1184
+
optional: true
1185
1185
+
1186
1186
+
'@esbuild/freebsd-arm64@0.25.9':
1187
1187
+
optional: true
1188
1188
+
1189
1189
+
'@esbuild/freebsd-x64@0.18.20':
1190
1190
+
optional: true
1191
1191
+
1192
1192
+
'@esbuild/freebsd-x64@0.25.9':
1193
1193
+
optional: true
1194
1194
+
1195
1195
+
'@esbuild/linux-arm64@0.18.20':
1196
1196
+
optional: true
1197
1197
+
1198
1198
+
'@esbuild/linux-arm64@0.25.9':
1199
1199
+
optional: true
1200
1200
+
1201
1201
+
'@esbuild/linux-arm@0.18.20':
1202
1202
+
optional: true
1203
1203
+
1204
1204
+
'@esbuild/linux-arm@0.25.9':
1205
1205
+
optional: true
1206
1206
+
1207
1207
+
'@esbuild/linux-ia32@0.18.20':
1208
1208
+
optional: true
1209
1209
+
1210
1210
+
'@esbuild/linux-ia32@0.25.9':
1211
1211
+
optional: true
1212
1212
+
1213
1213
+
'@esbuild/linux-loong64@0.18.20':
1214
1214
+
optional: true
1215
1215
+
1216
1216
+
'@esbuild/linux-loong64@0.25.9':
1217
1217
+
optional: true
1218
1218
+
1219
1219
+
'@esbuild/linux-mips64el@0.18.20':
1220
1220
+
optional: true
1221
1221
+
1222
1222
+
'@esbuild/linux-mips64el@0.25.9':
1223
1223
+
optional: true
1224
1224
+
1225
1225
+
'@esbuild/linux-ppc64@0.18.20':
1226
1226
+
optional: true
1227
1227
+
1228
1228
+
'@esbuild/linux-ppc64@0.25.9':
1229
1229
+
optional: true
1230
1230
+
1231
1231
+
'@esbuild/linux-riscv64@0.18.20':
1232
1232
+
optional: true
1233
1233
+
1234
1234
+
'@esbuild/linux-riscv64@0.25.9':
1235
1235
+
optional: true
1236
1236
+
1237
1237
+
'@esbuild/linux-s390x@0.18.20':
1238
1238
+
optional: true
1239
1239
+
1240
1240
+
'@esbuild/linux-s390x@0.25.9':
1241
1241
+
optional: true
1242
1242
+
1243
1243
+
'@esbuild/linux-x64@0.18.20':
1244
1244
+
optional: true
1245
1245
+
1246
1246
+
'@esbuild/linux-x64@0.25.9':
1247
1247
+
optional: true
1248
1248
+
1249
1249
+
'@esbuild/netbsd-arm64@0.25.9':
1250
1250
+
optional: true
1251
1251
+
1252
1252
+
'@esbuild/netbsd-x64@0.18.20':
1253
1253
+
optional: true
1254
1254
+
1255
1255
+
'@esbuild/netbsd-x64@0.25.9':
1256
1256
+
optional: true
1257
1257
+
1258
1258
+
'@esbuild/openbsd-arm64@0.25.9':
1259
1259
+
optional: true
1260
1260
+
1261
1261
+
'@esbuild/openbsd-x64@0.18.20':
1262
1262
+
optional: true
1263
1263
+
1264
1264
+
'@esbuild/openbsd-x64@0.25.9':
1265
1265
+
optional: true
1266
1266
+
1267
1267
+
'@esbuild/openharmony-arm64@0.25.9':
1268
1268
+
optional: true
1269
1269
+
1270
1270
+
'@esbuild/sunos-x64@0.18.20':
1271
1271
+
optional: true
1272
1272
+
1273
1273
+
'@esbuild/sunos-x64@0.25.9':
1274
1274
+
optional: true
1275
1275
+
1276
1276
+
'@esbuild/win32-arm64@0.18.20':
1277
1277
+
optional: true
1278
1278
+
1279
1279
+
'@esbuild/win32-arm64@0.25.9':
1280
1280
+
optional: true
1281
1281
+
1282
1282
+
'@esbuild/win32-ia32@0.18.20':
1283
1283
+
optional: true
1284
1284
+
1285
1285
+
'@esbuild/win32-ia32@0.25.9':
1286
1286
+
optional: true
1287
1287
+
1288
1288
+
'@esbuild/win32-x64@0.18.20':
1289
1289
+
optional: true
1290
1290
+
1291
1291
+
'@esbuild/win32-x64@0.25.9':
1292
1292
+
optional: true
1293
1293
+
1294
1294
+
'@externdefs/collider@0.3.0(@badrap/valita@0.4.6)':
1295
1295
+
dependencies:
1296
1296
+
'@badrap/valita': 0.4.6
1297
1297
+
1298
1298
+
'@hono/node-server@1.19.1(hono@4.9.6)':
1299
1299
+
dependencies:
1300
1300
+
hono: 4.9.6
1301
1301
+
1302
1302
+
'@ipld/dag-cbor@7.0.3':
1303
1303
+
dependencies:
1304
1304
+
cborg: 1.10.2
1305
1305
+
multiformats: 9.9.0
1306
1306
+
1307
1307
+
'@skyware/jetstream@0.2.5':
1308
1308
+
dependencies:
1309
1309
+
'@atcute/atproto': 3.1.3
1310
1310
+
'@atcute/bluesky': 3.2.2
1311
1311
+
'@atcute/lexicons': 1.1.1
1312
1312
+
partysocket: 1.1.5
1313
1313
+
tiny-emitter: 2.1.0
1314
1314
+
1315
1315
+
'@types/better-sqlite3@7.6.13':
1316
1316
+
dependencies:
1317
1317
+
'@types/node': 24.3.1
1318
1318
+
1319
1319
+
'@types/node@24.3.1':
1320
1320
+
dependencies:
1321
1321
+
undici-types: 7.10.0
1322
1322
+
1323
1323
+
'@types/react@19.1.12':
1324
1324
+
dependencies:
1325
1325
+
csstype: 3.1.3
1326
1326
+
optional: true
1327
1327
+
1328
1328
+
abort-controller@3.0.0:
1329
1329
+
dependencies:
1330
1330
+
event-target-shim: 5.0.1
1331
1331
+
1332
1332
+
atomic-sleep@1.0.0: {}
1333
1333
+
1334
1334
+
await-lock@2.2.2: {}
1335
1335
+
1336
1336
+
base64-js@1.5.1: {}
1337
1337
+
1338
1338
+
better-sqlite3@12.2.0:
1339
1339
+
dependencies:
1340
1340
+
bindings: 1.5.0
1341
1341
+
prebuild-install: 7.1.3
1342
1342
+
1343
1343
+
bindings@1.5.0:
1344
1344
+
dependencies:
1345
1345
+
file-uri-to-path: 1.0.0
1346
1346
+
1347
1347
+
bl@4.1.0:
1348
1348
+
dependencies:
1349
1349
+
buffer: 5.7.1
1350
1350
+
inherits: 2.0.4
1351
1351
+
readable-stream: 3.6.2
1352
1352
+
1353
1353
+
buffer-from@1.1.2: {}
1354
1354
+
1355
1355
+
buffer@5.7.1:
1356
1356
+
dependencies:
1357
1357
+
base64-js: 1.5.1
1358
1358
+
ieee754: 1.2.1
1359
1359
+
1360
1360
+
buffer@6.0.3:
1361
1361
+
dependencies:
1362
1362
+
base64-js: 1.5.1
1363
1363
+
ieee754: 1.2.1
1364
1364
+
1365
1365
+
bun-types@1.2.21(@types/react@19.1.12):
1366
1366
+
dependencies:
1367
1367
+
'@types/node': 24.3.1
1368
1368
+
'@types/react': 19.1.12
1369
1369
+
optional: true
1370
1370
+
1371
1371
+
cbor-extract@2.2.0:
1372
1372
+
dependencies:
1373
1373
+
node-gyp-build-optional-packages: 5.1.1
1374
1374
+
optionalDependencies:
1375
1375
+
'@cbor-extract/cbor-extract-darwin-arm64': 2.2.0
1376
1376
+
'@cbor-extract/cbor-extract-darwin-x64': 2.2.0
1377
1377
+
'@cbor-extract/cbor-extract-linux-arm': 2.2.0
1378
1378
+
'@cbor-extract/cbor-extract-linux-arm64': 2.2.0
1379
1379
+
'@cbor-extract/cbor-extract-linux-x64': 2.2.0
1380
1380
+
'@cbor-extract/cbor-extract-win32-x64': 2.2.0
1381
1381
+
optional: true
1382
1382
+
1383
1383
+
cbor-x@1.6.0:
1384
1384
+
optionalDependencies:
1385
1385
+
cbor-extract: 2.2.0
1386
1386
+
1387
1387
+
cborg@1.10.2: {}
1388
1388
+
1389
1389
+
chownr@1.1.4: {}
1390
1390
+
1391
1391
+
csstype@3.1.3:
1392
1392
+
optional: true
1393
1393
+
1394
1394
+
debug@4.4.1:
1395
1395
+
dependencies:
1396
1396
+
ms: 2.1.3
1397
1397
+
1398
1398
+
decompress-response@6.0.0:
1399
1399
+
dependencies:
1400
1400
+
mimic-response: 3.1.0
1401
1401
+
1402
1402
+
deep-extend@0.6.0: {}
1403
1403
+
1404
1404
+
detect-libc@2.0.4: {}
1405
1405
+
1406
1406
+
dotenv@17.2.2: {}
1407
1407
+
1408
1408
+
drizzle-kit@0.31.4:
1409
1409
+
dependencies:
1410
1410
+
'@drizzle-team/brocli': 0.10.2
1411
1411
+
'@esbuild-kit/esm-loader': 2.6.5
1412
1412
+
esbuild: 0.25.9
1413
1413
+
esbuild-register: 3.6.0(esbuild@0.25.9)
1414
1414
+
transitivePeerDependencies:
1415
1415
+
- supports-color
1416
1416
+
1417
1417
+
drizzle-orm@0.44.5(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(bun-types@1.2.21(@types/react@19.1.12)):
1418
1418
+
optionalDependencies:
1419
1419
+
'@types/better-sqlite3': 7.6.13
1420
1420
+
better-sqlite3: 12.2.0
1421
1421
+
bun-types: 1.2.21(@types/react@19.1.12)
1422
1422
+
1423
1423
+
end-of-stream@1.4.5:
1424
1424
+
dependencies:
1425
1425
+
once: 1.4.0
1426
1426
+
1427
1427
+
esbuild-register@3.6.0(esbuild@0.25.9):
1428
1428
+
dependencies:
1429
1429
+
debug: 4.4.1
1430
1430
+
esbuild: 0.25.9
1431
1431
+
transitivePeerDependencies:
1432
1432
+
- supports-color
1433
1433
+
1434
1434
+
esbuild@0.18.20:
1435
1435
+
optionalDependencies:
1436
1436
+
'@esbuild/android-arm': 0.18.20
1437
1437
+
'@esbuild/android-arm64': 0.18.20
1438
1438
+
'@esbuild/android-x64': 0.18.20
1439
1439
+
'@esbuild/darwin-arm64': 0.18.20
1440
1440
+
'@esbuild/darwin-x64': 0.18.20
1441
1441
+
'@esbuild/freebsd-arm64': 0.18.20
1442
1442
+
'@esbuild/freebsd-x64': 0.18.20
1443
1443
+
'@esbuild/linux-arm': 0.18.20
1444
1444
+
'@esbuild/linux-arm64': 0.18.20
1445
1445
+
'@esbuild/linux-ia32': 0.18.20
1446
1446
+
'@esbuild/linux-loong64': 0.18.20
1447
1447
+
'@esbuild/linux-mips64el': 0.18.20
1448
1448
+
'@esbuild/linux-ppc64': 0.18.20
1449
1449
+
'@esbuild/linux-riscv64': 0.18.20
1450
1450
+
'@esbuild/linux-s390x': 0.18.20
1451
1451
+
'@esbuild/linux-x64': 0.18.20
1452
1452
+
'@esbuild/netbsd-x64': 0.18.20
1453
1453
+
'@esbuild/openbsd-x64': 0.18.20
1454
1454
+
'@esbuild/sunos-x64': 0.18.20
1455
1455
+
'@esbuild/win32-arm64': 0.18.20
1456
1456
+
'@esbuild/win32-ia32': 0.18.20
1457
1457
+
'@esbuild/win32-x64': 0.18.20
1458
1458
+
1459
1459
+
esbuild@0.25.9:
1460
1460
+
optionalDependencies:
1461
1461
+
'@esbuild/aix-ppc64': 0.25.9
1462
1462
+
'@esbuild/android-arm': 0.25.9
1463
1463
+
'@esbuild/android-arm64': 0.25.9
1464
1464
+
'@esbuild/android-x64': 0.25.9
1465
1465
+
'@esbuild/darwin-arm64': 0.25.9
1466
1466
+
'@esbuild/darwin-x64': 0.25.9
1467
1467
+
'@esbuild/freebsd-arm64': 0.25.9
1468
1468
+
'@esbuild/freebsd-x64': 0.25.9
1469
1469
+
'@esbuild/linux-arm': 0.25.9
1470
1470
+
'@esbuild/linux-arm64': 0.25.9
1471
1471
+
'@esbuild/linux-ia32': 0.25.9
1472
1472
+
'@esbuild/linux-loong64': 0.25.9
1473
1473
+
'@esbuild/linux-mips64el': 0.25.9
1474
1474
+
'@esbuild/linux-ppc64': 0.25.9
1475
1475
+
'@esbuild/linux-riscv64': 0.25.9
1476
1476
+
'@esbuild/linux-s390x': 0.25.9
1477
1477
+
'@esbuild/linux-x64': 0.25.9
1478
1478
+
'@esbuild/netbsd-arm64': 0.25.9
1479
1479
+
'@esbuild/netbsd-x64': 0.25.9
1480
1480
+
'@esbuild/openbsd-arm64': 0.25.9
1481
1481
+
'@esbuild/openbsd-x64': 0.25.9
1482
1482
+
'@esbuild/openharmony-arm64': 0.25.9
1483
1483
+
'@esbuild/sunos-x64': 0.25.9
1484
1484
+
'@esbuild/win32-arm64': 0.25.9
1485
1485
+
'@esbuild/win32-ia32': 0.25.9
1486
1486
+
'@esbuild/win32-x64': 0.25.9
1487
1487
+
1488
1488
+
esm-env@1.2.2: {}
1489
1489
+
1490
1490
+
event-target-polyfill@0.0.4: {}
1491
1491
+
1492
1492
+
event-target-shim@5.0.1: {}
1493
1493
+
1494
1494
+
events@3.3.0: {}
1495
1495
+
1496
1496
+
expand-template@2.0.3: {}
1497
1497
+
1498
1498
+
fast-redact@3.5.0: {}
1499
1499
+
1500
1500
+
file-uri-to-path@1.0.0: {}
1501
1501
+
1502
1502
+
fs-constants@1.0.0: {}
1503
1503
+
1504
1504
+
fsevents@2.3.3:
1505
1505
+
optional: true
1506
1506
+
1507
1507
+
get-tsconfig@4.10.1:
1508
1508
+
dependencies:
1509
1509
+
resolve-pkg-maps: 1.0.0
1510
1510
+
1511
1511
+
github-from-package@0.0.0: {}
1512
1512
+
1513
1513
+
graphemer@1.4.0: {}
1514
1514
+
1515
1515
+
hono@4.9.6: {}
1516
1516
+
1517
1517
+
ieee754@1.2.1: {}
1518
1518
+
1519
1519
+
inherits@2.0.4: {}
1520
1520
+
1521
1521
+
ini@1.3.8: {}
1522
1522
+
1523
1523
+
ipaddr.js@2.2.0: {}
1524
1524
+
1525
1525
+
iso-datestring-validator@2.2.2: {}
1526
1526
+
1527
1527
+
jose@5.10.0: {}
1528
1528
+
1529
1529
+
lru-cache@10.4.3: {}
1530
1530
+
1531
1531
+
mimic-response@3.1.0: {}
1532
1532
+
1533
1533
+
minimist@1.2.8: {}
1534
1534
+
1535
1535
+
mkdirp-classic@0.5.3: {}
1536
1536
+
1537
1537
+
ms@2.1.3: {}
1538
1538
+
1539
1539
+
multiformats@9.9.0: {}
1540
1540
+
1541
1541
+
napi-build-utils@2.0.0: {}
1542
1542
+
1543
1543
+
node-abi@3.77.0:
1544
1544
+
dependencies:
1545
1545
+
semver: 7.7.2
1546
1546
+
1547
1547
+
node-gyp-build-optional-packages@5.1.1:
1548
1548
+
dependencies:
1549
1549
+
detect-libc: 2.0.4
1550
1550
+
optional: true
1551
1551
+
1552
1552
+
on-exit-leak-free@2.1.2: {}
1553
1553
+
1554
1554
+
once@1.4.0:
1555
1555
+
dependencies:
1556
1556
+
wrappy: 1.0.2
1557
1557
+
1558
1558
+
partysocket@1.1.5:
1559
1559
+
dependencies:
1560
1560
+
event-target-polyfill: 0.0.4
1561
1561
+
1562
1562
+
picocolors@1.1.1: {}
1563
1563
+
1564
1564
+
pino-abstract-transport@1.2.0:
1565
1565
+
dependencies:
1566
1566
+
readable-stream: 4.7.0
1567
1567
+
split2: 4.2.0
1568
1568
+
1569
1569
+
pino-std-serializers@6.2.2: {}
1570
1570
+
1571
1571
+
pino@8.21.0:
1572
1572
+
dependencies:
1573
1573
+
atomic-sleep: 1.0.0
1574
1574
+
fast-redact: 3.5.0
1575
1575
+
on-exit-leak-free: 2.1.2
1576
1576
+
pino-abstract-transport: 1.2.0
1577
1577
+
pino-std-serializers: 6.2.2
1578
1578
+
process-warning: 3.0.0
1579
1579
+
quick-format-unescaped: 4.0.4
1580
1580
+
real-require: 0.2.0
1581
1581
+
safe-stable-stringify: 2.5.0
1582
1582
+
sonic-boom: 3.8.1
1583
1583
+
thread-stream: 2.7.0
1584
1584
+
1585
1585
+
prebuild-install@7.1.3:
1586
1586
+
dependencies:
1587
1587
+
detect-libc: 2.0.4
1588
1588
+
expand-template: 2.0.3
1589
1589
+
github-from-package: 0.0.0
1590
1590
+
minimist: 1.2.8
1591
1591
+
mkdirp-classic: 0.5.3
1592
1592
+
napi-build-utils: 2.0.0
1593
1593
+
node-abi: 3.77.0
1594
1594
+
pump: 3.0.3
1595
1595
+
rc: 1.2.8
1596
1596
+
simple-get: 4.0.1
1597
1597
+
tar-fs: 2.1.3
1598
1598
+
tunnel-agent: 0.6.0
1599
1599
+
1600
1600
+
prettier@3.6.2: {}
1601
1601
+
1602
1602
+
process-warning@3.0.0: {}
1603
1603
+
1604
1604
+
process@0.11.10: {}
1605
1605
+
1606
1606
+
pump@3.0.3:
1607
1607
+
dependencies:
1608
1608
+
end-of-stream: 1.4.5
1609
1609
+
once: 1.4.0
1610
1610
+
1611
1611
+
quick-format-unescaped@4.0.4: {}
1612
1612
+
1613
1613
+
rc@1.2.8:
1614
1614
+
dependencies:
1615
1615
+
deep-extend: 0.6.0
1616
1616
+
ini: 1.3.8
1617
1617
+
minimist: 1.2.8
1618
1618
+
strip-json-comments: 2.0.1
1619
1619
+
1620
1620
+
readable-stream@3.6.2:
1621
1621
+
dependencies:
1622
1622
+
inherits: 2.0.4
1623
1623
+
string_decoder: 1.3.0
1624
1624
+
util-deprecate: 1.0.2
1625
1625
+
1626
1626
+
readable-stream@4.7.0:
1627
1627
+
dependencies:
1628
1628
+
abort-controller: 3.0.0
1629
1629
+
buffer: 6.0.3
1630
1630
+
events: 3.3.0
1631
1631
+
process: 0.11.10
1632
1632
+
string_decoder: 1.3.0
1633
1633
+
1634
1634
+
real-require@0.2.0: {}
1635
1635
+
1636
1636
+
resolve-pkg-maps@1.0.0: {}
1637
1637
+
1638
1638
+
safe-buffer@5.2.1: {}
1639
1639
+
1640
1640
+
safe-stable-stringify@2.5.0: {}
1641
1641
+
1642
1642
+
semver@7.7.2: {}
1643
1643
+
1644
1644
+
simple-concat@1.0.1: {}
1645
1645
+
1646
1646
+
simple-get@4.0.1:
1647
1647
+
dependencies:
1648
1648
+
decompress-response: 6.0.0
1649
1649
+
once: 1.4.0
1650
1650
+
simple-concat: 1.0.1
1651
1651
+
1652
1652
+
sonic-boom@3.8.1:
1653
1653
+
dependencies:
1654
1654
+
atomic-sleep: 1.0.0
1655
1655
+
1656
1656
+
source-map-support@0.5.21:
1657
1657
+
dependencies:
1658
1658
+
buffer-from: 1.1.2
1659
1659
+
source-map: 0.6.1
1660
1660
+
1661
1661
+
source-map@0.6.1: {}
1662
1662
+
1663
1663
+
split2@4.2.0: {}
1664
1664
+
1665
1665
+
string_decoder@1.3.0:
1666
1666
+
dependencies:
1667
1667
+
safe-buffer: 5.2.1
1668
1668
+
1669
1669
+
strip-json-comments@2.0.1: {}
1670
1670
+
1671
1671
+
tar-fs@2.1.3:
1672
1672
+
dependencies:
1673
1673
+
chownr: 1.1.4
1674
1674
+
mkdirp-classic: 0.5.3
1675
1675
+
pump: 3.0.3
1676
1676
+
tar-stream: 2.2.0
1677
1677
+
1678
1678
+
tar-stream@2.2.0:
1679
1679
+
dependencies:
1680
1680
+
bl: 4.1.0
1681
1681
+
end-of-stream: 1.4.5
1682
1682
+
fs-constants: 1.0.0
1683
1683
+
inherits: 2.0.4
1684
1684
+
readable-stream: 3.6.2
1685
1685
+
1686
1686
+
thread-stream@2.7.0:
1687
1687
+
dependencies:
1688
1688
+
real-require: 0.2.0
1689
1689
+
1690
1690
+
tiny-emitter@2.1.0: {}
1691
1691
+
1692
1692
+
tlds@1.260.0: {}
1693
1693
+
1694
1694
+
tsx@4.20.5:
1695
1695
+
dependencies:
1696
1696
+
esbuild: 0.25.9
1697
1697
+
get-tsconfig: 4.10.1
1698
1698
+
optionalDependencies:
1699
1699
+
fsevents: 2.3.3
1700
1700
+
1701
1701
+
tunnel-agent@0.6.0:
1702
1702
+
dependencies:
1703
1703
+
safe-buffer: 5.2.1
1704
1704
+
1705
1705
+
typescript@5.9.2: {}
1706
1706
+
1707
1707
+
uint8arrays@3.0.0:
1708
1708
+
dependencies:
1709
1709
+
multiformats: 9.9.0
1710
1710
+
1711
1711
+
undici-types@7.10.0: {}
1712
1712
+
1713
1713
+
undici@6.21.3: {}
1714
1714
+
1715
1715
+
util-deprecate@1.0.2: {}
1716
1716
+
1717
1717
+
wrappy@1.0.2: {}
1718
1718
+
1719
1719
+
zod@3.25.76: {}
+3
pnpm-workspace.yaml
···
1
1
+
onlyBuiltDependencies:
2
2
+
- better-sqlite3
3
3
+
- esbuild
+29
src/atproto/client.ts
···
1
1
+
import { NodeOAuthClient } from "@atproto/oauth-client-node";
2
2
+
import { StateStore, SessionStore } from "./storage";
3
3
+
import { db } from "../drizzle/db";
4
4
+
5
5
+
const IS_DEV = process.env.NODE_ENV === "development";
6
6
+
const PUBLIC_URL = "https://fooodz.app";
7
7
+
const LOCAL_URL = "http://[::1]:3000";
8
8
+
const URL = IS_DEV ? LOCAL_URL : PUBLIC_URL;
9
9
+
10
10
+
export const client = new NodeOAuthClient({
11
11
+
clientMetadata: {
12
12
+
client_name: "fooodz",
13
13
+
client_id: !IS_DEV
14
14
+
? `${PUBLIC_URL}/client-metadata.json`
15
15
+
: `http://localhost?redirect_uri=${encodeURIComponent(
16
16
+
`${URL}/oauth/callback`,
17
17
+
)}&scope=${encodeURIComponent("atproto email profile account:email repo:app.fooodz.review")}`,
18
18
+
client_uri: URL,
19
19
+
redirect_uris: [`${URL}/oauth/callback`],
20
20
+
scope: "atproto email profile account:email repo:app.fooodz.review",
21
21
+
grant_types: ["authorization_code", "refresh_token"],
22
22
+
response_types: ["code"],
23
23
+
application_type: "web",
24
24
+
token_endpoint_auth_method: "none",
25
25
+
dpop_bound_access_tokens: true,
26
26
+
},
27
27
+
stateStore: new StateStore(db),
28
28
+
sessionStore: new SessionStore(db),
29
29
+
});
+71
src/atproto/storage.ts
···
1
1
+
import type {
2
2
+
NodeSavedSession,
3
3
+
NodeSavedSessionStore,
4
4
+
NodeSavedState,
5
5
+
NodeSavedStateStore,
6
6
+
} from "@atproto/oauth-client-node";
7
7
+
import type { DrizzleClient } from "../drizzle/db";
8
8
+
import { eq } from "drizzle-orm";
9
9
+
import { sessions, states } from "../drizzle/schema";
10
10
+
11
11
+
export class StateStore implements NodeSavedStateStore {
12
12
+
constructor(private db: DrizzleClient) {}
13
13
+
async get(key: string): Promise<NodeSavedState | undefined> {
14
14
+
const result = await this.db.query.states.findFirst({
15
15
+
where: eq(states.key, key),
16
16
+
});
17
17
+
18
18
+
if (!result?.state) return;
19
19
+
return JSON.parse(result.state);
20
20
+
}
21
21
+
async set(key: string, value: NodeSavedState) {
22
22
+
const state = JSON.stringify(value);
23
23
+
24
24
+
await this.db
25
25
+
.insert(states)
26
26
+
.values({
27
27
+
key,
28
28
+
state,
29
29
+
})
30
30
+
.onConflictDoUpdate({
31
31
+
target: states.key,
32
32
+
set: {
33
33
+
state,
34
34
+
},
35
35
+
});
36
36
+
}
37
37
+
async del(key: string) {
38
38
+
await this.db.delete(states).where(eq(states.key, key));
39
39
+
}
40
40
+
}
41
41
+
42
42
+
export class SessionStore implements NodeSavedSessionStore {
43
43
+
constructor(private db: DrizzleClient) {}
44
44
+
async get(key: string): Promise<NodeSavedSession | undefined> {
45
45
+
const result = await this.db.query.sessions.findFirst({
46
46
+
where: eq(states.key, key),
47
47
+
});
48
48
+
49
49
+
if (!result?.session) return;
50
50
+
return JSON.parse(result.session) as NodeSavedSession;
51
51
+
}
52
52
+
async set(key: string, value: NodeSavedSession) {
53
53
+
const session = JSON.stringify(value);
54
54
+
55
55
+
await this.db
56
56
+
.insert(sessions)
57
57
+
.values({
58
58
+
key,
59
59
+
session,
60
60
+
})
61
61
+
.onConflictDoUpdate({
62
62
+
target: sessions.key,
63
63
+
set: {
64
64
+
session,
65
65
+
},
66
66
+
});
67
67
+
}
68
68
+
async del(key: string) {
69
69
+
await this.db.delete(sessions).where(eq(states.key, key));
70
70
+
}
71
71
+
}
+11
src/components/index.tsx
···
1
1
+
import type { FC } from "hono/jsx";
2
2
+
3
3
+
export const Layout: FC = (props) => {
4
4
+
return (
5
5
+
<html lang="en">
6
6
+
<body>
7
7
+
<main>{props.children}</main>
8
8
+
</body>
9
9
+
</html>
10
10
+
);
11
11
+
};
+14
src/drizzle/db.ts
···
1
1
+
import {
2
2
+
drizzle,
3
3
+
type BetterSQLite3Database,
4
4
+
} from "drizzle-orm/better-sqlite3";
5
5
+
import Database from "better-sqlite3";
6
6
+
import * as schema from "./schema";
7
7
+
8
8
+
const sqlite = new Database("foodz.db");
9
9
+
export const db: BetterSQLite3Database<typeof schema> = drizzle({
10
10
+
client: sqlite,
11
11
+
schema,
12
12
+
});
13
13
+
14
14
+
export type DrizzleClient = BetterSQLite3Database<typeof schema>;
+44
src/drizzle/schema.ts
···
1
1
+
import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core";
2
2
+
import { relations, sql } from "drizzle-orm";
3
3
+
4
4
+
const timestamp = {
5
5
+
createdAt: text("timestamp").notNull().default(sql`(current_timestamp)`),
6
6
+
updatedAt: text("timestamp").notNull().default(sql`(current_timestamp)`),
7
7
+
};
8
8
+
9
9
+
export const users = sqliteTable("users", {
10
10
+
id: integer().primaryKey({ autoIncrement: true }),
11
11
+
did: text().notNull(),
12
12
+
...timestamp,
13
13
+
});
14
14
+
15
15
+
export const usersRelations = relations(users, ({ many }) => ({
16
16
+
reviews: many(reviews),
17
17
+
}));
18
18
+
19
19
+
export const reviews = sqliteTable("reviews", {
20
20
+
rkey: text().notNull(),
21
21
+
place: text().notNull(),
22
22
+
// maybe the actual text review should be optional, some people just leave a rating
23
23
+
review: text().notNull(),
24
24
+
rating: integer().notNull(),
25
25
+
authorDid: text().notNull(),
26
26
+
...timestamp,
27
27
+
});
28
28
+
29
29
+
export const reviewsRelations = relations(reviews, ({ one }) => ({
30
30
+
author: one(users, {
31
31
+
fields: [reviews.authorDid],
32
32
+
references: [users.did],
33
33
+
}),
34
34
+
}));
35
35
+
36
36
+
export const sessions = sqliteTable("sessions", {
37
37
+
key: text().notNull().unique(),
38
38
+
session: text(),
39
39
+
});
40
40
+
41
41
+
export const states = sqliteTable("states", {
42
42
+
key: text().notNull().unique(),
43
43
+
state: text(),
44
44
+
});
+196
src/index.tsx
···
1
1
+
import { OAuthResolverError } from "@atproto/oauth-client-node";
2
2
+
import { serve } from "@hono/node-server";
3
3
+
import { Hono } from "hono";
4
4
+
import { generateSignedCookie, getSignedCookie } from "hono/cookie";
5
5
+
import { client } from "./atproto/client";
6
6
+
import { resolveMiniDoc } from "./utils";
7
7
+
import "dotenv/config";
8
8
+
import { jetstream } from "./ingester";
9
9
+
import { Agent } from "@atproto/api";
10
10
+
import { TID } from "@atproto/common";
11
11
+
import { AppFooodzReview } from "./lexicons";
12
12
+
import { is } from "@atcute/lexicons";
13
13
+
import { Layout } from "./components";
14
14
+
import { db } from "./drizzle/db";
15
15
+
import { users } from "./drizzle/schema";
16
16
+
import { eq } from "drizzle-orm";
17
17
+
18
18
+
const app = new Hono();
19
19
+
20
20
+
app.get("/client-metadata.json", (c) => {
21
21
+
return c.json(client.clientMetadata);
22
22
+
});
23
23
+
24
24
+
app.get("/oauth/callback", async (c) => {
25
25
+
const params = new URLSearchParams(c.req.url.split("?")[1]);
26
26
+
27
27
+
try {
28
28
+
const { session } = await client.callback(params);
29
29
+
30
30
+
// check if user is already added to db
31
31
+
const user = await db.query.users.findFirst({
32
32
+
where: eq(users.did, session.did),
33
33
+
});
34
34
+
35
35
+
if (!user) {
36
36
+
console.log("user not found in db, inserting");
37
37
+
await db.insert(users).values({
38
38
+
did: session.did,
39
39
+
});
40
40
+
}
41
41
+
42
42
+
const cookie = await generateSignedCookie(
43
43
+
"__foooodz_session",
44
44
+
session.did,
45
45
+
process.env.COOKIE_SECRET as string,
46
46
+
{
47
47
+
path: "/",
48
48
+
httpOnly: true,
49
49
+
sameSite: "lax",
50
50
+
maxAge: 60 * 60 * 24 * 7,
51
51
+
secure: process.env.NODE_ENV === "production",
52
52
+
},
53
53
+
);
54
54
+
return new Response(null, {
55
55
+
status: 302,
56
56
+
headers: {
57
57
+
"Set-Cookie": cookie,
58
58
+
Location: "/",
59
59
+
},
60
60
+
});
61
61
+
} catch (error) {
62
62
+
if (error instanceof Error) {
63
63
+
throw error;
64
64
+
}
65
65
+
}
66
66
+
});
67
67
+
68
68
+
app.post("/login", async (c) => {
69
69
+
try {
70
70
+
const formData = await c.req.formData();
71
71
+
const handle = formData.get("handle");
72
72
+
if (!handle || typeof handle !== "string") {
73
73
+
return c.json(
74
74
+
{
75
75
+
ok: false,
76
76
+
message: "Invalid handle",
77
77
+
},
78
78
+
400,
79
79
+
);
80
80
+
}
81
81
+
82
82
+
const { did } = await resolveMiniDoc(handle);
83
83
+
84
84
+
const ac = new AbortController();
85
85
+
const redirectUrl = await client.authorize(did, {
86
86
+
signal: ac.signal,
87
87
+
});
88
88
+
return c.redirect(redirectUrl.toString());
89
89
+
} catch (error) {
90
90
+
if (error instanceof OAuthResolverError) {
91
91
+
return c.json({ ok: false, message: error.message }, 500);
92
92
+
}
93
93
+
console.log(error);
94
94
+
return c.json({ ok: false, message: "something went wrong" }, 500);
95
95
+
}
96
96
+
});
97
97
+
98
98
+
app.get("/", async (c) => {
99
99
+
return c.html(
100
100
+
<Layout>
101
101
+
<form method="post" action="/login">
102
102
+
<label htmlFor="handle">Handle</label>
103
103
+
<input type="text" name="handle" id="handle" />
104
104
+
<button type="submit">Login</button>
105
105
+
</form>
106
106
+
</Layout>,
107
107
+
);
108
108
+
});
109
109
+
110
110
+
app.get("/review", async (c) => {
111
111
+
const reviews = await db.query.reviews.findMany({
112
112
+
limit: 10,
113
113
+
});
114
114
+
return c.html(
115
115
+
<Layout>
116
116
+
<form method="post" action="/review">
117
117
+
<label htmlFor="place">place</label>
118
118
+
<input type="text" name="place" id="place" maxlength={200} required />
119
119
+
<label htmlFor="review">review</label>
120
120
+
<textarea name="review" id="review" maxlength={3000} required />
121
121
+
<label htmlFor="rating">rating</label>
122
122
+
<select name="rating" id="rating" required>
123
123
+
{Array.from({ length: 5 }, (_, index) => (
124
124
+
<option key={index} value={index + 1}>
125
125
+
{index + 1}
126
126
+
</option>
127
127
+
))}
128
128
+
</select>
129
129
+
<button type="submit">submit review</button>
130
130
+
</form>
131
131
+
<ul>
132
132
+
{reviews.map((review) => (
133
133
+
<li key={review.rkey}>
134
134
+
<article>
135
135
+
<h2>{review.place}</h2>
136
136
+
<p>{review.review}</p>
137
137
+
<span>{review.rating}</span>
138
138
+
<time datetime={review.createdAt}>{review.createdAt}</time>
139
139
+
</article>
140
140
+
</li>
141
141
+
))}
142
142
+
</ul>
143
143
+
</Layout>,
144
144
+
);
145
145
+
});
146
146
+
147
147
+
app.post("/review", async (c) => {
148
148
+
const cookie = await getSignedCookie(c, process.env.COOKIE_SECRET as string);
149
149
+
if (cookie.__foooodz_session) {
150
150
+
try {
151
151
+
const oauthSession = await client.restore(cookie.__foooodz_session);
152
152
+
const agent = new Agent(oauthSession);
153
153
+
const formData = await c.req.formData();
154
154
+
const place = formData.get("place") as string;
155
155
+
const review = formData.get("review") as string;
156
156
+
const rating = formData.get("rating") as string;
157
157
+
158
158
+
const rkey = TID.nextStr();
159
159
+
160
160
+
const record: AppFooodzReview.Main = {
161
161
+
$type: "app.fooodz.review",
162
162
+
place,
163
163
+
rating: +rating,
164
164
+
review,
165
165
+
createdAt: new Date().toISOString(),
166
166
+
};
167
167
+
168
168
+
if (!is(AppFooodzReview.mainSchema, record)) {
169
169
+
return c.json({ ok: false, message: "invalid review record" }, 400);
170
170
+
}
171
171
+
172
172
+
await agent.com.atproto.repo.putRecord({
173
173
+
repo: agent.assertDid,
174
174
+
rkey,
175
175
+
record,
176
176
+
collection: "app.fooodz.review",
177
177
+
validate: false,
178
178
+
});
179
179
+
180
180
+
return c.redirect("/review");
181
181
+
} catch (error) {
182
182
+
return c.json({ ok: false, message: "failed to write record" }, 500);
183
183
+
}
184
184
+
}
185
185
+
});
186
186
+
187
187
+
serve(
188
188
+
{
189
189
+
fetch: app.fetch,
190
190
+
port: 3000,
191
191
+
},
192
192
+
(info) => {
193
193
+
console.log(`Server is running @ http://localhost:${info.port}`);
194
194
+
jetstream.start();
195
195
+
},
196
196
+
);
+63
src/ingester.ts
···
1
1
+
import { is } from "@atcute/lexicons";
2
2
+
import { Jetstream } from "@skyware/jetstream";
3
3
+
import { AppFooodzReview } from "./lexicons";
4
4
+
import { db } from "./drizzle/db";
5
5
+
import { reviews } from "./drizzle/schema";
6
6
+
import { eq } from "drizzle-orm";
7
7
+
8
8
+
const jetstream = new Jetstream({
9
9
+
wantedCollections: ["app.fooodz.review"],
10
10
+
});
11
11
+
12
12
+
jetstream.onCreate("app.fooodz.review", async (event) => {
13
13
+
console.info(`new review ${event.commit.rkey}`);
14
14
+
if (is(AppFooodzReview.mainSchema, event.commit.record)) {
15
15
+
const { place, rating, review, createdAt } = event.commit.record;
16
16
+
17
17
+
// should store the did and rkey as well
18
18
+
await db.insert(reviews).values({
19
19
+
rkey: event.commit.rkey,
20
20
+
authorDid: event.did,
21
21
+
place,
22
22
+
rating,
23
23
+
review,
24
24
+
createdAt,
25
25
+
});
26
26
+
}
27
27
+
});
28
28
+
29
29
+
jetstream.onUpdate("app.fooodz.review", async (event) => {
30
30
+
if (is(AppFooodzReview.mainSchema, event.commit.record)) {
31
31
+
const { place, rating, review, createdAt } = event.commit.record;
32
32
+
33
33
+
await db
34
34
+
.insert(reviews)
35
35
+
.values({
36
36
+
rkey: event.commit.rkey,
37
37
+
authorDid: event.did,
38
38
+
place,
39
39
+
rating,
40
40
+
review,
41
41
+
createdAt,
42
42
+
})
43
43
+
.onConflictDoUpdate({
44
44
+
target: reviews.rkey,
45
45
+
set: {
46
46
+
place,
47
47
+
rating,
48
48
+
review,
49
49
+
},
50
50
+
});
51
51
+
}
52
52
+
});
53
53
+
54
54
+
jetstream.onDelete("app.fooodz.review", async (event) => {
55
55
+
await db.delete(reviews).where(eq(reviews.rkey, event.commit.rkey));
56
56
+
console.log("deleted record", event.commit.rkey);
57
57
+
});
58
58
+
59
59
+
jetstream.on("open", () => {
60
60
+
console.log("jetstream ingester started");
61
61
+
});
62
62
+
63
63
+
export { jetstream };
+1
src/lexicons/index.ts
···
1
1
+
export * as AppFooodzReview from "./types/app/fooodz/review.js";
+36
src/lexicons/types/app/fooodz/review.ts
···
1
1
+
import type {} from "@atcute/lexicons";
2
2
+
import * as v from "@atcute/lexicons/validations";
3
3
+
import type {} from "@atcute/lexicons/ambient";
4
4
+
5
5
+
const _mainSchema = /*#__PURE__*/ v.record(
6
6
+
/*#__PURE__*/ v.string(),
7
7
+
/*#__PURE__*/ v.object({
8
8
+
$type: /*#__PURE__*/ v.literal("app.fooodz.review"),
9
9
+
createdAt: /*#__PURE__*/ v.datetimeString(),
10
10
+
place: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [
11
11
+
/*#__PURE__*/ v.stringLength(0, 200),
12
12
+
/*#__PURE__*/ v.stringGraphemes(0, 20),
13
13
+
]),
14
14
+
rating: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [
15
15
+
/*#__PURE__*/ v.integerRange(1, 5),
16
16
+
]),
17
17
+
review: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [
18
18
+
/*#__PURE__*/ v.stringLength(0, 3000),
19
19
+
/*#__PURE__*/ v.stringGraphemes(0, 300),
20
20
+
]),
21
21
+
}),
22
22
+
);
23
23
+
24
24
+
type main$schematype = typeof _mainSchema;
25
25
+
26
26
+
export interface mainSchema extends main$schematype {}
27
27
+
28
28
+
export const mainSchema = _mainSchema as mainSchema;
29
29
+
30
30
+
export interface Main extends v.InferInput<typeof mainSchema> {}
31
31
+
32
32
+
declare module "@atcute/lexicons/ambient" {
33
33
+
interface Records {
34
34
+
"app.fooodz.review": mainSchema;
35
35
+
}
36
36
+
}
+11
src/utils.ts
···
1
1
+
export async function resolveMiniDoc(handle: string) {
2
2
+
const response = await fetch(
3
3
+
`https://slingshot.microcosm.blue/xrpc/com.bad-example.identity.resolveMiniDoc?identifier=${handle}`,
4
4
+
);
5
5
+
const data = (await response.json()) as { pds: string; did: string };
6
6
+
7
7
+
return {
8
8
+
pds: data.pds,
9
9
+
did: data.did,
10
10
+
};
11
11
+
}
+10
tsconfig.json
···
1
1
+
{
2
2
+
"compilerOptions": {
3
3
+
"moduleResolution": "bundler",
4
4
+
"module": "esnext",
5
5
+
"esModuleInterop": true,
6
6
+
"strict": true,
7
7
+
"jsx": "react-jsx",
8
8
+
"jsxImportSource": "hono/jsx"
9
9
+
}
10
10
+
}