import { build as esbuild } from "esbuild"; import { build as viteBuild } from "vite"; import { rm, readFile } from "fs/promises"; // server deps to bundle to reduce openat(2) syscalls // which helps cold start times const allowlist = [ "@google/generative-ai", "axios", "connect-pg-simple", "cors", "date-fns", "drizzle-orm", "drizzle-zod", "express", "express-rate-limit", "express-session", "jsonwebtoken", "memorystore", "multer", "nanoid", "nodemailer", "openai", "passport", "passport-local", "pg", "stripe", "uuid", "ws", "xlsx", "zod", "zod-validation-error", ]; async function buildAll() { await rm("dist", { recursive: true, force: true }); const enableSourcemap = process.argv.includes("--sourcemap"); console.log("building client..."); await viteBuild({ build: { sourcemap: enableSourcemap, }, }); console.log("building server..."); const pkg = JSON.parse(await readFile("package.json", "utf-8")); const allDeps = [ ...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {}), ]; const externals = allDeps.filter((dep) => !allowlist.includes(dep)); await esbuild({ entryPoints: ["server/index.ts"], platform: "node", bundle: true, format: "esm", outfile: "dist/index.js", define: { "process.env.NODE_ENV": '"production"', }, minify: true, sourcemap: enableSourcemap, external: externals, logLevel: "info", banner: { js: "import { createRequire } from 'module'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; const require = createRequire(import.meta.url); const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename);", }, }); } buildAll().catch((err) => { console.error(err); process.exit(1); });