blonk is a radar for your web, where you follow vibes for cool blips on the radar

Initial commit with a little structure.

We've added the ATProto SDK and set up a really basic setup.
It's all Claude generated, but this is a learning exercise to let's take
a look at it.

BlonkAgent - to be renamed, but basically our Bsky client

POST_NSID - our namespace identifier (What is this? We'll come back to that)

PostManager - our interface to create or retrieve posts

`index.ts` - a super basic page skeleton

With this I guess we can try to get some shit on a page.

Bobby Grayson aeb0dc78

+3
.env.example
··· 1 + ATP_SERVICE=https://bsky.social 2 + ATP_IDENTIFIER=your.handle.bsky.social 3 + ATP_PASSWORD=your-app-password
+8
.gitignore
··· 1 + node_modules/ 2 + dist/ 3 + .env 4 + .DS_Store 5 + *.log 6 + *.swp 7 + *.swn 8 + *.swo
+7
CLAUDE.md
··· 1 + I want to make my first atproto application. 2 + 3 + I have no idea what I am doing. 4 + 5 + The idea is we will start with a reddit clone. 6 + 7 + What do we do?
+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
··· 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
··· 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
··· 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
··· 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
··· 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
··· 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 + }