@xlameiro/env-typegen 0.1.2 → 0.1.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/CHANGELOG.md +18 -0
- package/README.md +97 -54
- package/dist/cli.js +1448 -169
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +1716 -150
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +537 -1
- package/dist/index.d.ts +537 -1
- package/dist/index.js +1704 -151
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/parser/comment-parser.ts","../src/inferrer/rules.ts","../src/inferrer/type-inferrer.ts","../src/parser/env-parser.ts","../src/generators/typescript-generator.ts","../src/generators/zod-generator.ts","../src/generators/declaration-generator.ts","../src/generators/t3-generator.ts","../src/config.ts","../src/utils/file.ts","../src/utils/format.ts","../src/utils/logger.ts","../src/pipeline.ts"],"names":["readFileSync","path","existsSync","pathToFileURL","readFile","mkdir","writeFile","format","green","inferenceRules"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EnvVarType } from \"./types.js\";\n\n/**\n * Structured annotations extracted from a JSDoc-style comment block\n * that precedes an env var declaration.\n *\n * @example\n * ```\n * # @description PostgreSQL connection string\n * # @required\n * # @type string\n * DATABASE_URL=\n * ```\n */\nexport type CommentAnnotations = {\n /** Type explicitly declared with `@type` in the comment block */\n annotatedType?: EnvVarType;\n\n /** Description from `@description` or the first free-form comment line */\n description?: string;\n\n /** true when the `@required` annotation is present in the comment block */\n isRequired: boolean;\n};\n\nconst VALID_ENV_VAR_TYPES = new Set<string>([\n \"string\",\n \"number\",\n \"boolean\",\n \"url\",\n \"email\",\n \"semver\",\n \"json\",\n \"unknown\",\n]);\n\nfunction isEnvVarType(value: string): value is EnvVarType {\n return VALID_ENV_VAR_TYPES.has(value);\n}\n\n/**\n * Parse a block of consecutive comment lines (each starting with `#`) and\n * extract JSDoc-style annotations.\n *\n * Recognised annotations:\n * - `@description <text>` — sets the variable description\n * - `@required` — marks the variable as required regardless of value\n * - `@optional` — informational (isRequired stays false)\n * - `@type <EnvVarType>` — overrides the inferred type\n *\n * Non-annotation comment lines act as a fallback description when no\n * `@description` annotation is present (first non-empty line wins).\n *\n * @param lines - Raw comment lines from the .env file, e.g. `[\"# @required\"]`\n */\nexport function parseCommentBlock(lines: readonly string[]): CommentAnnotations {\n let annotatedType: EnvVarType | undefined;\n let description: string | undefined;\n let isRequired = false;\n\n for (const line of lines) {\n // Strip the leading `#` and any trailing whitespace\n const content = line.replace(/^#\\s*/, \"\").trimEnd();\n\n if (content.startsWith(\"@description \")) {\n description = content.slice(\"@description \".length).trim();\n } else if (content.startsWith(\"@type \")) {\n const typeStr = content.slice(\"@type \".length).trim();\n if (isEnvVarType(typeStr)) {\n annotatedType = typeStr;\n }\n } else if (content.trim() === \"@required\") {\n isRequired = true;\n } else if (content.trim() === \"@optional\") {\n // Informational only — isRequired stays false (which is already the default)\n } else if (description === undefined && content.trim().length > 0) {\n // First non-empty, non-annotation line is a fallback description\n description = content.trim();\n }\n }\n\n const result: CommentAnnotations = { isRequired };\n if (annotatedType !== undefined) result.annotatedType = annotatedType;\n if (description !== undefined) result.description = description;\n return result;\n}\n","import type { EnvVarType } from \"../parser/types.js\";\n\nexport type InferenceRule = {\n id: string;\n priority: number;\n match: (key: string, value: string) => boolean;\n type: EnvVarType;\n};\n\nexport const inferenceRules: readonly InferenceRule[] = [\n {\n id: \"P2_key_url_suffix\",\n priority: 2,\n match: (key: string) => key.toUpperCase().endsWith(\"_URL\"),\n type: \"url\",\n },\n {\n id: \"P3_key_email_from_suffix\",\n priority: 3,\n match: (key: string) => {\n const normalizedKey = key.toUpperCase();\n return normalizedKey.endsWith(\"_EMAIL\") || normalizedKey.endsWith(\"_FROM\");\n },\n type: \"email\",\n },\n {\n id: \"P4_boolean_prefix\",\n priority: 4,\n match: (key: string) => {\n const normalizedKey = key.toUpperCase();\n return (\n normalizedKey.startsWith(\"ENABLE_\") ||\n normalizedKey.startsWith(\"DISABLE_\") ||\n normalizedKey.startsWith(\"IS_\") ||\n normalizedKey.startsWith(\"DEBUG\") ||\n normalizedKey.startsWith(\"FEATURE_\")\n );\n },\n type: \"boolean\",\n },\n {\n id: \"P5_key_port\",\n priority: 5,\n match: (key: string) => {\n const normalizedKey = key.toUpperCase();\n return normalizedKey.endsWith(\"_PORT\") || normalizedKey === \"PORT\";\n },\n type: \"number\",\n },\n {\n id: \"P6_empty_unknown\",\n priority: 6,\n match: (_key: string, value: string) => value.length === 0,\n type: \"unknown\",\n },\n {\n id: \"P7_boolean_literal\",\n priority: 7,\n match: (_key: string, value: string) => {\n const lower = value.toLowerCase();\n return lower === \"true\" || lower === \"false\";\n },\n type: \"boolean\",\n },\n {\n id: \"P8_numeric_literal\",\n priority: 8,\n match: (_key: string, value: string) => /^\\d+(\\.\\d+)?$/.test(value),\n type: \"number\",\n },\n {\n id: \"P9_semver\",\n priority: 9,\n match: (_key: string, value: string) => /^\\d+\\.\\d+\\.\\d+/.test(value),\n type: \"semver\",\n },\n {\n id: \"P10_url_scheme\",\n priority: 10,\n match: (_key: string, value: string) => /^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(value),\n type: \"url\",\n },\n {\n id: \"P11_email_literal\",\n priority: 11,\n match: (_key: string, value: string) => /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(value),\n type: \"email\",\n },\n {\n id: \"P12_json_object_array\",\n priority: 12,\n match: (_key: string, value: string) => {\n try {\n const parsed: unknown = JSON.parse(value);\n return typeof parsed === \"object\" && parsed !== null;\n } catch {\n return false;\n }\n },\n type: \"json\",\n },\n] as const;\n","import type { EnvVarType } from \"../parser/types.js\";\nimport type { InferenceRule } from \"./rules.js\";\nimport { inferenceRules } from \"./rules.js\";\n\ntype InferTypeOptions = {\n fallbackType?: EnvVarType;\n /**\n * Additional rules to check before the built-in rules.\n * Within extraRules, lower priority number = higher precedence.\n */\n extraRules?: InferenceRule[];\n};\n\nconst sortedRules = [...inferenceRules].sort((left, right) => left.priority - right.priority);\n\nexport function inferType(key: string, value: string, options?: InferTypeOptions): EnvVarType {\n const extra = options?.extraRules;\n const rules =\n extra && extra.length > 0\n ? [...extra].sort((a, b) => a.priority - b.priority).concat(sortedRules)\n : sortedRules;\n\n for (const rule of rules) {\n if (rule.match(key, value)) {\n return rule.type;\n }\n }\n\n return options?.fallbackType ?? \"string\";\n}\n\nexport function inferTypesFromParsedVars(\n parsed: { vars: Array<{ key: string; rawValue: string }> },\n options?: InferTypeOptions,\n): EnvVarType[] {\n return parsed.vars.map((item) => inferType(item.key, item.rawValue, options));\n}\n","import { readFileSync } from \"node:fs\";\n\nimport type { InferenceRule } from \"../inferrer/rules.js\";\nimport { inferType } from \"../inferrer/type-inferrer.js\";\nimport { parseCommentBlock } from \"./comment-parser.js\";\nimport type { ParsedEnvFile, ParsedEnvVar } from \"./types.js\";\n\nexport { inferType } from \"../inferrer/type-inferrer.js\";\n\n/** Options forwarded to the type-inference step during parsing. */\ntype ParseOptions = {\n /** Additional inference rules to evaluate before the built-in rules. */\n inferenceRules?: InferenceRule[];\n};\n\n/** Matches a valid env var declaration: KEY=VALUE (value may be empty) */\nconst ENV_VAR_RE = /^([A-Z_][A-Z0-9_]*)=(.*)$/;\n\n/**\n * Matches a section header comment of the form:\n * `# --- SectionName ---` or `# === SectionName ===`\n */\nconst SECTION_HEADER_RE = /^#\\s+[-=]{3,}\\s+(.+?)\\s+[-=]{3,}\\s*$/;\n\n/**\n * Parse the string content of a `.env.example` file into a `ParsedEnvFile`.\n *\n * Exposed separately from `parseEnvFile` to enable unit testing without\n * filesystem access.\n *\n * @param content - Raw file content as a UTF-8 string\n * @param filePath - Used to populate `ParsedEnvFile.filePath` only\n * @param options - Optional parse configuration (custom inference rules)\n */\nexport function parseEnvFileContent(\n content: string,\n filePath: string,\n options?: ParseOptions,\n): ParsedEnvFile {\n const lines = content.split(\"\\n\");\n const vars: ParsedEnvVar[] = [];\n const groups: string[] = [];\n\n let currentGroup: string | undefined;\n let commentBlock: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const lineNumber = i + 1;\n const trimmed = line.trim();\n\n // Blank line — break the comment block association\n if (trimmed === \"\") {\n commentBlock = [];\n continue;\n }\n\n // Section header — update current group and reset comment block\n const sectionMatch = SECTION_HEADER_RE.exec(trimmed);\n if (sectionMatch !== null) {\n const groupName = (sectionMatch[1] ?? \"\").trim();\n currentGroup = groupName;\n if (!groups.includes(groupName)) {\n groups.push(groupName);\n }\n commentBlock = [];\n continue;\n }\n\n // Comment line — accumulate for the next env var\n if (trimmed.startsWith(\"#\")) {\n commentBlock.push(line);\n continue;\n }\n\n // Env var declaration\n const envMatch = ENV_VAR_RE.exec(trimmed);\n if (envMatch !== null) {\n const key = envMatch[1] ?? \"\";\n const rawValue = envMatch[2] ?? \"\";\n const annotations = parseCommentBlock(commentBlock);\n const inferredType = inferType(\n key,\n rawValue,\n ...(options?.inferenceRules !== undefined ? [{ extraRules: options.inferenceRules }] : []),\n );\n const isRequired = rawValue.length > 0 || annotations.isRequired;\n const isOptional = rawValue.length === 0 && !annotations.isRequired;\n const isClientSide = key.startsWith(\"NEXT_PUBLIC_\");\n\n const parsedVar: ParsedEnvVar = {\n key,\n rawValue,\n inferredType,\n isRequired,\n isOptional,\n isClientSide,\n lineNumber,\n };\n\n // Only set optional fields when they have a value (exactOptionalPropertyTypes)\n if (annotations.annotatedType !== undefined) {\n parsedVar.annotatedType = annotations.annotatedType;\n }\n if (annotations.description !== undefined) {\n parsedVar.description = annotations.description;\n }\n if (currentGroup !== undefined) {\n parsedVar.group = currentGroup;\n }\n\n vars.push(parsedVar);\n commentBlock = [];\n } else {\n // Unrecognised line — reset comment block\n commentBlock = [];\n }\n }\n\n return { filePath, vars, groups };\n}\n\n/**\n * Read and parse a `.env.example` file from disk.\n *\n * @param filePath - Absolute or relative path to the file\n */\nexport function parseEnvFile(filePath: string): ParsedEnvFile {\n const content = readFileSync(filePath, \"utf8\");\n return parseEnvFileContent(content, filePath);\n}\n","import path from \"node:path\";\n\nimport type { EnvVarType, ParsedEnvFile } from \"../parser/types.js\";\n\n/**\n * Maps an EnvVarType to its TypeScript primitive equivalent.\n * url, email, semver, json, and unknown all map to `string` because\n * TypeScript has no built-in branded types for these.\n */\nfunction toTsType(envVarType: EnvVarType): string {\n if (envVarType === \"number\") return \"number\";\n if (envVarType === \"boolean\") return \"boolean\";\n return \"string\";\n}\n\n/**\n * Generates a TypeScript source file from a parsed .env.example file.\n *\n * Output structure:\n * 1. Header comments — generated-by notice, source file name, ISO timestamp\n * 2. `declare namespace NodeJS { interface ProcessEnv { ... } }` — global augmentation\n * where all properties are typed as `readonly string` (the runtime reality).\n * Number and boolean vars include an inline coercion hint comment.\n * 3. `export type EnvVars = { ... }` — typed module export using semantic types\n * (number, boolean, string).\n * 4. `ServerEnvVars` / `ClientEnvVars` — emitted only when `NEXT_PUBLIC_` vars exist.\n *\n * The output is valid as both a `.ts` and `.d.ts` file.\n * For an ambient-only `.d.ts` (without `export type` statements), use\n * `generateDeclaration` instead.\n *\n * `annotatedType` takes precedence over `inferredType` when both are set.\n */\nexport function generateTypeScriptTypes(parsed: ParsedEnvFile): string {\n const clientVars = parsed.vars.filter((v) => v.isClientSide);\n const hasClientVars = clientVars.length > 0;\n const fileName = path.basename(parsed.filePath);\n const timestamp = new Date().toISOString();\n const lines: string[] = [];\n\n // Header\n lines.push(\"// Generated by env-typegen — do not edit manually\");\n lines.push(`// Source: ${fileName}`);\n lines.push(`// Generated at: ${timestamp}`);\n lines.push(\"\");\n\n // NodeJS.ProcessEnv augmentation — all props are runtime strings with optional coercion hints\n lines.push(\"declare namespace NodeJS {\");\n lines.push(\" interface ProcessEnv {\");\n for (const variable of parsed.vars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const optional = variable.isOptional ? \"?\" : \"\";\n if (variable.description !== undefined) {\n lines.push(` /** ${variable.description} */`);\n }\n let propLine = ` readonly ${variable.key}${optional}: string;`;\n if (effectiveType === \"number\") {\n propLine += ` // coerce to number: Number(process.env.${variable.key})`;\n } else if (effectiveType === \"boolean\") {\n propLine += ` // coerce to boolean: process.env.${variable.key} === 'true'`;\n }\n lines.push(propLine);\n }\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n // EnvVars type with semantic TypeScript types\n lines.push(\"export type EnvVars = {\");\n for (const variable of parsed.vars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const tsType = toTsType(effectiveType);\n const optional = variable.isOptional ? \"?\" : \"\";\n lines.push(` ${variable.key}${optional}: ${tsType};`);\n }\n lines.push(\"};\");\n\n // ServerEnvVars / ClientEnvVars — only emitted when NEXT_PUBLIC_ vars exist\n if (hasClientVars) {\n const clientKeyUnion = clientVars.map((v) => `\"${v.key}\"`).join(\" | \");\n lines.push(\"\");\n lines.push(`export type ServerEnvVars = Omit<EnvVars, ${clientKeyUnion}>;`);\n lines.push(`export type ClientEnvVars = Pick<EnvVars, ${clientKeyUnion}>;`);\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generates a runtime `validateEnv()` function that throws when any required\n * environment variable is absent from `process.env`.\n */\nexport function generateEnvValidation(parsed: ParsedEnvFile): string {\n const required = parsed.vars.filter((v) => v.isRequired).map((v) => v.key);\n const lines: string[] = [];\n\n lines.push(\"// Generated by env-typegen — do not edit manually\");\n lines.push(\"\");\n lines.push(\"export function validateEnv(): void {\");\n\n if (required.length === 0) {\n lines.push(\" // No required environment variables defined\");\n } else {\n const keyList = required.map((k) => `\"${k}\"`).join(\", \");\n lines.push(` const required = [${keyList}];`);\n lines.push(\" for (const key of required) {\");\n lines.push(\" if (!process.env[key]) {\");\n lines.push(\" throw new Error(`Missing required environment variable: ${key}`);\");\n lines.push(\" }\");\n lines.push(\" }\");\n }\n\n lines.push(\"}\");\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { EnvVarType, ParsedEnvFile } from \"../parser/types.js\";\n\n/**\n * Maps an EnvVarType to its Zod schema expression.\n *\n * - `number` → `z.coerce.number()` (env vars are strings; coerce handles the cast)\n * - `boolean` → `z.coerce.boolean()` (env vars are strings; coerce handles truthy cast)\n * - `url` → `z.string().url()`\n * - `email` → `z.string().email()`\n * - everything else → `z.string()` (string | semver | json | unknown)\n */\nfunction toZodType(envVarType: EnvVarType): string {\n if (envVarType === \"number\") return \"z.coerce.number()\";\n if (envVarType === \"boolean\") return \"z.coerce.boolean()\";\n if (envVarType === \"url\") return \"z.string().url()\";\n if (envVarType === \"email\") return \"z.string().email()\";\n return \"z.string()\";\n}\n\n/**\n * Generates a Zod schema file from a parsed .env.example file.\n *\n * Output structure:\n * ```\n * // Generated by env-typegen — do not edit manually\n * import { z } from \"zod\";\n *\n * export const serverEnvSchema = z.object({\n * DATABASE_URL: z.string().url(),\n * PORT: z.coerce.number(),\n * });\n *\n * export const clientEnvSchema = z.object({\n * NEXT_PUBLIC_API_URL: z.string().url(),\n * });\n *\n * export const envSchema = serverEnvSchema.merge(clientEnvSchema);\n * export type Env = z.infer<typeof envSchema>;\n * ```\n *\n * - Server-side vars (non-`NEXT_PUBLIC_`) go into `serverEnvSchema`\n * - Client-side vars (`NEXT_PUBLIC_` prefix) go into `clientEnvSchema`\n * - `envSchema` is the merged union of both, for full-stack validation\n * - `annotatedType` takes precedence over `inferredType` when both are set\n * - Optional vars have `.optional()` appended to their Zod expression\n */\nexport function generateZodSchema(parsed: ParsedEnvFile): string {\n const serverVars = parsed.vars.filter((v) => !v.isClientSide);\n const clientVars = parsed.vars.filter((v) => v.isClientSide);\n const lines: string[] = [];\n\n lines.push(\"// Generated by env-typegen — do not edit manually\");\n lines.push('import { z } from \"zod\";');\n lines.push(\"\");\n\n // serverEnvSchema — non-NEXT_PUBLIC_ vars\n lines.push(\"export const serverEnvSchema = z.object({\");\n for (const variable of serverVars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const zodExpr = variable.isOptional\n ? `${toZodType(effectiveType)}.optional()`\n : toZodType(effectiveType);\n lines.push(` ${variable.key}: ${zodExpr},`);\n }\n lines.push(\"});\");\n lines.push(\"\");\n\n // clientEnvSchema — NEXT_PUBLIC_ vars\n lines.push(\"export const clientEnvSchema = z.object({\");\n for (const variable of clientVars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const zodExpr = variable.isOptional\n ? `${toZodType(effectiveType)}.optional()`\n : toZodType(effectiveType);\n lines.push(` ${variable.key}: ${zodExpr},`);\n }\n lines.push(\"});\");\n lines.push(\"\");\n\n // Merged schema — the full validation object for use in lib/env.ts\n lines.push(\"export const envSchema = serverEnvSchema.merge(clientEnvSchema);\");\n lines.push(\"export type Env = z.infer<typeof envSchema>;\");\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import path from \"node:path\";\n\nimport type { ParsedEnvFile } from \"../parser/types.js\";\n\n/**\n * Generates an ambient `.d.ts` declaration file from a parsed .env.example.\n *\n * Output is a pure `NodeJS.ProcessEnv` augmentation — no `export type` statements.\n * This makes the file valid as a global ambient declaration that can be dropped\n * into `lib/` or `types/` without affecting module resolution.\n *\n * Output structure:\n * ```\n * // Generated by env-typegen — do not edit manually\n * // Source: .env.example\n *\n * declare namespace NodeJS {\n * interface ProcessEnv {\n * readonly KEY: string; // all vars are runtime strings\n * readonly OPT?: string; // optional vars use ?: string\n * readonly NUM: string; // coerce to number: Number(process.env.NUM)\n * readonly FLAG: string; // coerce to boolean: process.env.FLAG === 'true'\n * }\n * }\n * ```\n *\n * For a `.ts` output with typed `export type EnvVars` / `ServerEnvVars` /\n * `ClientEnvVars`, use `generateTypeScriptTypes` instead.\n *\n * - `ProcessEnv` uses `readonly string` for every variable (runtime reality)\n * - Number and boolean vars include an inline coercion hint comment\n * - `annotatedType` takes precedence over `inferredType`\n */\nexport function generateDeclaration(parsed: ParsedEnvFile): string {\n const fileName = path.basename(parsed.filePath);\n const lines: string[] = [];\n\n // Header\n lines.push(\"// Generated by env-typegen — do not edit manually\");\n lines.push(`// Source: ${fileName}`);\n lines.push(\"\");\n\n // NodeJS.ProcessEnv augmentation — ambient only, no exports\n lines.push(\"declare namespace NodeJS {\");\n lines.push(\" interface ProcessEnv {\");\n for (const variable of parsed.vars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const optional = variable.isOptional ? \"?\" : \"\";\n if (variable.description !== undefined) {\n lines.push(` /** ${variable.description} */`);\n }\n let propLine = ` readonly ${variable.key}${optional}: string;`;\n if (effectiveType === \"number\") {\n propLine += ` // coerce to number: Number(process.env.${variable.key})`;\n } else if (effectiveType === \"boolean\") {\n propLine += ` // coerce to boolean: process.env.${variable.key} === 'true'`;\n }\n lines.push(propLine);\n }\n lines.push(\" }\");\n lines.push(\"}\");\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { EnvVarType, ParsedEnvFile } from \"../parser/types.js\";\n\n/**\n * Maps an EnvVarType to its Zod schema expression for use in t3-env createEnv().\n *\n * Note: boolean uses `z.coerce.boolean()` here (not the `.transform()` approach\n * in the standalone zod-generator) because @t3-oss/env-nextjs handles coercion\n * internally with `z.coerce`.\n */\nfunction toT3ZodType(envVarType: EnvVarType): string {\n if (envVarType === \"number\") return \"z.coerce.number()\";\n if (envVarType === \"boolean\") return \"z.coerce.boolean()\";\n if (envVarType === \"url\") return \"z.string().url()\";\n if (envVarType === \"email\") return \"z.string().email()\";\n return \"z.string()\";\n}\n\n/**\n * Generates a `@t3-oss/env-nextjs` configuration file from a parsed .env.example.\n *\n * Output structure:\n * ```\n * import { createEnv } from \"@t3-oss/env-nextjs\";\n * import { z } from \"zod\";\n *\n * export const env = createEnv({\n * server: { /* non-NEXT_PUBLIC_ vars *\\/ },\n * client: { /* NEXT_PUBLIC_ vars *\\/ },\n * runtimeEnv: { /* all vars mapped to process.env *\\/ },\n * });\n * ```\n *\n * - `server:` is omitted when there are no server-side vars\n * - `client:` is omitted when there are no client-side vars (NEXT_PUBLIC_ prefix)\n * - `runtimeEnv:` always includes all vars\n * - `annotatedType` takes precedence over `inferredType`\n * - Optional vars have `.optional()` appended\n * - Vars with a description have `.describe(\"text\")` appended (before `.optional()`)\n */\nexport function generateT3Env(parsed: ParsedEnvFile): string {\n const serverVars = parsed.vars.filter((v) => !v.isClientSide);\n const clientVars = parsed.vars.filter((v) => v.isClientSide);\n const lines: string[] = [];\n\n lines.push(\"// Generated by env-typegen — do not edit manually\");\n lines.push('import { createEnv } from \"@t3-oss/env-nextjs\";');\n lines.push('import { z } from \"zod\";');\n lines.push(\"\");\n lines.push(\"export const env = createEnv({\");\n\n if (serverVars.length > 0) {\n lines.push(\" server: {\");\n for (const variable of serverVars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n let zodExpr = toT3ZodType(effectiveType);\n if (variable.description !== undefined) {\n zodExpr += `.describe(\"${variable.description.replace(/\"/g, '\\\\\"')}\")`;\n }\n if (variable.isOptional) {\n zodExpr += \".optional()\";\n }\n lines.push(` ${variable.key}: ${zodExpr},`);\n }\n lines.push(\" },\");\n }\n\n if (clientVars.length > 0) {\n lines.push(\" client: {\");\n for (const variable of clientVars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n let zodExpr = toT3ZodType(effectiveType);\n if (variable.description !== undefined) {\n zodExpr += `.describe(\"${variable.description.replace(/\"/g, '\\\\\"')}\")`;\n }\n if (variable.isOptional) {\n zodExpr += \".optional()\";\n }\n lines.push(` ${variable.key}: ${zodExpr},`);\n }\n lines.push(\" },\");\n }\n\n lines.push(\" runtimeEnv: {\");\n for (const variable of parsed.vars) {\n lines.push(` ${variable.key}: process.env.${variable.key},`);\n }\n lines.push(\" },\");\n lines.push(\"});\");\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { InferenceRule } from \"./inferrer/rules.js\";\n\nexport type { InferenceRule };\n\n/** Generator identifiers supported by env-typegen. */\nexport type GeneratorName = \"typescript\" | \"zod\" | \"t3\" | \"declaration\";\n\n/** Configuration shape accepted by env-typegen's CLI and programmatic API. */\nexport type EnvTypegenConfig = {\n /** Path(s) to the .env.example file(s) to parse. */\n input: string | string[];\n /** Output directory for generated files. Defaults to the input file's directory. */\n output?: string;\n /** Which generators to run. When omitted, all four generators run. */\n generators?: GeneratorName[];\n /** Format generated output with prettier. Defaults to true. */\n format?: boolean;\n /**\n * Additional inference rules to prepend before the built-in rules.\n * Rules are matched in ascending priority order; lower numbers win.\n */\n inferenceRules?: InferenceRule[];\n};\n\n/** Config file names searched in order when calling loadConfig(). */\nexport const CONFIG_FILE_NAMES = [\n \"env-typegen.config.ts\",\n \"env-typegen.config.mjs\",\n \"env-typegen.config.js\",\n] as const;\n\n/**\n * Type-safe config helper.\n * Returns the config object unchanged — exists purely for IDE autocompletion\n * and compile-time validation of the config shape.\n */\nexport function defineConfig(config: EnvTypegenConfig): EnvTypegenConfig {\n return config;\n}\n\n/**\n * Loads env-typegen config by searching for a config file in `cwd`.\n * Searches for env-typegen.config.ts → .mjs → .js in order.\n * Returns `undefined` when no config file is found.\n */\nexport async function loadConfig(\n cwd: string = process.cwd(),\n): Promise<EnvTypegenConfig | undefined> {\n for (const name of CONFIG_FILE_NAMES) {\n const filePath = path.resolve(cwd, name);\n if (existsSync(filePath)) {\n const fileUrl = pathToFileURL(filePath).href;\n const mod = (await import(fileUrl)) as { default?: EnvTypegenConfig };\n return mod.default;\n }\n }\n return undefined;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/**\n * Reads a .env file from `filePath` and returns its full text content.\n * Rejects with a Node.js filesystem error if the file does not exist.\n */\nexport async function readEnvFile(filePath: string): Promise<string> {\n return readFile(path.resolve(filePath), \"utf8\");\n}\n\n/**\n * Writes `content` to `filePath`, creating intermediate directories as needed.\n * Overwrites any existing file at that path.\n */\nexport async function writeOutput(filePath: string, content: string): Promise<void> {\n const resolved = path.resolve(filePath);\n await mkdir(path.dirname(resolved), { recursive: true });\n await writeFile(resolved, content, \"utf8\");\n}\n","import { format } from \"prettier\";\n\n/**\n * Formats `content` using prettier with the specified `parser`.\n * Defaults to the \"typescript\" parser, which is correct for all generator outputs.\n * Returns the original content unchanged if prettier throws (e.g., invalid syntax).\n */\nexport async function formatOutput(\n content: string,\n parser: string = \"typescript\",\n): Promise<string> {\n try {\n return await format(content, { parser });\n } catch (err) {\n console.warn(\n \"env-typegen: Prettier formatting failed, writing unformatted output.\",\n err instanceof Error ? err.message : String(err),\n );\n return content;\n }\n}\n","import { green, red, yellow } from \"picocolors\";\n\n/** Prints a plain informational message to stdout. */\nexport function log(message: string): void {\n console.log(message);\n}\n\n/** Prints a yellow ⚠ warning message to stderr. */\nexport function warn(message: string): void {\n console.warn(yellow(`⚠ ${message}`));\n}\n\n/** Prints a red ✖ error message to stderr. */\nexport function error(message: string): void {\n console.error(red(`✖ ${message}`));\n}\n\n/** Prints a green ✔ success message to stdout. */\nexport function success(message: string): void {\n console.log(green(`✔ ${message}`));\n}\n","import path from \"node:path\";\n\nimport { type GeneratorName, type InferenceRule } from \"./config.js\";\nimport { generateDeclaration } from \"./generators/declaration-generator.js\";\nimport { generateT3Env } from \"./generators/t3-generator.js\";\nimport { generateTypeScriptTypes } from \"./generators/typescript-generator.js\";\nimport { generateZodSchema } from \"./generators/zod-generator.js\";\nimport { parseEnvFileContent } from \"./parser/env-parser.js\";\nimport type { ParsedEnvFile } from \"./parser/types.js\";\nimport { readEnvFile, writeOutput } from \"./utils/file.js\";\nimport { formatOutput } from \"./utils/format.js\";\nimport { success } from \"./utils/logger.js\";\n\n/** Options accepted by the runGenerate pipeline. */\nexport type RunGenerateOptions = {\n input: string | string[];\n output: string;\n generators: GeneratorName[];\n format: boolean;\n stdout?: boolean;\n dryRun?: boolean;\n silent?: boolean;\n /** Additional inference rules to prepend before built-in rules. */\n inferenceRules?: InferenceRule[];\n};\n\n/** Derive the output file path for a generator when multiple generators are in use. */\nfunction deriveOutputPath(base: string, generator: GeneratorName, isSingle: boolean): string {\n if (isSingle) return base;\n const ext = path.extname(base);\n const noExt = ext.length > 0 ? base.slice(0, -ext.length) : base;\n // The declaration generator produces ambient TypeScript declarations (.d.ts).\n // Use the correct extension so IDEs and tsc pick it up as a declaration file.\n const baseExt = ext.length > 0 ? ext : \".ts\";\n const outExt = generator === \"declaration\" ? \".d.ts\" : baseExt;\n return `${noExt}.${generator}${outExt}`;\n}\n\n/**\n * When running against multiple input files, derive a per-input output base so\n * each file produces a distinct set of outputs. The input's basename (without\n * extension) is used as the stem; directory and extension come from the\n * user-supplied `output` option.\n */\nfunction deriveOutputBaseForInput(output: string, inputPath: string): string {\n const dir = path.dirname(output);\n const ext = path.extname(output);\n const stem = path.basename(inputPath, path.extname(inputPath));\n return path.join(dir, `${stem}${ext}`);\n}\n\n/** Invoke the correct generator function for the given name. */\nfunction buildOutput(generator: GeneratorName, parsed: ParsedEnvFile): string {\n switch (generator) {\n case \"typescript\":\n return generateTypeScriptTypes(parsed);\n case \"zod\":\n return generateZodSchema(parsed);\n case \"t3\":\n return generateT3Env(parsed);\n case \"declaration\":\n return generateDeclaration(parsed);\n }\n}\n\nasync function persistOutput(params: {\n generated: string;\n generator: GeneratorName;\n outputPath: string;\n isSingle: boolean;\n stdout: boolean;\n dryRun: boolean;\n silent: boolean;\n}): Promise<void> {\n const { generated, generator, outputPath, isSingle, stdout, dryRun, silent } = params;\n\n if (stdout) {\n if (isSingle) {\n console.log(generated);\n } else {\n console.log(`// --- ${generator}:${outputPath} ---`);\n console.log(generated);\n }\n return;\n }\n\n if (dryRun) {\n if (!silent) {\n if (!isSingle) {\n console.log(`// --- ${generator}: ${outputPath} ---`);\n }\n console.log(generated);\n success(`Dry run: would write ${outputPath}`);\n }\n return;\n }\n\n await writeOutput(outputPath, generated);\n if (!silent) {\n success(`Generated ${outputPath}`);\n }\n}\n\n/**\n * Reads the input file(s), runs the requested generators, optionally formats each\n * output, and writes the results to disk.\n *\n * Exported for unit testing — call this directly rather than spawning a child process.\n */\nexport async function runGenerate(options: RunGenerateOptions): Promise<void> {\n const {\n input,\n output,\n generators,\n format: shouldFormat,\n stdout = false,\n dryRun = false,\n silent = false,\n inferenceRules,\n } = options;\n const inputs = Array.isArray(input) ? input : [input];\n const hasMultipleInputs = inputs.length > 1;\n const isSingle = generators.length === 1;\n\n for (const inputPath of inputs) {\n const outputBase = hasMultipleInputs ? deriveOutputBaseForInput(output, inputPath) : output;\n const content = await readEnvFile(inputPath);\n const parsed = parseEnvFileContent(\n content,\n inputPath,\n inferenceRules !== undefined ? { inferenceRules } : undefined,\n );\n\n for (const generator of generators) {\n let generated = buildOutput(generator, parsed);\n if (shouldFormat && !dryRun) {\n generated = await formatOutput(generated);\n }\n const outputPath = deriveOutputPath(outputBase, generator, isSingle);\n await persistOutput({\n generated,\n generator,\n outputPath,\n isSingle,\n stdout,\n dryRun,\n silent,\n });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/parser/comment-parser.ts","../src/inferrer/rules.ts","../src/inferrer/type-inferrer.ts","../src/parser/env-parser.ts","../src/generators/typescript-generator.ts","../src/generators/zod-generator.ts","../src/generators/declaration-generator.ts","../src/generators/t3-generator.ts","../src/schema/schema-loader.ts","../src/config.ts","../src/utils/file.ts","../src/utils/format.ts","../src/utils/logger.ts","../src/pipeline.ts","../src/validator/contract-validator.ts","../src/reporting/ci-reporter.ts","../src/commands/check.ts","../src/cloud/connectors.ts","../src/contract.ts","../src/plugins.ts","../src/validation/engine.ts","../src/validation/env-source.ts","../src/validation/output.ts","../src/validation-command.ts"],"names":["readFileSync","path","existsSync","pathToFileURL","readFile","mkdir","writeFile","format","yellow","red","green","inferenceRules","CONTRACT_FILE_NAMES","isRecord","SEMVER_RE","parseArgs"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EnvVarType } from \"./types.js\";\n\n/**\n * Structured annotations extracted from a JSDoc-style comment block\n * that precedes an env var declaration.\n *\n * @example\n * ```\n * # @description PostgreSQL connection string\n * # @required\n * # @type string\n * DATABASE_URL=\n * ```\n */\nexport type CommentAnnotations = {\n /** Type explicitly declared with `@type` in the comment block */\n annotatedType?: EnvVarType;\n\n /** Description from `@description` or the first free-form comment line */\n description?: string;\n\n /** true when the `@required` annotation is present in the comment block */\n isRequired: boolean;\n\n /** Allowed literal values from a `@enum` annotation (comma-separated list) */\n enumValues?: string[];\n\n /** Numeric range constraints from `@min` and/or `@max` annotations */\n constraints?: { min?: number; max?: number };\n\n /** Runtime scope from a `@runtime` annotation (`server` | `client` | `edge`) */\n runtime?: \"server\" | \"client\" | \"edge\";\n\n /** true when the `@secret` annotation is present — value must never appear in reports */\n isSecret?: boolean;\n};\n\nconst VALID_ENV_VAR_TYPES = new Set<string>([\n \"string\",\n \"number\",\n \"boolean\",\n \"url\",\n \"email\",\n \"semver\",\n \"json\",\n \"unknown\",\n]);\n\nfunction isEnvVarType(value: string): value is EnvVarType {\n return VALID_ENV_VAR_TYPES.has(value);\n}\n\n/** Internal mutable accumulator used while processing annotation lines. */\ntype AnnotationState = {\n isRequired: boolean;\n annotatedType?: EnvVarType;\n description?: string;\n enumValues?: string[];\n minConstraint?: number;\n maxConstraint?: number;\n runtime?: \"server\" | \"client\" | \"edge\";\n isSecret?: boolean;\n};\n\nfunction applyTypeAnnotation(state: AnnotationState, content: string): void {\n const typeStr = content.slice(\"@type \".length).trim();\n if (isEnvVarType(typeStr)) state.annotatedType = typeStr;\n}\n\nfunction applyEnumAnnotation(state: AnnotationState, content: string): void {\n const values = content\n .slice(\"@enum \".length)\n .trim()\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n if (values.length > 0) state.enumValues = values;\n}\n\nfunction applyMinAnnotation(state: AnnotationState, content: string): void {\n const num = Number(content.slice(\"@min \".length).trim());\n if (Number.isFinite(num)) state.minConstraint = num;\n}\n\nfunction applyMaxAnnotation(state: AnnotationState, content: string): void {\n const num = Number(content.slice(\"@max \".length).trim());\n if (Number.isFinite(num)) state.maxConstraint = num;\n}\n\nfunction applyRuntimeAnnotation(state: AnnotationState, content: string): void {\n const scope = content.slice(\"@runtime \".length).trim();\n if (scope === \"server\" || scope === \"client\" || scope === \"edge\") {\n state.runtime = scope;\n }\n}\n\nfunction processAnnotationContent(state: AnnotationState, content: string): void {\n const trimmed = content.trim();\n if (trimmed === \"@required\") {\n state.isRequired = true;\n return;\n }\n if (trimmed === \"@secret\") {\n state.isSecret = true;\n return;\n }\n if (trimmed === \"@optional\") return;\n if (content.startsWith(\"@description \")) {\n state.description = content.slice(\"@description \".length).trim();\n } else if (content.startsWith(\"@type \")) {\n applyTypeAnnotation(state, content);\n } else if (content.startsWith(\"@enum \")) {\n applyEnumAnnotation(state, content);\n } else if (content.startsWith(\"@min \")) {\n applyMinAnnotation(state, content);\n } else if (content.startsWith(\"@max \")) {\n applyMaxAnnotation(state, content);\n } else if (content.startsWith(\"@runtime \")) {\n applyRuntimeAnnotation(state, content);\n } else if (state.description === undefined && trimmed.length > 0) {\n // First non-empty, non-annotation line is a fallback description\n state.description = trimmed;\n }\n}\n\n/**\n * Parse a block of consecutive comment lines (each starting with `#`) and\n * extract JSDoc-style annotations.\n *\n * Recognised annotations:\n * - `@description <text>` — sets the variable description\n * - `@required` — marks the variable as required regardless of value\n * - `@optional` — informational (isRequired stays false)\n * - `@type <EnvVarType>` — overrides the inferred type\n * - `@enum val1,val2,...` — declares allowed literal values (comma-separated)\n * - `@min <number>` — declares a numeric minimum constraint\n * - `@max <number>` — declares a numeric maximum constraint\n * - `@runtime <scope>` — declares runtime scope: `server` | `client` | `edge`\n * - `@secret` — marks the value as sensitive (never logged or reported)\n *\n * Non-annotation comment lines act as a fallback description when no\n * `@description` annotation is present (first non-empty line wins).\n *\n * @param lines - Raw comment lines from the .env file, e.g. `[\"# @required\"]`\n */\nexport function parseCommentBlock(lines: readonly string[]): CommentAnnotations {\n const state: AnnotationState = { isRequired: false };\n\n for (const line of lines) {\n processAnnotationContent(state, line.replace(/^#\\s*/, \"\").trimEnd());\n }\n\n let constraints: { min?: number; max?: number } | undefined;\n if (state.minConstraint !== undefined || state.maxConstraint !== undefined) {\n constraints = {};\n if (state.minConstraint !== undefined) constraints.min = state.minConstraint;\n if (state.maxConstraint !== undefined) constraints.max = state.maxConstraint;\n }\n\n const result: CommentAnnotations = { isRequired: state.isRequired };\n if (state.annotatedType !== undefined) result.annotatedType = state.annotatedType;\n if (state.description !== undefined) result.description = state.description;\n if (state.enumValues !== undefined) result.enumValues = state.enumValues;\n if (constraints !== undefined) result.constraints = constraints;\n if (state.runtime !== undefined) result.runtime = state.runtime;\n if (state.isSecret !== undefined) result.isSecret = state.isSecret;\n return result;\n}\n","import type { EnvVarType } from \"../parser/types.js\";\n\nexport type InferenceRule = {\n id: string;\n priority: number;\n match: (key: string, value: string) => boolean;\n type: EnvVarType;\n};\n\nexport const inferenceRules: readonly InferenceRule[] = [\n {\n id: \"P2_key_url_suffix\",\n priority: 2,\n match: (key: string) => key.toUpperCase().endsWith(\"_URL\"),\n type: \"url\",\n },\n {\n id: \"P3_key_email_from_suffix\",\n priority: 3,\n match: (key: string) => {\n const normalizedKey = key.toUpperCase();\n return normalizedKey.endsWith(\"_EMAIL\") || normalizedKey.endsWith(\"_FROM\");\n },\n type: \"email\",\n },\n {\n id: \"P4_boolean_prefix\",\n priority: 4,\n match: (key: string) => {\n const normalizedKey = key.toUpperCase();\n return (\n normalizedKey.startsWith(\"ENABLE_\") ||\n normalizedKey.startsWith(\"DISABLE_\") ||\n normalizedKey.startsWith(\"IS_\") ||\n normalizedKey.startsWith(\"DEBUG\") ||\n normalizedKey.startsWith(\"FEATURE_\")\n );\n },\n type: \"boolean\",\n },\n {\n id: \"P5_key_port\",\n priority: 5,\n match: (key: string) => {\n const normalizedKey = key.toUpperCase();\n return normalizedKey.endsWith(\"_PORT\") || normalizedKey === \"PORT\";\n },\n type: \"number\",\n },\n {\n id: \"P6_empty_unknown\",\n priority: 6,\n match: (_key: string, value: string) => value.length === 0,\n type: \"unknown\",\n },\n {\n id: \"P7_boolean_literal\",\n priority: 7,\n match: (_key: string, value: string) => {\n const lower = value.toLowerCase();\n return lower === \"true\" || lower === \"false\";\n },\n type: \"boolean\",\n },\n {\n id: \"P8_numeric_literal\",\n priority: 8,\n // Non-capturing group with \\d keeps the dot/digit boundary unambiguous,\n // eliminating super-linear backtracking (ReDoS-safe).\n match: (_key: string, value: string) => /^\\d+(?:\\.\\d+)?$/.test(value),\n type: \"number\",\n },\n {\n id: \"P9_semver\",\n priority: 9,\n match: (_key: string, value: string) => /^\\d+\\.\\d+\\.\\d+/.test(value),\n type: \"semver\",\n },\n {\n id: \"P10_url_scheme\",\n priority: 10,\n match: (_key: string, value: string) => /^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(value),\n type: \"url\",\n },\n {\n id: \"P11_email_literal\",\n priority: 11,\n // Dots are excluded from each domain-segment character class so that the\n // literal \\. separators are unambiguous, preventing super-linear backtracking.\n match: (_key: string, value: string) => /^[^@\\s]+@[^@\\s.]+(?:\\.[^@\\s.]+)+$/.test(value),\n type: \"email\",\n },\n {\n id: \"P12_json_object_array\",\n priority: 12,\n match: (_key: string, value: string) => {\n try {\n const parsed: unknown = JSON.parse(value);\n return typeof parsed === \"object\" && parsed !== null;\n } catch {\n return false;\n }\n },\n type: \"json\",\n },\n] as const;\n","import type { EnvVarType } from \"../parser/types.js\";\nimport type { InferenceRule } from \"./rules.js\";\nimport { inferenceRules } from \"./rules.js\";\n\ntype InferTypeOptions = {\n fallbackType?: EnvVarType;\n /**\n * Additional rules to check before the built-in rules.\n * Within extraRules, lower priority number = higher precedence.\n */\n extraRules?: InferenceRule[];\n};\n\nconst sortedRules = [...inferenceRules].sort((left, right) => left.priority - right.priority);\n\nexport function inferType(key: string, value: string, options?: InferTypeOptions): EnvVarType {\n const extra = options?.extraRules;\n const rules =\n extra && extra.length > 0\n ? [...extra].sort((a, b) => a.priority - b.priority).concat(sortedRules)\n : sortedRules;\n\n for (const rule of rules) {\n if (rule.match(key, value)) {\n return rule.type;\n }\n }\n\n return options?.fallbackType ?? \"string\";\n}\n\nexport function inferTypesFromParsedVars(\n parsed: { vars: Array<{ key: string; rawValue: string }> },\n options?: InferTypeOptions,\n): EnvVarType[] {\n return parsed.vars.map((item) => inferType(item.key, item.rawValue, options));\n}\n","import { readFileSync } from \"node:fs\";\n\nimport type { InferenceRule } from \"../inferrer/rules.js\";\nimport { inferType } from \"../inferrer/type-inferrer.js\";\nimport { parseCommentBlock } from \"./comment-parser.js\";\nimport type { ParsedEnvFile, ParsedEnvVar } from \"./types.js\";\n\nexport { inferType } from \"../inferrer/type-inferrer.js\";\n\n/** Options forwarded to the type-inference step during parsing. */\ntype ParseOptions = {\n /** Additional inference rules to evaluate before the built-in rules. */\n inferenceRules?: InferenceRule[];\n};\n\n/** Matches a valid env var declaration: KEY=VALUE (value may be empty) */\nconst ENV_VAR_RE = /^([A-Z_][A-Z0-9_]*)=(.*)$/;\n\n/**\n * Matches a section header comment of the form:\n * `# --- SectionName ---` or `# === SectionName ===`\n *\n * `\\S+(?:\\s+\\S+)*` replaces `.+?` so that the non-whitespace word tokens\n * cannot overlap with the surrounding `\\s+` groups, eliminating the\n * super-linear backtracking that `.+?` combined with `\\s+` can trigger.\n */\nconst SECTION_HEADER_RE = /^#\\s+[-=]{3,}\\s+(\\S+(?:\\s+\\S+)*)\\s+[-=]{3,}\\s*$/;\n\n/**\n * Builds a {@link ParsedEnvVar} from a matched env-var line.\n * Extracted from `parseEnvFileContent` to reduce cognitive complexity.\n */\nfunction buildParsedVar(\n params: { key: string; rawValue: string; lineNumber: number; currentGroup: string | undefined },\n commentBlock: string[],\n options: ParseOptions | undefined,\n): ParsedEnvVar {\n const annotations = parseCommentBlock(commentBlock);\n // Capture once so TypeScript can narrow the type in the spread below.\n const extraRules = options?.inferenceRules;\n const inferredType = inferType(\n params.key,\n params.rawValue,\n ...(extraRules === undefined ? [] : [{ extraRules }]),\n );\n const isRequired = params.rawValue.length > 0 || annotations.isRequired;\n const isOptional = params.rawValue.length === 0 && !annotations.isRequired;\n const isClientSide = params.key.startsWith(\"NEXT_PUBLIC_\");\n\n const parsedVar: ParsedEnvVar = {\n key: params.key,\n rawValue: params.rawValue,\n inferredType,\n isRequired,\n isOptional,\n isClientSide,\n lineNumber: params.lineNumber,\n };\n\n // Only set optional fields when they have a value (exactOptionalPropertyTypes)\n if (annotations.annotatedType !== undefined) {\n parsedVar.annotatedType = annotations.annotatedType;\n }\n if (annotations.description !== undefined) {\n parsedVar.description = annotations.description;\n }\n if (params.currentGroup !== undefined) {\n parsedVar.group = params.currentGroup;\n }\n if (annotations.enumValues !== undefined) {\n parsedVar.enumValues = annotations.enumValues;\n }\n if (annotations.constraints !== undefined) {\n parsedVar.constraints = annotations.constraints;\n }\n if (annotations.runtime !== undefined) {\n parsedVar.runtime = annotations.runtime;\n }\n if (annotations.isSecret !== undefined) {\n parsedVar.isSecret = annotations.isSecret;\n }\n\n return parsedVar;\n}\n\n/**\n * Parse the string content of a `.env.example` file into a `ParsedEnvFile`.\n *\n * Exposed separately from `parseEnvFile` to enable unit testing without\n * filesystem access.\n *\n * @param content - Raw file content as a UTF-8 string\n * @param filePath - Used to populate `ParsedEnvFile.filePath` only\n * @param options - Optional parse configuration (custom inference rules)\n */\nexport function parseEnvFileContent(\n content: string,\n filePath: string,\n options?: ParseOptions,\n): ParsedEnvFile {\n const lines = content.split(\"\\n\");\n const vars: ParsedEnvVar[] = [];\n const groups: string[] = [];\n\n let currentGroup: string | undefined;\n let commentBlock: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const lineNumber = i + 1;\n const trimmed = line.trim();\n\n // Blank line — break the comment block association\n if (trimmed === \"\") {\n commentBlock = [];\n continue;\n }\n\n // Section header — update current group and reset comment block\n const sectionMatch = SECTION_HEADER_RE.exec(trimmed);\n if (sectionMatch !== null) {\n const groupName = (sectionMatch[1] ?? \"\").trim();\n currentGroup = groupName;\n if (!groups.includes(groupName)) {\n groups.push(groupName);\n }\n commentBlock = [];\n continue;\n }\n\n // Comment line — accumulate for the next env var\n if (trimmed.startsWith(\"#\")) {\n commentBlock.push(line);\n continue;\n }\n\n // Env var declaration\n const envMatch = ENV_VAR_RE.exec(trimmed);\n if (envMatch === null) {\n // Unrecognised line — reset comment block\n commentBlock = [];\n continue;\n }\n\n vars.push(\n buildParsedVar(\n { key: envMatch[1] ?? \"\", rawValue: envMatch[2] ?? \"\", lineNumber, currentGroup },\n commentBlock,\n options,\n ),\n );\n commentBlock = [];\n }\n\n return { filePath, vars, groups };\n}\n\n/**\n * Read and parse a `.env.example` file from disk.\n *\n * @param filePath - Absolute or relative path to the file\n */\nexport function parseEnvFile(filePath: string): ParsedEnvFile {\n const content = readFileSync(filePath, \"utf8\");\n return parseEnvFileContent(content, filePath);\n}\n","import path from \"node:path\";\n\nimport type { EnvVarType, ParsedEnvFile } from \"../parser/types.js\";\n\n/**\n * Maps an EnvVarType to its TypeScript primitive equivalent.\n * url, email, semver, json, and unknown all map to `string` because\n * TypeScript has no built-in branded types for these.\n */\nfunction toTsType(envVarType: EnvVarType): string {\n if (envVarType === \"number\") return \"number\";\n if (envVarType === \"boolean\") return \"boolean\";\n return \"string\";\n}\n\n/**\n * Generates a TypeScript source file from a parsed .env.example file.\n *\n * Output structure:\n * 1. Header comments — generated-by notice, source file name, ISO timestamp\n * 2. `declare namespace NodeJS { interface ProcessEnv { ... } }` — global augmentation\n * where all properties are typed as `readonly string` (the runtime reality).\n * Number and boolean vars include an inline coercion hint comment.\n * 3. `export type EnvVars = { ... }` — typed module export using semantic types\n * (number, boolean, string).\n * 4. `ServerEnvVars` / `ClientEnvVars` — emitted only when `NEXT_PUBLIC_` vars exist.\n *\n * The output is valid as both a `.ts` and `.d.ts` file.\n * For an ambient-only `.d.ts` (without `export type` statements), use\n * `generateDeclaration` instead.\n *\n * `annotatedType` takes precedence over `inferredType` when both are set.\n */\nexport function generateTypeScriptTypes(parsed: ParsedEnvFile): string {\n const clientVars = parsed.vars.filter((v) => v.isClientSide);\n const hasClientVars = clientVars.length > 0;\n const fileName = path.basename(parsed.filePath);\n const timestamp = new Date().toISOString();\n const lines: string[] = [];\n\n // Header + open NodeJS namespace\n lines.push(\n \"// Generated by env-typegen — do not edit manually\",\n `// Source: ${fileName}`,\n `// Generated at: ${timestamp}`,\n \"\",\n \"declare namespace NodeJS {\",\n \" interface ProcessEnv {\",\n );\n for (const variable of parsed.vars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const optional = variable.isOptional ? \"?\" : \"\";\n if (variable.description !== undefined) {\n lines.push(` /** ${variable.description} */`);\n }\n let propLine = ` readonly ${variable.key}${optional}: string;`;\n if (effectiveType === \"number\") {\n propLine += ` // coerce to number: Number(process.env.${variable.key})`;\n } else if (effectiveType === \"boolean\") {\n propLine += ` // coerce to boolean: process.env.${variable.key} === 'true'`;\n }\n lines.push(propLine);\n }\n // Close NodeJS namespace + open EnvVars type\n lines.push(\" }\", \"}\", \"\", \"export type EnvVars = {\");\n for (const variable of parsed.vars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const tsType = toTsType(effectiveType);\n const optional = variable.isOptional ? \"?\" : \"\";\n lines.push(` ${variable.key}${optional}: ${tsType};`);\n }\n lines.push(\"};\");\n\n // ServerEnvVars / ClientEnvVars — only emitted when NEXT_PUBLIC_ vars exist\n if (hasClientVars) {\n const clientKeyUnion = clientVars.map((v) => `\"${v.key}\"`).join(\" | \");\n lines.push(\n \"\",\n `export type ServerEnvVars = Omit<EnvVars, ${clientKeyUnion}>;`,\n `export type ClientEnvVars = Pick<EnvVars, ${clientKeyUnion}>;`,\n );\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generates a runtime `validateEnv()` function that throws when any required\n * environment variable is absent from `process.env`.\n */\nexport function generateEnvValidation(parsed: ParsedEnvFile): string {\n const required = parsed.vars.filter((v) => v.isRequired).map((v) => v.key);\n const lines: string[] = [];\n\n lines.push(\n \"// Generated by env-typegen — do not edit manually\",\n \"\",\n \"export function validateEnv(): void {\",\n );\n\n if (required.length === 0) {\n lines.push(\" // No required environment variables defined\");\n } else {\n const keyList = required.map((k) => `\"${k}\"`).join(\", \");\n lines.push(\n ` const required = [${keyList}];`,\n \" for (const key of required) {\",\n \" if (!process.env[key]) {\",\n \" throw new Error(`Missing required environment variable: ${key}`);\",\n \" }\",\n \" }\",\n );\n }\n\n lines.push(\"}\");\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { EnvVarType, ParsedEnvFile } from \"../parser/types.js\";\n\n/**\n * Maps an EnvVarType to its Zod schema expression.\n *\n * - `number` → `z.coerce.number()` (env vars are strings; coerce handles the cast)\n * - `boolean` → `z.coerce.boolean()` (env vars are strings; coerce handles truthy cast)\n * - `url` → `z.string().url()`\n * - `email` → `z.string().email()`\n * - everything else → `z.string()` (string | semver | json | unknown)\n */\nfunction toZodType(envVarType: EnvVarType): string {\n if (envVarType === \"number\") return \"z.coerce.number()\";\n if (envVarType === \"boolean\") return \"z.coerce.boolean()\";\n if (envVarType === \"url\") return \"z.string().url()\";\n if (envVarType === \"email\") return \"z.string().email()\";\n return \"z.string()\";\n}\n\n/**\n * Generates a Zod schema file from a parsed .env.example file.\n *\n * Output structure:\n * ```\n * // Generated by env-typegen — do not edit manually\n * import { z } from \"zod\";\n *\n * export const serverEnvSchema = z.object({\n * DATABASE_URL: z.string().url(),\n * PORT: z.coerce.number(),\n * });\n *\n * export const clientEnvSchema = z.object({\n * NEXT_PUBLIC_API_URL: z.string().url(),\n * });\n *\n * export const envSchema = serverEnvSchema.merge(clientEnvSchema);\n * export type Env = z.infer<typeof envSchema>;\n * ```\n *\n * - Server-side vars (non-`NEXT_PUBLIC_`) go into `serverEnvSchema`\n * - Client-side vars (`NEXT_PUBLIC_` prefix) go into `clientEnvSchema`\n * - `envSchema` is the merged union of both, for full-stack validation\n * - `annotatedType` takes precedence over `inferredType` when both are set\n * - Optional vars have `.optional()` appended to their Zod expression\n */\nexport function generateZodSchema(parsed: ParsedEnvFile): string {\n const serverVars = parsed.vars.filter((v) => !v.isClientSide);\n const clientVars = parsed.vars.filter((v) => v.isClientSide);\n const lines: string[] = [];\n\n // Header + open serverEnvSchema\n lines.push(\n \"// Generated by env-typegen — do not edit manually\",\n 'import { z } from \"zod\";',\n \"\",\n \"export const serverEnvSchema = z.object({\",\n );\n for (const variable of serverVars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const zodExpr = variable.isOptional\n ? `${toZodType(effectiveType)}.optional()`\n : toZodType(effectiveType);\n lines.push(` ${variable.key}: ${zodExpr},`);\n }\n // Close serverEnvSchema + open clientEnvSchema\n lines.push(\"});\", \"\", \"export const clientEnvSchema = z.object({\");\n for (const variable of clientVars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const zodExpr = variable.isOptional\n ? `${toZodType(effectiveType)}.optional()`\n : toZodType(effectiveType);\n lines.push(` ${variable.key}: ${zodExpr},`);\n }\n // Close clientEnvSchema + merged schema + type\n lines.push(\n \"});\",\n \"\",\n \"export const envSchema = serverEnvSchema.merge(clientEnvSchema);\",\n \"export type Env = z.infer<typeof envSchema>;\",\n );\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import path from \"node:path\";\n\nimport type { ParsedEnvFile } from \"../parser/types.js\";\n\n/**\n * Generates an ambient `.d.ts` declaration file from a parsed .env.example.\n *\n * Output is a pure `NodeJS.ProcessEnv` augmentation — no `export type` statements.\n * This makes the file valid as a global ambient declaration that can be dropped\n * into `lib/` or `types/` without affecting module resolution.\n *\n * Output structure:\n * ```\n * // Generated by env-typegen — do not edit manually\n * // Source: .env.example\n *\n * declare namespace NodeJS {\n * interface ProcessEnv {\n * readonly KEY: string; // all vars are runtime strings\n * readonly OPT?: string; // optional vars use ?: string\n * readonly NUM: string; // coerce to number: Number(process.env.NUM)\n * readonly FLAG: string; // coerce to boolean: process.env.FLAG === 'true'\n * }\n * }\n * ```\n *\n * For a `.ts` output with typed `export type EnvVars` / `ServerEnvVars` /\n * `ClientEnvVars`, use `generateTypeScriptTypes` instead.\n *\n * - `ProcessEnv` uses `readonly string` for every variable (runtime reality)\n * - Number and boolean vars include an inline coercion hint comment\n * - `annotatedType` takes precedence over `inferredType`\n */\nexport function generateDeclaration(parsed: ParsedEnvFile): string {\n const fileName = path.basename(parsed.filePath);\n\n // NodeJS.ProcessEnv augmentation — ambient only, no exports\n const lines = [\n \"// Generated by env-typegen — do not edit manually\",\n `// Source: ${fileName}`,\n \"\",\n \"declare namespace NodeJS {\",\n \" interface ProcessEnv {\",\n ];\n for (const variable of parsed.vars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n const optional = variable.isOptional ? \"?\" : \"\";\n if (variable.description !== undefined) {\n lines.push(` /** ${variable.description} */`);\n }\n let propLine = ` readonly ${variable.key}${optional}: string;`;\n if (effectiveType === \"number\") {\n propLine += ` // coerce to number: Number(process.env.${variable.key})`;\n } else if (effectiveType === \"boolean\") {\n propLine += ` // coerce to boolean: process.env.${variable.key} === 'true'`;\n }\n lines.push(propLine);\n }\n lines.push(\" }\", \"}\");\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { EnvVarType, ParsedEnvFile, ParsedEnvVar } from \"../parser/types.js\";\n\n/**\n * Escapes a string for safe embedding inside a double-quoted JavaScript string\n * literal. Backslashes must be escaped before double quotes so that a backslash\n * at the end of the value does not inadvertently escape the closing quote.\n */\nfunction escapeJsStringLiteral(value: string): string {\n return value.replaceAll(\"\\\\\", String.raw`\\\\`).replaceAll('\"', String.raw`\\\"`);\n}\n\n/**\n * Maps an EnvVarType to its Zod schema expression for use in t3-env createEnv().\n *\n * Note: boolean uses `z.coerce.boolean()` here (not the `.transform()` approach\n * in the standalone zod-generator) because @t3-oss/env-nextjs handles coercion\n * internally with `z.coerce`.\n */\nfunction toT3ZodType(envVarType: EnvVarType): string {\n if (envVarType === \"number\") return \"z.coerce.number()\";\n if (envVarType === \"boolean\") return \"z.coerce.boolean()\";\n if (envVarType === \"url\") return \"z.string().url()\";\n if (envVarType === \"email\") return \"z.string().email()\";\n return \"z.string()\";\n}\n\n/**\n * Builds the Zod schema expression for a single env variable including\n * optional `.describe()` and `.optional()` modifiers.\n */\nfunction buildZodExpr(variable: ParsedEnvVar): string {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n let zodExpr = toT3ZodType(effectiveType);\n if (variable.description !== undefined) {\n zodExpr += `.describe(\"${escapeJsStringLiteral(variable.description)}\")`;\n }\n if (variable.isOptional) {\n zodExpr += \".optional()\";\n }\n return zodExpr;\n}\n\n/**\n * Generates a `@t3-oss/env-nextjs` configuration file from a parsed .env.example.\n *\n * Output structure:\n * ```\n * import { createEnv } from \"@t3-oss/env-nextjs\";\n * import { z } from \"zod\";\n *\n * export const env = createEnv({\n * server: { /* non-NEXT_PUBLIC_ vars *\\/ },\n * client: { /* NEXT_PUBLIC_ vars *\\/ },\n * runtimeEnv: { /* all vars mapped to process.env *\\/ },\n * });\n * ```\n *\n * - `server:` is omitted when there are no server-side vars\n * - `client:` is omitted when there are no client-side vars (NEXT_PUBLIC_ prefix)\n * - `runtimeEnv:` always includes all vars\n * - `annotatedType` takes precedence over `inferredType`\n * - Optional vars have `.optional()` appended\n * - Vars with a description have `.describe(\"text\")` appended (before `.optional()`)\n */\nexport function generateT3Env(parsed: ParsedEnvFile): string {\n const serverVars = parsed.vars.filter((v) => !v.isClientSide);\n const clientVars = parsed.vars.filter((v) => v.isClientSide);\n\n const lines = [\n \"// Generated by env-typegen — do not edit manually\",\n 'import { createEnv } from \"@t3-oss/env-nextjs\";',\n 'import { z } from \"zod\";',\n \"\",\n \"export const env = createEnv({\",\n ];\n\n if (serverVars.length > 0) {\n lines.push(\n \" server: {\",\n ...serverVars.map((v) => ` ${v.key}: ${buildZodExpr(v)},`),\n \" },\",\n );\n }\n\n if (clientVars.length > 0) {\n lines.push(\n \" client: {\",\n ...clientVars.map((v) => ` ${v.key}: ${buildZodExpr(v)},`),\n \" },\",\n );\n }\n\n lines.push(\n \" runtimeEnv: {\",\n ...parsed.vars.map((v) => ` ${v.key}: process.env.${v.key},`),\n \" },\",\n \"});\",\n );\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { EnvContract } from \"./schema-model.js\";\n\n/**\n * Contract file names searched in order when calling {@link loadContract}.\n * Mirrors the search strategy used by `loadConfig` in `config.ts`.\n */\nexport const CONTRACT_FILE_NAMES = [\n \"env.contract.ts\",\n \"env.contract.mjs\",\n \"env.contract.js\",\n] as const;\n\n/**\n * Type-safe contract factory. Returns the contract object unchanged — exists\n * purely for IDE autocompletion and compile-time validation of the contract shape.\n *\n * Use this in your `env.contract.ts` file:\n *\n * @example\n * ```ts\n * // env.contract.ts\n * import { defineContract } from \"@xlameiro/env-typegen\";\n *\n * export default defineContract({\n * vars: [\n * { name: \"DATABASE_URL\", expectedType: \"url\", required: true, isSecret: true },\n * { name: \"PORT\", expectedType: \"number\", required: false, default: \"3000\" },\n * {\n * name: \"NODE_ENV\",\n * expectedType: \"string\",\n * required: true,\n * enumValues: [\"development\", \"staging\", \"production\"],\n * },\n * ],\n * });\n * ```\n *\n * @public\n */\nexport function defineContract(contract: EnvContract): EnvContract {\n return contract;\n}\n\n/**\n * Loads an env contract by searching for a contract file starting from `cwd`.\n *\n * Search order: `env.contract.ts` → `env.contract.mjs` → `env.contract.js`\n *\n * Returns `undefined` when no contract file is found. The contract file must\n * use a default export of an {@link EnvContract} object, typically produced\n * by {@link defineContract}.\n *\n * @param cwd - Directory to start searching from. Defaults to `process.cwd()`.\n *\n * @public\n */\nexport async function loadContract(cwd: string = process.cwd()): Promise<EnvContract | undefined> {\n for (const name of CONTRACT_FILE_NAMES) {\n const filePath = path.resolve(cwd, name);\n if (existsSync(filePath)) {\n const fileUrl = pathToFileURL(filePath).href;\n const mod = (await import(fileUrl)) as { default?: EnvContract };\n return mod.default;\n }\n }\n return undefined;\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { InferenceRule } from \"./inferrer/rules.js\";\nimport type { PluginReference } from \"./plugins.js\";\n\nexport type { InferenceRule } from \"./inferrer/rules.js\";\nexport type { PluginReference } from \"./plugins.js\";\n\n/** Generator identifiers supported by env-typegen. */\nexport type GeneratorName = \"typescript\" | \"zod\" | \"t3\" | \"declaration\";\n\n/** Configuration shape accepted by env-typegen's CLI and programmatic API. */\nexport type EnvTypegenConfig = {\n /** Path(s) to the .env.example file(s) to parse. */\n input: string | string[];\n /** Output directory for generated files. Defaults to the input file's directory. */\n output?: string;\n /** Which generators to run. When omitted, all four generators run. */\n generators?: GeneratorName[];\n /** Format generated output with prettier. Defaults to true. */\n format?: boolean;\n /**\n * Additional inference rules to prepend before the built-in rules.\n * Rules are matched in ascending priority order; lower numbers win.\n */\n inferenceRules?: InferenceRule[];\n\n /**\n * Path to the contract file (`env.contract.ts`).\n * When provided, the contract is the authoritative source of type information.\n * Relative to the config file directory or `process.cwd()`.\n */\n schemaFile?: string;\n\n /**\n * When `true`, variables absent from the contract emit errors rather than warnings.\n * Defaults to `true`.\n */\n strict?: boolean;\n\n /**\n * Resolution strategy for type information.\n * - `\"legacy\"` (default): inference-first; annotations override inferred types.\n * - `\"contract-first\"`: contract is authoritative; inference is a fallback only.\n */\n schemaMode?: \"legacy\" | \"contract-first\";\n\n /** Default target files for `env-typegen diff` when --targets is omitted. */\n diffTargets?: string[];\n\n /** Plugin references (module paths or plugin objects). */\n plugins?: PluginReference[];\n};\n\n/** Config file names searched in order when calling loadConfig(). */\nexport const CONFIG_FILE_NAMES = [\n \"env-typegen.config.mjs\",\n \"env-typegen.config.js\",\n \"env-typegen.config.ts\",\n] as const;\n\n/**\n * Type-safe config helper.\n * Returns the config object unchanged — exists purely for IDE autocompletion\n * and compile-time validation of the config shape.\n */\nexport function defineConfig(config: EnvTypegenConfig): EnvTypegenConfig {\n return config;\n}\n\n/**\n * Loads env-typegen config by searching for a config file in `cwd`.\n * Searches for env-typegen.config.ts → .mjs → .js in order.\n * Returns `undefined` when no config file is found.\n */\nexport async function loadConfig(\n cwd: string = process.cwd(),\n): Promise<EnvTypegenConfig | undefined> {\n for (const name of CONFIG_FILE_NAMES) {\n const filePath = path.resolve(cwd, name);\n if (existsSync(filePath)) {\n // Node.js cannot import TypeScript files natively — attempting import()\n // on a .ts path throws \"Unknown file extension .ts\" and crashes every command.\n // Detect early and emit an actionable error instead.\n if (filePath.endsWith(\".ts\")) {\n throw new Error(\n `Config file \"${name}\" was found but TypeScript files cannot be loaded directly at runtime.\\n` +\n `Rename it to \"env-typegen.config.mjs\" and use ESM export syntax:\\n\\n` +\n ` // env-typegen.config.mjs\\n` +\n ` import { defineConfig } from \"@xlameiro/env-typegen\";\\n` +\n ` export default defineConfig({ input: \".env.example\" });\\n\\n` +\n `Tip: keep env-typegen.config.ts for IDE autocompletion and create a sibling\\n` +\n `env-typegen.config.mjs for runtime loading.`,\n );\n }\n const fileUrl = pathToFileURL(filePath).href;\n const mod = (await import(fileUrl)) as { default?: EnvTypegenConfig };\n return mod.default;\n }\n }\n return undefined;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/**\n * Reads a .env file from `filePath` and returns its full text content.\n * Rejects with a Node.js filesystem error if the file does not exist.\n */\nexport async function readEnvFile(filePath: string): Promise<string> {\n return readFile(path.resolve(filePath), \"utf8\");\n}\n\n/**\n * Writes `content` to `filePath`, creating intermediate directories as needed.\n * Overwrites any existing file at that path.\n */\nexport async function writeOutput(filePath: string, content: string): Promise<void> {\n const resolved = path.resolve(filePath);\n await mkdir(path.dirname(resolved), { recursive: true });\n await writeFile(resolved, content, \"utf8\");\n}\n","import { format } from \"prettier\";\n\n/**\n * Formats `content` using prettier with the specified `parser`.\n * Defaults to the \"typescript\" parser, which is correct for all generator outputs.\n * Returns the original content unchanged if prettier throws (e.g., invalid syntax).\n */\nexport async function formatOutput(\n content: string,\n parser: string = \"typescript\",\n): Promise<string> {\n try {\n return await format(content, { parser });\n } catch (err) {\n console.warn(\n \"env-typegen: Prettier formatting failed, writing unformatted output.\",\n err instanceof Error ? err.message : String(err),\n );\n return content;\n }\n}\n","import { green, red, yellow } from \"picocolors\";\n\n/** Prints a plain informational message to stdout. */\nexport function log(message: string): void {\n console.log(message);\n}\n\n/** Prints a yellow ⚠ warning message to stderr. */\nexport function warn(message: string): void {\n console.warn(yellow(`⚠ ${message}`));\n}\n\n/** Prints a red ✖ error message to stderr. */\nexport function error(message: string): void {\n console.error(red(`✖ ${message}`));\n}\n\n/** Prints a green ✔ success message to stdout. */\nexport function success(message: string): void {\n console.log(green(`✔ ${message}`));\n}\n","import path from \"node:path\";\n\nimport { type GeneratorName, type InferenceRule } from \"./config.js\";\nimport { generateDeclaration } from \"./generators/declaration-generator.js\";\nimport { generateT3Env } from \"./generators/t3-generator.js\";\nimport { generateTypeScriptTypes } from \"./generators/typescript-generator.js\";\nimport { generateZodSchema } from \"./generators/zod-generator.js\";\nimport { parseEnvFileContent } from \"./parser/env-parser.js\";\nimport type { ParsedEnvFile } from \"./parser/types.js\";\nimport { readEnvFile, writeOutput } from \"./utils/file.js\";\nimport { formatOutput } from \"./utils/format.js\";\nimport { success } from \"./utils/logger.js\";\n\n/** Options accepted by the runGenerate pipeline. */\nexport type RunGenerateOptions = {\n input: string | string[];\n output: string;\n generators: GeneratorName[];\n format: boolean;\n stdout?: boolean;\n dryRun?: boolean;\n silent?: boolean;\n /** Additional inference rules to prepend before built-in rules. */\n inferenceRules?: InferenceRule[];\n};\n\n/** Derive the output file path for a generator when multiple generators are in use. */\nfunction deriveOutputPath(base: string, generator: GeneratorName, isSingle: boolean): string {\n if (isSingle) return base;\n const ext = path.extname(base);\n const noExt = ext.length > 0 ? base.slice(0, -ext.length) : base;\n // The declaration generator produces ambient TypeScript declarations (.d.ts).\n // Use the correct extension so IDEs and tsc pick it up as a declaration file.\n const baseExt = ext.length > 0 ? ext : \".ts\";\n const outExt = generator === \"declaration\" ? \".d.ts\" : baseExt;\n return `${noExt}.${generator}${outExt}`;\n}\n\n/**\n * When running against multiple input files, derive a per-input output base so\n * each file produces a distinct set of outputs. The input's basename (without\n * extension) is used as the stem; directory and extension come from the\n * user-supplied `output` option.\n */\nfunction deriveOutputBaseForInput(output: string, inputPath: string): string {\n const dir = path.dirname(output);\n const ext = path.extname(output);\n const stem = path.basename(inputPath, path.extname(inputPath));\n return path.join(dir, `${stem}${ext}`);\n}\n\n/** Invoke the correct generator function for the given name. */\nfunction buildOutput(generator: GeneratorName, parsed: ParsedEnvFile): string {\n switch (generator) {\n case \"typescript\":\n return generateTypeScriptTypes(parsed);\n case \"zod\":\n return generateZodSchema(parsed);\n case \"t3\":\n return generateT3Env(parsed);\n case \"declaration\":\n return generateDeclaration(parsed);\n }\n}\n\nasync function persistOutput(params: {\n generated: string;\n generator: GeneratorName;\n outputPath: string;\n isSingle: boolean;\n stdout: boolean;\n dryRun: boolean;\n silent: boolean;\n}): Promise<void> {\n const { generated, generator, outputPath, isSingle, stdout, dryRun, silent } = params;\n\n if (stdout) {\n if (isSingle) {\n console.log(generated);\n } else {\n console.log(`// --- ${generator}:${outputPath} ---`);\n console.log(generated);\n }\n return;\n }\n\n if (dryRun) {\n if (!silent) {\n if (!isSingle) {\n console.log(`// --- ${generator}: ${outputPath} ---`);\n }\n console.log(generated);\n success(`Dry run: would write ${outputPath}`);\n }\n return;\n }\n\n await writeOutput(outputPath, generated);\n if (!silent) {\n success(`Generated ${outputPath}`);\n }\n}\n\n/**\n * Reads the input file(s), runs the requested generators, optionally formats each\n * output, and writes the results to disk.\n *\n * Exported for unit testing — call this directly rather than spawning a child process.\n */\nexport async function runGenerate(options: RunGenerateOptions): Promise<void> {\n const {\n input,\n output,\n generators,\n format: shouldFormat,\n stdout = false,\n dryRun = false,\n silent = false,\n inferenceRules,\n } = options;\n const inputs = Array.isArray(input) ? input : [input];\n const hasMultipleInputs = inputs.length > 1;\n const isSingle = generators.length === 1;\n\n for (const inputPath of inputs) {\n const outputBase = hasMultipleInputs ? deriveOutputBaseForInput(output, inputPath) : output;\n const content = await readEnvFile(inputPath);\n const parsed = parseEnvFileContent(\n content,\n inputPath,\n inferenceRules === undefined ? undefined : { inferenceRules },\n );\n\n for (const generator of generators) {\n let generated = buildOutput(generator, parsed);\n if (shouldFormat && !dryRun) {\n generated = await formatOutput(generated);\n }\n const outputPath = deriveOutputPath(outputBase, generator, isSingle);\n await persistOutput({\n generated,\n generator,\n outputPath,\n isSingle,\n stdout,\n dryRun,\n silent,\n });\n }\n }\n}\n","import type { ParsedEnvFile, ParsedEnvVar } from \"../parser/types.js\";\nimport type { Expected } from \"../reporting/ci-contract.js\";\nimport type { EnvContract, EnvContractEntry } from \"../schema/schema-model.js\";\nimport type { ValidateContractOptions, ValidationIssue, ValidationResult } from \"./types.js\";\n\nconst SEMVER_RE = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z-.]+)?(?:\\+[0-9A-Za-z-.]+)?$/;\n\n// ---------------------------------------------------------------------------\n// Internal type helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Maps an `EnvContractEntry` to an `Expected` discriminated union member\n * for use in issue payloads.\n */\nfunction buildExpected(entry: EnvContractEntry): Expected {\n if (entry.enumValues !== undefined && entry.enumValues.length > 0) {\n return { type: \"enum\", values: entry.enumValues };\n }\n\n switch (entry.expectedType) {\n case \"number\":\n return {\n type: \"number\",\n ...(entry.constraints?.min !== undefined && { min: entry.constraints.min }),\n ...(entry.constraints?.max !== undefined && { max: entry.constraints.max }),\n };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"url\":\n return { type: \"url\" };\n case \"email\":\n return { type: \"email\" };\n case \"json\":\n return { type: \"json\" };\n case \"semver\":\n return { type: \"semver\" };\n case \"unknown\":\n return { type: \"unknown\" };\n default:\n return { type: \"string\" };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Per-rule validator functions\n// ---------------------------------------------------------------------------\n\n/**\n * ENV_SECRET_EXPOSED — a variable marked as `isSecret` has a non-empty raw value.\n * This indicates the secret is committed to source control or a public example file.\n */\nfunction checkSecretExposed(\n variable: ParsedEnvVar,\n entry: EnvContractEntry,\n environment: NonNullable<ValidateContractOptions[\"environment\"]>,\n): ValidationIssue | undefined {\n if (entry.isSecret !== true) return undefined;\n if (variable.rawValue === \"\") return undefined;\n\n return {\n code: \"ENV_SECRET_EXPOSED\",\n key: variable.key,\n expected: buildExpected(entry),\n environment,\n severity: \"error\",\n };\n}\n\n/**\n * ENV_INVALID_TYPE — the raw value cannot be coerced to the declared type.\n */\nfunction checkInvalidType(\n variable: ParsedEnvVar,\n entry: EnvContractEntry,\n environment: NonNullable<ValidateContractOptions[\"environment\"]>,\n): ValidationIssue | undefined {\n const value = variable.rawValue;\n const expected = buildExpected(entry);\n\n switch (entry.expectedType) {\n case \"number\": {\n if (!Number.isFinite(Number(value))) {\n return {\n code: \"ENV_INVALID_TYPE\",\n key: variable.key,\n expected,\n environment,\n severity: \"error\",\n };\n }\n break;\n }\n case \"boolean\": {\n if (value !== \"true\" && value !== \"false\") {\n return {\n code: \"ENV_INVALID_TYPE\",\n key: variable.key,\n expected,\n environment,\n severity: \"error\",\n };\n }\n break;\n }\n case \"url\": {\n try {\n new URL(value);\n } catch {\n return {\n code: \"ENV_INVALID_TYPE\",\n key: variable.key,\n expected,\n environment,\n severity: \"error\",\n };\n }\n break;\n }\n case \"email\": {\n if (!value.includes(\"@\") || !value.includes(\".\")) {\n return {\n code: \"ENV_INVALID_TYPE\",\n key: variable.key,\n expected,\n environment,\n severity: \"error\",\n };\n }\n break;\n }\n case \"semver\": {\n if (!SEMVER_RE.test(value)) {\n return {\n code: \"ENV_INVALID_TYPE\",\n key: variable.key,\n expected,\n environment,\n severity: \"error\",\n };\n }\n break;\n }\n default:\n // \"string\", \"json\", \"unknown\" — no structural coercion check in V1\n break;\n }\n\n return undefined;\n}\n\n/** Checks numeric range constraints. Returns an issue if the value is outside [min, max]. */\nfunction checkNumericConstraints(\n variable: ParsedEnvVar,\n entry: EnvContractEntry,\n environment: NonNullable<ValidateContractOptions[\"environment\"]>,\n): ValidationIssue | undefined {\n if (entry.expectedType !== \"number\" || entry.constraints === undefined) return undefined;\n\n const num = Number(variable.rawValue);\n if (!Number.isFinite(num)) return undefined;\n\n const { min, max } = entry.constraints;\n const outsideMin = min !== undefined && num < min;\n const outsideMax = max !== undefined && num > max;\n\n if (outsideMin || outsideMax) {\n return {\n code: \"ENV_INVALID_VALUE\",\n key: variable.key,\n expected: buildExpected(entry),\n environment,\n severity: \"error\",\n };\n }\n\n return undefined;\n}\n\n/**\n * ENV_INVALID_VALUE — the value fails an enum or numeric range constraint.\n * Only checked after type validation passes.\n */\nfunction checkInvalidValue(\n variable: ParsedEnvVar,\n entry: EnvContractEntry,\n environment: NonNullable<ValidateContractOptions[\"environment\"]>,\n): ValidationIssue | undefined {\n const value = variable.rawValue;\n\n // Enum constraint takes precedence over min/max\n if (entry.enumValues !== undefined && entry.enumValues.length > 0) {\n if (!entry.enumValues.includes(value)) {\n return {\n code: \"ENV_INVALID_VALUE\",\n key: variable.key,\n expected: { type: \"enum\", values: entry.enumValues },\n environment,\n severity: \"error\",\n };\n }\n return undefined;\n }\n\n return checkNumericConstraints(variable, entry, environment);\n}\n\ntype CheckVariableContext = {\n contractByName: Map<string, EnvContractEntry>;\n environment: NonNullable<ValidateContractOptions[\"environment\"]>;\n strict: boolean;\n};\n\n/**\n * Run all per-variable checks for a single parsed variable.\n * Returns all issues found (may be empty).\n */\nfunction checkVariable(variable: ParsedEnvVar, context: CheckVariableContext): ValidationIssue[] {\n const { contractByName, environment, strict } = context;\n const entry = contractByName.get(variable.key);\n\n if (entry === undefined) {\n return [\n {\n code: \"ENV_EXTRA\",\n key: variable.key,\n expected: { type: \"string\" },\n environment,\n severity: strict ? \"error\" : \"warning\",\n },\n ];\n }\n\n const found: ValidationIssue[] = [];\n\n // ENV_SECRET_EXPOSED — checked first\n const secretIssue = checkSecretExposed(variable, entry, environment);\n if (secretIssue !== undefined) found.push(secretIssue);\n\n // Skip further checks for empty values\n if (variable.rawValue === \"\") return found;\n\n // ENV_INVALID_TYPE\n const typeIssue = checkInvalidType(variable, entry, environment);\n if (typeIssue !== undefined) {\n found.push(typeIssue);\n return found; // no constraint checks on type-invalid values\n }\n\n // ENV_INVALID_VALUE (enum / min / max)\n const valueIssue = checkInvalidValue(variable, entry, environment);\n if (valueIssue !== undefined) found.push(valueIssue);\n\n return found;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a parsed env file against a contract definition.\n *\n * Produces a {@link ValidationResult} containing all discovered issues.\n * Does not throw — every problem becomes a typed {@link ValidationIssue}.\n *\n * Issue codes checked:\n * - `ENV_MISSING` — required contract var absent from env file\n * - `ENV_EXTRA` — env file var not declared in contract\n * - `ENV_INVALID_TYPE` — value cannot be coerced to declared type\n * - `ENV_INVALID_VALUE` — enum or min/max constraint violated\n * - `ENV_SECRET_EXPOSED` — secret var has non-empty value in env file\n *\n * Note: `ENV_CONFLICT` is not emitted in V1 (requires multi-file comparison\n * which belongs to the `diff` command, Phase 4).\n *\n * @param parsed — result of `parseEnvFile` for the env file under check\n * @param contract — the authoritative contract to validate against\n * @param opts — optional check configuration (environment, strict mode)\n * @returns — `{ issues: ValidationIssue[] }` — empty when all checks pass\n *\n * @public\n */\nexport function validateContract(\n parsed: ParsedEnvFile,\n contract: EnvContract,\n opts: ValidateContractOptions = {},\n): ValidationResult {\n const environment = opts.environment ?? \"local\";\n const strict = opts.strict ?? true;\n\n const issues: ValidationIssue[] = [];\n\n // Build lookup maps for O(n) iteration\n const contractByName = new Map<string, EnvContractEntry>(\n contract.vars.map((entry) => [entry.name, entry]),\n );\n const parsedByKey = new Map<string, ParsedEnvVar>(parsed.vars.map((v) => [v.key, v]));\n\n // ---------------------------------------------------------------------------\n // Check 1: ENV_MISSING — required contract vars absent from the env file\n // ---------------------------------------------------------------------------\n for (const entry of contract.vars) {\n if (!entry.required) continue;\n if (parsedByKey.has(entry.name)) continue;\n\n issues.push({\n code: \"ENV_MISSING\",\n key: entry.name,\n expected: buildExpected(entry),\n environment,\n severity: \"error\",\n });\n }\n\n // ---------------------------------------------------------------------------\n // Check 2: Per-variable checks on vars that exist in both parsed and contract\n // ---------------------------------------------------------------------------\n const context: CheckVariableContext = { contractByName, environment, strict };\n for (const variable of parsed.vars) {\n const perVarIssues = checkVariable(variable, context);\n for (const issue of perVarIssues) {\n issues.push(issue);\n }\n }\n\n return { issues };\n}\n","/**\n * Build and format the V1 JSON report for `env-typegen check --json`.\n *\n * @module\n */\n\nimport type { ValidationIssue, ValidationResult } from \"../validator/types.js\";\nimport type { CiReport, Issue, IssueCode } from \"./ci-contract.js\";\n\n// ---------------------------------------------------------------------------\n// Human-readable descriptions (maps 1-to-1 with IssueCode)\n// ---------------------------------------------------------------------------\n\nconst ISSUE_TYPE_MAP: Record<IssueCode, string> = {\n ENV_MISSING: \"Required variable is missing from the env file\",\n ENV_EXTRA: \"Variable is present in the env file but not declared in the contract\",\n ENV_INVALID_TYPE: \"Value cannot be coerced to the declared type\",\n ENV_INVALID_VALUE: \"Value fails a constraint check (enum, min, max)\",\n ENV_CONFLICT: \"Variable has inconsistent values across environments\",\n ENV_SECRET_EXPOSED: \"Secret variable has a non-empty value in a public env file\",\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction toIssue(vi: ValidationIssue): Issue {\n const issue: Issue = {\n code: vi.code,\n type: ISSUE_TYPE_MAP[vi.code],\n key: vi.key,\n expected: vi.expected,\n environment: vi.environment,\n severity: vi.severity,\n value: null,\n };\n // Guard required by exactOptionalPropertyTypes — never assign `undefined`\n if (vi.received !== undefined) {\n issue.received = vi.received;\n }\n return issue;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Options for {@link formatCiReport}.\n *\n * @public\n */\nexport type FormatCiReportOptions = {\n /** When `true`, the output is pretty-printed with 2-space indentation. */\n pretty?: boolean;\n};\n\n/**\n * Convert a {@link ValidationResult} into a stable V1 {@link CiReport}.\n *\n * The returned object's property order is canonical:\n * `schemaVersion` → `status` → `summary` → `issues` → `meta`\n *\n * @public\n */\nexport function buildCiReport(\n result: ValidationResult,\n meta: { env: string; timestamp: string },\n): CiReport {\n const issues = result.issues.map(toIssue);\n const errors = issues.filter((i) => i.severity === \"error\").length;\n const warnings = issues.filter((i) => i.severity === \"warning\").length;\n\n return {\n schemaVersion: 1,\n status: errors > 0 ? \"fail\" : \"ok\",\n summary: { errors, warnings },\n issues,\n meta,\n };\n}\n\n/**\n * Serialise a {@link CiReport} to JSON.\n *\n * @param report The report produced by {@link buildCiReport}.\n * @param opts Optional formatting options.\n * @returns JSON string. Compact by default; pretty-printed when `opts.pretty === true`.\n *\n * @public\n */\nexport function formatCiReport(report: CiReport, opts?: FormatCiReportOptions): string {\n return JSON.stringify(report, null, opts?.pretty === true ? 2 : undefined);\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { parseEnvFile } from \"../parser/env-parser.js\";\nimport type { Environment, ReportStatus } from \"../reporting/ci-contract.js\";\nimport type { FormatCiReportOptions } from \"../reporting/ci-reporter.js\";\nimport { buildCiReport, formatCiReport } from \"../reporting/ci-reporter.js\";\nimport { loadContract } from \"../schema/schema-loader.js\";\nimport type { EnvContract } from \"../schema/schema-model.js\";\nimport { error, log, success, warn } from \"../utils/logger.js\";\nimport { validateContract } from \"../validator/contract-validator.js\";\nimport type { ValidateContractOptions, ValidationResult } from \"../validator/types.js\";\n\n/**\n * Options for {@link runCheck}.\n *\n * @public\n */\nexport type RunCheckOptions = {\n /** Path to the env file to validate (e.g. `.env.local`). */\n input: string;\n /** Explicit path to the contract file. Relative to `cwd` when set. */\n contract?: string;\n /** Working directory for contract auto-discovery. Defaults to `process.cwd()`. */\n cwd?: string;\n /** Environment label attached to validation issues. */\n environment?: Environment;\n /**\n * When `true` (default), undeclared variables are treated as errors.\n * When `false`, they become warnings.\n */\n strict?: boolean;\n /** Emit machine-readable JSON to stdout instead of human-readable lines. */\n json?: boolean;\n /** Pretty-print the JSON output when `json: true`. */\n pretty?: boolean;\n /** Suppress all output (status is still returned). */\n silent?: boolean;\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nasync function resolveContract(\n contractPath: string | undefined,\n cwd: string | undefined,\n): Promise<EnvContract> {\n if (contractPath !== undefined) {\n const absPath = path.resolve(cwd ?? process.cwd(), contractPath);\n if (!existsSync(absPath)) {\n throw new Error(`Contract file not found: ${absPath}`);\n }\n // Dynamic import — works with ts-node/tsx compiled contract files\n const mod = (await import(pathToFileURL(absPath).href)) as {\n default?: EnvContract;\n };\n if (mod.default === undefined) {\n throw new Error(`Contract file has no default export: ${absPath}`);\n }\n return mod.default;\n }\n\n const contract = await loadContract(cwd);\n if (contract === undefined) {\n throw new Error(\"No contract file found\");\n }\n return contract;\n}\n\nfunction outputJson(result: ValidationResult, input: string, pretty: boolean | undefined): void {\n const report = buildCiReport(result, {\n env: input,\n timestamp: new Date().toISOString(),\n });\n const formatOpts: FormatCiReportOptions = {};\n if (pretty) formatOpts.pretty = true;\n log(formatCiReport(report, formatOpts));\n}\n\nfunction outputHuman(result: ValidationResult): void {\n if (result.issues.length === 0) {\n success(\"No issues found\");\n return;\n }\n for (const issue of result.issues) {\n const msg = `[${issue.code}] ${issue.key}`;\n if (issue.severity === \"error\") {\n error(msg);\n } else {\n warn(msg);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Programmatic entry point for the `env-typegen check` command.\n *\n * Loads the contract, parses the env file, runs validation, and outputs results.\n * Returns `\"ok\"` when there are no errors, `\"fail\"` when there are.\n *\n * @public\n */\nexport async function runCheck(opts: RunCheckOptions): Promise<ReportStatus> {\n const contract = await resolveContract(opts.contract, opts.cwd);\n const parsed = parseEnvFile(opts.input);\n\n const validatorOpts: ValidateContractOptions = {};\n if (opts.environment !== undefined) validatorOpts.environment = opts.environment;\n if (opts.strict !== undefined) validatorOpts.strict = opts.strict;\n\n const result = validateContract(parsed, contract, validatorOpts);\n\n const hasErrors = result.issues.some((issue) => issue.severity === \"error\");\n const status: ReportStatus = hasErrors ? \"fail\" : \"ok\";\n\n if (!opts.silent) {\n if (opts.json) {\n outputJson(result, opts.input, opts.pretty);\n } else {\n outputHuman(result);\n }\n }\n\n return status;\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type CloudProvider = \"vercel\" | \"cloudflare\" | \"aws\";\n\ntype CloudConnectorLoadOptions = {\n provider: CloudProvider;\n filePath: string;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readEntryValue(entry: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = entry[key];\n if (typeof value === \"string\") return value;\n }\n return undefined;\n}\n\nfunction getVercelEntries(value: unknown): unknown[] {\n if (Array.isArray(value)) return value as unknown[];\n if (isRecord(value) && Array.isArray(value.envs)) return value.envs as unknown[];\n return [];\n}\n\nfunction parseVercelPayload(value: unknown): Record<string, string> {\n const entries = getVercelEntries(value);\n const result: Record<string, string> = {};\n for (const entry of entries) {\n if (!isRecord(entry)) continue;\n const key = readEntryValue(entry, [\"key\", \"name\"]);\n if (key === undefined) continue;\n const envValue = readEntryValue(entry, [\"value\", \"targetValue\", \"content\"]) ?? \"\";\n result[key] = envValue;\n }\n return result;\n}\n\nfunction getCloudflareEntries(value: unknown): unknown[] {\n if (Array.isArray(value)) return value as unknown[];\n if (isRecord(value) && Array.isArray(value.result)) return value.result as unknown[];\n return [];\n}\n\nfunction parseCloudflarePayload(value: unknown): Record<string, string> {\n const entries = getCloudflareEntries(value);\n const result: Record<string, string> = {};\n for (const entry of entries) {\n if (!isRecord(entry)) continue;\n const key = readEntryValue(entry, [\"name\", \"key\"]);\n if (key === undefined) continue;\n const envValue = readEntryValue(entry, [\"text\", \"value\", \"secret\"]) ?? \"\";\n result[key] = envValue;\n }\n return result;\n}\n\nfunction parseAwsPayload(value: unknown): Record<string, string> {\n const entries = isRecord(value) && Array.isArray(value.Parameters) ? value.Parameters : [];\n const result: Record<string, string> = {};\n for (const entry of entries) {\n if (!isRecord(entry)) continue;\n const name = readEntryValue(entry, [\"Name\", \"name\"]);\n if (name === undefined) continue;\n const key = name.split(\"/\").findLast((part) => part.length > 0) ?? name;\n const envValue = readEntryValue(entry, [\"Value\", \"value\"]) ?? \"\";\n result[key] = envValue;\n }\n return result;\n}\n\nfunction parseProviderPayload(provider: CloudProvider, value: unknown): Record<string, string> {\n if (provider === \"vercel\") return parseVercelPayload(value);\n if (provider === \"cloudflare\") return parseCloudflarePayload(value);\n return parseAwsPayload(value);\n}\n\nexport async function loadCloudSource(\n options: CloudConnectorLoadOptions,\n): Promise<Record<string, string>> {\n const resolvedPath = path.resolve(options.filePath);\n const raw = await readFile(resolvedPath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return parseProviderPayload(options.provider, parsed);\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { EnvVarType } from \"./parser/types.js\";\nimport { parseEnvFile } from \"./parser/env-parser.js\";\nimport type { EnvContract as LegacyEnvContract, EnvContractEntry } from \"./schema/schema-model.js\";\nimport type { EnvContract, EnvContractVariable, Expected } from \"./validation/types.js\";\n\ntype LoadValidationContractOptions = {\n fallbackExamplePath: string;\n contractPath?: string;\n cwd?: string;\n};\n\ntype ContractModule = {\n default?: unknown;\n contract?: unknown;\n};\n\nconst SECRET_KEY_RE = /(SECRET|TOKEN|PASSWORD|PRIVATE|API_KEY|ACCESS_KEY|CLIENT_SECRET)/i;\nconst CONTRACT_FILE_NAMES = [\"env.contract.ts\", \"env.contract.mjs\", \"env.contract.js\"] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isExpected(value: unknown): value is Expected {\n if (!isRecord(value)) return false;\n const typeValue = value.type;\n if (typeof typeValue !== \"string\") return false;\n const validTypes = new Set([\n \"string\",\n \"number\",\n \"boolean\",\n \"enum\",\n \"url\",\n \"email\",\n \"json\",\n \"semver\",\n \"unknown\",\n ]);\n if (!validTypes.has(typeValue)) return false;\n if (typeValue === \"enum\") {\n return Array.isArray(value.values) && value.values.every((item) => typeof item === \"string\");\n }\n return true;\n}\n\nfunction isEnvContractVariable(value: unknown): value is EnvContractVariable {\n if (!isRecord(value)) return false;\n if (!isExpected(value.expected)) return false;\n if (typeof value.required !== \"boolean\") return false;\n if (typeof value.clientSide !== \"boolean\") return false;\n if (value.description !== undefined && typeof value.description !== \"string\") return false;\n if (value.secret !== undefined && typeof value.secret !== \"boolean\") return false;\n return true;\n}\n\nfunction isEnvContract(value: unknown): value is EnvContract {\n if (!isRecord(value)) return false;\n if (value.schemaVersion !== 1) return false;\n if (!isRecord(value.variables)) return false;\n return Object.values(value.variables).every((item) => isEnvContractVariable(item));\n}\n\nfunction isLegacyContract(value: unknown): value is LegacyEnvContract {\n if (!isRecord(value)) return false;\n if (!Array.isArray(value.vars)) return false;\n return value.vars.every((entry) => isRecord(entry) && typeof entry.name === \"string\");\n}\n\nfunction mapEnvVarTypeToExpected(type: EnvVarType): Expected {\n if (type === \"number\") return { type: \"number\" };\n if (type === \"boolean\") return { type: \"boolean\" };\n if (type === \"url\") return { type: \"url\" };\n if (type === \"email\") return { type: \"email\" };\n if (type === \"json\") return { type: \"json\" };\n if (type === \"semver\") return { type: \"semver\" };\n if (type === \"unknown\") return { type: \"unknown\" };\n return { type: \"string\" };\n}\n\nfunction shouldTreatAsSecret(key: string): boolean {\n return SECRET_KEY_RE.test(key);\n}\n\nfunction toExpectedFromLegacyEntry(entry: EnvContractEntry): Expected {\n if (entry.enumValues !== undefined && entry.enumValues.length > 0) {\n return { type: \"enum\", values: entry.enumValues };\n }\n if (entry.expectedType === \"number\") {\n return {\n type: \"number\",\n ...(entry.constraints?.min !== undefined && { min: entry.constraints.min }),\n ...(entry.constraints?.max !== undefined && { max: entry.constraints.max }),\n };\n }\n if (entry.expectedType === \"boolean\") return { type: \"boolean\" };\n if (entry.expectedType === \"url\") return { type: \"url\" };\n if (entry.expectedType === \"email\") return { type: \"email\" };\n if (entry.expectedType === \"json\") return { type: \"json\" };\n if (entry.expectedType === \"semver\") return { type: \"semver\" };\n if (entry.expectedType === \"unknown\") return { type: \"unknown\" };\n return { type: \"string\" };\n}\n\nfunction convertLegacyContract(contract: LegacyEnvContract): EnvContract {\n const variables: Record<string, EnvContractVariable> = {};\n for (const entry of contract.vars) {\n const clientSide = entry.runtime === \"client\" || entry.name.startsWith(\"NEXT_PUBLIC_\");\n variables[entry.name] = {\n expected: toExpectedFromLegacyEntry(entry),\n required: entry.required,\n clientSide,\n ...(entry.description !== undefined && { description: entry.description }),\n ...((entry.isSecret ?? shouldTreatAsSecret(entry.name)) && { secret: true }),\n };\n }\n return {\n schemaVersion: 1,\n variables,\n };\n}\n\nfunction buildContractFromExample(examplePath: string): EnvContract {\n const parsed = parseEnvFile(examplePath);\n const variables: Record<string, EnvContractVariable> = {};\n\n for (const variable of parsed.vars) {\n const effectiveType = variable.annotatedType ?? variable.inferredType;\n variables[variable.key] = {\n expected: mapEnvVarTypeToExpected(effectiveType),\n required: variable.isRequired,\n clientSide: variable.isClientSide,\n ...(variable.description !== undefined && { description: variable.description }),\n ...(shouldTreatAsSecret(variable.key) && { secret: true }),\n };\n }\n\n return {\n schemaVersion: 1,\n variables,\n };\n}\n\nfunction findDefaultContractPath(cwd: string): string | undefined {\n for (const fileName of CONTRACT_FILE_NAMES) {\n const candidatePath = path.resolve(cwd, fileName);\n if (existsSync(candidatePath)) return candidatePath;\n }\n return undefined;\n}\n\nexport async function loadValidationContract(\n options: LoadValidationContractOptions,\n): Promise<EnvContract> {\n const { fallbackExamplePath, contractPath, cwd = process.cwd() } = options;\n const discoveredContractPath = findDefaultContractPath(cwd);\n const resolvedContractPath =\n contractPath === undefined ? discoveredContractPath : path.resolve(cwd, contractPath);\n\n if (resolvedContractPath !== undefined && existsSync(resolvedContractPath)) {\n const moduleUrl = pathToFileURL(resolvedContractPath).href;\n const moduleValue = (await import(moduleUrl)) as ContractModule;\n const candidate = moduleValue.default ?? moduleValue.contract;\n if (isEnvContract(candidate)) {\n return candidate;\n }\n if (isLegacyContract(candidate)) {\n return convertLegacyContract(candidate);\n }\n throw new Error(\n `Invalid contract at ${resolvedContractPath}. Export default must match EnvContract.`,\n );\n }\n\n return buildContractFromExample(path.resolve(cwd, fallbackExamplePath));\n}\n","import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { EnvContract, ValidationReport } from \"./validation/types.js\";\n\nexport type EnvTypegenPlugin = {\n name: string;\n transformContract?: (contract: EnvContract) => EnvContract;\n transformSource?: (input: {\n environment: string;\n values: Record<string, string>;\n }) => Record<string, string>;\n transformReport?: (report: ValidationReport) => ValidationReport;\n};\n\nexport type PluginReference = string | EnvTypegenPlugin;\n\ntype LoadPluginsOptions = {\n pluginPaths: string[];\n configPlugins?: PluginReference[];\n cwd?: string;\n};\n\ntype PluginModule = {\n default?: unknown;\n plugin?: unknown;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPlugin(value: unknown): value is EnvTypegenPlugin {\n if (!isRecord(value)) return false;\n if (typeof value.name !== \"string\") return false;\n if (value.transformContract !== undefined && typeof value.transformContract !== \"function\") {\n return false;\n }\n if (value.transformSource !== undefined && typeof value.transformSource !== \"function\") {\n return false;\n }\n if (value.transformReport !== undefined && typeof value.transformReport !== \"function\") {\n return false;\n }\n return true;\n}\n\nasync function loadPluginFromPath(pluginPath: string, cwd: string): Promise<EnvTypegenPlugin> {\n const resolvedPath = path.resolve(cwd, pluginPath);\n const moduleValue = (await import(pathToFileURL(resolvedPath).href)) as PluginModule;\n const candidate = moduleValue.default ?? moduleValue.plugin;\n if (isPlugin(candidate)) return candidate;\n throw new Error(\n `Invalid plugin at ${resolvedPath}.\\n` +\n `Expected a default export matching:\\n` +\n ` { name: string,\\n` +\n ` transformSource?(ctx: { environment: string; values: Record<string, string> }): Record<string, string>,\\n` +\n ` transformReport?(report: ValidationReport): ValidationReport,\\n` +\n ` transformContract?(contract: EnvContract): EnvContract }`,\n );\n}\n\nexport async function loadPlugins(options: LoadPluginsOptions): Promise<EnvTypegenPlugin[]> {\n const cwd = options.cwd ?? process.cwd();\n const plugins: EnvTypegenPlugin[] = [];\n\n const references: PluginReference[] = [...(options.configPlugins ?? []), ...options.pluginPaths];\n\n for (const reference of references) {\n if (typeof reference === \"string\") {\n plugins.push(await loadPluginFromPath(reference, cwd));\n continue;\n }\n if (isPlugin(reference)) {\n plugins.push(reference);\n continue;\n }\n throw new Error(\"Invalid plugin reference in configuration.\");\n }\n\n return plugins;\n}\n\nexport function applyContractPlugins(\n contract: EnvContract,\n plugins: readonly EnvTypegenPlugin[],\n): EnvContract {\n let next = contract;\n for (const plugin of plugins) {\n if (plugin.transformContract === undefined) continue;\n next = plugin.transformContract(next);\n }\n return next;\n}\n\nexport function applySourcePlugins(\n params: { environment: string; values: Record<string, string> },\n plugins: readonly EnvTypegenPlugin[],\n): Record<string, string> {\n let next = params.values;\n for (const plugin of plugins) {\n if (plugin.transformSource === undefined) continue;\n next = plugin.transformSource({ environment: params.environment, values: next });\n }\n return next;\n}\n\nexport function applyReportPlugins(\n report: ValidationReport,\n plugins: readonly EnvTypegenPlugin[],\n): ValidationReport {\n let next = report;\n for (const plugin of plugins) {\n if (plugin.transformReport === undefined) continue;\n next = plugin.transformReport(next);\n }\n return next;\n}\n","import type {\n EnvContract,\n EnvContractVariable,\n Expected,\n IssueCode,\n IssueSeverity,\n IssueType,\n ValidationIssue,\n ValidationReport,\n} from \"./types.js\";\n\ntype ValidateValueResult =\n | { isValid: true; receivedType: string }\n | { isValid: false; receivedType: string; issueType: \"invalid_type\" | \"invalid_value\" };\n\ntype ValidateAgainstContractOptions = {\n contract: EnvContract;\n values: Record<string, string>;\n environment: string;\n strict: boolean;\n debugValues: boolean;\n};\n\ntype DiffEnvironmentSourcesOptions = {\n contract: EnvContract;\n sources: Record<string, Record<string, string>>;\n strict: boolean;\n debugValues: boolean;\n};\n\ntype BuildDoctorReportOptions = {\n checkReport: ValidationReport;\n diffReport: ValidationReport;\n};\n\n// Dots are excluded from each domain-segment class so that the literal \\.\n// separators are unambiguous, eliminating super-linear backtracking.\nconst EMAIL_RE = /^[^@\\s]+@[^@\\s.]+(?:\\.[^@\\s.]+)+$/;\n// Dots are excluded from inside [\\w.-] groups: only the literal \\. separator\n// carries dot semantics, so there is no backtracking ambiguity (ReDoS-safe).\nconst SEMVER_RE = /^\\d+\\.\\d+\\.\\d+(?:-[\\w.-]+)?(?:\\+[\\w.-]+)?$/;\n\nfunction detectReceivedType(value: string): string {\n const normalized = value.trim();\n if (normalized.length === 0) return \"unknown\";\n if ([\"true\", \"false\", \"1\", \"0\", \"yes\", \"no\"].includes(normalized.toLowerCase())) return \"boolean\";\n if (!Number.isNaN(Number(normalized)) && Number.isFinite(Number(normalized))) return \"number\";\n if (SEMVER_RE.test(normalized)) return \"semver\";\n try {\n const url = new URL(normalized);\n if (url.protocol.length > 0) return \"url\";\n } catch {\n // noop\n }\n if (EMAIL_RE.test(normalized)) return \"email\";\n try {\n const parsed: unknown = JSON.parse(normalized);\n if (typeof parsed === \"object\" && parsed !== null) return \"json\";\n } catch {\n // noop\n }\n return \"string\";\n}\n\nfunction validateNumber(\n expected: Extract<Expected, { type: \"number\" }>,\n normalized: string,\n receivedType: string,\n): ValidateValueResult {\n const parsed = Number(normalized);\n if (Number.isNaN(parsed) || !Number.isFinite(parsed)) {\n return { isValid: false, receivedType, issueType: \"invalid_type\" };\n }\n if (expected.min !== undefined && parsed < expected.min) {\n return { isValid: false, receivedType, issueType: \"invalid_value\" };\n }\n if (expected.max !== undefined && parsed > expected.max) {\n return { isValid: false, receivedType, issueType: \"invalid_value\" };\n }\n return { isValid: true, receivedType };\n}\n\nfunction validateBoolean(normalized: string, receivedType: string): ValidateValueResult {\n if (![\"true\", \"false\", \"1\", \"0\", \"yes\", \"no\"].includes(normalized.toLowerCase())) {\n return { isValid: false, receivedType, issueType: \"invalid_type\" };\n }\n return { isValid: true, receivedType };\n}\n\nfunction validateEnum(\n expected: Extract<Expected, { type: \"enum\" }>,\n normalized: string,\n receivedType: string,\n): ValidateValueResult {\n if (!expected.values.includes(normalized)) {\n return { isValid: false, receivedType, issueType: \"invalid_value\" };\n }\n return { isValid: true, receivedType };\n}\n\nfunction validateUrl(normalized: string, receivedType: string): ValidateValueResult {\n try {\n const value = new URL(normalized);\n if (value.protocol.length === 0)\n return { isValid: false, receivedType, issueType: \"invalid_type\" };\n return { isValid: true, receivedType };\n } catch {\n return { isValid: false, receivedType, issueType: \"invalid_type\" };\n }\n}\n\nfunction validateEmail(normalized: string, receivedType: string): ValidateValueResult {\n if (!EMAIL_RE.test(normalized))\n return { isValid: false, receivedType, issueType: \"invalid_type\" };\n return { isValid: true, receivedType };\n}\n\nfunction validateJson(normalized: string, receivedType: string): ValidateValueResult {\n try {\n const parsed: unknown = JSON.parse(normalized);\n if (typeof parsed === \"object\" && parsed !== null) return { isValid: true, receivedType };\n return { isValid: false, receivedType, issueType: \"invalid_type\" };\n } catch {\n return { isValid: false, receivedType, issueType: \"invalid_type\" };\n }\n}\n\nfunction validateSemver(normalized: string, receivedType: string): ValidateValueResult {\n if (!SEMVER_RE.test(normalized))\n return { isValid: false, receivedType, issueType: \"invalid_value\" };\n return { isValid: true, receivedType };\n}\n\nfunction validateValueAgainstExpected(expected: Expected, rawValue: string): ValidateValueResult {\n const normalized = rawValue.trim();\n const receivedType = detectReceivedType(normalized);\n\n if (expected.type === \"unknown\" || expected.type === \"string\")\n return { isValid: true, receivedType };\n if (expected.type === \"number\") return validateNumber(expected, normalized, receivedType);\n if (expected.type === \"boolean\") return validateBoolean(normalized, receivedType);\n if (expected.type === \"enum\") return validateEnum(expected, normalized, receivedType);\n if (expected.type === \"url\") return validateUrl(normalized, receivedType);\n if (expected.type === \"email\") return validateEmail(normalized, receivedType);\n if (expected.type === \"json\") return validateJson(normalized, receivedType);\n if (expected.type === \"semver\") return validateSemver(normalized, receivedType);\n return { isValid: true, receivedType };\n}\n\nfunction toIssueCode(issueType: IssueType): IssueCode {\n if (issueType === \"missing\") return \"ENV_MISSING\";\n if (issueType === \"extra\") return \"ENV_EXTRA\";\n if (issueType === \"invalid_type\") return \"ENV_INVALID_TYPE\";\n if (issueType === \"invalid_value\") return \"ENV_INVALID_VALUE\";\n if (issueType === \"conflict\") return \"ENV_CONFLICT\";\n return \"ENV_SECRET_EXPOSED\";\n}\n\nfunction toIssueValue(value: string | undefined, debugValues: boolean): string | null {\n if (!debugValues) return null;\n if (value === undefined) return null;\n return value;\n}\n\nfunction createIssue(params: {\n type: IssueType;\n severity: IssueSeverity;\n key: string;\n environment: string;\n message: string;\n value?: string;\n debugValues: boolean;\n expected?: Expected;\n receivedType?: string;\n}): ValidationIssue {\n return {\n code: toIssueCode(params.type),\n type: params.type,\n severity: params.severity,\n key: params.key,\n environment: params.environment,\n message: params.message,\n value: toIssueValue(params.value, params.debugValues),\n ...(params.expected !== undefined && { expected: params.expected }),\n ...(params.receivedType !== undefined && { receivedType: params.receivedType }),\n };\n}\n\nfunction dedupeIssues(issues: ValidationIssue[]): ValidationIssue[] {\n const seen = new Set<string>();\n const unique: ValidationIssue[] = [];\n\n for (const issue of issues) {\n const token = [\n issue.code,\n issue.type,\n issue.severity,\n issue.environment,\n issue.key,\n issue.message,\n issue.receivedType ?? \"\",\n ].join(\"|\");\n if (seen.has(token)) continue;\n seen.add(token);\n unique.push(issue);\n }\n\n return unique;\n}\n\nfunction buildReport(\n env: string,\n issues: ValidationIssue[],\n recommendations?: string[],\n): ValidationReport {\n const dedupedIssues = dedupeIssues(issues);\n const errors = dedupedIssues.filter((item) => item.severity === \"error\").length;\n const warnings = dedupedIssues.filter((item) => item.severity === \"warning\").length;\n const status = errors > 0 ? \"fail\" : \"ok\";\n\n return {\n schemaVersion: 1,\n status,\n summary: {\n errors,\n warnings,\n total: dedupedIssues.length,\n },\n issues: dedupedIssues,\n meta: {\n env,\n timestamp: new Date().toISOString(),\n },\n ...(recommendations !== undefined && recommendations.length > 0 && { recommendations }),\n };\n}\n\nfunction isClientSecret(variable: EnvContractVariable, key: string): boolean {\n return variable.secret === true && (variable.clientSide || key.startsWith(\"NEXT_PUBLIC_\"));\n}\n\ntype ContractCheckContext = {\n options: ValidateAgainstContractOptions;\n issues: ValidationIssue[];\n};\n\nfunction checkContractVariable(\n key: string,\n variable: EnvContractVariable,\n context: ContractCheckContext,\n): void {\n const { options, issues } = context;\n const value = options.values[key];\n const hasValue = value !== undefined && value.trim().length > 0;\n\n if (variable.required && !hasValue) {\n issues.push(\n createIssue({\n type: \"missing\",\n severity: \"error\",\n key,\n environment: options.environment,\n message: `Required variable ${key} is missing.`,\n debugValues: options.debugValues,\n expected: variable.expected,\n }),\n );\n return;\n }\n\n if (!hasValue) return;\n\n const validation = validateValueAgainstExpected(variable.expected, value);\n if (!validation.isValid) {\n const message =\n validation.issueType === \"invalid_type\"\n ? `Variable ${key} has invalid type.`\n : `Variable ${key} has invalid value.`;\n issues.push(\n createIssue({\n type: validation.issueType,\n severity: \"error\",\n key,\n environment: options.environment,\n message,\n value,\n debugValues: options.debugValues,\n expected: variable.expected,\n receivedType: validation.receivedType,\n }),\n );\n }\n\n if (isClientSecret(variable, key)) {\n issues.push(\n createIssue({\n type: \"secret_exposed\",\n severity: \"error\",\n key,\n environment: options.environment,\n message: `Secret variable ${key} is marked as client-side.`,\n value,\n debugValues: options.debugValues,\n expected: variable.expected,\n }),\n );\n }\n}\n\nexport function validateAgainstContract(options: ValidateAgainstContractOptions): ValidationReport {\n const issues: ValidationIssue[] = [];\n const contractKeys = new Set(Object.keys(options.contract.variables));\n\n for (const [key, variable] of Object.entries(options.contract.variables)) {\n checkContractVariable(key, variable, { options, issues });\n }\n\n for (const [key, value] of Object.entries(options.values)) {\n if (contractKeys.has(key)) continue;\n const severity: IssueSeverity = options.strict ? \"error\" : \"warning\";\n issues.push(\n createIssue({\n type: \"extra\",\n severity,\n key,\n environment: options.environment,\n message: `Variable ${key} is not defined in the contract.`,\n value,\n debugValues: options.debugValues,\n }),\n );\n }\n\n return buildReport(options.environment, issues);\n}\n\nfunction collectUnionKeys(\n contract: EnvContract,\n sources: Record<string, Record<string, string>>,\n): Set<string> {\n const union = new Set<string>(Object.keys(contract.variables));\n for (const source of Object.values(sources)) {\n for (const key of Object.keys(source)) {\n union.add(key);\n }\n }\n return union;\n}\n\ntype SourceEntry = { sourceName: string; value: string | undefined };\n\ntype DiffKeyContext = {\n variable: EnvContractVariable | undefined;\n options: DiffEnvironmentSourcesOptions;\n issues: ValidationIssue[];\n};\n\nfunction diffMissingEntries(key: string, missing: SourceEntry[], context: DiffKeyContext): void {\n const { variable, options, issues } = context;\n for (const entry of missing) {\n issues.push(\n createIssue({\n type: \"missing\",\n severity: \"error\",\n key,\n environment: entry.sourceName,\n message: `Variable ${key} is missing in ${entry.sourceName}.`,\n debugValues: options.debugValues,\n ...(variable !== undefined && { expected: variable.expected }),\n }),\n );\n }\n}\n\nfunction diffTypeConflicts(key: string, present: SourceEntry[], context: DiffKeyContext): void {\n const { variable, options, issues } = context;\n const typeBySource = new Map<string, string>();\n for (const entry of present) {\n typeBySource.set(entry.sourceName, detectReceivedType(entry.value ?? \"\"));\n }\n if (new Set(typeBySource.values()).size <= 1) return;\n for (const [sourceName, detectedType] of typeBySource.entries()) {\n issues.push(\n createIssue({\n type: \"conflict\",\n severity: \"error\",\n key,\n environment: sourceName,\n message: `Variable ${key} has conflicting inferred type across environments.`,\n debugValues: options.debugValues,\n receivedType: detectedType,\n ...(options.sources[sourceName]?.[key] !== undefined && {\n value: options.sources[sourceName]?.[key],\n }),\n ...(variable !== undefined && { expected: variable.expected }),\n }),\n );\n }\n}\n\nfunction diffPresentEntry(key: string, entry: SourceEntry, context: DiffKeyContext): void {\n const { variable, options, issues } = context;\n if (entry.value === undefined) return;\n\n if (variable === undefined) {\n const severity: IssueSeverity = options.strict ? \"error\" : \"warning\";\n issues.push(\n createIssue({\n type: \"extra\",\n severity,\n key,\n environment: entry.sourceName,\n message: `Variable ${key} is not defined in the contract.`,\n value: entry.value,\n debugValues: options.debugValues,\n }),\n );\n return;\n }\n\n const validation = validateValueAgainstExpected(variable.expected, entry.value);\n if (!validation.isValid) {\n const message =\n validation.issueType === \"invalid_type\"\n ? `Variable ${key} has invalid type in ${entry.sourceName}.`\n : `Variable ${key} has invalid value in ${entry.sourceName}.`;\n issues.push(\n createIssue({\n type: validation.issueType,\n severity: \"error\",\n key,\n environment: entry.sourceName,\n message,\n value: entry.value,\n debugValues: options.debugValues,\n expected: variable.expected,\n receivedType: validation.receivedType,\n }),\n );\n }\n\n if (isClientSecret(variable, key)) {\n issues.push(\n createIssue({\n type: \"secret_exposed\",\n severity: \"error\",\n key,\n environment: entry.sourceName,\n message: `Secret variable ${key} is marked as client-side.`,\n value: entry.value,\n debugValues: options.debugValues,\n expected: variable.expected,\n }),\n );\n }\n}\n\nexport function diffEnvironmentSources(options: DiffEnvironmentSourcesOptions): ValidationReport {\n const issues: ValidationIssue[] = [];\n const sourceNames = Object.keys(options.sources);\n const unionKeys = collectUnionKeys(options.contract, options.sources);\n\n for (const key of unionKeys) {\n const variable = options.contract.variables[key];\n const valuesBySource: SourceEntry[] = sourceNames.map((sourceName) => ({\n sourceName,\n value: options.sources[sourceName]?.[key],\n }));\n const present = valuesBySource.filter(\n (entry) => entry.value !== undefined && entry.value !== \"\",\n );\n const missing = valuesBySource.filter(\n (entry) => entry.value === undefined || entry.value === \"\",\n );\n\n if (present.length === 0 && variable?.required === true) {\n for (const entry of missing) {\n issues.push(\n createIssue({\n type: \"missing\",\n severity: \"error\",\n key,\n environment: entry.sourceName,\n message: `Required variable ${key} is missing in ${entry.sourceName}.`,\n debugValues: options.debugValues,\n expected: variable.expected,\n }),\n );\n }\n continue;\n }\n\n const ctx: DiffKeyContext = { variable, options, issues };\n if (present.length > 0) {\n diffMissingEntries(key, missing, ctx);\n }\n diffTypeConflicts(key, present, ctx);\n for (const entry of present) {\n diffPresentEntry(key, entry, ctx);\n }\n }\n\n return buildReport(\"diff\", issues);\n}\n\nfunction buildRecommendations(issues: ValidationIssue[]): string[] {\n const codes = new Set<IssueCode>(issues.map((item) => item.code));\n const recommendations: string[] = [];\n\n if (codes.has(\"ENV_MISSING\")) {\n recommendations.push(\"Add missing required variables to each target environment.\");\n }\n if (codes.has(\"ENV_EXTRA\")) {\n recommendations.push(\n \"Remove undeclared variables or add them to env.contract.ts intentionally.\",\n );\n }\n if (codes.has(\"ENV_INVALID_TYPE\") || codes.has(\"ENV_INVALID_VALUE\")) {\n recommendations.push(\n \"Normalize variable values so they match the expected contract types and constraints.\",\n );\n }\n if (codes.has(\"ENV_CONFLICT\")) {\n recommendations.push(\"Align variable semantics across environments to avoid drift.\");\n }\n if (codes.has(\"ENV_SECRET_EXPOSED\")) {\n recommendations.push(\n \"Move secret variables to server-only scope and avoid NEXT_PUBLIC_ exposure for secrets.\",\n );\n }\n\n return recommendations;\n}\n\nexport function buildDoctorReport(options: BuildDoctorReportOptions): ValidationReport {\n const merged = [...options.checkReport.issues, ...options.diffReport.issues];\n const recommendations = buildRecommendations(merged);\n return buildReport(\"doctor\", merged, recommendations);\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\ntype LoadEnvSourceOptions = {\n filePath: string;\n allowMissing?: boolean;\n};\n\nfunction stripWrappingQuotes(value: string): string {\n if (value.length < 2) return value;\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction parseEnvSourceContent(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith(\"#\")) continue;\n const match = /^(?:export\\s+)?([A-Za-z_]\\w*)=(.*)$/.exec(trimmed);\n if (match === null) continue;\n const key = match[1] ?? \"\";\n const rawValue = match[2] ?? \"\";\n result[key] = stripWrappingQuotes(rawValue.trim());\n }\n\n return result;\n}\n\nexport async function loadEnvSource(\n options: LoadEnvSourceOptions,\n): Promise<Record<string, string>> {\n const resolvedPath = path.resolve(options.filePath);\n try {\n const content = await readFile(resolvedPath, \"utf8\");\n return parseEnvSourceContent(content);\n } catch (error_) {\n if (\n options.allowMissing === true &&\n error_ instanceof Error &&\n \"code\" in error_ &&\n error_.code === \"ENOENT\"\n ) {\n return {};\n }\n throw error_;\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { ValidationIssue, ValidationReport } from \"./types.js\";\n\ntype JsonOutputMode = \"off\" | \"compact\" | \"pretty\";\n\ntype EmitValidationReportOptions = {\n report: ValidationReport;\n jsonMode: JsonOutputMode;\n outputFile?: string;\n};\n\nfunction toJsonString(report: ValidationReport, mode: JsonOutputMode): string {\n if (mode === \"pretty\") return `${JSON.stringify(report, null, 2)}\\n`;\n return `${JSON.stringify(report)}\\n`;\n}\n\nfunction formatIssue(issue: ValidationIssue): string {\n const expected = issue.expected === undefined ? \"\" : ` expected=${issue.expected.type}`;\n const received = issue.receivedType === undefined ? \"\" : ` received=${issue.receivedType}`;\n return `${issue.severity.toUpperCase()} [${issue.code}] ${issue.environment}:${issue.key} ${issue.message}${expected}${received}`;\n}\n\nfunction formatHumanReport(report: ValidationReport): string {\n const lines: string[] = [];\n lines.push(\n `Status: ${report.status.toUpperCase()} (errors=${report.summary.errors}, warnings=${report.summary.warnings}, total=${report.summary.total})`,\n );\n if (report.issues.length > 0) {\n lines.push(\"\", \"Issues:\");\n for (const issue of report.issues) {\n lines.push(`- ${formatIssue(issue)}`);\n }\n }\n if (report.recommendations !== undefined && report.recommendations.length > 0) {\n lines.push(\"\", \"Recommendations:\");\n for (const recommendation of report.recommendations) {\n lines.push(`- ${recommendation}`);\n }\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nasync function persistJsonOutput(outputFile: string, report: ValidationReport): Promise<void> {\n const resolvedPath = path.resolve(outputFile);\n await mkdir(path.dirname(resolvedPath), { recursive: true });\n await writeFile(resolvedPath, `${JSON.stringify(report, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function emitValidationReport(options: EmitValidationReportOptions): Promise<void> {\n const { report, outputFile, jsonMode } = options;\n\n if (outputFile !== undefined) {\n await persistJsonOutput(outputFile, report);\n }\n\n if (jsonMode === \"off\") {\n process.stdout.write(formatHumanReport(report));\n return;\n }\n\n process.stdout.write(toJsonString(report, jsonMode));\n}\n","import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { parseArgs } from \"node:util\";\n\nimport { loadCloudSource, type CloudProvider } from \"./cloud/connectors.js\";\nimport { loadConfig, type EnvTypegenConfig } from \"./config.js\";\nimport { loadValidationContract } from \"./contract.js\";\nimport {\n applyContractPlugins,\n applyReportPlugins,\n applySourcePlugins,\n loadPlugins,\n type PluginReference,\n} from \"./plugins.js\";\nimport {\n buildDoctorReport,\n diffEnvironmentSources,\n validateAgainstContract,\n} from \"./validation/engine.js\";\nimport { loadEnvSource } from \"./validation/env-source.js\";\nimport { emitValidationReport } from \"./validation/output.js\";\nimport type { ValidationReport } from \"./validation/types.js\";\n\ntype ValidationCommand = \"check\" | \"diff\" | \"doctor\";\ntype JsonMode = \"off\" | \"compact\" | \"pretty\";\n\ntype ValidationArgValues = {\n env?: string[];\n targets?: string;\n contract?: string;\n example?: string;\n strict?: boolean;\n \"no-strict\"?: boolean;\n json?: boolean;\n \"output-file\"?: string;\n \"debug-values\"?: boolean;\n \"cloud-provider\"?: string;\n \"cloud-file\"?: string;\n plugin?: string[];\n config?: string;\n help?: boolean;\n};\n\ntype ParsedValidationArgs = {\n values: ValidationArgValues;\n jsonMode: JsonMode;\n};\n\ntype LoadCommandConfigModule = {\n default?: EnvTypegenConfig;\n};\n\nconst HELP_TEXT: Record<ValidationCommand, string> = {\n check: [\n \"Usage: env-typegen check [options]\",\n \"\",\n \"Options:\",\n \" --env <path> Environment file to validate (default: .env)\",\n \" --contract <path> Contract file path (default: env.contract.ts)\",\n \" --example <path> Fallback .env.example used to bootstrap contract\",\n \" --strict Validate extras as errors (default: true)\",\n \" --no-strict Downgrade extras to warnings\",\n \" --json Emit machine-readable JSON report\",\n \" --json=pretty Emit pretty JSON report\",\n \" --output-file <path> Persist JSON report to a file\",\n \" --debug-values Include raw values in issues (unsafe for CI logs)\",\n \" --cloud-provider <name> vercel | cloudflare | aws\",\n \" --cloud-file <path> Cloud snapshot JSON file\",\n \" --plugin <path> Plugin module path (repeatable)\",\n \" -c, --config <path> Config file path\",\n \" -h, --help Show this help\",\n \"\",\n \"Exit codes:\",\n \" 0 All checks passed (status: ok or warn)\",\n \" 1 One or more checks failed (status: fail) or invalid usage\",\n ].join(\"\\n\"),\n diff: [\n \"Usage: env-typegen diff [options]\",\n \"\",\n \"Options:\",\n \" --targets <list> Comma-separated targets (default: .env,.env.example,.env.production)\",\n \" --contract <path> Contract file path (default: env.contract.ts)\",\n \" --example <path> Fallback .env.example used to bootstrap contract\",\n \" --strict Validate extras as errors (default: true)\",\n \" --no-strict Downgrade extras to warnings\",\n \" --json Emit machine-readable JSON report\",\n \" --json=pretty Emit pretty JSON report\",\n \" --output-file <path> Persist JSON report to a file\",\n \" --debug-values Include raw values in issues (unsafe for CI logs)\",\n \" --cloud-provider <name> vercel | cloudflare | aws\",\n \" --cloud-file <path> Cloud snapshot JSON file added to diff sources\",\n \" --plugin <path> Plugin module path (repeatable)\",\n \" -c, --config <path> Config file path\",\n \" -h, --help Show this help\",\n \"\",\n \"Exit codes:\",\n \" 0 All checks passed (status: ok or warn)\",\n \" 1 One or more checks failed (status: fail) or invalid usage\",\n ].join(\"\\n\"),\n doctor: [\n \"Usage: env-typegen doctor [options]\",\n \"\",\n \"Options:\",\n \" --env <path> Environment file to validate (default: .env)\",\n \" --targets <list> Comma-separated targets for drift analysis\",\n \" --contract <path> Contract file path (default: env.contract.ts)\",\n \" --example <path> Fallback .env.example used to bootstrap contract\",\n \" --strict Validate extras as errors (default: true)\",\n \" --no-strict Downgrade extras to warnings\",\n \" --json Emit machine-readable JSON report\",\n \" --json=pretty Emit pretty JSON report\",\n \" --output-file <path> Persist JSON report to a file\",\n \" --debug-values Include raw values in issues (unsafe for CI logs)\",\n \" --cloud-provider <name> vercel | cloudflare | aws\",\n \" --cloud-file <path> Cloud snapshot JSON file\",\n \" --plugin <path> Plugin module path (repeatable)\",\n \" -c, --config <path> Config file path\",\n \" -h, --help Show this help\",\n \"\",\n \"Exit codes:\",\n \" 0 All checks passed (status: ok or warn)\",\n \" 1 One or more checks failed (status: fail) or invalid usage\",\n ].join(\"\\n\"),\n};\n\nfunction resolveConfigRelative(value: string | undefined, configDir: string): string | undefined {\n if (value === undefined || path.isAbsolute(value)) return value;\n return path.resolve(configDir, value);\n}\n\nfunction resolvePluginReference(reference: PluginReference, configDir: string): PluginReference {\n if (typeof reference === \"string\" && !path.isAbsolute(reference)) {\n return path.resolve(configDir, reference);\n }\n return reference;\n}\n\nfunction applyConfigPaths(config: EnvTypegenConfig, configDir: string): EnvTypegenConfig {\n let input: string | string[] | undefined;\n if (Array.isArray(config.input)) {\n input = config.input.map((item) => resolveConfigRelative(item, configDir) ?? item);\n } else {\n input = resolveConfigRelative(config.input, configDir);\n }\n const output = resolveConfigRelative(config.output, configDir);\n const schemaFile = resolveConfigRelative(config.schemaFile, configDir);\n\n return {\n ...config,\n ...(input !== undefined && { input }),\n ...(output !== undefined && { output }),\n ...(schemaFile !== undefined && { schemaFile }),\n ...(config.diffTargets !== undefined && {\n diffTargets: config.diffTargets.map(\n (target) => resolveConfigRelative(target, configDir) ?? target,\n ),\n }),\n ...(config.plugins !== undefined && {\n plugins: config.plugins.map((reference) => resolvePluginReference(reference, configDir)),\n }),\n };\n}\n\nasync function loadCommandConfig(\n configPath: string | undefined,\n): Promise<EnvTypegenConfig | undefined> {\n if (configPath === undefined) {\n return loadConfig(process.cwd());\n }\n\n const resolvedPath = path.resolve(configPath);\n const configDir = path.dirname(resolvedPath);\n const moduleValue = (await import(pathToFileURL(resolvedPath).href)) as LoadCommandConfigModule;\n if (moduleValue.default === undefined) return undefined;\n return applyConfigPaths(moduleValue.default, configDir);\n}\n\nfunction preprocessJsonArguments(argv: string[]): {\n normalizedArgs: string[];\n assignedMode: JsonMode;\n} {\n const normalizedArgs: string[] = [];\n let assignedMode: JsonMode = \"off\";\n\n for (const item of argv) {\n if (item === \"--json=pretty\") {\n normalizedArgs.push(\"--json\");\n assignedMode = \"pretty\";\n continue;\n }\n if (item === \"--json=compact\") {\n normalizedArgs.push(\"--json\");\n assignedMode = \"compact\";\n continue;\n }\n normalizedArgs.push(item);\n }\n\n return { normalizedArgs, assignedMode };\n}\n\nfunction parseValidationArgs(argv: string[]): ParsedValidationArgs {\n const { normalizedArgs, assignedMode } = preprocessJsonArguments(argv);\n const { values } = parseArgs({\n args: normalizedArgs,\n options: {\n env: { type: \"string\", multiple: true },\n targets: { type: \"string\" },\n contract: { type: \"string\" },\n example: { type: \"string\" },\n strict: { type: \"boolean\" },\n \"no-strict\": { type: \"boolean\" },\n json: { type: \"boolean\" },\n \"output-file\": { type: \"string\" },\n \"debug-values\": { type: \"boolean\" },\n \"cloud-provider\": { type: \"string\" },\n \"cloud-file\": { type: \"string\" },\n plugin: { type: \"string\", multiple: true },\n config: { type: \"string\", short: \"c\" },\n help: { type: \"boolean\", short: \"h\" },\n } as const,\n });\n\n const castValues = values as ValidationArgValues;\n let jsonMode: JsonMode = \"off\";\n if (castValues.json === true) {\n jsonMode = assignedMode === \"off\" ? \"compact\" : assignedMode;\n }\n\n return { values: castValues, jsonMode };\n}\n\nfunction resolveStrict(\n values: ValidationArgValues,\n fileConfig: EnvTypegenConfig | undefined,\n): boolean {\n if (values[\"no-strict\"] === true) return false;\n if (values.strict !== undefined) return values.strict;\n if (fileConfig?.strict !== undefined) return fileConfig.strict;\n return true;\n}\n\nfunction parseCloudProvider(value: string | undefined): CloudProvider | undefined {\n if (value === undefined) return undefined;\n if (value === \"vercel\" || value === \"cloudflare\" || value === \"aws\") return value;\n throw new Error(`Unknown cloud provider: ${value}. Valid: vercel, cloudflare, aws`);\n}\n\nfunction parseTargets(\n values: ValidationArgValues,\n fileConfig: EnvTypegenConfig | undefined,\n): string[] {\n const fromCli = values.targets;\n if (fromCli !== undefined) {\n return fromCli\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n }\n\n if (fileConfig?.diffTargets !== undefined && fileConfig.diffTargets.length > 0) {\n return fileConfig.diffTargets;\n }\n\n return [\".env\", \".env.example\", \".env.production\"];\n}\n\nasync function prepareCommonContext(values: ValidationArgValues): Promise<{\n fileConfig: EnvTypegenConfig | undefined;\n strict: boolean;\n debugValues: boolean;\n outputFile: string | undefined;\n contractPath: string | undefined;\n fallbackExamplePath: string;\n cloudProvider: CloudProvider | undefined;\n cloudFile: string | undefined;\n plugins: Awaited<ReturnType<typeof loadPlugins>>;\n}> {\n const fileConfig = await loadCommandConfig(values.config);\n const strict = resolveStrict(values, fileConfig);\n const debugValues = values[\"debug-values\"] ?? false;\n const contractPath = values.contract ?? fileConfig?.schemaFile;\n const fallbackExamplePath = values.example ?? \".env.example\";\n const cloudProvider = parseCloudProvider(values[\"cloud-provider\"]);\n const cloudFile = values[\"cloud-file\"];\n const pluginLoadOptions = {\n pluginPaths: values.plugin ?? [],\n cwd: process.cwd(),\n ...(fileConfig?.plugins !== undefined && { configPlugins: fileConfig.plugins }),\n };\n const plugins = await loadPlugins(pluginLoadOptions);\n\n return {\n fileConfig,\n strict,\n debugValues,\n outputFile: values[\"output-file\"],\n contractPath,\n fallbackExamplePath,\n cloudProvider,\n cloudFile,\n plugins,\n };\n}\n\nasync function emitAndReturnExitCode(\n report: ValidationReport,\n params: {\n jsonMode: JsonMode;\n outputFile?: string;\n },\n): Promise<number> {\n const emitOptions = {\n report,\n jsonMode: params.jsonMode,\n ...(params.outputFile !== undefined && { outputFile: params.outputFile }),\n };\n await emitValidationReport(emitOptions);\n return report.status === \"fail\" ? 1 : 0;\n}\n\nasync function runCheckCommand(args: ParsedValidationArgs): Promise<number> {\n const context = await prepareCommonContext(args.values);\n const loadContractOptions = {\n fallbackExamplePath: context.fallbackExamplePath,\n cwd: process.cwd(),\n ...(context.contractPath !== undefined && { contractPath: context.contractPath }),\n };\n const contract = applyContractPlugins(\n await loadValidationContract(loadContractOptions),\n context.plugins,\n );\n\n const provider = context.cloudProvider;\n let environment = args.values.env?.[0] ?? \".env\";\n let sourceValues: Record<string, string>;\n\n if (provider === undefined) {\n sourceValues = await loadEnvSource({ filePath: environment, allowMissing: true });\n } else {\n const cloudFile = context.cloudFile ?? `${provider}.env.json`;\n sourceValues = await loadCloudSource({ provider, filePath: cloudFile });\n environment = `cloud:${provider}`;\n }\n\n sourceValues = applySourcePlugins({ environment, values: sourceValues }, context.plugins);\n\n const report = applyReportPlugins(\n validateAgainstContract({\n contract,\n values: sourceValues,\n environment,\n strict: context.strict,\n debugValues: context.debugValues,\n }),\n context.plugins,\n );\n\n return emitAndReturnExitCode(report, {\n jsonMode: args.jsonMode,\n ...(context.outputFile !== undefined && { outputFile: context.outputFile }),\n });\n}\n\nasync function runDiffCommand(args: ParsedValidationArgs): Promise<number> {\n const context = await prepareCommonContext(args.values);\n const loadContractOptions = {\n fallbackExamplePath: context.fallbackExamplePath,\n cwd: process.cwd(),\n ...(context.contractPath !== undefined && { contractPath: context.contractPath }),\n };\n const contract = applyContractPlugins(\n await loadValidationContract(loadContractOptions),\n context.plugins,\n );\n\n const sources: Record<string, Record<string, string>> = {};\n for (const target of parseTargets(args.values, context.fileConfig)) {\n const values = await loadEnvSource({ filePath: target, allowMissing: true });\n sources[target] = applySourcePlugins({ environment: target, values }, context.plugins);\n }\n\n if (context.cloudProvider !== undefined) {\n const cloudFile = context.cloudFile ?? `${context.cloudProvider}.env.json`;\n const cloudEnvironment = `cloud:${context.cloudProvider}`;\n const cloudValues = await loadCloudSource({\n provider: context.cloudProvider,\n filePath: cloudFile,\n });\n sources[cloudEnvironment] = applySourcePlugins(\n { environment: cloudEnvironment, values: cloudValues },\n context.plugins,\n );\n }\n\n const report = applyReportPlugins(\n diffEnvironmentSources({\n contract,\n sources,\n strict: context.strict,\n debugValues: context.debugValues,\n }),\n context.plugins,\n );\n\n return emitAndReturnExitCode(report, {\n jsonMode: args.jsonMode,\n ...(context.outputFile !== undefined && { outputFile: context.outputFile }),\n });\n}\n\nasync function runDoctorCommand(args: ParsedValidationArgs): Promise<number> {\n const context = await prepareCommonContext(args.values);\n const loadContractOptions = {\n fallbackExamplePath: context.fallbackExamplePath,\n cwd: process.cwd(),\n ...(context.contractPath !== undefined && { contractPath: context.contractPath }),\n };\n const contract = applyContractPlugins(\n await loadValidationContract(loadContractOptions),\n context.plugins,\n );\n\n const checkEnvironment = args.values.env?.[0] ?? \".env\";\n let checkValues = await loadEnvSource({ filePath: checkEnvironment, allowMissing: true });\n checkValues = applySourcePlugins(\n { environment: checkEnvironment, values: checkValues },\n context.plugins,\n );\n\n const checkReport = validateAgainstContract({\n contract,\n values: checkValues,\n environment: checkEnvironment,\n strict: context.strict,\n debugValues: context.debugValues,\n });\n\n const sources: Record<string, Record<string, string>> = {};\n for (const target of parseTargets(args.values, context.fileConfig)) {\n const values = await loadEnvSource({ filePath: target, allowMissing: true });\n sources[target] = applySourcePlugins({ environment: target, values }, context.plugins);\n }\n\n if (context.cloudProvider !== undefined) {\n const cloudFile = context.cloudFile ?? `${context.cloudProvider}.env.json`;\n const cloudEnvironment = `cloud:${context.cloudProvider}`;\n const cloudValues = await loadCloudSource({\n provider: context.cloudProvider,\n filePath: cloudFile,\n });\n sources[cloudEnvironment] = applySourcePlugins(\n { environment: cloudEnvironment, values: cloudValues },\n context.plugins,\n );\n }\n\n const diffReport = diffEnvironmentSources({\n contract,\n sources,\n strict: context.strict,\n debugValues: context.debugValues,\n });\n\n const report = applyReportPlugins(\n buildDoctorReport({ checkReport, diffReport }),\n context.plugins,\n );\n\n return emitAndReturnExitCode(report, {\n jsonMode: args.jsonMode,\n ...(context.outputFile !== undefined && { outputFile: context.outputFile }),\n });\n}\n\nexport async function runValidationCommand(params: {\n command: ValidationCommand;\n argv: string[];\n}): Promise<number> {\n const parsed = parseValidationArgs(params.argv);\n if (parsed.values.help === true) {\n console.log(HELP_TEXT[params.command]);\n return 0;\n }\n\n if (params.command === \"check\") {\n return runCheckCommand(parsed);\n }\n if (params.command === \"diff\") {\n return runDiffCommand(parsed);\n }\n return runDoctorCommand(parsed);\n}\n"]}
|