personal golinks
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

first commit

Tyler 49818056

+1069
+4
.gitignore
··· 1 + node_modules/ 2 + .wrangler/ 3 + dist/ 4 + .dev.vars
+3
README.md
··· 1 + code for go.tyler.fun 2 + 3 + copied from template: https://tangled.org/tyler.fun/atprto-worker-template
+20
package.json
··· 1 + { 2 + "name": "atprto-worker", 3 + "version": "1.0.0", 4 + "description": "", 5 + "main": "index.js", 6 + "scripts": { 7 + "dev": "wrangler dev", 8 + "deploy": "wrangler deploy", 9 + "typecheck": "tsc --noEmit" 10 + }, 11 + "keywords": [], 12 + "author": "", 13 + "license": "ISC", 14 + "packageManager": "pnpm@10.18.3", 15 + "devDependencies": { 16 + "@cloudflare/workers-types": "^4.20260408.1", 17 + "typescript": "^6.0.2", 18 + "wrangler": "^4.81.0" 19 + } 20 + }
+872
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + devDependencies: 11 + '@cloudflare/workers-types': 12 + specifier: ^4.20260408.1 13 + version: 4.20260408.1 14 + typescript: 15 + specifier: ^6.0.2 16 + version: 6.0.2 17 + wrangler: 18 + specifier: ^4.81.0 19 + version: 4.81.0(@cloudflare/workers-types@4.20260408.1) 20 + 21 + packages: 22 + 23 + '@cloudflare/kv-asset-handler@0.4.2': 24 + resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==} 25 + engines: {node: '>=18.0.0'} 26 + 27 + '@cloudflare/unenv-preset@2.16.0': 28 + resolution: {integrity: sha512-8ovsRpwzPoEqPUzoErAYVv8l3FMZNeBVQfJTvtzP4AgLSRGZISRfuChFxHWUQd3n6cnrwkuTGxT+2cGo8EsyYg==} 29 + peerDependencies: 30 + unenv: 2.0.0-rc.24 31 + workerd: 1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0 32 + peerDependenciesMeta: 33 + workerd: 34 + optional: true 35 + 36 + '@cloudflare/workerd-darwin-64@1.20260405.1': 37 + resolution: {integrity: sha512-EbmdBcmeIGogKG4V1odSWQe7z4rHssUD4iaXv0cXA22/MFrzH3iQT0R+FJFyhucGtih/9B9E+6j0QbSQD8xT3w==} 38 + engines: {node: '>=16'} 39 + cpu: [x64] 40 + os: [darwin] 41 + 42 + '@cloudflare/workerd-darwin-arm64@1.20260405.1': 43 + resolution: {integrity: sha512-r44r418bOQtoP+Odu+L/BQM9q5cRSXRd1N167PgZQIo4MlqzTwHO4L0wwXhxbcV/PF46rrQre/uTFS8R0R+xSQ==} 44 + engines: {node: '>=16'} 45 + cpu: [arm64] 46 + os: [darwin] 47 + 48 + '@cloudflare/workerd-linux-64@1.20260405.1': 49 + resolution: {integrity: sha512-Aaq3RWnaTCzMBo77wC8fjOx+SFdO/rlcXa6HAf+PJs51LyMISFOBCJKqSlS6Irphen0WHHxFKPHUO9bjfj8g2g==} 50 + engines: {node: '>=16'} 51 + cpu: [x64] 52 + os: [linux] 53 + 54 + '@cloudflare/workerd-linux-arm64@1.20260405.1': 55 + resolution: {integrity: sha512-Lbp9Z2wiMzy3Sji3YwMHK5WDlejsH3jF4swAFEv7+jIf3NowZHga3GzwTypNRmcwnfz/XrqQ7Hc0Ul9OoU/lCw==} 56 + engines: {node: '>=16'} 57 + cpu: [arm64] 58 + os: [linux] 59 + 60 + '@cloudflare/workerd-windows-64@1.20260405.1': 61 + resolution: {integrity: sha512-FhE0kt93kj5JnSPVqi4BAXpQQENyKnuSOoJLd35mkMMGhtPrwv5EsReJdck0S8hUocCBlb+U0RmP8ta6k41HjQ==} 62 + engines: {node: '>=16'} 63 + cpu: [x64] 64 + os: [win32] 65 + 66 + '@cloudflare/workers-types@4.20260408.1': 67 + resolution: {integrity: sha512-kE1tKfHUyIldsj3ea2XEqvLRHkDwc83YM7nar6SS5+cj81IoAFR/OZNDwZWHb6vx+pC31PBJGtROlfZzsgxudQ==} 68 + 69 + '@cspotcode/source-map-support@0.8.1': 70 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 71 + engines: {node: '>=12'} 72 + 73 + '@emnapi/runtime@1.9.2': 74 + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} 75 + 76 + '@esbuild/aix-ppc64@0.27.3': 77 + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} 78 + engines: {node: '>=18'} 79 + cpu: [ppc64] 80 + os: [aix] 81 + 82 + '@esbuild/android-arm64@0.27.3': 83 + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} 84 + engines: {node: '>=18'} 85 + cpu: [arm64] 86 + os: [android] 87 + 88 + '@esbuild/android-arm@0.27.3': 89 + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} 90 + engines: {node: '>=18'} 91 + cpu: [arm] 92 + os: [android] 93 + 94 + '@esbuild/android-x64@0.27.3': 95 + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} 96 + engines: {node: '>=18'} 97 + cpu: [x64] 98 + os: [android] 99 + 100 + '@esbuild/darwin-arm64@0.27.3': 101 + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} 102 + engines: {node: '>=18'} 103 + cpu: [arm64] 104 + os: [darwin] 105 + 106 + '@esbuild/darwin-x64@0.27.3': 107 + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} 108 + engines: {node: '>=18'} 109 + cpu: [x64] 110 + os: [darwin] 111 + 112 + '@esbuild/freebsd-arm64@0.27.3': 113 + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} 114 + engines: {node: '>=18'} 115 + cpu: [arm64] 116 + os: [freebsd] 117 + 118 + '@esbuild/freebsd-x64@0.27.3': 119 + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} 120 + engines: {node: '>=18'} 121 + cpu: [x64] 122 + os: [freebsd] 123 + 124 + '@esbuild/linux-arm64@0.27.3': 125 + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} 126 + engines: {node: '>=18'} 127 + cpu: [arm64] 128 + os: [linux] 129 + 130 + '@esbuild/linux-arm@0.27.3': 131 + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} 132 + engines: {node: '>=18'} 133 + cpu: [arm] 134 + os: [linux] 135 + 136 + '@esbuild/linux-ia32@0.27.3': 137 + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} 138 + engines: {node: '>=18'} 139 + cpu: [ia32] 140 + os: [linux] 141 + 142 + '@esbuild/linux-loong64@0.27.3': 143 + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} 144 + engines: {node: '>=18'} 145 + cpu: [loong64] 146 + os: [linux] 147 + 148 + '@esbuild/linux-mips64el@0.27.3': 149 + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} 150 + engines: {node: '>=18'} 151 + cpu: [mips64el] 152 + os: [linux] 153 + 154 + '@esbuild/linux-ppc64@0.27.3': 155 + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} 156 + engines: {node: '>=18'} 157 + cpu: [ppc64] 158 + os: [linux] 159 + 160 + '@esbuild/linux-riscv64@0.27.3': 161 + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} 162 + engines: {node: '>=18'} 163 + cpu: [riscv64] 164 + os: [linux] 165 + 166 + '@esbuild/linux-s390x@0.27.3': 167 + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} 168 + engines: {node: '>=18'} 169 + cpu: [s390x] 170 + os: [linux] 171 + 172 + '@esbuild/linux-x64@0.27.3': 173 + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} 174 + engines: {node: '>=18'} 175 + cpu: [x64] 176 + os: [linux] 177 + 178 + '@esbuild/netbsd-arm64@0.27.3': 179 + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} 180 + engines: {node: '>=18'} 181 + cpu: [arm64] 182 + os: [netbsd] 183 + 184 + '@esbuild/netbsd-x64@0.27.3': 185 + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} 186 + engines: {node: '>=18'} 187 + cpu: [x64] 188 + os: [netbsd] 189 + 190 + '@esbuild/openbsd-arm64@0.27.3': 191 + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} 192 + engines: {node: '>=18'} 193 + cpu: [arm64] 194 + os: [openbsd] 195 + 196 + '@esbuild/openbsd-x64@0.27.3': 197 + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} 198 + engines: {node: '>=18'} 199 + cpu: [x64] 200 + os: [openbsd] 201 + 202 + '@esbuild/openharmony-arm64@0.27.3': 203 + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} 204 + engines: {node: '>=18'} 205 + cpu: [arm64] 206 + os: [openharmony] 207 + 208 + '@esbuild/sunos-x64@0.27.3': 209 + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} 210 + engines: {node: '>=18'} 211 + cpu: [x64] 212 + os: [sunos] 213 + 214 + '@esbuild/win32-arm64@0.27.3': 215 + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} 216 + engines: {node: '>=18'} 217 + cpu: [arm64] 218 + os: [win32] 219 + 220 + '@esbuild/win32-ia32@0.27.3': 221 + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} 222 + engines: {node: '>=18'} 223 + cpu: [ia32] 224 + os: [win32] 225 + 226 + '@esbuild/win32-x64@0.27.3': 227 + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} 228 + engines: {node: '>=18'} 229 + cpu: [x64] 230 + os: [win32] 231 + 232 + '@img/colour@1.1.0': 233 + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} 234 + engines: {node: '>=18'} 235 + 236 + '@img/sharp-darwin-arm64@0.34.5': 237 + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} 238 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 239 + cpu: [arm64] 240 + os: [darwin] 241 + 242 + '@img/sharp-darwin-x64@0.34.5': 243 + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} 244 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 245 + cpu: [x64] 246 + os: [darwin] 247 + 248 + '@img/sharp-libvips-darwin-arm64@1.2.4': 249 + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} 250 + cpu: [arm64] 251 + os: [darwin] 252 + 253 + '@img/sharp-libvips-darwin-x64@1.2.4': 254 + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} 255 + cpu: [x64] 256 + os: [darwin] 257 + 258 + '@img/sharp-libvips-linux-arm64@1.2.4': 259 + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} 260 + cpu: [arm64] 261 + os: [linux] 262 + 263 + '@img/sharp-libvips-linux-arm@1.2.4': 264 + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} 265 + cpu: [arm] 266 + os: [linux] 267 + 268 + '@img/sharp-libvips-linux-ppc64@1.2.4': 269 + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} 270 + cpu: [ppc64] 271 + os: [linux] 272 + 273 + '@img/sharp-libvips-linux-riscv64@1.2.4': 274 + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} 275 + cpu: [riscv64] 276 + os: [linux] 277 + 278 + '@img/sharp-libvips-linux-s390x@1.2.4': 279 + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} 280 + cpu: [s390x] 281 + os: [linux] 282 + 283 + '@img/sharp-libvips-linux-x64@1.2.4': 284 + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} 285 + cpu: [x64] 286 + os: [linux] 287 + 288 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 289 + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} 290 + cpu: [arm64] 291 + os: [linux] 292 + 293 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 294 + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} 295 + cpu: [x64] 296 + os: [linux] 297 + 298 + '@img/sharp-linux-arm64@0.34.5': 299 + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} 300 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 301 + cpu: [arm64] 302 + os: [linux] 303 + 304 + '@img/sharp-linux-arm@0.34.5': 305 + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} 306 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 307 + cpu: [arm] 308 + os: [linux] 309 + 310 + '@img/sharp-linux-ppc64@0.34.5': 311 + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} 312 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 313 + cpu: [ppc64] 314 + os: [linux] 315 + 316 + '@img/sharp-linux-riscv64@0.34.5': 317 + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} 318 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 319 + cpu: [riscv64] 320 + os: [linux] 321 + 322 + '@img/sharp-linux-s390x@0.34.5': 323 + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} 324 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 325 + cpu: [s390x] 326 + os: [linux] 327 + 328 + '@img/sharp-linux-x64@0.34.5': 329 + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} 330 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 331 + cpu: [x64] 332 + os: [linux] 333 + 334 + '@img/sharp-linuxmusl-arm64@0.34.5': 335 + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} 336 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 337 + cpu: [arm64] 338 + os: [linux] 339 + 340 + '@img/sharp-linuxmusl-x64@0.34.5': 341 + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} 342 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 343 + cpu: [x64] 344 + os: [linux] 345 + 346 + '@img/sharp-wasm32@0.34.5': 347 + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} 348 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 349 + cpu: [wasm32] 350 + 351 + '@img/sharp-win32-arm64@0.34.5': 352 + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} 353 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 354 + cpu: [arm64] 355 + os: [win32] 356 + 357 + '@img/sharp-win32-ia32@0.34.5': 358 + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} 359 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 360 + cpu: [ia32] 361 + os: [win32] 362 + 363 + '@img/sharp-win32-x64@0.34.5': 364 + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} 365 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 366 + cpu: [x64] 367 + os: [win32] 368 + 369 + '@jridgewell/resolve-uri@3.1.2': 370 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 371 + engines: {node: '>=6.0.0'} 372 + 373 + '@jridgewell/sourcemap-codec@1.5.5': 374 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 375 + 376 + '@jridgewell/trace-mapping@0.3.9': 377 + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 378 + 379 + '@poppinss/colors@4.1.6': 380 + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} 381 + 382 + '@poppinss/dumper@0.6.5': 383 + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} 384 + 385 + '@poppinss/exception@1.2.3': 386 + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} 387 + 388 + '@sindresorhus/is@7.2.0': 389 + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} 390 + engines: {node: '>=18'} 391 + 392 + '@speed-highlight/core@1.2.15': 393 + resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} 394 + 395 + blake3-wasm@2.1.5: 396 + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} 397 + 398 + cookie@1.1.1: 399 + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 400 + engines: {node: '>=18'} 401 + 402 + detect-libc@2.1.2: 403 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 404 + engines: {node: '>=8'} 405 + 406 + error-stack-parser-es@1.0.5: 407 + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} 408 + 409 + esbuild@0.27.3: 410 + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} 411 + engines: {node: '>=18'} 412 + hasBin: true 413 + 414 + fsevents@2.3.3: 415 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 416 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 417 + os: [darwin] 418 + 419 + kleur@4.1.5: 420 + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 421 + engines: {node: '>=6'} 422 + 423 + miniflare@4.20260405.0: 424 + resolution: {integrity: sha512-tpr4XdWMq7zFdsHH+CS0XS47nQzlRZH0rMJ1vobOZbkrs3cIj7qbD40ON616hDnzHxwqwB2qKHzmmuj6oRisSQ==} 425 + engines: {node: '>=18.0.0'} 426 + hasBin: true 427 + 428 + path-to-regexp@6.3.0: 429 + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 430 + 431 + pathe@2.0.3: 432 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 433 + 434 + semver@7.7.4: 435 + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} 436 + engines: {node: '>=10'} 437 + hasBin: true 438 + 439 + sharp@0.34.5: 440 + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} 441 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 442 + 443 + supports-color@10.2.2: 444 + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} 445 + engines: {node: '>=18'} 446 + 447 + tslib@2.8.1: 448 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 449 + 450 + typescript@6.0.2: 451 + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} 452 + engines: {node: '>=14.17'} 453 + hasBin: true 454 + 455 + undici@7.24.4: 456 + resolution: {integrity: sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==} 457 + engines: {node: '>=20.18.1'} 458 + 459 + unenv@2.0.0-rc.24: 460 + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} 461 + 462 + workerd@1.20260405.1: 463 + resolution: {integrity: sha512-bSaRWCv9iO8/FWpgZRjHLGZLolX5s1AErRSYaTECMMHOZKuCbl2+ehnSyc+ZZ/70y+9owADmN6HoYEWvBlJdYw==} 464 + engines: {node: '>=16'} 465 + hasBin: true 466 + 467 + wrangler@4.81.0: 468 + resolution: {integrity: sha512-9fLPDuDcb8Nu6iXrl5E3HGYt3TVhQr/UvqtTvWr9Nl1X7PlQrmWMwQCfSioqN8VHYyQCyESV5jQsoKg8Sx+sEA==} 469 + engines: {node: '>=20.3.0'} 470 + hasBin: true 471 + peerDependencies: 472 + '@cloudflare/workers-types': ^4.20260405.1 473 + peerDependenciesMeta: 474 + '@cloudflare/workers-types': 475 + optional: true 476 + 477 + ws@8.18.0: 478 + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} 479 + engines: {node: '>=10.0.0'} 480 + peerDependencies: 481 + bufferutil: ^4.0.1 482 + utf-8-validate: '>=5.0.2' 483 + peerDependenciesMeta: 484 + bufferutil: 485 + optional: true 486 + utf-8-validate: 487 + optional: true 488 + 489 + youch-core@0.3.3: 490 + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} 491 + 492 + youch@4.1.0-beta.10: 493 + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} 494 + 495 + snapshots: 496 + 497 + '@cloudflare/kv-asset-handler@0.4.2': {} 498 + 499 + '@cloudflare/unenv-preset@2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260405.1)': 500 + dependencies: 501 + unenv: 2.0.0-rc.24 502 + optionalDependencies: 503 + workerd: 1.20260405.1 504 + 505 + '@cloudflare/workerd-darwin-64@1.20260405.1': 506 + optional: true 507 + 508 + '@cloudflare/workerd-darwin-arm64@1.20260405.1': 509 + optional: true 510 + 511 + '@cloudflare/workerd-linux-64@1.20260405.1': 512 + optional: true 513 + 514 + '@cloudflare/workerd-linux-arm64@1.20260405.1': 515 + optional: true 516 + 517 + '@cloudflare/workerd-windows-64@1.20260405.1': 518 + optional: true 519 + 520 + '@cloudflare/workers-types@4.20260408.1': {} 521 + 522 + '@cspotcode/source-map-support@0.8.1': 523 + dependencies: 524 + '@jridgewell/trace-mapping': 0.3.9 525 + 526 + '@emnapi/runtime@1.9.2': 527 + dependencies: 528 + tslib: 2.8.1 529 + optional: true 530 + 531 + '@esbuild/aix-ppc64@0.27.3': 532 + optional: true 533 + 534 + '@esbuild/android-arm64@0.27.3': 535 + optional: true 536 + 537 + '@esbuild/android-arm@0.27.3': 538 + optional: true 539 + 540 + '@esbuild/android-x64@0.27.3': 541 + optional: true 542 + 543 + '@esbuild/darwin-arm64@0.27.3': 544 + optional: true 545 + 546 + '@esbuild/darwin-x64@0.27.3': 547 + optional: true 548 + 549 + '@esbuild/freebsd-arm64@0.27.3': 550 + optional: true 551 + 552 + '@esbuild/freebsd-x64@0.27.3': 553 + optional: true 554 + 555 + '@esbuild/linux-arm64@0.27.3': 556 + optional: true 557 + 558 + '@esbuild/linux-arm@0.27.3': 559 + optional: true 560 + 561 + '@esbuild/linux-ia32@0.27.3': 562 + optional: true 563 + 564 + '@esbuild/linux-loong64@0.27.3': 565 + optional: true 566 + 567 + '@esbuild/linux-mips64el@0.27.3': 568 + optional: true 569 + 570 + '@esbuild/linux-ppc64@0.27.3': 571 + optional: true 572 + 573 + '@esbuild/linux-riscv64@0.27.3': 574 + optional: true 575 + 576 + '@esbuild/linux-s390x@0.27.3': 577 + optional: true 578 + 579 + '@esbuild/linux-x64@0.27.3': 580 + optional: true 581 + 582 + '@esbuild/netbsd-arm64@0.27.3': 583 + optional: true 584 + 585 + '@esbuild/netbsd-x64@0.27.3': 586 + optional: true 587 + 588 + '@esbuild/openbsd-arm64@0.27.3': 589 + optional: true 590 + 591 + '@esbuild/openbsd-x64@0.27.3': 592 + optional: true 593 + 594 + '@esbuild/openharmony-arm64@0.27.3': 595 + optional: true 596 + 597 + '@esbuild/sunos-x64@0.27.3': 598 + optional: true 599 + 600 + '@esbuild/win32-arm64@0.27.3': 601 + optional: true 602 + 603 + '@esbuild/win32-ia32@0.27.3': 604 + optional: true 605 + 606 + '@esbuild/win32-x64@0.27.3': 607 + optional: true 608 + 609 + '@img/colour@1.1.0': {} 610 + 611 + '@img/sharp-darwin-arm64@0.34.5': 612 + optionalDependencies: 613 + '@img/sharp-libvips-darwin-arm64': 1.2.4 614 + optional: true 615 + 616 + '@img/sharp-darwin-x64@0.34.5': 617 + optionalDependencies: 618 + '@img/sharp-libvips-darwin-x64': 1.2.4 619 + optional: true 620 + 621 + '@img/sharp-libvips-darwin-arm64@1.2.4': 622 + optional: true 623 + 624 + '@img/sharp-libvips-darwin-x64@1.2.4': 625 + optional: true 626 + 627 + '@img/sharp-libvips-linux-arm64@1.2.4': 628 + optional: true 629 + 630 + '@img/sharp-libvips-linux-arm@1.2.4': 631 + optional: true 632 + 633 + '@img/sharp-libvips-linux-ppc64@1.2.4': 634 + optional: true 635 + 636 + '@img/sharp-libvips-linux-riscv64@1.2.4': 637 + optional: true 638 + 639 + '@img/sharp-libvips-linux-s390x@1.2.4': 640 + optional: true 641 + 642 + '@img/sharp-libvips-linux-x64@1.2.4': 643 + optional: true 644 + 645 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 646 + optional: true 647 + 648 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 649 + optional: true 650 + 651 + '@img/sharp-linux-arm64@0.34.5': 652 + optionalDependencies: 653 + '@img/sharp-libvips-linux-arm64': 1.2.4 654 + optional: true 655 + 656 + '@img/sharp-linux-arm@0.34.5': 657 + optionalDependencies: 658 + '@img/sharp-libvips-linux-arm': 1.2.4 659 + optional: true 660 + 661 + '@img/sharp-linux-ppc64@0.34.5': 662 + optionalDependencies: 663 + '@img/sharp-libvips-linux-ppc64': 1.2.4 664 + optional: true 665 + 666 + '@img/sharp-linux-riscv64@0.34.5': 667 + optionalDependencies: 668 + '@img/sharp-libvips-linux-riscv64': 1.2.4 669 + optional: true 670 + 671 + '@img/sharp-linux-s390x@0.34.5': 672 + optionalDependencies: 673 + '@img/sharp-libvips-linux-s390x': 1.2.4 674 + optional: true 675 + 676 + '@img/sharp-linux-x64@0.34.5': 677 + optionalDependencies: 678 + '@img/sharp-libvips-linux-x64': 1.2.4 679 + optional: true 680 + 681 + '@img/sharp-linuxmusl-arm64@0.34.5': 682 + optionalDependencies: 683 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 684 + optional: true 685 + 686 + '@img/sharp-linuxmusl-x64@0.34.5': 687 + optionalDependencies: 688 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 689 + optional: true 690 + 691 + '@img/sharp-wasm32@0.34.5': 692 + dependencies: 693 + '@emnapi/runtime': 1.9.2 694 + optional: true 695 + 696 + '@img/sharp-win32-arm64@0.34.5': 697 + optional: true 698 + 699 + '@img/sharp-win32-ia32@0.34.5': 700 + optional: true 701 + 702 + '@img/sharp-win32-x64@0.34.5': 703 + optional: true 704 + 705 + '@jridgewell/resolve-uri@3.1.2': {} 706 + 707 + '@jridgewell/sourcemap-codec@1.5.5': {} 708 + 709 + '@jridgewell/trace-mapping@0.3.9': 710 + dependencies: 711 + '@jridgewell/resolve-uri': 3.1.2 712 + '@jridgewell/sourcemap-codec': 1.5.5 713 + 714 + '@poppinss/colors@4.1.6': 715 + dependencies: 716 + kleur: 4.1.5 717 + 718 + '@poppinss/dumper@0.6.5': 719 + dependencies: 720 + '@poppinss/colors': 4.1.6 721 + '@sindresorhus/is': 7.2.0 722 + supports-color: 10.2.2 723 + 724 + '@poppinss/exception@1.2.3': {} 725 + 726 + '@sindresorhus/is@7.2.0': {} 727 + 728 + '@speed-highlight/core@1.2.15': {} 729 + 730 + blake3-wasm@2.1.5: {} 731 + 732 + cookie@1.1.1: {} 733 + 734 + detect-libc@2.1.2: {} 735 + 736 + error-stack-parser-es@1.0.5: {} 737 + 738 + esbuild@0.27.3: 739 + optionalDependencies: 740 + '@esbuild/aix-ppc64': 0.27.3 741 + '@esbuild/android-arm': 0.27.3 742 + '@esbuild/android-arm64': 0.27.3 743 + '@esbuild/android-x64': 0.27.3 744 + '@esbuild/darwin-arm64': 0.27.3 745 + '@esbuild/darwin-x64': 0.27.3 746 + '@esbuild/freebsd-arm64': 0.27.3 747 + '@esbuild/freebsd-x64': 0.27.3 748 + '@esbuild/linux-arm': 0.27.3 749 + '@esbuild/linux-arm64': 0.27.3 750 + '@esbuild/linux-ia32': 0.27.3 751 + '@esbuild/linux-loong64': 0.27.3 752 + '@esbuild/linux-mips64el': 0.27.3 753 + '@esbuild/linux-ppc64': 0.27.3 754 + '@esbuild/linux-riscv64': 0.27.3 755 + '@esbuild/linux-s390x': 0.27.3 756 + '@esbuild/linux-x64': 0.27.3 757 + '@esbuild/netbsd-arm64': 0.27.3 758 + '@esbuild/netbsd-x64': 0.27.3 759 + '@esbuild/openbsd-arm64': 0.27.3 760 + '@esbuild/openbsd-x64': 0.27.3 761 + '@esbuild/openharmony-arm64': 0.27.3 762 + '@esbuild/sunos-x64': 0.27.3 763 + '@esbuild/win32-arm64': 0.27.3 764 + '@esbuild/win32-ia32': 0.27.3 765 + '@esbuild/win32-x64': 0.27.3 766 + 767 + fsevents@2.3.3: 768 + optional: true 769 + 770 + kleur@4.1.5: {} 771 + 772 + miniflare@4.20260405.0: 773 + dependencies: 774 + '@cspotcode/source-map-support': 0.8.1 775 + sharp: 0.34.5 776 + undici: 7.24.4 777 + workerd: 1.20260405.1 778 + ws: 8.18.0 779 + youch: 4.1.0-beta.10 780 + transitivePeerDependencies: 781 + - bufferutil 782 + - utf-8-validate 783 + 784 + path-to-regexp@6.3.0: {} 785 + 786 + pathe@2.0.3: {} 787 + 788 + semver@7.7.4: {} 789 + 790 + sharp@0.34.5: 791 + dependencies: 792 + '@img/colour': 1.1.0 793 + detect-libc: 2.1.2 794 + semver: 7.7.4 795 + optionalDependencies: 796 + '@img/sharp-darwin-arm64': 0.34.5 797 + '@img/sharp-darwin-x64': 0.34.5 798 + '@img/sharp-libvips-darwin-arm64': 1.2.4 799 + '@img/sharp-libvips-darwin-x64': 1.2.4 800 + '@img/sharp-libvips-linux-arm': 1.2.4 801 + '@img/sharp-libvips-linux-arm64': 1.2.4 802 + '@img/sharp-libvips-linux-ppc64': 1.2.4 803 + '@img/sharp-libvips-linux-riscv64': 1.2.4 804 + '@img/sharp-libvips-linux-s390x': 1.2.4 805 + '@img/sharp-libvips-linux-x64': 1.2.4 806 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 807 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 808 + '@img/sharp-linux-arm': 0.34.5 809 + '@img/sharp-linux-arm64': 0.34.5 810 + '@img/sharp-linux-ppc64': 0.34.5 811 + '@img/sharp-linux-riscv64': 0.34.5 812 + '@img/sharp-linux-s390x': 0.34.5 813 + '@img/sharp-linux-x64': 0.34.5 814 + '@img/sharp-linuxmusl-arm64': 0.34.5 815 + '@img/sharp-linuxmusl-x64': 0.34.5 816 + '@img/sharp-wasm32': 0.34.5 817 + '@img/sharp-win32-arm64': 0.34.5 818 + '@img/sharp-win32-ia32': 0.34.5 819 + '@img/sharp-win32-x64': 0.34.5 820 + 821 + supports-color@10.2.2: {} 822 + 823 + tslib@2.8.1: 824 + optional: true 825 + 826 + typescript@6.0.2: {} 827 + 828 + undici@7.24.4: {} 829 + 830 + unenv@2.0.0-rc.24: 831 + dependencies: 832 + pathe: 2.0.3 833 + 834 + workerd@1.20260405.1: 835 + optionalDependencies: 836 + '@cloudflare/workerd-darwin-64': 1.20260405.1 837 + '@cloudflare/workerd-darwin-arm64': 1.20260405.1 838 + '@cloudflare/workerd-linux-64': 1.20260405.1 839 + '@cloudflare/workerd-linux-arm64': 1.20260405.1 840 + '@cloudflare/workerd-windows-64': 1.20260405.1 841 + 842 + wrangler@4.81.0(@cloudflare/workers-types@4.20260408.1): 843 + dependencies: 844 + '@cloudflare/kv-asset-handler': 0.4.2 845 + '@cloudflare/unenv-preset': 2.16.0(unenv@2.0.0-rc.24)(workerd@1.20260405.1) 846 + blake3-wasm: 2.1.5 847 + esbuild: 0.27.3 848 + miniflare: 4.20260405.0 849 + path-to-regexp: 6.3.0 850 + unenv: 2.0.0-rc.24 851 + workerd: 1.20260405.1 852 + optionalDependencies: 853 + '@cloudflare/workers-types': 4.20260408.1 854 + fsevents: 2.3.3 855 + transitivePeerDependencies: 856 + - bufferutil 857 + - utf-8-validate 858 + 859 + ws@8.18.0: {} 860 + 861 + youch-core@0.3.3: 862 + dependencies: 863 + '@poppinss/exception': 1.2.3 864 + error-stack-parser-es: 1.0.5 865 + 866 + youch@4.1.0-beta.10: 867 + dependencies: 868 + '@poppinss/colors': 4.1.6 869 + '@poppinss/dumper': 0.6.5 870 + '@speed-highlight/core': 1.2.15 871 + cookie: 1.1.1 872 + youch-core: 0.3.3
+145
src/index.ts
··· 1 + export interface Env { 2 + LINK_CACHE: DurableObjectNamespace; 3 + } 4 + 5 + const DID = "did:plc:4gt3dbmp4pydjiemob4konzm"; 6 + const COLLECTION = "to.atpr.link"; 7 + const PDS = "https://selfhosted.social"; 8 + 9 + export class LinkCache implements DurableObject { 10 + private state: DurableObjectState; 11 + private syncing: Promise<void> | null = null; 12 + 13 + constructor(state: DurableObjectState, _env: Env) { 14 + this.state = state; 15 + } 16 + 17 + async fetch(request: Request): Promise<Response> { 18 + const url = new URL(request.url); 19 + const slug = url.pathname.slice(1); // strip leading / 20 + 21 + if (!slug) { 22 + return new Response(htmlPage("go.tyler.fun", "My golinks server. Create links at <a href=\"https://atpr.to\">atpr.to</a>."), { 23 + headers: { "content-type": "text/html;charset=utf-8" }, 24 + }); 25 + } 26 + 27 + // Try cache first 28 + const cached = await this.state.storage.get<string>(slug); 29 + if (cached) { 30 + // Refresh cache in background 31 + this.triggerSync(); 32 + return Response.redirect(cached, 302); 33 + } 34 + 35 + // Cache miss — sync and try again 36 + await this.sync(); 37 + const fresh = await this.state.storage.get<string>(slug); 38 + if (fresh) { 39 + return Response.redirect(fresh, 302); 40 + } 41 + 42 + return new Response(htmlPage("Not Found", `No golink found for <code>/${slug}</code>`), { 43 + status: 404, 44 + headers: { "content-type": "text/html;charset=utf-8" }, 45 + }); 46 + } 47 + 48 + private triggerSync() { 49 + if (!this.syncing) { 50 + this.syncing = this.sync().finally(() => { 51 + this.syncing = null; 52 + }); 53 + } 54 + } 55 + 56 + private async sync(): Promise<void> { 57 + const records = await fetchAllRecords(); 58 + const fresh = new Map<string, string>(); 59 + 60 + for (const record of records) { 61 + const rkey = record.uri.split("/").pop()!; 62 + const dest = record.value?.url; 63 + if (rkey && dest) { 64 + fresh.set(rkey, dest); 65 + } 66 + } 67 + 68 + // Get all existing keys and delete stale ones 69 + const existing = await this.state.storage.list(); 70 + const toDelete: string[] = []; 71 + for (const key of existing.keys()) { 72 + if (!fresh.has(key)) { 73 + toDelete.push(key); 74 + } 75 + } 76 + if (toDelete.length > 0) { 77 + await this.state.storage.delete(toDelete); 78 + } 79 + 80 + // Write all fresh records 81 + if (fresh.size > 0) { 82 + await this.state.storage.put(Object.fromEntries(fresh)); 83 + } 84 + } 85 + } 86 + 87 + interface ATRecord { 88 + uri: string; 89 + cid: string; 90 + value: { url: string; $type: string; updatedAt?: string }; 91 + } 92 + 93 + async function fetchAllRecords(): Promise<ATRecord[]> { 94 + const all: ATRecord[] = []; 95 + let cursor: string | undefined; 96 + 97 + do { 98 + const params = new URLSearchParams({ 99 + repo: DID, 100 + collection: COLLECTION, 101 + limit: "100", 102 + }); 103 + if (cursor) params.set("cursor", cursor); 104 + 105 + const res = await fetch(`${PDS}/xrpc/com.atproto.repo.listRecords?${params}`); 106 + if (!res.ok) { 107 + throw new Error(`listRecords failed: ${res.status}`); 108 + } 109 + 110 + const data = (await res.json()) as { records: ATRecord[]; cursor?: string }; 111 + all.push(...data.records); 112 + cursor = data.cursor; 113 + } while (cursor); 114 + 115 + return all; 116 + } 117 + 118 + function htmlPage(title: string, body: string): string { 119 + return `<!DOCTYPE html> 120 + <html> 121 + <head> 122 + <meta charset="utf-8"> 123 + <meta name="viewport" content="width=device-width, initial-scale=1"> 124 + <title>${title}</title> 125 + <style> 126 + body { font-family: system-ui, sans-serif; max-width: 480px; margin: 80px auto; padding: 0 1rem; color: #333; } 127 + h1 { font-size: 1.5rem; } 128 + code { background: #f0f0f0; padding: 2px 6px; border-radius: 3px; } 129 + a { color: #0066cc; } 130 + </style> 131 + </head> 132 + <body> 133 + <h1>${title}</h1> 134 + <p>${body}</p> 135 + </body> 136 + </html>`; 137 + } 138 + 139 + export default { 140 + async fetch(request: Request, env: Env): Promise<Response> { 141 + const id = env.LINK_CACHE.idFromName("singleton"); 142 + const stub = env.LINK_CACHE.get(id); 143 + return stub.fetch(request); 144 + }, 145 + };
+13
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2022", 4 + "module": "ES2022", 5 + "moduleResolution": "bundler", 6 + "lib": ["ES2022"], 7 + "types": ["@cloudflare/workers-types"], 8 + "strict": true, 9 + "noEmit": true, 10 + "skipLibCheck": true 11 + }, 12 + "include": ["src"] 13 + }
+12
wrangler.toml
··· 1 + name = "golinks" 2 + main = "src/index.ts" 3 + compatibility_date = "2024-12-01" 4 + 5 + [durable_objects] 6 + bindings = [ 7 + { name = "LINK_CACHE", class_name = "LinkCache" } 8 + ] 9 + 10 + [[migrations]] 11 + tag = "v1" 12 + new_classes = ["LinkCache"]