{"version":3,"file":"schema.mjs","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import type { EnvDefinition, EnvPreset, ValidationResult } from \"./types\";\nimport { z } from \"zod\";\n\ntype DefineEnvInput = {\n  presets?: EnvPreset[];\n} & EnvDefinition;\n\nfunction warnSideConflicts(\n  keys: string[],\n  seen: Set<string>,\n  userKeys: Set<string>,\n  side: \"server\" | \"client\",\n): void {\n  for (const key of keys) {\n    const duplicate = seen.has(key);\n    if (duplicate)\n      console.warn(`[vite-env] \"${key}\" is defined in multiple presets. The last preset wins.`);\n    seen.add(key);\n    if (!duplicate && userKeys.has(key))\n      console.warn(\n        `[vite-env] \"${key}\" is defined in both a preset and your ${side} config. Your definition wins.`,\n      );\n  }\n}\n\nfunction warnConflicts(\n  presets: EnvPreset[],\n  userServerKeys: Set<string>,\n  userClientKeys: Set<string>,\n): void {\n  const seenServerKeys = new Set<string>();\n  const seenClientKeys = new Set<string>();\n\n  for (const preset of presets) {\n    warnSideConflicts(Object.keys(preset.server ?? {}), seenServerKeys, userServerKeys, \"server\");\n    warnSideConflicts(Object.keys(preset.client ?? {}), seenClientKeys, userClientKeys, \"client\");\n  }\n}\n\nexport function defineEnv<T extends DefineEnvInput>(\n  definition: T,\n): Omit<T, \"presets\"> & Pick<EnvDefinition, \"server\" | \"client\" | \"presets\"> {\n  const { presets = [], server, client, ...rest } = definition;\n  // ...rest intentionally forwarded — T may carry extra keys beyond EnvDefinition\n\n  const mergedServer: z.ZodRawShape = Object.assign(\n    {},\n    ...presets.map((p) => p.server ?? {}),\n    server,\n  );\n  const mergedClient: z.ZodRawShape = Object.assign(\n    {},\n    ...presets.map((p) => p.client ?? {}),\n    client,\n  );\n\n  warnConflicts(presets, new Set(Object.keys(server ?? {})), new Set(Object.keys(client ?? {})));\n\n  for (const key of Object.keys(mergedClient)) {\n    if (!key.startsWith(\"VITE_\")) {\n      throw new Error(\n        `[vite-env] Client env var \"${key}\" must be prefixed with VITE_.\\n` +\n          `  Rename it to \"VITE_${key}\" or move it to \"server\" if it's secret.`,\n      );\n    }\n  }\n\n  const result: Record<string, unknown> = { ...rest };\n  if (Object.keys(mergedServer).length > 0 || server !== undefined) result.server = mergedServer;\n  if (Object.keys(mergedClient).length > 0 || client !== undefined) result.client = mergedClient;\n  if (presets.length > 0) result.presets = presets;\n\n  return result as Omit<T, \"presets\"> & Pick<EnvDefinition, \"presets\">;\n}\n\nexport function validateEnv(def: EnvDefinition, rawEnv: Record<string, string>): ValidationResult {\n  const combinedShape: Record<string, z.ZodType> = {\n    ...def.server,\n    ...def.client,\n  } as Record<string, z.ZodType>;\n\n  // Undetected-platform preset vars validate as optional — they only exist on\n  // the platform; requiring them would break local dev. User overrides stay strict.\n  // Mutating combinedShape also prevents double-wrapping when two undetected\n  // presets share a key: after the first wrap, the identity check fails.\n  for (const preset of def.presets ?? []) {\n    if (!preset.detect || preset.detect(rawEnv)) continue;\n    for (const side of [preset.server, preset.client]) {\n      for (const [key, presetSchema] of Object.entries(side ?? {})) {\n        if (combinedShape[key] === presetSchema)\n          combinedShape[key] = z.optional(combinedShape[key]);\n      }\n    }\n  }\n\n  const schema = z.object(combinedShape);\n  const result = schema.safeParse(rawEnv);\n\n  if (result.success) {\n    return { success: true, data: result.data, errors: [] as const };\n  }\n\n  return {\n    success: false,\n    data: null,\n    errors: result.error.issues,\n  };\n}\n"],"mappings":";;AAOA,SAAS,kBACP,MACA,MACA,UACA,MACM;AACN,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,MAAI,UACF,SAAQ,KAAK,eAAe,IAAI,yDAAyD;AAC3F,OAAK,IAAI,IAAI;AACb,MAAI,CAAC,aAAa,SAAS,IAAI,IAAI,CACjC,SAAQ,KACN,eAAe,IAAI,yCAAyC,KAAK,gCAClE;;;AAIP,SAAS,cACP,SACA,gBACA,gBACM;CACN,MAAM,iCAAiB,IAAI,KAAa;CACxC,MAAM,iCAAiB,IAAI,KAAa;AAExC,MAAK,MAAM,UAAU,SAAS;AAC5B,oBAAkB,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,EAAE,gBAAgB,gBAAgB,SAAS;AAC7F,oBAAkB,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,EAAE,gBAAgB,gBAAgB,SAAS;;;AAIjG,SAAgB,UACd,YAC2E;CAC3E,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,QAAQ,GAAG,SAAS;CAGlD,MAAM,eAA8B,OAAO,OACzC,EAAE,EACF,GAAG,QAAQ,KAAK,MAAM,EAAE,UAAU,EAAE,CAAC,EACrC,OACD;CACD,MAAM,eAA8B,OAAO,OACzC,EAAE,EACF,GAAG,QAAQ,KAAK,MAAM,EAAE,UAAU,EAAE,CAAC,EACrC,OACD;AAED,eAAc,SAAS,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC;AAE9F,MAAK,MAAM,OAAO,OAAO,KAAK,aAAa,CACzC,KAAI,CAAC,IAAI,WAAW,QAAQ,CAC1B,OAAM,IAAI,MACR,8BAA8B,IAAI,uDACR,IAAI,0CAC/B;CAIL,MAAM,SAAkC,EAAE,GAAG,MAAM;AACnD,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EAAW,QAAO,SAAS;AAClF,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EAAW,QAAO,SAAS;AAClF,KAAI,QAAQ,SAAS,EAAG,QAAO,UAAU;AAEzC,QAAO;;AAGT,SAAgB,YAAY,KAAoB,QAAkD;CAChG,MAAM,gBAA2C;EAC/C,GAAG,IAAI;EACP,GAAG,IAAI;EACR;AAMD,MAAK,MAAM,UAAU,IAAI,WAAW,EAAE,EAAE;AACtC,MAAI,CAAC,OAAO,UAAU,OAAO,OAAO,OAAO,CAAE;AAC7C,OAAK,MAAM,QAAQ,CAAC,OAAO,QAAQ,OAAO,OAAO,CAC/C,MAAK,MAAM,CAAC,KAAK,iBAAiB,OAAO,QAAQ,QAAQ,EAAE,CAAC,CAC1D,KAAI,cAAc,SAAS,aACzB,eAAc,OAAO,EAAE,SAAS,cAAc,KAAK;;CAM3D,MAAM,SADS,EAAE,OAAO,cACH,CAAC,UAAU,OAAO;AAEvC,KAAI,OAAO,QACT,QAAO;EAAE,SAAS;EAAM,MAAM,OAAO;EAAM,QAAQ,EAAE;EAAW;AAGlE,QAAO;EACL,SAAS;EACT,MAAM;EACN,QAAQ,OAAO,MAAM;EACtB"}