env-health 0.1.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.
- package/README.md +309 -0
- package/dist/index.cjs +397 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +186 -0
- package/dist/index.d.ts +186 -0
- package/dist/index.js +387 -0
- package/dist/index.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error.ts","../src/parse.ts","../src/utils.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export type EnvIssue =\r\n | { kind: \"missing\"; key: string; expected: string }\r\n | { kind: \"invalid\"; key: string; expected: string; received: string };\r\n\r\nexport class EnvHealthError extends Error {\r\n public readonly issues: EnvIssue[];\r\n public readonly exampleEnv: string;\r\n\r\n constructor(message: string, issues: EnvIssue[], exampleEnv: string) {\r\n super(message);\r\n this.name = \"EnvHealthError\";\r\n this.issues = issues;\r\n this.exampleEnv = exampleEnv;\r\n }\r\n}\r\n","const URL_RE = /^https?:\\/\\/.+/i;\r\n\r\nexport function parseIntStrict(raw: string): number | null {\r\n if (!/^-?\\d+$/.test(raw.trim())) return null;\r\n const n = Number(raw);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n\r\nexport function parseFloatStrict(raw: string): number | null {\r\n const s = raw.trim();\r\n if (s.length === 0) return null;\r\n const n = Number(s);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n\r\nexport function parseBoolStrict(raw: string): boolean | null {\r\n const v = raw.trim().toLowerCase();\r\n if ([\"true\", \"1\", \"yes\", \"y\", \"on\"].includes(v)) return true;\r\n if ([\"false\", \"0\", \"no\", \"n\", \"off\"].includes(v)) return false;\r\n return null;\r\n}\r\n\r\nexport function parseUrlStrict(raw: string): string | null {\r\n const s = raw.trim();\r\n if (!URL_RE.test(s)) return null;\r\n try {\r\n new URL(s);\r\n return s;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function parseJsonStrict(raw: string): unknown | null {\r\n try {\r\n return JSON.parse(raw);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import { parseBoolStrict, parseFloatStrict, parseIntStrict } from \"./parse\";\r\nimport type { PrimitiveTypeName } from \"./types\";\r\n\r\n/**\r\n * Require an environment variable. Throws if missing.\r\n *\r\n * @param key - Environment variable name\r\n * @param env - Optional environment object (defaults to process.env)\r\n * @returns The environment variable value\r\n * @throws Error if the variable is missing\r\n *\r\n * @example\r\n * ```ts\r\n * const apiKey = requireEnv(\"API_KEY\");\r\n * ```\r\n */\r\nexport function requireEnv(\r\n key: string,\r\n env: NodeJS.ProcessEnv = process.env,\r\n): string {\r\n const value = env[key];\r\n if (value == null || value === \"\") {\r\n throw new Error(`Missing required environment variable: ${key}`);\r\n }\r\n return value;\r\n}\r\n\r\n/**\r\n * Get an environment variable with optional default value and type conversion.\r\n *\r\n * @param key - Environment variable name\r\n * @param options - Options object\r\n * @param options.default - Default value if variable is missing\r\n * @param options.type - Type to convert to (\"string\" | \"int\" | \"float\" | \"bool\")\r\n * @param options.env - Optional environment object (defaults to process.env)\r\n * @returns The environment variable value (converted if type specified) or default\r\n *\r\n * @example\r\n * ```ts\r\n * const port = getEnv(\"PORT\", { type: \"int\", default: 3000 });\r\n * const debug = getEnv(\"DEBUG\", { type: \"bool\", default: false });\r\n * ```\r\n */\r\nexport function getEnv<T extends PrimitiveTypeName = \"string\">(\r\n key: string,\r\n options?: {\r\n default?: T extends \"string\"\r\n ? string\r\n : T extends \"int\" | \"float\"\r\n ? number\r\n : T extends \"bool\"\r\n ? boolean\r\n : string;\r\n type?: T;\r\n env?: NodeJS.ProcessEnv;\r\n },\r\n): T extends \"string\"\r\n ? string\r\n : T extends \"int\" | \"float\"\r\n ? number\r\n : T extends \"bool\"\r\n ? boolean\r\n : string {\r\n const env = options?.env ?? process.env;\r\n const raw = env[key];\r\n const defaultValue = options?.default;\r\n\r\n if (raw == null || raw === \"\") {\r\n if (defaultValue !== undefined) {\r\n return defaultValue as any;\r\n }\r\n throw new Error(`Missing environment variable: ${key}`);\r\n }\r\n\r\n const type = options?.type ?? \"string\";\r\n if (type === \"string\") {\r\n return raw as any;\r\n }\r\n\r\n if (type === \"int\") {\r\n const parsed = parseIntStrict(raw);\r\n if (parsed === null) {\r\n throw new Error(\r\n `Invalid integer value for ${key}: \"${raw}\". Use a valid integer.`,\r\n );\r\n }\r\n return parsed as any;\r\n }\r\n\r\n if (type === \"float\") {\r\n const parsed = parseFloatStrict(raw);\r\n if (parsed === null) {\r\n throw new Error(\r\n `Invalid float value for ${key}: \"${raw}\". Use a valid number.`,\r\n );\r\n }\r\n return parsed as any;\r\n }\r\n\r\n if (type === \"bool\") {\r\n const parsed = parseBoolStrict(raw);\r\n if (parsed === null) {\r\n throw new Error(\r\n `Invalid boolean value for ${key}: \"${raw}\". Use true/false, 1/0, yes/no, y/n, or on/off.`,\r\n );\r\n }\r\n return parsed as any;\r\n }\r\n\r\n return raw as any;\r\n}\r\n\r\n/**\r\n * Check if one or more environment variables exist.\r\n *\r\n * @param keys - Single key or array of keys to check\r\n * @param env - Optional environment object (defaults to process.env)\r\n * @returns true if all keys exist and are non-empty, false otherwise\r\n *\r\n * @example\r\n * ```ts\r\n * if (envExists(\"API_KEY\")) {\r\n * // API_KEY exists\r\n * }\r\n *\r\n * if (envExists([\"DB_HOST\", \"DB_PORT\", \"DB_NAME\"])) {\r\n * // All database vars exist\r\n * }\r\n * ```\r\n */\r\nexport function envExists(\r\n keys: string | string[],\r\n env: NodeJS.ProcessEnv = process.env,\r\n): boolean {\r\n const keysArray = Array.isArray(keys) ? keys : [keys];\r\n return keysArray.every((key) => {\r\n const value = env[key];\r\n return value != null && value !== \"\";\r\n });\r\n}\r\n\r\n/**\r\n * Get all environment variables with a specific prefix.\r\n *\r\n * @param prefix - Prefix to filter by (e.g., \"DB_\")\r\n * @param options - Options object\r\n * @param options.stripPrefix - If true, remove prefix from keys in result\r\n * @param options.env - Optional environment object (defaults to process.env)\r\n * @returns Object with filtered environment variables\r\n *\r\n * @example\r\n * ```ts\r\n * // Get all DB_* vars with prefix stripped\r\n * const dbConfig = envPrefix(\"DB_\", { stripPrefix: true });\r\n * // { HOST: \"localhost\", PORT: \"5432\", NAME: \"mydb\" }\r\n * ```\r\n */\r\nexport function envPrefix(\r\n prefix: string,\r\n options?: {\r\n stripPrefix?: boolean;\r\n env?: NodeJS.ProcessEnv;\r\n },\r\n): Record<string, string> {\r\n const env = options?.env ?? process.env;\r\n const result: Record<string, string> = {};\r\n const stripPrefix = options?.stripPrefix ?? false;\r\n\r\n for (const [key, value] of Object.entries(env)) {\r\n if (value != null && typeof value === \"string\" && key.startsWith(prefix) && value !== \"\") {\r\n const newKey = stripPrefix ? key.slice(prefix.length) : key;\r\n result[newKey] = value;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Merge multiple environment sources. Later sources override earlier ones.\r\n *\r\n * @param sources - Array of environment objects to merge\r\n * @returns Merged environment object\r\n *\r\n * @example\r\n * ```ts\r\n * const merged = mergeEnv(\r\n * { PORT: \"3000\" },\r\n * process.env,\r\n * { DEBUG: \"true\" }\r\n * );\r\n * ```\r\n */\r\nexport function mergeEnv(\r\n ...sources: (NodeJS.ProcessEnv | Record<string, string | undefined>)[]\r\n): NodeJS.ProcessEnv {\r\n const result: NodeJS.ProcessEnv = {};\r\n for (const source of sources) {\r\n if (source) {\r\n Object.assign(result, source);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Convert environment variables to a typed object, optionally stripping a prefix.\r\n *\r\n * @param keys - Array of environment variable keys\r\n * @param options - Options object\r\n * @param options.prefix - Optional prefix to add to keys when looking up\r\n * @param options.stripPrefix - If true, remove prefix from result keys\r\n * @param options.required - Array of keys that are required (will throw if missing)\r\n * @param options.env - Optional environment object (defaults to process.env)\r\n * @returns Object with environment variable values\r\n *\r\n * @example\r\n * ```ts\r\n * const config = envToObject(\r\n * [\"HOST\", \"PORT\", \"NAME\"],\r\n * { prefix: \"DB_\", stripPrefix: true }\r\n * );\r\n * // Looks up DB_HOST, DB_PORT, DB_NAME\r\n * // Returns { HOST: \"...\", PORT: \"...\", NAME: \"...\" }\r\n * ```\r\n */\r\nexport function envToObject(\r\n keys: string[],\r\n options?: {\r\n prefix?: string;\r\n stripPrefix?: boolean;\r\n required?: string[];\r\n env?: NodeJS.ProcessEnv;\r\n },\r\n): Record<string, string> {\r\n const env = options?.env ?? process.env;\r\n const prefix = options?.prefix ?? \"\";\r\n const stripPrefix = options?.stripPrefix ?? false;\r\n const required = new Set(options?.required ?? []);\r\n const result: Record<string, string> = {};\r\n\r\n for (const key of keys) {\r\n const envKey = prefix + key;\r\n const value = env[envKey];\r\n\r\n if (value == null || value === \"\") {\r\n if (required.has(key)) {\r\n throw new Error(`Missing required environment variable: ${envKey}`);\r\n }\r\n continue;\r\n }\r\n\r\n const resultKey = stripPrefix ? key : envKey;\r\n result[resultKey] = value;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Load and parse a .env file content string.\r\n * Supports basic .env format: KEY=value, comments (#), and quoted values.\r\n *\r\n * @param content - Content of .env file as string\r\n * @returns Parsed environment variables object\r\n *\r\n * @example\r\n * ```ts\r\n * import { readFileSync } from \"fs\";\r\n * const content = readFileSync(\".env\", \"utf-8\");\r\n * const env = loadEnvFile(content);\r\n * ```\r\n */\r\nexport function loadEnvFile(content: string): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n const lines = content.split(/\\r?\\n/);\r\n\r\n for (const line of lines) {\r\n // Remove leading/trailing whitespace\r\n const trimmed = line.trim();\r\n\r\n // Skip empty lines and comments\r\n if (!trimmed || trimmed.startsWith(\"#\")) {\r\n continue;\r\n }\r\n\r\n // Find the first = that's not inside quotes\r\n const equalIndex = trimmed.indexOf(\"=\");\r\n if (equalIndex === -1) {\r\n continue;\r\n }\r\n\r\n const key = trimmed.slice(0, equalIndex).trim();\r\n let value = trimmed.slice(equalIndex + 1).trim();\r\n\r\n // Remove quotes if present\r\n if (\r\n (value.startsWith('\"') && value.endsWith('\"')) ||\r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\r\n ) {\r\n value = value.slice(1, -1);\r\n }\r\n\r\n // Skip if key is empty\r\n if (!key) {\r\n continue;\r\n }\r\n\r\n result[key] = value;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n","import { EnvHealthError, type EnvIssue } from \"./error\";\r\nimport type {\r\n EnvHealthOptions,\r\n OutputFromSchema,\r\n Schema,\r\n Spec,\r\n DetailedSpec,\r\n PrimitiveTypeName,\r\n} from \"./types\";\r\nimport {\r\n parseBoolStrict,\r\n parseFloatStrict,\r\n parseIntStrict,\r\n parseJsonStrict,\r\n parseUrlStrict,\r\n} from \"./parse\";\r\n\r\ntype NormalizedSpec = {\r\n kind: \"primitive\" | \"enum\";\r\n type?: PrimitiveTypeName;\r\n values?: readonly string[];\r\n optional: boolean;\r\n defaultValue?: unknown;\r\n example?: string | undefined;\r\n};\r\n\r\n// Type guards for better type narrowing\r\nfunction isArraySpec(spec: Spec): spec is readonly string[] {\r\n return Array.isArray(spec);\r\n}\r\n\r\nfunction isStringSpec(spec: Spec): spec is PrimitiveTypeName {\r\n return typeof spec === \"string\";\r\n}\r\n\r\nfunction isEnumDetailedSpec(\r\n spec: DetailedSpec,\r\n): spec is Extract<DetailedSpec, { type: \"enum\" }> {\r\n return spec.type === \"enum\";\r\n}\r\n\r\nfunction isPrimitiveDetailedSpec(\r\n spec: DetailedSpec,\r\n): spec is Extract<DetailedSpec, { type: PrimitiveTypeName }> {\r\n return spec.type !== \"enum\";\r\n}\r\n\r\nfunction expectedLabel(spec: Spec): string {\r\n if (isArraySpec(spec)) {\r\n return `one of (${spec.join(\", \")})`;\r\n }\r\n if (isStringSpec(spec)) {\r\n return spec;\r\n }\r\n if (isEnumDetailedSpec(spec)) {\r\n return `one of (${spec.values.join(\", \")})`;\r\n }\r\n if (isPrimitiveDetailedSpec(spec)) {\r\n return spec.type;\r\n }\r\n return \"unknown\";\r\n}\r\n\r\nfunction normalizeSpec(spec: Spec): NormalizedSpec {\r\n if (isArraySpec(spec)) {\r\n return { kind: \"enum\", values: spec, optional: false };\r\n }\r\n if (isStringSpec(spec)) {\r\n return { kind: \"primitive\", type: spec, optional: false };\r\n }\r\n if (isEnumDetailedSpec(spec)) {\r\n return {\r\n kind: \"enum\",\r\n values: spec.values,\r\n optional: spec.optional === true,\r\n defaultValue: spec.default,\r\n example: spec.example ?? undefined,\r\n };\r\n }\r\n if (isPrimitiveDetailedSpec(spec)) {\r\n return {\r\n kind: \"primitive\",\r\n type: spec.type,\r\n optional: spec.optional === true,\r\n defaultValue: spec.default,\r\n example: spec.example ?? undefined,\r\n };\r\n }\r\n // Fallback (should never happen with proper types)\r\n return { kind: \"primitive\", type: \"string\", optional: false };\r\n}\r\n\r\n// Cache for example suggestions to avoid repeated computations\r\nconst EXAMPLE_CACHE = new Map<string, string>();\r\n\r\nfunction suggestExample(key: string, spec: Spec): string {\r\n const cacheKey = `${key}:${JSON.stringify(spec)}`;\r\n const cached = EXAMPLE_CACHE.get(cacheKey);\r\n if (cached) return cached;\r\n\r\n const n = normalizeSpec(spec);\r\n let example: string;\r\n\r\n if (n.example) {\r\n example = n.example;\r\n } else if (n.kind === \"enum\" && n.values && n.values.length > 0) {\r\n example = String(n.values[0]);\r\n } else {\r\n const upperKey = key.toUpperCase();\r\n switch (n.type) {\r\n case \"int\":\r\n example = \"3000\";\r\n break;\r\n case \"float\":\r\n example = \"0.5\";\r\n break;\r\n case \"bool\":\r\n example = \"true\";\r\n break;\r\n case \"url\":\r\n // DATABASE_URL is super common; give nicer placeholder\r\n example =\r\n upperKey.includes(\"DATABASE\") && upperKey.includes(\"URL\")\r\n ? \"postgres://user:pass@localhost:5432/db\"\r\n : \"https://example.com\";\r\n break;\r\n case \"json\":\r\n example = '{\"key\":\"value\"}';\r\n break;\r\n default:\r\n example = \"your_value_here\";\r\n }\r\n }\r\n\r\n EXAMPLE_CACHE.set(cacheKey, example);\r\n return example;\r\n}\r\n\r\nfunction parseByType(\r\n type: PrimitiveTypeName,\r\n raw: string,\r\n): { ok: true; value: unknown } | { ok: false } {\r\n switch (type) {\r\n case \"string\":\r\n return { ok: true, value: raw };\r\n case \"int\": {\r\n const n = parseIntStrict(raw);\r\n return n === null ? { ok: false } : { ok: true, value: n };\r\n }\r\n case \"float\": {\r\n const n = parseFloatStrict(raw);\r\n return n === null ? { ok: false } : { ok: true, value: n };\r\n }\r\n case \"bool\": {\r\n const b = parseBoolStrict(raw);\r\n return b === null ? { ok: false } : { ok: true, value: b };\r\n }\r\n case \"url\": {\r\n const u = parseUrlStrict(raw);\r\n return u === null ? { ok: false } : { ok: true, value: u };\r\n }\r\n case \"json\": {\r\n const j = parseJsonStrict(raw);\r\n return j === null ? { ok: false } : { ok: true, value: j };\r\n }\r\n }\r\n}\r\n\r\nfunction buildExampleEnv(schema: Schema, opts: EnvHealthOptions): string {\r\n const lines: string[] = [];\r\n\r\n for (const [key, spec] of Object.entries(schema)) {\r\n const n = normalizeSpec(spec);\r\n const example = opts.blankExampleValues ? \"\" : suggestExample(key, spec);\r\n const optionalSuffix = n.optional ? \" # optional\" : \"\";\r\n lines.push(`${key}=${example}${optionalSuffix}`.trimEnd());\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nexport function envHealth<const TSchema extends Schema>(\r\n schema: TSchema,\r\n options: EnvHealthOptions = {},\r\n): OutputFromSchema<TSchema> {\r\n const env = options.env ?? process.env;\r\n const issues: EnvIssue[] = [];\r\n const out: Record<string, unknown> = {};\r\n\r\n // Single pass through schema entries\r\n for (const [key, spec] of Object.entries(schema)) {\r\n const n = normalizeSpec(spec);\r\n const expected = expectedLabel(spec);\r\n const raw = env[key];\r\n\r\n // Handle missing or empty values\r\n if (raw == null || raw === \"\") {\r\n if (n.defaultValue !== undefined) {\r\n out[key] = n.defaultValue;\r\n continue;\r\n }\r\n if (n.optional) {\r\n out[key] = undefined;\r\n continue;\r\n }\r\n issues.push({ kind: \"missing\", key, expected });\r\n continue;\r\n }\r\n\r\n // Handle enum validation\r\n if (n.kind === \"enum\") {\r\n const values = n.values;\r\n if (values && values.includes(raw)) {\r\n out[key] = raw;\r\n } else {\r\n issues.push({ kind: \"invalid\", key, expected, received: raw });\r\n }\r\n continue;\r\n }\r\n\r\n // Handle primitive type parsing\r\n const type = n.type ?? \"string\";\r\n const parsed = parseByType(type, raw);\r\n if (parsed.ok) {\r\n out[key] = parsed.value;\r\n } else {\r\n issues.push({ kind: \"invalid\", key, expected, received: raw });\r\n }\r\n }\r\n\r\n // Build error message only if there are issues\r\n if (issues.length > 0) {\r\n const exampleEnv = buildExampleEnv(schema, options);\r\n const header = options.header ? `${options.header}\\n` : \"\";\r\n const lines: string[] = [\r\n header\r\n ? `${header}Environment validation failed:\\n`\r\n : \"Environment validation failed:\\n\",\r\n ];\r\n\r\n // Separate missing and invalid issues in a single pass\r\n const missing: Extract<EnvIssue, { kind: \"missing\" }>[] = [];\r\n const invalid: Extract<EnvIssue, { kind: \"invalid\" }>[] = [];\r\n\r\n for (let i = 0; i < issues.length; i++) {\r\n const issue = issues[i];\r\n if (!issue) continue;\r\n if (issue.kind === \"missing\") {\r\n missing.push(issue);\r\n } else {\r\n invalid.push(issue);\r\n }\r\n }\r\n\r\n if (missing.length > 0) {\r\n lines.push(\"Missing required variables:\");\r\n for (let i = 0; i < missing.length; i++) {\r\n const m = missing[i];\r\n if (m) {\r\n lines.push(` - ${m.key} (expected: ${m.expected})`);\r\n }\r\n }\r\n lines.push(\"\");\r\n }\r\n\r\n if (invalid.length > 0) {\r\n lines.push(\"Invalid variables:\");\r\n for (let i = 0; i < invalid.length; i++) {\r\n const v = invalid[i];\r\n if (v) {\r\n lines.push(` - ${v.key}=\"${v.received}\" (expected: ${v.expected})`);\r\n }\r\n }\r\n lines.push(\"\");\r\n }\r\n\r\n lines.push(\"Example .env:\");\r\n lines.push(\"------------\");\r\n lines.push(exampleEnv);\r\n\r\n throw new EnvHealthError(lines.join(\"\\n\"), issues, exampleEnv);\r\n }\r\n\r\n return out as OutputFromSchema<TSchema>;\r\n}\r\n\r\nexport { EnvHealthError } from \"./error\";\r\nexport type { EnvHealthOptions, Schema, Spec, OutputFromSchema } from \"./types\";\r\nexport {\r\n requireEnv,\r\n getEnv,\r\n envExists,\r\n envPrefix,\r\n mergeEnv,\r\n envToObject,\r\n loadEnvFile,\r\n} from \"./utils\";\r\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
type PrimitiveTypeName = "string" | "int" | "float" | "bool" | "url" | "json";
|
|
2
|
+
type EnumSpec<T extends readonly string[]> = T;
|
|
3
|
+
type DetailedSpec = {
|
|
4
|
+
type: PrimitiveTypeName;
|
|
5
|
+
optional?: true;
|
|
6
|
+
default?: string | number | boolean;
|
|
7
|
+
example?: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: "enum";
|
|
10
|
+
values: readonly string[];
|
|
11
|
+
optional?: true;
|
|
12
|
+
default?: string;
|
|
13
|
+
example?: string;
|
|
14
|
+
};
|
|
15
|
+
type Spec<TEnum extends readonly string[] = readonly string[]> = PrimitiveTypeName | EnumSpec<TEnum> | DetailedSpec;
|
|
16
|
+
type Schema = Record<string, Spec>;
|
|
17
|
+
type TypeFromSpec<S> = S extends "string" ? string : S extends "int" ? number : S extends "float" ? number : S extends "bool" ? boolean : S extends "url" ? string : S extends "json" ? unknown : S extends readonly (infer U)[] ? U extends string ? U : never : S extends {
|
|
18
|
+
type: "enum";
|
|
19
|
+
values: readonly (infer U)[];
|
|
20
|
+
} ? U extends string ? U : never : S extends {
|
|
21
|
+
type: infer T;
|
|
22
|
+
} ? T extends "string" ? string : T extends "int" ? number : T extends "float" ? number : T extends "bool" ? boolean : T extends "url" ? string : T extends "json" ? unknown : unknown : unknown;
|
|
23
|
+
type OutputFromSchema<TSchema extends Schema> = {
|
|
24
|
+
[K in keyof TSchema]: TSchema[K] extends {
|
|
25
|
+
optional: true;
|
|
26
|
+
} ? TypeFromSpec<TSchema[K]> | undefined : TypeFromSpec<TSchema[K]>;
|
|
27
|
+
};
|
|
28
|
+
type EnvHealthOptions = {
|
|
29
|
+
env?: NodeJS.ProcessEnv;
|
|
30
|
+
header?: string;
|
|
31
|
+
/** If true, example block uses "KEY=" for missing values instead of a suggested placeholder */
|
|
32
|
+
blankExampleValues?: boolean;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type EnvIssue = {
|
|
36
|
+
kind: "missing";
|
|
37
|
+
key: string;
|
|
38
|
+
expected: string;
|
|
39
|
+
} | {
|
|
40
|
+
kind: "invalid";
|
|
41
|
+
key: string;
|
|
42
|
+
expected: string;
|
|
43
|
+
received: string;
|
|
44
|
+
};
|
|
45
|
+
declare class EnvHealthError extends Error {
|
|
46
|
+
readonly issues: EnvIssue[];
|
|
47
|
+
readonly exampleEnv: string;
|
|
48
|
+
constructor(message: string, issues: EnvIssue[], exampleEnv: string);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Require an environment variable. Throws if missing.
|
|
53
|
+
*
|
|
54
|
+
* @param key - Environment variable name
|
|
55
|
+
* @param env - Optional environment object (defaults to process.env)
|
|
56
|
+
* @returns The environment variable value
|
|
57
|
+
* @throws Error if the variable is missing
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const apiKey = requireEnv("API_KEY");
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
declare function requireEnv(key: string, env?: NodeJS.ProcessEnv): string;
|
|
65
|
+
/**
|
|
66
|
+
* Get an environment variable with optional default value and type conversion.
|
|
67
|
+
*
|
|
68
|
+
* @param key - Environment variable name
|
|
69
|
+
* @param options - Options object
|
|
70
|
+
* @param options.default - Default value if variable is missing
|
|
71
|
+
* @param options.type - Type to convert to ("string" | "int" | "float" | "bool")
|
|
72
|
+
* @param options.env - Optional environment object (defaults to process.env)
|
|
73
|
+
* @returns The environment variable value (converted if type specified) or default
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const port = getEnv("PORT", { type: "int", default: 3000 });
|
|
78
|
+
* const debug = getEnv("DEBUG", { type: "bool", default: false });
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
declare function getEnv<T extends PrimitiveTypeName = "string">(key: string, options?: {
|
|
82
|
+
default?: T extends "string" ? string : T extends "int" | "float" ? number : T extends "bool" ? boolean : string;
|
|
83
|
+
type?: T;
|
|
84
|
+
env?: NodeJS.ProcessEnv;
|
|
85
|
+
}): T extends "string" ? string : T extends "int" | "float" ? number : T extends "bool" ? boolean : string;
|
|
86
|
+
/**
|
|
87
|
+
* Check if one or more environment variables exist.
|
|
88
|
+
*
|
|
89
|
+
* @param keys - Single key or array of keys to check
|
|
90
|
+
* @param env - Optional environment object (defaults to process.env)
|
|
91
|
+
* @returns true if all keys exist and are non-empty, false otherwise
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* if (envExists("API_KEY")) {
|
|
96
|
+
* // API_KEY exists
|
|
97
|
+
* }
|
|
98
|
+
*
|
|
99
|
+
* if (envExists(["DB_HOST", "DB_PORT", "DB_NAME"])) {
|
|
100
|
+
* // All database vars exist
|
|
101
|
+
* }
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
declare function envExists(keys: string | string[], env?: NodeJS.ProcessEnv): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Get all environment variables with a specific prefix.
|
|
107
|
+
*
|
|
108
|
+
* @param prefix - Prefix to filter by (e.g., "DB_")
|
|
109
|
+
* @param options - Options object
|
|
110
|
+
* @param options.stripPrefix - If true, remove prefix from keys in result
|
|
111
|
+
* @param options.env - Optional environment object (defaults to process.env)
|
|
112
|
+
* @returns Object with filtered environment variables
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* // Get all DB_* vars with prefix stripped
|
|
117
|
+
* const dbConfig = envPrefix("DB_", { stripPrefix: true });
|
|
118
|
+
* // { HOST: "localhost", PORT: "5432", NAME: "mydb" }
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
declare function envPrefix(prefix: string, options?: {
|
|
122
|
+
stripPrefix?: boolean;
|
|
123
|
+
env?: NodeJS.ProcessEnv;
|
|
124
|
+
}): Record<string, string>;
|
|
125
|
+
/**
|
|
126
|
+
* Merge multiple environment sources. Later sources override earlier ones.
|
|
127
|
+
*
|
|
128
|
+
* @param sources - Array of environment objects to merge
|
|
129
|
+
* @returns Merged environment object
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```ts
|
|
133
|
+
* const merged = mergeEnv(
|
|
134
|
+
* { PORT: "3000" },
|
|
135
|
+
* process.env,
|
|
136
|
+
* { DEBUG: "true" }
|
|
137
|
+
* );
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
declare function mergeEnv(...sources: (NodeJS.ProcessEnv | Record<string, string | undefined>)[]): NodeJS.ProcessEnv;
|
|
141
|
+
/**
|
|
142
|
+
* Convert environment variables to a typed object, optionally stripping a prefix.
|
|
143
|
+
*
|
|
144
|
+
* @param keys - Array of environment variable keys
|
|
145
|
+
* @param options - Options object
|
|
146
|
+
* @param options.prefix - Optional prefix to add to keys when looking up
|
|
147
|
+
* @param options.stripPrefix - If true, remove prefix from result keys
|
|
148
|
+
* @param options.required - Array of keys that are required (will throw if missing)
|
|
149
|
+
* @param options.env - Optional environment object (defaults to process.env)
|
|
150
|
+
* @returns Object with environment variable values
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```ts
|
|
154
|
+
* const config = envToObject(
|
|
155
|
+
* ["HOST", "PORT", "NAME"],
|
|
156
|
+
* { prefix: "DB_", stripPrefix: true }
|
|
157
|
+
* );
|
|
158
|
+
* // Looks up DB_HOST, DB_PORT, DB_NAME
|
|
159
|
+
* // Returns { HOST: "...", PORT: "...", NAME: "..." }
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
declare function envToObject(keys: string[], options?: {
|
|
163
|
+
prefix?: string;
|
|
164
|
+
stripPrefix?: boolean;
|
|
165
|
+
required?: string[];
|
|
166
|
+
env?: NodeJS.ProcessEnv;
|
|
167
|
+
}): Record<string, string>;
|
|
168
|
+
/**
|
|
169
|
+
* Load and parse a .env file content string.
|
|
170
|
+
* Supports basic .env format: KEY=value, comments (#), and quoted values.
|
|
171
|
+
*
|
|
172
|
+
* @param content - Content of .env file as string
|
|
173
|
+
* @returns Parsed environment variables object
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```ts
|
|
177
|
+
* import { readFileSync } from "fs";
|
|
178
|
+
* const content = readFileSync(".env", "utf-8");
|
|
179
|
+
* const env = loadEnvFile(content);
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
declare function loadEnvFile(content: string): Record<string, string>;
|
|
183
|
+
|
|
184
|
+
declare function envHealth<const TSchema extends Schema>(schema: TSchema, options?: EnvHealthOptions): OutputFromSchema<TSchema>;
|
|
185
|
+
|
|
186
|
+
export { EnvHealthError, type EnvHealthOptions, type OutputFromSchema, type Schema, type Spec, envExists, envHealth, envPrefix, envToObject, getEnv, loadEnvFile, mergeEnv, requireEnv };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
type PrimitiveTypeName = "string" | "int" | "float" | "bool" | "url" | "json";
|
|
2
|
+
type EnumSpec<T extends readonly string[]> = T;
|
|
3
|
+
type DetailedSpec = {
|
|
4
|
+
type: PrimitiveTypeName;
|
|
5
|
+
optional?: true;
|
|
6
|
+
default?: string | number | boolean;
|
|
7
|
+
example?: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: "enum";
|
|
10
|
+
values: readonly string[];
|
|
11
|
+
optional?: true;
|
|
12
|
+
default?: string;
|
|
13
|
+
example?: string;
|
|
14
|
+
};
|
|
15
|
+
type Spec<TEnum extends readonly string[] = readonly string[]> = PrimitiveTypeName | EnumSpec<TEnum> | DetailedSpec;
|
|
16
|
+
type Schema = Record<string, Spec>;
|
|
17
|
+
type TypeFromSpec<S> = S extends "string" ? string : S extends "int" ? number : S extends "float" ? number : S extends "bool" ? boolean : S extends "url" ? string : S extends "json" ? unknown : S extends readonly (infer U)[] ? U extends string ? U : never : S extends {
|
|
18
|
+
type: "enum";
|
|
19
|
+
values: readonly (infer U)[];
|
|
20
|
+
} ? U extends string ? U : never : S extends {
|
|
21
|
+
type: infer T;
|
|
22
|
+
} ? T extends "string" ? string : T extends "int" ? number : T extends "float" ? number : T extends "bool" ? boolean : T extends "url" ? string : T extends "json" ? unknown : unknown : unknown;
|
|
23
|
+
type OutputFromSchema<TSchema extends Schema> = {
|
|
24
|
+
[K in keyof TSchema]: TSchema[K] extends {
|
|
25
|
+
optional: true;
|
|
26
|
+
} ? TypeFromSpec<TSchema[K]> | undefined : TypeFromSpec<TSchema[K]>;
|
|
27
|
+
};
|
|
28
|
+
type EnvHealthOptions = {
|
|
29
|
+
env?: NodeJS.ProcessEnv;
|
|
30
|
+
header?: string;
|
|
31
|
+
/** If true, example block uses "KEY=" for missing values instead of a suggested placeholder */
|
|
32
|
+
blankExampleValues?: boolean;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type EnvIssue = {
|
|
36
|
+
kind: "missing";
|
|
37
|
+
key: string;
|
|
38
|
+
expected: string;
|
|
39
|
+
} | {
|
|
40
|
+
kind: "invalid";
|
|
41
|
+
key: string;
|
|
42
|
+
expected: string;
|
|
43
|
+
received: string;
|
|
44
|
+
};
|
|
45
|
+
declare class EnvHealthError extends Error {
|
|
46
|
+
readonly issues: EnvIssue[];
|
|
47
|
+
readonly exampleEnv: string;
|
|
48
|
+
constructor(message: string, issues: EnvIssue[], exampleEnv: string);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Require an environment variable. Throws if missing.
|
|
53
|
+
*
|
|
54
|
+
* @param key - Environment variable name
|
|
55
|
+
* @param env - Optional environment object (defaults to process.env)
|
|
56
|
+
* @returns The environment variable value
|
|
57
|
+
* @throws Error if the variable is missing
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const apiKey = requireEnv("API_KEY");
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
declare function requireEnv(key: string, env?: NodeJS.ProcessEnv): string;
|
|
65
|
+
/**
|
|
66
|
+
* Get an environment variable with optional default value and type conversion.
|
|
67
|
+
*
|
|
68
|
+
* @param key - Environment variable name
|
|
69
|
+
* @param options - Options object
|
|
70
|
+
* @param options.default - Default value if variable is missing
|
|
71
|
+
* @param options.type - Type to convert to ("string" | "int" | "float" | "bool")
|
|
72
|
+
* @param options.env - Optional environment object (defaults to process.env)
|
|
73
|
+
* @returns The environment variable value (converted if type specified) or default
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const port = getEnv("PORT", { type: "int", default: 3000 });
|
|
78
|
+
* const debug = getEnv("DEBUG", { type: "bool", default: false });
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
declare function getEnv<T extends PrimitiveTypeName = "string">(key: string, options?: {
|
|
82
|
+
default?: T extends "string" ? string : T extends "int" | "float" ? number : T extends "bool" ? boolean : string;
|
|
83
|
+
type?: T;
|
|
84
|
+
env?: NodeJS.ProcessEnv;
|
|
85
|
+
}): T extends "string" ? string : T extends "int" | "float" ? number : T extends "bool" ? boolean : string;
|
|
86
|
+
/**
|
|
87
|
+
* Check if one or more environment variables exist.
|
|
88
|
+
*
|
|
89
|
+
* @param keys - Single key or array of keys to check
|
|
90
|
+
* @param env - Optional environment object (defaults to process.env)
|
|
91
|
+
* @returns true if all keys exist and are non-empty, false otherwise
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* if (envExists("API_KEY")) {
|
|
96
|
+
* // API_KEY exists
|
|
97
|
+
* }
|
|
98
|
+
*
|
|
99
|
+
* if (envExists(["DB_HOST", "DB_PORT", "DB_NAME"])) {
|
|
100
|
+
* // All database vars exist
|
|
101
|
+
* }
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
declare function envExists(keys: string | string[], env?: NodeJS.ProcessEnv): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Get all environment variables with a specific prefix.
|
|
107
|
+
*
|
|
108
|
+
* @param prefix - Prefix to filter by (e.g., "DB_")
|
|
109
|
+
* @param options - Options object
|
|
110
|
+
* @param options.stripPrefix - If true, remove prefix from keys in result
|
|
111
|
+
* @param options.env - Optional environment object (defaults to process.env)
|
|
112
|
+
* @returns Object with filtered environment variables
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* // Get all DB_* vars with prefix stripped
|
|
117
|
+
* const dbConfig = envPrefix("DB_", { stripPrefix: true });
|
|
118
|
+
* // { HOST: "localhost", PORT: "5432", NAME: "mydb" }
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
declare function envPrefix(prefix: string, options?: {
|
|
122
|
+
stripPrefix?: boolean;
|
|
123
|
+
env?: NodeJS.ProcessEnv;
|
|
124
|
+
}): Record<string, string>;
|
|
125
|
+
/**
|
|
126
|
+
* Merge multiple environment sources. Later sources override earlier ones.
|
|
127
|
+
*
|
|
128
|
+
* @param sources - Array of environment objects to merge
|
|
129
|
+
* @returns Merged environment object
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```ts
|
|
133
|
+
* const merged = mergeEnv(
|
|
134
|
+
* { PORT: "3000" },
|
|
135
|
+
* process.env,
|
|
136
|
+
* { DEBUG: "true" }
|
|
137
|
+
* );
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
declare function mergeEnv(...sources: (NodeJS.ProcessEnv | Record<string, string | undefined>)[]): NodeJS.ProcessEnv;
|
|
141
|
+
/**
|
|
142
|
+
* Convert environment variables to a typed object, optionally stripping a prefix.
|
|
143
|
+
*
|
|
144
|
+
* @param keys - Array of environment variable keys
|
|
145
|
+
* @param options - Options object
|
|
146
|
+
* @param options.prefix - Optional prefix to add to keys when looking up
|
|
147
|
+
* @param options.stripPrefix - If true, remove prefix from result keys
|
|
148
|
+
* @param options.required - Array of keys that are required (will throw if missing)
|
|
149
|
+
* @param options.env - Optional environment object (defaults to process.env)
|
|
150
|
+
* @returns Object with environment variable values
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```ts
|
|
154
|
+
* const config = envToObject(
|
|
155
|
+
* ["HOST", "PORT", "NAME"],
|
|
156
|
+
* { prefix: "DB_", stripPrefix: true }
|
|
157
|
+
* );
|
|
158
|
+
* // Looks up DB_HOST, DB_PORT, DB_NAME
|
|
159
|
+
* // Returns { HOST: "...", PORT: "...", NAME: "..." }
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
declare function envToObject(keys: string[], options?: {
|
|
163
|
+
prefix?: string;
|
|
164
|
+
stripPrefix?: boolean;
|
|
165
|
+
required?: string[];
|
|
166
|
+
env?: NodeJS.ProcessEnv;
|
|
167
|
+
}): Record<string, string>;
|
|
168
|
+
/**
|
|
169
|
+
* Load and parse a .env file content string.
|
|
170
|
+
* Supports basic .env format: KEY=value, comments (#), and quoted values.
|
|
171
|
+
*
|
|
172
|
+
* @param content - Content of .env file as string
|
|
173
|
+
* @returns Parsed environment variables object
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```ts
|
|
177
|
+
* import { readFileSync } from "fs";
|
|
178
|
+
* const content = readFileSync(".env", "utf-8");
|
|
179
|
+
* const env = loadEnvFile(content);
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
declare function loadEnvFile(content: string): Record<string, string>;
|
|
183
|
+
|
|
184
|
+
declare function envHealth<const TSchema extends Schema>(schema: TSchema, options?: EnvHealthOptions): OutputFromSchema<TSchema>;
|
|
185
|
+
|
|
186
|
+
export { EnvHealthError, type EnvHealthOptions, type OutputFromSchema, type Schema, type Spec, envExists, envHealth, envPrefix, envToObject, getEnv, loadEnvFile, mergeEnv, requireEnv };
|