dev-env-toolkit 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2,8 +2,12 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var fs = require('fs');
6
- var path = require('path');
5
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
6
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
7
+ }) : x)(function(x) {
8
+ if (typeof require !== "undefined") return require.apply(this, arguments);
9
+ throw Error('Dynamic require of "' + x + '" is not supported');
10
+ });
7
11
 
8
12
  // src/utils/errors.ts
9
13
  var EnvValidationException = class _EnvValidationException extends Error {
@@ -365,7 +369,18 @@ var validators = {
365
369
  enum: (values) => new EnumValidatorImpl(values),
366
370
  array: () => new ArrayValidatorImpl()
367
371
  };
372
+
373
+ // src/env/parser.ts
374
+ function getNodeModules() {
375
+ if (typeof globalThis.window !== "undefined") {
376
+ throw new Error("env.load() and env.parse() are only available in Node.js environments");
377
+ }
378
+ const fs = __require("fs");
379
+ const path = __require("path");
380
+ return { fs, path };
381
+ }
368
382
  function parseEnvFile(filePath) {
383
+ const { fs, path } = getNodeModules();
369
384
  const absolutePath = path.resolve(process.cwd(), filePath);
370
385
  if (!fs.existsSync(absolutePath)) {
371
386
  return {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/env/validators.ts","../src/env/parser.ts","../src/env/index.ts"],"names":["resolve","existsSync","readFileSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EnvValidationError } from '../env/types.js';\n\n/**\n * Custom error class for environment validation errors\n */\nexport class EnvValidationException extends Error {\n public readonly errors: EnvValidationError[];\n\n constructor(errors: EnvValidationError[]) {\n const message = formatValidationErrors(errors);\n super(message);\n this.name = 'EnvValidationException';\n this.errors = errors;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EnvValidationException);\n }\n }\n}\n\n/**\n * Format validation errors into a readable message\n */\nfunction formatValidationErrors(errors: EnvValidationError[]): string {\n const lines = [\n '',\n '\\x1b[31m\\x1b[1mEnvironment Validation Failed\\x1b[0m',\n '',\n `Found ${errors.length} error${errors.length > 1 ? 's' : ''}:`,\n '',\n ];\n\n for (const error of errors) {\n lines.push(` \\x1b[33m${error.key}\\x1b[0m: ${error.message}`);\n if (error.value !== undefined) {\n lines.push(` Received: \\x1b[90m${error.value || '(empty)'}\\x1b[0m`);\n }\n if (error.expected) {\n lines.push(` Expected: \\x1b[90m${error.expected}\\x1b[0m`);\n }\n lines.push('');\n }\n\n lines.push('\\x1b[36mTip:\\x1b[0m Check your .env file or environment variables');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Custom error for parsing errors\n */\nexport class EnvParseError extends Error {\n public readonly key: string;\n public readonly value?: string;\n\n constructor(key: string, message: string, value?: string) {\n super(`${key}: ${message}`);\n this.name = 'EnvParseError';\n this.key = key;\n this.value = value;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EnvParseError);\n }\n }\n}\n","import type {\n Validator,\n StringValidator,\n NumberValidator,\n BooleanValidator,\n EnumValidator,\n ArrayValidator,\n} from './types.js';\nimport { EnvParseError } from '../utils/errors.js';\n\n// Static lookup sets for boolean parsing (shared across all instances)\nconst TRUE_VALUES = new Set(['true', '1', 'yes', 'on']);\nconst FALSE_VALUES = new Set(['false', '0', 'no', 'off']);\n\n// Sentinel symbol for optional missing values\nconst OPTIONAL_MISSING = Symbol('optional');\n\n/**\n * Base validator class with common functionality\n */\nabstract class BaseValidator<T> implements Validator<T> {\n _type!: T;\n _optional = false;\n _default?: T;\n\n abstract parse(value: string | undefined, key: string): T;\n\n optional(): Validator<T | undefined> {\n const clone = this.clone();\n clone._optional = true;\n return clone as Validator<T | undefined>;\n }\n\n default(value: T): Validator<T> {\n const clone = this.clone();\n clone._default = value;\n return clone;\n }\n\n protected abstract clone(): BaseValidator<T>;\n\n protected getRequired(value: string | undefined, key: string): string | symbol {\n if (value === undefined || value === '') {\n if (this._default !== undefined) {\n throw new DefaultValueUsed(this._default);\n }\n if (this._optional) {\n return OPTIONAL_MISSING;\n }\n throw new EnvParseError(key, 'Required environment variable is missing');\n }\n return value;\n }\n}\n\n// Sentinel class for default value (carries the value)\nclass DefaultValueUsed<T> {\n constructor(public readonly value: T) {}\n}\n\n/**\n * String validator implementation\n */\nclass StringValidatorImpl extends BaseValidator<string> implements StringValidator {\n private constraints: Array<(value: string, key: string) => void> = [];\n\n parse(value: string | undefined, key: string): string {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as string;\n\n for (const constraint of this.constraints) {\n constraint(str as string, key);\n }\n\n return str as string;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as string;\n throw e;\n }\n }\n\n min(length: number): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length < length) {\n throw new EnvParseError(\n key,\n `String must be at least ${length} characters`,\n value\n );\n }\n });\n return clone;\n }\n\n max(length: number): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length > length) {\n throw new EnvParseError(\n key,\n `String must be at most ${length} characters`,\n value\n );\n }\n });\n return clone;\n }\n\n url(): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n try {\n new URL(value);\n } catch {\n throw new EnvParseError(key, 'Invalid URL format', value);\n }\n });\n return clone;\n }\n\n email(): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n throw new EnvParseError(key, 'Invalid email format', value);\n }\n });\n return clone;\n }\n\n regex(pattern: RegExp): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (!pattern.test(value)) {\n throw new EnvParseError(\n key,\n `String does not match pattern ${pattern}`,\n value\n );\n }\n });\n return clone;\n }\n\n protected clone(): StringValidatorImpl {\n const clone = new StringValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Number validator implementation\n */\nclass NumberValidatorImpl extends BaseValidator<number> implements NumberValidator {\n private constraints: Array<(value: number, key: string) => void> = [];\n\n parse(value: string | undefined, key: string): number {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as number;\n\n const num = Number(str);\n if (isNaN(num)) {\n throw new EnvParseError(key, 'Invalid number format', str as string);\n }\n\n for (const constraint of this.constraints) {\n constraint(num, key);\n }\n\n return num;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as number;\n throw e;\n }\n }\n\n min(minValue: number): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value < minValue) {\n throw new EnvParseError(\n key,\n `Number must be at least ${minValue}`,\n String(value)\n );\n }\n });\n return clone;\n }\n\n max(maxValue: number): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value > maxValue) {\n throw new EnvParseError(\n key,\n `Number must be at most ${maxValue}`,\n String(value)\n );\n }\n });\n return clone;\n }\n\n int(): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (!Number.isInteger(value)) {\n throw new EnvParseError(key, 'Number must be an integer', String(value));\n }\n });\n return clone;\n }\n\n positive(): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value <= 0) {\n throw new EnvParseError(key, 'Number must be positive', String(value));\n }\n });\n return clone;\n }\n\n port(): NumberValidator {\n return this.int().min(1).max(65535);\n }\n\n protected clone(): NumberValidatorImpl {\n const clone = new NumberValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Boolean validator implementation\n */\nclass BooleanValidatorImpl extends BaseValidator<boolean> implements BooleanValidator {\n parse(value: string | undefined, key: string): boolean {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as boolean;\n\n const lower = (str as string).toLowerCase();\n if (TRUE_VALUES.has(lower)) return true;\n if (FALSE_VALUES.has(lower)) return false;\n\n throw new EnvParseError(\n key,\n 'Invalid boolean value. Expected: true, false, 1, 0, yes, no, on, off',\n lower\n );\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as boolean;\n throw e;\n }\n }\n\n protected clone(): BooleanValidatorImpl {\n const clone = new BooleanValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n return clone;\n }\n}\n\n/**\n * Enum validator implementation\n */\nclass EnumValidatorImpl<T extends string>\n extends BaseValidator<T>\n implements EnumValidator<T>\n{\n constructor(private readonly values: readonly T[]) {\n super();\n }\n\n parse(value: string | undefined, key: string): T {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as T;\n\n if (!this.values.includes(str as T)) {\n throw new EnvParseError(\n key,\n `Invalid enum value. Expected one of: ${this.values.join(', ')}`,\n str as string\n );\n }\n\n return str as T;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as T;\n throw e;\n }\n }\n\n protected clone(): EnumValidatorImpl<T> {\n const clone = new EnumValidatorImpl(this.values);\n clone._optional = this._optional;\n clone._default = this._default;\n return clone;\n }\n}\n\n/**\n * Array validator implementation\n */\nclass ArrayValidatorImpl extends BaseValidator<string[]> implements ArrayValidator {\n private sep = ',';\n private constraints: Array<(value: string[], key: string) => void> = [];\n\n parse(value: string | undefined, key: string): string[] {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as string[];\n\n const arr = (str as string)\n .split(this.sep)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n for (const constraint of this.constraints) {\n constraint(arr, key);\n }\n\n return arr;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as string[];\n throw e;\n }\n }\n\n separator(sep: string): ArrayValidator {\n const clone = this.clone();\n clone.sep = sep;\n return clone;\n }\n\n min(length: number): ArrayValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length < length) {\n throw new EnvParseError(\n key,\n `Array must have at least ${length} items`,\n value.join(this.sep)\n );\n }\n });\n return clone;\n }\n\n max(length: number): ArrayValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length > length) {\n throw new EnvParseError(\n key,\n `Array must have at most ${length} items`,\n value.join(this.sep)\n );\n }\n });\n return clone;\n }\n\n protected clone(): ArrayValidatorImpl {\n const clone = new ArrayValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.sep = this.sep;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Factory functions for creating validators\n */\nexport const validators = {\n string: (): StringValidator => new StringValidatorImpl(),\n number: (): NumberValidator => new NumberValidatorImpl(),\n boolean: (): BooleanValidator => new BooleanValidatorImpl(),\n enum: <T extends string>(values: readonly T[]): EnumValidator<T> =>\n new EnumValidatorImpl(values),\n array: (): ArrayValidator => new ArrayValidatorImpl(),\n};\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\n/**\n * Parse a .env file and return key-value pairs\n */\nexport function parseEnvFile(filePath: string): Record<string, string> {\n const absolutePath = resolve(process.cwd(), filePath);\n\n if (!existsSync(absolutePath)) {\n return {};\n }\n\n const content = readFileSync(absolutePath, 'utf-8');\n return parseEnvContent(content);\n}\n\n/**\n * Parse .env file content string into key-value pairs\n */\nexport function parseEnvContent(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = content.split(/\\r?\\n/);\n\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum]!.trim();\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n // Find the first = sign\n const equalsIndex = line.indexOf('=');\n if (equalsIndex === -1) {\n continue;\n }\n\n const key = line.substring(0, equalsIndex).trim();\n let value = line.substring(equalsIndex + 1).trim();\n\n // Skip if key is empty\n if (!key) {\n continue;\n }\n\n // Handle quoted values\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n // Handle escape sequences in double-quoted strings\n if (line.substring(equalsIndex + 1).trim().startsWith('\"')) {\n value = value\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\r/g, '\\r')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, '\\\\');\n }\n } else {\n // Remove inline comments for unquoted values\n const commentIndex = value.indexOf('#');\n if (commentIndex !== -1) {\n value = value.substring(0, commentIndex).trim();\n }\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Load environment variables from a .env file into the current environment\n */\nexport function loadEnvFile(\n filePath = '.env',\n options: { override?: boolean } = {}\n): Record<string, string> {\n const parsed = parseEnvFile(filePath);\n\n for (const [key, value] of Object.entries(parsed)) {\n if (options.override || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n\n return parsed;\n}\n","import type {\n EnvSchema,\n InferEnv,\n EnvParseOptions,\n EnvValidationError,\n EnvParseResult,\n} from './types.js';\nimport { validators } from './validators.js';\nimport { loadEnvFile, parseEnvFile } from './parser.js';\nimport { EnvValidationException, EnvParseError } from '../utils/errors.js';\n\nexport type { EnvSchema, InferEnv, EnvParseOptions, EnvValidationError, EnvParseResult };\nexport { EnvValidationException, EnvParseError };\n\n/**\n * Create a type-safe environment configuration\n *\n * @example\n * ```typescript\n * import { env } from 'dev-env-toolkit';\n *\n * const config = env.create({\n * PORT: env.number().default(3000),\n * DATABASE_URL: env.string(),\n * NODE_ENV: env.enum(['development', 'production', 'test']),\n * DEBUG: env.boolean().default(false),\n * });\n *\n * // Fully typed!\n * console.log(config.PORT); // number\n * console.log(config.DEBUG); // boolean\n * ```\n */\nfunction create<T extends EnvSchema>(\n schema: T,\n options: EnvParseOptions = {}\n): InferEnv<T> {\n const { path, throwOnError = true, env: customEnv } = options;\n\n // Load .env file if path is provided\n if (path) {\n loadEnvFile(path);\n }\n\n // Use custom env or process.env\n const envSource = customEnv ?? process.env;\n\n const errors: EnvValidationError[] = [];\n const result: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(schema)) {\n try {\n const value = envSource[key];\n result[key] = validator.parse(value, key);\n } catch (error) {\n if (error instanceof EnvParseError) {\n errors.push({\n key: error.key,\n message: error.message.replace(`${error.key}: `, ''),\n value: error.value,\n });\n } else {\n throw error;\n }\n }\n }\n\n if (errors.length > 0 && throwOnError) {\n throw new EnvValidationException(errors);\n }\n\n return result as InferEnv<T>;\n}\n\n/**\n * Safely parse environment variables without throwing\n *\n * @example\n * ```typescript\n * const result = env.safeParse({\n * PORT: env.number(),\n * });\n *\n * if (result.success) {\n * console.log(result.data.PORT);\n * } else {\n * console.error(result.errors);\n * }\n * ```\n */\nfunction safeParse<T extends EnvSchema>(\n schema: T,\n options: Omit<EnvParseOptions, 'throwOnError'> = {}\n): EnvParseResult<InferEnv<T>> {\n const { path, env: customEnv } = options;\n\n // Load .env file if path is provided\n if (path) {\n loadEnvFile(path);\n }\n\n // Use custom env or process.env\n const envSource = customEnv ?? process.env;\n\n const errors: EnvValidationError[] = [];\n const result: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(schema)) {\n try {\n const value = envSource[key];\n result[key] = validator.parse(value, key);\n } catch (error) {\n if (error instanceof EnvParseError) {\n errors.push({\n key: error.key,\n message: error.message.replace(`${error.key}: `, ''),\n value: error.value,\n });\n } else {\n throw error;\n }\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, data: result as InferEnv<T> };\n}\n\n/**\n * The main env object with all utilities\n */\nexport const env = {\n // Schema creation\n create,\n safeParse,\n\n // Validators\n string: validators.string,\n number: validators.number,\n boolean: validators.boolean,\n enum: validators.enum,\n array: validators.array,\n\n // File utilities\n load: loadEnvFile,\n parse: parseEnvFile,\n};\n\nexport default env;\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/env/validators.ts","../src/env/parser.ts","../src/env/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EnvValidationError } from '../env/types.js';\n\n/**\n * Custom error class for environment validation errors\n */\nexport class EnvValidationException extends Error {\n public readonly errors: EnvValidationError[];\n\n constructor(errors: EnvValidationError[]) {\n const message = formatValidationErrors(errors);\n super(message);\n this.name = 'EnvValidationException';\n this.errors = errors;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EnvValidationException);\n }\n }\n}\n\n/**\n * Format validation errors into a readable message\n */\nfunction formatValidationErrors(errors: EnvValidationError[]): string {\n const lines = [\n '',\n '\\x1b[31m\\x1b[1mEnvironment Validation Failed\\x1b[0m',\n '',\n `Found ${errors.length} error${errors.length > 1 ? 's' : ''}:`,\n '',\n ];\n\n for (const error of errors) {\n lines.push(` \\x1b[33m${error.key}\\x1b[0m: ${error.message}`);\n if (error.value !== undefined) {\n lines.push(` Received: \\x1b[90m${error.value || '(empty)'}\\x1b[0m`);\n }\n if (error.expected) {\n lines.push(` Expected: \\x1b[90m${error.expected}\\x1b[0m`);\n }\n lines.push('');\n }\n\n lines.push('\\x1b[36mTip:\\x1b[0m Check your .env file or environment variables');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Custom error for parsing errors\n */\nexport class EnvParseError extends Error {\n public readonly key: string;\n public readonly value?: string;\n\n constructor(key: string, message: string, value?: string) {\n super(`${key}: ${message}`);\n this.name = 'EnvParseError';\n this.key = key;\n this.value = value;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EnvParseError);\n }\n }\n}\n","import type {\n Validator,\n StringValidator,\n NumberValidator,\n BooleanValidator,\n EnumValidator,\n ArrayValidator,\n} from './types.js';\nimport { EnvParseError } from '../utils/errors.js';\n\n// Static lookup sets for boolean parsing (shared across all instances)\nconst TRUE_VALUES = new Set(['true', '1', 'yes', 'on']);\nconst FALSE_VALUES = new Set(['false', '0', 'no', 'off']);\n\n// Sentinel symbol for optional missing values\nconst OPTIONAL_MISSING = Symbol('optional');\n\n/**\n * Base validator class with common functionality\n */\nabstract class BaseValidator<T> implements Validator<T> {\n _type!: T;\n _optional = false;\n _default?: T;\n\n abstract parse(value: string | undefined, key: string): T;\n\n optional(): Validator<T | undefined> {\n const clone = this.clone();\n clone._optional = true;\n return clone as Validator<T | undefined>;\n }\n\n default(value: T): Validator<T> {\n const clone = this.clone();\n clone._default = value;\n return clone;\n }\n\n protected abstract clone(): BaseValidator<T>;\n\n protected getRequired(value: string | undefined, key: string): string | symbol {\n if (value === undefined || value === '') {\n if (this._default !== undefined) {\n throw new DefaultValueUsed(this._default);\n }\n if (this._optional) {\n return OPTIONAL_MISSING;\n }\n throw new EnvParseError(key, 'Required environment variable is missing');\n }\n return value;\n }\n}\n\n// Sentinel class for default value (carries the value)\nclass DefaultValueUsed<T> {\n constructor(public readonly value: T) {}\n}\n\n/**\n * String validator implementation\n */\nclass StringValidatorImpl extends BaseValidator<string> implements StringValidator {\n private constraints: Array<(value: string, key: string) => void> = [];\n\n parse(value: string | undefined, key: string): string {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as string;\n\n for (const constraint of this.constraints) {\n constraint(str as string, key);\n }\n\n return str as string;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as string;\n throw e;\n }\n }\n\n min(length: number): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length < length) {\n throw new EnvParseError(\n key,\n `String must be at least ${length} characters`,\n value\n );\n }\n });\n return clone;\n }\n\n max(length: number): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length > length) {\n throw new EnvParseError(\n key,\n `String must be at most ${length} characters`,\n value\n );\n }\n });\n return clone;\n }\n\n url(): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n try {\n new URL(value);\n } catch {\n throw new EnvParseError(key, 'Invalid URL format', value);\n }\n });\n return clone;\n }\n\n email(): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n throw new EnvParseError(key, 'Invalid email format', value);\n }\n });\n return clone;\n }\n\n regex(pattern: RegExp): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (!pattern.test(value)) {\n throw new EnvParseError(\n key,\n `String does not match pattern ${pattern}`,\n value\n );\n }\n });\n return clone;\n }\n\n protected clone(): StringValidatorImpl {\n const clone = new StringValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Number validator implementation\n */\nclass NumberValidatorImpl extends BaseValidator<number> implements NumberValidator {\n private constraints: Array<(value: number, key: string) => void> = [];\n\n parse(value: string | undefined, key: string): number {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as number;\n\n const num = Number(str);\n if (isNaN(num)) {\n throw new EnvParseError(key, 'Invalid number format', str as string);\n }\n\n for (const constraint of this.constraints) {\n constraint(num, key);\n }\n\n return num;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as number;\n throw e;\n }\n }\n\n min(minValue: number): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value < minValue) {\n throw new EnvParseError(\n key,\n `Number must be at least ${minValue}`,\n String(value)\n );\n }\n });\n return clone;\n }\n\n max(maxValue: number): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value > maxValue) {\n throw new EnvParseError(\n key,\n `Number must be at most ${maxValue}`,\n String(value)\n );\n }\n });\n return clone;\n }\n\n int(): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (!Number.isInteger(value)) {\n throw new EnvParseError(key, 'Number must be an integer', String(value));\n }\n });\n return clone;\n }\n\n positive(): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value <= 0) {\n throw new EnvParseError(key, 'Number must be positive', String(value));\n }\n });\n return clone;\n }\n\n port(): NumberValidator {\n return this.int().min(1).max(65535);\n }\n\n protected clone(): NumberValidatorImpl {\n const clone = new NumberValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Boolean validator implementation\n */\nclass BooleanValidatorImpl extends BaseValidator<boolean> implements BooleanValidator {\n parse(value: string | undefined, key: string): boolean {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as boolean;\n\n const lower = (str as string).toLowerCase();\n if (TRUE_VALUES.has(lower)) return true;\n if (FALSE_VALUES.has(lower)) return false;\n\n throw new EnvParseError(\n key,\n 'Invalid boolean value. Expected: true, false, 1, 0, yes, no, on, off',\n lower\n );\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as boolean;\n throw e;\n }\n }\n\n protected clone(): BooleanValidatorImpl {\n const clone = new BooleanValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n return clone;\n }\n}\n\n/**\n * Enum validator implementation\n */\nclass EnumValidatorImpl<T extends string>\n extends BaseValidator<T>\n implements EnumValidator<T>\n{\n constructor(private readonly values: readonly T[]) {\n super();\n }\n\n parse(value: string | undefined, key: string): T {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as T;\n\n if (!this.values.includes(str as T)) {\n throw new EnvParseError(\n key,\n `Invalid enum value. Expected one of: ${this.values.join(', ')}`,\n str as string\n );\n }\n\n return str as T;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as T;\n throw e;\n }\n }\n\n protected clone(): EnumValidatorImpl<T> {\n const clone = new EnumValidatorImpl(this.values);\n clone._optional = this._optional;\n clone._default = this._default;\n return clone;\n }\n}\n\n/**\n * Array validator implementation\n */\nclass ArrayValidatorImpl extends BaseValidator<string[]> implements ArrayValidator {\n private sep = ',';\n private constraints: Array<(value: string[], key: string) => void> = [];\n\n parse(value: string | undefined, key: string): string[] {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as string[];\n\n const arr = (str as string)\n .split(this.sep)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n for (const constraint of this.constraints) {\n constraint(arr, key);\n }\n\n return arr;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as string[];\n throw e;\n }\n }\n\n separator(sep: string): ArrayValidator {\n const clone = this.clone();\n clone.sep = sep;\n return clone;\n }\n\n min(length: number): ArrayValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length < length) {\n throw new EnvParseError(\n key,\n `Array must have at least ${length} items`,\n value.join(this.sep)\n );\n }\n });\n return clone;\n }\n\n max(length: number): ArrayValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length > length) {\n throw new EnvParseError(\n key,\n `Array must have at most ${length} items`,\n value.join(this.sep)\n );\n }\n });\n return clone;\n }\n\n protected clone(): ArrayValidatorImpl {\n const clone = new ArrayValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.sep = this.sep;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Factory functions for creating validators\n */\nexport const validators = {\n string: (): StringValidator => new StringValidatorImpl(),\n number: (): NumberValidator => new NumberValidatorImpl(),\n boolean: (): BooleanValidator => new BooleanValidatorImpl(),\n enum: <T extends string>(values: readonly T[]): EnumValidator<T> =>\n new EnumValidatorImpl(values),\n array: (): ArrayValidator => new ArrayValidatorImpl(),\n};\n","/**\n * Get Node.js modules (fs and path) with lazy loading\n * Throws an error if called in browser environment\n */\nfunction getNodeModules() {\n if (typeof (globalThis as { window?: unknown }).window !== 'undefined') {\n throw new Error('env.load() and env.parse() are only available in Node.js environments');\n }\n // Dynamic require for Node.js only\n const fs = require('node:fs') as typeof import('node:fs');\n const path = require('node:path') as typeof import('node:path');\n return { fs, path };\n}\n\n/**\n * Parse a .env file and return key-value pairs\n */\nexport function parseEnvFile(filePath: string): Record<string, string> {\n const { fs, path } = getNodeModules();\n const absolutePath = path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(absolutePath)) {\n return {};\n }\n\n const content = fs.readFileSync(absolutePath, 'utf-8');\n return parseEnvContent(content);\n}\n\n/**\n * Parse .env file content string into key-value pairs\n */\nexport function parseEnvContent(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = content.split(/\\r?\\n/);\n\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum]!.trim();\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n // Find the first = sign\n const equalsIndex = line.indexOf('=');\n if (equalsIndex === -1) {\n continue;\n }\n\n const key = line.substring(0, equalsIndex).trim();\n let value = line.substring(equalsIndex + 1).trim();\n\n // Skip if key is empty\n if (!key) {\n continue;\n }\n\n // Handle quoted values\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n // Handle escape sequences in double-quoted strings\n if (line.substring(equalsIndex + 1).trim().startsWith('\"')) {\n value = value\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\r/g, '\\r')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, '\\\\');\n }\n } else {\n // Remove inline comments for unquoted values\n const commentIndex = value.indexOf('#');\n if (commentIndex !== -1) {\n value = value.substring(0, commentIndex).trim();\n }\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Load environment variables from a .env file into the current environment\n */\nexport function loadEnvFile(\n filePath = '.env',\n options: { override?: boolean } = {}\n): Record<string, string> {\n const parsed = parseEnvFile(filePath);\n\n for (const [key, value] of Object.entries(parsed)) {\n if (options.override || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n\n return parsed;\n}\n","import type {\n EnvSchema,\n InferEnv,\n EnvParseOptions,\n EnvValidationError,\n EnvParseResult,\n} from './types.js';\nimport { validators } from './validators.js';\nimport { loadEnvFile, parseEnvFile } from './parser.js';\nimport { EnvValidationException, EnvParseError } from '../utils/errors.js';\n\nexport type { EnvSchema, InferEnv, EnvParseOptions, EnvValidationError, EnvParseResult };\nexport { EnvValidationException, EnvParseError };\n\n/**\n * Create a type-safe environment configuration\n *\n * @example\n * ```typescript\n * import { env } from 'dev-env-toolkit';\n *\n * const config = env.create({\n * PORT: env.number().default(3000),\n * DATABASE_URL: env.string(),\n * NODE_ENV: env.enum(['development', 'production', 'test']),\n * DEBUG: env.boolean().default(false),\n * });\n *\n * // Fully typed!\n * console.log(config.PORT); // number\n * console.log(config.DEBUG); // boolean\n * ```\n */\nfunction create<T extends EnvSchema>(\n schema: T,\n options: EnvParseOptions = {}\n): InferEnv<T> {\n const { path, throwOnError = true, env: customEnv } = options;\n\n // Load .env file if path is provided\n if (path) {\n loadEnvFile(path);\n }\n\n // Use custom env or process.env\n const envSource = customEnv ?? process.env;\n\n const errors: EnvValidationError[] = [];\n const result: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(schema)) {\n try {\n const value = envSource[key];\n result[key] = validator.parse(value, key);\n } catch (error) {\n if (error instanceof EnvParseError) {\n errors.push({\n key: error.key,\n message: error.message.replace(`${error.key}: `, ''),\n value: error.value,\n });\n } else {\n throw error;\n }\n }\n }\n\n if (errors.length > 0 && throwOnError) {\n throw new EnvValidationException(errors);\n }\n\n return result as InferEnv<T>;\n}\n\n/**\n * Safely parse environment variables without throwing\n *\n * @example\n * ```typescript\n * const result = env.safeParse({\n * PORT: env.number(),\n * });\n *\n * if (result.success) {\n * console.log(result.data.PORT);\n * } else {\n * console.error(result.errors);\n * }\n * ```\n */\nfunction safeParse<T extends EnvSchema>(\n schema: T,\n options: Omit<EnvParseOptions, 'throwOnError'> = {}\n): EnvParseResult<InferEnv<T>> {\n const { path, env: customEnv } = options;\n\n // Load .env file if path is provided\n if (path) {\n loadEnvFile(path);\n }\n\n // Use custom env or process.env\n const envSource = customEnv ?? process.env;\n\n const errors: EnvValidationError[] = [];\n const result: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(schema)) {\n try {\n const value = envSource[key];\n result[key] = validator.parse(value, key);\n } catch (error) {\n if (error instanceof EnvParseError) {\n errors.push({\n key: error.key,\n message: error.message.replace(`${error.key}: `, ''),\n value: error.value,\n });\n } else {\n throw error;\n }\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, data: result as InferEnv<T> };\n}\n\n/**\n * The main env object with all utilities\n */\nexport const env = {\n // Schema creation\n create,\n safeParse,\n\n // Validators\n string: validators.string,\n number: validators.number,\n boolean: validators.boolean,\n enum: validators.enum,\n array: validators.array,\n\n // File utilities\n load: loadEnvFile,\n parse: parseEnvFile,\n};\n\nexport default env;\n"]}
package/dist/index.js CHANGED
@@ -1,5 +1,9 @@
1
- import { existsSync, readFileSync } from 'fs';
2
- import { resolve } from 'path';
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
3
7
 
4
8
  // src/utils/errors.ts
5
9
  var EnvValidationException = class _EnvValidationException extends Error {
@@ -361,12 +365,23 @@ var validators = {
361
365
  enum: (values) => new EnumValidatorImpl(values),
362
366
  array: () => new ArrayValidatorImpl()
363
367
  };
368
+
369
+ // src/env/parser.ts
370
+ function getNodeModules() {
371
+ if (typeof globalThis.window !== "undefined") {
372
+ throw new Error("env.load() and env.parse() are only available in Node.js environments");
373
+ }
374
+ const fs = __require("fs");
375
+ const path = __require("path");
376
+ return { fs, path };
377
+ }
364
378
  function parseEnvFile(filePath) {
365
- const absolutePath = resolve(process.cwd(), filePath);
366
- if (!existsSync(absolutePath)) {
379
+ const { fs, path } = getNodeModules();
380
+ const absolutePath = path.resolve(process.cwd(), filePath);
381
+ if (!fs.existsSync(absolutePath)) {
367
382
  return {};
368
383
  }
369
- const content = readFileSync(absolutePath, "utf-8");
384
+ const content = fs.readFileSync(absolutePath, "utf-8");
370
385
  return parseEnvContent(content);
371
386
  }
372
387
  function parseEnvContent(content) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/errors.ts","../src/env/validators.ts","../src/env/parser.ts","../src/env/index.ts"],"names":[],"mappings":";;;;AAKO,IAAM,sBAAA,GAAN,MAAM,uBAAA,SAA+B,KAAA,CAAM;AAAA,EAChC,MAAA;AAAA,EAEhB,YAAY,MAAA,EAA8B;AACxC,IAAA,MAAM,OAAA,GAAU,uBAAuB,MAAM,CAAA;AAC7C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,uBAAsB,CAAA;AAAA,IACtD;AAAA,EACF;AACF;AAKA,SAAS,uBAAuB,MAAA,EAAsC;AACpE,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,EAAA;AAAA,IACA,qDAAA;AAAA,IACA,EAAA;AAAA,IACA,CAAA,MAAA,EAAS,OAAO,MAAM,CAAA,MAAA,EAAS,OAAO,MAAA,GAAS,CAAA,GAAI,MAAM,EAAE,CAAA,CAAA,CAAA;AAAA,IAC3D;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,KAAA,CAAM,GAAG,CAAA,SAAA,EAAY,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC5D,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,KAAA,CAAM,KAAA,IAAS,SAAS,CAAA,OAAA,CAAS,CAAA;AAAA,IACvE;AACA,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,KAAA,CAAM,QAAQ,CAAA,OAAA,CAAS,CAAA;AAAA,IAC7D;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,KAAK,mEAAmE,CAAA;AAC9E,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,IAAM,aAAA,GAAN,MAAM,cAAA,SAAsB,KAAA,CAAM;AAAA,EACvB,GAAA;AAAA,EACA,KAAA;AAAA,EAEhB,WAAA,CAAY,GAAA,EAAa,OAAA,EAAiB,KAAA,EAAgB;AACxD,IAAA,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAEb,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,cAAa,CAAA;AAAA,IAC7C;AAAA,EACF;AACF;;;ACxDA,IAAM,WAAA,uBAAkB,GAAA,CAAI,CAAC,QAAQ,GAAA,EAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AACtD,IAAM,YAAA,uBAAmB,GAAA,CAAI,CAAC,SAAS,GAAA,EAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAGxD,IAAM,gBAAA,0BAA0B,UAAU,CAAA;AAK1C,IAAe,gBAAf,MAAwD;AAAA,EACtD,KAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA;AAAA,EAIA,QAAA,GAAqC;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,QAAQ,KAAA,EAAwB;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AACjB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAIU,WAAA,CAAY,OAA2B,GAAA,EAA8B;AAC7E,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,EAAI;AACvC,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,QAAA,MAAM,IAAI,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC1C;AACA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,OAAO,gBAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,0CAA0C,CAAA;AAAA,IACzE;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAGA,IAAM,mBAAN,MAA0B;AAAA,EACxB,YAA4B,KAAA,EAAU;AAAV,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAW;AACzC,CAAA;AAKA,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAA4B,aAAA,CAAiD;AAAA,EACzE,cAA2D,EAAC;AAAA,EAEpE,KAAA,CAAM,OAA2B,GAAA,EAAqB;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,GAAG,CAAA;AACvC,MAAA,IAAI,GAAA,KAAQ,kBAAkB,OAAO,KAAA,CAAA;AAErC,MAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,QAAA,UAAA,CAAW,KAAe,GAAG,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,GAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,YAAa,gBAAA,EAAkB,OAAO,CAAA,CAAE,KAAA;AAC5C,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,IAAI,MAAA,EAAiC;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,GAAA;AAAA,UACA,2BAA2B,MAAM,CAAA,WAAA,CAAA;AAAA,UACjC;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,IAAI,MAAA,EAAiC;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,GAAA;AAAA,UACA,0BAA0B,MAAM,CAAA,WAAA,CAAA;AAAA,UAChC;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,GAAA,GAAuB;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI;AACF,QAAA,IAAI,IAAI,KAAK,CAAA;AAAA,MACf,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,oBAAA,EAAsB,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAyB;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,MAAM,UAAA,GAAa,4BAAA;AACnB,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,sBAAA,EAAwB,KAAK,CAAA;AAAA,MAC5D;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,EAAkC;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,GAAA;AAAA,UACA,iCAAiC,OAAO,CAAA,CAAA;AAAA,UACxC;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEU,KAAA,GAA6B;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAI,oBAAA,EAAoB;AACtC,IAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,KAAA,CAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AACxC,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAKA,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAA4B,aAAA,CAAiD;AAAA,EACzE,cAA2D,EAAC;AAAA,EAEpE,KAAA,CAAM,OAA2B,GAAA,EAAqB;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,GAAG,CAAA;AACvC,MAAA,IAAI,GAAA,KAAQ,kBAAkB,OAAO,KAAA,CAAA;AAErC,MAAA,MAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,MAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACd,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,uBAAA,EAAyB,GAAa,CAAA;AAAA,MACrE;AAEA,MAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,MACrB;AAEA,MAAA,OAAO,GAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,YAAa,gBAAA,EAAkB,OAAO,CAAA,CAAE,KAAA;AAC5C,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,IAAI,QAAA,EAAmC;AACrC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,GAAA;AAAA,UACA,2BAA2B,QAAQ,CAAA,CAAA;AAAA,UACnC,OAAO,KAAK;AAAA,SACd;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,IAAI,QAAA,EAAmC;AACrC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,GAAA;AAAA,UACA,0BAA0B,QAAQ,CAAA,CAAA;AAAA,UAClC,OAAO,KAAK;AAAA,SACd;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,GAAA,GAAuB;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,2BAAA,EAA6B,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACzE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAA4B;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,yBAAA,EAA2B,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACvE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAwB;AACtB,IAAA,OAAO,KAAK,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,KAAK,CAAA;AAAA,EACpC;AAAA,EAEU,KAAA,GAA6B;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAI,oBAAA,EAAoB;AACtC,IAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,KAAA,CAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AACxC,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAKA,IAAM,oBAAA,GAAN,MAAM,qBAAA,SAA6B,aAAA,CAAmD;AAAA,EACpF,KAAA,CAAM,OAA2B,GAAA,EAAsB;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,GAAG,CAAA;AACvC,MAAA,IAAI,GAAA,KAAQ,kBAAkB,OAAO,KAAA,CAAA;AAErC,MAAA,MAAM,KAAA,GAAS,IAAe,WAAA,EAAY;AAC1C,MAAA,IAAI,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,IAAA;AACnC,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,KAAA;AAEpC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,GAAA;AAAA,QACA,sEAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,YAAa,gBAAA,EAAkB,OAAO,CAAA,CAAE,KAAA;AAC5C,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEU,KAAA,GAA8B;AACtC,IAAA,MAAM,KAAA,GAAQ,IAAI,qBAAA,EAAqB;AACvC,IAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAKA,IAAM,iBAAA,GAAN,MAAM,kBAAA,SACI,aAAA,CAEV;AAAA,EACE,YAA6B,MAAA,EAAsB;AACjD,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAE7B;AAAA,EAEA,KAAA,CAAM,OAA2B,GAAA,EAAgB;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,GAAG,CAAA;AACvC,MAAA,IAAI,GAAA,KAAQ,kBAAkB,OAAO,KAAA,CAAA;AAErC,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAQ,CAAA,EAAG;AACnC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,GAAA;AAAA,UACA,CAAA,qCAAA,EAAwC,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UAC9D;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO,GAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,YAAa,gBAAA,EAAkB,OAAO,CAAA,CAAE,KAAA;AAC5C,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEU,KAAA,GAA8B;AACtC,IAAA,MAAM,KAAA,GAAQ,IAAI,kBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA;AAC/C,IAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAKA,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,aAAA,CAAkD;AAAA,EACzE,GAAA,GAAM,GAAA;AAAA,EACN,cAA6D,EAAC;AAAA,EAEtE,KAAA,CAAM,OAA2B,GAAA,EAAuB;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,GAAG,CAAA;AACvC,MAAA,IAAI,GAAA,KAAQ,kBAAkB,OAAO,KAAA,CAAA;AAErC,MAAA,MAAM,MAAO,GAAA,CACV,KAAA,CAAM,KAAK,GAAG,CAAA,CACd,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAE7B,MAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AAAA,MACrB;AAEA,MAAA,OAAO,GAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,YAAa,gBAAA,EAAkB,OAAO,CAAA,CAAE,KAAA;AAC5C,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,UAAU,GAAA,EAA6B;AACrC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,GAAA,GAAM,GAAA;AACZ,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,IAAI,MAAA,EAAgC;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,GAAA;AAAA,UACA,4BAA4B,MAAM,CAAA,MAAA,CAAA;AAAA,UAClC,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA,SACrB;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,IAAI,MAAA,EAAgC;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,GAAA;AAAA,UACA,2BAA2B,MAAM,CAAA,MAAA,CAAA;AAAA,UACjC,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA,SACrB;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEU,KAAA,GAA4B;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAI,mBAAA,EAAmB;AACrC,IAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,KAAA,CAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,KAAA,CAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AACxC,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAKO,IAAM,UAAA,GAAa;AAAA,EACxB,MAAA,EAAQ,MAAuB,IAAI,mBAAA,EAAoB;AAAA,EACvD,MAAA,EAAQ,MAAuB,IAAI,mBAAA,EAAoB;AAAA,EACvD,OAAA,EAAS,MAAwB,IAAI,oBAAA,EAAqB;AAAA,EAC1D,IAAA,EAAM,CAAmB,MAAA,KACvB,IAAI,kBAAkB,MAAM,CAAA;AAAA,EAC9B,KAAA,EAAO,MAAsB,IAAI,kBAAA;AACnC,CAAA;ACvYO,SAAS,aAAa,QAAA,EAA0C;AACrE,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,QAAQ,CAAA;AAEpD,EAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AAClD,EAAA,OAAO,gBAAgB,OAAO,CAAA;AAChC;AAKO,SAAS,gBAAgB,OAAA,EAAyC;AACvE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AAEnC,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,KAAA,CAAM,QAAQ,OAAA,EAAA,EAAW;AACvD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAO,CAAA,CAAG,IAAA,EAAK;AAGlC,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACpC,IAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,WAAW,EAAE,IAAA,EAAK;AAChD,IAAA,IAAI,QAAQ,IAAA,CAAK,SAAA,CAAU,WAAA,GAAc,CAAC,EAAE,IAAA,EAAK;AAGjD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA;AAAA,IACF;AAGA,IAAA,IACG,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,MAAM,QAAA,CAAS,GAAG,CAAA,IAC3C,KAAA,CAAM,WAAW,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAC5C;AACA,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEzB,MAAA,IAAI,IAAA,CAAK,UAAU,WAAA,GAAc,CAAC,EAAE,IAAA,EAAK,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AAC1D,QAAA,KAAA,GAAQ,MACL,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA,CACpB,OAAA,CAAQ,QAAQ,IAAI,CAAA,CACpB,QAAQ,MAAA,EAAQ,GAAI,EACpB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,SAAS,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AACtC,MAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,QAAA,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,YAAY,EAAE,IAAA,EAAK;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EAChB;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,WAAA,CACd,QAAA,GAAW,MAAA,EACX,OAAA,GAAkC,EAAC,EACX;AACxB,EAAA,MAAM,MAAA,GAAS,aAAa,QAAQ,CAAA;AAEpC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,QAAQ,QAAA,IAAY,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,MAAA,EAAW;AACtD,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1DA,SAAS,MAAA,CACP,MAAA,EACA,OAAA,GAA2B,EAAC,EACf;AACb,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,GAAe,IAAA,EAAM,GAAA,EAAK,WAAU,GAAI,OAAA;AAGtD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB;AAGA,EAAA,MAAM,SAAA,GAAY,aAAa,OAAA,CAAQ,GAAA;AAEvC,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,IAC1C,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAA,CAAM,GAAG,MAAM,EAAE,CAAA;AAAA,UACnD,OAAO,KAAA,CAAM;AAAA,SACd,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,YAAA,EAAc;AACrC,IAAA,MAAM,IAAI,uBAAuB,MAAM,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,MAAA;AACT;AAkBA,SAAS,SAAA,CACP,MAAA,EACA,OAAA,GAAiD,EAAC,EACrB;AAC7B,EAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAK,SAAA,EAAU,GAAI,OAAA;AAGjC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB;AAGA,EAAA,MAAM,SAAA,GAAY,aAAa,OAAA,CAAQ,GAAA;AAEvC,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,IAC1C,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,KAAA,CAAM,GAAG,MAAM,EAAE,CAAA;AAAA,UACnD,OAAO,KAAA,CAAM;AAAA,SACd,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAsB;AACtD;AAKO,IAAM,GAAA,GAAM;AAAA;AAAA,EAEjB,MAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAGA,QAAQ,UAAA,CAAW,MAAA;AAAA,EACnB,QAAQ,UAAA,CAAW,MAAA;AAAA,EACnB,SAAS,UAAA,CAAW,OAAA;AAAA,EACpB,MAAM,UAAA,CAAW,IAAA;AAAA,EACjB,OAAO,UAAA,CAAW,KAAA;AAAA;AAAA,EAGlB,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO;AACT;AAEA,IAAO,WAAA,GAAQ","file":"index.js","sourcesContent":["import type { EnvValidationError } from '../env/types.js';\n\n/**\n * Custom error class for environment validation errors\n */\nexport class EnvValidationException extends Error {\n public readonly errors: EnvValidationError[];\n\n constructor(errors: EnvValidationError[]) {\n const message = formatValidationErrors(errors);\n super(message);\n this.name = 'EnvValidationException';\n this.errors = errors;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EnvValidationException);\n }\n }\n}\n\n/**\n * Format validation errors into a readable message\n */\nfunction formatValidationErrors(errors: EnvValidationError[]): string {\n const lines = [\n '',\n '\\x1b[31m\\x1b[1mEnvironment Validation Failed\\x1b[0m',\n '',\n `Found ${errors.length} error${errors.length > 1 ? 's' : ''}:`,\n '',\n ];\n\n for (const error of errors) {\n lines.push(` \\x1b[33m${error.key}\\x1b[0m: ${error.message}`);\n if (error.value !== undefined) {\n lines.push(` Received: \\x1b[90m${error.value || '(empty)'}\\x1b[0m`);\n }\n if (error.expected) {\n lines.push(` Expected: \\x1b[90m${error.expected}\\x1b[0m`);\n }\n lines.push('');\n }\n\n lines.push('\\x1b[36mTip:\\x1b[0m Check your .env file or environment variables');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Custom error for parsing errors\n */\nexport class EnvParseError extends Error {\n public readonly key: string;\n public readonly value?: string;\n\n constructor(key: string, message: string, value?: string) {\n super(`${key}: ${message}`);\n this.name = 'EnvParseError';\n this.key = key;\n this.value = value;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EnvParseError);\n }\n }\n}\n","import type {\n Validator,\n StringValidator,\n NumberValidator,\n BooleanValidator,\n EnumValidator,\n ArrayValidator,\n} from './types.js';\nimport { EnvParseError } from '../utils/errors.js';\n\n// Static lookup sets for boolean parsing (shared across all instances)\nconst TRUE_VALUES = new Set(['true', '1', 'yes', 'on']);\nconst FALSE_VALUES = new Set(['false', '0', 'no', 'off']);\n\n// Sentinel symbol for optional missing values\nconst OPTIONAL_MISSING = Symbol('optional');\n\n/**\n * Base validator class with common functionality\n */\nabstract class BaseValidator<T> implements Validator<T> {\n _type!: T;\n _optional = false;\n _default?: T;\n\n abstract parse(value: string | undefined, key: string): T;\n\n optional(): Validator<T | undefined> {\n const clone = this.clone();\n clone._optional = true;\n return clone as Validator<T | undefined>;\n }\n\n default(value: T): Validator<T> {\n const clone = this.clone();\n clone._default = value;\n return clone;\n }\n\n protected abstract clone(): BaseValidator<T>;\n\n protected getRequired(value: string | undefined, key: string): string | symbol {\n if (value === undefined || value === '') {\n if (this._default !== undefined) {\n throw new DefaultValueUsed(this._default);\n }\n if (this._optional) {\n return OPTIONAL_MISSING;\n }\n throw new EnvParseError(key, 'Required environment variable is missing');\n }\n return value;\n }\n}\n\n// Sentinel class for default value (carries the value)\nclass DefaultValueUsed<T> {\n constructor(public readonly value: T) {}\n}\n\n/**\n * String validator implementation\n */\nclass StringValidatorImpl extends BaseValidator<string> implements StringValidator {\n private constraints: Array<(value: string, key: string) => void> = [];\n\n parse(value: string | undefined, key: string): string {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as string;\n\n for (const constraint of this.constraints) {\n constraint(str as string, key);\n }\n\n return str as string;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as string;\n throw e;\n }\n }\n\n min(length: number): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length < length) {\n throw new EnvParseError(\n key,\n `String must be at least ${length} characters`,\n value\n );\n }\n });\n return clone;\n }\n\n max(length: number): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length > length) {\n throw new EnvParseError(\n key,\n `String must be at most ${length} characters`,\n value\n );\n }\n });\n return clone;\n }\n\n url(): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n try {\n new URL(value);\n } catch {\n throw new EnvParseError(key, 'Invalid URL format', value);\n }\n });\n return clone;\n }\n\n email(): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n throw new EnvParseError(key, 'Invalid email format', value);\n }\n });\n return clone;\n }\n\n regex(pattern: RegExp): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (!pattern.test(value)) {\n throw new EnvParseError(\n key,\n `String does not match pattern ${pattern}`,\n value\n );\n }\n });\n return clone;\n }\n\n protected clone(): StringValidatorImpl {\n const clone = new StringValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Number validator implementation\n */\nclass NumberValidatorImpl extends BaseValidator<number> implements NumberValidator {\n private constraints: Array<(value: number, key: string) => void> = [];\n\n parse(value: string | undefined, key: string): number {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as number;\n\n const num = Number(str);\n if (isNaN(num)) {\n throw new EnvParseError(key, 'Invalid number format', str as string);\n }\n\n for (const constraint of this.constraints) {\n constraint(num, key);\n }\n\n return num;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as number;\n throw e;\n }\n }\n\n min(minValue: number): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value < minValue) {\n throw new EnvParseError(\n key,\n `Number must be at least ${minValue}`,\n String(value)\n );\n }\n });\n return clone;\n }\n\n max(maxValue: number): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value > maxValue) {\n throw new EnvParseError(\n key,\n `Number must be at most ${maxValue}`,\n String(value)\n );\n }\n });\n return clone;\n }\n\n int(): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (!Number.isInteger(value)) {\n throw new EnvParseError(key, 'Number must be an integer', String(value));\n }\n });\n return clone;\n }\n\n positive(): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value <= 0) {\n throw new EnvParseError(key, 'Number must be positive', String(value));\n }\n });\n return clone;\n }\n\n port(): NumberValidator {\n return this.int().min(1).max(65535);\n }\n\n protected clone(): NumberValidatorImpl {\n const clone = new NumberValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Boolean validator implementation\n */\nclass BooleanValidatorImpl extends BaseValidator<boolean> implements BooleanValidator {\n parse(value: string | undefined, key: string): boolean {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as boolean;\n\n const lower = (str as string).toLowerCase();\n if (TRUE_VALUES.has(lower)) return true;\n if (FALSE_VALUES.has(lower)) return false;\n\n throw new EnvParseError(\n key,\n 'Invalid boolean value. Expected: true, false, 1, 0, yes, no, on, off',\n lower\n );\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as boolean;\n throw e;\n }\n }\n\n protected clone(): BooleanValidatorImpl {\n const clone = new BooleanValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n return clone;\n }\n}\n\n/**\n * Enum validator implementation\n */\nclass EnumValidatorImpl<T extends string>\n extends BaseValidator<T>\n implements EnumValidator<T>\n{\n constructor(private readonly values: readonly T[]) {\n super();\n }\n\n parse(value: string | undefined, key: string): T {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as T;\n\n if (!this.values.includes(str as T)) {\n throw new EnvParseError(\n key,\n `Invalid enum value. Expected one of: ${this.values.join(', ')}`,\n str as string\n );\n }\n\n return str as T;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as T;\n throw e;\n }\n }\n\n protected clone(): EnumValidatorImpl<T> {\n const clone = new EnumValidatorImpl(this.values);\n clone._optional = this._optional;\n clone._default = this._default;\n return clone;\n }\n}\n\n/**\n * Array validator implementation\n */\nclass ArrayValidatorImpl extends BaseValidator<string[]> implements ArrayValidator {\n private sep = ',';\n private constraints: Array<(value: string[], key: string) => void> = [];\n\n parse(value: string | undefined, key: string): string[] {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as string[];\n\n const arr = (str as string)\n .split(this.sep)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n for (const constraint of this.constraints) {\n constraint(arr, key);\n }\n\n return arr;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as string[];\n throw e;\n }\n }\n\n separator(sep: string): ArrayValidator {\n const clone = this.clone();\n clone.sep = sep;\n return clone;\n }\n\n min(length: number): ArrayValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length < length) {\n throw new EnvParseError(\n key,\n `Array must have at least ${length} items`,\n value.join(this.sep)\n );\n }\n });\n return clone;\n }\n\n max(length: number): ArrayValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length > length) {\n throw new EnvParseError(\n key,\n `Array must have at most ${length} items`,\n value.join(this.sep)\n );\n }\n });\n return clone;\n }\n\n protected clone(): ArrayValidatorImpl {\n const clone = new ArrayValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.sep = this.sep;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Factory functions for creating validators\n */\nexport const validators = {\n string: (): StringValidator => new StringValidatorImpl(),\n number: (): NumberValidator => new NumberValidatorImpl(),\n boolean: (): BooleanValidator => new BooleanValidatorImpl(),\n enum: <T extends string>(values: readonly T[]): EnumValidator<T> =>\n new EnumValidatorImpl(values),\n array: (): ArrayValidator => new ArrayValidatorImpl(),\n};\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\n/**\n * Parse a .env file and return key-value pairs\n */\nexport function parseEnvFile(filePath: string): Record<string, string> {\n const absolutePath = resolve(process.cwd(), filePath);\n\n if (!existsSync(absolutePath)) {\n return {};\n }\n\n const content = readFileSync(absolutePath, 'utf-8');\n return parseEnvContent(content);\n}\n\n/**\n * Parse .env file content string into key-value pairs\n */\nexport function parseEnvContent(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = content.split(/\\r?\\n/);\n\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum]!.trim();\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n // Find the first = sign\n const equalsIndex = line.indexOf('=');\n if (equalsIndex === -1) {\n continue;\n }\n\n const key = line.substring(0, equalsIndex).trim();\n let value = line.substring(equalsIndex + 1).trim();\n\n // Skip if key is empty\n if (!key) {\n continue;\n }\n\n // Handle quoted values\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n // Handle escape sequences in double-quoted strings\n if (line.substring(equalsIndex + 1).trim().startsWith('\"')) {\n value = value\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\r/g, '\\r')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, '\\\\');\n }\n } else {\n // Remove inline comments for unquoted values\n const commentIndex = value.indexOf('#');\n if (commentIndex !== -1) {\n value = value.substring(0, commentIndex).trim();\n }\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Load environment variables from a .env file into the current environment\n */\nexport function loadEnvFile(\n filePath = '.env',\n options: { override?: boolean } = {}\n): Record<string, string> {\n const parsed = parseEnvFile(filePath);\n\n for (const [key, value] of Object.entries(parsed)) {\n if (options.override || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n\n return parsed;\n}\n","import type {\n EnvSchema,\n InferEnv,\n EnvParseOptions,\n EnvValidationError,\n EnvParseResult,\n} from './types.js';\nimport { validators } from './validators.js';\nimport { loadEnvFile, parseEnvFile } from './parser.js';\nimport { EnvValidationException, EnvParseError } from '../utils/errors.js';\n\nexport type { EnvSchema, InferEnv, EnvParseOptions, EnvValidationError, EnvParseResult };\nexport { EnvValidationException, EnvParseError };\n\n/**\n * Create a type-safe environment configuration\n *\n * @example\n * ```typescript\n * import { env } from 'dev-env-toolkit';\n *\n * const config = env.create({\n * PORT: env.number().default(3000),\n * DATABASE_URL: env.string(),\n * NODE_ENV: env.enum(['development', 'production', 'test']),\n * DEBUG: env.boolean().default(false),\n * });\n *\n * // Fully typed!\n * console.log(config.PORT); // number\n * console.log(config.DEBUG); // boolean\n * ```\n */\nfunction create<T extends EnvSchema>(\n schema: T,\n options: EnvParseOptions = {}\n): InferEnv<T> {\n const { path, throwOnError = true, env: customEnv } = options;\n\n // Load .env file if path is provided\n if (path) {\n loadEnvFile(path);\n }\n\n // Use custom env or process.env\n const envSource = customEnv ?? process.env;\n\n const errors: EnvValidationError[] = [];\n const result: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(schema)) {\n try {\n const value = envSource[key];\n result[key] = validator.parse(value, key);\n } catch (error) {\n if (error instanceof EnvParseError) {\n errors.push({\n key: error.key,\n message: error.message.replace(`${error.key}: `, ''),\n value: error.value,\n });\n } else {\n throw error;\n }\n }\n }\n\n if (errors.length > 0 && throwOnError) {\n throw new EnvValidationException(errors);\n }\n\n return result as InferEnv<T>;\n}\n\n/**\n * Safely parse environment variables without throwing\n *\n * @example\n * ```typescript\n * const result = env.safeParse({\n * PORT: env.number(),\n * });\n *\n * if (result.success) {\n * console.log(result.data.PORT);\n * } else {\n * console.error(result.errors);\n * }\n * ```\n */\nfunction safeParse<T extends EnvSchema>(\n schema: T,\n options: Omit<EnvParseOptions, 'throwOnError'> = {}\n): EnvParseResult<InferEnv<T>> {\n const { path, env: customEnv } = options;\n\n // Load .env file if path is provided\n if (path) {\n loadEnvFile(path);\n }\n\n // Use custom env or process.env\n const envSource = customEnv ?? process.env;\n\n const errors: EnvValidationError[] = [];\n const result: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(schema)) {\n try {\n const value = envSource[key];\n result[key] = validator.parse(value, key);\n } catch (error) {\n if (error instanceof EnvParseError) {\n errors.push({\n key: error.key,\n message: error.message.replace(`${error.key}: `, ''),\n value: error.value,\n });\n } else {\n throw error;\n }\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, data: result as InferEnv<T> };\n}\n\n/**\n * The main env object with all utilities\n */\nexport const env = {\n // Schema creation\n create,\n safeParse,\n\n // Validators\n string: validators.string,\n number: validators.number,\n boolean: validators.boolean,\n enum: validators.enum,\n array: validators.array,\n\n // File utilities\n load: loadEnvFile,\n parse: parseEnvFile,\n};\n\nexport default env;\n"]}
1
+ {"version":3,"sources":["../src/utils/errors.ts","../src/env/validators.ts","../src/env/parser.ts","../src/env/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { EnvValidationError } from '../env/types.js';\n\n/**\n * Custom error class for environment validation errors\n */\nexport class EnvValidationException extends Error {\n public readonly errors: EnvValidationError[];\n\n constructor(errors: EnvValidationError[]) {\n const message = formatValidationErrors(errors);\n super(message);\n this.name = 'EnvValidationException';\n this.errors = errors;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EnvValidationException);\n }\n }\n}\n\n/**\n * Format validation errors into a readable message\n */\nfunction formatValidationErrors(errors: EnvValidationError[]): string {\n const lines = [\n '',\n '\\x1b[31m\\x1b[1mEnvironment Validation Failed\\x1b[0m',\n '',\n `Found ${errors.length} error${errors.length > 1 ? 's' : ''}:`,\n '',\n ];\n\n for (const error of errors) {\n lines.push(` \\x1b[33m${error.key}\\x1b[0m: ${error.message}`);\n if (error.value !== undefined) {\n lines.push(` Received: \\x1b[90m${error.value || '(empty)'}\\x1b[0m`);\n }\n if (error.expected) {\n lines.push(` Expected: \\x1b[90m${error.expected}\\x1b[0m`);\n }\n lines.push('');\n }\n\n lines.push('\\x1b[36mTip:\\x1b[0m Check your .env file or environment variables');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n/**\n * Custom error for parsing errors\n */\nexport class EnvParseError extends Error {\n public readonly key: string;\n public readonly value?: string;\n\n constructor(key: string, message: string, value?: string) {\n super(`${key}: ${message}`);\n this.name = 'EnvParseError';\n this.key = key;\n this.value = value;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, EnvParseError);\n }\n }\n}\n","import type {\n Validator,\n StringValidator,\n NumberValidator,\n BooleanValidator,\n EnumValidator,\n ArrayValidator,\n} from './types.js';\nimport { EnvParseError } from '../utils/errors.js';\n\n// Static lookup sets for boolean parsing (shared across all instances)\nconst TRUE_VALUES = new Set(['true', '1', 'yes', 'on']);\nconst FALSE_VALUES = new Set(['false', '0', 'no', 'off']);\n\n// Sentinel symbol for optional missing values\nconst OPTIONAL_MISSING = Symbol('optional');\n\n/**\n * Base validator class with common functionality\n */\nabstract class BaseValidator<T> implements Validator<T> {\n _type!: T;\n _optional = false;\n _default?: T;\n\n abstract parse(value: string | undefined, key: string): T;\n\n optional(): Validator<T | undefined> {\n const clone = this.clone();\n clone._optional = true;\n return clone as Validator<T | undefined>;\n }\n\n default(value: T): Validator<T> {\n const clone = this.clone();\n clone._default = value;\n return clone;\n }\n\n protected abstract clone(): BaseValidator<T>;\n\n protected getRequired(value: string | undefined, key: string): string | symbol {\n if (value === undefined || value === '') {\n if (this._default !== undefined) {\n throw new DefaultValueUsed(this._default);\n }\n if (this._optional) {\n return OPTIONAL_MISSING;\n }\n throw new EnvParseError(key, 'Required environment variable is missing');\n }\n return value;\n }\n}\n\n// Sentinel class for default value (carries the value)\nclass DefaultValueUsed<T> {\n constructor(public readonly value: T) {}\n}\n\n/**\n * String validator implementation\n */\nclass StringValidatorImpl extends BaseValidator<string> implements StringValidator {\n private constraints: Array<(value: string, key: string) => void> = [];\n\n parse(value: string | undefined, key: string): string {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as string;\n\n for (const constraint of this.constraints) {\n constraint(str as string, key);\n }\n\n return str as string;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as string;\n throw e;\n }\n }\n\n min(length: number): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length < length) {\n throw new EnvParseError(\n key,\n `String must be at least ${length} characters`,\n value\n );\n }\n });\n return clone;\n }\n\n max(length: number): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length > length) {\n throw new EnvParseError(\n key,\n `String must be at most ${length} characters`,\n value\n );\n }\n });\n return clone;\n }\n\n url(): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n try {\n new URL(value);\n } catch {\n throw new EnvParseError(key, 'Invalid URL format', value);\n }\n });\n return clone;\n }\n\n email(): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n throw new EnvParseError(key, 'Invalid email format', value);\n }\n });\n return clone;\n }\n\n regex(pattern: RegExp): StringValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (!pattern.test(value)) {\n throw new EnvParseError(\n key,\n `String does not match pattern ${pattern}`,\n value\n );\n }\n });\n return clone;\n }\n\n protected clone(): StringValidatorImpl {\n const clone = new StringValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Number validator implementation\n */\nclass NumberValidatorImpl extends BaseValidator<number> implements NumberValidator {\n private constraints: Array<(value: number, key: string) => void> = [];\n\n parse(value: string | undefined, key: string): number {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as number;\n\n const num = Number(str);\n if (isNaN(num)) {\n throw new EnvParseError(key, 'Invalid number format', str as string);\n }\n\n for (const constraint of this.constraints) {\n constraint(num, key);\n }\n\n return num;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as number;\n throw e;\n }\n }\n\n min(minValue: number): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value < minValue) {\n throw new EnvParseError(\n key,\n `Number must be at least ${minValue}`,\n String(value)\n );\n }\n });\n return clone;\n }\n\n max(maxValue: number): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value > maxValue) {\n throw new EnvParseError(\n key,\n `Number must be at most ${maxValue}`,\n String(value)\n );\n }\n });\n return clone;\n }\n\n int(): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (!Number.isInteger(value)) {\n throw new EnvParseError(key, 'Number must be an integer', String(value));\n }\n });\n return clone;\n }\n\n positive(): NumberValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value <= 0) {\n throw new EnvParseError(key, 'Number must be positive', String(value));\n }\n });\n return clone;\n }\n\n port(): NumberValidator {\n return this.int().min(1).max(65535);\n }\n\n protected clone(): NumberValidatorImpl {\n const clone = new NumberValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Boolean validator implementation\n */\nclass BooleanValidatorImpl extends BaseValidator<boolean> implements BooleanValidator {\n parse(value: string | undefined, key: string): boolean {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as boolean;\n\n const lower = (str as string).toLowerCase();\n if (TRUE_VALUES.has(lower)) return true;\n if (FALSE_VALUES.has(lower)) return false;\n\n throw new EnvParseError(\n key,\n 'Invalid boolean value. Expected: true, false, 1, 0, yes, no, on, off',\n lower\n );\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as boolean;\n throw e;\n }\n }\n\n protected clone(): BooleanValidatorImpl {\n const clone = new BooleanValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n return clone;\n }\n}\n\n/**\n * Enum validator implementation\n */\nclass EnumValidatorImpl<T extends string>\n extends BaseValidator<T>\n implements EnumValidator<T>\n{\n constructor(private readonly values: readonly T[]) {\n super();\n }\n\n parse(value: string | undefined, key: string): T {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as T;\n\n if (!this.values.includes(str as T)) {\n throw new EnvParseError(\n key,\n `Invalid enum value. Expected one of: ${this.values.join(', ')}`,\n str as string\n );\n }\n\n return str as T;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as T;\n throw e;\n }\n }\n\n protected clone(): EnumValidatorImpl<T> {\n const clone = new EnumValidatorImpl(this.values);\n clone._optional = this._optional;\n clone._default = this._default;\n return clone;\n }\n}\n\n/**\n * Array validator implementation\n */\nclass ArrayValidatorImpl extends BaseValidator<string[]> implements ArrayValidator {\n private sep = ',';\n private constraints: Array<(value: string[], key: string) => void> = [];\n\n parse(value: string | undefined, key: string): string[] {\n try {\n const str = this.getRequired(value, key);\n if (str === OPTIONAL_MISSING) return undefined as unknown as string[];\n\n const arr = (str as string)\n .split(this.sep)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n for (const constraint of this.constraints) {\n constraint(arr, key);\n }\n\n return arr;\n } catch (e) {\n if (e instanceof DefaultValueUsed) return e.value as string[];\n throw e;\n }\n }\n\n separator(sep: string): ArrayValidator {\n const clone = this.clone();\n clone.sep = sep;\n return clone;\n }\n\n min(length: number): ArrayValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length < length) {\n throw new EnvParseError(\n key,\n `Array must have at least ${length} items`,\n value.join(this.sep)\n );\n }\n });\n return clone;\n }\n\n max(length: number): ArrayValidator {\n const clone = this.clone();\n clone.constraints.push((value, key) => {\n if (value.length > length) {\n throw new EnvParseError(\n key,\n `Array must have at most ${length} items`,\n value.join(this.sep)\n );\n }\n });\n return clone;\n }\n\n protected clone(): ArrayValidatorImpl {\n const clone = new ArrayValidatorImpl();\n clone._optional = this._optional;\n clone._default = this._default;\n clone.sep = this.sep;\n clone.constraints = [...this.constraints];\n return clone;\n }\n}\n\n/**\n * Factory functions for creating validators\n */\nexport const validators = {\n string: (): StringValidator => new StringValidatorImpl(),\n number: (): NumberValidator => new NumberValidatorImpl(),\n boolean: (): BooleanValidator => new BooleanValidatorImpl(),\n enum: <T extends string>(values: readonly T[]): EnumValidator<T> =>\n new EnumValidatorImpl(values),\n array: (): ArrayValidator => new ArrayValidatorImpl(),\n};\n","/**\n * Get Node.js modules (fs and path) with lazy loading\n * Throws an error if called in browser environment\n */\nfunction getNodeModules() {\n if (typeof (globalThis as { window?: unknown }).window !== 'undefined') {\n throw new Error('env.load() and env.parse() are only available in Node.js environments');\n }\n // Dynamic require for Node.js only\n const fs = require('node:fs') as typeof import('node:fs');\n const path = require('node:path') as typeof import('node:path');\n return { fs, path };\n}\n\n/**\n * Parse a .env file and return key-value pairs\n */\nexport function parseEnvFile(filePath: string): Record<string, string> {\n const { fs, path } = getNodeModules();\n const absolutePath = path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(absolutePath)) {\n return {};\n }\n\n const content = fs.readFileSync(absolutePath, 'utf-8');\n return parseEnvContent(content);\n}\n\n/**\n * Parse .env file content string into key-value pairs\n */\nexport function parseEnvContent(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n const lines = content.split(/\\r?\\n/);\n\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum]!.trim();\n\n // Skip empty lines and comments\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n // Find the first = sign\n const equalsIndex = line.indexOf('=');\n if (equalsIndex === -1) {\n continue;\n }\n\n const key = line.substring(0, equalsIndex).trim();\n let value = line.substring(equalsIndex + 1).trim();\n\n // Skip if key is empty\n if (!key) {\n continue;\n }\n\n // Handle quoted values\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n // Handle escape sequences in double-quoted strings\n if (line.substring(equalsIndex + 1).trim().startsWith('\"')) {\n value = value\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\r/g, '\\r')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, '\\\\');\n }\n } else {\n // Remove inline comments for unquoted values\n const commentIndex = value.indexOf('#');\n if (commentIndex !== -1) {\n value = value.substring(0, commentIndex).trim();\n }\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Load environment variables from a .env file into the current environment\n */\nexport function loadEnvFile(\n filePath = '.env',\n options: { override?: boolean } = {}\n): Record<string, string> {\n const parsed = parseEnvFile(filePath);\n\n for (const [key, value] of Object.entries(parsed)) {\n if (options.override || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n\n return parsed;\n}\n","import type {\n EnvSchema,\n InferEnv,\n EnvParseOptions,\n EnvValidationError,\n EnvParseResult,\n} from './types.js';\nimport { validators } from './validators.js';\nimport { loadEnvFile, parseEnvFile } from './parser.js';\nimport { EnvValidationException, EnvParseError } from '../utils/errors.js';\n\nexport type { EnvSchema, InferEnv, EnvParseOptions, EnvValidationError, EnvParseResult };\nexport { EnvValidationException, EnvParseError };\n\n/**\n * Create a type-safe environment configuration\n *\n * @example\n * ```typescript\n * import { env } from 'dev-env-toolkit';\n *\n * const config = env.create({\n * PORT: env.number().default(3000),\n * DATABASE_URL: env.string(),\n * NODE_ENV: env.enum(['development', 'production', 'test']),\n * DEBUG: env.boolean().default(false),\n * });\n *\n * // Fully typed!\n * console.log(config.PORT); // number\n * console.log(config.DEBUG); // boolean\n * ```\n */\nfunction create<T extends EnvSchema>(\n schema: T,\n options: EnvParseOptions = {}\n): InferEnv<T> {\n const { path, throwOnError = true, env: customEnv } = options;\n\n // Load .env file if path is provided\n if (path) {\n loadEnvFile(path);\n }\n\n // Use custom env or process.env\n const envSource = customEnv ?? process.env;\n\n const errors: EnvValidationError[] = [];\n const result: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(schema)) {\n try {\n const value = envSource[key];\n result[key] = validator.parse(value, key);\n } catch (error) {\n if (error instanceof EnvParseError) {\n errors.push({\n key: error.key,\n message: error.message.replace(`${error.key}: `, ''),\n value: error.value,\n });\n } else {\n throw error;\n }\n }\n }\n\n if (errors.length > 0 && throwOnError) {\n throw new EnvValidationException(errors);\n }\n\n return result as InferEnv<T>;\n}\n\n/**\n * Safely parse environment variables without throwing\n *\n * @example\n * ```typescript\n * const result = env.safeParse({\n * PORT: env.number(),\n * });\n *\n * if (result.success) {\n * console.log(result.data.PORT);\n * } else {\n * console.error(result.errors);\n * }\n * ```\n */\nfunction safeParse<T extends EnvSchema>(\n schema: T,\n options: Omit<EnvParseOptions, 'throwOnError'> = {}\n): EnvParseResult<InferEnv<T>> {\n const { path, env: customEnv } = options;\n\n // Load .env file if path is provided\n if (path) {\n loadEnvFile(path);\n }\n\n // Use custom env or process.env\n const envSource = customEnv ?? process.env;\n\n const errors: EnvValidationError[] = [];\n const result: Record<string, unknown> = {};\n\n for (const [key, validator] of Object.entries(schema)) {\n try {\n const value = envSource[key];\n result[key] = validator.parse(value, key);\n } catch (error) {\n if (error instanceof EnvParseError) {\n errors.push({\n key: error.key,\n message: error.message.replace(`${error.key}: `, ''),\n value: error.value,\n });\n } else {\n throw error;\n }\n }\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n\n return { success: true, data: result as InferEnv<T> };\n}\n\n/**\n * The main env object with all utilities\n */\nexport const env = {\n // Schema creation\n create,\n safeParse,\n\n // Validators\n string: validators.string,\n number: validators.number,\n boolean: validators.boolean,\n enum: validators.enum,\n array: validators.array,\n\n // File utilities\n load: loadEnvFile,\n parse: parseEnvFile,\n};\n\nexport default env;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dev-env-toolkit",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Type-safe environment variables, config management, and debugging utilities for Node.js and TypeScript",
5
5
  "author": {
6
6
  "name": "Raju Kumar Yadav",