{"version":3,"file":"typegen.mjs","names":[],"sources":["../../../../src/astro/routes/api/typegen.ts"],"sourcesContent":["/**\n * Typegen endpoint - generates emdash-env.d.ts content\n *\n * POST /_emdash/api/typegen - Generate types and return as JSON\n * GET /_emdash/api/typegen - Return types as text (for preview/debugging)\n *\n * The caller (integration or CLI) is responsible for writing the file to disk.\n * This endpoint only generates the content — it has no filesystem access,\n * which is essential for Cloudflare Workers where process.cwd() is \"/\" and\n * node:fs may not be available.\n *\n * Dev-only endpoint - disabled in production.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport type { SchemaRegistry } from \"#schema/registry.js\";\n\nexport const prerender = false;\n\n/**\n * Safely list collections, returning empty array if tables don't exist yet\n */\nasync function safeListCollections(registry: SchemaRegistry) {\n\ttry {\n\t\treturn await registry.listCollections();\n\t} catch (error) {\n\t\t// Handle missing tables for new sites that haven't run setup yet\n\t\tif (error instanceof Error && error.message.includes(\"no such table\")) {\n\t\t\treturn [];\n\t\t}\n\t\tthrow error;\n\t}\n}\n\n/**\n * Generate types content and metadata from the current schema.\n */\nasync function generateTypes(registry: SchemaRegistry) {\n\tconst { generateTypesFile, generateSchemaHash } = await import(\"#schema/zod-generator.js\");\n\n\tconst collections = await safeListCollections(registry);\n\tconst collectionsWithFields = await Promise.all(\n\t\tcollections.map(async (c) => {\n\t\t\tconst fields = await registry.listFields(c.id);\n\t\t\treturn { ...c, fields };\n\t\t}),\n\t);\n\n\tconst types = generateTypesFile(collectionsWithFields);\n\tconst hash: string = await generateSchemaHash(collectionsWithFields);\n\n\treturn { types, hash, collections: collections.length };\n}\n\n/**\n * GET - Return types as plain text (for preview/debugging)\n */\nexport const GET: APIRoute = async ({ locals }) => {\n\tif (!import.meta.env.DEV) {\n\t\treturn apiError(\"FORBIDDEN\", \"Typegen is only available in development\", 403);\n\t}\n\n\tconst { emdash } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash not configured\", 500);\n\t}\n\n\ttry {\n\t\tconst { SchemaRegistry } = await import(\"#schema/registry.js\");\n\t\tconst registry = new SchemaRegistry(emdash.db);\n\t\tconst { types } = await generateTypes(registry);\n\n\t\treturn new Response(types, {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"text/typescript\",\n\t\t\t\t\"Cache-Control\": \"private, no-store\",\n\t\t\t},\n\t\t});\n\t} catch (error) {\n\t\treturn handleError(error, \"Typegen failed\", \"TYPEGEN_ERROR\");\n\t}\n};\n\n/**\n * POST - Generate types and return as JSON\n *\n * The caller writes the file to disk. Response shape:\n * { types: string, hash: string, collections: number }\n */\nexport const POST: APIRoute = async ({ locals }) => {\n\tif (!import.meta.env.DEV) {\n\t\treturn apiError(\"FORBIDDEN\", \"Typegen is only available in development\", 403);\n\t}\n\n\tconst { emdash } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash not configured\", 500);\n\t}\n\n\ttry {\n\t\tconst { SchemaRegistry } = await import(\"#schema/registry.js\");\n\t\tconst registry = new SchemaRegistry(emdash.db);\n\t\tconst result = await generateTypes(registry);\n\n\t\treturn apiSuccess(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Typegen failed\", \"TYPEGEN_ERROR\");\n\t}\n};\n"],"mappings":";;;;;AAmBA,MAAa,YAAY;;;;AAKzB,eAAe,oBAAoB,UAA0B;AAC5D,KAAI;AACH,SAAO,MAAM,SAAS,iBAAiB;UAC/B,OAAO;AAEf,MAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,gBAAgB,CACpE,QAAO,EAAE;AAEV,QAAM;;;;;;AAOR,eAAe,cAAc,UAA0B;CACtD,MAAM,EAAE,mBAAmB,uBAAuB,MAAM,OAAO;CAE/D,MAAM,cAAc,MAAM,oBAAoB,SAAS;CACvD,MAAM,wBAAwB,MAAM,QAAQ,IAC3C,YAAY,IAAI,OAAO,MAAM;EAC5B,MAAM,SAAS,MAAM,SAAS,WAAW,EAAE,GAAG;AAC9C,SAAO;GAAE,GAAG;GAAG;GAAQ;GACtB,CACF;AAKD,QAAO;EAAE,OAHK,kBAAkB,sBAAsB;EAGtC,MAFK,MAAM,mBAAmB,sBAAsB;EAE9C,aAAa,YAAY;EAAQ;;;;;AAMxD,MAAa,MAAgB,OAAO,EAAE,aAAa;AAClD,KAAI,CAAC,OAAO,KAAK,IAAI,IACpB,QAAO,SAAS,aAAa,4CAA4C,IAAI;CAG9E,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,yBAAyB,IAAI;AAGhE,KAAI;EACH,MAAM,EAAE,mBAAmB,MAAM,OAAO;EAExC,MAAM,EAAE,UAAU,MAAM,cADP,IAAI,eAAe,OAAO,GAAG,CACC;AAE/C,SAAO,IAAI,SAAS,OAAO;GAC1B,QAAQ;GACR,SAAS;IACR,gBAAgB;IAChB,iBAAiB;IACjB;GACD,CAAC;UACM,OAAO;AACf,SAAO,YAAY,OAAO,kBAAkB,gBAAgB;;;;;;;;;AAU9D,MAAa,OAAiB,OAAO,EAAE,aAAa;AACnD,KAAI,CAAC,OAAO,KAAK,IAAI,IACpB,QAAO,SAAS,aAAa,4CAA4C,IAAI;CAG9E,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,yBAAyB,IAAI;AAGhE,KAAI;EACH,MAAM,EAAE,mBAAmB,MAAM,OAAO;AAIxC,SAAO,WAFQ,MAAM,cADJ,IAAI,eAAe,OAAO,GAAG,CACF,CAEnB;UACjB,OAAO;AACf,SAAO,YAAY,OAAO,kBAAkB,gBAAgB"}