{
  "version": 3,
  "sources": ["../src/index.ts", "../src/manager/index.ts", "../src/manager/merge.ts"],
  "sourcesContent": ["export * from \"./manager/index\";\n", "import logger from \"@nexload-sdk/logger\";\nimport { EnvSchema, EnvReturnType } from \"./types\";\n\ndeclare global {\n  var envFirstLogging: boolean;\n}\n\nif (globalThis.envFirstLogging == null) {\n  globalThis.envFirstLogging = false;\n}\n\nexport class EnvManager<TVariables extends EnvSchema> {\n  protected env = new Map<string, string | number | boolean>();\n\n  constructor(protected readonly variables: TVariables) {\n    this.validate();\n    this.load();\n  }\n\n  protected validate() {\n    const keys = Object.keys(this.variables);\n\n    for (const key of keys) {\n      const variable = this.variables[key];\n      const value = process.env[key];\n      const hasDefault = this.hasDefault(variable);\n\n      if (value == undefined) {\n        if (hasDefault) {\n          globalThis.envFirstLogging &&\n            logger.warn(\n              { package: \"@nexload-sdk/env\", key },\n              `'${key}' not exists and default: ${String(variable.default)}`\n            );\n        } else {\n          globalThis.envFirstLogging &&\n            logger.error(\n              { package: \"@nexload-sdk/env\", key },\n              `'${key}' not exists and not have defaults`\n            );\n        }\n\n        continue;\n      }\n\n      if (variable?.type === \"number\" && isNaN(Number(value))) {\n        globalThis.envFirstLogging &&\n          logger.warn(\n            {\n              package: \"@nexload-sdk/env\",\n              key,\n              value,\n              valueType: typeof value,\n            },\n            `is '${typeof value}', but must 'number'`\n          );\n\n        continue;\n      }\n\n      if (\n        variable?.type === \"boolean\" &&\n        value !== \"true\" &&\n        value !== \"false\"\n      ) {\n        globalThis.envFirstLogging &&\n          logger.warn(\n            {\n              package: \"@nexload-sdk/env\",\n              key,\n              value,\n              valueType: typeof value,\n            },\n            `is '${typeof value}', but must 'boolean'`\n          );\n\n        continue;\n      }\n\n      globalThis.envFirstLogging &&\n        logger.success(\n          { package: \"@nexload-sdk/env\", key, value, valueType: typeof value },\n          \"env successfully loaded\"\n        );\n    }\n  }\n\n  public load() {\n    const keys = Object.keys(this.variables);\n\n    for (const key of keys) {\n      this.$(key, false);\n    }\n  }\n\n  public $<TKey extends keyof TVariables>(\n    key: TKey,\n    cache = true\n  ): EnvReturnType<TVariables[TKey]> {\n    if (cache && this.env.has(String(key))) {\n      return this.env.get(String(key)) as EnvReturnType<TVariables[TKey]>;\n    }\n\n    const variableOptions = this.variables[key];\n    const envValue = process.env[key as string];\n    const hasDefault = this.hasDefault(variableOptions);\n    let rawValue = (envValue ?? (hasDefault ? variableOptions.default : undefined)) as\n      | string\n      | number\n      | boolean\n      | undefined;\n\n    if (envValue !== undefined) {\n      if (\n        variableOptions?.type === \"number\" &&\n        Number.isNaN(Number(envValue)) &&\n        hasDefault\n      ) {\n        rawValue = variableOptions.default as string | number | boolean;\n      }\n\n      if (\n        variableOptions?.type === \"boolean\" &&\n        envValue !== \"true\" &&\n        envValue !== \"false\" &&\n        hasDefault\n      ) {\n        rawValue = variableOptions.default as string | number | boolean;\n      }\n    }\n\n    let variable = rawValue as EnvReturnType<TVariables[TKey]>;\n\n    if (variableOptions?.type === \"number\")\n      variable = Number(variable) as EnvReturnType<TVariables[TKey]>;\n\n    if (variableOptions?.type === \"boolean\")\n      variable = (variable === \"true\") as EnvReturnType<TVariables[TKey]>;\n\n    if (variableOptions?.type === \"string\")\n      variable = String(variable) as EnvReturnType<TVariables[TKey]>;\n\n    this.env.set(String(key), variable);\n\n    return variable;\n  }\n\n  protected hasDefault(\n    variable?: { default?: unknown } | null\n  ): variable is { default: unknown } {\n    if (variable == null) return false;\n    return Object.prototype.hasOwnProperty.call(variable, \"default\");\n  }\n}\n\nexport * from \"./merge\";\n", "import { EnvDefinition, UnionToIntersection } from \"./types\";\n\nexport function merge<\n  const T extends readonly Record<string, EnvDefinition>[]\n> (...args: T): UnionToIntersection<T[number]> {\n  return args.reduce(\n    (\n      p, c\n    ) => ({ ...p, ...c, }), {} as T\n  ) as UnionToIntersection<T[number]>;\n}\n"],
  "mappings": "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",
  "names": ["logger"]
}
