{"version":3,"file":"dts.cjs","names":["path","fs"],"sources":["../src/dts.ts"],"sourcesContent":["// @env node\nimport type { EnvDefinition, StandardEnvDefinition } from \"./types\";\nimport type { z as ZodNs } from \"zod\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/**\n * Writes vite-env.d.ts for Zod definitions.\n * Uses instanceof checks to infer TypeScript types from Zod schemas.\n * Zod is loaded dynamically so this module can be imported without zod installed.\n */\nexport async function generateDts(def: EnvDefinition, root: string): Promise<void> {\n  const { z } = await import(\"zod\");\n\n  const gatedKeys = gatedPresetKeys(def);\n  const clientFields = zodShapeToTsFields(z, { ...def.client }, gatedKeys);\n  const serverFields = zodShapeToTsFields(z, { ...def.server, ...def.client }, gatedKeys);\n\n  await writeDts(root, clientFields, serverFields);\n}\n\n/**\n * Detection-gated preset keys (not user-overridden) validate as optional\n * off-platform — typing them required would lie during local dev.\n */\nfunction gatedPresetKeys(def: EnvDefinition): Set<string> {\n  const keys = new Set<string>();\n  for (const preset of def.presets ?? []) {\n    if (!preset.detect) continue;\n    for (const side of [\"server\", \"client\"] as const) {\n      for (const [key, schema] of Object.entries(preset[side] ?? {})) {\n        if (def[side]?.[key] === schema) keys.add(key);\n      }\n    }\n  }\n  return keys;\n}\n\n/**\n * Writes vite-env.d.ts for Standard Schema definitions.\n * All fields are typed as `string` — Standard Schema has no runtime type introspection.\n */\nexport async function generateStandardDts(def: StandardEnvDefinition, root: string): Promise<void> {\n  const clientKeys = Object.keys(def.client ?? {});\n  const serverKeys = [...Object.keys(def.server ?? {}), ...clientKeys];\n\n  const clientFields = keysToTsFields(clientKeys);\n  const serverFields = keysToTsFields(serverKeys);\n\n  await writeDts(root, clientFields, serverFields, \"(Standard Schema)\");\n}\n\nfunction buildHeader(tag = \"\"): string {\n  const lines = [\n    \"/* oxlint-disable */\",\n    \"/* eslint-disable */\",\n    \"// @ts-nocheck\",\n    \"// biome-ignore-all lint: auto-generated\",\n    tag ? `// Auto-generated by @vite-env/core ${tag}` : \"// Auto-generated by @vite-env/core\",\n    \"// Do not edit manually — re-generated on every dev server start and build\",\n  ];\n  if (tag) {\n    lines.push(\"// Tip: for richer types, use defineEnv() with Zod instead of defineStandardEnv()\");\n  }\n  return lines.join(\"\\n\");\n}\n\nasync function writeDts(\n  root: string,\n  clientFields: string,\n  serverFields: string,\n  tag = \"\",\n): Promise<void> {\n  const header = buildHeader(tag);\n\n  const dts = `${header}\n\ndeclare module 'virtual:env/client' {\n  const env: {\n${clientFields}\n  }\n  export { env }\n  export default env\n}\n\ndeclare module 'virtual:env/server' {\n  const env: {\n${serverFields}\n  }\n  export { env }\n  export default env\n}\n`;\n\n  const filePath = path.join(root, \"vite-env.d.ts\");\n  try {\n    await fs.writeFile(filePath, dts, \"utf-8\");\n  } catch (e) {\n    throw new Error(\n      `[vite-env] Failed to write vite-env.d.ts to ${root}. Check file permissions.`,\n      { cause: e },\n    );\n  }\n}\n\nfunction keysToTsFields(keys: string[]): string {\n  return keys.map((key) => `    readonly ${key}: string`).join(\"\\n\");\n}\n\nfunction zodShapeToTsFields(\n  z: typeof ZodNs,\n  shape: Record<string, unknown>,\n  gatedKeys: Set<string>,\n): string {\n  return Object.entries(shape)\n    .map(([key, schema]) => {\n      const tsType = zodToTs(z, schema);\n      const optional = schema instanceof z.ZodOptional || gatedKeys.has(key);\n      return `    readonly ${key}${optional ? \"?\" : \"\"}: ${tsType}`;\n    })\n    .join(\"\\n\");\n}\n\nfunction zodToTs(z: typeof ZodNs, schema: unknown): string {\n  if (schema instanceof z.ZodOptional) return zodToTs(z, schema.unwrap());\n  if (schema instanceof z.ZodDefault) return zodToTs(z, schema.def.innerType);\n  if (schema instanceof z.ZodString) return \"string\";\n  if (schema instanceof z.ZodNumber) return \"number\";\n  if (schema instanceof z.ZodBoolean) return \"boolean\";\n  if (schema instanceof z.ZodEnum)\n    return (schema.options as string[]).map((o) => `'${o}'`).join(\" | \");\n  if (schema instanceof z.ZodPipe) return zodToTs(z, schema.def.out);\n  return \"string\";\n}\n"],"mappings":";;;;;;;;;;;;AAWA,eAAsB,YAAY,KAAoB,MAA6B;CACjF,MAAM,EAAE,MAAM,MAAM,OAAO;CAE3B,MAAM,YAAY,gBAAgB,IAAI;AAItC,OAAM,SAAS,MAHM,mBAAmB,GAAG,EAAE,GAAG,IAAI,QAAQ,EAAE,UAG7B,EAFZ,mBAAmB,GAAG;EAAE,GAAG,IAAI;EAAQ,GAAG,IAAI;EAAQ,EAAE,UAE9B,CAAC;;;;;;AAOlD,SAAS,gBAAgB,KAAiC;CACxD,MAAM,uBAAO,IAAI,KAAa;AAC9B,MAAK,MAAM,UAAU,IAAI,WAAW,EAAE,EAAE;AACtC,MAAI,CAAC,OAAO,OAAQ;AACpB,OAAK,MAAM,QAAQ,CAAC,UAAU,SAAS,CACrC,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,OAAO,SAAS,EAAE,CAAC,CAC5D,KAAI,IAAI,QAAQ,SAAS,OAAQ,MAAK,IAAI,IAAI;;AAIpD,QAAO;;;;;;AAOT,eAAsB,oBAAoB,KAA4B,MAA6B;CACjG,MAAM,aAAa,OAAO,KAAK,IAAI,UAAU,EAAE,CAAC;CAChD,MAAM,aAAa,CAAC,GAAG,OAAO,KAAK,IAAI,UAAU,EAAE,CAAC,EAAE,GAAG,WAAW;AAKpE,OAAM,SAAS,MAHM,eAAe,WAGH,EAFZ,eAAe,WAEW,EAAE,oBAAoB;;AAGvE,SAAS,YAAY,MAAM,IAAY;CACrC,MAAM,QAAQ;EACZ;EACA;EACA;EACA;EACA,MAAM,uCAAuC,QAAQ;EACrD;EACD;AACD,KAAI,IACF,OAAM,KAAK,oFAAoF;AAEjG,QAAO,MAAM,KAAK,KAAK;;AAGzB,eAAe,SACb,MACA,cACA,cACA,MAAM,IACS;CAGf,MAAM,MAAM,GAFG,YAAY,IAEN,CAAC;;;;EAItB,aAAa;;;;;;;;EAQb,aAAa;;;;;;CAOb,MAAM,WAAWA,UAAAA,QAAK,KAAK,MAAM,gBAAgB;AACjD,KAAI;AACF,QAAMC,iBAAAA,QAAG,UAAU,UAAU,KAAK,QAAQ;UACnC,GAAG;AACV,QAAM,IAAI,MACR,+CAA+C,KAAK,4BACpD,EAAE,OAAO,GAAG,CACb;;;AAIL,SAAS,eAAe,MAAwB;AAC9C,QAAO,KAAK,KAAK,QAAQ,gBAAgB,IAAI,UAAU,CAAC,KAAK,KAAK;;AAGpE,SAAS,mBACP,GACA,OACA,WACQ;AACR,QAAO,OAAO,QAAQ,MAAM,CACzB,KAAK,CAAC,KAAK,YAAY;EACtB,MAAM,SAAS,QAAQ,GAAG,OAAO;AAEjC,SAAO,gBAAgB,MADN,kBAAkB,EAAE,eAAe,UAAU,IAAI,IAAI,GAC9B,MAAM,GAAG,IAAI;GACrD,CACD,KAAK,KAAK;;AAGf,SAAS,QAAQ,GAAiB,QAAyB;AACzD,KAAI,kBAAkB,EAAE,YAAa,QAAO,QAAQ,GAAG,OAAO,QAAQ,CAAC;AACvE,KAAI,kBAAkB,EAAE,WAAY,QAAO,QAAQ,GAAG,OAAO,IAAI,UAAU;AAC3E,KAAI,kBAAkB,EAAE,UAAW,QAAO;AAC1C,KAAI,kBAAkB,EAAE,UAAW,QAAO;AAC1C,KAAI,kBAAkB,EAAE,WAAY,QAAO;AAC3C,KAAI,kBAAkB,EAAE,QACtB,QAAQ,OAAO,QAAqB,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,KAAK,MAAM;AACtE,KAAI,kBAAkB,EAAE,QAAS,QAAO,QAAQ,GAAG,OAAO,IAAI,IAAI;AAClE,QAAO"}