an atproto based link aggregator

feat: add ingester build script using esbuild

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

+49 -1
+3 -1
package.json
··· 14 14 "scripts": { 15 15 "dev": "vite dev", 16 16 "dev:ingester": "tsx src/ingester/main.ts", 17 - "build": "pnpm lex:build && vite build", 17 + "build": "pnpm lex:build && vite build && pnpm build:ingester", 18 + "build:ingester": "tsx scripts/build-ingester.ts", 18 19 "preview": "vite preview", 19 20 "start": "node build", 20 21 "prepare": "svelte-kit sync || echo ''", ··· 54 55 "@vitest/browser-playwright": "^4.0.10", 55 56 "drizzle-kit": "^0.31.7", 56 57 "drizzle-orm": "^0.44.7", 58 + "esbuild": "^0.27.1", 57 59 "eslint": "^9.39.1", 58 60 "eslint-config-prettier": "^10.1.8", 59 61 "eslint-plugin-svelte": "^3.13.0",
+46
scripts/build-ingester.ts
··· 1 + /** 2 + * Build the ingester as a standalone JS bundle for production. 3 + * Resolves all imports and bundles dependencies. 4 + */ 5 + 6 + import * as esbuild from 'esbuild'; 7 + 8 + await esbuild.build({ 9 + entryPoints: ['src/ingester/main.ts'], 10 + bundle: true, 11 + platform: 'node', 12 + target: 'node22', 13 + format: 'esm', 14 + outfile: 'build/ingester.js', 15 + sourcemap: true, 16 + external: [ 17 + // Native modules that can't be bundled 18 + '@libsql/linux-x64-gnu', 19 + '@libsql/linux-x64-musl', 20 + '@libsql/client', 21 + '@libsql/core', 22 + '@libsql/hrana-client', 23 + 'libsql', 24 + // OpenTelemetry uses dynamic requires 25 + '@opentelemetry/api', 26 + '@opentelemetry/sdk-node', 27 + '@opentelemetry/auto-instrumentations-node', 28 + '@opentelemetry/exporter-trace-otlp-proto', 29 + '@opentelemetry/exporter-metrics-otlp-proto', 30 + '@opentelemetry/sdk-metrics', 31 + '@opentelemetry/resources', 32 + '@opentelemetry/semantic-conventions' 33 + ], 34 + banner: { 35 + js: ` 36 + import { createRequire } from 'module'; 37 + import { fileURLToPath } from 'url'; 38 + import { dirname } from 'path'; 39 + const require = createRequire(import.meta.url); 40 + const __filename = fileURLToPath(import.meta.url); 41 + const __dirname = dirname(__filename); 42 + `.trim() 43 + } 44 + }); 45 + 46 + console.log('Ingester built to build/ingester.js');