{"version":3,"file":"parse-env.mjs","names":[],"sources":["../../../src/common/schema/parse-env.ts"],"sourcesContent":["import type { Type } from './schema'\nimport { assert } from '../assert'\nimport { fromCamelCase } from '../data/camelcase'\nimport { valueToBoolean, valueToBooleanNotFalse, valueToInteger } from '../data/convert'\nimport { objectMap } from '../data/object'\nimport { schemaParseObject } from './parse-object'\nimport { isSchemaObjectFlat } from './utils'\n\ndeclare module './schema' {\n  interface TypeMeta {\n    envDesc?: string\n    envPrivate?: boolean // will not be documented\n    envSkip?: boolean // will not be included in env parsing\n  }\n}\n\nexport type SchemaEnvType = Record<string, any>\n\nexport interface SchemaEnvOptions<T> {\n  existing?: Partial<T> // if true, will only parse existing env variables\n  env?: SchemaEnvType\n  prefix?: string\n  prefixOptional?: boolean // if true, prefix is optional\n}\n\nexport function parseSchemaEnv<T>(schema: Type<T>, opt?: SchemaEnvOptions<T>): T {\n  assert(schema?._object, 'schema should be of type object')\n  assert(isSchemaObjectFlat(schema), 'schema should be a flat object')\n\n  const {\n    // eslint-disable-next-line node/prefer-global/process\n    env = (process?.env ?? {}) as SchemaEnvType,\n    prefix = '',\n    prefixOptional = false,\n  } = opt ?? {}\n  const pl = prefix.length\n  const existing: any = opt?.existing ?? {}\n\n  return objectMap(schema._object, (key, schema) => {\n    const defaultValue = existing[key] ?? schema._default\n    if (schema._meta?.envSkip)\n      return defaultValue\n\n    const envKey = fromCamelCase(key, '_').toUpperCase()\n    const envKeyWithPrefix = prefix + fromCamelCase(key, '_').toUpperCase()\n\n    let value: any = env[envKey]\n\n    if (pl > 0) {\n      if (prefixOptional === true) {\n        value = env[envKeyWithPrefix] ?? value\n      }\n      else {\n        value = env[envKeyWithPrefix]\n      }\n    }\n\n    if (value === undefined) {\n      return defaultValue\n    }\n\n    if (schema.type === 'number') {\n      value = valueToInteger(value, schema._default)\n    }\n    else if (schema.type === 'boolean') {\n      if (schema._default === true)\n        value = valueToBooleanNotFalse(value)\n      else\n        value = valueToBoolean(value, false)\n    }\n    return schemaParseObject(schema, value)\n  }) as T\n}\n\nexport function stringFromSchemaEnv<T>(schema: Type<T>, prefix = '', commentOut = false, showPrivate = false): string {\n  assert(isSchemaObjectFlat(schema), 'schema should be a flat object')\n  const lines: string[] = []\n  objectMap(schema._object!, (key, schema) => {\n    if ((schema._meta?.envPrivate || schema._meta?.envSkip) && !showPrivate)\n      return\n    const desc = schema._meta?.envDesc ?? schema._meta?.desc\n    if (desc) {\n      desc.trim().split('\\n').forEach((line: string) => {\n        lines.push(`# ${line.trim()}`)\n      })\n    }\n    lines.push(`${commentOut ? '# ' : ''}${prefix + fromCamelCase(key, '_').toUpperCase()}=${schema._default ?? ''}`)\n    lines.push('')\n  }) as T\n  return lines.join('\\n')\n}\n"],"mappings":";;;;;;;;AAyBA,SAAgB,eAAkB,QAAiB,KAA8B;AAC/E,QAAO,QAAQ,SAAS,kCAAkC;AAC1D,QAAO,mBAAmB,OAAO,EAAE,iCAAiC;CAEpE,MAAM,EAEJ,MAAO,SAAS,OAAO,EAAE,EACzB,SAAS,IACT,iBAAiB,UACf,OAAO,EAAE;CACb,MAAM,KAAK,OAAO;CAClB,MAAM,WAAgB,KAAK,YAAY,EAAE;AAEzC,QAAO,UAAU,OAAO,UAAU,KAAK,WAAW;EAChD,MAAM,eAAe,SAAS,QAAQ,OAAO;AAC7C,MAAI,OAAO,OAAO,QAChB,QAAO;EAET,MAAM,SAAS,cAAc,KAAK,IAAI,CAAC,aAAa;EACpD,MAAM,mBAAmB,SAAS,cAAc,KAAK,IAAI,CAAC,aAAa;EAEvE,IAAI,QAAa,IAAI;AAErB,MAAI,KAAK,EACP,KAAI,mBAAmB,KACrB,SAAQ,IAAI,qBAAqB;MAGjC,SAAQ,IAAI;AAIhB,MAAI,UAAU,OACZ,QAAO;AAGT,MAAI,OAAO,SAAS,SAClB,SAAQ,eAAe,OAAO,OAAO,SAAS;WAEvC,OAAO,SAAS,UACvB,KAAI,OAAO,aAAa,KACtB,SAAQ,uBAAuB,MAAM;MAErC,SAAQ,eAAe,OAAO,MAAM;AAExC,SAAO,kBAAkB,QAAQ,MAAM;GACvC;;AAGJ,SAAgB,oBAAuB,QAAiB,SAAS,IAAI,aAAa,OAAO,cAAc,OAAe;AACpH,QAAO,mBAAmB,OAAO,EAAE,iCAAiC;CACpE,MAAM,QAAkB,EAAE;AAC1B,WAAU,OAAO,UAAW,KAAK,WAAW;AAC1C,OAAK,OAAO,OAAO,cAAc,OAAO,OAAO,YAAY,CAAC,YAC1D;EACF,MAAM,OAAO,OAAO,OAAO,WAAW,OAAO,OAAO;AACpD,MAAI,KACF,MAAK,MAAM,CAAC,MAAM,KAAK,CAAC,SAAS,SAAiB;AAChD,SAAM,KAAK,KAAK,KAAK,MAAM,GAAG;IAC9B;AAEJ,QAAM,KAAK,GAAG,aAAa,OAAO,KAAK,SAAS,cAAc,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,OAAO,YAAY,KAAK;AACjH,QAAM,KAAK,GAAG;GACd;AACF,QAAO,MAAM,KAAK,KAAK"}