{"version":3,"file":"bun.cjs","names":[],"sources":["../../../src/adapters/bun.ts"],"sourcesContent":["import { mkdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { relative, resolve } from \"node:path\";\nimport { scanRoutes } from \"../router/route-scanner.js\";\nimport type { Adapter } from \"./index.js\";\nimport { writeSsrEntry } from \"./shared.js\";\nimport { DEFAULT_CAPABILITIES } from \"../runtime/capabilities.js\";\n\n/**\n * Bun adapter for nix-js-kit.\n *\n * Produces a self-contained Bun server entry at `.nix-js/bun-server.ts`.\n * Run it with:\n *\n *   bun run .nix-js/bun-server.ts\n *\n * The server serves static files from `dist/` and renders pages on demand for\n * unmatched routes.\n */\nexport const bunAdapter: Adapter = {\n  name: \"bun\",\n  capabilities: DEFAULT_CAPABILITIES,\n\n  async build(options) {\n    const root = resolve(options.root);\n    const outDir = resolve(root, options.outDir);\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(generatedDir, { recursive: true, force: true });\n    await mkdir(generatedDir, { recursive: true });\n\n    // Scan routes and generate a self-contained SSR handler entry.\n    const appDir = resolve(root, options.appDir);\n    const routes = await scanRoutes(appDir);\n\n    const entryPath = resolve(generatedDir, \"bun-index.ts\");\n    await writeSsrEntry(entryPath, routes, options);\n\n    // Write the Bun server entry.\n    const serverPath = resolve(generatedDir, \"bun-server.ts\");\n    await writeFile(\n      serverPath,\n      buildBunServerSource(relativeToUrlPath(generatedDir, outDir), options),\n      \"utf8\",\n    );\n  },\n};\n\nfunction buildBunServerSource(\n  outDirUrl: string,\n  options: {\n    clientEntry: string;\n    lang: string;\n    port?: number;\n  },\n): string {\n  return `// AUTO-GENERATED by @deijose/nix-js-kit. Do not edit.\nimport { fileURLToPath } from \"node:url\";\nimport { createWebHandler } from \"@deijose/nix-js-kit/runtime\";\nimport handler from \"./bun-index.ts\";\n\nconst outDir = fileURLToPath(new URL(${JSON.stringify(outDirUrl)}, import.meta.url));\nconst port = Number(process.env.PORT) || ${options.port ?? 3000};\n\nconst webHandler = createWebHandler(\n  { pages: [], api: [], error404: undefined, error500: undefined },\n  {},\n  { staticRoot: outDir, lang: ${JSON.stringify(options.lang)}, clientEntry: ${JSON.stringify(options.clientEntry)} },\n);\n\nBun.serve({\n  port,\n  async fetch(request) {\n    // Try static files first via the unified handler, then fall back to the\n    // bundled SSR handler for dynamic routes.\n    let response = await webHandler(request);\n    if (response.status === 404) {\n      response = await handler(request);\n    }\n    return response;\n  },\n});\n\nconsole.log(\\`Bun server running at http://localhost:\\${port}\\`);\n`;\n}\n\nfunction relativeToUrlPath(from: string, to: string): string {\n  const path = relative(from, to).split(\"\\\\\").join(\"/\");\n  return `${path.startsWith(\".\") ? path : `./${path}`}/`;\n}\n"],"mappings":"2PAkBA,IAAa,EAAsB,CACjC,KAAM,MACN,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,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,EAAc,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,EACvD,MAAA,EAAM,EAAA,MAAA,CAAM,EAAc,CAAE,UAAW,EAAK,CAAC,EAG7C,IAAM,GAAA,EAAS,EAAA,QAAA,CAAQ,EAAM,EAAQ,MAAM,EACrC,EAAS,MAAM,EAAA,EAAW,CAAM,EAEhC,GAAA,EAAY,EAAA,QAAA,CAAQ,EAAc,cAAc,EACtD,MAAM,EAAA,EAAc,EAAW,EAAQ,CAAO,EAG9C,IAAM,GAAA,EAAa,EAAA,QAAA,CAAQ,EAAc,eAAe,EACxD,MAAA,EAAM,EAAA,UAAA,CACJ,EACA,EAAqB,EAAkB,EAAc,CAAM,EAAG,CAAO,EACrE,MACF,CACF,CACF,EAEA,SAAS,EACP,EACA,EAKQ,CACR,MAAO;;;;;uCAK8B,KAAK,UAAU,CAAS,EAAE;2CACtB,EAAQ,MAAQ,IAAK;;;;;gCAKhC,KAAK,UAAU,EAAQ,IAAI,EAAE,iBAAiB,KAAK,UAAU,EAAQ,WAAW,EAAE;;;;;;;;;;;;;;;;;CAkBlH,CAEA,SAAS,EAAkB,EAAc,EAAoB,CAC3D,IAAM,GAAA,EAAO,EAAA,SAAA,CAAS,EAAM,CAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,EACpD,MAAO,GAAG,EAAK,WAAW,GAAG,EAAI,EAAO,KAAK,IAAO,EACtD"}