@ayronforge/envil 0.6.0

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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/cli/dotenv-codec.d.ts +3 -0
  4. package/dist/cli/fs-utils.d.ts +7 -0
  5. package/dist/cli/generate-env-ts.d.ts +2 -0
  6. package/dist/cli/generate-example.d.ts +2 -0
  7. package/dist/cli/index.d.ts +7 -0
  8. package/dist/cli/infer.d.ts +6 -0
  9. package/dist/cli/literals.d.ts +5 -0
  10. package/dist/cli/manifest-codec.d.ts +3 -0
  11. package/dist/cli/types.d.ts +61 -0
  12. package/dist/cli.d.ts +8 -0
  13. package/dist/cli.js +1249 -0
  14. package/dist/cli.js.map +18 -0
  15. package/dist/env.d.ts +14 -0
  16. package/dist/errors.d.ts +10 -0
  17. package/dist/index.d.ts +7 -0
  18. package/dist/index.js +443 -0
  19. package/dist/index.js.map +17 -0
  20. package/dist/prefix.d.ts +6 -0
  21. package/dist/presets.d.ts +30 -0
  22. package/dist/presets.js +26 -0
  23. package/dist/presets.js.map +10 -0
  24. package/dist/resolvers/aws.d.ts +9 -0
  25. package/dist/resolvers/aws.js +146 -0
  26. package/dist/resolvers/aws.js.map +12 -0
  27. package/dist/resolvers/azure.d.ts +10 -0
  28. package/dist/resolvers/azure.js +85 -0
  29. package/dist/resolvers/azure.js.map +12 -0
  30. package/dist/resolvers/gcp.d.ts +10 -0
  31. package/dist/resolvers/gcp.js +88 -0
  32. package/dist/resolvers/gcp.js.map +12 -0
  33. package/dist/resolvers/onepassword.d.ts +9 -0
  34. package/dist/resolvers/onepassword.js +91 -0
  35. package/dist/resolvers/onepassword.js.map +12 -0
  36. package/dist/resolvers/remote.d.ts +9 -0
  37. package/dist/resolvers/types.d.ts +15 -0
  38. package/dist/resolvers/utils.d.ts +15 -0
  39. package/dist/safe-env.d.ts +23 -0
  40. package/dist/schemas.d.ts +30 -0
  41. package/dist/types.d.ts +41 -0
  42. package/package.json +109 -0
@@ -0,0 +1,18 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/fs-utils.ts", "../src/cli/dotenv-codec.ts", "../src/cli/literals.ts", "../src/cli/types.ts", "../src/cli/generate-example.ts", "../src/cli/manifest-codec.ts", "../src/cli/generate-env-ts.ts", "../src/cli/infer.ts", "../src/cli.ts"],
4
+ "sourcesContent": [
5
+ "import { access, mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function resolveFromCwd(cwd: string, filePath: string): string {\n return path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);\n}\n\nexport async function getDefaultEnvOutputPath(cwd: string): Promise<string> {\n const srcDir = path.join(cwd, \"src\");\n if (await pathExists(srcDir)) {\n return path.join(srcDir, \"env.ts\");\n }\n return path.join(cwd, \"env.ts\");\n}\n\nexport async function getDefaultExampleInputPath(cwd: string): Promise<string> {\n const rootEnv = path.join(cwd, \"env.ts\");\n const srcEnv = path.join(cwd, \"src\", \"env.ts\");\n\n if (await pathExists(rootEnv)) return rootEnv;\n if (await pathExists(srcEnv)) return srcEnv;\n\n const srcDir = path.join(cwd, \"src\");\n if (await pathExists(srcDir)) {\n return srcEnv;\n }\n\n return rootEnv;\n}\n\nexport async function ensureWritableTarget(targetPath: string, force: boolean): Promise<void> {\n if (!force && (await pathExists(targetPath))) {\n throw new Error(`Target file \"${targetPath}\" already exists. Use --force to overwrite.`);\n }\n}\n\nexport async function readTextFileOrThrow(filePath: string, label: string): Promise<string> {\n try {\n return await readFile(filePath, \"utf8\");\n } catch (error) {\n throw new Error(`Unable to read ${label} at \"${filePath}\": ${String(error)}`);\n }\n}\n\nexport async function writeFileAtomic(targetPath: string, contents: string): Promise<void> {\n const directory = path.dirname(targetPath);\n await mkdir(directory, { recursive: true });\n\n const tempPath = path.join(\n directory,\n `.envil-tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`,\n );\n\n await writeFile(tempPath, contents, \"utf8\");\n await rename(tempPath, targetPath);\n}\n",
6
+ "import { Schema } from \"effect\";\n\nimport {\n parseBooleanDirective,\n parseLiteral,\n toDirectiveLiteral,\n toEnvValueLiteral,\n} from \"./literals.ts\";\nimport {\n BUCKETS,\n SCHEMA_KINDS,\n type Bucket,\n type DotenvDocument,\n type SchemaKind,\n} from \"./types.ts\";\n\ntype MutableDirectives = {\n type?: SchemaKind;\n optional?: boolean;\n hasDefault?: boolean;\n defaultValue?: unknown;\n redacted?: boolean;\n bucket?: Bucket;\n};\n\nconst SENTINEL_DIRECTIVE_PREFIX = \"@\";\nconst KEY_ASSIGNMENT_PATTERN = /^([A-Za-z_][A-Za-z0-9_]*)\\s*=(.*)$/;\n\nconst DotenvCodec = Schema.transform(Schema.String, Schema.Unknown, {\n decode: (text) => parseDotenvText(String(text)),\n encode: (value) => stringifyDotenvDocument(value as DotenvDocument),\n});\n\nexport function decodeDotenvText(text: string): DotenvDocument {\n return Schema.decodeUnknownSync(DotenvCodec)(text) as DotenvDocument;\n}\n\nexport function encodeDotenvText(document: DotenvDocument): string {\n return Schema.encodeSync(DotenvCodec)(document) as string;\n}\n\nfunction parseDotenvText(text: string): DotenvDocument {\n const lines = text.split(/\\r?\\n/);\n const entries: Array<DotenvDocument[\"entries\"][number]> = [];\n let activeBucket: Bucket | undefined;\n let pendingDirectives: MutableDirectives = {};\n\n for (const [index, line] of lines.entries()) {\n const lineNumber = index + 1;\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n continue;\n }\n\n if (trimmed.startsWith(\"#\")) {\n const comment = trimmed.slice(1).trim();\n if (comment.startsWith(SENTINEL_DIRECTIVE_PREFIX)) {\n const directiveResult = parseDirectiveGroup(comment, lineNumber, pendingDirectives);\n if (directiveResult.sectionBucket) {\n activeBucket = directiveResult.sectionBucket;\n pendingDirectives = {};\n } else {\n pendingDirectives = directiveResult.directives;\n }\n }\n continue;\n }\n\n const assignmentMatch = KEY_ASSIGNMENT_PATTERN.exec(trimmed);\n if (!assignmentMatch) {\n throw new Error(`Malformed assignment at line ${lineNumber}: \"${line}\"`);\n }\n\n const key = assignmentMatch[1];\n const rightHandSide = assignmentMatch[2];\n const split = splitValueAndInlineComment(rightHandSide);\n const value = normalizeAssignedValue(split.value.trim());\n\n let directives = { ...pendingDirectives };\n if (split.comment) {\n const inlineComment = split.comment.trim();\n if (inlineComment.startsWith(SENTINEL_DIRECTIVE_PREFIX)) {\n const parsedInline = parseDirectiveGroup(inlineComment, lineNumber, directives);\n if (parsedInline.sectionBucket) {\n throw new Error(`Section directives are not allowed inline at line ${lineNumber}`);\n }\n directives = parsedInline.directives;\n }\n }\n\n entries.push({\n key,\n value,\n line: lineNumber,\n sectionBucket: activeBucket,\n directives,\n });\n pendingDirectives = {};\n }\n\n return { entries };\n}\n\nfunction stringifyDotenvDocument(document: DotenvDocument): string {\n if (!document || !Array.isArray(document.entries)) {\n throw new Error(\"Invalid dotenv document: expected an entries array\");\n }\n\n const grouped = {\n server: [] as Array<DotenvDocument[\"entries\"][number]>,\n client: [] as Array<DotenvDocument[\"entries\"][number]>,\n shared: [] as Array<DotenvDocument[\"entries\"][number]>,\n };\n\n const sortedEntries = [...document.entries].sort((left, right) => {\n if (left.line !== right.line) return left.line - right.line;\n return left.key.localeCompare(right.key);\n });\n\n for (const entry of sortedEntries) {\n const bucket: Bucket = entry.directives.bucket ?? entry.sectionBucket ?? \"server\";\n grouped[bucket].push(entry);\n }\n\n const lines: string[] = [];\n for (const bucket of BUCKETS) {\n lines.push(`# @${bucket}`);\n lines.push(\"\");\n\n for (const entry of grouped[bucket]) {\n const type = entry.directives.type ?? \"requiredString\";\n const optional = entry.directives.optional ?? false;\n const hasDefault = entry.directives.hasDefault ?? false;\n const redacted = entry.directives.redacted ?? false;\n const defaultLiteral = hasDefault\n ? ` ${toDirectiveLiteral(entry.directives.defaultValue)}`\n : \"\";\n\n lines.push(`# @type ${type}`);\n lines.push(`# @bucket ${bucket}`);\n lines.push(`# @optional ${optional}`);\n lines.push(`# @default${defaultLiteral}`);\n lines.push(`# @redacted ${redacted}`);\n lines.push(`${entry.key}=${serializeEnvValue(entry.value)}`);\n lines.push(\"\");\n }\n }\n\n while (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction splitValueAndInlineComment(value: string): { value: string; comment?: string } {\n let inSingleQuote = false;\n let inDoubleQuote = false;\n let escaped = false;\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index];\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === \"'\" && !inDoubleQuote) {\n inSingleQuote = !inSingleQuote;\n continue;\n }\n\n if (char === '\"' && !inSingleQuote) {\n inDoubleQuote = !inDoubleQuote;\n continue;\n }\n\n if (!inSingleQuote && !inDoubleQuote && char === \"#\") {\n return {\n value: value.slice(0, index).trimEnd(),\n comment: value.slice(index + 1),\n };\n }\n }\n\n return { value };\n}\n\nfunction parseDirectiveGroup(\n directiveText: string,\n lineNumber: number,\n base: MutableDirectives,\n): { directives: MutableDirectives; sectionBucket?: Bucket } {\n const directives = { ...base };\n const tokens = directiveText\n .split(/\\s+(?=@)/g)\n .map((token) => token.trim())\n .filter(Boolean);\n\n let sectionBucket: Bucket | undefined;\n for (const token of tokens) {\n const parsed = parseDirectiveToken(token, lineNumber);\n if (\"type\" in parsed) directives.type = parsed.type;\n if (\"optional\" in parsed) directives.optional = parsed.optional;\n if (\"hasDefault\" in parsed) directives.hasDefault = parsed.hasDefault;\n if (\"defaultValue\" in parsed) directives.defaultValue = parsed.defaultValue;\n if (\"redacted\" in parsed) directives.redacted = parsed.redacted;\n if (\"bucket\" in parsed) directives.bucket = parsed.bucket;\n if (\"sectionBucket\" in parsed) sectionBucket = parsed.sectionBucket;\n }\n\n return { directives, sectionBucket };\n}\n\nfunction parseDirectiveToken(\n token: string,\n lineNumber: number,\n): MutableDirectives & { sectionBucket?: Bucket } {\n if (!token.startsWith(\"@\")) {\n throw new Error(`Malformed directive at line ${lineNumber}: \"${token}\"`);\n }\n\n const spaceIndex = token.indexOf(\" \");\n const name = (spaceIndex === -1 ? token.slice(1) : token.slice(1, spaceIndex)).trim();\n const value = (spaceIndex === -1 ? \"\" : token.slice(spaceIndex + 1)).trim();\n\n if (name === \"server\" || name === \"client\" || name === \"shared\") {\n if (value.length > 0) {\n throw new Error(`Section directive \"@${name}\" must not include a value (line ${lineNumber})`);\n }\n return { sectionBucket: name };\n }\n\n if (name === \"type\") {\n if (value.length === 0) {\n throw new Error(`Directive \"@type\" requires a value at line ${lineNumber}`);\n }\n return { type: parseSchemaKind(value, lineNumber) };\n }\n\n if (name === \"optional\") {\n return { optional: parseBooleanDirective(value || undefined, true) };\n }\n\n if (name === \"default\") {\n if (value.length === 0) {\n return { hasDefault: false, defaultValue: undefined };\n }\n\n return { hasDefault: true, defaultValue: parseLiteral(value) };\n }\n\n if (name === \"redacted\") {\n return { redacted: parseBooleanDirective(value || undefined, true) };\n }\n\n if (name === \"bucket\") {\n if (value.length === 0) {\n throw new Error(`Directive \"@bucket\" requires a value at line ${lineNumber}`);\n }\n if (!isBucket(value)) {\n throw new Error(`Invalid bucket \"${value}\" at line ${lineNumber}`);\n }\n return { bucket: value };\n }\n\n throw new Error(`Unknown directive \"@${name}\" at line ${lineNumber}`);\n}\n\nfunction parseSchemaKind(rawValue: string, lineNumber: number): SchemaKind {\n const normalized = rawValue.trim().toLowerCase();\n const aliasMap: Record<string, SchemaKind> = {\n string: \"requiredString\",\n requiredstring: \"requiredString\",\n bool: \"boolean\",\n boolean: \"boolean\",\n int: \"integer\",\n integer: \"integer\",\n number: \"number\",\n port: \"port\",\n url: \"url\",\n postgresurl: \"postgresUrl\",\n redisurl: \"redisUrl\",\n mongourl: \"mongoUrl\",\n mysqlurl: \"mysqlUrl\",\n commaseparated: \"commaSeparated\",\n commaseparatednumbers: \"commaSeparatedNumbers\",\n commaseparatedurls: \"commaSeparatedUrls\",\n json: \"json\",\n \"json(schema.unknown)\": \"json\",\n };\n\n const resolved = aliasMap[normalized];\n if (!resolved || !SCHEMA_KINDS.includes(resolved)) {\n throw new Error(`Invalid @type value \"${rawValue}\" at line ${lineNumber}`);\n }\n\n return resolved;\n}\n\nfunction normalizeAssignedValue(value: string): string {\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 serializeEnvValue(value: string): string {\n const literal = toEnvValueLiteral(value);\n if (literal.length === 0) return \"\";\n\n if (/[\\s#]/.test(literal)) {\n return JSON.stringify(literal);\n }\n\n return literal;\n}\n\nfunction isBucket(value: string): value is Bucket {\n return BUCKETS.includes(value as Bucket);\n}\n",
7
+ "export function parseLiteral(input: string): unknown {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n return \"\";\n }\n\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n try {\n return JSON.parse(trimmed.replace(/^'/, '\"').replace(/'$/, '\"'));\n } catch {\n return trimmed.slice(1, -1);\n }\n }\n\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n\n if (/^[+-]?\\d+(?:\\.\\d+)?$/.test(trimmed)) {\n const value = Number(trimmed);\n if (!Number.isNaN(value)) {\n return value;\n }\n }\n\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n return trimmed;\n }\n }\n\n return trimmed;\n}\n\nexport function toCodeLiteral(value: unknown): string {\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n return JSON.stringify(value);\n}\n\nexport function toDirectiveLiteral(value: unknown): string {\n if (value === undefined) return \"\";\n return toCodeLiteral(value);\n}\n\nexport function toEnvValueLiteral(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value === null || value === undefined) return \"\";\n return JSON.stringify(value);\n}\n\nexport function parseBooleanDirective(value: string | undefined, defaultValue: boolean): boolean {\n if (value === undefined || value.length === 0) {\n return defaultValue;\n }\n\n const normalized = value.trim().toLowerCase();\n if (normalized === \"true\") return true;\n if (normalized === \"false\") return false;\n throw new Error(`Invalid boolean directive value \"${value}\"`);\n}\n",
8
+ "export const BUCKETS = [\"server\", \"client\", \"shared\"] as const;\nexport type Bucket = (typeof BUCKETS)[number];\n\nexport const SCHEMA_KINDS = [\n \"requiredString\",\n \"boolean\",\n \"integer\",\n \"number\",\n \"port\",\n \"url\",\n \"postgresUrl\",\n \"redisUrl\",\n \"mongoUrl\",\n \"mysqlUrl\",\n \"commaSeparated\",\n \"commaSeparatedNumbers\",\n \"commaSeparatedUrls\",\n \"json\",\n] as const;\nexport type SchemaKind = (typeof SCHEMA_KINDS)[number];\n\nexport const FRAMEWORKS = [\"nextjs\", \"vite\", \"expo\", \"nuxt\", \"sveltekit\", \"astro\"] as const;\nexport type Framework = (typeof FRAMEWORKS)[number];\n\nexport interface PrefixConfig {\n readonly server: string;\n readonly client: string;\n readonly shared: string;\n}\n\nexport interface ParsedDirectives {\n readonly type?: SchemaKind;\n readonly optional?: boolean;\n readonly hasDefault?: boolean;\n readonly defaultValue?: unknown;\n readonly redacted?: boolean;\n readonly bucket?: Bucket;\n}\n\nexport interface DotenvAssignment {\n readonly key: string;\n readonly value: string;\n readonly line: number;\n readonly sectionBucket?: Bucket;\n readonly directives: ParsedDirectives;\n}\n\nexport interface DotenvDocument {\n readonly entries: ReadonlyArray<DotenvAssignment>;\n}\n\nexport interface InferredVariable {\n readonly schemaKey: string;\n readonly runtimeKey: string;\n readonly bucket: Bucket;\n readonly kind: SchemaKind;\n readonly optional: boolean;\n readonly hasDefault: boolean;\n readonly defaultValue?: unknown;\n readonly redacted: boolean;\n readonly sourceLine: number;\n}\n\nexport interface InferredModel {\n readonly prefix: PrefixConfig;\n readonly variables: ReadonlyArray<InferredVariable>;\n readonly runtimeEnv: Readonly<Record<string, string | undefined>>;\n}\n\nexport interface ManifestVariable {\n readonly name: string;\n readonly bucket: Bucket;\n readonly kind: SchemaKind;\n readonly optional: boolean;\n readonly hasDefault: boolean;\n readonly defaultValue?: unknown;\n readonly redacted: boolean;\n}\n\nexport interface ManifestV1 {\n readonly version: 1;\n readonly prefix: PrefixConfig;\n readonly variables: ReadonlyArray<ManifestVariable>;\n}\n\nexport type Manifest = ManifestV1;\n\nexport const MANIFEST_VERSION = 1 as const;\n",
9
+ "import { encodeDotenvText } from \"./dotenv-codec.ts\";\nimport { toEnvValueLiteral } from \"./literals.ts\";\nimport { BUCKETS, type Manifest, type ManifestVariable, type SchemaKind } from \"./types.ts\";\n\nconst PLACEHOLDERS: Record<SchemaKind, string> = {\n requiredString: \"CHANGE_ME\",\n boolean: \"true\",\n integer: \"123\",\n number: \"3.14\",\n port: \"3000\",\n url: \"https://example.com\",\n postgresUrl: \"postgres://user:pass@localhost:5432/app\",\n redisUrl: \"redis://localhost:6379\",\n mongoUrl: \"mongodb://localhost:27017/app\",\n mysqlUrl: \"mysql://user:pass@localhost:3306/app\",\n commaSeparated: \"alpha,beta,gamma\",\n commaSeparatedNumbers: \"1,2,3\",\n commaSeparatedUrls: \"https://one.example.com,https://two.example.com\",\n json: '{\"key\":\"value\"}',\n};\n\nexport function generateExample(manifest: Manifest): string {\n const entries = [];\n let line = 1;\n\n for (const bucket of BUCKETS) {\n const variables = manifest.variables\n .filter((variable) => variable.bucket === bucket)\n .sort((left, right) => left.name.localeCompare(right.name));\n\n for (const variable of variables) {\n const runtimeKey = `${manifest.prefix[bucket]}${variable.name}`;\n const value = variable.hasDefault\n ? renderDefaultValue(variable)\n : (PLACEHOLDERS[variable.kind] ?? PLACEHOLDERS.requiredString);\n\n entries.push({\n key: runtimeKey,\n value,\n line,\n sectionBucket: bucket,\n directives: {\n type: variable.kind,\n bucket: bucket,\n optional: variable.optional,\n hasDefault: variable.hasDefault,\n defaultValue: variable.defaultValue,\n redacted: variable.redacted,\n },\n });\n line += 1;\n }\n }\n\n return encodeDotenvText({ entries });\n}\n\nfunction renderDefaultValue(variable: ManifestVariable): string {\n if (!variable.hasDefault) {\n return PLACEHOLDERS[variable.kind];\n }\n\n if (variable.kind === \"commaSeparated\") {\n if (Array.isArray(variable.defaultValue)) {\n return variable.defaultValue.map((item) => String(item)).join(\",\");\n }\n return String(variable.defaultValue ?? \"\");\n }\n\n if (variable.kind === \"commaSeparatedNumbers\") {\n if (Array.isArray(variable.defaultValue)) {\n return variable.defaultValue\n .map((item) => Number(item))\n .filter((item) => Number.isFinite(item))\n .join(\",\");\n }\n return String(variable.defaultValue ?? \"0\");\n }\n\n if (variable.kind === \"commaSeparatedUrls\") {\n if (Array.isArray(variable.defaultValue)) {\n return variable.defaultValue.map((item) => String(item)).join(\",\");\n }\n return String(variable.defaultValue ?? PLACEHOLDERS.commaSeparatedUrls);\n }\n\n if (variable.kind === \"json\") {\n if (typeof variable.defaultValue === \"string\") {\n return variable.defaultValue;\n }\n return JSON.stringify(variable.defaultValue ?? {});\n }\n\n return toEnvValueLiteral(variable.defaultValue);\n}\n",
10
+ "import { Schema } from \"effect\";\n\nimport {\n BUCKETS,\n MANIFEST_VERSION,\n SCHEMA_KINDS,\n type Manifest,\n type ManifestVariable,\n} from \"./types.ts\";\n\nconst MANIFEST_SENTINEL = \"@envil:manifest\";\nconst MANIFEST_BLOCK_PATTERN = /\\/\\*\\s*@envil:manifest\\s*([\\s\\S]*?)\\*\\//m;\n\nconst ManifestCodec = Schema.transform(Schema.String, Schema.Unknown, {\n decode: (source) => decodeManifestFromSourceText(String(source)),\n encode: (value) => encodeManifestToBlockComment(value as Manifest),\n});\n\nexport function decodeManifestFromSource(source: string): Manifest {\n return Schema.decodeUnknownSync(ManifestCodec)(source) as Manifest;\n}\n\nexport function encodeManifestBlock(manifest: Manifest): string {\n return Schema.encodeSync(ManifestCodec)(manifest) as string;\n}\n\nfunction decodeManifestFromSourceText(source: string): Manifest {\n const match = MANIFEST_BLOCK_PATTERN.exec(source);\n if (!match) {\n throw new Error(\n \"Manifest block not found. Expected a top-level @envil:manifest block comment.\",\n );\n }\n\n const jsonText = match[1].trim();\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonText);\n } catch (error) {\n throw new Error(`Malformed manifest JSON: ${String(error)}`);\n }\n\n return validateManifest(parsed);\n}\n\nfunction encodeManifestToBlockComment(manifest: Manifest): string {\n const normalized = validateManifest(manifest);\n return `/* ${MANIFEST_SENTINEL}\\n${JSON.stringify(normalized, null, 2)}\\n*/`;\n}\n\nfunction validateManifest(value: unknown): Manifest {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"Manifest must be an object.\");\n }\n\n const candidate = value as Record<string, unknown>;\n if (candidate.version !== MANIFEST_VERSION) {\n throw new Error(`Unsupported manifest version \"${String(candidate.version)}\".`);\n }\n\n const prefix = validatePrefix(candidate.prefix);\n const variablesRaw = candidate.variables;\n if (!Array.isArray(variablesRaw)) {\n throw new Error('Manifest field \"variables\" must be an array.');\n }\n\n const variables = variablesRaw.map((item, index) => validateManifestVariable(item, index));\n variables.sort((left, right) => {\n if (left.bucket !== right.bucket) return left.bucket.localeCompare(right.bucket);\n return left.name.localeCompare(right.name);\n });\n\n return {\n version: MANIFEST_VERSION,\n prefix,\n variables,\n };\n}\n\nfunction validatePrefix(prefixValue: unknown) {\n if (!prefixValue || typeof prefixValue !== \"object\") {\n throw new Error('Manifest field \"prefix\" must be an object.');\n }\n\n const prefix = prefixValue as Record<string, unknown>;\n const server = typeof prefix.server === \"string\" ? prefix.server : \"\";\n const client = typeof prefix.client === \"string\" ? prefix.client : \"\";\n const shared = typeof prefix.shared === \"string\" ? prefix.shared : \"\";\n return { server, client, shared } as const;\n}\n\nfunction validateManifestVariable(value: unknown, index: number): ManifestVariable {\n if (!value || typeof value !== \"object\") {\n throw new Error(`Manifest variable at index ${index} must be an object.`);\n }\n\n const variable = value as Record<string, unknown>;\n if (typeof variable.name !== \"string\" || variable.name.length === 0) {\n throw new Error(`Manifest variable at index ${index} has an invalid \"name\".`);\n }\n\n if (typeof variable.bucket !== \"string\" || !BUCKETS.includes(variable.bucket as any)) {\n throw new Error(`Manifest variable \"${variable.name}\" has an invalid \"bucket\".`);\n }\n\n if (typeof variable.kind !== \"string\" || !SCHEMA_KINDS.includes(variable.kind as any)) {\n throw new Error(`Manifest variable \"${variable.name}\" has an invalid \"kind\".`);\n }\n\n if (typeof variable.optional !== \"boolean\") {\n throw new Error(`Manifest variable \"${variable.name}\" has an invalid \"optional\" flag.`);\n }\n\n if (typeof variable.hasDefault !== \"boolean\") {\n throw new Error(`Manifest variable \"${variable.name}\" has an invalid \"hasDefault\" flag.`);\n }\n\n if (typeof variable.redacted !== \"boolean\") {\n throw new Error(`Manifest variable \"${variable.name}\" has an invalid \"redacted\" flag.`);\n }\n\n return {\n name: variable.name,\n bucket: variable.bucket as ManifestVariable[\"bucket\"],\n kind: variable.kind as ManifestVariable[\"kind\"],\n optional: variable.optional,\n hasDefault: variable.hasDefault,\n defaultValue: variable.defaultValue,\n redacted: variable.redacted,\n };\n}\n",
11
+ "import { toCodeLiteral } from \"./literals.ts\";\nimport { encodeManifestBlock } from \"./manifest-codec.ts\";\nimport { MANIFEST_VERSION, type InferredModel, type Manifest, type SchemaKind } from \"./types.ts\";\n\nconst BUCKET_ORDER = [\"server\", \"client\", \"shared\"] as const;\n\ntype Bucket = (typeof BUCKET_ORDER)[number];\n\ninterface RenderedVariable {\n readonly key: string;\n readonly expression: string;\n}\n\nexport function generateEnvTs(model: InferredModel): string {\n const sortedVariables = [...model.variables].sort((left, right) => {\n if (left.bucket !== right.bucket) return left.bucket.localeCompare(right.bucket);\n return left.schemaKey.localeCompare(right.schemaKey);\n });\n\n const grouped: Record<Bucket, RenderedVariable[]> = {\n server: [],\n client: [],\n shared: [],\n };\n\n const helperImports = new Set<string>([\"createEnv\"]);\n let needsSchemaImport = false;\n\n for (const variable of sortedVariables) {\n const rendered = renderSchemaExpression(variable.kind, {\n optional: variable.optional,\n hasDefault: variable.hasDefault,\n defaultValue: variable.defaultValue,\n redacted: variable.redacted,\n });\n for (const helper of rendered.helpers) {\n helperImports.add(helper);\n }\n needsSchemaImport ||= rendered.needsSchemaImport;\n\n grouped[variable.bucket].push({\n key: quoteObjectKey(variable.schemaKey),\n expression: rendered.expression,\n });\n }\n\n const importLine = `import { ${[...helperImports].sort().join(\", \")} } from \"@ayronforge/envil\";`;\n const schemaImportLine = needsSchemaImport ? `import { Schema } from \"effect\";` : \"\";\n const manifestBlock = encodeManifestBlock(toManifest(model));\n\n const sourceLines = [\n manifestBlock,\n \"\",\n importLine,\n schemaImportLine,\n \"\",\n \"export const envDefinition = {\",\n \" prefix: {\",\n ` server: ${JSON.stringify(model.prefix.server)},`,\n ` client: ${JSON.stringify(model.prefix.client)},`,\n ` shared: ${JSON.stringify(model.prefix.shared)},`,\n \" },\",\n \" server: {\",\n ...renderBucketEntries(grouped.server),\n \" },\",\n \" client: {\",\n ...renderBucketEntries(grouped.client),\n \" },\",\n \" shared: {\",\n ...renderBucketEntries(grouped.shared),\n \" },\",\n \"} as const;\",\n \"\",\n \"export const env = createEnv(envDefinition);\",\n \"\",\n ];\n\n return sourceLines.filter((line, index, all) => line !== \"\" || all[index - 1] !== \"\").join(\"\\n\");\n}\n\nfunction renderBucketEntries(entries: ReadonlyArray<RenderedVariable>): string[] {\n if (entries.length === 0) {\n return [];\n }\n\n return entries.map((entry) => ` ${entry.key}: ${entry.expression},`);\n}\n\nfunction renderSchemaExpression(\n kind: SchemaKind,\n wrappers: {\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n redacted: boolean;\n },\n): { expression: string; helpers: Set<string>; needsSchemaImport: boolean } {\n let expression = renderBaseExpression(kind);\n const helpers = new Set<string>(requiredHelpersForKind(kind));\n const needsSchemaImport = kind === \"number\" || kind === \"json\";\n\n if (wrappers.optional && !wrappers.hasDefault) {\n expression = `optional(${expression})`;\n helpers.add(\"optional\");\n }\n\n if (wrappers.hasDefault) {\n expression = `withDefault(${expression}, ${toCodeLiteral(wrappers.defaultValue)})`;\n helpers.add(\"withDefault\");\n }\n\n if (wrappers.redacted) {\n expression = `redacted(${expression})`;\n helpers.add(\"redacted\");\n }\n\n return { expression, helpers, needsSchemaImport };\n}\n\nfunction renderBaseExpression(kind: SchemaKind): string {\n switch (kind) {\n case \"requiredString\":\n return \"requiredString\";\n case \"boolean\":\n return \"boolean\";\n case \"integer\":\n return \"integer\";\n case \"number\":\n return \"Schema.NumberFromString\";\n case \"port\":\n return \"port\";\n case \"url\":\n return \"url\";\n case \"postgresUrl\":\n return \"postgresUrl\";\n case \"redisUrl\":\n return \"redisUrl\";\n case \"mongoUrl\":\n return \"mongoUrl\";\n case \"mysqlUrl\":\n return \"mysqlUrl\";\n case \"commaSeparated\":\n return \"commaSeparated\";\n case \"commaSeparatedNumbers\":\n return \"commaSeparatedNumbers\";\n case \"commaSeparatedUrls\":\n return \"commaSeparatedUrls\";\n case \"json\":\n return \"json(Schema.Unknown)\";\n default:\n return \"requiredString\";\n }\n}\n\nfunction requiredHelpersForKind(kind: SchemaKind): ReadonlyArray<string> {\n switch (kind) {\n case \"requiredString\":\n return [\"requiredString\"];\n case \"boolean\":\n return [\"boolean\"];\n case \"integer\":\n return [\"integer\"];\n case \"number\":\n return [];\n case \"port\":\n return [\"port\"];\n case \"url\":\n return [\"url\"];\n case \"postgresUrl\":\n return [\"postgresUrl\"];\n case \"redisUrl\":\n return [\"redisUrl\"];\n case \"mongoUrl\":\n return [\"mongoUrl\"];\n case \"mysqlUrl\":\n return [\"mysqlUrl\"];\n case \"commaSeparated\":\n return [\"commaSeparated\"];\n case \"commaSeparatedNumbers\":\n return [\"commaSeparatedNumbers\"];\n case \"commaSeparatedUrls\":\n return [\"commaSeparatedUrls\"];\n case \"json\":\n return [\"json\"];\n default:\n return [\"requiredString\"];\n }\n}\n\nfunction quoteObjectKey(value: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value) ? value : JSON.stringify(value);\n}\n\nfunction toManifest(model: InferredModel): Manifest {\n const variables = [...model.variables]\n .map((variable) => ({\n name: variable.schemaKey,\n bucket: variable.bucket,\n kind: variable.kind,\n optional: variable.optional,\n hasDefault: variable.hasDefault,\n defaultValue: variable.defaultValue,\n redacted: variable.redacted,\n }))\n .sort((left, right) => {\n if (left.bucket !== right.bucket) return left.bucket.localeCompare(right.bucket);\n return left.name.localeCompare(right.name);\n });\n\n return {\n version: MANIFEST_VERSION,\n prefix: model.prefix,\n variables,\n };\n}\n",
12
+ "import type {\n DotenvDocument,\n InferredModel,\n InferredVariable,\n PrefixConfig,\n SchemaKind,\n} from \"./types.ts\";\n\ninterface InferOptions {\n readonly prefix: PrefixConfig;\n}\n\nconst STRING_KINDS = new Set<SchemaKind>([\n \"requiredString\",\n \"url\",\n \"postgresUrl\",\n \"redisUrl\",\n \"mongoUrl\",\n \"mysqlUrl\",\n]);\n\nconst BUCKET_ORDER: Record<InferredVariable[\"bucket\"], number> = {\n server: 0,\n client: 1,\n shared: 2,\n};\n\nexport function inferModel(document: DotenvDocument, options: InferOptions): InferredModel {\n const runtimeEnv: Record<string, string | undefined> = {};\n const inferredVariables: InferredVariable[] = [];\n\n for (const entry of document.entries) {\n runtimeEnv[entry.key] = entry.value;\n const { bucket, schemaKey } = resolveBucketAndSchemaKey(entry.key, options.prefix, {\n explicitBucket: entry.directives.bucket,\n sectionBucket: entry.sectionBucket,\n });\n\n const resolvedKind = entry.directives.type ?? inferSchemaKind(entry.key, entry.value);\n const hasDefault = entry.directives.hasDefault ?? false;\n const defaultValue = hasDefault\n ? normalizeDefaultValue(resolvedKind, entry.directives.defaultValue)\n : undefined;\n const optionalFlag = entry.directives.optional ?? false;\n const redactedFlag = entry.directives.redacted ?? false;\n\n const duplicate = inferredVariables.find(\n (candidate) => candidate.bucket === bucket && candidate.schemaKey === schemaKey,\n );\n if (duplicate) {\n throw new Error(\n `Duplicate schema key \"${schemaKey}\" in bucket \"${bucket}\" at line ${entry.line}.`,\n );\n }\n\n inferredVariables.push({\n schemaKey,\n runtimeKey: entry.key,\n bucket,\n kind: resolvedKind,\n optional: optionalFlag,\n hasDefault,\n defaultValue,\n redacted: redactedFlag,\n sourceLine: entry.line,\n });\n }\n\n inferredVariables.sort((left, right) => {\n const bucketOrder = BUCKET_ORDER[left.bucket] - BUCKET_ORDER[right.bucket];\n if (bucketOrder !== 0) return bucketOrder;\n return left.schemaKey.localeCompare(right.schemaKey);\n });\n\n return {\n prefix: options.prefix,\n variables: inferredVariables,\n runtimeEnv,\n };\n}\n\nfunction resolveBucketAndSchemaKey(\n runtimeKey: string,\n prefix: PrefixConfig,\n options: {\n explicitBucket?: InferredVariable[\"bucket\"];\n sectionBucket?: InferredVariable[\"bucket\"];\n },\n): { bucket: InferredVariable[\"bucket\"]; schemaKey: string } {\n const explicitBucket = options.explicitBucket ?? options.sectionBucket;\n if (explicitBucket) {\n return {\n bucket: explicitBucket,\n schemaKey: stripPrefix(runtimeKey, prefix[explicitBucket]),\n };\n }\n\n const inferredFromPrefix = inferBucketFromPrefix(runtimeKey, prefix);\n if (inferredFromPrefix) {\n return inferredFromPrefix;\n }\n\n return {\n bucket: \"server\",\n schemaKey: runtimeKey,\n };\n}\n\nfunction inferBucketFromPrefix(\n runtimeKey: string,\n prefix: PrefixConfig,\n): { bucket: InferredVariable[\"bucket\"]; schemaKey: string } | undefined {\n const candidates = [\n { bucket: \"client\", prefix: prefix.client },\n { bucket: \"server\", prefix: prefix.server },\n { bucket: \"shared\", prefix: prefix.shared },\n ]\n .filter((candidate) => candidate.prefix.length > 0 && runtimeKey.startsWith(candidate.prefix))\n .sort((left, right) => right.prefix.length - left.prefix.length) as Array<{\n bucket: InferredVariable[\"bucket\"];\n prefix: string;\n }>;\n\n const best = candidates[0];\n if (!best) return undefined;\n\n return {\n bucket: best.bucket,\n schemaKey: stripPrefix(runtimeKey, best.prefix),\n };\n}\n\nfunction stripPrefix(key: string, prefix: string): string {\n if (!prefix || !key.startsWith(prefix)) {\n return key;\n }\n\n const stripped = key.slice(prefix.length);\n return stripped.length > 0 ? stripped : key;\n}\n\nfunction inferSchemaKind(key: string, rawValue: string): SchemaKind {\n const value = rawValue.trim();\n const lowerValue = value.toLowerCase();\n const upperKey = key.toUpperCase();\n\n if (isJsonCandidate(value)) {\n return \"json\";\n }\n\n if (lowerValue.startsWith(\"postgres://\") || lowerValue.startsWith(\"postgresql://\")) {\n return \"postgresUrl\";\n }\n if (lowerValue.startsWith(\"redis://\") || lowerValue.startsWith(\"rediss://\")) {\n return \"redisUrl\";\n }\n if (lowerValue.startsWith(\"mongodb://\") || lowerValue.startsWith(\"mongodb+srv://\")) {\n return \"mongoUrl\";\n }\n if (lowerValue.startsWith(\"mysql://\") || lowerValue.startsWith(\"mysqls://\")) {\n return \"mysqlUrl\";\n }\n\n if (isCommaSeparatedCandidate(value)) {\n const parts = splitCommaValues(value);\n if (parts.length > 0 && parts.every((part) => isIntegerString(part) || isNumberString(part))) {\n return \"commaSeparatedNumbers\";\n }\n if (parts.length > 0 && parts.every((part) => isHttpUrl(part))) {\n return \"commaSeparatedUrls\";\n }\n return \"commaSeparated\";\n }\n\n if (isHttpUrl(value)) {\n return \"url\";\n }\n\n if (isBooleanString(lowerValue)) {\n return \"boolean\";\n }\n\n if (isIntegerString(value)) {\n const numberValue = Number(value);\n if (upperKey.includes(\"PORT\") && numberValue >= 1 && numberValue <= 65535) {\n return \"port\";\n }\n return \"integer\";\n }\n\n if (isNumberString(value)) {\n return \"number\";\n }\n\n return \"requiredString\";\n}\n\nfunction isBooleanString(value: string): boolean {\n return value === \"true\" || value === \"false\" || value === \"1\" || value === \"0\";\n}\n\nfunction isIntegerString(value: string): boolean {\n return /^[+-]?\\d+$/.test(value);\n}\n\nfunction isNumberString(value: string): boolean {\n return /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(value);\n}\n\nfunction isHttpUrl(value: string): boolean {\n try {\n const parsed = new URL(value);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction isCommaSeparatedCandidate(value: string): boolean {\n return value.includes(\",\") && !value.startsWith(\"{\") && !value.startsWith(\"[\");\n}\n\nfunction splitCommaValues(value: string): string[] {\n return value\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n}\n\nfunction isJsonCandidate(value: string): boolean {\n const trimmed = value.trim();\n if (\n !(\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n )\n ) {\n return false;\n }\n\n try {\n JSON.parse(trimmed);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction normalizeDefaultValue(kind: SchemaKind, value: unknown): unknown {\n if (kind === \"boolean\") {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n return normalized === \"true\" || normalized === \"1\";\n }\n return Boolean(value);\n }\n\n if (kind === \"integer\") {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) return 0;\n return Math.trunc(numeric);\n }\n\n if (kind === \"number\") {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : 0;\n }\n\n if (kind === \"port\") {\n const numeric = Math.trunc(Number(value));\n if (Number.isFinite(numeric) && numeric >= 1 && numeric <= 65535) {\n return numeric;\n }\n return 3000;\n }\n\n if (kind === \"commaSeparated\") {\n if (Array.isArray(value)) {\n return value.map((item) => String(item));\n }\n if (typeof value === \"string\") {\n return splitCommaValues(value);\n }\n return [String(value ?? \"\")];\n }\n\n if (kind === \"commaSeparatedNumbers\") {\n if (Array.isArray(value)) {\n return value.map((item) => Number(item)).filter((item) => Number.isFinite(item));\n }\n if (typeof value === \"string\") {\n return splitCommaValues(value)\n .map((item) => Number(item))\n .filter((item) => Number.isFinite(item));\n }\n const numeric = Number(value);\n return Number.isFinite(numeric) ? [numeric] : [0];\n }\n\n if (kind === \"commaSeparatedUrls\") {\n if (Array.isArray(value)) {\n return value.map((item) => String(item));\n }\n if (typeof value === \"string\") {\n return splitCommaValues(value);\n }\n return [String(value ?? \"https://example.com\")];\n }\n\n if (kind === \"json\") {\n return value ?? {};\n }\n\n if (STRING_KINDS.has(kind)) {\n const stringValue = String(value ?? \"\");\n return stringValue.length > 0 ? stringValue : \"value\";\n }\n\n return value;\n}\n",
13
+ "#!/usr/bin/env node\n\nimport { ensureWritableTarget, readTextFileOrThrow, writeFileAtomic } from \"./cli/fs-utils.ts\";\nimport {\n decodeDotenvText,\n decodeManifestFromSource,\n generateEnvTs,\n generateExample,\n getDefaultEnvOutputPath,\n getDefaultExampleInputPath,\n inferModel,\n resolveFromCwd,\n} from \"./cli/index.ts\";\nimport { FRAMEWORKS, type Framework, type PrefixConfig } from \"./cli/types.ts\";\n\ninterface CliIO {\n cwd: () => string;\n stdout: (message: string) => void;\n stderr: (message: string) => void;\n}\n\ninterface AddEnvOptions {\n input?: string;\n output?: string;\n framework?: Framework;\n clientPrefix?: string;\n serverPrefix?: string;\n sharedPrefix?: string;\n force: boolean;\n help: boolean;\n}\n\ninterface AddExampleOptions {\n input?: string;\n output?: string;\n force: boolean;\n help: boolean;\n}\n\nconst DEFAULT_IO: CliIO = {\n cwd: () => process.cwd(),\n stdout: (message) => process.stdout.write(message),\n stderr: (message) => process.stderr.write(message),\n};\n\nconst FRAMEWORK_PREFIXES: Record<Framework, PrefixConfig> = {\n nextjs: { server: \"\", client: \"NEXT_PUBLIC_\", shared: \"\" },\n vite: { server: \"\", client: \"VITE_\", shared: \"\" },\n expo: { server: \"\", client: \"EXPO_PUBLIC_\", shared: \"\" },\n nuxt: { server: \"\", client: \"NUXT_PUBLIC_\", shared: \"\" },\n sveltekit: { server: \"\", client: \"PUBLIC_\", shared: \"\" },\n astro: { server: \"\", client: \"PUBLIC_\", shared: \"\" },\n};\n\nexport async function runCli(argv: string[], io: Partial<CliIO> = {}): Promise<number> {\n const runtimeIO: CliIO = {\n cwd: io.cwd ?? DEFAULT_IO.cwd,\n stdout: io.stdout ?? DEFAULT_IO.stdout,\n stderr: io.stderr ?? DEFAULT_IO.stderr,\n };\n\n try {\n if (argv.length === 0 || argv[0] === \"--help\" || argv[0] === \"-h\") {\n runtimeIO.stdout(getRootHelpText());\n return 0;\n }\n\n if (argv[0] !== \"add\") {\n throw new Error(`Unknown command \"${argv[0]}\".\\n${getRootHelpText()}`);\n }\n\n const subcommand = argv[1];\n if (!subcommand || subcommand === \"--help\") {\n runtimeIO.stdout(getAddHelpText());\n return 0;\n }\n\n if (subcommand === \"env\") {\n const options = parseAddEnvOptions(argv.slice(2));\n if (options.help) {\n runtimeIO.stdout(getAddEnvHelpText());\n return 0;\n }\n\n await runAddEnv(options, runtimeIO);\n return 0;\n }\n\n if (subcommand === \"example\") {\n const options = parseAddExampleOptions(argv.slice(2));\n if (options.help) {\n runtimeIO.stdout(getAddExampleHelpText());\n return 0;\n }\n\n await runAddExample(options, runtimeIO);\n return 0;\n }\n\n throw new Error(`Unknown subcommand \"add ${subcommand}\".\\n${getAddHelpText()}`);\n } catch (error) {\n runtimeIO.stderr(`${formatErrorMessage(error)}\\n`);\n return 1;\n }\n}\n\nasync function runAddEnv(options: AddEnvOptions, io: CliIO): Promise<void> {\n const cwd = io.cwd();\n const inputPath = resolveFromCwd(cwd, options.input ?? \".env.example\");\n const outputPath = resolveFromCwd(cwd, options.output ?? (await getDefaultEnvOutputPath(cwd)));\n\n const source = await readTextFileOrThrow(inputPath, \"input file\");\n const dotenv = decodeDotenvText(source);\n const prefix = resolvePrefix(options);\n\n const inferred = inferModel(dotenv, { prefix });\n const generated = generateEnvTs(inferred);\n\n await ensureWritableTarget(outputPath, options.force);\n await writeFileAtomic(outputPath, generated);\n\n io.stdout(`Generated ${outputPath}\\n`);\n}\n\nasync function runAddExample(options: AddExampleOptions, io: CliIO): Promise<void> {\n const cwd = io.cwd();\n const defaultInput = await getDefaultExampleInputPath(cwd);\n const inputPath = resolveFromCwd(cwd, options.input ?? defaultInput);\n const outputPath = resolveFromCwd(cwd, options.output ?? \".env.example\");\n\n const source = await readTextFileOrThrow(inputPath, \"input env.ts\");\n const manifest = decodeManifestFromSource(source);\n const generated = generateExample(manifest);\n\n await ensureWritableTarget(outputPath, options.force);\n await writeFileAtomic(outputPath, generated);\n\n io.stdout(`Generated ${outputPath}\\n`);\n}\n\nfunction resolvePrefix(options: AddEnvOptions): PrefixConfig {\n const fromFramework = options.framework ? FRAMEWORK_PREFIXES[options.framework] : undefined;\n\n return {\n server: options.serverPrefix ?? fromFramework?.server ?? \"\",\n client: options.clientPrefix ?? fromFramework?.client ?? \"\",\n shared: options.sharedPrefix ?? fromFramework?.shared ?? \"\",\n };\n}\n\ntype FlagSpec = Record<string, \"string\" | \"boolean\">;\n\nfunction parseFlags(args: ReadonlyArray<string>, spec: FlagSpec): Record<string, string | boolean> {\n const parsed: Record<string, string | boolean> = {};\n for (let index = 0; index < args.length; index += 1) {\n const token = args[index];\n if (!token.startsWith(\"--\")) {\n throw new Error(`Unexpected argument \"${token}\"`);\n }\n\n const [nameWithPrefix, inlineValue] = token.split(\"=\", 2);\n const name = nameWithPrefix.slice(2);\n const expected = spec[name];\n if (!expected) {\n throw new Error(`Unknown option \"--${name}\"`);\n }\n\n if (expected === \"boolean\") {\n if (inlineValue !== undefined) {\n parsed[name] = inlineValue !== \"false\";\n } else {\n parsed[name] = true;\n }\n continue;\n }\n\n if (inlineValue !== undefined) {\n parsed[name] = inlineValue;\n continue;\n }\n\n const next = args[index + 1];\n if (!next || next.startsWith(\"--\")) {\n throw new Error(`Option \"--${name}\" requires a value`);\n }\n\n parsed[name] = next;\n index += 1;\n }\n\n return parsed;\n}\n\nfunction parseAddEnvOptions(args: ReadonlyArray<string>): AddEnvOptions {\n const parsed = parseFlags(args, {\n input: \"string\",\n output: \"string\",\n framework: \"string\",\n \"client-prefix\": \"string\",\n \"server-prefix\": \"string\",\n \"shared-prefix\": \"string\",\n force: \"boolean\",\n help: \"boolean\",\n });\n\n const frameworkValue = parsed.framework;\n if (frameworkValue !== undefined) {\n if (typeof frameworkValue !== \"string\" || !FRAMEWORKS.includes(frameworkValue as Framework)) {\n throw new Error(`Invalid value for --framework. Expected one of: ${FRAMEWORKS.join(\", \")}.`);\n }\n }\n\n return {\n input: asOptionalString(parsed.input),\n output: asOptionalString(parsed.output),\n framework: frameworkValue as Framework | undefined,\n clientPrefix: asOptionalString(parsed[\"client-prefix\"]),\n serverPrefix: asOptionalString(parsed[\"server-prefix\"]),\n sharedPrefix: asOptionalString(parsed[\"shared-prefix\"]),\n force: Boolean(parsed.force),\n help: Boolean(parsed.help),\n };\n}\n\nfunction parseAddExampleOptions(args: ReadonlyArray<string>): AddExampleOptions {\n const parsed = parseFlags(args, {\n input: \"string\",\n output: \"string\",\n force: \"boolean\",\n help: \"boolean\",\n });\n\n return {\n input: asOptionalString(parsed.input),\n output: asOptionalString(parsed.output),\n force: Boolean(parsed.force),\n help: Boolean(parsed.help),\n };\n}\n\nfunction asOptionalString(value: string | boolean | undefined): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction getRootHelpText(): string {\n return [\n \"Usage:\",\n \" envil add env [options]\",\n \" envil add example [options]\",\n \"\",\n getAddHelpText().trimEnd(),\n \"\",\n ].join(\"\\n\");\n}\n\nfunction getAddHelpText(): string {\n return [\n \"Subcommands:\",\n \" envil add env Infer env.ts from .env.example\",\n \" envil add example Recreate .env.example from env.ts manifest\",\n \"\",\n \"Use --help on each subcommand for details.\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction getAddEnvHelpText(): string {\n return [\n \"Usage:\",\n \" envil add env [options]\",\n \"\",\n \"Options:\",\n \" --input <path> Input .env.example path (default: .env.example)\",\n \" --output <path> Output env.ts path (default: src/env.ts or env.ts)\",\n \" --framework <name> Prefix preset: nextjs|vite|expo|nuxt|sveltekit|astro\",\n \" --client-prefix <value> Client runtime prefix override\",\n \" --server-prefix <value> Server runtime prefix override\",\n \" --shared-prefix <value> Shared runtime prefix override\",\n \" --force Overwrite output file if it exists\",\n \" --help Show this help text\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction getAddExampleHelpText(): string {\n return [\n \"Usage:\",\n \" envil add example [options]\",\n \"\",\n \"Options:\",\n \" --input <path> Input env.ts path (default: env.ts, then src/env.ts fallback)\",\n \" --output <path> Output .env.example path (default: .env.example)\",\n \" --force Overwrite output file if it exists\",\n \" --help Show this help text\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nif (import.meta.main) {\n const exitCode = await runCli(process.argv.slice(2));\n process.exit(exitCode);\n}\n"
14
+ ],
15
+ "mappings": "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",
16
+ "debugId": "B3DBC46CBE56A44864756E2164756E21",
17
+ "names": []
18
+ }
package/dist/env.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { Effect } from "effect";
2
+ import { EnvValidationError } from "./errors.ts";
3
+ import type { ResolverError, ResolverResult } from "./resolvers/types.ts";
4
+ import type { AnyEnv, EnvOptions, EnvResult, EnvResultAutoRedacted, ExtractResolverKeys, PrefixMap, PrefixStr, SchemaDict } from "./types.ts";
5
+ export declare function createEnv<TServer extends SchemaDict = {}, TClient extends SchemaDict = {}, TShared extends SchemaDict = {}, const TExtends extends readonly AnyEnv[] = readonly [], const TResolvers extends readonly Effect.Effect<ResolverResult<any>, ResolverError>[] = readonly []>(opts: EnvOptions<TServer, TClient, TShared, TExtends> & {
6
+ resolvers: TResolvers;
7
+ autoRedactResolver: false;
8
+ }): Effect.Effect<EnvResult<TExtends, TServer, TClient, TShared>, ResolverError | EnvValidationError>;
9
+ export declare function createEnv<TServer extends SchemaDict = {}, TClient extends SchemaDict = {}, TShared extends SchemaDict = {}, const TExtends extends readonly AnyEnv[] = readonly [], const TResolvers extends readonly Effect.Effect<ResolverResult<any>, ResolverError>[] = readonly [], const TPrefix extends string | PrefixMap | undefined = undefined>(opts: EnvOptions<TServer, TClient, TShared, TExtends> & {
10
+ resolvers: TResolvers;
11
+ autoRedactResolver?: true;
12
+ prefix?: TPrefix;
13
+ }): Effect.Effect<EnvResultAutoRedacted<TExtends, TServer, TClient, TShared, ExtractResolverKeys<TResolvers>, PrefixStr<TPrefix>>, ResolverError | EnvValidationError>;
14
+ export declare function createEnv<TServer extends SchemaDict = {}, TClient extends SchemaDict = {}, TShared extends SchemaDict = {}, const TExtends extends readonly AnyEnv[] = readonly []>(opts: EnvOptions<TServer, TClient, TShared, TExtends>): EnvResult<TExtends, TServer, TClient, TShared>;
@@ -0,0 +1,10 @@
1
+ export declare class EnvValidationError extends Error {
2
+ readonly _tag: "EnvValidationError";
3
+ readonly errors: ReadonlyArray<string>;
4
+ constructor(errors: ReadonlyArray<string>);
5
+ }
6
+ export declare class ClientAccessError extends Error {
7
+ readonly _tag: "ClientAccessError";
8
+ readonly variableName: string;
9
+ constructor(variableName: string);
10
+ }
@@ -0,0 +1,7 @@
1
+ export { createEnv } from "./env.ts";
2
+ export { ClientAccessError, EnvValidationError } from "./errors.ts";
3
+ export { fromRemoteSecrets } from "./resolvers/remote.ts";
4
+ export type { SecretClient } from "./resolvers/types.ts";
5
+ export { safeCreateEnv } from "./safe-env.ts";
6
+ export type { SafeCreateEnvFailure, SafeCreateEnvResult, SafeCreateEnvSuccess, } from "./safe-env.ts";
7
+ export * from "./schemas.ts";