envapt 4.0.0 → 4.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Error.ts","../src/ListOfBuiltInConverters.ts","../src/Validators.ts","../src/core/EnvapterBase.ts","../src/BuiltInConverters.ts","../src/Parser.ts","../src/core/EnvironmentMethods.ts","../src/core/PrimitiveMethods.ts","../src/core/AdvancedMethods.ts","../src/Envapter.ts","../src/Envapt.ts","../src/Converters.ts"],"names":["EnvaptErrorCodes","config","fs","process","parsed","Environment","Converters"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable no-magic-numbers */\nexport enum EnvaptErrorCodes {\n // Fallback related errors\n /** Thrown when an invalid fallback value is provided */\n InvalidFallback = 101,\n /** Thrown when fallback value type doesn't match expected converter type */\n InvalidFallbackType = 102,\n /** Thrown when array fallback contains elements of wrong type */\n ArrayFallbackElementTypeMismatch = 103,\n /** Thrown when fallback type doesn't match the specified converter */\n FallbackConverterTypeMismatch = 104,\n\n // Converter related errors\n /** Thrown when invalid array converter configuration is provided */\n InvalidArrayConverterType = 201,\n /** Thrown when an invalid built-in converter is specified */\n InvalidBuiltInConverter = 202,\n /** Thrown when a custom converter is not a function */\n InvalidCustomConverter = 203,\n /** Thrown when converter type is not recognized */\n InvalidConverterType = 204,\n /** Thrown when primitive type coercion on fallback value fails */\n PrimitiveCoercionFailed = 205,\n\n // Other errors\n /** Thrown when delimiter is missing in array converter configuration */\n // This doesn't happen because 203 is thrown when object without delimiter is passed\n MissingDelimiter = 301,\n /** Thrown when invalid user-defined configuration is provided */\n InvalidUserDefinedConfig = 302,\n /** Thrown when specified environment files don't exist */\n EnvFilesNotFound = 303\n}\n\n/**\n * Custom error for better DX and debugging when using Envapt.\n *\n * @example\n * ```ts\n * throw new EnvaptError(EnvaptErrorCode.InvalidFallback, \"Invalid fallback value provided for environment variable.\");\n * ```\n */\nexport class EnvaptError extends Error {\n public readonly code: EnvaptErrorCodes;\n\n constructor(code: EnvaptErrorCodes, message: string) {\n super(message);\n this.name = `EnvaptError [${code}]`;\n this.code = code;\n }\n}\n","import type { ConverterValue } from './Converters';\nimport type { JsonValue } from './Types';\n\n/**\n * List of built-in converters for Envapt.\n * @internal\n */\nexport const ListOfBuiltInConverters: ConverterValue[] = [\n 'string',\n 'number',\n 'boolean',\n 'bigint',\n 'symbol',\n 'integer',\n 'float',\n 'json',\n 'array',\n 'url',\n 'regexp',\n 'date',\n 'time'\n] as const;\n\n/**\n * Type checking functions for built-in converter return types.\n * @internal\n */\nexport const BuiltInConverterTypeCheckers: Record<ConverterValue, (value: unknown) => boolean> = {\n string: (value: unknown): value is string => typeof value === 'string',\n number: (value: unknown): value is number => typeof value === 'number',\n boolean: (value: unknown): value is boolean => typeof value === 'boolean',\n bigint: (value: unknown): value is bigint => typeof value === 'bigint',\n symbol: (value: unknown): value is symbol => typeof value === 'symbol',\n integer: (value: unknown): value is number => typeof value === 'number' && Number.isInteger(value),\n float: (value: unknown): value is number => typeof value === 'number',\n json: (value: unknown): value is JsonValue => {\n try {\n JSON.parse(JSON.stringify(value));\n return true;\n } catch {\n return false;\n }\n },\n array: (value: unknown): value is unknown[] => Array.isArray(value),\n url: (value: unknown): value is URL => value instanceof URL,\n regexp: (value: unknown): value is RegExp => value instanceof RegExp,\n date: (value: unknown): value is Date => value instanceof Date,\n time: (value: unknown): value is number => typeof value === 'number'\n};\n","import fs from 'node:fs';\n\nimport { EnvaptError, EnvaptErrorCodes } from './Error';\nimport { ListOfBuiltInConverters, BuiltInConverterTypeCheckers } from './ListOfBuiltInConverters';\n\nimport type {\n ArrayConverter,\n BuiltInConverter,\n ConverterFunction,\n EnvaptConverter,\n PermittedDotenvConfig,\n ValidArrayConverterBuiltInType\n} from './Types';\n\nexport class Validator {\n /**\n * Check if a value is a built-in converter type\n */\n static isBuiltInConverter<TFallback>(value: EnvaptConverter<TFallback>): value is BuiltInConverter {\n if (typeof value === 'string') return ListOfBuiltInConverters.includes(value);\n return false;\n }\n\n /**\n * Check if a value is an ArrayConverter configuration object\n */\n static isArrayConverter(value: unknown): value is ArrayConverter {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'delimiter' in value &&\n typeof (value as ArrayConverter).delimiter === 'string'\n );\n }\n\n /**\n * Check if a value is a valid ArrayConverter type\n */\n static isValidArrayConverterType(value: unknown): value is ValidArrayConverterBuiltInType {\n if (typeof value !== 'string') return false;\n\n const invalidTypes = ['array', 'json', 'regexp'];\n\n if (invalidTypes.includes(value)) return false;\n const validTypes: ValidArrayConverterBuiltInType[] = ListOfBuiltInConverters.filter(\n (type): type is ValidArrayConverterBuiltInType => !invalidTypes.includes(type)\n );\n\n return validTypes.includes(value as ValidArrayConverterBuiltInType);\n }\n\n static customConvertor<TFallback>(\n converter: EnvaptConverter<TFallback>\n ): asserts converter is ConverterFunction<TFallback> {\n if (typeof converter !== 'function') {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidCustomConverter,\n `Custom converter must be a function, got ${typeof converter}.`\n );\n }\n }\n\n /**\n * Validate ArrayConverter configuration with runtime checks\n */\n static arrayConverter(value: unknown): asserts value is ArrayConverter {\n if (!this.isArrayConverter(value)) {\n throw new EnvaptError(EnvaptErrorCodes.MissingDelimiter, 'Must have delimiter property');\n }\n\n if (value.type !== undefined && !this.isValidArrayConverterType(value.type)) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidArrayConverterType,\n `\"${value.type as string}\" is not a valid converter type`\n );\n }\n }\n\n /**\n * Validate that a string is a valid built-in converter type\n */\n static builtInConverter(value: unknown): asserts value is BuiltInConverter {\n if (typeof value !== 'string') {\n throw new EnvaptError(EnvaptErrorCodes.InvalidConverterType, `Expected string, got ${typeof value}`);\n }\n\n if (!ListOfBuiltInConverters.includes(value as BuiltInConverter)) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidBuiltInConverter,\n `\"${value}\" is not a valid converter type. Valid types are: ${ListOfBuiltInConverters.join(',')}`\n );\n }\n }\n\n /**\n * Validate that fallback type matches the converter's return type for built-in converters\n */\n static validateBuiltInConverterFallback(converter: BuiltInConverter, fallback: unknown): void {\n const typeChecker = BuiltInConverterTypeCheckers[converter];\n if (!typeChecker(fallback)) {\n throw new EnvaptError(\n EnvaptErrorCodes.FallbackConverterTypeMismatch,\n `Fallback type does not match converter \"${converter}\". Expected ${converter} compatible type.`\n );\n }\n }\n\n /**\n * Validate that all elements in an array fallback have consistent types\n */\n static validateArrayFallbackElementTypes(fallback: unknown[]): void {\n if (fallback.length === 0) return; // Empty array is valid\n\n const firstElementType = typeof fallback[0];\n const hasInconsistentTypes = fallback.some((element, index) => {\n if (index === 0) return false; // Skip first element\n return typeof element !== firstElementType;\n });\n\n if (hasInconsistentTypes) {\n throw new EnvaptError(\n EnvaptErrorCodes.ArrayFallbackElementTypeMismatch,\n `All elements in array fallback must have the same type. Found mixed types.`\n );\n }\n }\n\n /**\n * Validate that array converter type matches fallback element types\n */\n static validateArrayConverterElementTypeMatch(converterType: string, fallback: unknown[]): void {\n if (fallback.length === 0) return; // Empty array is valid\n\n const firstElement = fallback[0];\n const typeChecker = BuiltInConverterTypeCheckers[converterType as keyof typeof BuiltInConverterTypeCheckers];\n\n if (!typeChecker(firstElement)) {\n throw new EnvaptError(\n EnvaptErrorCodes.ArrayFallbackElementTypeMismatch,\n `Array converter type \"${converterType}\" does not match fallback element type. Expected ${converterType} compatible elements.`\n );\n }\n }\n\n /**\n * Check if a value is a primitive constructor\n */\n static isPrimitiveConstructor(\n value: unknown\n ): value is typeof String | typeof Number | typeof Boolean | typeof BigInt | typeof Symbol {\n return value === String || value === Number || value === Boolean || value === BigInt || value === Symbol;\n }\n\n /**\n * Safely coerce a fallback value using a primitive constructor\n */\n static coercePrimitiveFallback<CoercedType>(\n converter: typeof String | typeof Number | typeof Boolean | typeof BigInt | typeof Symbol,\n fallback: unknown\n ): CoercedType {\n // Check if fallback is already the correct type and return as-is\n if (this.isCorrectPrimitiveType(converter, fallback)) return fallback as CoercedType;\n\n // Otherwise, coerce the value\n return this.performPrimitiveCoercion<CoercedType>(converter, fallback);\n }\n\n /**\n * Check if fallback is already the correct primitive type\n */\n private static isCorrectPrimitiveType(\n converter: typeof String | typeof Number | typeof Boolean | typeof BigInt | typeof Symbol,\n fallback: unknown\n ): boolean {\n if (converter === String && typeof fallback === 'string') return true;\n if (converter === Number && typeof fallback === 'number') return true;\n if (converter === Boolean && typeof fallback === 'boolean') return true;\n if (converter === BigInt && typeof fallback === 'bigint') return true;\n if (converter === Symbol && typeof fallback === 'symbol') return true;\n return false;\n }\n\n /**\n * Perform the actual primitive coercion\n */\n private static performPrimitiveCoercion<CoercedType>(\n converter: typeof String | typeof Number | typeof Boolean | typeof BigInt | typeof Symbol,\n fallback: unknown\n ): CoercedType {\n try {\n if (converter === String) return String(fallback) as CoercedType;\n if (converter === Number) return Number(fallback) as CoercedType;\n if (converter === Boolean) return Boolean(fallback) as CoercedType;\n if (converter === BigInt) return BigInt(fallback as string | number | bigint) as CoercedType;\n if (converter === Symbol) return Symbol.for(String(fallback)) as CoercedType;\n } catch (error) {\n throw new EnvaptError(\n EnvaptErrorCodes.PrimitiveCoercionFailed,\n `Failed to coerce fallback value using ${converter.name}: ${(error as Error).message}`\n );\n }\n\n // This should never happen but TypeScript needs it\n /* v8 ignore next */\n throw new EnvaptError(EnvaptErrorCodes.PrimitiveCoercionFailed, `Unknown primitive converter: ${converter.name}`);\n }\n\n /**\n * Make sure the user hasn't provided prohibited options in their dotenv config\n */\n static validateDotenvConfig(config: Record<string, unknown>): config is PermittedDotenvConfig {\n if ('path' in config || 'processEnv' in config) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidUserDefinedConfig,\n 'Custom dotenvConfig should not include \"path\" or \"processEnv\" options. Those are managed by Envapter.'\n );\n }\n\n const validKeys = new Set(['encoding', 'quiet', 'debug', 'override', 'DOTENV_KEY']);\n const invalidKeys = Object.keys(config).filter((key) => !validKeys.has(key));\n\n if (invalidKeys.length > 0) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidUserDefinedConfig,\n `Invalid dotenvConfig options: ${invalidKeys.join(', ')}. Allowed options: ${Array.from(validKeys).join(', ')}`\n );\n }\n\n return true;\n }\n\n /**\n * Check if each provided path resolves to an env file by trying to access it\n */\n static validateEnvFilesExist(paths: string[]): void {\n const missing = paths.filter((p) => {\n try {\n fs.accessSync(p, fs.constants.F_OK);\n return false;\n } catch {\n return true;\n }\n });\n\n if (missing.length > 0) {\n throw new EnvaptError(\n EnvaptErrorCodes.EnvFilesNotFound,\n `Environment file not found at path: ${missing.join(', ')}`\n );\n }\n }\n}\n","import process from 'node:process';\n\nimport { config } from 'dotenv';\n\nimport { Validator } from '../Validators';\n\nimport type { PermittedDotenvConfig } from '../Types';\n\n/**\n * Base cache for environment variables and computed values\n * @internal\n */\nexport const EnvaptCache = new Map<string, unknown>();\n\n/**\n * Base class for environment variable management\n * Handles configuration, caching, and basic environment loading\n * @internal\n */\nexport abstract class EnvapterBase {\n protected static _envPaths: string[] = ['.env']; // default path\n protected static _userDefinedDotenvConfig: PermittedDotenvConfig = { quiet: true };\n\n /**\n * Set custom .env file paths. Accepts either a single path or array of paths.\n * Setting new paths clears the cache and reloads environment variables.\n */\n static set envPaths(paths: string[] | string) {\n const newPaths = Array.isArray(paths) ? paths : [paths];\n Validator.validateEnvFilesExist(newPaths);\n\n this._envPaths = newPaths;\n this.refreshCache();\n }\n\n /**\n * Get currently configured .env file paths\n */\n static get envPaths(): string[] {\n return this._envPaths;\n }\n\n /**\n * Set custom dotenv configuration options.\n */\n static set dotenvConfig(config: PermittedDotenvConfig) {\n Validator.validateDotenvConfig(config);\n this._userDefinedDotenvConfig = config;\n this.refreshCache();\n }\n\n /**\n * Get current dotenv configuration options\n */\n static get dotenvConfig(): PermittedDotenvConfig {\n return this._userDefinedDotenvConfig;\n }\n\n protected static refreshCache(): void {\n EnvaptCache.clear();\n void this.config; // reload config to repopulate cache\n }\n\n protected static get config(): Map<string, unknown> {\n if (EnvaptCache.size === 0) {\n // create isolated environment object to avoid mutating process.env\n const isolatedEnv: Record<string, string> = { ...(process.env as Record<string, string>) };\n\n try {\n // load _envPath file from custom path into isolated environment object\n config({ path: this._envPaths, processEnv: isolatedEnv, ...this._userDefinedDotenvConfig });\n /* v8 ignore next */\n } catch {}\n // populate the Map with global environment variables\n for (const [key, value] of Object.entries(isolatedEnv)) EnvaptCache.set(key, value);\n }\n\n return EnvaptCache;\n }\n\n /**\n * Get raw environment variable value without parsing or conversion.\n */\n getRaw(key: string): string | undefined {\n return EnvapterBase.config.get(key) as string | undefined;\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport type {\n ArrayConverter,\n BuiltInConverter,\n BuiltInConverterFunction,\n JsonValue,\n MapOfConverterFunctions,\n TimeUnit\n} from './Types';\n\n/**\n * Built-in converter implementations\n * @internal\n */\nexport class BuiltInConverters {\n static string(raw: string, fallback?: string): string | undefined {\n return String(raw) || fallback;\n }\n\n static number(raw: string, fallback?: number): number | undefined {\n const parsed = Number(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n }\n\n static boolean(raw: string, fallback?: boolean): boolean | undefined {\n const lower = raw.toLowerCase().trim();\n\n const truthyValues = ['1', 'yes', 'true', 'on'];\n const falsyValues = ['0', 'no', 'false', 'off'];\n\n if (truthyValues.includes(lower)) return true;\n if (falsyValues.includes(lower)) return false;\n return fallback;\n }\n\n static bigint(raw: string, fallback?: bigint): bigint | undefined {\n try {\n return BigInt(raw);\n } catch {\n return fallback;\n }\n }\n\n static symbol(raw: string, fallback?: symbol): symbol | undefined {\n try {\n return raw ? Symbol.for(raw) : fallback;\n /* v8 ignore next 3 */\n } catch {\n return fallback;\n }\n }\n\n static integer(raw: string, fallback?: number): number | undefined {\n const parsed = Number.parseInt(raw, 10);\n return Number.isNaN(parsed) ? fallback : parsed;\n }\n\n static float(raw: string, fallback?: number): number | undefined {\n const parsed = Number.parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n }\n\n static json(raw: string, fallback?: JsonValue): JsonValue | undefined {\n try {\n return JSON.parse(raw) as JsonValue;\n } catch {\n return fallback;\n }\n }\n\n static array(raw: string, fallback?: string[], delimiter = ','): string[] | undefined {\n if (raw.trim() === '') return [];\n const arr = raw\n .split(delimiter)\n .map((item) => item.trim())\n .filter(Boolean);\n return arr.length ? arr : fallback;\n }\n\n static url(raw: string, fallback?: URL): URL | undefined {\n try {\n return new URL(raw);\n } catch {\n return fallback;\n }\n }\n\n static regexp(raw: string, fallback?: RegExp): RegExp | undefined {\n try {\n // Handle flags if provided in format: /pattern/flags\n const match = raw.match(new RegExp(String.raw`^\\/(.+)\\/([gimsuvy]*)$`));\n if (match) return new RegExp(match[1] as string, match[2]);\n\n return new RegExp(raw);\n } catch {\n return fallback;\n }\n }\n\n static date(raw: string, fallback?: Date): Date | undefined {\n // Try parsing as timestamp first (if it's all digits)\n if (new RegExp(String.raw`^\\d+$`).test(raw)) {\n const timestamp = parseInt(raw, 10);\n const parsed = new Date(timestamp);\n return Number.isNaN(parsed.getTime()) ? fallback : parsed;\n }\n\n // Only accept ISO 8601 date strings (strict format)\n const isoRegex = new RegExp(String.raw`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$`, 'u');\n if (!isoRegex.test(raw)) return fallback;\n\n const parsed = new Date(raw);\n return Number.isNaN(parsed.getTime()) ? fallback : parsed;\n }\n\n static time(raw: string, fallback?: number): number | undefined {\n const match = raw.match(new RegExp(String.raw`^(\\d+(?:\\.\\d+)?)(ms|s|m|h)?$`, 'u'));\n if (!match) return fallback;\n\n const [, numStr, capturedUnit] = match;\n if (!numStr) return fallback;\n\n const value = Number.parseFloat(numStr);\n if (Number.isNaN(value)) return fallback;\n\n const unit: TimeUnit = (capturedUnit ?? 'ms') as TimeUnit;\n\n const SECONDS_TO_MS = 1000;\n const SECONDS_PER_MINUTE = 60;\n const MINUTES_PER_HOUR = 60;\n const MINUTES_TO_MS = SECONDS_PER_MINUTE * SECONDS_TO_MS;\n const HOURS_TO_MS = MINUTES_PER_HOUR * MINUTES_TO_MS;\n\n if (unit === 'ms') return value;\n if (unit === 's') return value * SECONDS_TO_MS;\n if (unit === 'm') return value * MINUTES_TO_MS;\n return value * HOURS_TO_MS;\n }\n\n /**\n * Process array with custom converter config\n */\n static processArrayConverter(raw: string, fallback: unknown, config: ArrayConverter): unknown[] | undefined {\n if (raw.trim() === '') return [];\n\n const items = raw\n .split(config.delimiter)\n .map((item) => String(item).trim())\n .filter(Boolean);\n\n // If no items after split, return fallback if provided\n if (!items.length) return fallback ? (fallback as unknown[]) : undefined;\n\n // If no type specified, return as string array\n const type = config.type;\n if (!type) return items;\n\n // Convert each item using the specified type\n const converter = BuiltInConverters.getConverter(type);\n return items.map((item) => {\n const converted = converter(item, undefined);\n return converted ?? item;\n });\n }\n\n /**\n * Get the converter function for a built-in converter type\n */\n static getConverter<TFallback extends BuiltInConverter>(type: TFallback): BuiltInConverterFunction {\n const converters: MapOfConverterFunctions = {\n string: BuiltInConverters.string,\n number: BuiltInConverters.number,\n boolean: BuiltInConverters.boolean,\n integer: BuiltInConverters.integer,\n bigint: BuiltInConverters.bigint,\n symbol: BuiltInConverters.symbol,\n float: BuiltInConverters.float,\n json: BuiltInConverters.json,\n array: BuiltInConverters.array,\n url: BuiltInConverters.url,\n regexp: BuiltInConverters.regexp,\n date: BuiltInConverters.date,\n time: BuiltInConverters.time\n } as const;\n\n return converters[type];\n }\n}\n","import { BuiltInConverters } from './BuiltInConverters';\nimport { EnvaptError, EnvaptErrorCodes } from './Error';\nimport { Validator } from './Validators';\n\nimport type { EnvaptConverter, PrimitiveConstructor, ArrayConverter, BuiltInConverter } from './Types';\n\n/**\n * @internal\n */\nexport interface EnvapterService {\n getRaw(key: string): string | undefined;\n get(key: string, def?: string): string | undefined;\n}\n\n/**\n * Parser class for handling environment variable template resolution and type conversion\n * @internal\n */\nexport class Parser {\n private readonly TEMPLATE_REGEX = /\\${\\w*}/g;\n\n constructor(private readonly envService: EnvapterService) {}\n\n /**\n * Resolve template variables in a string while handling circular references and missing variables\n * @internal\n */\n resolveTemplate(key: string, value: string, stack: Set<string> = new Set<string>()): string {\n stack.add(key);\n\n const out = value.replace(this.TEMPLATE_REGEX, (template) => {\n const variable = template.slice(2, -1);\n\n if (stack.has(variable)) return template; // cycle, preserve\n\n const raw = this.envService.getRaw(variable);\n if (!raw || raw === '') return template; // missing or empty, preserve\n\n const resolved = this.resolveTemplate(variable, raw, new Set(stack));\n\n // If resolution still references the current key, skip replacement (indirect cycle)\n if (resolved.includes(`\\${${key}}`)) return template;\n\n // If nothing changed (unresolved placeholders stayed), also preserve original template\n if (resolved === raw && /\\$\\{[^}]*\\}/.test(resolved)) return template;\n\n return resolved;\n });\n\n stack.delete(key);\n return out;\n }\n\n convertValue<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n converter: EnvaptConverter<TFallback> | undefined,\n hasFallback: boolean\n ): TFallback | null | undefined {\n const resolvedConverter = this.resolveConverter(converter, fallback);\n const processedFallback = this.processFallbackForConverter(resolvedConverter, fallback);\n\n // Handle different converter types\n if (Validator.isArrayConverter(resolvedConverter)) {\n return this.processArrayConverter(key, processedFallback, resolvedConverter, hasFallback);\n }\n\n if (Validator.isPrimitiveConstructor(resolvedConverter)) {\n const stringConverter = this.convertPrimitiveToString(resolvedConverter);\n return this.processBuiltInConverter(key, processedFallback, stringConverter, hasFallback, true);\n }\n\n if (Validator.isBuiltInConverter(resolvedConverter)) {\n return this.processBuiltInConverter(key, processedFallback, resolvedConverter, hasFallback, false);\n }\n\n return this.processCustomConverter(key, processedFallback, resolvedConverter, hasFallback);\n }\n\n private processFallbackForConverter<TFallback>(\n converter: EnvaptConverter<TFallback>,\n fallback: TFallback | undefined\n ): TFallback | undefined {\n // For primitive constructors, coerce the fallback to match the converter\n if (Validator.isPrimitiveConstructor(converter) && fallback !== undefined) {\n return Validator.coercePrimitiveFallback<TFallback>(converter, fallback);\n }\n return fallback;\n }\n\n private convertPrimitiveToString(primitiveConstructor: PrimitiveConstructor): BuiltInConverter {\n if (primitiveConstructor === String) return 'string';\n if (primitiveConstructor === Number) return 'number';\n if (primitiveConstructor === Boolean) return 'boolean';\n if (primitiveConstructor === BigInt) return 'bigint';\n if (primitiveConstructor === Symbol) return 'symbol';\n\n /* v8 ignore next */\n throw new EnvaptError(EnvaptErrorCodes.InvalidConverterType, `Unknown primitive constructor`);\n }\n\n private processBuiltInConverter<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n resolvedConverter: BuiltInConverter,\n hasFallback: boolean,\n wasOriginallyConstructor: boolean\n ): TFallback | null | undefined {\n // Validate the built-in converter at runtime\n Validator.builtInConverter(resolvedConverter);\n\n // Validate fallback type matches converter for built-in converters\n // Only apply strict validation if this wasn't originally a constructor\n if (hasFallback && fallback !== undefined && !wasOriginallyConstructor) {\n Validator.validateBuiltInConverterFallback(resolvedConverter, fallback);\n\n // Special handling for 'array' converter - check array element consistency\n if (resolvedConverter === 'array' && Array.isArray(fallback)) {\n Validator.validateArrayFallbackElementTypes(fallback);\n }\n }\n\n const parsed = this.envService.get(key, undefined);\n\n if (parsed === undefined) return hasFallback ? fallback : null;\n\n const converterFn = BuiltInConverters.getConverter(resolvedConverter);\n const result = converterFn(parsed, fallback);\n\n // If converter failed (returned undefined) and no fallback was provided, return null\n if (result === undefined && !hasFallback) return null;\n\n return result as TFallback;\n }\n\n private processArrayConverter<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n resolvedConverter: ArrayConverter,\n hasFallback: boolean\n ): TFallback | null | undefined {\n // Validate the resolvedConverter at runtime and assert that it is indeed an ArrayConverter\n Validator.arrayConverter(resolvedConverter);\n\n // Validate fallback type if a fallback is provided\n if (hasFallback && fallback !== undefined && !Array.isArray(fallback)) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidFallback,\n `ArrayConverter requires that the fallback be an array, got ${typeof fallback}`\n );\n }\n\n // Additional validations for array converter fallbacks\n if (hasFallback && Array.isArray(fallback)) {\n // Validate that all elements in fallback array have consistent types\n Validator.validateArrayFallbackElementTypes(fallback);\n\n // For array converters with a type, validate that converter type matches fallback elements\n if (resolvedConverter.type) {\n Validator.validateArrayConverterElementTypeMatch(resolvedConverter.type, fallback);\n }\n }\n\n const parsed = this.envService.get(key, undefined);\n\n if (parsed === undefined) return hasFallback ? fallback : null;\n\n const result = BuiltInConverters.processArrayConverter(parsed, fallback, resolvedConverter);\n\n // If converter failed (returned undefined) and no fallback was provided, return null\n if (result === undefined && !hasFallback) return null;\n\n return result as TFallback;\n }\n\n private processCustomConverter<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n resolvedConverter: EnvaptConverter<TFallback>,\n _hasFallback: boolean // hasFallback is not needed because customConverter is called even if the raw value is undefined\n ): TFallback | null | undefined {\n Validator.customConvertor(resolvedConverter);\n\n // Custom converter function\n const raw = this.envService.get(key, undefined);\n\n return resolvedConverter(raw, fallback);\n }\n\n private resolveConverter<TFallback>(\n converter: EnvaptConverter<TFallback> | undefined,\n fallback: TFallback | undefined\n ): EnvaptConverter<TFallback> {\n // User provided explicit converter. Use it\n if (converter) return converter;\n\n // Auto-detect type from fallback using typeof\n const fallbackType = typeof fallback;\n if (fallbackType === 'number') return 'number';\n if (fallbackType === 'boolean') return 'boolean';\n if (fallbackType === 'bigint') return 'bigint';\n if (fallbackType === 'symbol') return 'symbol';\n return 'string';\n }\n}\n","import { EnvapterBase } from './EnvapterBase';\n\n/**\n * Environment types supported by Envapter\n * @public\n */\nexport enum Environment {\n Development,\n Staging,\n Production\n}\n\n/**\n * Mixin for environment detection and checking methods\n * @internal\n */\nexport class EnvironmentMethods extends EnvapterBase {\n protected static _environment: Environment | undefined;\n\n protected static determineEnvironment(env?: string | Environment): void {\n const environment =\n env ?? this.getRawValue('ENVIRONMENT', this.getRawValue('ENV', this.getRawValue('NODE_ENV', 'development')));\n\n if (typeof environment === 'string') {\n this._environment =\n environment.toLowerCase() === 'production'\n ? Environment.Production\n : environment === 'staging'\n ? Environment.Staging\n : Environment.Development;\n } else {\n this._environment = environment;\n }\n }\n\n private static getRawValue(key: string, fallback: string): string {\n return (this.config.get(key) as string) || fallback;\n }\n\n /**\n * Get the current application environment\n */\n static get environment(): Environment {\n if (this._environment === undefined) {\n this.determineEnvironment();\n }\n return this._environment as Environment;\n }\n\n /**\n * Set the application environment. Accepts either Environment enum or string value.\n */\n static set environment(env: string | Environment) {\n this.determineEnvironment(env);\n }\n\n /**\n * @see {@link EnvironmentMethods.environment}\n */\n get environment(): Environment {\n return EnvironmentMethods.environment;\n }\n\n /**\n * @see {@link EnvironmentMethods.environment}\n */\n set environment(env: string | Environment) {\n EnvironmentMethods.determineEnvironment(env);\n }\n\n /**\n * Check if the current environment is production\n */\n static get isProduction(): boolean {\n return this.environment === Environment.Production;\n }\n\n /**\n * @see {@link EnvironmentMethods.isProduction}\n */\n get isProduction(): boolean {\n return EnvironmentMethods.environment === Environment.Production;\n }\n\n /**\n * Check if the current environment is staging\n */\n static get isStaging(): boolean {\n return this.environment === Environment.Staging;\n }\n\n /**\n * @see {@link EnvironmentMethods.isStaging}\n */\n get isStaging(): boolean {\n return EnvironmentMethods.environment === Environment.Staging;\n }\n\n /**\n * Check if the current environment is development\n */\n static get isDevelopment(): boolean {\n return this.environment === Environment.Development;\n }\n\n /**\n * @see {@link EnvironmentMethods.isDevelopment}\n */\n get isDevelopment(): boolean {\n return EnvironmentMethods.environment === Environment.Development;\n }\n\n protected static override refreshCache(): void {\n super.refreshCache();\n this._environment = undefined; // re-evaluate environment on next access\n }\n}\n","import { BuiltInConverters } from '../BuiltInConverters';\nimport { Parser, type EnvapterService } from '../Parser';\nimport { EnvironmentMethods } from './EnvironmentMethods';\n\nimport type { ConditionalReturn } from '../Types';\n\n/**\n * @internal\n */\nenum Primitive {\n String,\n Number,\n Boolean,\n BigInt,\n Symbol\n}\n\n/**\n * Mixin for primitive environment variable getter methods\n * @internal\n */\nexport class PrimitiveMethods extends EnvironmentMethods implements EnvapterService {\n protected static readonly parser: Parser = new Parser(new PrimitiveMethods());\n\n private static _get<EnvVarReturnType, DefaultType extends EnvVarReturnType | undefined = undefined>(\n key: string,\n type: Primitive,\n def?: DefaultType\n ): ConditionalReturn<EnvVarReturnType, DefaultType> {\n const rawVal = this.config.get(key) as string | number | boolean;\n if (!rawVal) return def as ConditionalReturn<EnvVarReturnType, DefaultType>;\n\n const parsed = this.parser.resolveTemplate(key, String(rawVal));\n\n let result: EnvVarReturnType;\n if (type === Primitive.Number) result = BuiltInConverters.number(parsed, def as number) as EnvVarReturnType;\n else if (type === Primitive.Boolean) result = BuiltInConverters.boolean(parsed, def as boolean) as EnvVarReturnType;\n else if (type === Primitive.BigInt) result = BuiltInConverters.bigint(parsed, def as bigint) as EnvVarReturnType;\n else if (type === Primitive.Symbol) result = BuiltInConverters.symbol(parsed, def as symbol) as EnvVarReturnType;\n else result = BuiltInConverters.string(parsed, def as string) as EnvVarReturnType;\n\n return result as ConditionalReturn<EnvVarReturnType, DefaultType>;\n }\n\n /**\n * Get a string environment variable with optional fallback.\n * Supports template variable resolution using $\\{VAR\\} syntax.\n */\n static get<Default extends string | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<string, Default> {\n return this._get(key, Primitive.String, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.get}\n */\n get<Default extends string | undefined = undefined>(key: string, def?: Default): ConditionalReturn<string, Default> {\n return PrimitiveMethods._get(key, Primitive.String, def);\n }\n\n /**\n * Get a number environment variable with optional fallback.\n * Automatically converts string values to numbers.\n */\n static getNumber<Default extends number | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<number, Default> {\n return this._get(key, Primitive.Number, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.getNumber}\n */\n getNumber<Default extends number | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<number, Default> {\n return PrimitiveMethods._get(key, Primitive.Number, def);\n }\n\n /**\n * Get a boolean environment variable with optional fallback.\n * Recognizes: `1`, `yes`, `true`, 'on' as **true**; `0`, `no`, `false`, 'off' as **false** (case-insensitive).\n */\n static getBoolean<Default extends boolean | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<boolean, Default> {\n return this._get(key, Primitive.Boolean, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.getBoolean}\n */\n getBoolean<Default extends boolean | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<boolean, Default> {\n return PrimitiveMethods._get(key, Primitive.Boolean, def);\n }\n\n /**\n * Get a bigint environment variable with optional fallback.\n * Automatically converts string values to bigint.\n */\n static getBigInt<Default extends bigint | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<bigint, Default> {\n return this._get(key, Primitive.BigInt, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.getBigInt}\n */\n getBigInt<Default extends bigint | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<bigint, Default> {\n return PrimitiveMethods._get(key, Primitive.BigInt, def);\n }\n\n /**\n * Get a symbol environment variable with optional fallback.\n * Creates a symbol from the string value.\n */\n static getSymbol<Default extends symbol | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<symbol, Default> {\n return this._get(key, Primitive.Symbol, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.getSymbol}\n */\n getSymbol<Default extends symbol | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<symbol, Default> {\n return PrimitiveMethods._get(key, Primitive.Symbol, def);\n }\n}\n","import { PrimitiveMethods } from './PrimitiveMethods';\n\nimport type {\n AdvancedConverterReturn,\n ArrayConverter,\n BuiltInConverter,\n ConditionalReturn,\n ConverterFunction\n} from '../Types';\n\n/**\n * Mixin for advanced methods for environment variable conversion using built-in and custom converters\n * @internal\n */\nexport class AdvancedMethods extends PrimitiveMethods {\n /**\n * Get an environment variable using a built-in converter.\n * Supports both Converter enum values and array converter configurations.\n */\n static getUsing<TConverter extends BuiltInConverter | ArrayConverter, TFallback = undefined>(\n key: string,\n converter: TConverter,\n fallback?: TFallback\n ): AdvancedConverterReturn<TConverter, TFallback>;\n static getUsing<TReturn>(key: string, converter: BuiltInConverter | ArrayConverter, fallback?: TReturn): TReturn;\n static getUsing<TConverter extends BuiltInConverter | ArrayConverter, TFallback = undefined>(\n key: string,\n converter: TConverter,\n fallback?: TFallback\n ): AdvancedConverterReturn<TConverter, TFallback> {\n // Check if variable exists first, for consistency with primitive methods\n const rawVal = this.config.get(key);\n if (!rawVal) return fallback as AdvancedConverterReturn<TConverter, TFallback>;\n\n const hasFallback = fallback !== undefined;\n const result = this.parser.convertValue(key, fallback, converter, hasFallback);\n\n return result as AdvancedConverterReturn<TConverter, TFallback>;\n }\n\n /**\n * @see {@link AdvancedMethods.getUsing}\n */\n getUsing<TConverter extends BuiltInConverter | ArrayConverter, TFallback = undefined>(\n key: string,\n converter: TConverter,\n fallback?: TFallback\n ): AdvancedConverterReturn<TConverter, TFallback>;\n getUsing<TReturn>(key: string, converter: BuiltInConverter | ArrayConverter, fallback?: TReturn): TReturn;\n getUsing<TConverter extends BuiltInConverter | ArrayConverter, TFallback = undefined>(\n key: string,\n converter: TConverter,\n fallback?: TFallback\n ): AdvancedConverterReturn<TConverter, TFallback> {\n return AdvancedMethods.getUsing(key, converter, fallback);\n }\n\n /**\n * Get an environment variable using a custom converter function.\n */\n static getWith<TReturnType, TFallback extends TReturnType | undefined = undefined>(\n key: string,\n converter: ConverterFunction<TReturnType>,\n fallback?: TFallback\n ): ConditionalReturn<TReturnType, TFallback> {\n // Check if variable exists first, for consistency with primitive methods\n const rawVal = this.config.get(key);\n if (!rawVal) return fallback as ConditionalReturn<TReturnType, TFallback>;\n\n const hasFallback = fallback !== undefined;\n // Convert the converter to match the expected signature via unknown\n const result = this.parser.convertValue(\n key,\n fallback,\n converter as unknown as ConverterFunction<TFallback>,\n hasFallback\n );\n\n return result as ConditionalReturn<TReturnType, TFallback>;\n }\n\n /**\n * @see {@link AdvancedMethods.getWith}\n */\n getWith<TReturnType, TFallback extends TReturnType | undefined = undefined>(\n key: string,\n converter: ConverterFunction<TReturnType>,\n fallback?: TFallback\n ): ConditionalReturn<TReturnType, TFallback> {\n return AdvancedMethods.getWith(key, converter, fallback);\n }\n}\n","import { AdvancedMethods } from './core/AdvancedMethods';\n\nexport { EnvaptCache } from './core/EnvapterBase';\nexport { Environment } from './core/EnvironmentMethods';\n\n/**\n * Main configuration class for environment variable management.\n *\n * Provides both static and instance methods for retrieving typed environment variables\n * with support for template resolution, multiple .env files, and environment detection.\n *\n * Extend your own classes from this to define properties with \\@Envapt decorators and provide access to environment variables methods.\n *\n * @example\n * ```ts\n * // Static usage\n * const port = Envapter.getNumber('PORT', 3000);\n * const url = Envapter.get('API_URL', 'http://localhost');\n *\n * // Instance usage\n * const env = new Envapter();\n * const dbUrl = env.get('DATABASE_URL', 'sqlite://memory');\n * ```\n *\n * @public\n */\nexport class Envapter extends AdvancedMethods {\n /**\n * Tagged template literal for resolving environment variables in template strings.\n *\n * @example\n * ```ts\n * // Given API_HOST=api.example.com and API_PORT=8080 in environment\n * const endpoint = Envapter.resolve`Connecting to ${'API_HOST'}:${'API_PORT'}`;\n * // Returns: \"Connecting to api.example.com:8080\"\n *\n * // Works with template variables in .env too:\n * // API_URL=https://${API_HOST}:${API_PORT}\n * const message = Envapter.resolve`Service endpoint: ${'API_URL'}`;\n * // Returns: \"Service endpoint: https://api.example.com:8080\"\n * ```\n */\n static resolve(strings: TemplateStringsArray, ...keys: string[]): string {\n return strings.reduce((result, string, i) => {\n const envKey = keys[i];\n const envValue = envKey ? super.get(envKey, '') : '';\n return result + string + envValue;\n }, '');\n }\n\n /**\n * @see {@link Envapter.resolve}\n */\n resolve(strings: TemplateStringsArray, ...keys: string[]): string {\n return Envapter.resolve(strings, ...keys);\n }\n}\n","import { EnvaptCache } from './core/EnvapterBase';\nimport { Envapter } from './Envapter';\nimport { Parser } from './Parser';\n\nimport type {\n ArrayConverter,\n BuiltInConverter,\n ConverterFunction,\n EnvaptConverter,\n EnvaptOptions,\n InferConverterReturnType,\n InferPrimitiveFallbackType,\n InferPrimitiveReturnType,\n PrimitiveConstructor\n} from './Types';\n\nfunction createPropertyDecorator<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n converter: EnvaptConverter<TFallback> | undefined,\n hasFallback: boolean\n): PropertyDecorator {\n return function (target: object, prop: string | symbol): void {\n const propKey = String(prop);\n // For static properties, target is the constructor function itself\n // For instance properties, target is the prototype and we need target.constructor\n // This prevents cache collisions between static and instance properties with the same name\n const className = typeof target === 'function' ? target.name : target.constructor.name;\n const cacheKey = `${className}.${propKey}`;\n\n // Create a property with a getter that handles environment changes\n Object.defineProperty(target, propKey, {\n get: function () {\n // Check if the environment cache has been cleared (indicating config change)\n // If so, we need to re-evaluate our cached value\n let value = EnvaptCache.get(cacheKey) as TFallback | null | undefined;\n\n // Re-evaluate if we don't have a cached value\n if (value === undefined) {\n const parser = new Parser(new Envapter());\n value = parser.convertValue(key, fallback, converter, hasFallback);\n EnvaptCache.set(cacheKey, value);\n }\n\n return value;\n },\n configurable: false,\n enumerable: true\n });\n };\n}\n\n/**\n * Usage 1: Custom converter function with fallback provided\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with custom converter and required fallback\n * @public\n */\nexport function Envapt<TFallback>(\n key: string,\n options: { converter: (raw: string | undefined, fallback: TFallback) => TFallback; fallback: TFallback }\n): PropertyDecorator;\n\n/**\n * Usage 2: Custom converter function without fallback\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with custom converter only\n * @public\n */\nexport function Envapt<TReturnType>(\n key: string,\n options: { converter: ConverterFunction<TReturnType> }\n): PropertyDecorator;\n\n/**\n * Usage 3: Built-in converter with optional fallback\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with built-in converter\n * @public\n */\nexport function Envapt<TConverter extends BuiltInConverter>(\n key: string,\n options: { converter: TConverter; fallback?: InferConverterReturnType<TConverter> | undefined }\n): PropertyDecorator;\n\n/**\n * Usage 4: Array converter with optional fallback\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with array converter\n * @public\n */\nexport function Envapt<TConverter extends ArrayConverter>(\n key: string,\n options: { converter: TConverter; fallback?: InferConverterReturnType<TConverter> | undefined }\n): PropertyDecorator;\n\n/**\n * Usage 5: Primitive constructor with optional fallback\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with primitive constructor\n * @public\n */\nexport function Envapt<TConstructor extends PrimitiveConstructor>(\n key: string,\n options: {\n converter: TConstructor;\n fallback?: InferPrimitiveReturnType<TConstructor>;\n }\n): PropertyDecorator;\n\n/**\n * Usage 6: Fallback only (no converter)\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with fallback only\n * @public\n */\nexport function Envapt<TFallback>(\n key: string,\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n options: { fallback: TFallback; converter?: undefined }\n): PropertyDecorator;\n\n/**\n * Classic API: No fallback\n *\n * @param key - Environment variable name to load\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function Envapt<_TReturnType = string | null>(key: string): PropertyDecorator;\n\n/**\n * Classic API: Primitive fallback only\n *\n * @param key - Environment variable name to load\n * @param fallback - Default primitive value\n * @param converter - Optional primitive constructor (String, Number, etc.)\n * @public\n */\nexport function Envapt<TFallback extends string | number | boolean | bigint | symbol | undefined>(\n key: string,\n fallback: InferPrimitiveFallbackType<TFallback>,\n converter?: PrimitiveConstructor\n): PropertyDecorator;\n\n/**\n * Instance/Static Property decorator that automatically loads and converts environment variables.\n */\nexport function Envapt<TFallback = unknown>(\n key: string,\n fallbackOrOptions?: TFallback | EnvaptOptions<TFallback>,\n converter?: EnvaptConverter<TFallback>\n): PropertyDecorator {\n // Determine if using new options API or classic API\n let fallback: TFallback | undefined;\n let actualConverter: EnvaptConverter<TFallback> | undefined;\n let hasFallback = true;\n\n if (\n fallbackOrOptions &&\n typeof fallbackOrOptions === 'object' &&\n ('fallback' in fallbackOrOptions || 'converter' in fallbackOrOptions)\n ) {\n // Modern API\n const options = fallbackOrOptions;\n fallback = options.fallback;\n actualConverter = options.converter;\n hasFallback = 'fallback' in options;\n } else {\n // Classic API\n fallback = fallbackOrOptions as TFallback;\n actualConverter = converter;\n hasFallback = arguments.length > 1;\n }\n\n return createPropertyDecorator(key, fallback, actualConverter, hasFallback);\n}\n","/**\n * Enum for built-in converters\n * @public\n */\nexport enum Converters {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Bigint = 'bigint',\n Symbol = 'symbol',\n Integer = 'integer',\n Float = 'float',\n Json = 'json',\n Array = 'array',\n Url = 'url',\n Regexp = 'regexp',\n Date = 'date',\n Time = 'time'\n}\n\n/**\n * Type alias for converter values to maintain compatibility with existing string-based API\n * @internal\n */\nexport type ConverterValue = `${Converters}`;\n\n/**\n * Valid array element converter types (excludes array, json, regexp)\n * @internal\n */\nexport type ArrayElementConverter = Exclude<Converters, Converters.Array | Converters.Json | Converters.Regexp>;\n\n/**\n * Type alias for array element converter values\n * @internal\n */\nexport type ArrayElementConverterValue = `${ArrayElementConverter}`;\n"]}
1
+ {"version":3,"sources":["../src/Error.ts","../src/ListOfBuiltInConverters.ts","../src/Validators.ts","../src/core/EnvapterBase.ts","../src/BuiltInConverters.ts","../src/Parser.ts","../src/core/EnvironmentMethods.ts","../src/core/PrimitiveMethods.ts","../src/core/AdvancedMethods.ts","../src/Envapter.ts","../src/Envapt.ts","../src/Converters.ts"],"names":["EnvaptErrorCodes","config","fs","process","parsed","Environment","Converters"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable no-magic-numbers */\nexport enum EnvaptErrorCodes {\n // Fallback related errors\n /** Thrown when an invalid fallback value is provided */\n InvalidFallback = 101,\n /** Thrown when fallback value type doesn't match expected converter type */\n InvalidFallbackType = 102,\n /** Thrown when array fallback contains elements of wrong type */\n ArrayFallbackElementTypeMismatch = 103,\n /** Thrown when fallback type doesn't match the specified converter */\n FallbackConverterTypeMismatch = 104,\n\n // Converter related errors\n /** Thrown when invalid array converter configuration is provided */\n InvalidArrayConverterType = 201,\n /** Thrown when an invalid built-in converter is specified */\n InvalidBuiltInConverter = 202,\n /** Thrown when a custom converter is not a function */\n InvalidCustomConverter = 203,\n /** Thrown when converter type is not recognized */\n InvalidConverterType = 204,\n /** Thrown when primitive type coercion on fallback value fails */\n PrimitiveCoercionFailed = 205,\n\n // Other errors\n /** Thrown when delimiter is missing in array converter configuration */\n // This doesn't happen because 203 is thrown when object without delimiter is passed\n MissingDelimiter = 301,\n /** Thrown when invalid user-defined configuration is provided */\n InvalidUserDefinedConfig = 302,\n /** Thrown when specified environment files don't exist */\n EnvFilesNotFound = 303\n}\n\n/**\n * Custom error for better DX and debugging when using Envapt.\n *\n * @example\n * ```ts\n * throw new EnvaptError(EnvaptErrorCode.InvalidFallback, \"Invalid fallback value provided for environment variable.\");\n * ```\n */\nexport class EnvaptError extends Error {\n public readonly code: EnvaptErrorCodes;\n\n constructor(code: EnvaptErrorCodes, message: string) {\n super(message);\n this.name = `EnvaptError [${code}]`;\n this.code = code;\n }\n}\n","import type { ConverterValue } from './Converters';\nimport type { JsonValue } from './Types';\n\n/**\n * List of built-in converters for Envapt.\n * @internal\n */\nexport const ListOfBuiltInConverters: ConverterValue[] = [\n 'string',\n 'number',\n 'boolean',\n 'bigint',\n 'symbol',\n 'integer',\n 'float',\n 'json',\n 'array',\n 'url',\n 'regexp',\n 'date',\n 'time'\n] as const;\n\n/**\n * Type checking functions for built-in converter return types.\n * @internal\n */\nexport const BuiltInConverterTypeCheckers: Record<ConverterValue, (value: unknown) => boolean> = {\n string: (value: unknown): value is string => typeof value === 'string',\n number: (value: unknown): value is number => typeof value === 'number',\n boolean: (value: unknown): value is boolean => typeof value === 'boolean',\n bigint: (value: unknown): value is bigint => typeof value === 'bigint',\n symbol: (value: unknown): value is symbol => typeof value === 'symbol',\n integer: (value: unknown): value is number => typeof value === 'number' && Number.isInteger(value),\n float: (value: unknown): value is number => typeof value === 'number',\n json: (value: unknown): value is JsonValue => {\n try {\n JSON.parse(JSON.stringify(value));\n return true;\n } catch {\n return false;\n }\n },\n array: (value: unknown): value is unknown[] => Array.isArray(value),\n url: (value: unknown): value is URL => value instanceof URL,\n regexp: (value: unknown): value is RegExp => value instanceof RegExp,\n date: (value: unknown): value is Date => value instanceof Date,\n time: (value: unknown): value is number => typeof value === 'number'\n};\n","import fs from 'node:fs';\n\nimport { EnvaptError, EnvaptErrorCodes } from './Error';\nimport { ListOfBuiltInConverters, BuiltInConverterTypeCheckers } from './ListOfBuiltInConverters';\n\nimport type {\n ArrayConverter,\n BuiltInConverter,\n ConverterFunction,\n EnvaptConverter,\n PermittedDotenvConfig,\n ValidArrayConverterBuiltInType\n} from './Types';\n\nexport class Validator {\n /**\n * Check if a value is a built-in converter type\n */\n static isBuiltInConverter<TFallback>(value: EnvaptConverter<TFallback>): value is BuiltInConverter {\n if (typeof value === 'string') return ListOfBuiltInConverters.includes(value);\n return false;\n }\n\n /**\n * Check if a value is an ArrayConverter configuration object\n */\n static isArrayConverter(value: unknown): value is ArrayConverter {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'delimiter' in value &&\n typeof (value as ArrayConverter).delimiter === 'string'\n );\n }\n\n /**\n * Check if a value is a valid ArrayConverter type\n */\n static isValidArrayConverterType(value: unknown): value is ValidArrayConverterBuiltInType {\n if (typeof value !== 'string') return false;\n\n const invalidTypes = ['array', 'json', 'regexp'];\n\n if (invalidTypes.includes(value)) return false;\n const validTypes: ValidArrayConverterBuiltInType[] = ListOfBuiltInConverters.filter(\n (type): type is ValidArrayConverterBuiltInType => !invalidTypes.includes(type)\n );\n\n return validTypes.includes(value as ValidArrayConverterBuiltInType);\n }\n\n static customConvertor<TFallback>(\n converter: EnvaptConverter<TFallback>\n ): asserts converter is ConverterFunction<TFallback> {\n if (typeof converter !== 'function') {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidCustomConverter,\n `Custom converter must be a function, got ${typeof converter}.`\n );\n }\n }\n\n /**\n * Validate ArrayConverter configuration with runtime checks\n */\n static arrayConverter(value: unknown): asserts value is ArrayConverter {\n if (!this.isArrayConverter(value)) {\n throw new EnvaptError(EnvaptErrorCodes.MissingDelimiter, 'Must have delimiter property');\n }\n\n if (value.type !== undefined && !this.isValidArrayConverterType(value.type)) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidArrayConverterType,\n `\"${value.type as string}\" is not a valid converter type`\n );\n }\n }\n\n /**\n * Validate that a string is a valid built-in converter type\n */\n static builtInConverter(value: unknown): asserts value is BuiltInConverter {\n if (typeof value !== 'string') {\n throw new EnvaptError(EnvaptErrorCodes.InvalidConverterType, `Expected string, got ${typeof value}`);\n }\n\n if (!ListOfBuiltInConverters.includes(value as BuiltInConverter)) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidBuiltInConverter,\n `\"${value}\" is not a valid converter type. Valid types are: ${ListOfBuiltInConverters.join(',')}`\n );\n }\n }\n\n /**\n * Validate that fallback type matches the converter's return type for built-in converters\n */\n static validateBuiltInConverterFallback(converter: BuiltInConverter, fallback: unknown): void {\n const typeChecker = BuiltInConverterTypeCheckers[converter];\n if (!typeChecker(fallback)) {\n throw new EnvaptError(\n EnvaptErrorCodes.FallbackConverterTypeMismatch,\n `Fallback type does not match converter \"${converter}\". Expected ${converter} compatible type.`\n );\n }\n }\n\n /**\n * Validate that all elements in an array fallback have consistent types\n */\n static validateArrayFallbackElementTypes(fallback: unknown[]): void {\n if (fallback.length === 0) return; // Empty array is valid\n\n const firstElementType = typeof fallback[0];\n const hasInconsistentTypes = fallback.some((element, index) => {\n if (index === 0) return false; // Skip first element\n return typeof element !== firstElementType;\n });\n\n if (hasInconsistentTypes) {\n throw new EnvaptError(\n EnvaptErrorCodes.ArrayFallbackElementTypeMismatch,\n `All elements in array fallback must have the same type. Found mixed types.`\n );\n }\n }\n\n /**\n * Validate that array converter type matches fallback element types\n */\n static validateArrayConverterElementTypeMatch(converterType: string, fallback: unknown[]): void {\n if (fallback.length === 0) return; // Empty array is valid\n\n const firstElement = fallback[0];\n const typeChecker = BuiltInConverterTypeCheckers[converterType as keyof typeof BuiltInConverterTypeCheckers];\n\n if (!typeChecker(firstElement)) {\n throw new EnvaptError(\n EnvaptErrorCodes.ArrayFallbackElementTypeMismatch,\n `Array converter type \"${converterType}\" does not match fallback element type. Expected ${converterType} compatible elements.`\n );\n }\n }\n\n /**\n * Check if a value is a primitive constructor\n */\n static isPrimitiveConstructor(\n value: unknown\n ): value is typeof String | typeof Number | typeof Boolean | typeof BigInt | typeof Symbol {\n return value === String || value === Number || value === Boolean || value === BigInt || value === Symbol;\n }\n\n /**\n * Safely coerce a fallback value using a primitive constructor\n */\n static coercePrimitiveFallback<CoercedType>(\n converter: typeof String | typeof Number | typeof Boolean | typeof BigInt | typeof Symbol,\n fallback: unknown\n ): CoercedType {\n // Check if fallback is already the correct type and return as-is\n if (this.isCorrectPrimitiveType(converter, fallback)) return fallback as CoercedType;\n\n // Otherwise, coerce the value\n return this.performPrimitiveCoercion<CoercedType>(converter, fallback);\n }\n\n /**\n * Check if fallback is already the correct primitive type\n */\n private static isCorrectPrimitiveType(\n converter: typeof String | typeof Number | typeof Boolean | typeof BigInt | typeof Symbol,\n fallback: unknown\n ): boolean {\n if (converter === String && typeof fallback === 'string') return true;\n if (converter === Number && typeof fallback === 'number') return true;\n if (converter === Boolean && typeof fallback === 'boolean') return true;\n if (converter === BigInt && typeof fallback === 'bigint') return true;\n if (converter === Symbol && typeof fallback === 'symbol') return true;\n return false;\n }\n\n /**\n * Perform the actual primitive coercion\n */\n private static performPrimitiveCoercion<CoercedType>(\n converter: typeof String | typeof Number | typeof Boolean | typeof BigInt | typeof Symbol,\n fallback: unknown\n ): CoercedType {\n try {\n if (converter === String) return String(fallback) as CoercedType;\n if (converter === Number) return Number(fallback) as CoercedType;\n if (converter === Boolean) return Boolean(fallback) as CoercedType;\n if (converter === BigInt) return BigInt(fallback as string | number | bigint) as CoercedType;\n if (converter === Symbol) return Symbol.for(String(fallback)) as CoercedType;\n } catch (error) {\n throw new EnvaptError(\n EnvaptErrorCodes.PrimitiveCoercionFailed,\n `Failed to coerce fallback value using ${converter.name}: ${(error as Error).message}`\n );\n }\n\n // This should never happen but TypeScript needs it\n /* v8 ignore next -- @preserve */\n throw new EnvaptError(\n EnvaptErrorCodes.PrimitiveCoercionFailed,\n `Unknown primitive converter: ${converter.name}`\n );\n }\n\n /**\n * Make sure the user hasn't provided prohibited options in their dotenv config\n */\n static validateDotenvConfig(config: Record<string, unknown>): config is PermittedDotenvConfig {\n if ('path' in config || 'processEnv' in config) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidUserDefinedConfig,\n 'Custom dotenvConfig should not include \"path\" or \"processEnv\" options. Those are managed by Envapter.'\n );\n }\n\n const validKeys = new Set(['encoding', 'quiet', 'debug', 'override', 'DOTENV_KEY']);\n const invalidKeys = Object.keys(config).filter((key) => !validKeys.has(key));\n\n if (invalidKeys.length > 0) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidUserDefinedConfig,\n `Invalid dotenvConfig options: ${invalidKeys.join(', ')}. Allowed options: ${Array.from(validKeys).join(', ')}`\n );\n }\n\n return true;\n }\n\n /**\n * Check if each provided path resolves to an env file by trying to access it\n */\n static validateEnvFilesExist(paths: string[]): void {\n const missing = paths.filter((p) => {\n try {\n fs.accessSync(p, fs.constants.F_OK);\n return false;\n } catch {\n return true;\n }\n });\n\n if (missing.length > 0) {\n throw new EnvaptError(\n EnvaptErrorCodes.EnvFilesNotFound,\n `Environment file not found at path: ${missing.join(', ')}`\n );\n }\n }\n}\n","import process from 'node:process';\n\nimport { config } from 'dotenv';\n\nimport { Validator } from '../Validators';\n\nimport type { PermittedDotenvConfig } from '../Types';\n\n/**\n * Base cache for environment variables and computed values\n * @internal\n */\nexport const EnvaptCache = new Map<string, unknown>();\n\n/**\n * Base class for environment variable management\n * Handles configuration, caching, and basic environment loading\n * @internal\n */\nexport abstract class EnvapterBase {\n protected static _envPaths: string[] = ['.env']; // default path\n protected static _userDefinedDotenvConfig: PermittedDotenvConfig = { quiet: true };\n\n /**\n * Set custom .env file paths. Accepts either a single path or array of paths.\n * Setting new paths clears the cache and reloads environment variables.\n */\n static set envPaths(paths: string[] | string) {\n const newPaths = Array.isArray(paths) ? paths : [paths];\n Validator.validateEnvFilesExist(newPaths);\n\n this._envPaths = newPaths;\n this.refreshCache();\n }\n\n /**\n * Get currently configured .env file paths\n */\n static get envPaths(): string[] {\n return this._envPaths;\n }\n\n /**\n * Set custom dotenv configuration options.\n */\n static set dotenvConfig(config: PermittedDotenvConfig) {\n Validator.validateDotenvConfig(config);\n this._userDefinedDotenvConfig = config;\n this.refreshCache();\n }\n\n /**\n * Get current dotenv configuration options\n */\n static get dotenvConfig(): PermittedDotenvConfig {\n return this._userDefinedDotenvConfig;\n }\n\n protected static refreshCache(): void {\n EnvaptCache.clear();\n void this.config; // reload config to repopulate cache\n }\n\n protected static get config(): Map<string, unknown> {\n if (EnvaptCache.size === 0) {\n // create isolated environment object to avoid mutating process.env\n const isolatedEnv: Record<string, string> = { ...(process.env as Record<string, string>) };\n\n try {\n // load _envPath file from custom path into isolated environment object\n config({ path: this._envPaths, processEnv: isolatedEnv, ...this._userDefinedDotenvConfig });\n } catch {}\n // populate the Map with global environment variables\n for (const [key, value] of Object.entries(isolatedEnv)) EnvaptCache.set(key, value);\n }\n\n return EnvaptCache;\n }\n\n /**\n * Get raw environment variable value without parsing or conversion.\n */\n getRaw(key: string): string | undefined {\n return EnvapterBase.config.get(key) as string | undefined;\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport type {\n ArrayConverter,\n BuiltInConverter,\n BuiltInConverterFunction,\n JsonValue,\n MapOfConverterFunctions,\n TimeUnit\n} from './Types';\n\n/**\n * Built-in converter implementations\n * @internal\n */\nexport class BuiltInConverters {\n static string(raw: string, _fallback?: string): string | undefined {\n return String(raw);\n }\n\n static number(raw: string, fallback?: number): number | undefined {\n const parsed = Number(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n }\n\n static boolean(raw: string, fallback?: boolean): boolean | undefined {\n const lower = raw.toLowerCase().trim();\n\n const truthyValues = ['1', 'yes', 'true', 'on'];\n const falsyValues = ['0', 'no', 'false', 'off'];\n\n if (truthyValues.includes(lower)) return true;\n if (falsyValues.includes(lower)) return false;\n return fallback;\n }\n\n static bigint(raw: string, fallback?: bigint): bigint | undefined {\n try {\n return BigInt(raw);\n } catch {\n return fallback;\n }\n }\n\n static symbol(raw: string, fallback?: symbol): symbol | undefined {\n try {\n return raw ? Symbol.for(raw) : fallback;\n } catch {\n return fallback;\n }\n }\n\n static integer(raw: string, fallback?: number): number | undefined {\n const parsed = Number.parseInt(raw, 10);\n return Number.isNaN(parsed) ? fallback : parsed;\n }\n\n static float(raw: string, fallback?: number): number | undefined {\n const parsed = Number.parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n }\n\n static json(raw: string, fallback?: JsonValue): JsonValue | undefined {\n try {\n return JSON.parse(raw) as JsonValue;\n } catch {\n return fallback;\n }\n }\n\n static array(raw: string, fallback?: string[], delimiter = ','): string[] | undefined {\n if (raw.trim() === '') return [];\n const arr = raw\n .split(delimiter)\n .map((item) => item.trim())\n .filter(Boolean);\n return arr.length ? arr : fallback;\n }\n\n static url(raw: string, fallback?: URL): URL | undefined {\n try {\n return new URL(raw);\n } catch {\n return fallback;\n }\n }\n\n static regexp(raw: string, fallback?: RegExp): RegExp | undefined {\n try {\n // Handle flags if provided in format: /pattern/flags\n const match = raw.match(new RegExp(String.raw`^\\/(.+)\\/([gimsuvy]*)$`));\n if (match) return new RegExp(match[1] as string, match[2]);\n\n return new RegExp(raw);\n } catch {\n return fallback;\n }\n }\n\n static date(raw: string, fallback?: Date): Date | undefined {\n // Try parsing as timestamp first (if it's all digits)\n if (new RegExp(String.raw`^\\d+$`).test(raw)) {\n const timestamp = parseInt(raw, 10);\n const parsed = new Date(timestamp);\n return Number.isNaN(parsed.getTime()) ? fallback : parsed;\n }\n\n // Only accept ISO 8601 date strings (strict format)\n const isoRegex = new RegExp(String.raw`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$`, 'u');\n if (!isoRegex.test(raw)) return fallback;\n\n const parsed = new Date(raw);\n return Number.isNaN(parsed.getTime()) ? fallback : parsed;\n }\n\n static time(raw: string, fallback?: number): number | undefined {\n const match = raw.match(new RegExp(String.raw`^(\\d+(?:\\.\\d+)?)(ms|s|m|h)?$`, 'u'));\n if (!match) return fallback;\n\n const [, numStr, capturedUnit] = match;\n if (!numStr) return fallback;\n\n const value = Number.parseFloat(numStr);\n if (Number.isNaN(value)) return fallback;\n\n const unit: TimeUnit = (capturedUnit ?? 'ms') as TimeUnit;\n\n const SECONDS_TO_MS = 1000;\n const SECONDS_PER_MINUTE = 60;\n const MINUTES_PER_HOUR = 60;\n const MINUTES_TO_MS = SECONDS_PER_MINUTE * SECONDS_TO_MS;\n const HOURS_TO_MS = MINUTES_PER_HOUR * MINUTES_TO_MS;\n\n if (unit === 'ms') return value;\n if (unit === 's') return value * SECONDS_TO_MS;\n if (unit === 'm') return value * MINUTES_TO_MS;\n return value * HOURS_TO_MS;\n }\n\n /**\n * Process array with custom converter config\n */\n static processArrayConverter(raw: string, fallback: unknown, config: ArrayConverter): unknown[] | undefined {\n if (raw.trim() === '') return [];\n\n const items = raw\n .split(config.delimiter)\n .map((item) => String(item).trim())\n .filter(Boolean);\n\n // If no items after split, return fallback if provided\n if (!items.length) return fallback ? (fallback as unknown[]) : undefined;\n\n // If no type specified, return as string array\n const type = config.type;\n if (!type) return items;\n\n // Convert each item using the specified type\n const converter = BuiltInConverters.getConverter(type);\n return items.map((item) => {\n const converted = converter(item, undefined);\n return converted ?? item;\n });\n }\n\n /**\n * Get the converter function for a built-in converter type\n */\n static getConverter<TFallback extends BuiltInConverter>(type: TFallback): BuiltInConverterFunction {\n const converters: MapOfConverterFunctions = {\n string: BuiltInConverters.string,\n number: BuiltInConverters.number,\n boolean: BuiltInConverters.boolean,\n integer: BuiltInConverters.integer,\n bigint: BuiltInConverters.bigint,\n symbol: BuiltInConverters.symbol,\n float: BuiltInConverters.float,\n json: BuiltInConverters.json,\n array: BuiltInConverters.array,\n url: BuiltInConverters.url,\n regexp: BuiltInConverters.regexp,\n date: BuiltInConverters.date,\n time: BuiltInConverters.time\n } as const;\n\n return converters[type];\n }\n}\n","import { BuiltInConverters } from './BuiltInConverters';\nimport { EnvaptError, EnvaptErrorCodes } from './Error';\nimport { Validator } from './Validators';\n\nimport type { EnvaptConverter, PrimitiveConstructor, ArrayConverter, BuiltInConverter } from './Types';\n\n/**\n * @internal\n */\nexport interface EnvapterService {\n getRaw(key: string): string | undefined;\n get(key: string, def?: string): string | undefined;\n}\n\n/**\n * Parser class for handling environment variable template resolution and type conversion\n * @internal\n */\nexport class Parser {\n private readonly TEMPLATE_REGEX = /\\${\\w*}/g;\n\n constructor(private readonly envService: EnvapterService) {}\n\n /**\n * Resolve template variables in a string while handling circular references and missing variables\n * @internal\n */\n resolveTemplate(key: string, value: string, stack: Set<string> = new Set<string>()): string {\n stack.add(key);\n\n const out = value.replace(this.TEMPLATE_REGEX, (template) => {\n const variable = template.slice(2, -1);\n\n if (stack.has(variable)) return template; // cycle, preserve\n\n const raw = this.envService.getRaw(variable);\n if (!raw || raw === '') return template; // missing or empty, preserve\n\n const resolved = this.resolveTemplate(variable, raw, new Set(stack));\n\n // If resolution still references the current key, skip replacement (indirect cycle)\n if (resolved.includes(`\\${${key}}`)) return template;\n\n // If nothing changed (unresolved placeholders stayed), also preserve original template\n if (resolved === raw && /\\$\\{[^}]*\\}/.test(resolved)) return template;\n\n return resolved;\n });\n\n stack.delete(key);\n return out;\n }\n\n convertValue<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n converter: EnvaptConverter<TFallback> | undefined,\n hasFallback: boolean\n ): TFallback | null | undefined {\n const resolvedConverter = this.resolveConverter(converter, fallback);\n const processedFallback = this.processFallbackForConverter(resolvedConverter, fallback);\n\n // Handle different converter types\n if (Validator.isArrayConverter(resolvedConverter)) {\n return this.processArrayConverter(key, processedFallback, resolvedConverter, hasFallback);\n }\n\n if (Validator.isPrimitiveConstructor(resolvedConverter)) {\n const stringConverter = this.convertPrimitiveToString(resolvedConverter);\n return this.processBuiltInConverter(key, processedFallback, stringConverter, hasFallback, true);\n }\n\n if (Validator.isBuiltInConverter(resolvedConverter)) {\n return this.processBuiltInConverter(key, processedFallback, resolvedConverter, hasFallback, false);\n }\n\n return this.processCustomConverter(key, processedFallback, resolvedConverter, hasFallback);\n }\n\n private processFallbackForConverter<TFallback>(\n converter: EnvaptConverter<TFallback>,\n fallback: TFallback | undefined\n ): TFallback | undefined {\n // For primitive constructors, coerce the fallback to match the converter\n if (Validator.isPrimitiveConstructor(converter) && fallback !== undefined) {\n return Validator.coercePrimitiveFallback<TFallback>(converter, fallback);\n }\n return fallback;\n }\n\n private convertPrimitiveToString(primitiveConstructor: PrimitiveConstructor): BuiltInConverter {\n if (primitiveConstructor === String) return 'string';\n if (primitiveConstructor === Number) return 'number';\n if (primitiveConstructor === Boolean) return 'boolean';\n if (primitiveConstructor === BigInt) return 'bigint';\n if (primitiveConstructor === Symbol) return 'symbol';\n\n // This should never happen but TypeScript needs it\n /* v8 ignore next -- @preserve */\n throw new EnvaptError(EnvaptErrorCodes.InvalidConverterType, `Unknown primitive constructor`);\n }\n\n private processBuiltInConverter<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n resolvedConverter: BuiltInConverter,\n hasFallback: boolean,\n wasOriginallyConstructor: boolean\n ): TFallback | null | undefined {\n // Validate the built-in converter at runtime\n Validator.builtInConverter(resolvedConverter);\n\n // Validate fallback type matches converter for built-in converters\n // Only apply strict validation if this wasn't originally a constructor\n if (hasFallback && fallback !== undefined && !wasOriginallyConstructor) {\n Validator.validateBuiltInConverterFallback(resolvedConverter, fallback);\n\n // Special handling for 'array' converter - check array element consistency\n if (resolvedConverter === 'array' && Array.isArray(fallback)) {\n Validator.validateArrayFallbackElementTypes(fallback);\n }\n }\n\n const parsed = this.envService.get(key, undefined);\n\n if (parsed === undefined) return hasFallback ? fallback : null;\n\n const converterFn = BuiltInConverters.getConverter(resolvedConverter);\n const result = converterFn(parsed, fallback);\n\n // If converter failed (returned undefined) and no fallback was provided, return null\n if (result === undefined && !hasFallback) return null;\n\n return result as TFallback;\n }\n\n private processArrayConverter<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n resolvedConverter: ArrayConverter,\n hasFallback: boolean\n ): TFallback | null | undefined {\n // Validate the resolvedConverter at runtime and assert that it is indeed an ArrayConverter\n Validator.arrayConverter(resolvedConverter);\n\n // Validate fallback type if a fallback is provided\n if (hasFallback && fallback !== undefined && !Array.isArray(fallback)) {\n throw new EnvaptError(\n EnvaptErrorCodes.InvalidFallback,\n `ArrayConverter requires that the fallback be an array, got ${typeof fallback}`\n );\n }\n\n // Additional validations for array converter fallbacks\n if (hasFallback && Array.isArray(fallback)) {\n // Validate that all elements in fallback array have consistent types\n Validator.validateArrayFallbackElementTypes(fallback);\n\n // For array converters with a type, validate that converter type matches fallback elements\n if (resolvedConverter.type) {\n Validator.validateArrayConverterElementTypeMatch(resolvedConverter.type, fallback);\n }\n }\n\n const parsed = this.envService.get(key, undefined);\n\n if (parsed === undefined) return hasFallback ? fallback : null;\n\n const result = BuiltInConverters.processArrayConverter(parsed, fallback, resolvedConverter);\n\n // If converter failed (returned undefined) and no fallback was provided, return null\n if (result === undefined && !hasFallback) return null;\n\n return result as TFallback;\n }\n\n private processCustomConverter<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n resolvedConverter: EnvaptConverter<TFallback>,\n _hasFallback: boolean // hasFallback is not needed because customConverter is called even if the raw value is undefined\n ): TFallback | null | undefined {\n Validator.customConvertor(resolvedConverter);\n\n // Custom converter function\n const raw = this.envService.get(key, undefined);\n\n return resolvedConverter(raw, fallback);\n }\n\n private resolveConverter<TFallback>(\n converter: EnvaptConverter<TFallback> | undefined,\n fallback: TFallback | undefined\n ): EnvaptConverter<TFallback> {\n // User provided explicit converter. Use it\n if (converter) return converter;\n\n // Auto-detect type from fallback using typeof\n const fallbackType = typeof fallback;\n if (fallbackType === 'number') return 'number';\n if (fallbackType === 'boolean') return 'boolean';\n if (fallbackType === 'bigint') return 'bigint';\n if (fallbackType === 'symbol') return 'symbol';\n return 'string';\n }\n}\n","import { EnvapterBase } from './EnvapterBase';\n\n/**\n * Environment types supported by Envapter\n * @public\n */\nexport enum Environment {\n Development,\n Staging,\n Production\n}\n\n/**\n * Mixin for environment detection and checking methods\n * @internal\n */\nexport class EnvironmentMethods extends EnvapterBase {\n protected static _environment: Environment | undefined;\n\n protected static determineEnvironment(env?: string | Environment): void {\n const environment =\n env ??\n this.getRawValue('ENVIRONMENT', this.getRawValue('ENV', this.getRawValue('NODE_ENV', 'development')));\n\n if (typeof environment === 'string') {\n this._environment =\n environment.toLowerCase() === 'production'\n ? Environment.Production\n : environment === 'staging'\n ? Environment.Staging\n : Environment.Development;\n } else {\n this._environment = environment;\n }\n }\n\n private static getRawValue(key: string, fallback: string): string {\n return (this.config.get(key) as string) || fallback;\n }\n\n /**\n * Get the current application environment\n */\n static get environment(): Environment {\n if (this._environment === undefined) {\n this.determineEnvironment();\n }\n return this._environment as Environment;\n }\n\n /**\n * Set the application environment. Accepts either Environment enum or string value.\n */\n static set environment(env: string | Environment) {\n this.determineEnvironment(env);\n }\n\n /**\n * @see {@link EnvironmentMethods.environment}\n */\n get environment(): Environment {\n return EnvironmentMethods.environment;\n }\n\n /**\n * @see {@link EnvironmentMethods.environment}\n */\n set environment(env: string | Environment) {\n EnvironmentMethods.determineEnvironment(env);\n }\n\n /**\n * Check if the current environment is production\n */\n static get isProduction(): boolean {\n return this.environment === Environment.Production;\n }\n\n /**\n * @see {@link EnvironmentMethods.isProduction}\n */\n get isProduction(): boolean {\n return EnvironmentMethods.environment === Environment.Production;\n }\n\n /**\n * Check if the current environment is staging\n */\n static get isStaging(): boolean {\n return this.environment === Environment.Staging;\n }\n\n /**\n * @see {@link EnvironmentMethods.isStaging}\n */\n get isStaging(): boolean {\n return EnvironmentMethods.environment === Environment.Staging;\n }\n\n /**\n * Check if the current environment is development\n */\n static get isDevelopment(): boolean {\n return this.environment === Environment.Development;\n }\n\n /**\n * @see {@link EnvironmentMethods.isDevelopment}\n */\n get isDevelopment(): boolean {\n return EnvironmentMethods.environment === Environment.Development;\n }\n\n protected static override refreshCache(): void {\n super.refreshCache();\n this._environment = undefined; // re-evaluate environment on next access\n }\n}\n","import { BuiltInConverters } from '../BuiltInConverters';\nimport { Parser, type EnvapterService } from '../Parser';\nimport { EnvironmentMethods } from './EnvironmentMethods';\n\nimport type { ConditionalReturn } from '../Types';\n\n/**\n * @internal\n */\nenum Primitive {\n String,\n Number,\n Boolean,\n BigInt,\n Symbol\n}\n\n/**\n * Mixin for primitive environment variable getter methods\n * @internal\n */\nexport class PrimitiveMethods extends EnvironmentMethods implements EnvapterService {\n protected static readonly parser: Parser = new Parser(new PrimitiveMethods());\n\n private static _get<EnvVarReturnType, DefaultType extends EnvVarReturnType | undefined = undefined>(\n key: string,\n type: Primitive,\n def?: DefaultType\n ): ConditionalReturn<EnvVarReturnType, DefaultType> {\n const rawVal = this.config.get(key) as string | number | boolean;\n if (!rawVal) return def as ConditionalReturn<EnvVarReturnType, DefaultType>;\n\n const parsed = this.parser.resolveTemplate(key, String(rawVal));\n\n let result: EnvVarReturnType;\n if (type === Primitive.Number) result = BuiltInConverters.number(parsed, def as number) as EnvVarReturnType;\n else if (type === Primitive.Boolean)\n result = BuiltInConverters.boolean(parsed, def as boolean) as EnvVarReturnType;\n else if (type === Primitive.BigInt)\n result = BuiltInConverters.bigint(parsed, def as bigint) as EnvVarReturnType;\n else if (type === Primitive.Symbol)\n result = BuiltInConverters.symbol(parsed, def as symbol) as EnvVarReturnType;\n else result = BuiltInConverters.string(parsed, def as string) as EnvVarReturnType;\n\n return result as ConditionalReturn<EnvVarReturnType, DefaultType>;\n }\n\n /**\n * Get a string environment variable with optional fallback.\n * Supports template variable resolution using $\\{VAR\\} syntax.\n */\n static get<Default extends string | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<string, Default> {\n return this._get(key, Primitive.String, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.get}\n */\n get<Default extends string | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<string, Default> {\n return PrimitiveMethods._get(key, Primitive.String, def);\n }\n\n /**\n * Get a number environment variable with optional fallback.\n * Automatically converts string values to numbers.\n */\n static getNumber<Default extends number | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<number, Default> {\n return this._get(key, Primitive.Number, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.getNumber}\n */\n getNumber<Default extends number | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<number, Default> {\n return PrimitiveMethods._get(key, Primitive.Number, def);\n }\n\n /**\n * Get a boolean environment variable with optional fallback.\n * Recognizes: `1`, `yes`, `true`, 'on' as **true**; `0`, `no`, `false`, 'off' as **false** (case-insensitive).\n */\n static getBoolean<Default extends boolean | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<boolean, Default> {\n return this._get(key, Primitive.Boolean, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.getBoolean}\n */\n getBoolean<Default extends boolean | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<boolean, Default> {\n return PrimitiveMethods._get(key, Primitive.Boolean, def);\n }\n\n /**\n * Get a bigint environment variable with optional fallback.\n * Automatically converts string values to bigint.\n */\n static getBigInt<Default extends bigint | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<bigint, Default> {\n return this._get(key, Primitive.BigInt, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.getBigInt}\n */\n getBigInt<Default extends bigint | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<bigint, Default> {\n return PrimitiveMethods._get(key, Primitive.BigInt, def);\n }\n\n /**\n * Get a symbol environment variable with optional fallback.\n * Creates a symbol from the string value.\n */\n static getSymbol<Default extends symbol | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<symbol, Default> {\n return this._get(key, Primitive.Symbol, def);\n }\n\n /**\n * @see {@link PrimitiveMethods.getSymbol}\n */\n getSymbol<Default extends symbol | undefined = undefined>(\n key: string,\n def?: Default\n ): ConditionalReturn<symbol, Default> {\n return PrimitiveMethods._get(key, Primitive.Symbol, def);\n }\n}\n","import { PrimitiveMethods } from './PrimitiveMethods';\n\nimport type {\n AdvancedConverterReturn,\n ArrayConverter,\n BuiltInConverter,\n ConditionalReturn,\n ConverterFunction\n} from '../Types';\n\n/**\n * Mixin for advanced methods for environment variable conversion using built-in and custom converters\n * @internal\n */\nexport class AdvancedMethods extends PrimitiveMethods {\n /**\n * Get an environment variable using a built-in converter.\n * Supports both Converter enum values and array converter configurations.\n */\n static getUsing<TConverter extends BuiltInConverter | ArrayConverter, TFallback = undefined>(\n key: string,\n converter: TConverter,\n fallback?: TFallback\n ): AdvancedConverterReturn<TConverter, TFallback>;\n static getUsing<TReturn>(key: string, converter: BuiltInConverter | ArrayConverter, fallback?: TReturn): TReturn;\n static getUsing<TConverter extends BuiltInConverter | ArrayConverter, TFallback = undefined>(\n key: string,\n converter: TConverter,\n fallback?: TFallback\n ): AdvancedConverterReturn<TConverter, TFallback> {\n // Check if variable exists first, for consistency with primitive methods\n const rawVal = this.config.get(key);\n if (!rawVal) return fallback as AdvancedConverterReturn<TConverter, TFallback>;\n\n const hasFallback = fallback !== undefined;\n const result = this.parser.convertValue(key, fallback, converter, hasFallback);\n\n return result as AdvancedConverterReturn<TConverter, TFallback>;\n }\n\n /**\n * @see {@link AdvancedMethods.getUsing}\n */\n getUsing<TConverter extends BuiltInConverter | ArrayConverter, TFallback = undefined>(\n key: string,\n converter: TConverter,\n fallback?: TFallback\n ): AdvancedConverterReturn<TConverter, TFallback>;\n getUsing<TReturn>(key: string, converter: BuiltInConverter | ArrayConverter, fallback?: TReturn): TReturn;\n getUsing<TConverter extends BuiltInConverter | ArrayConverter, TFallback = undefined>(\n key: string,\n converter: TConverter,\n fallback?: TFallback\n ): AdvancedConverterReturn<TConverter, TFallback> {\n return AdvancedMethods.getUsing(key, converter, fallback);\n }\n\n /**\n * Get an environment variable using a custom converter function.\n */\n static getWith<TReturnType, TFallback extends TReturnType | undefined = undefined>(\n key: string,\n converter: ConverterFunction<TReturnType>,\n fallback?: TFallback\n ): ConditionalReturn<TReturnType, TFallback> {\n // Check if variable exists first, for consistency with primitive methods\n const rawVal = this.config.get(key);\n if (!rawVal) return fallback as ConditionalReturn<TReturnType, TFallback>;\n\n const hasFallback = fallback !== undefined;\n // Convert the converter to match the expected signature via unknown\n const result = this.parser.convertValue(\n key,\n fallback,\n converter as unknown as ConverterFunction<TFallback>,\n hasFallback\n );\n\n return result as ConditionalReturn<TReturnType, TFallback>;\n }\n\n /**\n * @see {@link AdvancedMethods.getWith}\n */\n getWith<TReturnType, TFallback extends TReturnType | undefined = undefined>(\n key: string,\n converter: ConverterFunction<TReturnType>,\n fallback?: TFallback\n ): ConditionalReturn<TReturnType, TFallback> {\n return AdvancedMethods.getWith(key, converter, fallback);\n }\n}\n","import { AdvancedMethods } from './core/AdvancedMethods';\n\nexport { EnvaptCache } from './core/EnvapterBase';\nexport { Environment } from './core/EnvironmentMethods';\n\n/**\n * Main configuration class for environment variable management.\n *\n * Provides both static and instance methods for retrieving typed environment variables\n * with support for template resolution, multiple .env files, and environment detection.\n *\n * Extend your own classes from this to define properties with \\@Envapt decorators and provide access to environment variables methods.\n *\n * @example\n * ```ts\n * // Static usage\n * const port = Envapter.getNumber('PORT', 3000);\n * const url = Envapter.get('API_URL', 'http://localhost');\n *\n * // Instance usage\n * const env = new Envapter();\n * const dbUrl = env.get('DATABASE_URL', 'sqlite://memory');\n * ```\n *\n * @public\n */\nexport class Envapter extends AdvancedMethods {\n /**\n * Tagged template literal for resolving environment variables in template strings.\n *\n * @example\n * ```ts\n * // Given API_HOST=api.example.com and API_PORT=8080 in environment\n * const endpoint = Envapter.resolve`Connecting to ${'API_HOST'}:${'API_PORT'}`;\n * // Returns: \"Connecting to api.example.com:8080\"\n *\n * // Works with template variables in .env too:\n * // API_URL=https://${API_HOST}:${API_PORT}\n * const message = Envapter.resolve`Service endpoint: ${'API_URL'}`;\n * // Returns: \"Service endpoint: https://api.example.com:8080\"\n * ```\n */\n static resolve(strings: TemplateStringsArray, ...keys: string[]): string {\n return strings.reduce((result, string, i) => {\n const envKey = keys[i];\n const envValue = envKey ? super.get(envKey, '') : '';\n return result + string + envValue;\n }, '');\n }\n\n /**\n * @see {@link Envapter.resolve}\n */\n resolve(strings: TemplateStringsArray, ...keys: string[]): string {\n return Envapter.resolve(strings, ...keys);\n }\n}\n","import { EnvaptCache } from './core/EnvapterBase';\nimport { Envapter } from './Envapter';\nimport { Parser } from './Parser';\n\nimport type {\n ArrayConverter,\n BuiltInConverter,\n ConverterFunction,\n EnvaptConverter,\n EnvaptOptions,\n InferConverterReturnType,\n InferPrimitiveFallbackType,\n InferPrimitiveReturnType,\n PrimitiveConstructor\n} from './Types';\n\nfunction createPropertyDecorator<TFallback>(\n key: string,\n fallback: TFallback | undefined,\n converter: EnvaptConverter<TFallback> | undefined,\n hasFallback: boolean\n): PropertyDecorator {\n return function (target: object, prop: string | symbol): void {\n const propKey = String(prop);\n // For static properties, target is the constructor function itself\n // For instance properties, target is the prototype and we need target.constructor\n // This prevents cache collisions between static and instance properties with the same name\n const className = typeof target === 'function' ? target.name : target.constructor.name;\n const cacheKey = `${className}.${propKey}`;\n\n // Create a property with a getter that handles environment changes\n Object.defineProperty(target, propKey, {\n get: function () {\n // Check if the environment cache has been cleared (indicating config change)\n // If so, we need to re-evaluate our cached value\n let value = EnvaptCache.get(cacheKey) as TFallback | null | undefined;\n\n // Re-evaluate if we don't have a cached value\n if (value === undefined) {\n const parser = new Parser(new Envapter());\n value = parser.convertValue(key, fallback, converter, hasFallback);\n EnvaptCache.set(cacheKey, value);\n }\n\n return value;\n },\n configurable: false,\n enumerable: true\n });\n };\n}\n\n/**\n * Usage 1: Custom converter function with fallback provided\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with custom converter and required fallback\n * @public\n * @example\n * ```ts\n * // Custom converter that validates a non-empty API key\n * class Config extends Envapter {\n * \\@Envapt('API_KEY', {\n * fallback: 'default-key',\n * converter(raw, _fallback) {\n * if (!raw || raw.trim() === '') throw new Error('API_KEY required');\n * return raw.trim();\n * }\n * })\n * static readonly apiKey: string;\n * }\n * ```\n */\nexport function Envapt<TFallback>(\n key: string,\n options: { converter: (raw: string | undefined, fallback: TFallback) => TFallback; fallback: TFallback }\n): PropertyDecorator;\n\n/**\n * Usage 2: Custom converter function without fallback\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with custom converter only\n * @public\n * @example\n * ```ts\n * // Custom converter without providing a fallback\n * class Config extends Envapter {\n * \\@Envapt('FEATURE_FLAGS', { converter(raw) {\n * // raw may be undefined — handle that here\n * return raw ? raw.split('|').map(s => s.trim()) : [];\n * } })\n * static readonly featureFlags: string[];\n * }\n * ```\n */\nexport function Envapt<TReturnType>(\n key: string,\n options: { converter: ConverterFunction<TReturnType> }\n): PropertyDecorator;\n\n/**\n * Usage 3: Built-in converter with optional fallback\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with built-in converter\n * @public\n * @example\n * ```ts\n * import { Converters } from 'envapt';\n *\n * class Config extends Envapter {\n * // Use built-in Number converter with a numeric fallback\n * \\@Envapt('APP_PORT', { converter: Converters.Number, fallback: 3000 })\n * static readonly port: number;\n *\n * // Use Url converter with a string fallback (must match converter type)\n * \\@Envapt('APP_URL', { converter: Converters.Url, fallback: 'http://localhost:3000' })\n * static readonly url: URL;\n * }\n * ```\n */\nexport function Envapt<TConverter extends BuiltInConverter>(\n key: string,\n options: { converter: TConverter; fallback?: InferConverterReturnType<TConverter> | undefined }\n): PropertyDecorator;\n\n/**\n * Usage 4: Array converter with optional fallback\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with array converter\n * @public\n * @example\n * ```ts\n * import { Converters } from 'envapt';\n *\n * class Config extends Envapter {\n * // Comma-separated list of origins -> string[]\n * \\@Envapt('ALLOWED_ORIGINS', {\n * converter: { delimiter: ',', type: Converters.String },\n * fallback: ['https://example.com']\n * })\n * static readonly allowedOrigins: string[];\n *\n * // Pipe-separated ports -> number[]\n * \\@Envapt('PORTS', {\n * converter: { delimiter: '|', type: Converters.Number },\n * fallback: [3000]\n * })\n * static readonly ports: number[];\n * }\n * ```\n */\nexport function Envapt<TConverter extends ArrayConverter>(\n key: string,\n options: { converter: TConverter; fallback?: InferConverterReturnType<TConverter> | undefined }\n): PropertyDecorator;\n\n/**\n * Usage 5: Primitive constructor with optional fallback\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with primitive constructor\n * @public\n * @example\n * ```ts\n * // Use primitive constructors to coerce values\n * class Config extends Envapter {\n * \\@Envapt('MAX_CONNECTIONS', { converter: Number, fallback: 100 })\n * static readonly maxConnections: number;\n *\n * \\@Envapt('FEATURE_ENABLED', { converter: Boolean, fallback: false })\n * static readonly featureEnabled: boolean;\n * }\n * ```\n */\nexport function Envapt<TConstructor extends PrimitiveConstructor>(\n key: string,\n options: {\n converter: TConstructor;\n fallback?: InferPrimitiveReturnType<TConstructor>;\n }\n): PropertyDecorator;\n\n/**\n * Usage 6: Fallback only (no converter)\n *\n * @param key - Environment variable name to load\n * @param options - Configuration options with fallback only\n * @public\n * @example\n * ```ts\n * // Fallback-only usage (no converter)\n * class Config extends Envapter {\n * \\@Envapt('LOG_FILE', { fallback: '/var/log/app.log' })\n * static readonly logFile: string;\n *\n * \\@Envapt('RETRY_POLICY', { fallback: { retries: 3, backoff: 'exponential' } })\n * static readonly retryPolicy: unknown;\n * }\n * ```\n */\nexport function Envapt<TFallback>(\n key: string,\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n options: { fallback: TFallback; converter?: undefined }\n): PropertyDecorator;\n\n/**\n * Classic API: No fallback\n *\n * @param key - Environment variable name to load\n * @example\n * ```ts\n * // Classic API: no fallback — property will resolve from env or be null\n * class Config extends Envapter {\n * \\@Envapt('SIMPLE_VALUE')\n * static readonly simple?: string | null;\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function Envapt<_TReturnType = string | null>(key: string): PropertyDecorator;\n\n/**\n * Classic API: Primitive fallback only\n *\n * @param key - Environment variable name to load\n * @param fallback - Default primitive value\n * @param converter - Optional primitive constructor (String, Number, etc.)\n * @public\n * @example\n * ```ts\n * // Classic API with primitive fallback and optional primitive converter\n * class Config extends Envapter {\n * // Provide fallback only\n * \\@Envapt('HOST', 'localhost')\n * static readonly host: string;\n *\n * // Provide fallback and converter\n * \\@Envapt('PORT', 8080, Number)\n * static readonly port: number;\n * }\n * ```\n */\nexport function Envapt<TFallback extends string | number | boolean | bigint | symbol | undefined>(\n key: string,\n fallback: InferPrimitiveFallbackType<TFallback>,\n converter?: PrimitiveConstructor\n): PropertyDecorator;\n\n/**\n * Instance/Static Property decorator that automatically loads and converts environment variables.\n */\nexport function Envapt<TFallback = unknown>(\n key: string,\n fallbackOrOptions?: TFallback | EnvaptOptions<TFallback>,\n converter?: EnvaptConverter<TFallback>\n): PropertyDecorator {\n // Determine if using new options API or classic API\n let fallback: TFallback | undefined;\n let actualConverter: EnvaptConverter<TFallback> | undefined;\n let hasFallback = true;\n\n if (\n fallbackOrOptions &&\n typeof fallbackOrOptions === 'object' &&\n ('fallback' in fallbackOrOptions || 'converter' in fallbackOrOptions)\n ) {\n // Modern API\n const options = fallbackOrOptions;\n fallback = options.fallback;\n actualConverter = options.converter;\n hasFallback = 'fallback' in options;\n } else {\n // Classic API\n fallback = fallbackOrOptions as TFallback;\n actualConverter = converter;\n hasFallback = arguments.length > 1;\n }\n\n return createPropertyDecorator(key, fallback, actualConverter, hasFallback);\n}\n","/**\n * Enum for built-in converters\n * @public\n */\nexport enum Converters {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Bigint = 'bigint',\n Symbol = 'symbol',\n Integer = 'integer',\n Float = 'float',\n Json = 'json',\n Array = 'array',\n Url = 'url',\n Regexp = 'regexp',\n Date = 'date',\n Time = 'time'\n}\n\n/**\n * Type alias for converter values to maintain compatibility with existing string-based API\n * @internal\n */\nexport type ConverterValue = `${Converters}`;\n\n/**\n * Valid array element converter types (excludes array, json, regexp)\n * @internal\n */\nexport type ArrayElementConverter = Exclude<Converters, Converters.Array | Converters.Json | Converters.Regexp>;\n\n/**\n * Type alias for array element converter values\n * @internal\n */\nexport type ArrayElementConverterValue = `${ArrayElementConverter}`;\n"]}
package/dist/index.d.cts CHANGED
@@ -192,6 +192,20 @@ type InferPrimitiveFallbackType<TFallback extends string | number | boolean | bi
192
192
  * @param key - Environment variable name to load
193
193
  * @param options - Configuration options with custom converter and required fallback
194
194
  * @public
195
+ * @example
196
+ * ```ts
197
+ * // Custom converter that validates a non-empty API key
198
+ * class Config extends Envapter {
199
+ * \@Envapt('API_KEY', {
200
+ * fallback: 'default-key',
201
+ * converter(raw, _fallback) {
202
+ * if (!raw || raw.trim() === '') throw new Error('API_KEY required');
203
+ * return raw.trim();
204
+ * }
205
+ * })
206
+ * static readonly apiKey: string;
207
+ * }
208
+ * ```
195
209
  */
196
210
  declare function Envapt<TFallback>(key: string, options: {
197
211
  converter: (raw: string | undefined, fallback: TFallback) => TFallback;
@@ -203,6 +217,17 @@ declare function Envapt<TFallback>(key: string, options: {
203
217
  * @param key - Environment variable name to load
204
218
  * @param options - Configuration options with custom converter only
205
219
  * @public
220
+ * @example
221
+ * ```ts
222
+ * // Custom converter without providing a fallback
223
+ * class Config extends Envapter {
224
+ * \@Envapt('FEATURE_FLAGS', { converter(raw) {
225
+ * // raw may be undefined — handle that here
226
+ * return raw ? raw.split('|').map(s => s.trim()) : [];
227
+ * } })
228
+ * static readonly featureFlags: string[];
229
+ * }
230
+ * ```
206
231
  */
207
232
  declare function Envapt<TReturnType>(key: string, options: {
208
233
  converter: ConverterFunction<TReturnType>;
@@ -213,6 +238,20 @@ declare function Envapt<TReturnType>(key: string, options: {
213
238
  * @param key - Environment variable name to load
214
239
  * @param options - Configuration options with built-in converter
215
240
  * @public
241
+ * @example
242
+ * ```ts
243
+ * import { Converters } from 'envapt';
244
+ *
245
+ * class Config extends Envapter {
246
+ * // Use built-in Number converter with a numeric fallback
247
+ * \@Envapt('APP_PORT', { converter: Converters.Number, fallback: 3000 })
248
+ * static readonly port: number;
249
+ *
250
+ * // Use Url converter with a string fallback (must match converter type)
251
+ * \@Envapt('APP_URL', { converter: Converters.Url, fallback: 'http://localhost:3000' })
252
+ * static readonly url: URL;
253
+ * }
254
+ * ```
216
255
  */
217
256
  declare function Envapt<TConverter extends BuiltInConverter>(key: string, options: {
218
257
  converter: TConverter;
@@ -224,6 +263,26 @@ declare function Envapt<TConverter extends BuiltInConverter>(key: string, option
224
263
  * @param key - Environment variable name to load
225
264
  * @param options - Configuration options with array converter
226
265
  * @public
266
+ * @example
267
+ * ```ts
268
+ * import { Converters } from 'envapt';
269
+ *
270
+ * class Config extends Envapter {
271
+ * // Comma-separated list of origins -> string[]
272
+ * \@Envapt('ALLOWED_ORIGINS', {
273
+ * converter: { delimiter: ',', type: Converters.String },
274
+ * fallback: ['https://example.com']
275
+ * })
276
+ * static readonly allowedOrigins: string[];
277
+ *
278
+ * // Pipe-separated ports -> number[]
279
+ * \@Envapt('PORTS', {
280
+ * converter: { delimiter: '|', type: Converters.Number },
281
+ * fallback: [3000]
282
+ * })
283
+ * static readonly ports: number[];
284
+ * }
285
+ * ```
227
286
  */
228
287
  declare function Envapt<TConverter extends ArrayConverter>(key: string, options: {
229
288
  converter: TConverter;
@@ -235,6 +294,17 @@ declare function Envapt<TConverter extends ArrayConverter>(key: string, options:
235
294
  * @param key - Environment variable name to load
236
295
  * @param options - Configuration options with primitive constructor
237
296
  * @public
297
+ * @example
298
+ * ```ts
299
+ * // Use primitive constructors to coerce values
300
+ * class Config extends Envapter {
301
+ * \@Envapt('MAX_CONNECTIONS', { converter: Number, fallback: 100 })
302
+ * static readonly maxConnections: number;
303
+ *
304
+ * \@Envapt('FEATURE_ENABLED', { converter: Boolean, fallback: false })
305
+ * static readonly featureEnabled: boolean;
306
+ * }
307
+ * ```
238
308
  */
239
309
  declare function Envapt<TConstructor extends PrimitiveConstructor>(key: string, options: {
240
310
  converter: TConstructor;
@@ -246,6 +316,17 @@ declare function Envapt<TConstructor extends PrimitiveConstructor>(key: string,
246
316
  * @param key - Environment variable name to load
247
317
  * @param options - Configuration options with fallback only
248
318
  * @public
319
+ * @example
320
+ * ```ts
321
+ * // Fallback-only usage (no converter)
322
+ * class Config extends Envapter {
323
+ * \@Envapt('LOG_FILE', { fallback: '/var/log/app.log' })
324
+ * static readonly logFile: string;
325
+ *
326
+ * \@Envapt('RETRY_POLICY', { fallback: { retries: 3, backoff: 'exponential' } })
327
+ * static readonly retryPolicy: unknown;
328
+ * }
329
+ * ```
249
330
  */
250
331
  declare function Envapt<TFallback>(key: string, options: {
251
332
  fallback: TFallback;
@@ -255,6 +336,14 @@ declare function Envapt<TFallback>(key: string, options: {
255
336
  * Classic API: No fallback
256
337
  *
257
338
  * @param key - Environment variable name to load
339
+ * @example
340
+ * ```ts
341
+ * // Classic API: no fallback — property will resolve from env or be null
342
+ * class Config extends Envapter {
343
+ * \@Envapt('SIMPLE_VALUE')
344
+ * static readonly simple?: string | null;
345
+ * }
346
+ * ```
258
347
  */
259
348
  declare function Envapt<_TReturnType = string | null>(key: string): PropertyDecorator;
260
349
  /**
@@ -264,6 +353,19 @@ declare function Envapt<_TReturnType = string | null>(key: string): PropertyDeco
264
353
  * @param fallback - Default primitive value
265
354
  * @param converter - Optional primitive constructor (String, Number, etc.)
266
355
  * @public
356
+ * @example
357
+ * ```ts
358
+ * // Classic API with primitive fallback and optional primitive converter
359
+ * class Config extends Envapter {
360
+ * // Provide fallback only
361
+ * \@Envapt('HOST', 'localhost')
362
+ * static readonly host: string;
363
+ *
364
+ * // Provide fallback and converter
365
+ * \@Envapt('PORT', 8080, Number)
366
+ * static readonly port: number;
367
+ * }
368
+ * ```
267
369
  */
268
370
  declare function Envapt<TFallback extends string | number | boolean | bigint | symbol | undefined>(key: string, fallback: InferPrimitiveFallbackType<TFallback>, converter?: PrimitiveConstructor): PropertyDecorator;
269
371