{"version":3,"file":"vercel.cjs","names":[],"sources":["../../../src/adapters/vercel.ts"],"sourcesContent":["import { mkdir, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { build } from \"vite\";\nimport { scanRoutes } from \"../router/route-scanner.js\";\nimport type { Adapter } from \"./index.js\";\nimport { copyStatic, writeSsrEntry } from \"./shared.js\";\nimport { SERVERLESS_CAPABILITIES } from \"../runtime/capabilities.js\";\n\n/**\n * Vercel adapter for nix-js-kit.\n *\n * Produces a `.vercel/output` directory compatible with the Vercel Build Output\n * API (v3). Static files are served from `dist/` and unmatched routes fall back\n * to the SSR function.\n */\nexport const vercelAdapter: Adapter = {\n  name: \"vercel\",\n  capabilities: SERVERLESS_CAPABILITIES,\n\n  async build(options) {\n    const root = resolve(options.root);\n    const outDir = resolve(root, options.outDir);\n    const vercelOut = resolve(root, \".vercel/output\");\n    const functionsDir = join(vercelOut, \"functions\", \"__nix-js-kit.func\");\n    const generatedDir = resolve(root, \".nix-js\");\n\n    // Verify the production build exists.\n    try {\n      await stat(outDir);\n    } catch {\n      throw new Error(\n        `Output directory not found: ${outDir}. Run \"nix-js-kit build\" first.`,\n      );\n    }\n\n    // Clean previous adapter output.\n    await rm(vercelOut, { recursive: true, force: true });\n    await mkdir(vercelOut, { recursive: true });\n    await mkdir(functionsDir, { recursive: true });\n    await mkdir(generatedDir, { recursive: true });\n\n    // Copy static files.\n    await copyStatic(outDir, join(vercelOut, \"static\"));\n\n    // Scan routes and generate a self-contained function entry.\n    const appDir = resolve(root, options.appDir);\n    const routes = await scanRoutes(appDir);\n\n    const entryPath = resolve(generatedDir, \"vercel-index.ts\");\n    await writeSsrEntry(entryPath, routes, options);\n\n    // Bundle the function entry.\n    await build({\n      configFile: false,\n      root,\n      build: {\n        outDir: functionsDir,\n        emptyOutDir: true,\n        ssr: true,\n        lib: {\n          entry: entryPath,\n          formats: [\"es\"],\n          fileName: () => \"index.js\",\n        },\n        rollupOptions: {\n          external: [],\n          output: {\n            inlineDynamicImports: true,\n          },\n        },\n      },\n    });\n\n    // Vite SSR lib builds may use the entry file name, so force the expected handler name.\n    const generatedHandler = join(functionsDir, \"vercel-index.js\");\n    const targetHandler = join(functionsDir, \"index.js\");\n    try {\n      await stat(generatedHandler);\n      await rename(generatedHandler, targetHandler);\n    } catch {\n      // If the file is already named index.js, nothing to do.\n    }\n\n    // Write Vercel function config.\n    await writeFile(\n      join(functionsDir, \".vc-config.json\"),\n      JSON.stringify(\n        {\n          runtime: \"nodejs20.x\",\n          handler: \"index.js\",\n          launcherType: \"Nodejs\",\n          shouldAddHelpers: true,\n        },\n        null,\n        2,\n      ),\n      \"utf8\",\n    );\n\n    // Write Vercel root config.\n    await writeFile(\n      join(vercelOut, \"config.json\"),\n      JSON.stringify(\n        {\n          version: 3,\n          routes: [\n            { handle: \"filesystem\" },\n            { src: \"/(.*)\", \"dest\": \"/__nix-js-kit\" },\n          ],\n        },\n        null,\n        2,\n      ),\n      \"utf8\",\n    );\n  },\n};\n"],"mappings":"6QAeA,IAAa,EAAyB,CACpC,KAAM,SACN,aAAc,EAAA,EAEd,MAAM,MAAM,EAAS,CACnB,IAAM,GAAA,EAAO,EAAA,QAAA,CAAQ,EAAQ,IAAI,EAC3B,GAAA,EAAS,EAAA,QAAA,CAAQ,EAAM,EAAQ,MAAM,EACrC,GAAA,EAAY,EAAA,QAAA,CAAQ,EAAM,gBAAgB,EAC1C,GAAA,EAAe,EAAA,KAAA,CAAK,EAAW,YAAa,mBAAmB,EAC/D,GAAA,EAAe,EAAA,QAAA,CAAQ,EAAM,SAAS,EAG5C,GAAI,CACF,MAAA,EAAM,EAAA,KAAA,CAAK,CAAM,CACnB,MAAQ,CACN,MAAU,MACR,+BAA+B,EAAO,gCACxC,CACF,CAGA,MAAA,EAAM,EAAA,GAAA,CAAG,EAAW,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,EACpD,MAAA,EAAM,EAAA,MAAA,CAAM,EAAW,CAAE,UAAW,EAAK,CAAC,EAC1C,MAAA,EAAM,EAAA,MAAA,CAAM,EAAc,CAAE,UAAW,EAAK,CAAC,EAC7C,MAAA,EAAM,EAAA,MAAA,CAAM,EAAc,CAAE,UAAW,EAAK,CAAC,EAG7C,MAAM,EAAA,EAAW,GAAA,EAAQ,EAAA,KAAA,CAAK,EAAW,QAAQ,CAAC,EAGlD,IAAM,GAAA,EAAS,EAAA,QAAA,CAAQ,EAAM,EAAQ,MAAM,EACrC,EAAS,MAAM,EAAA,EAAW,CAAM,EAEhC,GAAA,EAAY,EAAA,QAAA,CAAQ,EAAc,iBAAiB,EACzD,MAAM,EAAA,EAAc,EAAW,EAAQ,CAAO,EAG9C,MAAA,EAAM,EAAA,MAAA,CAAM,CACV,WAAY,GACZ,OACA,MAAO,CACL,OAAQ,EACR,YAAa,GACb,IAAK,GACL,IAAK,CACH,MAAO,EACP,QAAS,CAAC,IAAI,EACd,aAAgB,UAClB,EACA,cAAe,CACb,SAAU,CAAC,EACX,OAAQ,CACN,qBAAsB,EACxB,CACF,CACF,CACF,CAAC,EAGD,IAAM,GAAA,EAAmB,EAAA,KAAA,CAAK,EAAc,iBAAiB,EACvD,GAAA,EAAgB,EAAA,KAAA,CAAK,EAAc,UAAU,EACnD,GAAI,CACF,MAAA,EAAM,EAAA,KAAA,CAAK,CAAgB,EAC3B,MAAA,EAAM,EAAA,OAAA,CAAO,EAAkB,CAAa,CAC9C,MAAQ,CAER,CAGA,MAAA,EAAM,EAAA,UAAA,EAAA,EACJ,EAAA,KAAA,CAAK,EAAc,iBAAiB,EACpC,KAAK,UACH,CACE,QAAS,aACT,QAAS,WACT,aAAc,SACd,iBAAkB,EACpB,EACA,KACA,CACF,EACA,MACF,EAGA,MAAA,EAAM,EAAA,UAAA,EAAA,EACJ,EAAA,KAAA,CAAK,EAAW,aAAa,EAC7B,KAAK,UACH,CACE,QAAS,EACT,OAAQ,CACN,CAAE,OAAQ,YAAa,EACvB,CAAE,IAAK,QAAS,KAAQ,eAAgB,CAC1C,CACF,EACA,KACA,CACF,EACA,MACF,CACF,CACF"}