diff --git a/apps/backend/api/index.ts b/apps/backend/api/index.ts new file mode 100644 index 000000000..1f29430db --- /dev/null +++ b/apps/backend/api/index.ts @@ -0,0 +1,21 @@ +// Vercel serverless entry for the Elysia backend. +// +// We do NOT bundle the whole backend graph here (the `@/*` and `next/*` alias +// resolution + heavy native deps are handled by tsdown). Instead this thin +// function re-exports the already-built handler bundle (`dist/vercel.mjs`, +// produced by `tsdown` during `turbo build`), and Vercel's function builder +// only has to trace the externalized native deps (prisma, sharp, bcrypt, +// oidc-provider, pg) from node_modules. +// +// All requests are routed here via the `rewrites` rule in vercel.json, so the +// Elysia app does its own routing/version-rewrite against the original URL. +import app from "../dist/vercel.mjs"; + +export const config = { + runtime: "nodejs", + maxDuration: 60, +}; + +export default function handler(request: Request): Response | Promise { + return app.handle(request); +} diff --git a/apps/backend/tsdown.config.ts b/apps/backend/tsdown.config.ts index 2f1aa93a1..fd83a895c 100644 --- a/apps/backend/tsdown.config.ts +++ b/apps/backend/tsdown.config.ts @@ -87,7 +87,10 @@ const plugins = [ ]; export default defineConfig({ - entry: [resolve(backendDir, "src/server/server.ts")], + entry: [ + resolve(backendDir, "src/server/server.ts"), + resolve(backendDir, "src/server/vercel.ts"), + ], format: ["esm"], outDir: resolve(backendDir, "dist"), target: "node22", diff --git a/apps/backend/vercel.json b/apps/backend/vercel.json index f873477d2..921bc8f0d 100644 --- a/apps/backend/vercel.json +++ b/apps/backend/vercel.json @@ -1,6 +1,9 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", "framework": null, + "rewrites": [ + { "source": "/(.*)", "destination": "/api" } + ], "crons": [ { "path": "/api/latest/internal/email-queue-step",