{"version":3,"file":"index.cjs","sources":["../src/utils/manager.utils.ts","../src/utils/flatten.utils.ts","../src/config/config.manager.ts","../src/env/env.picker.ts","../src/env/env.manager.ts"],"sourcesContent":["export type ManagerOptions<Source> = {\n  getSource: () => Source;\n};\n\nexport class Manager<Source extends Record<string, unknown>> {\n  protected source: Source;\n\n  constructor({ getSource }: ManagerOptions<Source>) {\n    this.source = getSource();\n  }\n\n  public get<Key extends keyof Source>(key: Key): Source[Key] | undefined {\n    return this.source[key];\n  }\n\n  public getOrThrow<Key extends keyof Source>(key: Key): NonNullable<Source[Key]> {\n    const value = this.source[key];\n\n    if (value === null || value === undefined) {\n      throw new Error(`key: ${key.toString()} is not found`);\n    }\n\n    return value;\n  }\n}\n","type SupportedValues = bigint | boolean | null | number | string | symbol | undefined | object;\n\n// original https://github.com/ghoullier/awesome-template-literal-types#dot-notation-string-type-safe\nexport type PathImpl<Obj, Key extends keyof Obj> = Key extends string | number\n  ? Obj[Key] extends Record<string, SupportedValues>\n    ? Key | `${Key}.${PathImpl<Obj[Key], keyof Obj[Key]>}`\n    : Key\n  : never;\n\nexport type Path<T> = PathImpl<T, keyof T> | keyof T;\n\nexport type PathValue<Obj, PathKey extends Path<Obj>> = PathKey extends `${infer Key}.${infer Rest}`\n  ? Key extends keyof Obj\n    ? Rest extends Path<Obj[Key]>\n      ? PathValue<Obj[Key], Rest>\n      : never\n    : never\n  : PathKey extends keyof Obj\n  ? Obj[PathKey]\n  : never;\n\nexport type Flatten<T> = {\n  [key in Path<T>]: PathValue<T, key>;\n};\n\nexport const isObject = (value: unknown): value is Record<string, unknown> => {\n  if (typeof value !== 'object' || value === null) {\n    return false;\n  }\n\n  return Object.getPrototypeOf(value) === Object.prototype;\n};\n\nexport const flatten = <T extends Record<string, unknown>>(object: T, parentKey?: string): Flatten<T> => {\n  return Object.entries(object).reduce((state, [key, value]) => {\n    const currentKey = parentKey ? `${parentKey}.${key}` : key;\n    const base = { ...state, [currentKey]: value };\n\n    if (isObject(value)) {\n      return { ...base, ...flatten(value, currentKey) };\n    }\n\n    return base;\n  }, {} as Flatten<T>);\n};\n","import { Manager } from 'src/utils/manager.utils.js';\nimport { flatten, Flatten } from '../utils/flatten.utils.js';\n\nexport type ConfigManagerOptions<Config> = {\n  getConfig: () => Config;\n};\n\nexport class ConfigManager<Config extends Record<string, unknown>> extends Manager<Flatten<Config>> {\n  constructor({ getConfig }: ConfigManagerOptions<Config>) {\n    super({ getSource: () => flatten(getConfig()) });\n  }\n}\n","export type WrappedInEnvPickers<NodeEnv extends string, Config> = {\n  [Key in keyof Config]: EnvPicker<NodeEnv, Config[Key]>;\n};\n\ntype MoveOptional<Type, Value> = Type extends null\n  ? Type extends undefined\n    ? Value | null | undefined\n    : Value | null\n  : Type extends undefined\n  ? Value | undefined\n  : Value;\n\nexport type BaseConfig = Record<string, string | undefined>;\nexport type EnvRecord<NodeEnv extends string, Value> = Partial<Record<NodeEnv | 'rest', Value>>;\n\nexport type DefaultForResponse<NodeEnv extends string, State, NewState, EnvOptions> = EnvOptions extends {\n  rest: NewState;\n}\n  ? EnvPicker<NodeEnv, NonNullable<State> | EnvOptions[keyof EnvOptions] | EnvOptions['rest']>\n  : EnvPicker<NodeEnv, State | NewState>;\n\nexport const wrapInEnvPickers = <NodeEnv extends string, Config extends BaseConfig>(\n  config: Config,\n  nodeEnv: NodeEnv,\n): WrappedInEnvPickers<NodeEnv, Config> => {\n  return Object.keys(config).reduce(\n    (result, key) => {\n      return { ...result, [key]: new EnvPicker(config[key], nodeEnv) };\n    },\n    {} as WrappedInEnvPickers<NodeEnv, Config>,\n  );\n};\n\nexport class EnvPicker<NodeEnv extends string, State> {\n  constructor(\n    private state: State,\n    private nodeEnv: NodeEnv,\n  ) {}\n\n  public default<NewState extends State>(newState: NewState): EnvPicker<NodeEnv, NewState | NonNullable<State>> {\n    this.state ??= newState;\n\n    return this as EnvPicker<NodeEnv, NewState | NonNullable<State>>;\n  }\n\n  public defaultFor<NewState extends State, EnvOptions extends EnvRecord<NodeEnv, NewState>>(\n    envRecord: EnvOptions,\n  ): DefaultForResponse<NodeEnv, State, NewState, EnvOptions> {\n    this.state ??= (envRecord[this.nodeEnv] ?? envRecord.rest) as State;\n\n    return this as unknown as DefaultForResponse<NodeEnv, State, NewState, EnvOptions>;\n  }\n\n  public map<NewState>(mapper: (state: State) => NewState): EnvPicker<NodeEnv, NewState> {\n    this.state = mapper(this.state) as unknown as State;\n\n    return this as unknown as EnvPicker<NodeEnv, NewState>;\n  }\n\n  public mapIfExists<NewState>(\n    mapper: (state: NonNullable<State>) => NewState,\n  ): EnvPicker<NodeEnv, MoveOptional<State, NewState>> {\n    if (this.state !== null && this.state !== undefined) {\n      this.state = mapper(this.state as NonNullable<State>) as unknown as State;\n    }\n\n    return this as unknown as EnvPicker<NodeEnv, MoveOptional<State, NewState>>;\n  }\n\n  public value(): State {\n    return this.state;\n  }\n}\n","import { Manager } from 'src/utils/manager.utils.js';\nimport { BaseConfig, EnvPicker, EnvRecord } from './env.picker.js';\n\nexport type EnvManagerOptions<NodeEnv, Env> = {\n  getEnv?: () => Env;\n  getNodeEnv?: () => NodeEnv;\n};\n\nexport class EnvManager<NodeEnv extends string, Config extends BaseConfig = BaseConfig> extends Manager<Config> {\n  private nodeEnv: NodeEnv;\n\n  constructor({\n    getEnv = () => process.env as Config,\n    getNodeEnv = () => (process.env.NODE_ENV ?? 'development') as NodeEnv,\n  }: EnvManagerOptions<NodeEnv, Config> = {}) {\n    super({ getSource: getEnv });\n\n    this.nodeEnv = getNodeEnv();\n  }\n\n  private getEnvValue<Key extends keyof Config>(key: Key): Config[Key] | undefined {\n    const value = this.source[key];\n\n    if (value === null || value === undefined || value.trim() === '') {\n      return;\n    }\n\n    return value;\n  }\n\n  private getKeyOrThrow<Key extends keyof Config>(envRecord: EnvRecord<NodeEnv, Key>): Key {\n    const key = envRecord[this.nodeEnv] ?? envRecord.rest;\n\n    if (!key) {\n      throw new Error(`key is not found empty in nodeEnv: ${this.nodeEnv}`);\n    }\n\n    return key;\n  }\n\n  public pick<Key extends keyof Config>(key: Key): EnvPicker<NodeEnv, Config[Key] | undefined> {\n    return new EnvPicker(this.getEnvValue(key), this.nodeEnv);\n  }\n\n  public pickOrThrow<Key extends keyof Config>(key: Key): EnvPicker<NodeEnv, NonNullable<Config[Key]>> {\n    const value = this.source[key];\n\n    if (value === null || value === undefined || value.trim() === '') {\n      throw new Error(`key: ${key.toString()} is empty`);\n    }\n\n    return new EnvPicker(value, this.nodeEnv);\n  }\n\n  public pickFor<Key extends keyof Config>(\n    envRecord: EnvRecord<NodeEnv, Key>,\n  ): EnvPicker<NodeEnv, Config[Key] | undefined> {\n    const key = envRecord[this.nodeEnv] ?? envRecord.rest;\n\n    if (!key) {\n      return new EnvPicker(undefined, this.nodeEnv);\n    }\n\n    return this.pick(key);\n  }\n\n  public pickForOrThrow<Key extends keyof Config>(\n    envRecord: EnvRecord<NodeEnv, Key>,\n  ): EnvPicker<NodeEnv, NonNullable<Config[Key]>> {\n    const key = this.getKeyOrThrow(envRecord);\n\n    return this.pickOrThrow(key);\n  }\n\n  public getFor<Key extends keyof Config>(envRecord: EnvRecord<NodeEnv, Key>): Config[Key] | undefined {\n    const key = envRecord[this.nodeEnv] ?? envRecord.rest;\n\n    if (!key) {\n      return;\n    }\n\n    return this.get(key);\n  }\n\n  public getForOrThrow<Key extends keyof Config>(envRecord: EnvRecord<NodeEnv, Key>): NonNullable<Config[Key]> {\n    const key = this.getKeyOrThrow(envRecord);\n\n    return this.getOrThrow(key);\n  }\n}\n"],"names":["__publicField"],"mappings":"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"}