+3
.env.example
+3
.env.example
+8
.gitignore
+8
.gitignore
+7
CLAUDE.md
+7
CLAUDE.md
+663
package-lock.json
+663
package-lock.json
···
1
+
{
2
+
"name": "blonk",
3
+
"version": "1.0.0",
4
+
"lockfileVersion": 3,
5
+
"requires": true,
6
+
"packages": {
7
+
"": {
8
+
"name": "blonk",
9
+
"version": "1.0.0",
10
+
"license": "ISC",
11
+
"dependencies": {
12
+
"@atproto/api": "^0.15.16",
13
+
"@atproto/lexicon": "^0.4.11",
14
+
"@types/node": "^24.0.3",
15
+
"dotenv": "^16.5.0",
16
+
"tsx": "^4.20.3",
17
+
"typescript": "^5.8.3"
18
+
}
19
+
},
20
+
"node_modules/@atproto/api": {
21
+
"version": "0.15.16",
22
+
"resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.15.16.tgz",
23
+
"integrity": "sha512-ZNBrzBg2l0lHreKik1lJn8lrhAktwlY8NUPBU/hO9dwjAnDHQTiSzNFZt65dp9djmqZ75sX/VJ+heNuaJBvnhQ==",
24
+
"license": "MIT",
25
+
"dependencies": {
26
+
"@atproto/common-web": "^0.4.2",
27
+
"@atproto/lexicon": "^0.4.11",
28
+
"@atproto/syntax": "^0.4.0",
29
+
"@atproto/xrpc": "^0.7.0",
30
+
"await-lock": "^2.2.2",
31
+
"multiformats": "^9.9.0",
32
+
"tlds": "^1.234.0",
33
+
"zod": "^3.23.8"
34
+
}
35
+
},
36
+
"node_modules/@atproto/common-web": {
37
+
"version": "0.4.2",
38
+
"resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.2.tgz",
39
+
"integrity": "sha512-vrXwGNoFGogodjQvJDxAeP3QbGtawgZute2ed1XdRO0wMixLk3qewtikZm06H259QDJVu6voKC5mubml+WgQUw==",
40
+
"license": "MIT",
41
+
"dependencies": {
42
+
"graphemer": "^1.4.0",
43
+
"multiformats": "^9.9.0",
44
+
"uint8arrays": "3.0.0",
45
+
"zod": "^3.23.8"
46
+
}
47
+
},
48
+
"node_modules/@atproto/lexicon": {
49
+
"version": "0.4.11",
50
+
"resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.11.tgz",
51
+
"integrity": "sha512-btefdnvNz2Ao2I+qbmj0F06HC8IlrM/IBz6qOBS50r0S6uDf5tOO+Mv2tSVdimFkdzyDdLtBI1sV36ONxz2cOw==",
52
+
"license": "MIT",
53
+
"dependencies": {
54
+
"@atproto/common-web": "^0.4.2",
55
+
"@atproto/syntax": "^0.4.0",
56
+
"iso-datestring-validator": "^2.2.2",
57
+
"multiformats": "^9.9.0",
58
+
"zod": "^3.23.8"
59
+
}
60
+
},
61
+
"node_modules/@atproto/syntax": {
62
+
"version": "0.4.0",
63
+
"resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.0.tgz",
64
+
"integrity": "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA==",
65
+
"license": "MIT"
66
+
},
67
+
"node_modules/@atproto/xrpc": {
68
+
"version": "0.7.0",
69
+
"resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.0.tgz",
70
+
"integrity": "sha512-SfhP9dGx2qclaScFDb58Jnrmim5nk4geZXCqg6sB0I/KZhZEkr9iIx1hLCp+sxkIfEsmEJjeWO4B0rjUIJW5cw==",
71
+
"license": "MIT",
72
+
"dependencies": {
73
+
"@atproto/lexicon": "^0.4.11",
74
+
"zod": "^3.23.8"
75
+
}
76
+
},
77
+
"node_modules/@esbuild/aix-ppc64": {
78
+
"version": "0.25.5",
79
+
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
80
+
"integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
81
+
"cpu": [
82
+
"ppc64"
83
+
],
84
+
"license": "MIT",
85
+
"optional": true,
86
+
"os": [
87
+
"aix"
88
+
],
89
+
"engines": {
90
+
"node": ">=18"
91
+
}
92
+
},
93
+
"node_modules/@esbuild/android-arm": {
94
+
"version": "0.25.5",
95
+
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
96
+
"integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
97
+
"cpu": [
98
+
"arm"
99
+
],
100
+
"license": "MIT",
101
+
"optional": true,
102
+
"os": [
103
+
"android"
104
+
],
105
+
"engines": {
106
+
"node": ">=18"
107
+
}
108
+
},
109
+
"node_modules/@esbuild/android-arm64": {
110
+
"version": "0.25.5",
111
+
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
112
+
"integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
113
+
"cpu": [
114
+
"arm64"
115
+
],
116
+
"license": "MIT",
117
+
"optional": true,
118
+
"os": [
119
+
"android"
120
+
],
121
+
"engines": {
122
+
"node": ">=18"
123
+
}
124
+
},
125
+
"node_modules/@esbuild/android-x64": {
126
+
"version": "0.25.5",
127
+
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
128
+
"integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
129
+
"cpu": [
130
+
"x64"
131
+
],
132
+
"license": "MIT",
133
+
"optional": true,
134
+
"os": [
135
+
"android"
136
+
],
137
+
"engines": {
138
+
"node": ">=18"
139
+
}
140
+
},
141
+
"node_modules/@esbuild/darwin-arm64": {
142
+
"version": "0.25.5",
143
+
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
144
+
"integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
145
+
"cpu": [
146
+
"arm64"
147
+
],
148
+
"license": "MIT",
149
+
"optional": true,
150
+
"os": [
151
+
"darwin"
152
+
],
153
+
"engines": {
154
+
"node": ">=18"
155
+
}
156
+
},
157
+
"node_modules/@esbuild/darwin-x64": {
158
+
"version": "0.25.5",
159
+
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
160
+
"integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
161
+
"cpu": [
162
+
"x64"
163
+
],
164
+
"license": "MIT",
165
+
"optional": true,
166
+
"os": [
167
+
"darwin"
168
+
],
169
+
"engines": {
170
+
"node": ">=18"
171
+
}
172
+
},
173
+
"node_modules/@esbuild/freebsd-arm64": {
174
+
"version": "0.25.5",
175
+
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
176
+
"integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
177
+
"cpu": [
178
+
"arm64"
179
+
],
180
+
"license": "MIT",
181
+
"optional": true,
182
+
"os": [
183
+
"freebsd"
184
+
],
185
+
"engines": {
186
+
"node": ">=18"
187
+
}
188
+
},
189
+
"node_modules/@esbuild/freebsd-x64": {
190
+
"version": "0.25.5",
191
+
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
192
+
"integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
193
+
"cpu": [
194
+
"x64"
195
+
],
196
+
"license": "MIT",
197
+
"optional": true,
198
+
"os": [
199
+
"freebsd"
200
+
],
201
+
"engines": {
202
+
"node": ">=18"
203
+
}
204
+
},
205
+
"node_modules/@esbuild/linux-arm": {
206
+
"version": "0.25.5",
207
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
208
+
"integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
209
+
"cpu": [
210
+
"arm"
211
+
],
212
+
"license": "MIT",
213
+
"optional": true,
214
+
"os": [
215
+
"linux"
216
+
],
217
+
"engines": {
218
+
"node": ">=18"
219
+
}
220
+
},
221
+
"node_modules/@esbuild/linux-arm64": {
222
+
"version": "0.25.5",
223
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
224
+
"integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
225
+
"cpu": [
226
+
"arm64"
227
+
],
228
+
"license": "MIT",
229
+
"optional": true,
230
+
"os": [
231
+
"linux"
232
+
],
233
+
"engines": {
234
+
"node": ">=18"
235
+
}
236
+
},
237
+
"node_modules/@esbuild/linux-ia32": {
238
+
"version": "0.25.5",
239
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
240
+
"integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
241
+
"cpu": [
242
+
"ia32"
243
+
],
244
+
"license": "MIT",
245
+
"optional": true,
246
+
"os": [
247
+
"linux"
248
+
],
249
+
"engines": {
250
+
"node": ">=18"
251
+
}
252
+
},
253
+
"node_modules/@esbuild/linux-loong64": {
254
+
"version": "0.25.5",
255
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
256
+
"integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
257
+
"cpu": [
258
+
"loong64"
259
+
],
260
+
"license": "MIT",
261
+
"optional": true,
262
+
"os": [
263
+
"linux"
264
+
],
265
+
"engines": {
266
+
"node": ">=18"
267
+
}
268
+
},
269
+
"node_modules/@esbuild/linux-mips64el": {
270
+
"version": "0.25.5",
271
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
272
+
"integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
273
+
"cpu": [
274
+
"mips64el"
275
+
],
276
+
"license": "MIT",
277
+
"optional": true,
278
+
"os": [
279
+
"linux"
280
+
],
281
+
"engines": {
282
+
"node": ">=18"
283
+
}
284
+
},
285
+
"node_modules/@esbuild/linux-ppc64": {
286
+
"version": "0.25.5",
287
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
288
+
"integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
289
+
"cpu": [
290
+
"ppc64"
291
+
],
292
+
"license": "MIT",
293
+
"optional": true,
294
+
"os": [
295
+
"linux"
296
+
],
297
+
"engines": {
298
+
"node": ">=18"
299
+
}
300
+
},
301
+
"node_modules/@esbuild/linux-riscv64": {
302
+
"version": "0.25.5",
303
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
304
+
"integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
305
+
"cpu": [
306
+
"riscv64"
307
+
],
308
+
"license": "MIT",
309
+
"optional": true,
310
+
"os": [
311
+
"linux"
312
+
],
313
+
"engines": {
314
+
"node": ">=18"
315
+
}
316
+
},
317
+
"node_modules/@esbuild/linux-s390x": {
318
+
"version": "0.25.5",
319
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
320
+
"integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
321
+
"cpu": [
322
+
"s390x"
323
+
],
324
+
"license": "MIT",
325
+
"optional": true,
326
+
"os": [
327
+
"linux"
328
+
],
329
+
"engines": {
330
+
"node": ">=18"
331
+
}
332
+
},
333
+
"node_modules/@esbuild/linux-x64": {
334
+
"version": "0.25.5",
335
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
336
+
"integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
337
+
"cpu": [
338
+
"x64"
339
+
],
340
+
"license": "MIT",
341
+
"optional": true,
342
+
"os": [
343
+
"linux"
344
+
],
345
+
"engines": {
346
+
"node": ">=18"
347
+
}
348
+
},
349
+
"node_modules/@esbuild/netbsd-arm64": {
350
+
"version": "0.25.5",
351
+
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
352
+
"integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
353
+
"cpu": [
354
+
"arm64"
355
+
],
356
+
"license": "MIT",
357
+
"optional": true,
358
+
"os": [
359
+
"netbsd"
360
+
],
361
+
"engines": {
362
+
"node": ">=18"
363
+
}
364
+
},
365
+
"node_modules/@esbuild/netbsd-x64": {
366
+
"version": "0.25.5",
367
+
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
368
+
"integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
369
+
"cpu": [
370
+
"x64"
371
+
],
372
+
"license": "MIT",
373
+
"optional": true,
374
+
"os": [
375
+
"netbsd"
376
+
],
377
+
"engines": {
378
+
"node": ">=18"
379
+
}
380
+
},
381
+
"node_modules/@esbuild/openbsd-arm64": {
382
+
"version": "0.25.5",
383
+
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
384
+
"integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
385
+
"cpu": [
386
+
"arm64"
387
+
],
388
+
"license": "MIT",
389
+
"optional": true,
390
+
"os": [
391
+
"openbsd"
392
+
],
393
+
"engines": {
394
+
"node": ">=18"
395
+
}
396
+
},
397
+
"node_modules/@esbuild/openbsd-x64": {
398
+
"version": "0.25.5",
399
+
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
400
+
"integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
401
+
"cpu": [
402
+
"x64"
403
+
],
404
+
"license": "MIT",
405
+
"optional": true,
406
+
"os": [
407
+
"openbsd"
408
+
],
409
+
"engines": {
410
+
"node": ">=18"
411
+
}
412
+
},
413
+
"node_modules/@esbuild/sunos-x64": {
414
+
"version": "0.25.5",
415
+
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
416
+
"integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
417
+
"cpu": [
418
+
"x64"
419
+
],
420
+
"license": "MIT",
421
+
"optional": true,
422
+
"os": [
423
+
"sunos"
424
+
],
425
+
"engines": {
426
+
"node": ">=18"
427
+
}
428
+
},
429
+
"node_modules/@esbuild/win32-arm64": {
430
+
"version": "0.25.5",
431
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
432
+
"integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
433
+
"cpu": [
434
+
"arm64"
435
+
],
436
+
"license": "MIT",
437
+
"optional": true,
438
+
"os": [
439
+
"win32"
440
+
],
441
+
"engines": {
442
+
"node": ">=18"
443
+
}
444
+
},
445
+
"node_modules/@esbuild/win32-ia32": {
446
+
"version": "0.25.5",
447
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
448
+
"integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
449
+
"cpu": [
450
+
"ia32"
451
+
],
452
+
"license": "MIT",
453
+
"optional": true,
454
+
"os": [
455
+
"win32"
456
+
],
457
+
"engines": {
458
+
"node": ">=18"
459
+
}
460
+
},
461
+
"node_modules/@esbuild/win32-x64": {
462
+
"version": "0.25.5",
463
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
464
+
"integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
465
+
"cpu": [
466
+
"x64"
467
+
],
468
+
"license": "MIT",
469
+
"optional": true,
470
+
"os": [
471
+
"win32"
472
+
],
473
+
"engines": {
474
+
"node": ">=18"
475
+
}
476
+
},
477
+
"node_modules/@types/node": {
478
+
"version": "24.0.3",
479
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz",
480
+
"integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==",
481
+
"license": "MIT",
482
+
"dependencies": {
483
+
"undici-types": "~7.8.0"
484
+
}
485
+
},
486
+
"node_modules/await-lock": {
487
+
"version": "2.2.2",
488
+
"resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz",
489
+
"integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==",
490
+
"license": "MIT"
491
+
},
492
+
"node_modules/dotenv": {
493
+
"version": "16.5.0",
494
+
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
495
+
"integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
496
+
"license": "BSD-2-Clause",
497
+
"engines": {
498
+
"node": ">=12"
499
+
},
500
+
"funding": {
501
+
"url": "https://dotenvx.com"
502
+
}
503
+
},
504
+
"node_modules/esbuild": {
505
+
"version": "0.25.5",
506
+
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
507
+
"integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
508
+
"hasInstallScript": true,
509
+
"license": "MIT",
510
+
"bin": {
511
+
"esbuild": "bin/esbuild"
512
+
},
513
+
"engines": {
514
+
"node": ">=18"
515
+
},
516
+
"optionalDependencies": {
517
+
"@esbuild/aix-ppc64": "0.25.5",
518
+
"@esbuild/android-arm": "0.25.5",
519
+
"@esbuild/android-arm64": "0.25.5",
520
+
"@esbuild/android-x64": "0.25.5",
521
+
"@esbuild/darwin-arm64": "0.25.5",
522
+
"@esbuild/darwin-x64": "0.25.5",
523
+
"@esbuild/freebsd-arm64": "0.25.5",
524
+
"@esbuild/freebsd-x64": "0.25.5",
525
+
"@esbuild/linux-arm": "0.25.5",
526
+
"@esbuild/linux-arm64": "0.25.5",
527
+
"@esbuild/linux-ia32": "0.25.5",
528
+
"@esbuild/linux-loong64": "0.25.5",
529
+
"@esbuild/linux-mips64el": "0.25.5",
530
+
"@esbuild/linux-ppc64": "0.25.5",
531
+
"@esbuild/linux-riscv64": "0.25.5",
532
+
"@esbuild/linux-s390x": "0.25.5",
533
+
"@esbuild/linux-x64": "0.25.5",
534
+
"@esbuild/netbsd-arm64": "0.25.5",
535
+
"@esbuild/netbsd-x64": "0.25.5",
536
+
"@esbuild/openbsd-arm64": "0.25.5",
537
+
"@esbuild/openbsd-x64": "0.25.5",
538
+
"@esbuild/sunos-x64": "0.25.5",
539
+
"@esbuild/win32-arm64": "0.25.5",
540
+
"@esbuild/win32-ia32": "0.25.5",
541
+
"@esbuild/win32-x64": "0.25.5"
542
+
}
543
+
},
544
+
"node_modules/fsevents": {
545
+
"version": "2.3.3",
546
+
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
547
+
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
548
+
"hasInstallScript": true,
549
+
"license": "MIT",
550
+
"optional": true,
551
+
"os": [
552
+
"darwin"
553
+
],
554
+
"engines": {
555
+
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
556
+
}
557
+
},
558
+
"node_modules/get-tsconfig": {
559
+
"version": "4.10.1",
560
+
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
561
+
"integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
562
+
"license": "MIT",
563
+
"dependencies": {
564
+
"resolve-pkg-maps": "^1.0.0"
565
+
},
566
+
"funding": {
567
+
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
568
+
}
569
+
},
570
+
"node_modules/graphemer": {
571
+
"version": "1.4.0",
572
+
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
573
+
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
574
+
"license": "MIT"
575
+
},
576
+
"node_modules/iso-datestring-validator": {
577
+
"version": "2.2.2",
578
+
"resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz",
579
+
"integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==",
580
+
"license": "MIT"
581
+
},
582
+
"node_modules/multiformats": {
583
+
"version": "9.9.0",
584
+
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
585
+
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==",
586
+
"license": "(Apache-2.0 AND MIT)"
587
+
},
588
+
"node_modules/resolve-pkg-maps": {
589
+
"version": "1.0.0",
590
+
"resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
591
+
"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
592
+
"license": "MIT",
593
+
"funding": {
594
+
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
595
+
}
596
+
},
597
+
"node_modules/tlds": {
598
+
"version": "1.259.0",
599
+
"resolved": "https://registry.npmjs.org/tlds/-/tlds-1.259.0.tgz",
600
+
"integrity": "sha512-AldGGlDP0PNgwppe2quAvuBl18UcjuNtOnDuUkqhd6ipPqrYYBt3aTxK1QTsBVknk97lS2JcafWMghjGWFtunw==",
601
+
"license": "MIT",
602
+
"bin": {
603
+
"tlds": "bin.js"
604
+
}
605
+
},
606
+
"node_modules/tsx": {
607
+
"version": "4.20.3",
608
+
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz",
609
+
"integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==",
610
+
"license": "MIT",
611
+
"dependencies": {
612
+
"esbuild": "~0.25.0",
613
+
"get-tsconfig": "^4.7.5"
614
+
},
615
+
"bin": {
616
+
"tsx": "dist/cli.mjs"
617
+
},
618
+
"engines": {
619
+
"node": ">=18.0.0"
620
+
},
621
+
"optionalDependencies": {
622
+
"fsevents": "~2.3.3"
623
+
}
624
+
},
625
+
"node_modules/typescript": {
626
+
"version": "5.8.3",
627
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
628
+
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
629
+
"license": "Apache-2.0",
630
+
"bin": {
631
+
"tsc": "bin/tsc",
632
+
"tsserver": "bin/tsserver"
633
+
},
634
+
"engines": {
635
+
"node": ">=14.17"
636
+
}
637
+
},
638
+
"node_modules/uint8arrays": {
639
+
"version": "3.0.0",
640
+
"resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz",
641
+
"integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==",
642
+
"license": "MIT",
643
+
"dependencies": {
644
+
"multiformats": "^9.4.2"
645
+
}
646
+
},
647
+
"node_modules/undici-types": {
648
+
"version": "7.8.0",
649
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
650
+
"integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
651
+
"license": "MIT"
652
+
},
653
+
"node_modules/zod": {
654
+
"version": "3.25.67",
655
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz",
656
+
"integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==",
657
+
"license": "MIT",
658
+
"funding": {
659
+
"url": "https://github.com/sponsors/colinhacks"
660
+
}
661
+
}
662
+
}
663
+
}
+23
package.json
+23
package.json
···
1
+
{
2
+
"name": "blonk",
3
+
"version": "1.0.0",
4
+
"main": "index.js",
5
+
"scripts": {
6
+
"dev": "tsx watch src/index.ts",
7
+
"build": "tsc",
8
+
"start": "node dist/index.js",
9
+
"test": "echo \"Error: no test specified\" && exit 1"
10
+
},
11
+
"keywords": [],
12
+
"author": "",
13
+
"license": "ISC",
14
+
"description": "",
15
+
"dependencies": {
16
+
"@atproto/api": "^0.15.16",
17
+
"@atproto/lexicon": "^0.4.11",
18
+
"@types/node": "^24.0.3",
19
+
"dotenv": "^16.5.0",
20
+
"tsx": "^4.20.3",
21
+
"typescript": "^5.8.3"
22
+
}
23
+
}
+35
src/agent.ts
+35
src/agent.ts
···
1
+
import { BskyAgent } from '@atproto/api';
2
+
import * as dotenv from 'dotenv';
3
+
4
+
dotenv.config();
5
+
6
+
export class BlonkAgent {
7
+
private agent: BskyAgent;
8
+
9
+
constructor() {
10
+
this.agent = new BskyAgent({
11
+
service: process.env.ATP_SERVICE || 'https://bsky.social',
12
+
});
13
+
}
14
+
15
+
async login() {
16
+
const identifier = process.env.ATP_IDENTIFIER;
17
+
const password = process.env.ATP_PASSWORD;
18
+
19
+
if (!identifier || !password) {
20
+
throw new Error('Missing ATP_IDENTIFIER or ATP_PASSWORD in environment variables');
21
+
}
22
+
23
+
await this.agent.login({
24
+
identifier,
25
+
password,
26
+
});
27
+
28
+
console.log('Successfully authenticated with AT Protocol');
29
+
return this.agent;
30
+
}
31
+
32
+
getAgent() {
33
+
return this.agent;
34
+
}
35
+
}
+41
src/index.ts
+41
src/index.ts
···
1
+
import { BlonkAgent } from './agent';
2
+
import { PostManager } from './posts';
3
+
4
+
async function main() {
5
+
try {
6
+
const blonkAgent = new BlonkAgent();
7
+
await blonkAgent.login();
8
+
9
+
const agent = blonkAgent.getAgent();
10
+
const postManager = new PostManager(agent);
11
+
12
+
console.log('\n🚀 Blonk - AT Protocol Reddit Clone');
13
+
console.log('=====================================\n');
14
+
15
+
console.log('Creating a test post...');
16
+
const postUri = await postManager.createPost(
17
+
'Welcome to Blonk!',
18
+
'This is the first post on Blonk, a Reddit clone built on AT Protocol.',
19
+
'https://atproto.com'
20
+
);
21
+
console.log(`Post created with URI: ${postUri}\n`);
22
+
23
+
console.log('Fetching recent posts...');
24
+
const posts = await postManager.getPosts(10);
25
+
26
+
console.log(`\nFound ${posts.length} posts:`);
27
+
posts.forEach((post, index) => {
28
+
console.log(`\n${index + 1}. ${post.title}`);
29
+
if (post.body) console.log(` ${post.body.substring(0, 100)}...`);
30
+
if (post.url) console.log(` 🔗 ${post.url}`);
31
+
console.log(` 📅 ${new Date(post.createdAt).toLocaleString()}`);
32
+
console.log(` ⬆️ ${post.votes} votes`);
33
+
});
34
+
35
+
} catch (error) {
36
+
console.error('Error:', error);
37
+
process.exit(1);
38
+
}
39
+
}
40
+
41
+
main();
+55
src/posts.ts
+55
src/posts.ts
···
1
+
import { BskyAgent } from '@atproto/api';
2
+
import { BlonkPost, POST_NSID } from './schemas';
3
+
4
+
export class PostManager {
5
+
constructor(private agent: BskyAgent) {}
6
+
7
+
async createPost(title: string, body?: string, url?: string): Promise<string> {
8
+
const post: BlonkPost = {
9
+
title,
10
+
body,
11
+
url,
12
+
createdAt: new Date().toISOString(),
13
+
votes: 0,
14
+
};
15
+
16
+
const response = await this.agent.com.atproto.repo.createRecord({
17
+
repo: this.agent.session?.did!,
18
+
collection: POST_NSID,
19
+
record: post,
20
+
});
21
+
22
+
console.log(`Created post: ${title}`);
23
+
return response.data.uri;
24
+
}
25
+
26
+
async getPosts(limit: number = 50) {
27
+
const response = await this.agent.com.atproto.repo.listRecords({
28
+
repo: this.agent.session?.did!,
29
+
collection: POST_NSID,
30
+
limit,
31
+
});
32
+
33
+
return response.data.records.map(record => ({
34
+
uri: record.uri,
35
+
cid: record.cid,
36
+
...record.value as BlonkPost,
37
+
}));
38
+
}
39
+
40
+
async getPost(uri: string) {
41
+
const [repo, collection, rkey] = uri.replace('at://', '').split('/');
42
+
43
+
const response = await this.agent.com.atproto.repo.getRecord({
44
+
repo,
45
+
collection,
46
+
rkey,
47
+
});
48
+
49
+
return {
50
+
uri,
51
+
cid: response.data.cid,
52
+
...response.data.value as BlonkPost,
53
+
};
54
+
}
55
+
}
+33
src/schemas.ts
+33
src/schemas.ts
···
1
+
export const POST_NSID = 'com.blonk.post';
2
+
export const VOTE_NSID = 'com.blonk.vote';
3
+
export const COMMENT_NSID = 'com.blonk.comment';
4
+
5
+
export interface BlonkPost {
6
+
title: string;
7
+
body?: string;
8
+
url?: string;
9
+
createdAt: string;
10
+
votes: number;
11
+
}
12
+
13
+
export interface BlonkVote {
14
+
subject: {
15
+
uri: string;
16
+
cid: string;
17
+
};
18
+
direction: 'up' | 'down';
19
+
createdAt: string;
20
+
}
21
+
22
+
export interface BlonkComment {
23
+
post: {
24
+
uri: string;
25
+
cid: string;
26
+
};
27
+
parent?: {
28
+
uri: string;
29
+
cid: string;
30
+
};
31
+
text: string;
32
+
createdAt: string;
33
+
}
+113
tsconfig.json
+113
tsconfig.json
···
1
+
{
2
+
"compilerOptions": {
3
+
/* Visit https://aka.ms/tsconfig to read more about this file */
4
+
5
+
/* Projects */
6
+
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
7
+
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
8
+
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
9
+
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
10
+
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
11
+
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
12
+
13
+
/* Language and Environment */
14
+
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
15
+
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
16
+
// "jsx": "preserve", /* Specify what JSX code is generated. */
17
+
// "libReplacement": true, /* Enable lib replacement. */
18
+
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
19
+
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
20
+
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
21
+
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
22
+
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
23
+
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
24
+
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
25
+
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
26
+
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
27
+
28
+
/* Modules */
29
+
"module": "commonjs", /* Specify what module code is generated. */
30
+
// "rootDir": "./", /* Specify the root folder within your source files. */
31
+
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
32
+
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
33
+
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
34
+
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
35
+
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
36
+
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
37
+
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
38
+
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
39
+
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
40
+
// "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */
41
+
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
42
+
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
43
+
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
44
+
// "noUncheckedSideEffectImports": true, /* Check side effect imports. */
45
+
// "resolveJsonModule": true, /* Enable importing .json files. */
46
+
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
47
+
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
48
+
49
+
/* JavaScript Support */
50
+
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
51
+
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
52
+
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
53
+
54
+
/* Emit */
55
+
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
56
+
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
57
+
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
58
+
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
59
+
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
60
+
// "noEmit": true, /* Disable emitting files from a compilation. */
61
+
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
62
+
// "outDir": "./", /* Specify an output folder for all emitted files. */
63
+
// "removeComments": true, /* Disable emitting comments. */
64
+
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
65
+
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
66
+
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
67
+
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
68
+
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
69
+
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
70
+
// "newLine": "crlf", /* Set the newline character for emitting files. */
71
+
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
72
+
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
73
+
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
74
+
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
75
+
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
76
+
77
+
/* Interop Constraints */
78
+
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
79
+
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
80
+
// "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
81
+
// "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */
82
+
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
83
+
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
84
+
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
85
+
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
86
+
87
+
/* Type Checking */
88
+
"strict": true, /* Enable all strict type-checking options. */
89
+
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
90
+
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
91
+
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
92
+
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
93
+
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
94
+
// "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
95
+
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
96
+
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
97
+
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
98
+
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
99
+
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
100
+
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
101
+
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
102
+
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
103
+
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
104
+
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
105
+
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
106
+
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
107
+
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
108
+
109
+
/* Completeness */
110
+
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
111
+
"skipLibCheck": true /* Skip type checking all .d.ts files. */
112
+
}
113
+
}