tangled
alpha
login
or
join now
tsiry-sandratraina.com
/
rocksky
forked from
rocksky.app/rocksky
3
fork
atom
A decentralized music tracking and discovery platform built on AT Protocol 🎵
3
fork
atom
overview
issues
1
pulls
pipelines
Add Tap WebSocket server and Drizzle schema
tsiry-sandratraina.com
1 month ago
ea9477f4
2d73f9df
+1821
17 changed files
expand all
collapse all
unified
split
tap
.gitignore
.zed
settings.json
deno.json
deno.lock
drizzle
0000_spotty_sphinx.sql
0001_funny_wrecker.sql
meta
0000_snapshot.json
0001_snapshot.json
_journal.json
drizzle.config.ts
src
context.ts
drizzle.ts
logger.ts
main.ts
schema
event.ts
mod.ts
tap.ts
+1
tap/.gitignore
···
1
1
.env
2
2
data/
3
3
+
*.db
+25
tap/.zed/settings.json
···
1
1
+
{
2
2
+
"lsp": {
3
3
+
"deno": {
4
4
+
"settings": {
5
5
+
"deno": {
6
6
+
"enable": true,
7
7
+
"unstable": false,
8
8
+
"lint": true,
9
9
+
"cache": null
10
10
+
}
11
11
+
}
12
12
+
}
13
13
+
},
14
14
+
"languages": {
15
15
+
"TypeScript": {
16
16
+
"language_servers": ["deno", "!typescript-language-server"]
17
17
+
},
18
18
+
"TSX": {
19
19
+
"language_servers": ["deno", "!typescript-language-server"]
20
20
+
},
21
21
+
"JavaScript": {
22
22
+
"language_servers": ["deno", "!typescript-language-server"]
23
23
+
}
24
24
+
}
25
25
+
}
+22
tap/deno.json
···
1
1
+
{
2
2
+
"tasks": {
3
3
+
"dev": "deno run --env-file=.env -A --watch src/main.ts"
4
4
+
},
5
5
+
"imports": {
6
6
+
"@atproto/tap": "npm:@atproto/tap@^0.1.3",
7
7
+
"@es-toolkit/es-toolkit": "jsr:@es-toolkit/es-toolkit@^1.44.0",
8
8
+
"@libsql/client": "npm:@libsql/client@^0.17.0",
9
9
+
"@logtape/logtape": "npm:@logtape/logtape@^2.0.0",
10
10
+
"@std/assert": "jsr:@std/assert@1",
11
11
+
"chalk": "npm:chalk@^5.6.2",
12
12
+
"drizzle-kit": "npm:drizzle-kit@^0.31.8",
13
13
+
"drizzle-orm": "npm:drizzle-orm@^0.45.1",
14
14
+
"ramda": "npm:ramda@^0.32.0"
15
15
+
},
16
16
+
"nodeModulesDir": "auto",
17
17
+
"allowScripts": [
18
18
+
"npm:core-js@3.47.0",
19
19
+
"npm:esbuild@0.18.20",
20
20
+
"npm:esbuild@0.25.12"
21
21
+
]
22
22
+
}
+1123
tap/deno.lock
···
1
1
+
{
2
2
+
"version": "5",
3
3
+
"specifiers": {
4
4
+
"jsr:@es-toolkit/es-toolkit@^1.44.0": "1.44.0",
5
5
+
"jsr:@std/assert@1": "1.0.16",
6
6
+
"jsr:@std/internal@^1.0.12": "1.0.12",
7
7
+
"npm:@atproto/tap@~0.1.3": "0.1.3",
8
8
+
"npm:@libsql/client@0.17": "0.17.0",
9
9
+
"npm:@logtape/logtape@2": "2.0.0",
10
10
+
"npm:chalk@^5.6.2": "5.6.2",
11
11
+
"npm:drizzle-kit@~0.31.8": "0.31.8_esbuild@0.25.12",
12
12
+
"npm:drizzle-orm@~0.45.1": "0.45.1_@libsql+client@0.17.0",
13
13
+
"npm:ramda@0.32": "0.32.0"
14
14
+
},
15
15
+
"jsr": {
16
16
+
"@es-toolkit/es-toolkit@1.44.0": {
17
17
+
"integrity": "647a7e777945a3ac81bd1783670f85429c2a661510d9af36becc6963ddfca00d"
18
18
+
},
19
19
+
"@std/assert@1.0.16": {
20
20
+
"integrity": "6a7272ed1eaa77defe76e5ff63ca705d9c495077e2d5fd0126d2b53fc5bd6532",
21
21
+
"dependencies": [
22
22
+
"jsr:@std/internal"
23
23
+
]
24
24
+
},
25
25
+
"@std/internal@1.0.12": {
26
26
+
"integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027"
27
27
+
}
28
28
+
},
29
29
+
"npm": {
30
30
+
"@atproto-labs/did-resolver@0.2.5": {
31
31
+
"integrity": "sha512-he7EC6OMSifNs01a4RT9mta/yYitoKDzlK9ty2TFV5Uj/+HpB4vYMRdIDFrRW0Hcsehy90E2t/dw0t7361MEKQ==",
32
32
+
"dependencies": [
33
33
+
"@atproto-labs/fetch",
34
34
+
"@atproto-labs/pipe",
35
35
+
"@atproto-labs/simple-store",
36
36
+
"@atproto-labs/simple-store-memory",
37
37
+
"@atproto/did",
38
38
+
"zod"
39
39
+
]
40
40
+
},
41
41
+
"@atproto-labs/fetch@0.2.3": {
42
42
+
"integrity": "sha512-NZtbJOCbxKUFRFKMpamT38PUQMY0hX0p7TG5AEYOPhZKZEP7dHZ1K2s1aB8MdVH0qxmqX7nQleNrrvLf09Zfdw==",
43
43
+
"dependencies": [
44
44
+
"@atproto-labs/pipe"
45
45
+
]
46
46
+
},
47
47
+
"@atproto-labs/pipe@0.1.1": {
48
48
+
"integrity": "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg=="
49
49
+
},
50
50
+
"@atproto-labs/simple-store-memory@0.1.4": {
51
51
+
"integrity": "sha512-3mKY4dP8I7yKPFj9VKpYyCRzGJOi5CEpOLPlRhoJyLmgs3J4RzDrjn323Oakjz2Aj2JzRU/AIvWRAZVhpYNJHw==",
52
52
+
"dependencies": [
53
53
+
"@atproto-labs/simple-store",
54
54
+
"lru-cache"
55
55
+
]
56
56
+
},
57
57
+
"@atproto-labs/simple-store@0.3.0": {
58
58
+
"integrity": "sha512-nOb6ONKBRJHRlukW1sVawUkBqReLlLx6hT35VS3imaNPwiXDxLnTK7lxw3Lrl9k5yugSBDQAkZAq3MPTEFSUBQ=="
59
59
+
},
60
60
+
"@atproto/common-web@0.4.12": {
61
61
+
"integrity": "sha512-3aCJemqM/fkHQrVPbTCHCdiVstKFI+2LkFLvUhO6XZP0EqUZa/rg/CIZBKTFUWu9I5iYiaEiXL9VwcDRpEevSw==",
62
62
+
"dependencies": [
63
63
+
"@atproto/lex-data",
64
64
+
"@atproto/lex-json",
65
65
+
"zod"
66
66
+
]
67
67
+
},
68
68
+
"@atproto/common@0.5.8": {
69
69
+
"integrity": "sha512-6BS6OJ/eiN/w8cu3xG1NA/waq9jBsYXZ6pfV85WUDegbfZaGS/IVtpJtjdE7LemE8cJys3AqGFDVJzeXDBQgbw==",
70
70
+
"dependencies": [
71
71
+
"@atproto/common-web",
72
72
+
"@atproto/lex-cbor",
73
73
+
"@atproto/lex-data",
74
74
+
"iso-datestring-validator",
75
75
+
"multiformats",
76
76
+
"pino"
77
77
+
]
78
78
+
},
79
79
+
"@atproto/crypto@0.4.5": {
80
80
+
"integrity": "sha512-n40aKkMoCatP0u9Yvhrdk6fXyOHFDDbkdm4h4HCyWW+KlKl8iXfD5iV+ECq+w5BM+QH25aIpt3/j6EUNerhLxw==",
81
81
+
"dependencies": [
82
82
+
"@noble/curves",
83
83
+
"@noble/hashes",
84
84
+
"uint8arrays"
85
85
+
]
86
86
+
},
87
87
+
"@atproto/did@0.2.4": {
88
88
+
"integrity": "sha512-nxNiCgXeo7pfjojq9fpfZxCO0X0xUipNVKW+AHNZwQKiUDt6zYL0VXEfm8HBUwQOCmKvj2pRRSM1Cur+tUWk3g==",
89
89
+
"dependencies": [
90
90
+
"zod"
91
91
+
]
92
92
+
},
93
93
+
"@atproto/lex-builder@0.0.11": {
94
94
+
"integrity": "sha512-7FQ7iEB8CrZ2ie3NsweZpcleddf0Dd3Ck98iZbBmxmnWrHwseC86+NJ2q+THsbHyF/tdtHGhJPxmc7wWZ5WDKA==",
95
95
+
"dependencies": [
96
96
+
"@atproto/lex-document",
97
97
+
"@atproto/lex-schema",
98
98
+
"prettier",
99
99
+
"ts-morph",
100
100
+
"tslib"
101
101
+
]
102
102
+
},
103
103
+
"@atproto/lex-cbor@0.0.8": {
104
104
+
"integrity": "sha512-WFUkNTLUMunPaA+NkD2INwfhrgo5fAMz7zSk2ncoqbK2AS78X2ith8TJSevY0ynPukbFmaJ9BdauzCpWQ4ZIqQ==",
105
105
+
"dependencies": [
106
106
+
"@atproto/lex-data",
107
107
+
"tslib"
108
108
+
]
109
109
+
},
110
110
+
"@atproto/lex-client@0.0.9": {
111
111
+
"integrity": "sha512-30WtEedG0s/JNkbHzxpObkUg0id4+/p1O7LcUVCQWrNhWRw/hCzhHySSgFKKIVeLKAYIrZmaWt1XlAdNhGO7DQ==",
112
112
+
"dependencies": [
113
113
+
"@atproto/lex-data",
114
114
+
"@atproto/lex-json",
115
115
+
"@atproto/lex-schema",
116
116
+
"tslib"
117
117
+
]
118
118
+
},
119
119
+
"@atproto/lex-data@0.0.8": {
120
120
+
"integrity": "sha512-1Y5tz7BkS7380QuLNXaE8GW8Xba+mRWugt8BKM4BUFYjjUZdmirU8lr72iM4XlEBrzRu8Cfvj+MbsbYaZv+IgA==",
121
121
+
"dependencies": [
122
122
+
"@atproto/syntax",
123
123
+
"multiformats",
124
124
+
"tslib",
125
125
+
"uint8arrays",
126
126
+
"unicode-segmenter"
127
127
+
]
128
128
+
},
129
129
+
"@atproto/lex-document@0.0.10": {
130
130
+
"integrity": "sha512-GrvO36UyWhStSNN0CtVswMyzYK7eUA0zLjYJRqpghAyzYV9ZVXTUL1Vx79MUSg3tC1jDM1A0hmtsjE1Cyo2rHQ==",
131
131
+
"dependencies": [
132
132
+
"@atproto/lex-schema",
133
133
+
"core-js",
134
134
+
"tslib"
135
135
+
]
136
136
+
},
137
137
+
"@atproto/lex-installer@0.0.11": {
138
138
+
"integrity": "sha512-uNjpmG7p91UBKd1RJh0AJbbi5jzpHuTCjx1Pr0ZBbBmssOnr9GvMhSpeFU8ZuJ2HJqMMCBxUCU7zlad/b0KafA==",
139
139
+
"dependencies": [
140
140
+
"@atproto/lex-builder",
141
141
+
"@atproto/lex-cbor",
142
142
+
"@atproto/lex-data",
143
143
+
"@atproto/lex-document",
144
144
+
"@atproto/lex-resolver",
145
145
+
"@atproto/lex-schema",
146
146
+
"@atproto/syntax",
147
147
+
"tslib"
148
148
+
]
149
149
+
},
150
150
+
"@atproto/lex-json@0.0.8": {
151
151
+
"integrity": "sha512-w1Qmkae1QhmNz+i1Zm3xr3jp0UPPRENmdlpU0qIrdxWDo9W4Mzkeyc3eSoa+Zs+zN8xkRSQw7RLZte/B7Ipdwg==",
152
152
+
"dependencies": [
153
153
+
"@atproto/lex-data",
154
154
+
"tslib"
155
155
+
]
156
156
+
},
157
157
+
"@atproto/lex-resolver@0.0.10": {
158
158
+
"integrity": "sha512-7cV/vjJGHMUbzv1y2kIOChC/B5ox1F5hKpG3fFZdkM8eZ5o9NuMiIojvTgCYdxyH+XA/X6qjblMrru73fFRtmA==",
159
159
+
"dependencies": [
160
160
+
"@atproto-labs/did-resolver",
161
161
+
"@atproto/crypto",
162
162
+
"@atproto/lex-client",
163
163
+
"@atproto/lex-data",
164
164
+
"@atproto/lex-document",
165
165
+
"@atproto/lex-schema",
166
166
+
"@atproto/repo",
167
167
+
"@atproto/syntax",
168
168
+
"tslib"
169
169
+
]
170
170
+
},
171
171
+
"@atproto/lex-schema@0.0.9": {
172
172
+
"integrity": "sha512-nsXpG0BdWu5Qn8qgs/+tHKP2gdVoYNiYwIUl+lt6EFb5juuOScmPilhZOa9MPDpLLzVgl35x9whjh842CvpHJQ==",
173
173
+
"dependencies": [
174
174
+
"@atproto/lex-data",
175
175
+
"@atproto/syntax",
176
176
+
"tslib"
177
177
+
]
178
178
+
},
179
179
+
"@atproto/lex@0.0.11": {
180
180
+
"integrity": "sha512-/AmuUrBidTMqwmPedjhGI3nqSZ7JqiowcCuFhfa1kvkJLPbv8S+PPALRrc+pvMM3IEgg9EctqmeauQM+as32ww==",
181
181
+
"dependencies": [
182
182
+
"@atproto/lex-builder",
183
183
+
"@atproto/lex-client",
184
184
+
"@atproto/lex-data",
185
185
+
"@atproto/lex-installer",
186
186
+
"@atproto/lex-json",
187
187
+
"@atproto/lex-schema",
188
188
+
"tslib",
189
189
+
"yargs"
190
190
+
],
191
191
+
"bin": true
192
192
+
},
193
193
+
"@atproto/lexicon@0.6.0": {
194
194
+
"integrity": "sha512-5veb8aD+J5M0qszLJ+73KSFsFrJBgAY/nM1TSAJvGY7fNc9ZAT+PSUlmIyrdye9YznAZ07yktalls/TwNV7cHQ==",
195
195
+
"dependencies": [
196
196
+
"@atproto/common-web",
197
197
+
"@atproto/syntax",
198
198
+
"iso-datestring-validator",
199
199
+
"multiformats",
200
200
+
"zod"
201
201
+
]
202
202
+
},
203
203
+
"@atproto/repo@0.8.12": {
204
204
+
"integrity": "sha512-QpVTVulgfz5PUiCTELlDBiRvnsnwrFWi+6CfY88VwXzrRHd9NE8GItK7sfxQ6U65vD/idH8ddCgFrlrsn1REPQ==",
205
205
+
"dependencies": [
206
206
+
"@atproto/common",
207
207
+
"@atproto/common-web",
208
208
+
"@atproto/crypto",
209
209
+
"@atproto/lexicon",
210
210
+
"@ipld/dag-cbor",
211
211
+
"multiformats",
212
212
+
"uint8arrays",
213
213
+
"varint",
214
214
+
"zod"
215
215
+
]
216
216
+
},
217
217
+
"@atproto/syntax@0.4.2": {
218
218
+
"integrity": "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA=="
219
219
+
},
220
220
+
"@atproto/tap@0.1.3": {
221
221
+
"integrity": "sha512-vjc7RnBOBMHO01zTFvsFy2MvcdmRpoCOy/97xsnFSa0bR7C9OpnRJwMHodLqsbXrt0viLflD25BBXY+Q5VFspg==",
222
222
+
"dependencies": [
223
223
+
"@atproto/common",
224
224
+
"@atproto/lex",
225
225
+
"@atproto/syntax",
226
226
+
"@atproto/ws-client",
227
227
+
"ws",
228
228
+
"zod"
229
229
+
]
230
230
+
},
231
231
+
"@atproto/ws-client@0.0.4": {
232
232
+
"integrity": "sha512-dox1XIymuC7/ZRhUqKezIGgooZS45C6vHCfu0PnWjfvsLCK2kAlnvX4IBkA/WpcoijDhQ9ejChnFbo/sLmgvAg==",
233
233
+
"dependencies": [
234
234
+
"@atproto/common",
235
235
+
"ws"
236
236
+
]
237
237
+
},
238
238
+
"@drizzle-team/brocli@0.10.2": {
239
239
+
"integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="
240
240
+
},
241
241
+
"@esbuild-kit/core-utils@3.3.2": {
242
242
+
"integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==",
243
243
+
"dependencies": [
244
244
+
"esbuild@0.18.20",
245
245
+
"source-map-support"
246
246
+
],
247
247
+
"deprecated": true
248
248
+
},
249
249
+
"@esbuild-kit/esm-loader@2.6.5": {
250
250
+
"integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==",
251
251
+
"dependencies": [
252
252
+
"@esbuild-kit/core-utils",
253
253
+
"get-tsconfig"
254
254
+
],
255
255
+
"deprecated": true
256
256
+
},
257
257
+
"@esbuild/aix-ppc64@0.25.12": {
258
258
+
"integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
259
259
+
"os": ["aix"],
260
260
+
"cpu": ["ppc64"]
261
261
+
},
262
262
+
"@esbuild/android-arm64@0.18.20": {
263
263
+
"integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
264
264
+
"os": ["android"],
265
265
+
"cpu": ["arm64"]
266
266
+
},
267
267
+
"@esbuild/android-arm64@0.25.12": {
268
268
+
"integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
269
269
+
"os": ["android"],
270
270
+
"cpu": ["arm64"]
271
271
+
},
272
272
+
"@esbuild/android-arm@0.18.20": {
273
273
+
"integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
274
274
+
"os": ["android"],
275
275
+
"cpu": ["arm"]
276
276
+
},
277
277
+
"@esbuild/android-arm@0.25.12": {
278
278
+
"integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
279
279
+
"os": ["android"],
280
280
+
"cpu": ["arm"]
281
281
+
},
282
282
+
"@esbuild/android-x64@0.18.20": {
283
283
+
"integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
284
284
+
"os": ["android"],
285
285
+
"cpu": ["x64"]
286
286
+
},
287
287
+
"@esbuild/android-x64@0.25.12": {
288
288
+
"integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
289
289
+
"os": ["android"],
290
290
+
"cpu": ["x64"]
291
291
+
},
292
292
+
"@esbuild/darwin-arm64@0.18.20": {
293
293
+
"integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
294
294
+
"os": ["darwin"],
295
295
+
"cpu": ["arm64"]
296
296
+
},
297
297
+
"@esbuild/darwin-arm64@0.25.12": {
298
298
+
"integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
299
299
+
"os": ["darwin"],
300
300
+
"cpu": ["arm64"]
301
301
+
},
302
302
+
"@esbuild/darwin-x64@0.18.20": {
303
303
+
"integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
304
304
+
"os": ["darwin"],
305
305
+
"cpu": ["x64"]
306
306
+
},
307
307
+
"@esbuild/darwin-x64@0.25.12": {
308
308
+
"integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
309
309
+
"os": ["darwin"],
310
310
+
"cpu": ["x64"]
311
311
+
},
312
312
+
"@esbuild/freebsd-arm64@0.18.20": {
313
313
+
"integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
314
314
+
"os": ["freebsd"],
315
315
+
"cpu": ["arm64"]
316
316
+
},
317
317
+
"@esbuild/freebsd-arm64@0.25.12": {
318
318
+
"integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
319
319
+
"os": ["freebsd"],
320
320
+
"cpu": ["arm64"]
321
321
+
},
322
322
+
"@esbuild/freebsd-x64@0.18.20": {
323
323
+
"integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
324
324
+
"os": ["freebsd"],
325
325
+
"cpu": ["x64"]
326
326
+
},
327
327
+
"@esbuild/freebsd-x64@0.25.12": {
328
328
+
"integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
329
329
+
"os": ["freebsd"],
330
330
+
"cpu": ["x64"]
331
331
+
},
332
332
+
"@esbuild/linux-arm64@0.18.20": {
333
333
+
"integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
334
334
+
"os": ["linux"],
335
335
+
"cpu": ["arm64"]
336
336
+
},
337
337
+
"@esbuild/linux-arm64@0.25.12": {
338
338
+
"integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
339
339
+
"os": ["linux"],
340
340
+
"cpu": ["arm64"]
341
341
+
},
342
342
+
"@esbuild/linux-arm@0.18.20": {
343
343
+
"integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
344
344
+
"os": ["linux"],
345
345
+
"cpu": ["arm"]
346
346
+
},
347
347
+
"@esbuild/linux-arm@0.25.12": {
348
348
+
"integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
349
349
+
"os": ["linux"],
350
350
+
"cpu": ["arm"]
351
351
+
},
352
352
+
"@esbuild/linux-ia32@0.18.20": {
353
353
+
"integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
354
354
+
"os": ["linux"],
355
355
+
"cpu": ["ia32"]
356
356
+
},
357
357
+
"@esbuild/linux-ia32@0.25.12": {
358
358
+
"integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
359
359
+
"os": ["linux"],
360
360
+
"cpu": ["ia32"]
361
361
+
},
362
362
+
"@esbuild/linux-loong64@0.18.20": {
363
363
+
"integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
364
364
+
"os": ["linux"],
365
365
+
"cpu": ["loong64"]
366
366
+
},
367
367
+
"@esbuild/linux-loong64@0.25.12": {
368
368
+
"integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
369
369
+
"os": ["linux"],
370
370
+
"cpu": ["loong64"]
371
371
+
},
372
372
+
"@esbuild/linux-mips64el@0.18.20": {
373
373
+
"integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
374
374
+
"os": ["linux"],
375
375
+
"cpu": ["mips64el"]
376
376
+
},
377
377
+
"@esbuild/linux-mips64el@0.25.12": {
378
378
+
"integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
379
379
+
"os": ["linux"],
380
380
+
"cpu": ["mips64el"]
381
381
+
},
382
382
+
"@esbuild/linux-ppc64@0.18.20": {
383
383
+
"integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
384
384
+
"os": ["linux"],
385
385
+
"cpu": ["ppc64"]
386
386
+
},
387
387
+
"@esbuild/linux-ppc64@0.25.12": {
388
388
+
"integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
389
389
+
"os": ["linux"],
390
390
+
"cpu": ["ppc64"]
391
391
+
},
392
392
+
"@esbuild/linux-riscv64@0.18.20": {
393
393
+
"integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
394
394
+
"os": ["linux"],
395
395
+
"cpu": ["riscv64"]
396
396
+
},
397
397
+
"@esbuild/linux-riscv64@0.25.12": {
398
398
+
"integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
399
399
+
"os": ["linux"],
400
400
+
"cpu": ["riscv64"]
401
401
+
},
402
402
+
"@esbuild/linux-s390x@0.18.20": {
403
403
+
"integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
404
404
+
"os": ["linux"],
405
405
+
"cpu": ["s390x"]
406
406
+
},
407
407
+
"@esbuild/linux-s390x@0.25.12": {
408
408
+
"integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
409
409
+
"os": ["linux"],
410
410
+
"cpu": ["s390x"]
411
411
+
},
412
412
+
"@esbuild/linux-x64@0.18.20": {
413
413
+
"integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
414
414
+
"os": ["linux"],
415
415
+
"cpu": ["x64"]
416
416
+
},
417
417
+
"@esbuild/linux-x64@0.25.12": {
418
418
+
"integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
419
419
+
"os": ["linux"],
420
420
+
"cpu": ["x64"]
421
421
+
},
422
422
+
"@esbuild/netbsd-arm64@0.25.12": {
423
423
+
"integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
424
424
+
"os": ["netbsd"],
425
425
+
"cpu": ["arm64"]
426
426
+
},
427
427
+
"@esbuild/netbsd-x64@0.18.20": {
428
428
+
"integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
429
429
+
"os": ["netbsd"],
430
430
+
"cpu": ["x64"]
431
431
+
},
432
432
+
"@esbuild/netbsd-x64@0.25.12": {
433
433
+
"integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
434
434
+
"os": ["netbsd"],
435
435
+
"cpu": ["x64"]
436
436
+
},
437
437
+
"@esbuild/openbsd-arm64@0.25.12": {
438
438
+
"integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
439
439
+
"os": ["openbsd"],
440
440
+
"cpu": ["arm64"]
441
441
+
},
442
442
+
"@esbuild/openbsd-x64@0.18.20": {
443
443
+
"integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
444
444
+
"os": ["openbsd"],
445
445
+
"cpu": ["x64"]
446
446
+
},
447
447
+
"@esbuild/openbsd-x64@0.25.12": {
448
448
+
"integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
449
449
+
"os": ["openbsd"],
450
450
+
"cpu": ["x64"]
451
451
+
},
452
452
+
"@esbuild/openharmony-arm64@0.25.12": {
453
453
+
"integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
454
454
+
"os": ["openharmony"],
455
455
+
"cpu": ["arm64"]
456
456
+
},
457
457
+
"@esbuild/sunos-x64@0.18.20": {
458
458
+
"integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
459
459
+
"os": ["sunos"],
460
460
+
"cpu": ["x64"]
461
461
+
},
462
462
+
"@esbuild/sunos-x64@0.25.12": {
463
463
+
"integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
464
464
+
"os": ["sunos"],
465
465
+
"cpu": ["x64"]
466
466
+
},
467
467
+
"@esbuild/win32-arm64@0.18.20": {
468
468
+
"integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
469
469
+
"os": ["win32"],
470
470
+
"cpu": ["arm64"]
471
471
+
},
472
472
+
"@esbuild/win32-arm64@0.25.12": {
473
473
+
"integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
474
474
+
"os": ["win32"],
475
475
+
"cpu": ["arm64"]
476
476
+
},
477
477
+
"@esbuild/win32-ia32@0.18.20": {
478
478
+
"integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
479
479
+
"os": ["win32"],
480
480
+
"cpu": ["ia32"]
481
481
+
},
482
482
+
"@esbuild/win32-ia32@0.25.12": {
483
483
+
"integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
484
484
+
"os": ["win32"],
485
485
+
"cpu": ["ia32"]
486
486
+
},
487
487
+
"@esbuild/win32-x64@0.18.20": {
488
488
+
"integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
489
489
+
"os": ["win32"],
490
490
+
"cpu": ["x64"]
491
491
+
},
492
492
+
"@esbuild/win32-x64@0.25.12": {
493
493
+
"integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
494
494
+
"os": ["win32"],
495
495
+
"cpu": ["x64"]
496
496
+
},
497
497
+
"@ipld/dag-cbor@7.0.3": {
498
498
+
"integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==",
499
499
+
"dependencies": [
500
500
+
"cborg",
501
501
+
"multiformats"
502
502
+
]
503
503
+
},
504
504
+
"@isaacs/balanced-match@4.0.1": {
505
505
+
"integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="
506
506
+
},
507
507
+
"@isaacs/brace-expansion@5.0.0": {
508
508
+
"integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
509
509
+
"dependencies": [
510
510
+
"@isaacs/balanced-match"
511
511
+
]
512
512
+
},
513
513
+
"@libsql/client@0.17.0": {
514
514
+
"integrity": "sha512-TLjSU9Otdpq0SpKHl1tD1Nc9MKhrsZbCFGot3EbCxRa8m1E5R1mMwoOjKMMM31IyF7fr+hPNHLpYfwbMKNusmg==",
515
515
+
"dependencies": [
516
516
+
"@libsql/core",
517
517
+
"@libsql/hrana-client",
518
518
+
"js-base64",
519
519
+
"libsql",
520
520
+
"promise-limit"
521
521
+
]
522
522
+
},
523
523
+
"@libsql/core@0.17.0": {
524
524
+
"integrity": "sha512-hnZRnJHiS+nrhHKLGYPoJbc78FE903MSDrFJTbftxo+e52X+E0Y0fHOCVYsKWcg6XgB7BbJYUrz/xEkVTSaipw==",
525
525
+
"dependencies": [
526
526
+
"js-base64"
527
527
+
]
528
528
+
},
529
529
+
"@libsql/darwin-arm64@0.5.22": {
530
530
+
"integrity": "sha512-4B8ZlX3nIDPndfct7GNe0nI3Yw6ibocEicWdC4fvQbSs/jdq/RC2oCsoJxJ4NzXkvktX70C1J4FcmmoBy069UA==",
531
531
+
"os": ["darwin"],
532
532
+
"cpu": ["arm64"]
533
533
+
},
534
534
+
"@libsql/darwin-x64@0.5.22": {
535
535
+
"integrity": "sha512-ny2HYWt6lFSIdNFzUFIJ04uiW6finXfMNJ7wypkAD8Pqdm6nAByO+Fdqu8t7sD0sqJGeUCiOg480icjyQ2/8VA==",
536
536
+
"os": ["darwin"],
537
537
+
"cpu": ["x64"]
538
538
+
},
539
539
+
"@libsql/hrana-client@0.9.0": {
540
540
+
"integrity": "sha512-pxQ1986AuWfPX4oXzBvLwBnfgKDE5OMhAdR/5cZmRaB4Ygz5MecQybvwZupnRz341r2CtFmbk/BhSu7k2Lm+Jw==",
541
541
+
"dependencies": [
542
542
+
"@libsql/isomorphic-ws",
543
543
+
"cross-fetch",
544
544
+
"js-base64",
545
545
+
"node-fetch@3.3.2"
546
546
+
]
547
547
+
},
548
548
+
"@libsql/isomorphic-ws@0.1.5": {
549
549
+
"integrity": "sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==",
550
550
+
"dependencies": [
551
551
+
"@types/ws",
552
552
+
"ws"
553
553
+
]
554
554
+
},
555
555
+
"@libsql/linux-arm-gnueabihf@0.5.22": {
556
556
+
"integrity": "sha512-3Uo3SoDPJe/zBnyZKosziRGtszXaEtv57raWrZIahtQDsjxBVjuzYQinCm9LRCJCUT5t2r5Z5nLDPJi2CwZVoA==",
557
557
+
"os": ["linux"],
558
558
+
"cpu": ["arm"]
559
559
+
},
560
560
+
"@libsql/linux-arm-musleabihf@0.5.22": {
561
561
+
"integrity": "sha512-LCsXh07jvSojTNJptT9CowOzwITznD+YFGGW+1XxUr7fS+7/ydUrpDfsMX7UqTqjm7xG17eq86VkWJgHJfvpNg==",
562
562
+
"os": ["linux"],
563
563
+
"cpu": ["arm"]
564
564
+
},
565
565
+
"@libsql/linux-arm64-gnu@0.5.22": {
566
566
+
"integrity": "sha512-KSdnOMy88c9mpOFKUEzPskSaF3VLflfSUCBwas/pn1/sV3pEhtMF6H8VUCd2rsedwoukeeCSEONqX7LLnQwRMA==",
567
567
+
"os": ["linux"],
568
568
+
"cpu": ["arm64"]
569
569
+
},
570
570
+
"@libsql/linux-arm64-musl@0.5.22": {
571
571
+
"integrity": "sha512-mCHSMAsDTLK5YH//lcV3eFEgiR23Ym0U9oEvgZA0667gqRZg/2px+7LshDvErEKv2XZ8ixzw3p1IrBzLQHGSsw==",
572
572
+
"os": ["linux"],
573
573
+
"cpu": ["arm64"]
574
574
+
},
575
575
+
"@libsql/linux-x64-gnu@0.5.22": {
576
576
+
"integrity": "sha512-kNBHaIkSg78Y4BqAdgjcR2mBilZXs4HYkAmi58J+4GRwDQZh5fIUWbnQvB9f95DkWUIGVeenqLRFY2pcTmlsew==",
577
577
+
"os": ["linux"],
578
578
+
"cpu": ["x64"]
579
579
+
},
580
580
+
"@libsql/linux-x64-musl@0.5.22": {
581
581
+
"integrity": "sha512-UZ4Xdxm4pu3pQXjvfJiyCzZop/9j/eA2JjmhMaAhe3EVLH2g11Fy4fwyUp9sT1QJYR1kpc2JLuybPM0kuXv/Tg==",
582
582
+
"os": ["linux"],
583
583
+
"cpu": ["x64"]
584
584
+
},
585
585
+
"@libsql/win32-x64-msvc@0.5.22": {
586
586
+
"integrity": "sha512-Fj0j8RnBpo43tVZUVoNK6BV/9AtDUM5S7DF3LB4qTYg1LMSZqi3yeCneUTLJD6XomQJlZzbI4mst89yspVSAnA==",
587
587
+
"os": ["win32"],
588
588
+
"cpu": ["x64"]
589
589
+
},
590
590
+
"@logtape/logtape@2.0.0": {
591
591
+
"integrity": "sha512-z9Hp44mIRXAzgxSyQfFQiRuJ78EMnZa6g43UCxyGOO3RgHjn/7q+5OhdbhypkeHjiJRPxv6RmRsyF0S+OOYWnA=="
592
592
+
},
593
593
+
"@neon-rs/load@0.0.4": {
594
594
+
"integrity": "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw=="
595
595
+
},
596
596
+
"@noble/curves@1.9.7": {
597
597
+
"integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
598
598
+
"dependencies": [
599
599
+
"@noble/hashes"
600
600
+
]
601
601
+
},
602
602
+
"@noble/hashes@1.8.0": {
603
603
+
"integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="
604
604
+
},
605
605
+
"@ts-morph/common@0.28.1": {
606
606
+
"integrity": "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==",
607
607
+
"dependencies": [
608
608
+
"minimatch",
609
609
+
"path-browserify",
610
610
+
"tinyglobby"
611
611
+
]
612
612
+
},
613
613
+
"@types/node@25.0.9": {
614
614
+
"integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==",
615
615
+
"dependencies": [
616
616
+
"undici-types"
617
617
+
]
618
618
+
},
619
619
+
"@types/ws@8.18.1": {
620
620
+
"integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
621
621
+
"dependencies": [
622
622
+
"@types/node"
623
623
+
]
624
624
+
},
625
625
+
"abort-controller@3.0.0": {
626
626
+
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
627
627
+
"dependencies": [
628
628
+
"event-target-shim"
629
629
+
]
630
630
+
},
631
631
+
"ansi-regex@5.0.1": {
632
632
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
633
633
+
},
634
634
+
"ansi-styles@4.3.0": {
635
635
+
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
636
636
+
"dependencies": [
637
637
+
"color-convert"
638
638
+
]
639
639
+
},
640
640
+
"atomic-sleep@1.0.0": {
641
641
+
"integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="
642
642
+
},
643
643
+
"base64-js@1.5.1": {
644
644
+
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
645
645
+
},
646
646
+
"buffer-from@1.1.2": {
647
647
+
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
648
648
+
},
649
649
+
"buffer@6.0.3": {
650
650
+
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
651
651
+
"dependencies": [
652
652
+
"base64-js",
653
653
+
"ieee754"
654
654
+
]
655
655
+
},
656
656
+
"cborg@1.10.2": {
657
657
+
"integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==",
658
658
+
"bin": true
659
659
+
},
660
660
+
"chalk@5.6.2": {
661
661
+
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="
662
662
+
},
663
663
+
"cliui@8.0.1": {
664
664
+
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
665
665
+
"dependencies": [
666
666
+
"string-width",
667
667
+
"strip-ansi",
668
668
+
"wrap-ansi"
669
669
+
]
670
670
+
},
671
671
+
"code-block-writer@13.0.3": {
672
672
+
"integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="
673
673
+
},
674
674
+
"color-convert@2.0.1": {
675
675
+
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
676
676
+
"dependencies": [
677
677
+
"color-name"
678
678
+
]
679
679
+
},
680
680
+
"color-name@1.1.4": {
681
681
+
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
682
682
+
},
683
683
+
"core-js@3.47.0": {
684
684
+
"integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==",
685
685
+
"scripts": true
686
686
+
},
687
687
+
"cross-fetch@4.1.0": {
688
688
+
"integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==",
689
689
+
"dependencies": [
690
690
+
"node-fetch@2.7.0"
691
691
+
]
692
692
+
},
693
693
+
"data-uri-to-buffer@4.0.1": {
694
694
+
"integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="
695
695
+
},
696
696
+
"debug@4.4.3": {
697
697
+
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
698
698
+
"dependencies": [
699
699
+
"ms"
700
700
+
]
701
701
+
},
702
702
+
"detect-libc@2.0.2": {
703
703
+
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="
704
704
+
},
705
705
+
"drizzle-kit@0.31.8_esbuild@0.25.12": {
706
706
+
"integrity": "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==",
707
707
+
"dependencies": [
708
708
+
"@drizzle-team/brocli",
709
709
+
"@esbuild-kit/esm-loader",
710
710
+
"esbuild@0.25.12",
711
711
+
"esbuild-register"
712
712
+
],
713
713
+
"bin": true
714
714
+
},
715
715
+
"drizzle-orm@0.45.1_@libsql+client@0.17.0": {
716
716
+
"integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==",
717
717
+
"dependencies": [
718
718
+
"@libsql/client"
719
719
+
],
720
720
+
"optionalPeers": [
721
721
+
"@libsql/client"
722
722
+
]
723
723
+
},
724
724
+
"emoji-regex@8.0.0": {
725
725
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
726
726
+
},
727
727
+
"esbuild-register@3.6.0_esbuild@0.25.12": {
728
728
+
"integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
729
729
+
"dependencies": [
730
730
+
"debug",
731
731
+
"esbuild@0.25.12"
732
732
+
]
733
733
+
},
734
734
+
"esbuild@0.18.20": {
735
735
+
"integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
736
736
+
"optionalDependencies": [
737
737
+
"@esbuild/android-arm@0.18.20",
738
738
+
"@esbuild/android-arm64@0.18.20",
739
739
+
"@esbuild/android-x64@0.18.20",
740
740
+
"@esbuild/darwin-arm64@0.18.20",
741
741
+
"@esbuild/darwin-x64@0.18.20",
742
742
+
"@esbuild/freebsd-arm64@0.18.20",
743
743
+
"@esbuild/freebsd-x64@0.18.20",
744
744
+
"@esbuild/linux-arm@0.18.20",
745
745
+
"@esbuild/linux-arm64@0.18.20",
746
746
+
"@esbuild/linux-ia32@0.18.20",
747
747
+
"@esbuild/linux-loong64@0.18.20",
748
748
+
"@esbuild/linux-mips64el@0.18.20",
749
749
+
"@esbuild/linux-ppc64@0.18.20",
750
750
+
"@esbuild/linux-riscv64@0.18.20",
751
751
+
"@esbuild/linux-s390x@0.18.20",
752
752
+
"@esbuild/linux-x64@0.18.20",
753
753
+
"@esbuild/netbsd-x64@0.18.20",
754
754
+
"@esbuild/openbsd-x64@0.18.20",
755
755
+
"@esbuild/sunos-x64@0.18.20",
756
756
+
"@esbuild/win32-arm64@0.18.20",
757
757
+
"@esbuild/win32-ia32@0.18.20",
758
758
+
"@esbuild/win32-x64@0.18.20"
759
759
+
],
760
760
+
"scripts": true,
761
761
+
"bin": true
762
762
+
},
763
763
+
"esbuild@0.25.12": {
764
764
+
"integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
765
765
+
"optionalDependencies": [
766
766
+
"@esbuild/aix-ppc64",
767
767
+
"@esbuild/android-arm@0.25.12",
768
768
+
"@esbuild/android-arm64@0.25.12",
769
769
+
"@esbuild/android-x64@0.25.12",
770
770
+
"@esbuild/darwin-arm64@0.25.12",
771
771
+
"@esbuild/darwin-x64@0.25.12",
772
772
+
"@esbuild/freebsd-arm64@0.25.12",
773
773
+
"@esbuild/freebsd-x64@0.25.12",
774
774
+
"@esbuild/linux-arm@0.25.12",
775
775
+
"@esbuild/linux-arm64@0.25.12",
776
776
+
"@esbuild/linux-ia32@0.25.12",
777
777
+
"@esbuild/linux-loong64@0.25.12",
778
778
+
"@esbuild/linux-mips64el@0.25.12",
779
779
+
"@esbuild/linux-ppc64@0.25.12",
780
780
+
"@esbuild/linux-riscv64@0.25.12",
781
781
+
"@esbuild/linux-s390x@0.25.12",
782
782
+
"@esbuild/linux-x64@0.25.12",
783
783
+
"@esbuild/netbsd-arm64",
784
784
+
"@esbuild/netbsd-x64@0.25.12",
785
785
+
"@esbuild/openbsd-arm64",
786
786
+
"@esbuild/openbsd-x64@0.25.12",
787
787
+
"@esbuild/openharmony-arm64",
788
788
+
"@esbuild/sunos-x64@0.25.12",
789
789
+
"@esbuild/win32-arm64@0.25.12",
790
790
+
"@esbuild/win32-ia32@0.25.12",
791
791
+
"@esbuild/win32-x64@0.25.12"
792
792
+
],
793
793
+
"scripts": true,
794
794
+
"bin": true
795
795
+
},
796
796
+
"escalade@3.2.0": {
797
797
+
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="
798
798
+
},
799
799
+
"event-target-shim@5.0.1": {
800
800
+
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
801
801
+
},
802
802
+
"events@3.3.0": {
803
803
+
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
804
804
+
},
805
805
+
"fast-redact@3.5.0": {
806
806
+
"integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="
807
807
+
},
808
808
+
"fdir@6.5.0_picomatch@4.0.3": {
809
809
+
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
810
810
+
"dependencies": [
811
811
+
"picomatch"
812
812
+
],
813
813
+
"optionalPeers": [
814
814
+
"picomatch"
815
815
+
]
816
816
+
},
817
817
+
"fetch-blob@3.2.0": {
818
818
+
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
819
819
+
"dependencies": [
820
820
+
"node-domexception",
821
821
+
"web-streams-polyfill"
822
822
+
]
823
823
+
},
824
824
+
"formdata-polyfill@4.0.10": {
825
825
+
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
826
826
+
"dependencies": [
827
827
+
"fetch-blob"
828
828
+
]
829
829
+
},
830
830
+
"get-caller-file@2.0.5": {
831
831
+
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
832
832
+
},
833
833
+
"get-tsconfig@4.13.0": {
834
834
+
"integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
835
835
+
"dependencies": [
836
836
+
"resolve-pkg-maps"
837
837
+
]
838
838
+
},
839
839
+
"ieee754@1.2.1": {
840
840
+
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
841
841
+
},
842
842
+
"is-fullwidth-code-point@3.0.0": {
843
843
+
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
844
844
+
},
845
845
+
"iso-datestring-validator@2.2.2": {
846
846
+
"integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA=="
847
847
+
},
848
848
+
"js-base64@3.7.8": {
849
849
+
"integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow=="
850
850
+
},
851
851
+
"libsql@0.5.22": {
852
852
+
"integrity": "sha512-NscWthMQt7fpU8lqd7LXMvT9pi+KhhmTHAJWUB/Lj6MWa0MKFv0F2V4C6WKKpjCVZl0VwcDz4nOI3CyaT1DDiA==",
853
853
+
"dependencies": [
854
854
+
"@neon-rs/load",
855
855
+
"detect-libc"
856
856
+
],
857
857
+
"optionalDependencies": [
858
858
+
"@libsql/darwin-arm64",
859
859
+
"@libsql/darwin-x64",
860
860
+
"@libsql/linux-arm-gnueabihf",
861
861
+
"@libsql/linux-arm-musleabihf",
862
862
+
"@libsql/linux-arm64-gnu",
863
863
+
"@libsql/linux-arm64-musl",
864
864
+
"@libsql/linux-x64-gnu",
865
865
+
"@libsql/linux-x64-musl",
866
866
+
"@libsql/win32-x64-msvc"
867
867
+
],
868
868
+
"os": ["darwin", "linux", "win32"],
869
869
+
"cpu": ["x64", "arm64", "wasm32", "arm"]
870
870
+
},
871
871
+
"lru-cache@10.4.3": {
872
872
+
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
873
873
+
},
874
874
+
"minimatch@10.1.1": {
875
875
+
"integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
876
876
+
"dependencies": [
877
877
+
"@isaacs/brace-expansion"
878
878
+
]
879
879
+
},
880
880
+
"ms@2.1.3": {
881
881
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
882
882
+
},
883
883
+
"multiformats@9.9.0": {
884
884
+
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
885
885
+
},
886
886
+
"node-domexception@1.0.0": {
887
887
+
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
888
888
+
"deprecated": true
889
889
+
},
890
890
+
"node-fetch@2.7.0": {
891
891
+
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
892
892
+
"dependencies": [
893
893
+
"whatwg-url"
894
894
+
]
895
895
+
},
896
896
+
"node-fetch@3.3.2": {
897
897
+
"integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
898
898
+
"dependencies": [
899
899
+
"data-uri-to-buffer",
900
900
+
"fetch-blob",
901
901
+
"formdata-polyfill"
902
902
+
]
903
903
+
},
904
904
+
"on-exit-leak-free@2.1.2": {
905
905
+
"integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="
906
906
+
},
907
907
+
"path-browserify@1.0.1": {
908
908
+
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
909
909
+
},
910
910
+
"picomatch@4.0.3": {
911
911
+
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="
912
912
+
},
913
913
+
"pino-abstract-transport@1.2.0": {
914
914
+
"integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==",
915
915
+
"dependencies": [
916
916
+
"readable-stream",
917
917
+
"split2"
918
918
+
]
919
919
+
},
920
920
+
"pino-std-serializers@6.2.2": {
921
921
+
"integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA=="
922
922
+
},
923
923
+
"pino@8.21.0": {
924
924
+
"integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==",
925
925
+
"dependencies": [
926
926
+
"atomic-sleep",
927
927
+
"fast-redact",
928
928
+
"on-exit-leak-free",
929
929
+
"pino-abstract-transport",
930
930
+
"pino-std-serializers",
931
931
+
"process-warning",
932
932
+
"quick-format-unescaped",
933
933
+
"real-require",
934
934
+
"safe-stable-stringify",
935
935
+
"sonic-boom",
936
936
+
"thread-stream"
937
937
+
],
938
938
+
"bin": true
939
939
+
},
940
940
+
"prettier@3.7.4": {
941
941
+
"integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
942
942
+
"bin": true
943
943
+
},
944
944
+
"process-warning@3.0.0": {
945
945
+
"integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="
946
946
+
},
947
947
+
"process@0.11.10": {
948
948
+
"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
949
949
+
},
950
950
+
"promise-limit@2.7.0": {
951
951
+
"integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw=="
952
952
+
},
953
953
+
"quick-format-unescaped@4.0.4": {
954
954
+
"integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="
955
955
+
},
956
956
+
"ramda@0.32.0": {
957
957
+
"integrity": "sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ=="
958
958
+
},
959
959
+
"readable-stream@4.7.0": {
960
960
+
"integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
961
961
+
"dependencies": [
962
962
+
"abort-controller",
963
963
+
"buffer",
964
964
+
"events",
965
965
+
"process",
966
966
+
"string_decoder"
967
967
+
]
968
968
+
},
969
969
+
"real-require@0.2.0": {
970
970
+
"integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="
971
971
+
},
972
972
+
"require-directory@2.1.1": {
973
973
+
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
974
974
+
},
975
975
+
"resolve-pkg-maps@1.0.0": {
976
976
+
"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="
977
977
+
},
978
978
+
"safe-buffer@5.2.1": {
979
979
+
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
980
980
+
},
981
981
+
"safe-stable-stringify@2.5.0": {
982
982
+
"integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="
983
983
+
},
984
984
+
"sonic-boom@3.8.1": {
985
985
+
"integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==",
986
986
+
"dependencies": [
987
987
+
"atomic-sleep"
988
988
+
]
989
989
+
},
990
990
+
"source-map-support@0.5.21": {
991
991
+
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
992
992
+
"dependencies": [
993
993
+
"buffer-from",
994
994
+
"source-map"
995
995
+
]
996
996
+
},
997
997
+
"source-map@0.6.1": {
998
998
+
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
999
999
+
},
1000
1000
+
"split2@4.2.0": {
1001
1001
+
"integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="
1002
1002
+
},
1003
1003
+
"string-width@4.2.3": {
1004
1004
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1005
1005
+
"dependencies": [
1006
1006
+
"emoji-regex",
1007
1007
+
"is-fullwidth-code-point",
1008
1008
+
"strip-ansi"
1009
1009
+
]
1010
1010
+
},
1011
1011
+
"string_decoder@1.3.0": {
1012
1012
+
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1013
1013
+
"dependencies": [
1014
1014
+
"safe-buffer"
1015
1015
+
]
1016
1016
+
},
1017
1017
+
"strip-ansi@6.0.1": {
1018
1018
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1019
1019
+
"dependencies": [
1020
1020
+
"ansi-regex"
1021
1021
+
]
1022
1022
+
},
1023
1023
+
"thread-stream@2.7.0": {
1024
1024
+
"integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==",
1025
1025
+
"dependencies": [
1026
1026
+
"real-require"
1027
1027
+
]
1028
1028
+
},
1029
1029
+
"tinyglobby@0.2.15_picomatch@4.0.3": {
1030
1030
+
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
1031
1031
+
"dependencies": [
1032
1032
+
"fdir",
1033
1033
+
"picomatch"
1034
1034
+
]
1035
1035
+
},
1036
1036
+
"tr46@0.0.3": {
1037
1037
+
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
1038
1038
+
},
1039
1039
+
"ts-morph@27.0.2": {
1040
1040
+
"integrity": "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==",
1041
1041
+
"dependencies": [
1042
1042
+
"@ts-morph/common",
1043
1043
+
"code-block-writer"
1044
1044
+
]
1045
1045
+
},
1046
1046
+
"tslib@2.8.1": {
1047
1047
+
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
1048
1048
+
},
1049
1049
+
"uint8arrays@3.0.0": {
1050
1050
+
"integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==",
1051
1051
+
"dependencies": [
1052
1052
+
"multiformats"
1053
1053
+
]
1054
1054
+
},
1055
1055
+
"undici-types@7.16.0": {
1056
1056
+
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="
1057
1057
+
},
1058
1058
+
"unicode-segmenter@0.14.5": {
1059
1059
+
"integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g=="
1060
1060
+
},
1061
1061
+
"varint@6.0.0": {
1062
1062
+
"integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
1063
1063
+
},
1064
1064
+
"web-streams-polyfill@3.3.3": {
1065
1065
+
"integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="
1066
1066
+
},
1067
1067
+
"webidl-conversions@3.0.1": {
1068
1068
+
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
1069
1069
+
},
1070
1070
+
"whatwg-url@5.0.0": {
1071
1071
+
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1072
1072
+
"dependencies": [
1073
1073
+
"tr46",
1074
1074
+
"webidl-conversions"
1075
1075
+
]
1076
1076
+
},
1077
1077
+
"wrap-ansi@7.0.0": {
1078
1078
+
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1079
1079
+
"dependencies": [
1080
1080
+
"ansi-styles",
1081
1081
+
"string-width",
1082
1082
+
"strip-ansi"
1083
1083
+
]
1084
1084
+
},
1085
1085
+
"ws@8.19.0": {
1086
1086
+
"integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="
1087
1087
+
},
1088
1088
+
"y18n@5.0.8": {
1089
1089
+
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
1090
1090
+
},
1091
1091
+
"yargs-parser@21.1.1": {
1092
1092
+
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="
1093
1093
+
},
1094
1094
+
"yargs@17.7.2": {
1095
1095
+
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
1096
1096
+
"dependencies": [
1097
1097
+
"cliui",
1098
1098
+
"escalade",
1099
1099
+
"get-caller-file",
1100
1100
+
"require-directory",
1101
1101
+
"string-width",
1102
1102
+
"y18n",
1103
1103
+
"yargs-parser"
1104
1104
+
]
1105
1105
+
},
1106
1106
+
"zod@3.25.76": {
1107
1107
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="
1108
1108
+
}
1109
1109
+
},
1110
1110
+
"workspace": {
1111
1111
+
"dependencies": [
1112
1112
+
"jsr:@es-toolkit/es-toolkit@^1.44.0",
1113
1113
+
"jsr:@std/assert@1",
1114
1114
+
"npm:@atproto/tap@~0.1.3",
1115
1115
+
"npm:@libsql/client@0.17",
1116
1116
+
"npm:@logtape/logtape@2",
1117
1117
+
"npm:chalk@^5.6.2",
1118
1118
+
"npm:drizzle-kit@~0.31.8",
1119
1119
+
"npm:drizzle-orm@~0.45.1",
1120
1120
+
"npm:ramda@0.32"
1121
1121
+
]
1122
1122
+
}
1123
1123
+
}
+9
tap/drizzle.config.ts
···
1
1
+
import { defineConfig } from "drizzle-kit";
2
2
+
3
3
+
export default defineConfig({
4
4
+
dialect: "sqlite",
5
5
+
schema: "./src/schema",
6
6
+
dbCredentials: {
7
7
+
url: Deno.env.get("TAP_CACHE_DATABASE_URL") || "tap-cache.db",
8
8
+
},
9
9
+
});
+21
tap/drizzle/0000_spotty_sphinx.sql
···
1
1
+
CREATE TABLE `events` (
2
2
+
`id` integer PRIMARY KEY NOT NULL,
3
3
+
`type` text NOT NULL,
4
4
+
`did` text NOT NULL,
5
5
+
`status` text,
6
6
+
`handle` text,
7
7
+
`is_active` integer,
8
8
+
`collection` text,
9
9
+
`rev` text,
10
10
+
`rkey` text,
11
11
+
`record` text,
12
12
+
`live` integer,
13
13
+
`cid` text,
14
14
+
`created_at` integer DEFAULT (unixepoch()) NOT NULL
15
15
+
);
16
16
+
--> statement-breakpoint
17
17
+
CREATE UNIQUE INDEX `events_cid_unique` ON `events` (`cid`);--> statement-breakpoint
18
18
+
CREATE INDEX `did_idx` ON `events` (`did`);--> statement-breakpoint
19
19
+
CREATE INDEX `type_idx` ON `events` (`type`);--> statement-breakpoint
20
20
+
CREATE INDEX `collection_idx` ON `events` (`collection`);--> statement-breakpoint
21
21
+
CREATE INDEX `did_collection_rkey_idx` ON `events` (`did`,`collection`,`rkey`);
+1
tap/drizzle/0001_funny_wrecker.sql
···
1
1
+
ALTER TABLE `events` ADD `action` text;
+158
tap/drizzle/meta/0000_snapshot.json
···
1
1
+
{
2
2
+
"version": "6",
3
3
+
"dialect": "sqlite",
4
4
+
"id": "2eb6ec4a-e6e2-416f-9657-7072f2db7558",
5
5
+
"prevId": "00000000-0000-0000-0000-000000000000",
6
6
+
"tables": {
7
7
+
"events": {
8
8
+
"name": "events",
9
9
+
"columns": {
10
10
+
"id": {
11
11
+
"name": "id",
12
12
+
"type": "integer",
13
13
+
"primaryKey": true,
14
14
+
"notNull": true,
15
15
+
"autoincrement": false
16
16
+
},
17
17
+
"type": {
18
18
+
"name": "type",
19
19
+
"type": "text",
20
20
+
"primaryKey": false,
21
21
+
"notNull": true,
22
22
+
"autoincrement": false
23
23
+
},
24
24
+
"did": {
25
25
+
"name": "did",
26
26
+
"type": "text",
27
27
+
"primaryKey": false,
28
28
+
"notNull": true,
29
29
+
"autoincrement": false
30
30
+
},
31
31
+
"status": {
32
32
+
"name": "status",
33
33
+
"type": "text",
34
34
+
"primaryKey": false,
35
35
+
"notNull": false,
36
36
+
"autoincrement": false
37
37
+
},
38
38
+
"handle": {
39
39
+
"name": "handle",
40
40
+
"type": "text",
41
41
+
"primaryKey": false,
42
42
+
"notNull": false,
43
43
+
"autoincrement": false
44
44
+
},
45
45
+
"is_active": {
46
46
+
"name": "is_active",
47
47
+
"type": "integer",
48
48
+
"primaryKey": false,
49
49
+
"notNull": false,
50
50
+
"autoincrement": false
51
51
+
},
52
52
+
"collection": {
53
53
+
"name": "collection",
54
54
+
"type": "text",
55
55
+
"primaryKey": false,
56
56
+
"notNull": false,
57
57
+
"autoincrement": false
58
58
+
},
59
59
+
"rev": {
60
60
+
"name": "rev",
61
61
+
"type": "text",
62
62
+
"primaryKey": false,
63
63
+
"notNull": false,
64
64
+
"autoincrement": false
65
65
+
},
66
66
+
"rkey": {
67
67
+
"name": "rkey",
68
68
+
"type": "text",
69
69
+
"primaryKey": false,
70
70
+
"notNull": false,
71
71
+
"autoincrement": false
72
72
+
},
73
73
+
"record": {
74
74
+
"name": "record",
75
75
+
"type": "text",
76
76
+
"primaryKey": false,
77
77
+
"notNull": false,
78
78
+
"autoincrement": false
79
79
+
},
80
80
+
"live": {
81
81
+
"name": "live",
82
82
+
"type": "integer",
83
83
+
"primaryKey": false,
84
84
+
"notNull": false,
85
85
+
"autoincrement": false
86
86
+
},
87
87
+
"cid": {
88
88
+
"name": "cid",
89
89
+
"type": "text",
90
90
+
"primaryKey": false,
91
91
+
"notNull": false,
92
92
+
"autoincrement": false
93
93
+
},
94
94
+
"created_at": {
95
95
+
"name": "created_at",
96
96
+
"type": "integer",
97
97
+
"primaryKey": false,
98
98
+
"notNull": true,
99
99
+
"autoincrement": false,
100
100
+
"default": "(unixepoch())"
101
101
+
}
102
102
+
},
103
103
+
"indexes": {
104
104
+
"events_cid_unique": {
105
105
+
"name": "events_cid_unique",
106
106
+
"columns": [
107
107
+
"cid"
108
108
+
],
109
109
+
"isUnique": true
110
110
+
},
111
111
+
"did_idx": {
112
112
+
"name": "did_idx",
113
113
+
"columns": [
114
114
+
"did"
115
115
+
],
116
116
+
"isUnique": false
117
117
+
},
118
118
+
"type_idx": {
119
119
+
"name": "type_idx",
120
120
+
"columns": [
121
121
+
"type"
122
122
+
],
123
123
+
"isUnique": false
124
124
+
},
125
125
+
"collection_idx": {
126
126
+
"name": "collection_idx",
127
127
+
"columns": [
128
128
+
"collection"
129
129
+
],
130
130
+
"isUnique": false
131
131
+
},
132
132
+
"did_collection_rkey_idx": {
133
133
+
"name": "did_collection_rkey_idx",
134
134
+
"columns": [
135
135
+
"did",
136
136
+
"collection",
137
137
+
"rkey"
138
138
+
],
139
139
+
"isUnique": false
140
140
+
}
141
141
+
},
142
142
+
"foreignKeys": {},
143
143
+
"compositePrimaryKeys": {},
144
144
+
"uniqueConstraints": {},
145
145
+
"checkConstraints": {}
146
146
+
}
147
147
+
},
148
148
+
"views": {},
149
149
+
"enums": {},
150
150
+
"_meta": {
151
151
+
"schemas": {},
152
152
+
"tables": {},
153
153
+
"columns": {}
154
154
+
},
155
155
+
"internal": {
156
156
+
"indexes": {}
157
157
+
}
158
158
+
}
+165
tap/drizzle/meta/0001_snapshot.json
···
1
1
+
{
2
2
+
"version": "6",
3
3
+
"dialect": "sqlite",
4
4
+
"id": "e965a6b3-42e8-41a5-8919-11fb478cfa1a",
5
5
+
"prevId": "2eb6ec4a-e6e2-416f-9657-7072f2db7558",
6
6
+
"tables": {
7
7
+
"events": {
8
8
+
"name": "events",
9
9
+
"columns": {
10
10
+
"id": {
11
11
+
"name": "id",
12
12
+
"type": "integer",
13
13
+
"primaryKey": true,
14
14
+
"notNull": true,
15
15
+
"autoincrement": false
16
16
+
},
17
17
+
"type": {
18
18
+
"name": "type",
19
19
+
"type": "text",
20
20
+
"primaryKey": false,
21
21
+
"notNull": true,
22
22
+
"autoincrement": false
23
23
+
},
24
24
+
"action": {
25
25
+
"name": "action",
26
26
+
"type": "text",
27
27
+
"primaryKey": false,
28
28
+
"notNull": false,
29
29
+
"autoincrement": false
30
30
+
},
31
31
+
"did": {
32
32
+
"name": "did",
33
33
+
"type": "text",
34
34
+
"primaryKey": false,
35
35
+
"notNull": true,
36
36
+
"autoincrement": false
37
37
+
},
38
38
+
"status": {
39
39
+
"name": "status",
40
40
+
"type": "text",
41
41
+
"primaryKey": false,
42
42
+
"notNull": false,
43
43
+
"autoincrement": false
44
44
+
},
45
45
+
"handle": {
46
46
+
"name": "handle",
47
47
+
"type": "text",
48
48
+
"primaryKey": false,
49
49
+
"notNull": false,
50
50
+
"autoincrement": false
51
51
+
},
52
52
+
"is_active": {
53
53
+
"name": "is_active",
54
54
+
"type": "integer",
55
55
+
"primaryKey": false,
56
56
+
"notNull": false,
57
57
+
"autoincrement": false
58
58
+
},
59
59
+
"collection": {
60
60
+
"name": "collection",
61
61
+
"type": "text",
62
62
+
"primaryKey": false,
63
63
+
"notNull": false,
64
64
+
"autoincrement": false
65
65
+
},
66
66
+
"rev": {
67
67
+
"name": "rev",
68
68
+
"type": "text",
69
69
+
"primaryKey": false,
70
70
+
"notNull": false,
71
71
+
"autoincrement": false
72
72
+
},
73
73
+
"rkey": {
74
74
+
"name": "rkey",
75
75
+
"type": "text",
76
76
+
"primaryKey": false,
77
77
+
"notNull": false,
78
78
+
"autoincrement": false
79
79
+
},
80
80
+
"record": {
81
81
+
"name": "record",
82
82
+
"type": "text",
83
83
+
"primaryKey": false,
84
84
+
"notNull": false,
85
85
+
"autoincrement": false
86
86
+
},
87
87
+
"live": {
88
88
+
"name": "live",
89
89
+
"type": "integer",
90
90
+
"primaryKey": false,
91
91
+
"notNull": false,
92
92
+
"autoincrement": false
93
93
+
},
94
94
+
"cid": {
95
95
+
"name": "cid",
96
96
+
"type": "text",
97
97
+
"primaryKey": false,
98
98
+
"notNull": false,
99
99
+
"autoincrement": false
100
100
+
},
101
101
+
"created_at": {
102
102
+
"name": "created_at",
103
103
+
"type": "integer",
104
104
+
"primaryKey": false,
105
105
+
"notNull": true,
106
106
+
"autoincrement": false,
107
107
+
"default": "(unixepoch())"
108
108
+
}
109
109
+
},
110
110
+
"indexes": {
111
111
+
"events_cid_unique": {
112
112
+
"name": "events_cid_unique",
113
113
+
"columns": [
114
114
+
"cid"
115
115
+
],
116
116
+
"isUnique": true
117
117
+
},
118
118
+
"did_idx": {
119
119
+
"name": "did_idx",
120
120
+
"columns": [
121
121
+
"did"
122
122
+
],
123
123
+
"isUnique": false
124
124
+
},
125
125
+
"type_idx": {
126
126
+
"name": "type_idx",
127
127
+
"columns": [
128
128
+
"type"
129
129
+
],
130
130
+
"isUnique": false
131
131
+
},
132
132
+
"collection_idx": {
133
133
+
"name": "collection_idx",
134
134
+
"columns": [
135
135
+
"collection"
136
136
+
],
137
137
+
"isUnique": false
138
138
+
},
139
139
+
"did_collection_rkey_idx": {
140
140
+
"name": "did_collection_rkey_idx",
141
141
+
"columns": [
142
142
+
"did",
143
143
+
"collection",
144
144
+
"rkey"
145
145
+
],
146
146
+
"isUnique": false
147
147
+
}
148
148
+
},
149
149
+
"foreignKeys": {},
150
150
+
"compositePrimaryKeys": {},
151
151
+
"uniqueConstraints": {},
152
152
+
"checkConstraints": {}
153
153
+
}
154
154
+
},
155
155
+
"views": {},
156
156
+
"enums": {},
157
157
+
"_meta": {
158
158
+
"schemas": {},
159
159
+
"tables": {},
160
160
+
"columns": {}
161
161
+
},
162
162
+
"internal": {
163
163
+
"indexes": {}
164
164
+
}
165
165
+
}
+20
tap/drizzle/meta/_journal.json
···
1
1
+
{
2
2
+
"version": "7",
3
3
+
"dialect": "sqlite",
4
4
+
"entries": [
5
5
+
{
6
6
+
"idx": 0,
7
7
+
"version": "6",
8
8
+
"when": 1768620339760,
9
9
+
"tag": "0000_spotty_sphinx",
10
10
+
"breakpoints": true
11
11
+
},
12
12
+
{
13
13
+
"idx": 1,
14
14
+
"version": "6",
15
15
+
"when": 1768622485450,
16
16
+
"tag": "0001_funny_wrecker",
17
17
+
"breakpoints": true
18
18
+
}
19
19
+
]
20
20
+
}
+7
tap/src/context.ts
···
1
1
+
import drizzle from "./drizzle.ts";
2
2
+
3
3
+
export const ctx = {
4
4
+
db: drizzle.db,
5
5
+
};
6
6
+
7
7
+
export type Context = typeof ctx;
+9
tap/src/drizzle.ts
···
1
1
+
import { drizzle } from "drizzle-orm/libsql";
2
2
+
3
3
+
const db = drizzle({
4
4
+
connection: {
5
5
+
url: Deno.env.get("TAP_CACHE_DATABASE_URL") || "file:tap-cache.db",
6
6
+
},
7
7
+
});
8
8
+
9
9
+
export default { db };
+17
tap/src/logger.ts
···
1
1
+
import { configure, getConsoleSink, getLogger } from "@logtape/logtape";
2
2
+
3
3
+
await configure({
4
4
+
sinks: { console: getConsoleSink() },
5
5
+
loggers: [
6
6
+
{
7
7
+
category: ["logtape", "meta"],
8
8
+
lowestLevel: "warning",
9
9
+
sinks: ["console"],
10
10
+
},
11
11
+
{ category: "tap", lowestLevel: "debug", sinks: ["console"] },
12
12
+
],
13
13
+
});
14
14
+
15
15
+
const logger = getLogger("tap");
16
16
+
17
17
+
export default logger;
+132
tap/src/main.ts
···
1
1
+
import { ctx } from "./context.ts";
2
2
+
import logger from "./logger.ts";
3
3
+
import connectToTap from "./tap.ts";
4
4
+
import schema from "./schema/mod.ts";
5
5
+
import { asc } from "drizzle-orm";
6
6
+
import { omit } from "@es-toolkit/es-toolkit/compat";
7
7
+
import type { SelectEvent } from "./schema/event.ts";
8
8
+
9
9
+
const PAGE_SIZE = 500;
10
10
+
11
11
+
interface ClientState {
12
12
+
socket: WebSocket;
13
13
+
isPaginating: boolean;
14
14
+
queue: SelectEvent[];
15
15
+
}
16
16
+
17
17
+
const connectedClients = new Map<WebSocket, ClientState>();
18
18
+
19
19
+
export function broadcastEvent(evt: SelectEvent) {
20
20
+
const message = JSON.stringify({
21
21
+
...omit(evt, "createdAt", "record"),
22
22
+
...(evt.record && {
23
23
+
record: JSON.parse(evt.record),
24
24
+
}),
25
25
+
});
26
26
+
27
27
+
for (const [socket, state] of connectedClients.entries()) {
28
28
+
if (socket.readyState === WebSocket.OPEN) {
29
29
+
if (state.isPaginating) {
30
30
+
state.queue.push(evt);
31
31
+
} else {
32
32
+
socket.send(message);
33
33
+
}
34
34
+
}
35
35
+
}
36
36
+
}
37
37
+
38
38
+
connectToTap();
39
39
+
40
40
+
Deno.serve({ port: parseInt(Deno.env.get("WS_PORT") || "2481") }, (req) => {
41
41
+
if (req.headers.get("upgrade") != "websocket") {
42
42
+
return new Response(null, { status: 426 });
43
43
+
}
44
44
+
45
45
+
const { socket, response } = Deno.upgradeWebSocket(req);
46
46
+
47
47
+
socket.addEventListener("open", async () => {
48
48
+
logger.info`✅ Connected to Tap!`;
49
49
+
50
50
+
connectedClients.set(socket, {
51
51
+
socket,
52
52
+
isPaginating: true,
53
53
+
queue: [],
54
54
+
});
55
55
+
56
56
+
let page = 0;
57
57
+
let hasMore = true;
58
58
+
59
59
+
while (hasMore) {
60
60
+
const events = await ctx.db
61
61
+
.select()
62
62
+
.from(schema.events)
63
63
+
.orderBy(asc(schema.events.createdAt))
64
64
+
.offset(page * PAGE_SIZE)
65
65
+
.limit(PAGE_SIZE)
66
66
+
.execute();
67
67
+
68
68
+
for (const evt of events) {
69
69
+
socket.send(
70
70
+
JSON.stringify({
71
71
+
...omit(evt, "createdAt", "record"),
72
72
+
...(evt.record && {
73
73
+
record: JSON.parse(evt.record),
74
74
+
}),
75
75
+
}),
76
76
+
);
77
77
+
}
78
78
+
79
79
+
hasMore = events.length === PAGE_SIZE;
80
80
+
page++;
81
81
+
}
82
82
+
83
83
+
logger.info`📤 Sent all historical events (${page} pages)`;
84
84
+
85
85
+
const clientState = connectedClients.get(socket);
86
86
+
if (clientState) {
87
87
+
const queuedCount = clientState.queue.length;
88
88
+
89
89
+
if (queuedCount > 0) {
90
90
+
logger.info`📦 Sending ${queuedCount} queued events...`;
91
91
+
92
92
+
for (const evt of clientState.queue) {
93
93
+
socket.send(
94
94
+
JSON.stringify({
95
95
+
...omit(evt, "createdAt", "record"),
96
96
+
...(evt.record && {
97
97
+
record: JSON.parse(evt.record),
98
98
+
}),
99
99
+
}),
100
100
+
);
101
101
+
}
102
102
+
103
103
+
clientState.queue = [];
104
104
+
}
105
105
+
106
106
+
clientState.isPaginating = false;
107
107
+
}
108
108
+
109
109
+
logger.info`🔄 Now streaming real-time events...`;
110
110
+
});
111
111
+
112
112
+
socket.addEventListener("message", (event) => {
113
113
+
if (event.data === "ping") {
114
114
+
socket.send("pong");
115
115
+
}
116
116
+
});
117
117
+
118
118
+
socket.addEventListener("close", () => {
119
119
+
connectedClients.delete(socket);
120
120
+
logger.info`❌ Client disconnected. Active clients: ${connectedClients.size}`;
121
121
+
});
122
122
+
123
123
+
socket.addEventListener("error", (error) => {
124
124
+
logger.error`WebSocket error: ${error}`;
125
125
+
connectedClients.delete(socket);
126
126
+
});
127
127
+
128
128
+
return response;
129
129
+
});
130
130
+
131
131
+
const url = `ws://localhost:${Deno.env.get("WS_PORT") || 2481}`;
132
132
+
logger.info`🚀 Tap WebSocket server is running! ${url}`;
+37
tap/src/schema/event.ts
···
1
1
+
import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm";
2
2
+
import { sqliteTable, text, integer, index } from "drizzle-orm/sqlite-core";
3
3
+
4
4
+
const events = sqliteTable(
5
5
+
"events",
6
6
+
{
7
7
+
id: integer("id").primaryKey(),
8
8
+
type: text("type").notNull(),
9
9
+
action: text("action"),
10
10
+
did: text("did").notNull(),
11
11
+
// identity
12
12
+
status: text("status"),
13
13
+
handle: text("handle"),
14
14
+
isActive: integer("is_active", { mode: "boolean" }),
15
15
+
// record
16
16
+
collection: text("collection"),
17
17
+
rev: text("rev"),
18
18
+
rkey: text("rkey"),
19
19
+
record: text("record"),
20
20
+
live: integer("live", { mode: "boolean" }),
21
21
+
cid: text("cid").unique(),
22
22
+
createdAt: integer("created_at", { mode: "timestamp" })
23
23
+
.notNull()
24
24
+
.default(sql`(unixepoch())`),
25
25
+
},
26
26
+
(t) => [
27
27
+
index("did_idx").on(t.did),
28
28
+
index("type_idx").on(t.type),
29
29
+
index("collection_idx").on(t.collection),
30
30
+
index("did_collection_rkey_idx").on(t.did, t.collection, t.rkey),
31
31
+
],
32
32
+
);
33
33
+
34
34
+
export type SelectEvent = InferSelectModel<typeof events>;
35
35
+
export type InsertEvent = InferInsertModel<typeof events>;
36
36
+
37
37
+
export default events;
+5
tap/src/schema/mod.ts
···
1
1
+
import events from "./event.ts";
2
2
+
3
3
+
export default {
4
4
+
events,
5
5
+
};
+69
tap/src/tap.ts
···
1
1
+
import { Tap, SimpleIndexer } from "@atproto/tap";
2
2
+
import logger from "./logger.ts";
3
3
+
import { ctx } from "./context.ts";
4
4
+
import schema from "./schema/mod.ts";
5
5
+
import _ from "@es-toolkit/es-toolkit/compat";
6
6
+
import { broadcastEvent } from "./main.ts";
7
7
+
8
8
+
export const TAP_WS_URL = Deno.env.get("TAP_URL") || "http://localhost:2480";
9
9
+
10
10
+
export default function connectToTap() {
11
11
+
const tap = new Tap(TAP_WS_URL);
12
12
+
13
13
+
const indexer = new SimpleIndexer();
14
14
+
15
15
+
indexer.identity(async (evt) => {
16
16
+
const result = await ctx.db
17
17
+
.insert(schema.events)
18
18
+
.values({
19
19
+
id: evt.id,
20
20
+
type: evt.type,
21
21
+
did: evt.did,
22
22
+
handle: evt.handle,
23
23
+
status: evt.status,
24
24
+
isActive: evt.isActive,
25
25
+
})
26
26
+
.onConflictDoNothing()
27
27
+
.returning()
28
28
+
.execute();
29
29
+
30
30
+
if (result.length > 0) {
31
31
+
broadcastEvent(result[0]);
32
32
+
}
33
33
+
34
34
+
logger.info`${evt.did} updated identity: ${evt.handle} (${evt.status})`;
35
35
+
});
36
36
+
37
37
+
indexer.record(async (evt) => {
38
38
+
logger.info`${evt}`;
39
39
+
const result = await ctx.db
40
40
+
.insert(schema.events)
41
41
+
.values({
42
42
+
id: evt.id,
43
43
+
type: evt.type,
44
44
+
action: evt.action,
45
45
+
did: evt.did,
46
46
+
rev: evt.rev,
47
47
+
collection: evt.collection,
48
48
+
rkey: evt.rkey,
49
49
+
record: JSON.stringify(evt.record),
50
50
+
cid: evt.cid,
51
51
+
live: evt.live,
52
52
+
})
53
53
+
.onConflictDoNothing()
54
54
+
.returning()
55
55
+
.execute();
56
56
+
57
57
+
if (result.length > 0) {
58
58
+
broadcastEvent(result[0]);
59
59
+
}
60
60
+
61
61
+
const uri = `at://${_.get(result, "[0].did")}/${_.get(result, "[0].collection")}/${_.get(result, "[0].rkey")}`;
62
62
+
logger.info`New record inserted: ${result.length} ${uri}`;
63
63
+
});
64
64
+
65
65
+
indexer.error((err) => logger.error`${err}`);
66
66
+
67
67
+
const channel = tap.channel(indexer);
68
68
+
channel.start();
69
69
+
}