Figuring this shit out
0
fork

Configure Feed

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

chore: initialize atproto guestbook project scaffold

aria b8e5cab3

+1033
+144
.gitignore
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + lerna-debug.log* 8 + 9 + # Diagnostic reports (https://nodejs.org/api/report.html) 10 + report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 + 12 + # Runtime data 13 + pids 14 + *.pid 15 + *.seed 16 + *.pid.lock 17 + 18 + # Directory for instrumented libs generated by jscoverage/JSCover 19 + lib-cov 20 + 21 + # Coverage directory used by tools like istanbul 22 + coverage 23 + *.lcov 24 + 25 + # nyc test coverage 26 + .nyc_output 27 + 28 + # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 + .grunt 30 + 31 + # Bower dependency directory (https://bower.io/) 32 + bower_components 33 + 34 + # node-waf configuration 35 + .lock-wscript 36 + 37 + # Compiled binary addons (https://nodejs.org/api/addons.html) 38 + build/Release 39 + 40 + # Dependency directories 41 + node_modules/ 42 + jspm_packages/ 43 + 44 + # Snowpack dependency directory (https://snowpack.dev/) 45 + web_modules/ 46 + 47 + # TypeScript cache 48 + *.tsbuildinfo 49 + 50 + # Optional npm cache directory 51 + .npm 52 + 53 + # Optional eslint cache 54 + .eslintcache 55 + 56 + # Optional stylelint cache 57 + .stylelintcache 58 + 59 + # Optional REPL history 60 + .node_repl_history 61 + 62 + # Output of 'npm pack' 63 + *.tgz 64 + 65 + # Yarn Integrity file 66 + .yarn-integrity 67 + 68 + # dotenv environment variable files 69 + .env 70 + .env.* 71 + !.env.example 72 + 73 + # parcel-bundler cache (https://parceljs.org/) 74 + .cache 75 + .parcel-cache 76 + 77 + # Next.js build output 78 + .next 79 + out 80 + 81 + # Nuxt.js build / generate output 82 + .nuxt 83 + dist 84 + .output 85 + 86 + # Gatsby files 87 + .cache/ 88 + # Comment in the public line in if your project uses Gatsby and not Next.js 89 + # https://nextjs.org/blog/next-9-1#public-directory-support 90 + # public 91 + 92 + # vuepress build output 93 + .vuepress/dist 94 + 95 + # vuepress v2.x temp and cache directory 96 + .temp 97 + .cache 98 + 99 + # Sveltekit cache directory 100 + .svelte-kit/ 101 + 102 + # vitepress build output 103 + **/.vitepress/dist 104 + 105 + # vitepress cache directory 106 + **/.vitepress/cache 107 + 108 + # Docusaurus cache and generated files 109 + .docusaurus 110 + 111 + # Serverless directories 112 + .serverless/ 113 + 114 + # FuseBox cache 115 + .fusebox/ 116 + 117 + # DynamoDB Local files 118 + .dynamodb/ 119 + 120 + # Firebase cache directory 121 + .firebase/ 122 + 123 + # TernJS port file 124 + .tern-port 125 + 126 + # Stores VSCode versions used for testing VSCode extensions 127 + .vscode-test 128 + 129 + # pnpm 130 + .pnpm-store 131 + 132 + # yarn v3 133 + .pnp.* 134 + .yarn/* 135 + !.yarn/patches 136 + !.yarn/plugins 137 + !.yarn/releases 138 + !.yarn/sdks 139 + !.yarn/versions 140 + 141 + # Vite files 142 + vite.config.js.timestamp-* 143 + vite.config.ts.timestamp-* 144 + .vite/
+19
package.json
··· 1 + { 2 + "name": "atproto-guestbook", 3 + "version": "1.0.0", 4 + "type": "module", 5 + "scripts": { 6 + "dev": "tsx watch src/index.ts" 7 + }, 8 + "dependencies": { 9 + "hono": "^4.7.0", 10 + "@hono/node-server": "^1.13.0", 11 + "better-sqlite3": "^11.0.0" 12 + }, 13 + "devDependencies": { 14 + "typescript": "^5.7.0", 15 + "tsx": "^4.19.0", 16 + "@types/better-sqlite3": "^7.6.0", 17 + "@types/node": "^22.0.0" 18 + } 19 + }
+647
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@hono/node-server': 12 + specifier: ^1.13.0 13 + version: 1.19.11(hono@4.12.5) 14 + better-sqlite3: 15 + specifier: ^11.0.0 16 + version: 11.10.0 17 + hono: 18 + specifier: ^4.7.0 19 + version: 4.12.5 20 + devDependencies: 21 + '@types/better-sqlite3': 22 + specifier: ^7.6.0 23 + version: 7.6.13 24 + '@types/node': 25 + specifier: ^22.0.0 26 + version: 22.19.15 27 + tsx: 28 + specifier: ^4.19.0 29 + version: 4.21.0 30 + typescript: 31 + specifier: ^5.7.0 32 + version: 5.9.3 33 + 34 + packages: 35 + 36 + '@esbuild/aix-ppc64@0.27.3': 37 + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} 38 + engines: {node: '>=18'} 39 + cpu: [ppc64] 40 + os: [aix] 41 + 42 + '@esbuild/android-arm64@0.27.3': 43 + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} 44 + engines: {node: '>=18'} 45 + cpu: [arm64] 46 + os: [android] 47 + 48 + '@esbuild/android-arm@0.27.3': 49 + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} 50 + engines: {node: '>=18'} 51 + cpu: [arm] 52 + os: [android] 53 + 54 + '@esbuild/android-x64@0.27.3': 55 + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} 56 + engines: {node: '>=18'} 57 + cpu: [x64] 58 + os: [android] 59 + 60 + '@esbuild/darwin-arm64@0.27.3': 61 + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} 62 + engines: {node: '>=18'} 63 + cpu: [arm64] 64 + os: [darwin] 65 + 66 + '@esbuild/darwin-x64@0.27.3': 67 + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} 68 + engines: {node: '>=18'} 69 + cpu: [x64] 70 + os: [darwin] 71 + 72 + '@esbuild/freebsd-arm64@0.27.3': 73 + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} 74 + engines: {node: '>=18'} 75 + cpu: [arm64] 76 + os: [freebsd] 77 + 78 + '@esbuild/freebsd-x64@0.27.3': 79 + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} 80 + engines: {node: '>=18'} 81 + cpu: [x64] 82 + os: [freebsd] 83 + 84 + '@esbuild/linux-arm64@0.27.3': 85 + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} 86 + engines: {node: '>=18'} 87 + cpu: [arm64] 88 + os: [linux] 89 + 90 + '@esbuild/linux-arm@0.27.3': 91 + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} 92 + engines: {node: '>=18'} 93 + cpu: [arm] 94 + os: [linux] 95 + 96 + '@esbuild/linux-ia32@0.27.3': 97 + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} 98 + engines: {node: '>=18'} 99 + cpu: [ia32] 100 + os: [linux] 101 + 102 + '@esbuild/linux-loong64@0.27.3': 103 + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} 104 + engines: {node: '>=18'} 105 + cpu: [loong64] 106 + os: [linux] 107 + 108 + '@esbuild/linux-mips64el@0.27.3': 109 + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} 110 + engines: {node: '>=18'} 111 + cpu: [mips64el] 112 + os: [linux] 113 + 114 + '@esbuild/linux-ppc64@0.27.3': 115 + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} 116 + engines: {node: '>=18'} 117 + cpu: [ppc64] 118 + os: [linux] 119 + 120 + '@esbuild/linux-riscv64@0.27.3': 121 + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} 122 + engines: {node: '>=18'} 123 + cpu: [riscv64] 124 + os: [linux] 125 + 126 + '@esbuild/linux-s390x@0.27.3': 127 + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} 128 + engines: {node: '>=18'} 129 + cpu: [s390x] 130 + os: [linux] 131 + 132 + '@esbuild/linux-x64@0.27.3': 133 + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} 134 + engines: {node: '>=18'} 135 + cpu: [x64] 136 + os: [linux] 137 + 138 + '@esbuild/netbsd-arm64@0.27.3': 139 + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} 140 + engines: {node: '>=18'} 141 + cpu: [arm64] 142 + os: [netbsd] 143 + 144 + '@esbuild/netbsd-x64@0.27.3': 145 + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} 146 + engines: {node: '>=18'} 147 + cpu: [x64] 148 + os: [netbsd] 149 + 150 + '@esbuild/openbsd-arm64@0.27.3': 151 + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} 152 + engines: {node: '>=18'} 153 + cpu: [arm64] 154 + os: [openbsd] 155 + 156 + '@esbuild/openbsd-x64@0.27.3': 157 + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} 158 + engines: {node: '>=18'} 159 + cpu: [x64] 160 + os: [openbsd] 161 + 162 + '@esbuild/openharmony-arm64@0.27.3': 163 + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} 164 + engines: {node: '>=18'} 165 + cpu: [arm64] 166 + os: [openharmony] 167 + 168 + '@esbuild/sunos-x64@0.27.3': 169 + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} 170 + engines: {node: '>=18'} 171 + cpu: [x64] 172 + os: [sunos] 173 + 174 + '@esbuild/win32-arm64@0.27.3': 175 + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} 176 + engines: {node: '>=18'} 177 + cpu: [arm64] 178 + os: [win32] 179 + 180 + '@esbuild/win32-ia32@0.27.3': 181 + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} 182 + engines: {node: '>=18'} 183 + cpu: [ia32] 184 + os: [win32] 185 + 186 + '@esbuild/win32-x64@0.27.3': 187 + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} 188 + engines: {node: '>=18'} 189 + cpu: [x64] 190 + os: [win32] 191 + 192 + '@hono/node-server@1.19.11': 193 + resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} 194 + engines: {node: '>=18.14.1'} 195 + peerDependencies: 196 + hono: ^4 197 + 198 + '@types/better-sqlite3@7.6.13': 199 + resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} 200 + 201 + '@types/node@22.19.15': 202 + resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} 203 + 204 + base64-js@1.5.1: 205 + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 206 + 207 + better-sqlite3@11.10.0: 208 + resolution: {integrity: sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==} 209 + 210 + bindings@1.5.0: 211 + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 212 + 213 + bl@4.1.0: 214 + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 215 + 216 + buffer@5.7.1: 217 + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 218 + 219 + chownr@1.1.4: 220 + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 221 + 222 + decompress-response@6.0.0: 223 + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 224 + engines: {node: '>=10'} 225 + 226 + deep-extend@0.6.0: 227 + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 228 + engines: {node: '>=4.0.0'} 229 + 230 + detect-libc@2.1.2: 231 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 232 + engines: {node: '>=8'} 233 + 234 + end-of-stream@1.4.5: 235 + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} 236 + 237 + esbuild@0.27.3: 238 + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} 239 + engines: {node: '>=18'} 240 + hasBin: true 241 + 242 + expand-template@2.0.3: 243 + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 244 + engines: {node: '>=6'} 245 + 246 + file-uri-to-path@1.0.0: 247 + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 248 + 249 + fs-constants@1.0.0: 250 + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 251 + 252 + fsevents@2.3.3: 253 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 254 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 255 + os: [darwin] 256 + 257 + get-tsconfig@4.13.6: 258 + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} 259 + 260 + github-from-package@0.0.0: 261 + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} 262 + 263 + hono@4.12.5: 264 + resolution: {integrity: sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==} 265 + engines: {node: '>=16.9.0'} 266 + 267 + ieee754@1.2.1: 268 + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 269 + 270 + inherits@2.0.4: 271 + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 272 + 273 + ini@1.3.8: 274 + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 275 + 276 + mimic-response@3.1.0: 277 + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 278 + engines: {node: '>=10'} 279 + 280 + minimist@1.2.8: 281 + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 282 + 283 + mkdirp-classic@0.5.3: 284 + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 285 + 286 + napi-build-utils@2.0.0: 287 + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} 288 + 289 + node-abi@3.87.0: 290 + resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} 291 + engines: {node: '>=10'} 292 + 293 + once@1.4.0: 294 + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 295 + 296 + prebuild-install@7.1.3: 297 + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} 298 + engines: {node: '>=10'} 299 + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. 300 + hasBin: true 301 + 302 + pump@3.0.4: 303 + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} 304 + 305 + rc@1.2.8: 306 + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 307 + hasBin: true 308 + 309 + readable-stream@3.6.2: 310 + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 311 + engines: {node: '>= 6'} 312 + 313 + resolve-pkg-maps@1.0.0: 314 + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 315 + 316 + safe-buffer@5.2.1: 317 + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 318 + 319 + semver@7.7.4: 320 + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} 321 + engines: {node: '>=10'} 322 + hasBin: true 323 + 324 + simple-concat@1.0.1: 325 + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 326 + 327 + simple-get@4.0.1: 328 + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} 329 + 330 + string_decoder@1.3.0: 331 + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 332 + 333 + strip-json-comments@2.0.1: 334 + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 335 + engines: {node: '>=0.10.0'} 336 + 337 + tar-fs@2.1.4: 338 + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} 339 + 340 + tar-stream@2.2.0: 341 + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 342 + engines: {node: '>=6'} 343 + 344 + tsx@4.21.0: 345 + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} 346 + engines: {node: '>=18.0.0'} 347 + hasBin: true 348 + 349 + tunnel-agent@0.6.0: 350 + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 351 + 352 + typescript@5.9.3: 353 + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 354 + engines: {node: '>=14.17'} 355 + hasBin: true 356 + 357 + undici-types@6.21.0: 358 + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 359 + 360 + util-deprecate@1.0.2: 361 + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 362 + 363 + wrappy@1.0.2: 364 + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 365 + 366 + snapshots: 367 + 368 + '@esbuild/aix-ppc64@0.27.3': 369 + optional: true 370 + 371 + '@esbuild/android-arm64@0.27.3': 372 + optional: true 373 + 374 + '@esbuild/android-arm@0.27.3': 375 + optional: true 376 + 377 + '@esbuild/android-x64@0.27.3': 378 + optional: true 379 + 380 + '@esbuild/darwin-arm64@0.27.3': 381 + optional: true 382 + 383 + '@esbuild/darwin-x64@0.27.3': 384 + optional: true 385 + 386 + '@esbuild/freebsd-arm64@0.27.3': 387 + optional: true 388 + 389 + '@esbuild/freebsd-x64@0.27.3': 390 + optional: true 391 + 392 + '@esbuild/linux-arm64@0.27.3': 393 + optional: true 394 + 395 + '@esbuild/linux-arm@0.27.3': 396 + optional: true 397 + 398 + '@esbuild/linux-ia32@0.27.3': 399 + optional: true 400 + 401 + '@esbuild/linux-loong64@0.27.3': 402 + optional: true 403 + 404 + '@esbuild/linux-mips64el@0.27.3': 405 + optional: true 406 + 407 + '@esbuild/linux-ppc64@0.27.3': 408 + optional: true 409 + 410 + '@esbuild/linux-riscv64@0.27.3': 411 + optional: true 412 + 413 + '@esbuild/linux-s390x@0.27.3': 414 + optional: true 415 + 416 + '@esbuild/linux-x64@0.27.3': 417 + optional: true 418 + 419 + '@esbuild/netbsd-arm64@0.27.3': 420 + optional: true 421 + 422 + '@esbuild/netbsd-x64@0.27.3': 423 + optional: true 424 + 425 + '@esbuild/openbsd-arm64@0.27.3': 426 + optional: true 427 + 428 + '@esbuild/openbsd-x64@0.27.3': 429 + optional: true 430 + 431 + '@esbuild/openharmony-arm64@0.27.3': 432 + optional: true 433 + 434 + '@esbuild/sunos-x64@0.27.3': 435 + optional: true 436 + 437 + '@esbuild/win32-arm64@0.27.3': 438 + optional: true 439 + 440 + '@esbuild/win32-ia32@0.27.3': 441 + optional: true 442 + 443 + '@esbuild/win32-x64@0.27.3': 444 + optional: true 445 + 446 + '@hono/node-server@1.19.11(hono@4.12.5)': 447 + dependencies: 448 + hono: 4.12.5 449 + 450 + '@types/better-sqlite3@7.6.13': 451 + dependencies: 452 + '@types/node': 22.19.15 453 + 454 + '@types/node@22.19.15': 455 + dependencies: 456 + undici-types: 6.21.0 457 + 458 + base64-js@1.5.1: {} 459 + 460 + better-sqlite3@11.10.0: 461 + dependencies: 462 + bindings: 1.5.0 463 + prebuild-install: 7.1.3 464 + 465 + bindings@1.5.0: 466 + dependencies: 467 + file-uri-to-path: 1.0.0 468 + 469 + bl@4.1.0: 470 + dependencies: 471 + buffer: 5.7.1 472 + inherits: 2.0.4 473 + readable-stream: 3.6.2 474 + 475 + buffer@5.7.1: 476 + dependencies: 477 + base64-js: 1.5.1 478 + ieee754: 1.2.1 479 + 480 + chownr@1.1.4: {} 481 + 482 + decompress-response@6.0.0: 483 + dependencies: 484 + mimic-response: 3.1.0 485 + 486 + deep-extend@0.6.0: {} 487 + 488 + detect-libc@2.1.2: {} 489 + 490 + end-of-stream@1.4.5: 491 + dependencies: 492 + once: 1.4.0 493 + 494 + esbuild@0.27.3: 495 + optionalDependencies: 496 + '@esbuild/aix-ppc64': 0.27.3 497 + '@esbuild/android-arm': 0.27.3 498 + '@esbuild/android-arm64': 0.27.3 499 + '@esbuild/android-x64': 0.27.3 500 + '@esbuild/darwin-arm64': 0.27.3 501 + '@esbuild/darwin-x64': 0.27.3 502 + '@esbuild/freebsd-arm64': 0.27.3 503 + '@esbuild/freebsd-x64': 0.27.3 504 + '@esbuild/linux-arm': 0.27.3 505 + '@esbuild/linux-arm64': 0.27.3 506 + '@esbuild/linux-ia32': 0.27.3 507 + '@esbuild/linux-loong64': 0.27.3 508 + '@esbuild/linux-mips64el': 0.27.3 509 + '@esbuild/linux-ppc64': 0.27.3 510 + '@esbuild/linux-riscv64': 0.27.3 511 + '@esbuild/linux-s390x': 0.27.3 512 + '@esbuild/linux-x64': 0.27.3 513 + '@esbuild/netbsd-arm64': 0.27.3 514 + '@esbuild/netbsd-x64': 0.27.3 515 + '@esbuild/openbsd-arm64': 0.27.3 516 + '@esbuild/openbsd-x64': 0.27.3 517 + '@esbuild/openharmony-arm64': 0.27.3 518 + '@esbuild/sunos-x64': 0.27.3 519 + '@esbuild/win32-arm64': 0.27.3 520 + '@esbuild/win32-ia32': 0.27.3 521 + '@esbuild/win32-x64': 0.27.3 522 + 523 + expand-template@2.0.3: {} 524 + 525 + file-uri-to-path@1.0.0: {} 526 + 527 + fs-constants@1.0.0: {} 528 + 529 + fsevents@2.3.3: 530 + optional: true 531 + 532 + get-tsconfig@4.13.6: 533 + dependencies: 534 + resolve-pkg-maps: 1.0.0 535 + 536 + github-from-package@0.0.0: {} 537 + 538 + hono@4.12.5: {} 539 + 540 + ieee754@1.2.1: {} 541 + 542 + inherits@2.0.4: {} 543 + 544 + ini@1.3.8: {} 545 + 546 + mimic-response@3.1.0: {} 547 + 548 + minimist@1.2.8: {} 549 + 550 + mkdirp-classic@0.5.3: {} 551 + 552 + napi-build-utils@2.0.0: {} 553 + 554 + node-abi@3.87.0: 555 + dependencies: 556 + semver: 7.7.4 557 + 558 + once@1.4.0: 559 + dependencies: 560 + wrappy: 1.0.2 561 + 562 + prebuild-install@7.1.3: 563 + dependencies: 564 + detect-libc: 2.1.2 565 + expand-template: 2.0.3 566 + github-from-package: 0.0.0 567 + minimist: 1.2.8 568 + mkdirp-classic: 0.5.3 569 + napi-build-utils: 2.0.0 570 + node-abi: 3.87.0 571 + pump: 3.0.4 572 + rc: 1.2.8 573 + simple-get: 4.0.1 574 + tar-fs: 2.1.4 575 + tunnel-agent: 0.6.0 576 + 577 + pump@3.0.4: 578 + dependencies: 579 + end-of-stream: 1.4.5 580 + once: 1.4.0 581 + 582 + rc@1.2.8: 583 + dependencies: 584 + deep-extend: 0.6.0 585 + ini: 1.3.8 586 + minimist: 1.2.8 587 + strip-json-comments: 2.0.1 588 + 589 + readable-stream@3.6.2: 590 + dependencies: 591 + inherits: 2.0.4 592 + string_decoder: 1.3.0 593 + util-deprecate: 1.0.2 594 + 595 + resolve-pkg-maps@1.0.0: {} 596 + 597 + safe-buffer@5.2.1: {} 598 + 599 + semver@7.7.4: {} 600 + 601 + simple-concat@1.0.1: {} 602 + 603 + simple-get@4.0.1: 604 + dependencies: 605 + decompress-response: 6.0.0 606 + once: 1.4.0 607 + simple-concat: 1.0.1 608 + 609 + string_decoder@1.3.0: 610 + dependencies: 611 + safe-buffer: 5.2.1 612 + 613 + strip-json-comments@2.0.1: {} 614 + 615 + tar-fs@2.1.4: 616 + dependencies: 617 + chownr: 1.1.4 618 + mkdirp-classic: 0.5.3 619 + pump: 3.0.4 620 + tar-stream: 2.2.0 621 + 622 + tar-stream@2.2.0: 623 + dependencies: 624 + bl: 4.1.0 625 + end-of-stream: 1.4.5 626 + fs-constants: 1.0.0 627 + inherits: 2.0.4 628 + readable-stream: 3.6.2 629 + 630 + tsx@4.21.0: 631 + dependencies: 632 + esbuild: 0.27.3 633 + get-tsconfig: 4.13.6 634 + optionalDependencies: 635 + fsevents: 2.3.3 636 + 637 + tunnel-agent@0.6.0: 638 + dependencies: 639 + safe-buffer: 5.2.1 640 + 641 + typescript@5.9.3: {} 642 + 643 + undici-types@6.21.0: {} 644 + 645 + util-deprecate@1.0.2: {} 646 + 647 + wrappy@1.0.2: {}
+34
src/index.ts
··· 1 + import { serve } from "@hono/node-server"; 2 + import { Hono } from "hono"; 3 + import { readFileSync } from "node:fs"; 4 + import { resolve, dirname } from "node:path"; 5 + import { fileURLToPath } from "node:url"; 6 + 7 + // In ESM (ES Modules), __dirname doesn't exist like it does in CommonJS. 8 + // This is a common pattern you'll see everywhere — it reconstructs __dirname 9 + // from import.meta.url. Think of it like std::env::current_dir() in Rust. 10 + const __dirname = dirname(fileURLToPath(import.meta.url)); 11 + 12 + const app = new Hono(); 13 + 14 + // Serve the main page 15 + // Hono uses a similar pattern to Rust frameworks like Axum: 16 + // app.get("/path", handlerFunction) 17 + // The `c` parameter is the "Context" — it holds the request and 18 + // gives you methods to build responses. Similar to how Axum handlers 19 + // receive extractors. 20 + app.get("/", (c) => { 21 + const html = readFileSync(resolve(__dirname, "public/index.html"), "utf-8"); 22 + return c.html(html); 23 + }); 24 + 25 + // A simple API route so you can see how JSON responses work. 26 + // We'll replace this with real guestbook routes later. 27 + app.get("/api/health", (c) => { 28 + return c.json({ status: "ok", timestamp: new Date().toISOString() }); 29 + }); 30 + 31 + // Start the server 32 + const port = 3000; 33 + console.log(`Guestbook server running at http://localhost:${port}`); 34 + serve({ fetch: app.fetch, port });
+176
src/public/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>AT Protocol Guestbook</title> 7 + <style> 8 + /* Keeping styles minimal and inline for now. 9 + No build tools, no CSS frameworks — just plain CSS. */ 10 + * { margin: 0; padding: 0; box-sizing: border-box; } 11 + 12 + body { 13 + font-family: system-ui, -apple-system, sans-serif; 14 + max-width: 640px; 15 + margin: 0 auto; 16 + padding: 2rem 1rem; 17 + background: #fafafa; 18 + color: #1a1a1a; 19 + } 20 + 21 + h1 { margin-bottom: 0.5rem; } 22 + 23 + .subtitle { 24 + color: #666; 25 + margin-bottom: 2rem; 26 + } 27 + 28 + .auth-section { 29 + background: white; 30 + border: 1px solid #e0e0e0; 31 + border-radius: 8px; 32 + padding: 1.5rem; 33 + margin-bottom: 2rem; 34 + } 35 + 36 + .auth-section input[type="text"] { 37 + padding: 0.5rem 0.75rem; 38 + border: 1px solid #ccc; 39 + border-radius: 4px; 40 + font-size: 1rem; 41 + width: 260px; 42 + } 43 + 44 + .auth-section button, .entry-form button { 45 + padding: 0.5rem 1rem; 46 + background: #0066ff; 47 + color: white; 48 + border: none; 49 + border-radius: 4px; 50 + font-size: 1rem; 51 + cursor: pointer; 52 + } 53 + 54 + .auth-section button:hover, .entry-form button:hover { 55 + background: #0052cc; 56 + } 57 + 58 + .entry-form { 59 + margin-bottom: 2rem; 60 + } 61 + 62 + .entry-form textarea { 63 + width: 100%; 64 + padding: 0.75rem; 65 + border: 1px solid #ccc; 66 + border-radius: 4px; 67 + font-size: 1rem; 68 + resize: vertical; 69 + min-height: 80px; 70 + margin-bottom: 0.5rem; 71 + } 72 + 73 + .entries { list-style: none; } 74 + 75 + .entries li { 76 + background: white; 77 + border: 1px solid #e0e0e0; 78 + border-radius: 8px; 79 + padding: 1rem 1.25rem; 80 + margin-bottom: 0.75rem; 81 + } 82 + 83 + .entry-handle { 84 + font-weight: 600; 85 + color: #0066ff; 86 + } 87 + 88 + .entry-date { 89 + color: #999; 90 + font-size: 0.85rem; 91 + margin-left: 0.5rem; 92 + } 93 + 94 + .entry-message { 95 + margin-top: 0.5rem; 96 + } 97 + 98 + #status { 99 + color: #666; 100 + font-style: italic; 101 + margin-top: 1rem; 102 + } 103 + </style> 104 + </head> 105 + <body> 106 + <h1>Guestbook</h1> 107 + <p class="subtitle">Sign in with your Bluesky handle to leave a message.</p> 108 + 109 + <!-- Auth section: shown when not logged in --> 110 + <div class="auth-section" id="auth-logged-out"> 111 + <input type="text" id="handle-input" placeholder="e.g. alice.bsky.social" /> 112 + <button onclick="handleLogin()">Sign In</button> 113 + </div> 114 + 115 + <!-- Auth section: shown when logged in --> 116 + <div class="auth-section" id="auth-logged-in" style="display: none;"> 117 + <span>Signed in as <strong id="display-handle"></strong></span> 118 + <button onclick="handleLogout()" style="background: #666; margin-left: 1rem;">Sign Out</button> 119 + </div> 120 + 121 + <!-- New entry form: only visible when logged in --> 122 + <div class="entry-form" id="entry-form" style="display: none;"> 123 + <textarea id="message-input" placeholder="Leave a message..."></textarea> 124 + <button onclick="handleSubmit()">Post</button> 125 + </div> 126 + 127 + <!-- Guestbook entries --> 128 + <ul class="entries" id="entries-list"> 129 + <!-- Entries will be rendered here by JavaScript --> 130 + </ul> 131 + 132 + <p id="status">Loading entries...</p> 133 + 134 + <script> 135 + // ========================================================= 136 + // This is where our client-side logic will live. 137 + // For now, it's just placeholder functions so the page 138 + // doesn't throw errors when you click buttons. 139 + // 140 + // We'll fill these in as we build out the server routes. 141 + // ========================================================= 142 + 143 + async function loadEntries() { 144 + // TODO: fetch entries from GET /api/entries 145 + document.getElementById("status").textContent = 146 + "No entries yet. Be the first to sign!"; 147 + } 148 + 149 + function handleLogin() { 150 + const handle = document.getElementById("handle-input").value.trim(); 151 + if (!handle) return; 152 + 153 + // TODO: redirect to our server's OAuth start endpoint 154 + // For now, just log it so we can confirm the UI works 155 + console.log("Login requested for handle:", handle); 156 + alert("OAuth not wired up yet! Handle: " + handle); 157 + } 158 + 159 + function handleLogout() { 160 + // TODO: call POST /api/auth/logout 161 + console.log("Logout requested"); 162 + } 163 + 164 + async function handleSubmit() { 165 + const message = document.getElementById("message-input").value.trim(); 166 + if (!message) return; 167 + 168 + // TODO: call POST /api/entries with the message 169 + console.log("Submit entry:", message); 170 + } 171 + 172 + // Load entries when the page loads 173 + loadEntries(); 174 + </script> 175 + </body> 176 + </html>
+13
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "ES2022", 4 + "module": "ES2022", 5 + "moduleResolution": "bundler", 6 + "esModuleInterop": true, 7 + "strict": true, 8 + "outDir": "dist", 9 + "rootDir": "src", 10 + "skipLibCheck": true 11 + }, 12 + "include": ["src/**/*"] 13 + }