@vite-env/core 0.5.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,7 +16,7 @@ The `env.ts` layer for Vite — define once, validate everywhere, import with ty
16
16
  ## Install
17
17
 
18
18
  ```bash
19
- pnpm add @vite-env/core zod
19
+ npm install @vite-env/core zod
20
20
  ```
21
21
 
22
22
  ## Usage
package/dist/config.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./dts-CJcj6BIn.cjs");
2
+ require("./dts-BX0Cnqo-.cjs");
3
3
  let jiti = require("jiti");
4
4
  //#region src/config.ts
5
5
  async function loadEnvConfig(configPath) {
package/dist/config.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as EnvDefinition } from "./types-CpYkRwLM.cjs";
1
+ import { n as EnvDefinition } from "./types-B61nsO8q.cjs";
2
2
 
3
3
  //#region src/config.d.ts
4
4
  declare function loadEnvConfig(configPath: string): Promise<EnvDefinition>;
package/dist/config.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as EnvDefinition } from "./types--Km3TAdJ.mjs";
1
+ import { n as EnvDefinition } from "./types-KniR_Oqf.mjs";
2
2
 
3
3
  //#region src/config.d.ts
4
4
  declare function loadEnvConfig(configPath: string): Promise<EnvDefinition>;
@@ -32,10 +32,23 @@ node_fs_promises = __toESM(node_fs_promises, 1);
32
32
  */
33
33
  async function generateDts(def, root) {
34
34
  const { z } = await import("zod");
35
- await writeDts(root, zodShapeToTsFields(z, { ...def.client }), zodShapeToTsFields(z, {
35
+ const gatedKeys = gatedPresetKeys(def);
36
+ await writeDts(root, zodShapeToTsFields(z, { ...def.client }, gatedKeys), zodShapeToTsFields(z, {
36
37
  ...def.server,
37
38
  ...def.client
38
- }));
39
+ }, gatedKeys));
40
+ }
41
+ /**
42
+ * Detection-gated preset keys (not user-overridden) validate as optional
43
+ * off-platform — typing them required would lie during local dev.
44
+ */
45
+ function gatedPresetKeys(def) {
46
+ const keys = /* @__PURE__ */ new Set();
47
+ for (const preset of def.presets ?? []) {
48
+ if (!preset.detect) continue;
49
+ for (const side of ["server", "client"]) for (const [key, schema] of Object.entries(preset[side] ?? {})) if (def[side]?.[key] === schema) keys.add(key);
50
+ }
51
+ return keys;
39
52
  }
40
53
  /**
41
54
  * Writes vite-env.d.ts for Standard Schema definitions.
@@ -87,10 +100,10 @@ ${serverFields}
87
100
  function keysToTsFields(keys) {
88
101
  return keys.map((key) => ` readonly ${key}: string`).join("\n");
89
102
  }
90
- function zodShapeToTsFields(z, shape) {
103
+ function zodShapeToTsFields(z, shape, gatedKeys) {
91
104
  return Object.entries(shape).map(([key, schema]) => {
92
105
  const tsType = zodToTs(z, schema);
93
- return ` readonly ${key}${schema instanceof z.ZodOptional ? "?" : ""}: ${tsType}`;
106
+ return ` readonly ${key}${schema instanceof z.ZodOptional || gatedKeys.has(key) ? "?" : ""}: ${tsType}`;
94
107
  }).join("\n");
95
108
  }
96
109
  function zodToTs(z, schema) {
@@ -123,4 +136,4 @@ Object.defineProperty(exports, "generateStandardDts", {
123
136
  }
124
137
  });
125
138
 
126
- //# sourceMappingURL=dts-CJcj6BIn.cjs.map
139
+ //# sourceMappingURL=dts-BX0Cnqo-.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dts-BX0Cnqo-.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(\n def: EnvDefinition,\n root: string,\n): 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)\n 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)\n 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(\n def: StandardEnvDefinition,\n root: string,\n): 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 `// Auto-generated by @vite-env/core${tag ? ` ${tag}` : ''}`,\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 }\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\n .map(key => ` readonly ${key}: string`)\n .join('\\n')\n}\n\nfunction zodShapeToTsFields(z: typeof ZodNs, shape: Record<string, unknown>, gatedKeys: Set<string>): 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)\n return zodToTs(z, schema.unwrap())\n if (schema instanceof z.ZodDefault)\n return zodToTs(z, schema.def.innerType)\n if (schema instanceof z.ZodString)\n return 'string'\n if (schema instanceof z.ZodNumber)\n return 'number'\n if (schema instanceof z.ZodBoolean)\n return 'boolean'\n if (schema instanceof z.ZodEnum)\n return (schema.options as string[]).map(o => `'${o}'`).join(' | ')\n if (schema instanceof z.ZodPipe)\n return zodToTs(z, schema.def.out)\n return 'string'\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,eAAsB,YACpB,KACA,MACe;CACf,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,OACV;AACF,OAAK,MAAM,QAAQ,CAAC,UAAU,SAAS,CACrC,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,OAAO,SAAS,EAAE,CAAC,CAC5D,KAAI,IAAI,QAAQ,SAAS,OACvB,MAAK,IAAI,IAAI;;AAIrB,QAAO;;;;;;AAOT,eAAsB,oBACpB,KACA,MACe;CACf,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,sCAAsC,MAAM,IAAI,QAAQ;EACxD;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;UAErC,GAAG;AACR,QAAM,IAAI,MACR,+CAA+C,KAAK,4BACpD,EAAE,OAAO,GAAG,CACb;;;AAIL,SAAS,eAAe,MAAwB;AAC9C,QAAO,KACJ,KAAI,QAAO,gBAAgB,IAAI,UAAU,CACzC,KAAK,KAAK;;AAGf,SAAS,mBAAmB,GAAiB,OAAgC,WAAgC;AAC3G,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,YACtB,QAAO,QAAQ,GAAG,OAAO,QAAQ,CAAC;AACpC,KAAI,kBAAkB,EAAE,WACtB,QAAO,QAAQ,GAAG,OAAO,IAAI,UAAU;AACzC,KAAI,kBAAkB,EAAE,UACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,UACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,WACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,QACtB,QAAQ,OAAO,QAAqB,KAAI,MAAK,IAAI,EAAE,GAAG,CAAC,KAAK,MAAM;AACpE,KAAI,kBAAkB,EAAE,QACtB,QAAO,QAAQ,GAAG,OAAO,IAAI,IAAI;AACnC,QAAO"}
package/dist/dts.cjs CHANGED
@@ -1,4 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dts = require("./dts-CJcj6BIn.cjs");
2
+ const require_dts = require("./dts-BX0Cnqo-.cjs");
3
3
  exports.generateDts = require_dts.generateDts;
4
4
  exports.generateStandardDts = require_dts.generateStandardDts;
package/dist/dts.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as EnvDefinition, o as StandardEnvDefinition } from "./types-CpYkRwLM.cjs";
1
+ import { n as EnvDefinition, o as StandardEnvDefinition } from "./types-B61nsO8q.cjs";
2
2
 
3
3
  //#region src/dts.d.ts
4
4
  /**
package/dist/dts.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as EnvDefinition, o as StandardEnvDefinition } from "./types--Km3TAdJ.mjs";
1
+ import { n as EnvDefinition, o as StandardEnvDefinition } from "./types-KniR_Oqf.mjs";
2
2
 
3
3
  //#region src/dts.d.ts
4
4
  /**
package/dist/dts.mjs CHANGED
@@ -8,10 +8,23 @@ import fs from "node:fs/promises";
8
8
  */
9
9
  async function generateDts(def, root) {
10
10
  const { z } = await import("zod");
11
- await writeDts(root, zodShapeToTsFields(z, { ...def.client }), zodShapeToTsFields(z, {
11
+ const gatedKeys = gatedPresetKeys(def);
12
+ await writeDts(root, zodShapeToTsFields(z, { ...def.client }, gatedKeys), zodShapeToTsFields(z, {
12
13
  ...def.server,
13
14
  ...def.client
14
- }));
15
+ }, gatedKeys));
16
+ }
17
+ /**
18
+ * Detection-gated preset keys (not user-overridden) validate as optional
19
+ * off-platform — typing them required would lie during local dev.
20
+ */
21
+ function gatedPresetKeys(def) {
22
+ const keys = /* @__PURE__ */ new Set();
23
+ for (const preset of def.presets ?? []) {
24
+ if (!preset.detect) continue;
25
+ for (const side of ["server", "client"]) for (const [key, schema] of Object.entries(preset[side] ?? {})) if (def[side]?.[key] === schema) keys.add(key);
26
+ }
27
+ return keys;
15
28
  }
16
29
  /**
17
30
  * Writes vite-env.d.ts for Standard Schema definitions.
@@ -63,10 +76,10 @@ ${serverFields}
63
76
  function keysToTsFields(keys) {
64
77
  return keys.map((key) => ` readonly ${key}: string`).join("\n");
65
78
  }
66
- function zodShapeToTsFields(z, shape) {
79
+ function zodShapeToTsFields(z, shape, gatedKeys) {
67
80
  return Object.entries(shape).map(([key, schema]) => {
68
81
  const tsType = zodToTs(z, schema);
69
- return ` readonly ${key}${schema instanceof z.ZodOptional ? "?" : ""}: ${tsType}`;
82
+ return ` readonly ${key}${schema instanceof z.ZodOptional || gatedKeys.has(key) ? "?" : ""}: ${tsType}`;
70
83
  }).join("\n");
71
84
  }
72
85
  function zodToTs(z, schema) {
package/dist/dts.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dts.mjs","names":[],"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(\n def: EnvDefinition,\n root: string,\n): Promise<void> {\n const { z } = await import('zod')\n\n const clientFields = zodShapeToTsFields(z, { ...def.client })\n const serverFields = zodShapeToTsFields(z, { ...def.server, ...def.client })\n\n await writeDts(root, clientFields, serverFields)\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(\n def: StandardEnvDefinition,\n root: string,\n): 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 `// Auto-generated by @vite-env/core${tag ? ` ${tag}` : ''}`,\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 }\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\n .map(key => ` readonly ${key}: string`)\n .join('\\n')\n}\n\nfunction zodShapeToTsFields(z: typeof ZodNs, shape: Record<string, unknown>): string {\n return Object.entries(shape)\n .map(([key, schema]) => {\n const tsType = zodToTs(z, schema)\n const optional = schema instanceof z.ZodOptional\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)\n return zodToTs(z, schema.unwrap())\n if (schema instanceof z.ZodDefault)\n return zodToTs(z, schema.def.innerType)\n if (schema instanceof z.ZodString)\n return 'string'\n if (schema instanceof z.ZodNumber)\n return 'number'\n if (schema instanceof z.ZodBoolean)\n return 'boolean'\n if (schema instanceof z.ZodEnum)\n return (schema.options as string[]).map(o => `'${o}'`).join(' | ')\n if (schema instanceof z.ZodPipe)\n return zodToTs(z, schema.def.out)\n return 'string'\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,YACpB,KACA,MACe;CACf,MAAM,EAAE,MAAM,MAAM,OAAO;AAK3B,OAAM,SAAS,MAHM,mBAAmB,GAAG,EAAE,GAAG,IAAI,QAAQ,CAG3B,EAFZ,mBAAmB,GAAG;EAAE,GAAG,IAAI;EAAQ,GAAG,IAAI;EAAQ,CAE5B,CAAC;;;;;;AAOlD,eAAsB,oBACpB,KACA,MACe;CACf,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,sCAAsC,MAAM,IAAI,QAAQ;EACxD;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,WAAW,KAAK,KAAK,MAAM,gBAAgB;AACjD,KAAI;AACF,QAAM,GAAG,UAAU,UAAU,KAAK,QAAQ;UAErC,GAAG;AACR,QAAM,IAAI,MACR,+CAA+C,KAAK,4BACpD,EAAE,OAAO,GAAG,CACb;;;AAIL,SAAS,eAAe,MAAwB;AAC9C,QAAO,KACJ,KAAI,QAAO,gBAAgB,IAAI,UAAU,CACzC,KAAK,KAAK;;AAGf,SAAS,mBAAmB,GAAiB,OAAwC;AACnF,QAAO,OAAO,QAAQ,MAAM,CACzB,KAAK,CAAC,KAAK,YAAY;EACtB,MAAM,SAAS,QAAQ,GAAG,OAAO;AAEjC,SAAO,gBAAgB,MADN,kBAAkB,EAAE,cACG,MAAM,GAAG,IAAI;GACrD,CACD,KAAK,KAAK;;AAGf,SAAS,QAAQ,GAAiB,QAAyB;AACzD,KAAI,kBAAkB,EAAE,YACtB,QAAO,QAAQ,GAAG,OAAO,QAAQ,CAAC;AACpC,KAAI,kBAAkB,EAAE,WACtB,QAAO,QAAQ,GAAG,OAAO,IAAI,UAAU;AACzC,KAAI,kBAAkB,EAAE,UACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,UACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,WACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,QACtB,QAAQ,OAAO,QAAqB,KAAI,MAAK,IAAI,EAAE,GAAG,CAAC,KAAK,MAAM;AACpE,KAAI,kBAAkB,EAAE,QACtB,QAAO,QAAQ,GAAG,OAAO,IAAI,IAAI;AACnC,QAAO"}
1
+ {"version":3,"file":"dts.mjs","names":[],"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(\n def: EnvDefinition,\n root: string,\n): 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)\n 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)\n 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(\n def: StandardEnvDefinition,\n root: string,\n): 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 `// Auto-generated by @vite-env/core${tag ? ` ${tag}` : ''}`,\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 }\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\n .map(key => ` readonly ${key}: string`)\n .join('\\n')\n}\n\nfunction zodShapeToTsFields(z: typeof ZodNs, shape: Record<string, unknown>, gatedKeys: Set<string>): 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)\n return zodToTs(z, schema.unwrap())\n if (schema instanceof z.ZodDefault)\n return zodToTs(z, schema.def.innerType)\n if (schema instanceof z.ZodString)\n return 'string'\n if (schema instanceof z.ZodNumber)\n return 'number'\n if (schema instanceof z.ZodBoolean)\n return 'boolean'\n if (schema instanceof z.ZodEnum)\n return (schema.options as string[]).map(o => `'${o}'`).join(' | ')\n if (schema instanceof z.ZodPipe)\n return zodToTs(z, schema.def.out)\n return 'string'\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,YACpB,KACA,MACe;CACf,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,OACV;AACF,OAAK,MAAM,QAAQ,CAAC,UAAU,SAAS,CACrC,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,OAAO,SAAS,EAAE,CAAC,CAC5D,KAAI,IAAI,QAAQ,SAAS,OACvB,MAAK,IAAI,IAAI;;AAIrB,QAAO;;;;;;AAOT,eAAsB,oBACpB,KACA,MACe;CACf,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,sCAAsC,MAAM,IAAI,QAAQ;EACxD;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,WAAW,KAAK,KAAK,MAAM,gBAAgB;AACjD,KAAI;AACF,QAAM,GAAG,UAAU,UAAU,KAAK,QAAQ;UAErC,GAAG;AACR,QAAM,IAAI,MACR,+CAA+C,KAAK,4BACpD,EAAE,OAAO,GAAG,CACb;;;AAIL,SAAS,eAAe,MAAwB;AAC9C,QAAO,KACJ,KAAI,QAAO,gBAAgB,IAAI,UAAU,CACzC,KAAK,KAAK;;AAGf,SAAS,mBAAmB,GAAiB,OAAgC,WAAgC;AAC3G,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,YACtB,QAAO,QAAQ,GAAG,OAAO,QAAQ,CAAC;AACpC,KAAI,kBAAkB,EAAE,WACtB,QAAO,QAAQ,GAAG,OAAO,IAAI,UAAU;AACzC,KAAI,kBAAkB,EAAE,UACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,UACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,WACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,QACtB,QAAQ,OAAO,QAAqB,KAAI,MAAK,IAAI,EAAE,GAAG,CAAC,KAAK,MAAM;AACpE,KAAI,kBAAkB,EAAE,QACtB,QAAO,QAAQ,GAAG,OAAO,IAAI,IAAI;AACnC,QAAO"}
package/dist/format.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { s as StandardValidationIssue } from "./types-CpYkRwLM.cjs";
1
+ import { s as StandardValidationIssue } from "./types-B61nsO8q.cjs";
2
2
  import { core } from "zod";
3
3
 
4
4
  //#region src/guard.d.ts
package/dist/format.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { s as StandardValidationIssue } from "./types--Km3TAdJ.mjs";
1
+ import { s as StandardValidationIssue } from "./types-KniR_Oqf.mjs";
2
2
  import { core } from "zod";
3
3
 
4
4
  //#region src/guard.d.ts
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as InferServerEnv, i as InferClientEnv, n as EnvDefinition, o as StandardEnvDefinition, r as EnvPreset, t as AnyEnvDefinition } from "./types-CpYkRwLM.cjs";
1
+ import { a as InferServerEnv, i as InferClientEnv, n as EnvDefinition, o as StandardEnvDefinition, r as EnvPreset, t as AnyEnvDefinition } from "./types-B61nsO8q.cjs";
2
2
  import { defineEnv } from "./schema.cjs";
3
3
  import { defineStandardEnv } from "./standard.cjs";
4
4
  export { type AnyEnvDefinition, type EnvDefinition, type EnvPreset, type InferClientEnv, type InferServerEnv, type StandardEnvDefinition, defineEnv, defineStandardEnv };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as InferServerEnv, i as InferClientEnv, n as EnvDefinition, o as StandardEnvDefinition, r as EnvPreset, t as AnyEnvDefinition } from "./types--Km3TAdJ.mjs";
1
+ import { a as InferServerEnv, i as InferClientEnv, n as EnvDefinition, o as StandardEnvDefinition, r as EnvPreset, t as AnyEnvDefinition } from "./types-KniR_Oqf.mjs";
2
2
  import { defineEnv } from "./schema.mjs";
3
3
  import { defineStandardEnv } from "./standard.mjs";
4
4
  export { type AnyEnvDefinition, type EnvDefinition, type EnvPreset, type InferClientEnv, type InferServerEnv, type StandardEnvDefinition, defineEnv, defineStandardEnv };
package/dist/leak.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as AnyEnvDefinition } from "./types-CpYkRwLM.cjs";
1
+ import { t as AnyEnvDefinition } from "./types-B61nsO8q.cjs";
2
2
 
3
3
  //#region src/leak.d.ts
4
4
  type LeakReport = {
package/dist/leak.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as AnyEnvDefinition } from "./types--Km3TAdJ.mjs";
1
+ import { t as AnyEnvDefinition } from "./types-KniR_Oqf.mjs";
2
2
 
3
3
  //#region src/leak.d.ts
4
4
  type LeakReport = {
package/dist/plugin.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_dts = require("./dts-CJcj6BIn.cjs");
1
+ const require_dts = require("./dts-BX0Cnqo-.cjs");
2
2
  const require_standard = require("./standard.cjs");
3
3
  const require_config = require("./config.cjs");
4
4
  const require_format = require("./format.cjs");
@@ -1,72 +1,81 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("../dts-CJcj6BIn.cjs");
2
+ require("../dts-BX0Cnqo-.cjs");
3
3
  let zod = require("zod");
4
4
  //#region src/presets/netlify.ts
5
- const netlify = { server: {
6
- NETLIFY: zod.z.enum(["true"]),
7
- BUILD_ID: zod.z.string().min(1),
8
- CONTEXT: zod.z.enum([
9
- "production",
10
- "deploy-preview",
11
- "branch-deploy",
12
- "dev"
13
- ]),
14
- DEPLOY_ID: zod.z.string().min(1),
15
- DEPLOY_URL: zod.z.url(),
16
- DEPLOY_PRIME_URL: zod.z.url(),
17
- URL: zod.z.url(),
18
- BRANCH: zod.z.string().min(1),
19
- COMMIT_REF: zod.z.string().min(1),
20
- PULL_REQUEST: zod.z.enum(["true"]).optional(),
21
- REVIEW_ID: zod.z.string().optional(),
22
- REPOSITORY_URL: zod.z.url().optional(),
23
- INCOMING_HOOK_TITLE: zod.z.string().optional(),
24
- INCOMING_HOOK_URL: zod.z.url().optional()
25
- } };
5
+ const netlify = {
6
+ server: {
7
+ NETLIFY: zod.z.enum(["true"]),
8
+ BUILD_ID: zod.z.string().min(1),
9
+ CONTEXT: zod.z.enum([
10
+ "production",
11
+ "deploy-preview",
12
+ "branch-deploy",
13
+ "dev"
14
+ ]),
15
+ DEPLOY_ID: zod.z.string().min(1),
16
+ DEPLOY_URL: zod.z.url(),
17
+ DEPLOY_PRIME_URL: zod.z.url(),
18
+ URL: zod.z.url(),
19
+ BRANCH: zod.z.string().min(1),
20
+ COMMIT_REF: zod.z.string().min(1),
21
+ PULL_REQUEST: zod.z.enum(["true"]).optional(),
22
+ REVIEW_ID: zod.z.string().optional(),
23
+ REPOSITORY_URL: zod.z.url().optional(),
24
+ INCOMING_HOOK_TITLE: zod.z.string().optional(),
25
+ INCOMING_HOOK_URL: zod.z.url().optional()
26
+ },
27
+ detect: (env) => env.NETLIFY === "true"
28
+ };
26
29
  //#endregion
27
30
  //#region src/presets/railway.ts
28
- const railway = { server: {
29
- RAILWAY_ENVIRONMENT_ID: zod.z.string().min(1),
30
- RAILWAY_ENVIRONMENT_NAME: zod.z.string().min(1),
31
- RAILWAY_SERVICE_ID: zod.z.string().min(1),
32
- RAILWAY_SERVICE_NAME: zod.z.string().min(1),
33
- RAILWAY_PROJECT_ID: zod.z.string().min(1),
34
- RAILWAY_PROJECT_NAME: zod.z.string().min(1),
35
- RAILWAY_DEPLOYMENT_ID: zod.z.string().min(1),
36
- RAILWAY_REPLICA_ID: zod.z.string().optional(),
37
- RAILWAY_GIT_COMMIT_SHA: zod.z.string().optional(),
38
- RAILWAY_GIT_BRANCH: zod.z.string().optional(),
39
- RAILWAY_GIT_REPO_NAME: zod.z.string().optional(),
40
- RAILWAY_GIT_REPO_OWNER: zod.z.string().optional(),
41
- RAILWAY_PUBLIC_DOMAIN: zod.z.string().min(1).optional(),
42
- RAILWAY_PRIVATE_DOMAIN: zod.z.string().min(1).optional(),
43
- RAILWAY_TCP_PROXY_DOMAIN: zod.z.string().min(1).optional(),
44
- RAILWAY_TCP_PROXY_PORT: zod.z.coerce.number().int().min(1).max(65535).optional()
45
- } };
31
+ const railway = {
32
+ server: {
33
+ RAILWAY_ENVIRONMENT_ID: zod.z.string().min(1),
34
+ RAILWAY_ENVIRONMENT_NAME: zod.z.string().min(1),
35
+ RAILWAY_SERVICE_ID: zod.z.string().min(1),
36
+ RAILWAY_SERVICE_NAME: zod.z.string().min(1),
37
+ RAILWAY_PROJECT_ID: zod.z.string().min(1),
38
+ RAILWAY_PROJECT_NAME: zod.z.string().min(1),
39
+ RAILWAY_DEPLOYMENT_ID: zod.z.string().min(1),
40
+ RAILWAY_REPLICA_ID: zod.z.string().optional(),
41
+ RAILWAY_GIT_COMMIT_SHA: zod.z.string().optional(),
42
+ RAILWAY_GIT_BRANCH: zod.z.string().optional(),
43
+ RAILWAY_GIT_REPO_NAME: zod.z.string().optional(),
44
+ RAILWAY_GIT_REPO_OWNER: zod.z.string().optional(),
45
+ RAILWAY_PUBLIC_DOMAIN: zod.z.string().min(1).optional(),
46
+ RAILWAY_PRIVATE_DOMAIN: zod.z.string().min(1).optional(),
47
+ RAILWAY_TCP_PROXY_DOMAIN: zod.z.string().min(1).optional(),
48
+ RAILWAY_TCP_PROXY_PORT: zod.z.coerce.number().int().min(1).max(65535).optional()
49
+ },
50
+ detect: (env) => !!env.RAILWAY_ENVIRONMENT_ID
51
+ };
46
52
  //#endregion
47
53
  //#region src/presets/vercel.ts
48
- const vercel = { server: {
49
- VERCEL: zod.z.enum(["1"]),
50
- VERCEL_ENV: zod.z.enum([
51
- "production",
52
- "preview",
53
- "development"
54
- ]),
55
- VERCEL_URL: zod.z.string().min(1),
56
- VERCEL_BRANCH_URL: zod.z.string().min(1).optional(),
57
- VERCEL_PROJECT_PRODUCTION_URL: zod.z.string().min(1),
58
- VERCEL_DEPLOYMENT_ID: zod.z.string().min(1),
59
- VERCEL_REGION: zod.z.string().optional(),
60
- VERCEL_GIT_PROVIDER: zod.z.string().optional(),
61
- VERCEL_GIT_REPO_SLUG: zod.z.string().optional(),
62
- VERCEL_GIT_REPO_OWNER: zod.z.string().optional(),
63
- VERCEL_GIT_COMMIT_REF: zod.z.string().optional(),
64
- VERCEL_GIT_COMMIT_SHA: zod.z.string().optional(),
65
- VERCEL_GIT_COMMIT_MESSAGE: zod.z.string().optional(),
66
- VERCEL_GIT_COMMIT_AUTHOR_LOGIN: zod.z.string().optional(),
67
- VERCEL_GIT_PULL_REQUEST_ID: zod.z.string().optional(),
68
- VERCEL_SKEW_PROTECTION_ENABLED: zod.z.enum(["1"]).optional()
69
- } };
54
+ const vercel = {
55
+ server: {
56
+ VERCEL: zod.z.enum(["1"]),
57
+ VERCEL_ENV: zod.z.enum([
58
+ "production",
59
+ "preview",
60
+ "development"
61
+ ]),
62
+ VERCEL_URL: zod.z.string().min(1),
63
+ VERCEL_BRANCH_URL: zod.z.string().min(1).optional(),
64
+ VERCEL_PROJECT_PRODUCTION_URL: zod.z.string().min(1),
65
+ VERCEL_DEPLOYMENT_ID: zod.z.string().min(1),
66
+ VERCEL_REGION: zod.z.string().optional(),
67
+ VERCEL_GIT_PROVIDER: zod.z.string().optional(),
68
+ VERCEL_GIT_REPO_SLUG: zod.z.string().optional(),
69
+ VERCEL_GIT_REPO_OWNER: zod.z.string().optional(),
70
+ VERCEL_GIT_COMMIT_REF: zod.z.string().optional(),
71
+ VERCEL_GIT_COMMIT_SHA: zod.z.string().optional(),
72
+ VERCEL_GIT_COMMIT_MESSAGE: zod.z.string().optional(),
73
+ VERCEL_GIT_COMMIT_AUTHOR_LOGIN: zod.z.string().optional(),
74
+ VERCEL_GIT_PULL_REQUEST_ID: zod.z.string().optional(),
75
+ VERCEL_SKEW_PROTECTION_ENABLED: zod.z.enum(["1"]).optional()
76
+ },
77
+ detect: (env) => env.VERCEL === "1"
78
+ };
70
79
  //#endregion
71
80
  exports.netlify = netlify;
72
81
  exports.railway = railway;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["z","z","z"],"sources":["../../src/presets/netlify.ts","../../src/presets/railway.ts","../../src/presets/vercel.ts"],"sourcesContent":["import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const netlify = {\n server: {\n // Set to 'true' by Netlify to indicate a Netlify build (note: Vercel uses '1', not 'true')\n NETLIFY: z.enum(['true']),\n BUILD_ID: z.string().min(1),\n CONTEXT: z.enum(['production', 'deploy-preview', 'branch-deploy', 'dev']),\n DEPLOY_ID: z.string().min(1),\n // Full https:// URLs — z.url() is correct here unlike VERCEL_URL\n DEPLOY_URL: z.url(),\n DEPLOY_PRIME_URL: z.url(),\n URL: z.url(),\n BRANCH: z.string().min(1),\n COMMIT_REF: z.string().min(1),\n // Netlify sets this to 'true' on PR deploys; absent (not 'false') on non-PR builds\n PULL_REQUEST: z.enum(['true']).optional(),\n REVIEW_ID: z.string().optional(),\n REPOSITORY_URL: z.url().optional(),\n INCOMING_HOOK_TITLE: z.string().optional(),\n INCOMING_HOOK_URL: z.url().optional(),\n },\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const railway = {\n server: {\n RAILWAY_ENVIRONMENT_ID: z.string().min(1),\n RAILWAY_ENVIRONMENT_NAME: z.string().min(1),\n RAILWAY_SERVICE_ID: z.string().min(1),\n RAILWAY_SERVICE_NAME: z.string().min(1),\n RAILWAY_PROJECT_ID: z.string().min(1),\n RAILWAY_PROJECT_NAME: z.string().min(1),\n RAILWAY_DEPLOYMENT_ID: z.string().min(1),\n RAILWAY_REPLICA_ID: z.string().optional(),\n RAILWAY_GIT_COMMIT_SHA: z.string().optional(),\n RAILWAY_GIT_BRANCH: z.string().optional(),\n RAILWAY_GIT_REPO_NAME: z.string().optional(),\n RAILWAY_GIT_REPO_OWNER: z.string().optional(),\n RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),\n RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional(),\n // PORT excluded: generic name set by many tools independently; handle it in your own server config\n },\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const vercel = {\n server: {\n // Set to '1' by Vercel to indicate a Vercel environment\n VERCEL: z.enum(['1']),\n VERCEL_ENV: z.enum(['production', 'preview', 'development']),\n // Bare hostname (e.g. myapp-abc123.vercel.app) — no scheme, z.url() would reject it\n VERCEL_URL: z.string().min(1),\n VERCEL_BRANCH_URL: z.string().min(1).optional(),\n VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),\n VERCEL_DEPLOYMENT_ID: z.string().min(1),\n VERCEL_REGION: z.string().optional(),\n // z.string() not enum — Vercel may add providers (Azure DevOps, self-hosted GitLab) without notice\n VERCEL_GIT_PROVIDER: z.string().optional(),\n VERCEL_GIT_REPO_SLUG: z.string().optional(),\n VERCEL_GIT_REPO_OWNER: z.string().optional(),\n VERCEL_GIT_COMMIT_REF: z.string().optional(),\n VERCEL_GIT_COMMIT_SHA: z.string().optional(),\n VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),\n VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),\n VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),\n VERCEL_SKEW_PROTECTION_ENABLED: z.enum(['1']).optional(),\n },\n} satisfies EnvPreset\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["z","z","z"],"sources":["../../src/presets/netlify.ts","../../src/presets/railway.ts","../../src/presets/vercel.ts"],"sourcesContent":["import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const netlify = {\n server: {\n // Set to 'true' by Netlify to indicate a Netlify build (note: Vercel uses '1', not 'true')\n NETLIFY: z.enum(['true']),\n BUILD_ID: z.string().min(1),\n CONTEXT: z.enum(['production', 'deploy-preview', 'branch-deploy', 'dev']),\n DEPLOY_ID: z.string().min(1),\n // Full https:// URLs — z.url() is correct here unlike VERCEL_URL\n DEPLOY_URL: z.url(),\n DEPLOY_PRIME_URL: z.url(),\n URL: z.url(),\n BRANCH: z.string().min(1),\n COMMIT_REF: z.string().min(1),\n // Netlify sets this to 'true' on PR deploys; absent (not 'false') on non-PR builds\n PULL_REQUEST: z.enum(['true']).optional(),\n REVIEW_ID: z.string().optional(),\n REPOSITORY_URL: z.url().optional(),\n INCOMING_HOOK_TITLE: z.string().optional(),\n INCOMING_HOOK_URL: z.url().optional(),\n },\n // Netlify sets NETLIFY=true during builds and under `netlify dev`\n detect: env => env.NETLIFY === 'true',\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const railway = {\n server: {\n RAILWAY_ENVIRONMENT_ID: z.string().min(1),\n RAILWAY_ENVIRONMENT_NAME: z.string().min(1),\n RAILWAY_SERVICE_ID: z.string().min(1),\n RAILWAY_SERVICE_NAME: z.string().min(1),\n RAILWAY_PROJECT_ID: z.string().min(1),\n RAILWAY_PROJECT_NAME: z.string().min(1),\n RAILWAY_DEPLOYMENT_ID: z.string().min(1),\n RAILWAY_REPLICA_ID: z.string().optional(),\n RAILWAY_GIT_COMMIT_SHA: z.string().optional(),\n RAILWAY_GIT_BRANCH: z.string().optional(),\n RAILWAY_GIT_REPO_NAME: z.string().optional(),\n RAILWAY_GIT_REPO_OWNER: z.string().optional(),\n RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),\n RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional(),\n // PORT excluded: generic name set by many tools independently; handle it in your own server config\n },\n // Railway always injects the environment id at runtime\n detect: env => !!env.RAILWAY_ENVIRONMENT_ID,\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const vercel = {\n server: {\n // Set to '1' by Vercel to indicate a Vercel environment\n VERCEL: z.enum(['1']),\n VERCEL_ENV: z.enum(['production', 'preview', 'development']),\n // Bare hostname (e.g. myapp-abc123.vercel.app) — no scheme, z.url() would reject it\n VERCEL_URL: z.string().min(1),\n VERCEL_BRANCH_URL: z.string().min(1).optional(),\n VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),\n VERCEL_DEPLOYMENT_ID: z.string().min(1),\n VERCEL_REGION: z.string().optional(),\n // z.string() not enum — Vercel may add providers (Azure DevOps, self-hosted GitLab) without notice\n VERCEL_GIT_PROVIDER: z.string().optional(),\n VERCEL_GIT_REPO_SLUG: z.string().optional(),\n VERCEL_GIT_REPO_OWNER: z.string().optional(),\n VERCEL_GIT_COMMIT_REF: z.string().optional(),\n VERCEL_GIT_COMMIT_SHA: z.string().optional(),\n VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),\n VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),\n VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),\n VERCEL_SKEW_PROTECTION_ENABLED: z.enum(['1']).optional(),\n },\n // Vercel sets VERCEL=1 on builds and under `vercel dev`\n detect: env => env.VERCEL === '1',\n} satisfies EnvPreset\n"],"mappings":"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"}
@@ -27,6 +27,7 @@ declare const netlify: {
27
27
  INCOMING_HOOK_TITLE: z.ZodOptional<z.ZodString>;
28
28
  INCOMING_HOOK_URL: z.ZodOptional<z.ZodURL>;
29
29
  };
30
+ detect: (env: Record<string, string | undefined>) => boolean;
30
31
  };
31
32
  //#endregion
32
33
  //#region src/presets/railway.d.ts
@@ -49,6 +50,7 @@ declare const railway: {
49
50
  RAILWAY_TCP_PROXY_DOMAIN: z.ZodOptional<z.ZodString>;
50
51
  RAILWAY_TCP_PROXY_PORT: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
51
52
  };
53
+ detect: (env: Record<string, string | undefined>) => boolean;
52
54
  };
53
55
  //#endregion
54
56
  //#region src/presets/vercel.d.ts
@@ -79,6 +81,7 @@ declare const vercel: {
79
81
  1: "1";
80
82
  }>>;
81
83
  };
84
+ detect: (env: Record<string, string | undefined>) => boolean;
82
85
  };
83
86
  //#endregion
84
87
  export { netlify, railway, vercel };
@@ -27,6 +27,7 @@ declare const netlify: {
27
27
  INCOMING_HOOK_TITLE: z.ZodOptional<z.ZodString>;
28
28
  INCOMING_HOOK_URL: z.ZodOptional<z.ZodURL>;
29
29
  };
30
+ detect: (env: Record<string, string | undefined>) => boolean;
30
31
  };
31
32
  //#endregion
32
33
  //#region src/presets/railway.d.ts
@@ -49,6 +50,7 @@ declare const railway: {
49
50
  RAILWAY_TCP_PROXY_DOMAIN: z.ZodOptional<z.ZodString>;
50
51
  RAILWAY_TCP_PROXY_PORT: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
51
52
  };
53
+ detect: (env: Record<string, string | undefined>) => boolean;
52
54
  };
53
55
  //#endregion
54
56
  //#region src/presets/vercel.d.ts
@@ -79,6 +81,7 @@ declare const vercel: {
79
81
  1: "1";
80
82
  }>>;
81
83
  };
84
+ detect: (env: Record<string, string | undefined>) => boolean;
82
85
  };
83
86
  //#endregion
84
87
  export { netlify, railway, vercel };
@@ -1,70 +1,79 @@
1
1
  import { z } from "zod";
2
2
  //#region src/presets/netlify.ts
3
- const netlify = { server: {
4
- NETLIFY: z.enum(["true"]),
5
- BUILD_ID: z.string().min(1),
6
- CONTEXT: z.enum([
7
- "production",
8
- "deploy-preview",
9
- "branch-deploy",
10
- "dev"
11
- ]),
12
- DEPLOY_ID: z.string().min(1),
13
- DEPLOY_URL: z.url(),
14
- DEPLOY_PRIME_URL: z.url(),
15
- URL: z.url(),
16
- BRANCH: z.string().min(1),
17
- COMMIT_REF: z.string().min(1),
18
- PULL_REQUEST: z.enum(["true"]).optional(),
19
- REVIEW_ID: z.string().optional(),
20
- REPOSITORY_URL: z.url().optional(),
21
- INCOMING_HOOK_TITLE: z.string().optional(),
22
- INCOMING_HOOK_URL: z.url().optional()
23
- } };
3
+ const netlify = {
4
+ server: {
5
+ NETLIFY: z.enum(["true"]),
6
+ BUILD_ID: z.string().min(1),
7
+ CONTEXT: z.enum([
8
+ "production",
9
+ "deploy-preview",
10
+ "branch-deploy",
11
+ "dev"
12
+ ]),
13
+ DEPLOY_ID: z.string().min(1),
14
+ DEPLOY_URL: z.url(),
15
+ DEPLOY_PRIME_URL: z.url(),
16
+ URL: z.url(),
17
+ BRANCH: z.string().min(1),
18
+ COMMIT_REF: z.string().min(1),
19
+ PULL_REQUEST: z.enum(["true"]).optional(),
20
+ REVIEW_ID: z.string().optional(),
21
+ REPOSITORY_URL: z.url().optional(),
22
+ INCOMING_HOOK_TITLE: z.string().optional(),
23
+ INCOMING_HOOK_URL: z.url().optional()
24
+ },
25
+ detect: (env) => env.NETLIFY === "true"
26
+ };
24
27
  //#endregion
25
28
  //#region src/presets/railway.ts
26
- const railway = { server: {
27
- RAILWAY_ENVIRONMENT_ID: z.string().min(1),
28
- RAILWAY_ENVIRONMENT_NAME: z.string().min(1),
29
- RAILWAY_SERVICE_ID: z.string().min(1),
30
- RAILWAY_SERVICE_NAME: z.string().min(1),
31
- RAILWAY_PROJECT_ID: z.string().min(1),
32
- RAILWAY_PROJECT_NAME: z.string().min(1),
33
- RAILWAY_DEPLOYMENT_ID: z.string().min(1),
34
- RAILWAY_REPLICA_ID: z.string().optional(),
35
- RAILWAY_GIT_COMMIT_SHA: z.string().optional(),
36
- RAILWAY_GIT_BRANCH: z.string().optional(),
37
- RAILWAY_GIT_REPO_NAME: z.string().optional(),
38
- RAILWAY_GIT_REPO_OWNER: z.string().optional(),
39
- RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),
40
- RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),
41
- RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),
42
- RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional()
43
- } };
29
+ const railway = {
30
+ server: {
31
+ RAILWAY_ENVIRONMENT_ID: z.string().min(1),
32
+ RAILWAY_ENVIRONMENT_NAME: z.string().min(1),
33
+ RAILWAY_SERVICE_ID: z.string().min(1),
34
+ RAILWAY_SERVICE_NAME: z.string().min(1),
35
+ RAILWAY_PROJECT_ID: z.string().min(1),
36
+ RAILWAY_PROJECT_NAME: z.string().min(1),
37
+ RAILWAY_DEPLOYMENT_ID: z.string().min(1),
38
+ RAILWAY_REPLICA_ID: z.string().optional(),
39
+ RAILWAY_GIT_COMMIT_SHA: z.string().optional(),
40
+ RAILWAY_GIT_BRANCH: z.string().optional(),
41
+ RAILWAY_GIT_REPO_NAME: z.string().optional(),
42
+ RAILWAY_GIT_REPO_OWNER: z.string().optional(),
43
+ RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),
44
+ RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),
45
+ RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),
46
+ RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional()
47
+ },
48
+ detect: (env) => !!env.RAILWAY_ENVIRONMENT_ID
49
+ };
44
50
  //#endregion
45
51
  //#region src/presets/vercel.ts
46
- const vercel = { server: {
47
- VERCEL: z.enum(["1"]),
48
- VERCEL_ENV: z.enum([
49
- "production",
50
- "preview",
51
- "development"
52
- ]),
53
- VERCEL_URL: z.string().min(1),
54
- VERCEL_BRANCH_URL: z.string().min(1).optional(),
55
- VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),
56
- VERCEL_DEPLOYMENT_ID: z.string().min(1),
57
- VERCEL_REGION: z.string().optional(),
58
- VERCEL_GIT_PROVIDER: z.string().optional(),
59
- VERCEL_GIT_REPO_SLUG: z.string().optional(),
60
- VERCEL_GIT_REPO_OWNER: z.string().optional(),
61
- VERCEL_GIT_COMMIT_REF: z.string().optional(),
62
- VERCEL_GIT_COMMIT_SHA: z.string().optional(),
63
- VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),
64
- VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),
65
- VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),
66
- VERCEL_SKEW_PROTECTION_ENABLED: z.enum(["1"]).optional()
67
- } };
52
+ const vercel = {
53
+ server: {
54
+ VERCEL: z.enum(["1"]),
55
+ VERCEL_ENV: z.enum([
56
+ "production",
57
+ "preview",
58
+ "development"
59
+ ]),
60
+ VERCEL_URL: z.string().min(1),
61
+ VERCEL_BRANCH_URL: z.string().min(1).optional(),
62
+ VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),
63
+ VERCEL_DEPLOYMENT_ID: z.string().min(1),
64
+ VERCEL_REGION: z.string().optional(),
65
+ VERCEL_GIT_PROVIDER: z.string().optional(),
66
+ VERCEL_GIT_REPO_SLUG: z.string().optional(),
67
+ VERCEL_GIT_REPO_OWNER: z.string().optional(),
68
+ VERCEL_GIT_COMMIT_REF: z.string().optional(),
69
+ VERCEL_GIT_COMMIT_SHA: z.string().optional(),
70
+ VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),
71
+ VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),
72
+ VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),
73
+ VERCEL_SKEW_PROTECTION_ENABLED: z.enum(["1"]).optional()
74
+ },
75
+ detect: (env) => env.VERCEL === "1"
76
+ };
68
77
  //#endregion
69
78
  export { netlify, railway, vercel };
70
79
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/presets/netlify.ts","../../src/presets/railway.ts","../../src/presets/vercel.ts"],"sourcesContent":["import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const netlify = {\n server: {\n // Set to 'true' by Netlify to indicate a Netlify build (note: Vercel uses '1', not 'true')\n NETLIFY: z.enum(['true']),\n BUILD_ID: z.string().min(1),\n CONTEXT: z.enum(['production', 'deploy-preview', 'branch-deploy', 'dev']),\n DEPLOY_ID: z.string().min(1),\n // Full https:// URLs — z.url() is correct here unlike VERCEL_URL\n DEPLOY_URL: z.url(),\n DEPLOY_PRIME_URL: z.url(),\n URL: z.url(),\n BRANCH: z.string().min(1),\n COMMIT_REF: z.string().min(1),\n // Netlify sets this to 'true' on PR deploys; absent (not 'false') on non-PR builds\n PULL_REQUEST: z.enum(['true']).optional(),\n REVIEW_ID: z.string().optional(),\n REPOSITORY_URL: z.url().optional(),\n INCOMING_HOOK_TITLE: z.string().optional(),\n INCOMING_HOOK_URL: z.url().optional(),\n },\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const railway = {\n server: {\n RAILWAY_ENVIRONMENT_ID: z.string().min(1),\n RAILWAY_ENVIRONMENT_NAME: z.string().min(1),\n RAILWAY_SERVICE_ID: z.string().min(1),\n RAILWAY_SERVICE_NAME: z.string().min(1),\n RAILWAY_PROJECT_ID: z.string().min(1),\n RAILWAY_PROJECT_NAME: z.string().min(1),\n RAILWAY_DEPLOYMENT_ID: z.string().min(1),\n RAILWAY_REPLICA_ID: z.string().optional(),\n RAILWAY_GIT_COMMIT_SHA: z.string().optional(),\n RAILWAY_GIT_BRANCH: z.string().optional(),\n RAILWAY_GIT_REPO_NAME: z.string().optional(),\n RAILWAY_GIT_REPO_OWNER: z.string().optional(),\n RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),\n RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional(),\n // PORT excluded: generic name set by many tools independently; handle it in your own server config\n },\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const vercel = {\n server: {\n // Set to '1' by Vercel to indicate a Vercel environment\n VERCEL: z.enum(['1']),\n VERCEL_ENV: z.enum(['production', 'preview', 'development']),\n // Bare hostname (e.g. myapp-abc123.vercel.app) — no scheme, z.url() would reject it\n VERCEL_URL: z.string().min(1),\n VERCEL_BRANCH_URL: z.string().min(1).optional(),\n VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),\n VERCEL_DEPLOYMENT_ID: z.string().min(1),\n VERCEL_REGION: z.string().optional(),\n // z.string() not enum — Vercel may add providers (Azure DevOps, self-hosted GitLab) without notice\n VERCEL_GIT_PROVIDER: z.string().optional(),\n VERCEL_GIT_REPO_SLUG: z.string().optional(),\n VERCEL_GIT_REPO_OWNER: z.string().optional(),\n VERCEL_GIT_COMMIT_REF: z.string().optional(),\n VERCEL_GIT_COMMIT_SHA: z.string().optional(),\n VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),\n VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),\n VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),\n VERCEL_SKEW_PROTECTION_ENABLED: z.enum(['1']).optional(),\n },\n} satisfies EnvPreset\n"],"mappings":";;AAGA,MAAa,UAAU,EACrB,QAAQ;CAEN,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;CACzB,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC3B,SAAS,EAAE,KAAK;EAAC;EAAc;EAAkB;EAAiB;EAAM,CAAC;CACzE,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE;CAE5B,YAAY,EAAE,KAAK;CACnB,kBAAkB,EAAE,KAAK;CACzB,KAAK,EAAE,KAAK;CACZ,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzB,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE;CAE7B,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU;CACzC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,gBAAgB,EAAE,KAAK,CAAC,UAAU;CAClC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;CAC1C,mBAAmB,EAAE,KAAK,CAAC,UAAU;CACtC,EACF;;;ACpBD,MAAa,UAAU,EACrB,QAAQ;CACN,wBAAwB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACzC,0BAA0B,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC3C,oBAAoB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACrC,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvC,oBAAoB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACrC,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvC,uBAAuB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACxC,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CACzC,wBAAwB,EAAE,QAAQ,CAAC,UAAU;CAC7C,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CACzC,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAC5C,wBAAwB,EAAE,QAAQ,CAAC,UAAU;CAC7C,uBAAuB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACnD,wBAAwB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACpD,0BAA0B,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CACtD,wBAAwB,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU;CAE7E,EACF;;;ACpBD,MAAa,SAAS,EACpB,QAAQ;CAEN,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;CACrB,YAAY,EAAE,KAAK;EAAC;EAAc;EAAW;EAAc,CAAC;CAE5D,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC7B,mBAAmB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;CAC/C,+BAA+B,EAAE,QAAQ,CAAC,IAAI,EAAE;CAChD,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;CACvC,eAAe,EAAE,QAAQ,CAAC,UAAU;CAEpC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;CAC1C,sBAAsB,EAAE,QAAQ,CAAC,UAAU;CAC3C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAC5C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAC5C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAC5C,2BAA2B,EAAE,QAAQ,CAAC,UAAU;CAChD,gCAAgC,EAAE,QAAQ,CAAC,UAAU;CACrD,4BAA4B,EAAE,QAAQ,CAAC,UAAU;CACjD,gCAAgC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU;CACzD,EACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/presets/netlify.ts","../../src/presets/railway.ts","../../src/presets/vercel.ts"],"sourcesContent":["import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const netlify = {\n server: {\n // Set to 'true' by Netlify to indicate a Netlify build (note: Vercel uses '1', not 'true')\n NETLIFY: z.enum(['true']),\n BUILD_ID: z.string().min(1),\n CONTEXT: z.enum(['production', 'deploy-preview', 'branch-deploy', 'dev']),\n DEPLOY_ID: z.string().min(1),\n // Full https:// URLs — z.url() is correct here unlike VERCEL_URL\n DEPLOY_URL: z.url(),\n DEPLOY_PRIME_URL: z.url(),\n URL: z.url(),\n BRANCH: z.string().min(1),\n COMMIT_REF: z.string().min(1),\n // Netlify sets this to 'true' on PR deploys; absent (not 'false') on non-PR builds\n PULL_REQUEST: z.enum(['true']).optional(),\n REVIEW_ID: z.string().optional(),\n REPOSITORY_URL: z.url().optional(),\n INCOMING_HOOK_TITLE: z.string().optional(),\n INCOMING_HOOK_URL: z.url().optional(),\n },\n // Netlify sets NETLIFY=true during builds and under `netlify dev`\n detect: env => env.NETLIFY === 'true',\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const railway = {\n server: {\n RAILWAY_ENVIRONMENT_ID: z.string().min(1),\n RAILWAY_ENVIRONMENT_NAME: z.string().min(1),\n RAILWAY_SERVICE_ID: z.string().min(1),\n RAILWAY_SERVICE_NAME: z.string().min(1),\n RAILWAY_PROJECT_ID: z.string().min(1),\n RAILWAY_PROJECT_NAME: z.string().min(1),\n RAILWAY_DEPLOYMENT_ID: z.string().min(1),\n RAILWAY_REPLICA_ID: z.string().optional(),\n RAILWAY_GIT_COMMIT_SHA: z.string().optional(),\n RAILWAY_GIT_BRANCH: z.string().optional(),\n RAILWAY_GIT_REPO_NAME: z.string().optional(),\n RAILWAY_GIT_REPO_OWNER: z.string().optional(),\n RAILWAY_PUBLIC_DOMAIN: z.string().min(1).optional(),\n RAILWAY_PRIVATE_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_DOMAIN: z.string().min(1).optional(),\n RAILWAY_TCP_PROXY_PORT: z.coerce.number().int().min(1).max(65535).optional(),\n // PORT excluded: generic name set by many tools independently; handle it in your own server config\n },\n // Railway always injects the environment id at runtime\n detect: env => !!env.RAILWAY_ENVIRONMENT_ID,\n} satisfies EnvPreset\n","import type { EnvPreset } from '../types'\nimport { z } from 'zod'\n\nexport const vercel = {\n server: {\n // Set to '1' by Vercel to indicate a Vercel environment\n VERCEL: z.enum(['1']),\n VERCEL_ENV: z.enum(['production', 'preview', 'development']),\n // Bare hostname (e.g. myapp-abc123.vercel.app) — no scheme, z.url() would reject it\n VERCEL_URL: z.string().min(1),\n VERCEL_BRANCH_URL: z.string().min(1).optional(),\n VERCEL_PROJECT_PRODUCTION_URL: z.string().min(1),\n VERCEL_DEPLOYMENT_ID: z.string().min(1),\n VERCEL_REGION: z.string().optional(),\n // z.string() not enum — Vercel may add providers (Azure DevOps, self-hosted GitLab) without notice\n VERCEL_GIT_PROVIDER: z.string().optional(),\n VERCEL_GIT_REPO_SLUG: z.string().optional(),\n VERCEL_GIT_REPO_OWNER: z.string().optional(),\n VERCEL_GIT_COMMIT_REF: z.string().optional(),\n VERCEL_GIT_COMMIT_SHA: z.string().optional(),\n VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),\n VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),\n VERCEL_GIT_PULL_REQUEST_ID: z.string().optional(),\n VERCEL_SKEW_PROTECTION_ENABLED: z.enum(['1']).optional(),\n },\n // Vercel sets VERCEL=1 on builds and under `vercel dev`\n detect: env => env.VERCEL === '1',\n} satisfies EnvPreset\n"],"mappings":";;AAGA,MAAa,UAAU;CACrB,QAAQ;EAEN,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;EACzB,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE;EAC3B,SAAS,EAAE,KAAK;GAAC;GAAc;GAAkB;GAAiB;GAAM,CAAC;EACzE,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE;EAE5B,YAAY,EAAE,KAAK;EACnB,kBAAkB,EAAE,KAAK;EACzB,KAAK,EAAE,KAAK;EACZ,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;EACzB,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE;EAE7B,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU;EACzC,WAAW,EAAE,QAAQ,CAAC,UAAU;EAChC,gBAAgB,EAAE,KAAK,CAAC,UAAU;EAClC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;EAC1C,mBAAmB,EAAE,KAAK,CAAC,UAAU;EACtC;CAED,SAAQ,QAAO,IAAI,YAAY;CAChC;;;ACtBD,MAAa,UAAU;CACrB,QAAQ;EACN,wBAAwB,EAAE,QAAQ,CAAC,IAAI,EAAE;EACzC,0BAA0B,EAAE,QAAQ,CAAC,IAAI,EAAE;EAC3C,oBAAoB,EAAE,QAAQ,CAAC,IAAI,EAAE;EACrC,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;EACvC,oBAAoB,EAAE,QAAQ,CAAC,IAAI,EAAE;EACrC,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;EACvC,uBAAuB,EAAE,QAAQ,CAAC,IAAI,EAAE;EACxC,oBAAoB,EAAE,QAAQ,CAAC,UAAU;EACzC,wBAAwB,EAAE,QAAQ,CAAC,UAAU;EAC7C,oBAAoB,EAAE,QAAQ,CAAC,UAAU;EACzC,uBAAuB,EAAE,QAAQ,CAAC,UAAU;EAC5C,wBAAwB,EAAE,QAAQ,CAAC,UAAU;EAC7C,uBAAuB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;EACnD,wBAAwB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;EACpD,0BAA0B,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;EACtD,wBAAwB,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU;EAE7E;CAED,SAAQ,QAAO,CAAC,CAAC,IAAI;CACtB;;;ACtBD,MAAa,SAAS;CACpB,QAAQ;EAEN,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;EACrB,YAAY,EAAE,KAAK;GAAC;GAAc;GAAW;GAAc,CAAC;EAE5D,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE;EAC7B,mBAAmB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU;EAC/C,+BAA+B,EAAE,QAAQ,CAAC,IAAI,EAAE;EAChD,sBAAsB,EAAE,QAAQ,CAAC,IAAI,EAAE;EACvC,eAAe,EAAE,QAAQ,CAAC,UAAU;EAEpC,qBAAqB,EAAE,QAAQ,CAAC,UAAU;EAC1C,sBAAsB,EAAE,QAAQ,CAAC,UAAU;EAC3C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;EAC5C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;EAC5C,uBAAuB,EAAE,QAAQ,CAAC,UAAU;EAC5C,2BAA2B,EAAE,QAAQ,CAAC,UAAU;EAChD,gCAAgC,EAAE,QAAQ,CAAC,UAAU;EACrD,4BAA4B,EAAE,QAAQ,CAAC,UAAU;EACjD,gCAAgC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU;EACzD;CAED,SAAQ,QAAO,IAAI,WAAW;CAC/B"}
package/dist/schema.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./dts-CJcj6BIn.cjs");
2
+ require("./dts-BX0Cnqo-.cjs");
3
3
  let zod = require("zod");
4
4
  //#region src/schema.ts
5
5
  function warnSideConflicts(keys, seen, userKeys, side) {
@@ -27,6 +27,7 @@ function defineEnv(definition) {
27
27
  const result = { ...rest };
28
28
  if (Object.keys(mergedServer).length > 0 || server !== void 0) result.server = mergedServer;
29
29
  if (Object.keys(mergedClient).length > 0 || client !== void 0) result.client = mergedClient;
30
+ if (presets.length > 0) result.presets = presets;
30
31
  return result;
31
32
  }
32
33
  function validateEnv(def, rawEnv) {
@@ -34,6 +35,10 @@ function validateEnv(def, rawEnv) {
34
35
  ...def.server,
35
36
  ...def.client
36
37
  };
38
+ for (const preset of def.presets ?? []) {
39
+ if (!preset.detect || preset.detect(rawEnv)) continue;
40
+ for (const side of [preset.server, preset.client]) for (const [key, presetSchema] of Object.entries(side ?? {})) if (combinedShape[key] === presetSchema) combinedShape[key] = zod.z.optional(combinedShape[key]);
41
+ }
37
42
  const result = zod.z.object(combinedShape).safeParse(rawEnv);
38
43
  if (result.success) return {
39
44
  success: true,
@@ -1 +1 @@
1
- {"version":3,"file":"schema.cjs","names":["z"],"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(`[vite-env] \"${key}\" is defined in both a preset and your ${side} config. Your definition wins.`)\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>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client'> {\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({}, ...presets.map(p => p.server ?? {}), server)\n const mergedClient: z.ZodRawShape = Object.assign({}, ...presets.map(p => p.client ?? {}), client)\n\n warnConflicts(\n presets,\n new Set(Object.keys(server ?? {})),\n new Set(Object.keys(client ?? {})),\n )\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)\n result.server = mergedServer\n if (Object.keys(mergedClient).length > 0 || client !== undefined)\n result.client = mergedClient\n\n return result as Omit<T, 'presets'>\n}\n\nexport function validateEnv(\n def: EnvDefinition,\n rawEnv: Record<string, string>,\n): ValidationResult {\n const combinedShape = {\n ...def.server,\n ...def.client,\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,KAAK,eAAe,IAAI,yCAAyC,KAAK,gCAAgC;;;AAIpH,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,UAAoC,YAA8E;CAChI,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,QAAQ,GAAG,SAAS;CAGlD,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;CAClG,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;AAElG,eACE,SACA,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,EAClC,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CACnC;AAED,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,EACrD,QAAO,SAAS;AAClB,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EACrD,QAAO,SAAS;AAElB,QAAO;;AAGT,SAAgB,YACd,KACA,QACkB;CAClB,MAAM,gBAAgB;EACpB,GAAG,IAAI;EACP,GAAG,IAAI;EACR;CAGD,MAAM,SADSA,IAAAA,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"}
1
+ {"version":3,"file":"schema.cjs","names":["z"],"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(`[vite-env] \"${key}\" is defined in both a preset and your ${side} config. Your definition wins.`)\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>(definition: T): 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({}, ...presets.map(p => p.server ?? {}), server)\n const mergedClient: z.ZodRawShape = Object.assign({}, ...presets.map(p => p.client ?? {}), client)\n\n warnConflicts(\n presets,\n new Set(Object.keys(server ?? {})),\n new Set(Object.keys(client ?? {})),\n )\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)\n result.server = mergedServer\n if (Object.keys(mergedClient).length > 0 || client !== undefined)\n result.client = mergedClient\n if (presets.length > 0)\n result.presets = presets\n\n return result as Omit<T, 'presets'> & Pick<EnvDefinition, 'presets'>\n}\n\nexport function validateEnv(\n def: EnvDefinition,\n rawEnv: Record<string, string>,\n): 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))\n 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,KAAK,eAAe,IAAI,yCAAyC,KAAK,gCAAgC;;;AAIpH,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,UAAoC,YAA0F;CAC5I,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,QAAQ,GAAG,SAAS;CAGlD,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;CAClG,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;AAElG,eACE,SACA,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,EAClC,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CACnC;AAED,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,EACrD,QAAO,SAAS;AAClB,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EACrD,QAAO,SAAS;AAClB,KAAI,QAAQ,SAAS,EACnB,QAAO,UAAU;AAEnB,QAAO;;AAGT,SAAgB,YACd,KACA,QACkB;CAClB,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,CACzC;AACF,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,OAAOA,IAAAA,EAAE,SAAS,cAAc,KAAK;;CAM3D,MAAM,SADSA,IAAAA,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"}
package/dist/schema.d.cts CHANGED
@@ -1,10 +1,10 @@
1
- import { l as ValidationResult, n as EnvDefinition, r as EnvPreset } from "./types-CpYkRwLM.cjs";
1
+ import { l as ValidationResult, n as EnvDefinition, r as EnvPreset } from "./types-B61nsO8q.cjs";
2
2
 
3
3
  //#region src/schema.d.ts
4
4
  type DefineEnvInput = {
5
5
  presets?: EnvPreset[];
6
6
  } & EnvDefinition;
7
- declare function defineEnv<T extends DefineEnvInput>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client'>;
7
+ declare function defineEnv<T extends DefineEnvInput>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client' | 'presets'>;
8
8
  declare function validateEnv(def: EnvDefinition, rawEnv: Record<string, string>): ValidationResult;
9
9
  //#endregion
10
10
  export { defineEnv, validateEnv };
package/dist/schema.d.mts CHANGED
@@ -1,10 +1,10 @@
1
- import { l as ValidationResult, n as EnvDefinition, r as EnvPreset } from "./types--Km3TAdJ.mjs";
1
+ import { l as ValidationResult, n as EnvDefinition, r as EnvPreset } from "./types-KniR_Oqf.mjs";
2
2
 
3
3
  //#region src/schema.d.ts
4
4
  type DefineEnvInput = {
5
5
  presets?: EnvPreset[];
6
6
  } & EnvDefinition;
7
- declare function defineEnv<T extends DefineEnvInput>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client'>;
7
+ declare function defineEnv<T extends DefineEnvInput>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client' | 'presets'>;
8
8
  declare function validateEnv(def: EnvDefinition, rawEnv: Record<string, string>): ValidationResult;
9
9
  //#endregion
10
10
  export { defineEnv, validateEnv };
package/dist/schema.mjs CHANGED
@@ -25,6 +25,7 @@ function defineEnv(definition) {
25
25
  const result = { ...rest };
26
26
  if (Object.keys(mergedServer).length > 0 || server !== void 0) result.server = mergedServer;
27
27
  if (Object.keys(mergedClient).length > 0 || client !== void 0) result.client = mergedClient;
28
+ if (presets.length > 0) result.presets = presets;
28
29
  return result;
29
30
  }
30
31
  function validateEnv(def, rawEnv) {
@@ -32,6 +33,10 @@ function validateEnv(def, rawEnv) {
32
33
  ...def.server,
33
34
  ...def.client
34
35
  };
36
+ for (const preset of def.presets ?? []) {
37
+ if (!preset.detect || preset.detect(rawEnv)) continue;
38
+ for (const side of [preset.server, preset.client]) for (const [key, presetSchema] of Object.entries(side ?? {})) if (combinedShape[key] === presetSchema) combinedShape[key] = z.optional(combinedShape[key]);
39
+ }
35
40
  const result = z.object(combinedShape).safeParse(rawEnv);
36
41
  if (result.success) return {
37
42
  success: true,
@@ -1 +1 @@
1
- {"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(`[vite-env] \"${key}\" is defined in both a preset and your ${side} config. Your definition wins.`)\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>(definition: T): Omit<T, 'presets'> & Pick<EnvDefinition, 'server' | 'client'> {\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({}, ...presets.map(p => p.server ?? {}), server)\n const mergedClient: z.ZodRawShape = Object.assign({}, ...presets.map(p => p.client ?? {}), client)\n\n warnConflicts(\n presets,\n new Set(Object.keys(server ?? {})),\n new Set(Object.keys(client ?? {})),\n )\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)\n result.server = mergedServer\n if (Object.keys(mergedClient).length > 0 || client !== undefined)\n result.client = mergedClient\n\n return result as Omit<T, 'presets'>\n}\n\nexport function validateEnv(\n def: EnvDefinition,\n rawEnv: Record<string, string>,\n): ValidationResult {\n const combinedShape = {\n ...def.server,\n ...def.client,\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,KAAK,eAAe,IAAI,yCAAyC,KAAK,gCAAgC;;;AAIpH,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,UAAoC,YAA8E;CAChI,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,QAAQ,GAAG,SAAS;CAGlD,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;CAClG,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;AAElG,eACE,SACA,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,EAClC,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CACnC;AAED,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,EACrD,QAAO,SAAS;AAClB,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EACrD,QAAO,SAAS;AAElB,QAAO;;AAGT,SAAgB,YACd,KACA,QACkB;CAClB,MAAM,gBAAgB;EACpB,GAAG,IAAI;EACP,GAAG,IAAI;EACR;CAGD,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"}
1
+ {"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(`[vite-env] \"${key}\" is defined in both a preset and your ${side} config. Your definition wins.`)\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>(definition: T): 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({}, ...presets.map(p => p.server ?? {}), server)\n const mergedClient: z.ZodRawShape = Object.assign({}, ...presets.map(p => p.client ?? {}), client)\n\n warnConflicts(\n presets,\n new Set(Object.keys(server ?? {})),\n new Set(Object.keys(client ?? {})),\n )\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)\n result.server = mergedServer\n if (Object.keys(mergedClient).length > 0 || client !== undefined)\n result.client = mergedClient\n if (presets.length > 0)\n result.presets = presets\n\n return result as Omit<T, 'presets'> & Pick<EnvDefinition, 'presets'>\n}\n\nexport function validateEnv(\n def: EnvDefinition,\n rawEnv: Record<string, string>,\n): 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))\n 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,KAAK,eAAe,IAAI,yCAAyC,KAAK,gCAAgC;;;AAIpH,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,UAAoC,YAA0F;CAC5I,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,QAAQ,GAAG,SAAS;CAGlD,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;CAClG,MAAM,eAA8B,OAAO,OAAO,EAAE,EAAE,GAAG,QAAQ,KAAI,MAAK,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO;AAElG,eACE,SACA,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,EAClC,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CACnC;AAED,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,EACrD,QAAO,SAAS;AAClB,KAAI,OAAO,KAAK,aAAa,CAAC,SAAS,KAAK,WAAW,KAAA,EACrD,QAAO,SAAS;AAClB,KAAI,QAAQ,SAAS,EACnB,QAAO,UAAU;AAEnB,QAAO;;AAGT,SAAgB,YACd,KACA,QACkB;CAClB,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,CACzC;AACF,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"}
@@ -1,4 +1,4 @@
1
- import { c as StandardValidationResult, o as StandardEnvDefinition } from "./types-CpYkRwLM.cjs";
1
+ import { c as StandardValidationResult, o as StandardEnvDefinition } from "./types-B61nsO8q.cjs";
2
2
 
3
3
  //#region src/standard.d.ts
4
4
  declare function defineStandardEnv<T extends Omit<StandardEnvDefinition, '_standard'>>(definition: T): T & {
@@ -1,4 +1,4 @@
1
- import { c as StandardValidationResult, o as StandardEnvDefinition } from "./types--Km3TAdJ.mjs";
1
+ import { c as StandardValidationResult, o as StandardEnvDefinition } from "./types-KniR_Oqf.mjs";
2
2
 
3
3
  //#region src/standard.d.ts
4
4
  declare function defineStandardEnv<T extends Omit<StandardEnvDefinition, '_standard'>>(definition: T): T & {
@@ -1,10 +1,16 @@
1
- import { z } from "zod";
2
1
  import { StandardSchemaV1 } from "@standard-schema/spec";
2
+ import { z } from "zod";
3
3
 
4
4
  //#region src/types.d.ts
5
5
  type EnvDefinition = {
6
6
  server?: z.ZodRawShape;
7
7
  client?: z.ZodRawShape;
8
+ /**
9
+ * Retained from defineEnv for validation-time platform detection.
10
+ * Gating relies on schema reference identity — cloning or serializing
11
+ * the definition disables it (preset keys become permanently strict).
12
+ */
13
+ presets?: EnvPreset[];
8
14
  };
9
15
  type StandardEnvDefinition = {
10
16
  server?: Record<string, StandardSchemaV1>;
@@ -14,6 +20,12 @@ type StandardEnvDefinition = {
14
20
  type EnvPreset = {
15
21
  server?: z.ZodRawShape;
16
22
  client?: z.ZodRawShape;
23
+ /**
24
+ * Returns true when running on the platform that injects these vars.
25
+ * When false, preset vars validate as optional (user overrides excluded)
26
+ * so local dev passes without platform-injected vars.
27
+ */
28
+ detect?: (env: Record<string, string | undefined>) => boolean;
17
29
  };
18
30
  type AnyEnvDefinition = EnvDefinition | StandardEnvDefinition;
19
31
  type ValidationResult = {
@@ -43,4 +55,4 @@ type InferClientEnv<T extends EnvDefinition> = z.infer<z.ZodObject<OrEmptyShape<
43
55
  type InferServerEnv<T extends EnvDefinition> = z.infer<z.ZodObject<OrEmptyShape<T['server']> & OrEmptyShape<T['client']>>>;
44
56
  //#endregion
45
57
  export { InferServerEnv as a, StandardValidationResult as c, InferClientEnv as i, ValidationResult as l, EnvDefinition as n, StandardEnvDefinition as o, EnvPreset as r, StandardValidationIssue as s, AnyEnvDefinition as t };
46
- //# sourceMappingURL=types--Km3TAdJ.d.mts.map
58
+ //# sourceMappingURL=types-B61nsO8q.d.cts.map
@@ -1,10 +1,16 @@
1
- import { StandardSchemaV1 } from "@standard-schema/spec";
2
1
  import { z } from "zod";
2
+ import { StandardSchemaV1 } from "@standard-schema/spec";
3
3
 
4
4
  //#region src/types.d.ts
5
5
  type EnvDefinition = {
6
6
  server?: z.ZodRawShape;
7
7
  client?: z.ZodRawShape;
8
+ /**
9
+ * Retained from defineEnv for validation-time platform detection.
10
+ * Gating relies on schema reference identity — cloning or serializing
11
+ * the definition disables it (preset keys become permanently strict).
12
+ */
13
+ presets?: EnvPreset[];
8
14
  };
9
15
  type StandardEnvDefinition = {
10
16
  server?: Record<string, StandardSchemaV1>;
@@ -14,6 +20,12 @@ type StandardEnvDefinition = {
14
20
  type EnvPreset = {
15
21
  server?: z.ZodRawShape;
16
22
  client?: z.ZodRawShape;
23
+ /**
24
+ * Returns true when running on the platform that injects these vars.
25
+ * When false, preset vars validate as optional (user overrides excluded)
26
+ * so local dev passes without platform-injected vars.
27
+ */
28
+ detect?: (env: Record<string, string | undefined>) => boolean;
17
29
  };
18
30
  type AnyEnvDefinition = EnvDefinition | StandardEnvDefinition;
19
31
  type ValidationResult = {
@@ -43,4 +55,4 @@ type InferClientEnv<T extends EnvDefinition> = z.infer<z.ZodObject<OrEmptyShape<
43
55
  type InferServerEnv<T extends EnvDefinition> = z.infer<z.ZodObject<OrEmptyShape<T['server']> & OrEmptyShape<T['client']>>>;
44
56
  //#endregion
45
57
  export { InferServerEnv as a, StandardValidationResult as c, InferClientEnv as i, ValidationResult as l, EnvDefinition as n, StandardEnvDefinition as o, EnvPreset as r, StandardValidationIssue as s, AnyEnvDefinition as t };
46
- //# sourceMappingURL=types-CpYkRwLM.d.cts.map
58
+ //# sourceMappingURL=types-KniR_Oqf.d.mts.map
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://raw.githubusercontent.com/vitejs/vite-plugin-registry/refs/heads/main/data/schema/extended-package-json.schema.json",
3
3
  "name": "@vite-env/core",
4
4
  "type": "module",
5
- "version": "0.5.3",
5
+ "version": "0.5.4",
6
6
  "description": "The env.ts layer for Vite — define once, validate everywhere, import with types",
7
7
  "license": "MIT",
8
8
  "homepage": "https://github.com/pyyupsk/vite-env#readme",
@@ -1 +0,0 @@
1
- {"version":3,"file":"dts-CJcj6BIn.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(\n def: EnvDefinition,\n root: string,\n): Promise<void> {\n const { z } = await import('zod')\n\n const clientFields = zodShapeToTsFields(z, { ...def.client })\n const serverFields = zodShapeToTsFields(z, { ...def.server, ...def.client })\n\n await writeDts(root, clientFields, serverFields)\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(\n def: StandardEnvDefinition,\n root: string,\n): 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 `// Auto-generated by @vite-env/core${tag ? ` ${tag}` : ''}`,\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 }\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\n .map(key => ` readonly ${key}: string`)\n .join('\\n')\n}\n\nfunction zodShapeToTsFields(z: typeof ZodNs, shape: Record<string, unknown>): string {\n return Object.entries(shape)\n .map(([key, schema]) => {\n const tsType = zodToTs(z, schema)\n const optional = schema instanceof z.ZodOptional\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)\n return zodToTs(z, schema.unwrap())\n if (schema instanceof z.ZodDefault)\n return zodToTs(z, schema.def.innerType)\n if (schema instanceof z.ZodString)\n return 'string'\n if (schema instanceof z.ZodNumber)\n return 'number'\n if (schema instanceof z.ZodBoolean)\n return 'boolean'\n if (schema instanceof z.ZodEnum)\n return (schema.options as string[]).map(o => `'${o}'`).join(' | ')\n if (schema instanceof z.ZodPipe)\n return zodToTs(z, schema.def.out)\n return 'string'\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,eAAsB,YACpB,KACA,MACe;CACf,MAAM,EAAE,MAAM,MAAM,OAAO;AAK3B,OAAM,SAAS,MAHM,mBAAmB,GAAG,EAAE,GAAG,IAAI,QAAQ,CAG3B,EAFZ,mBAAmB,GAAG;EAAE,GAAG,IAAI;EAAQ,GAAG,IAAI;EAAQ,CAE5B,CAAC;;;;;;AAOlD,eAAsB,oBACpB,KACA,MACe;CACf,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,sCAAsC,MAAM,IAAI,QAAQ;EACxD;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;UAErC,GAAG;AACR,QAAM,IAAI,MACR,+CAA+C,KAAK,4BACpD,EAAE,OAAO,GAAG,CACb;;;AAIL,SAAS,eAAe,MAAwB;AAC9C,QAAO,KACJ,KAAI,QAAO,gBAAgB,IAAI,UAAU,CACzC,KAAK,KAAK;;AAGf,SAAS,mBAAmB,GAAiB,OAAwC;AACnF,QAAO,OAAO,QAAQ,MAAM,CACzB,KAAK,CAAC,KAAK,YAAY;EACtB,MAAM,SAAS,QAAQ,GAAG,OAAO;AAEjC,SAAO,gBAAgB,MADN,kBAAkB,EAAE,cACG,MAAM,GAAG,IAAI;GACrD,CACD,KAAK,KAAK;;AAGf,SAAS,QAAQ,GAAiB,QAAyB;AACzD,KAAI,kBAAkB,EAAE,YACtB,QAAO,QAAQ,GAAG,OAAO,QAAQ,CAAC;AACpC,KAAI,kBAAkB,EAAE,WACtB,QAAO,QAAQ,GAAG,OAAO,IAAI,UAAU;AACzC,KAAI,kBAAkB,EAAE,UACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,UACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,WACtB,QAAO;AACT,KAAI,kBAAkB,EAAE,QACtB,QAAQ,OAAO,QAAqB,KAAI,MAAK,IAAI,EAAE,GAAG,CAAC,KAAK,MAAM;AACpE,KAAI,kBAAkB,EAAE,QACtB,QAAO,QAAQ,GAAG,OAAO,IAAI,IAAI;AACnC,QAAO"}