A social knowledge tool for researchers built on ATProto

fly.io boilderplate deploy scripts

+6
.dockerignore
··· 1 + /.git 2 + /node_modules 3 + .dockerignore 4 + .env 5 + Dockerfile 6 + fly.toml
+18
.github/workflows/fly-deploy.yml
··· 1 + # See https://fly.io/docs/app-guides/continuous-deployment-with-github-actions/ 2 + 3 + name: Fly Deploy 4 + on: 5 + push: 6 + branches: 7 + - main 8 + jobs: 9 + deploy: 10 + name: Deploy app 11 + runs-on: ubuntu-latest 12 + concurrency: deploy-group # optional: ensure only one action runs at a time 13 + steps: 14 + - uses: actions/checkout@v4 15 + - uses: superfly/flyctl-actions/setup-flyctl@master 16 + - run: flyctl deploy --remote-only 17 + env: 18 + FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
+45
Dockerfile
··· 1 + # syntax = docker/dockerfile:1 2 + 3 + # Adjust NODE_VERSION as desired 4 + ARG NODE_VERSION=18.18.2 5 + FROM node:${NODE_VERSION}-slim AS base 6 + 7 + LABEL fly_launch_runtime="Node.js" 8 + 9 + # Node.js app lives here 10 + WORKDIR /app 11 + 12 + # Set production environment 13 + ENV NODE_ENV="production" 14 + 15 + 16 + # Throw-away build stage to reduce size of final image 17 + FROM base AS build 18 + 19 + # Install packages needed to build node modules 20 + RUN apt-get update -qq && \ 21 + apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3 22 + 23 + # Install node modules 24 + COPY package-lock.json package.json ./ 25 + RUN npm ci --include=dev 26 + 27 + # Copy application code 28 + COPY . . 29 + 30 + # Build application 31 + RUN npm run build 32 + 33 + # Remove development dependencies 34 + RUN npm prune --omit=dev 35 + 36 + 37 + # Final stage for app image 38 + FROM base 39 + 40 + # Copy built application 41 + COPY --from=build /app /app 42 + 43 + # Start the server by default, this can be overwritten at runtime 44 + EXPOSE 3000 45 + CMD [ "node", "index.js" ]
+22
fly.toml
··· 1 + # fly.toml app configuration file generated for annos on 2025-05-13T18:45:49-07:00 2 + # 3 + # See https://fly.io/docs/reference/configuration/ for information about how to use this file. 4 + # 5 + 6 + app = 'annos' 7 + primary_region = 'sea' 8 + 9 + [build] 10 + 11 + [http_service] 12 + internal_port = 3000 13 + force_https = true 14 + auto_stop_machines = 'stop' 15 + auto_start_machines = true 16 + min_machines_running = 0 17 + processes = ['app'] 18 + 19 + [[vm]] 20 + memory = '1gb' 21 + cpu_kind = 'shared' 22 + cpus = 1
+490
package-lock.json
··· 25 25 }, 26 26 "devDependencies": { 27 27 "@atproto/lex-cli": "^0.8.0", 28 + "@flydotio/dockerfile": "^0.7.10", 28 29 "@testcontainers/postgresql": "^10.24.2", 29 30 "@types/express": "^5.0.1", 30 31 "@types/jest": "^29.5.14", ··· 2039 2040 "node": ">=14" 2040 2041 } 2041 2042 }, 2043 + "node_modules/@flydotio/dockerfile": { 2044 + "version": "0.7.10", 2045 + "resolved": "https://registry.npmjs.org/@flydotio/dockerfile/-/dockerfile-0.7.10.tgz", 2046 + "integrity": "sha512-dTXqBjCl7nFmnhlyeDjjPtX+sdfYBWFH9PUKNqAYttvBiczKcYXxr7/0A0wZ+g1FB1tmMzsOzedgr6xap/AB9g==", 2047 + "dev": true, 2048 + "dependencies": { 2049 + "chalk": "^5.4.1", 2050 + "diff": "^7.0.0", 2051 + "ejs": "^3.1.10", 2052 + "inquirer": "^12.4.1", 2053 + "shell-quote": "^1.8.2", 2054 + "yargs": "^17.7.2" 2055 + }, 2056 + "bin": { 2057 + "dockerfile": "index.js" 2058 + }, 2059 + "engines": { 2060 + "node": ">=16.0.0" 2061 + } 2062 + }, 2063 + "node_modules/@flydotio/dockerfile/node_modules/chalk": { 2064 + "version": "5.4.1", 2065 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", 2066 + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", 2067 + "dev": true, 2068 + "engines": { 2069 + "node": "^12.17.0 || ^14.13 || >=16.0.0" 2070 + }, 2071 + "funding": { 2072 + "url": "https://github.com/chalk/chalk?sponsor=1" 2073 + } 2074 + }, 2042 2075 "node_modules/@grpc/grpc-js": { 2043 2076 "version": "1.13.3", 2044 2077 "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz", ··· 2070 2103 "node": ">=6" 2071 2104 } 2072 2105 }, 2106 + "node_modules/@inquirer/checkbox": { 2107 + "version": "4.1.6", 2108 + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.6.tgz", 2109 + "integrity": "sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==", 2110 + "dev": true, 2111 + "dependencies": { 2112 + "@inquirer/core": "^10.1.11", 2113 + "@inquirer/figures": "^1.0.11", 2114 + "@inquirer/type": "^3.0.6", 2115 + "ansi-escapes": "^4.3.2", 2116 + "yoctocolors-cjs": "^2.1.2" 2117 + }, 2118 + "engines": { 2119 + "node": ">=18" 2120 + }, 2121 + "peerDependencies": { 2122 + "@types/node": ">=18" 2123 + }, 2124 + "peerDependenciesMeta": { 2125 + "@types/node": { 2126 + "optional": true 2127 + } 2128 + } 2129 + }, 2130 + "node_modules/@inquirer/confirm": { 2131 + "version": "5.1.10", 2132 + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz", 2133 + "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==", 2134 + "dev": true, 2135 + "dependencies": { 2136 + "@inquirer/core": "^10.1.11", 2137 + "@inquirer/type": "^3.0.6" 2138 + }, 2139 + "engines": { 2140 + "node": ">=18" 2141 + }, 2142 + "peerDependencies": { 2143 + "@types/node": ">=18" 2144 + }, 2145 + "peerDependenciesMeta": { 2146 + "@types/node": { 2147 + "optional": true 2148 + } 2149 + } 2150 + }, 2151 + "node_modules/@inquirer/core": { 2152 + "version": "10.1.11", 2153 + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.11.tgz", 2154 + "integrity": "sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==", 2155 + "dev": true, 2156 + "dependencies": { 2157 + "@inquirer/figures": "^1.0.11", 2158 + "@inquirer/type": "^3.0.6", 2159 + "ansi-escapes": "^4.3.2", 2160 + "cli-width": "^4.1.0", 2161 + "mute-stream": "^2.0.0", 2162 + "signal-exit": "^4.1.0", 2163 + "wrap-ansi": "^6.2.0", 2164 + "yoctocolors-cjs": "^2.1.2" 2165 + }, 2166 + "engines": { 2167 + "node": ">=18" 2168 + }, 2169 + "peerDependencies": { 2170 + "@types/node": ">=18" 2171 + }, 2172 + "peerDependenciesMeta": { 2173 + "@types/node": { 2174 + "optional": true 2175 + } 2176 + } 2177 + }, 2178 + "node_modules/@inquirer/core/node_modules/signal-exit": { 2179 + "version": "4.1.0", 2180 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2181 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2182 + "dev": true, 2183 + "engines": { 2184 + "node": ">=14" 2185 + }, 2186 + "funding": { 2187 + "url": "https://github.com/sponsors/isaacs" 2188 + } 2189 + }, 2190 + "node_modules/@inquirer/core/node_modules/wrap-ansi": { 2191 + "version": "6.2.0", 2192 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2193 + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2194 + "dev": true, 2195 + "dependencies": { 2196 + "ansi-styles": "^4.0.0", 2197 + "string-width": "^4.1.0", 2198 + "strip-ansi": "^6.0.0" 2199 + }, 2200 + "engines": { 2201 + "node": ">=8" 2202 + } 2203 + }, 2204 + "node_modules/@inquirer/editor": { 2205 + "version": "4.2.11", 2206 + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.11.tgz", 2207 + "integrity": "sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==", 2208 + "dev": true, 2209 + "dependencies": { 2210 + "@inquirer/core": "^10.1.11", 2211 + "@inquirer/type": "^3.0.6", 2212 + "external-editor": "^3.1.0" 2213 + }, 2214 + "engines": { 2215 + "node": ">=18" 2216 + }, 2217 + "peerDependencies": { 2218 + "@types/node": ">=18" 2219 + }, 2220 + "peerDependenciesMeta": { 2221 + "@types/node": { 2222 + "optional": true 2223 + } 2224 + } 2225 + }, 2226 + "node_modules/@inquirer/expand": { 2227 + "version": "4.0.13", 2228 + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.13.tgz", 2229 + "integrity": "sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==", 2230 + "dev": true, 2231 + "dependencies": { 2232 + "@inquirer/core": "^10.1.11", 2233 + "@inquirer/type": "^3.0.6", 2234 + "yoctocolors-cjs": "^2.1.2" 2235 + }, 2236 + "engines": { 2237 + "node": ">=18" 2238 + }, 2239 + "peerDependencies": { 2240 + "@types/node": ">=18" 2241 + }, 2242 + "peerDependenciesMeta": { 2243 + "@types/node": { 2244 + "optional": true 2245 + } 2246 + } 2247 + }, 2248 + "node_modules/@inquirer/figures": { 2249 + "version": "1.0.11", 2250 + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", 2251 + "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", 2252 + "dev": true, 2253 + "engines": { 2254 + "node": ">=18" 2255 + } 2256 + }, 2257 + "node_modules/@inquirer/input": { 2258 + "version": "4.1.10", 2259 + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.10.tgz", 2260 + "integrity": "sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==", 2261 + "dev": true, 2262 + "dependencies": { 2263 + "@inquirer/core": "^10.1.11", 2264 + "@inquirer/type": "^3.0.6" 2265 + }, 2266 + "engines": { 2267 + "node": ">=18" 2268 + }, 2269 + "peerDependencies": { 2270 + "@types/node": ">=18" 2271 + }, 2272 + "peerDependenciesMeta": { 2273 + "@types/node": { 2274 + "optional": true 2275 + } 2276 + } 2277 + }, 2278 + "node_modules/@inquirer/number": { 2279 + "version": "3.0.13", 2280 + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.13.tgz", 2281 + "integrity": "sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==", 2282 + "dev": true, 2283 + "dependencies": { 2284 + "@inquirer/core": "^10.1.11", 2285 + "@inquirer/type": "^3.0.6" 2286 + }, 2287 + "engines": { 2288 + "node": ">=18" 2289 + }, 2290 + "peerDependencies": { 2291 + "@types/node": ">=18" 2292 + }, 2293 + "peerDependenciesMeta": { 2294 + "@types/node": { 2295 + "optional": true 2296 + } 2297 + } 2298 + }, 2299 + "node_modules/@inquirer/password": { 2300 + "version": "4.0.13", 2301 + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.13.tgz", 2302 + "integrity": "sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==", 2303 + "dev": true, 2304 + "dependencies": { 2305 + "@inquirer/core": "^10.1.11", 2306 + "@inquirer/type": "^3.0.6", 2307 + "ansi-escapes": "^4.3.2" 2308 + }, 2309 + "engines": { 2310 + "node": ">=18" 2311 + }, 2312 + "peerDependencies": { 2313 + "@types/node": ">=18" 2314 + }, 2315 + "peerDependenciesMeta": { 2316 + "@types/node": { 2317 + "optional": true 2318 + } 2319 + } 2320 + }, 2321 + "node_modules/@inquirer/prompts": { 2322 + "version": "7.5.1", 2323 + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.1.tgz", 2324 + "integrity": "sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==", 2325 + "dev": true, 2326 + "dependencies": { 2327 + "@inquirer/checkbox": "^4.1.6", 2328 + "@inquirer/confirm": "^5.1.10", 2329 + "@inquirer/editor": "^4.2.11", 2330 + "@inquirer/expand": "^4.0.13", 2331 + "@inquirer/input": "^4.1.10", 2332 + "@inquirer/number": "^3.0.13", 2333 + "@inquirer/password": "^4.0.13", 2334 + "@inquirer/rawlist": "^4.1.1", 2335 + "@inquirer/search": "^3.0.13", 2336 + "@inquirer/select": "^4.2.1" 2337 + }, 2338 + "engines": { 2339 + "node": ">=18" 2340 + }, 2341 + "peerDependencies": { 2342 + "@types/node": ">=18" 2343 + }, 2344 + "peerDependenciesMeta": { 2345 + "@types/node": { 2346 + "optional": true 2347 + } 2348 + } 2349 + }, 2350 + "node_modules/@inquirer/rawlist": { 2351 + "version": "4.1.1", 2352 + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.1.tgz", 2353 + "integrity": "sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==", 2354 + "dev": true, 2355 + "dependencies": { 2356 + "@inquirer/core": "^10.1.11", 2357 + "@inquirer/type": "^3.0.6", 2358 + "yoctocolors-cjs": "^2.1.2" 2359 + }, 2360 + "engines": { 2361 + "node": ">=18" 2362 + }, 2363 + "peerDependencies": { 2364 + "@types/node": ">=18" 2365 + }, 2366 + "peerDependenciesMeta": { 2367 + "@types/node": { 2368 + "optional": true 2369 + } 2370 + } 2371 + }, 2372 + "node_modules/@inquirer/search": { 2373 + "version": "3.0.13", 2374 + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.13.tgz", 2375 + "integrity": "sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==", 2376 + "dev": true, 2377 + "dependencies": { 2378 + "@inquirer/core": "^10.1.11", 2379 + "@inquirer/figures": "^1.0.11", 2380 + "@inquirer/type": "^3.0.6", 2381 + "yoctocolors-cjs": "^2.1.2" 2382 + }, 2383 + "engines": { 2384 + "node": ">=18" 2385 + }, 2386 + "peerDependencies": { 2387 + "@types/node": ">=18" 2388 + }, 2389 + "peerDependenciesMeta": { 2390 + "@types/node": { 2391 + "optional": true 2392 + } 2393 + } 2394 + }, 2395 + "node_modules/@inquirer/select": { 2396 + "version": "4.2.1", 2397 + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.1.tgz", 2398 + "integrity": "sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==", 2399 + "dev": true, 2400 + "dependencies": { 2401 + "@inquirer/core": "^10.1.11", 2402 + "@inquirer/figures": "^1.0.11", 2403 + "@inquirer/type": "^3.0.6", 2404 + "ansi-escapes": "^4.3.2", 2405 + "yoctocolors-cjs": "^2.1.2" 2406 + }, 2407 + "engines": { 2408 + "node": ">=18" 2409 + }, 2410 + "peerDependencies": { 2411 + "@types/node": ">=18" 2412 + }, 2413 + "peerDependenciesMeta": { 2414 + "@types/node": { 2415 + "optional": true 2416 + } 2417 + } 2418 + }, 2419 + "node_modules/@inquirer/type": { 2420 + "version": "3.0.6", 2421 + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", 2422 + "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", 2423 + "dev": true, 2424 + "engines": { 2425 + "node": ">=18" 2426 + }, 2427 + "peerDependencies": { 2428 + "@types/node": ">=18" 2429 + }, 2430 + "peerDependenciesMeta": { 2431 + "@types/node": { 2432 + "optional": true 2433 + } 2434 + } 2435 + }, 2073 2436 "node_modules/@ipld/dag-cbor": { 2074 2437 "version": "7.0.3", 2075 2438 "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz", ··· 4177 4540 "node": ">=10" 4178 4541 } 4179 4542 }, 4543 + "node_modules/chardet": { 4544 + "version": "0.7.0", 4545 + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 4546 + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 4547 + "dev": true 4548 + }, 4180 4549 "node_modules/chokidar": { 4181 4550 "version": "4.0.3", 4182 4551 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", ··· 4218 4587 "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", 4219 4588 "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", 4220 4589 "dev": true 4590 + }, 4591 + "node_modules/cli-width": { 4592 + "version": "4.1.0", 4593 + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", 4594 + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", 4595 + "dev": true, 4596 + "engines": { 4597 + "node": ">= 12" 4598 + } 4221 4599 }, 4222 4600 "node_modules/cliui": { 4223 4601 "version": "8.0.1", ··· 4593 4971 "dependencies": { 4594 4972 "asap": "^2.0.0", 4595 4973 "wrappy": "1" 4974 + } 4975 + }, 4976 + "node_modules/diff": { 4977 + "version": "7.0.0", 4978 + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", 4979 + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", 4980 + "dev": true, 4981 + "engines": { 4982 + "node": ">=0.3.1" 4596 4983 } 4597 4984 }, 4598 4985 "node_modules/diff-sequences": { ··· 5229 5616 "node": ">= 0.6" 5230 5617 } 5231 5618 }, 5619 + "node_modules/external-editor": { 5620 + "version": "3.1.0", 5621 + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 5622 + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 5623 + "dev": true, 5624 + "dependencies": { 5625 + "chardet": "^0.7.0", 5626 + "iconv-lite": "^0.4.24", 5627 + "tmp": "^0.0.33" 5628 + }, 5629 + "engines": { 5630 + "node": ">=4" 5631 + } 5632 + }, 5633 + "node_modules/external-editor/node_modules/iconv-lite": { 5634 + "version": "0.4.24", 5635 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 5636 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 5637 + "dev": true, 5638 + "dependencies": { 5639 + "safer-buffer": ">= 2.1.2 < 3" 5640 + }, 5641 + "engines": { 5642 + "node": ">=0.10.0" 5643 + } 5644 + }, 5645 + "node_modules/external-editor/node_modules/tmp": { 5646 + "version": "0.0.33", 5647 + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 5648 + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 5649 + "dev": true, 5650 + "dependencies": { 5651 + "os-tmpdir": "~1.0.2" 5652 + }, 5653 + "engines": { 5654 + "node": ">=0.6.0" 5655 + } 5656 + }, 5232 5657 "node_modules/fast-fifo": { 5233 5658 "version": "1.3.2", 5234 5659 "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", ··· 5745 6170 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 5746 6171 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 5747 6172 }, 6173 + "node_modules/inquirer": { 6174 + "version": "12.6.1", 6175 + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.6.1.tgz", 6176 + "integrity": "sha512-MGFnzHVS3l3oM3cy+LWkyR7UUtVEn3D5U41CZbEY34szToWoJAvaVtCTz1mxsEzZFk/HXWyCArn0HDgloTXMDw==", 6177 + "dev": true, 6178 + "dependencies": { 6179 + "@inquirer/core": "^10.1.11", 6180 + "@inquirer/prompts": "^7.5.1", 6181 + "@inquirer/type": "^3.0.6", 6182 + "ansi-escapes": "^4.3.2", 6183 + "mute-stream": "^2.0.0", 6184 + "run-async": "^3.0.0", 6185 + "rxjs": "^7.8.2" 6186 + }, 6187 + "engines": { 6188 + "node": ">=18" 6189 + }, 6190 + "peerDependencies": { 6191 + "@types/node": ">=18" 6192 + }, 6193 + "peerDependenciesMeta": { 6194 + "@types/node": { 6195 + "optional": true 6196 + } 6197 + } 6198 + }, 5748 6199 "node_modules/ipaddr.js": { 5749 6200 "version": "2.2.0", 5750 6201 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", ··· 6991 7442 "version": "9.9.0", 6992 7443 "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", 6993 7444 "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 7445 + }, 7446 + "node_modules/mute-stream": { 7447 + "version": "2.0.0", 7448 + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", 7449 + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", 7450 + "dev": true, 7451 + "engines": { 7452 + "node": "^18.17.0 || >=20.5.0" 7453 + } 6994 7454 }, 6995 7455 "node_modules/mz": { 6996 7456 "version": "2.7.0", ··· 7139 7599 "url": "https://github.com/sponsors/sindresorhus" 7140 7600 } 7141 7601 }, 7602 + "node_modules/os-tmpdir": { 7603 + "version": "1.0.2", 7604 + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 7605 + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 7606 + "dev": true, 7607 + "engines": { 7608 + "node": ">=0.10.0" 7609 + } 7610 + }, 7142 7611 "node_modules/p-finally": { 7143 7612 "version": "1.0.0", 7144 7613 "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", ··· 8070 8539 }, 8071 8540 "engines": { 8072 8541 "node": ">= 18" 8542 + } 8543 + }, 8544 + "node_modules/run-async": { 8545 + "version": "3.0.0", 8546 + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", 8547 + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", 8548 + "dev": true, 8549 + "engines": { 8550 + "node": ">=0.12.0" 8073 8551 } 8074 8552 }, 8075 8553 "node_modules/rxjs": { ··· 9447 9925 "dev": true, 9448 9926 "engines": { 9449 9927 "node": ">=10" 9928 + }, 9929 + "funding": { 9930 + "url": "https://github.com/sponsors/sindresorhus" 9931 + } 9932 + }, 9933 + "node_modules/yoctocolors-cjs": { 9934 + "version": "2.1.2", 9935 + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", 9936 + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", 9937 + "dev": true, 9938 + "engines": { 9939 + "node": ">=18" 9450 9940 }, 9451 9941 "funding": { 9452 9942 "url": "https://github.com/sponsors/sindresorhus"
+1
package.json
··· 40 40 }, 41 41 "devDependencies": { 42 42 "@atproto/lex-cli": "^0.8.0", 43 + "@flydotio/dockerfile": "^0.7.10", 43 44 "@testcontainers/postgresql": "^10.24.2", 44 45 "@types/express": "^5.0.1", 45 46 "@types/jest": "^29.5.14",