{"version":3,"file":"env.mjs","names":[],"sources":["../../src/node/env.ts"],"sourcesContent":["// Adopted from https://github.com/motdotla/dotenv BSD-2\n\nimport fs from 'node:fs'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\n\nconst NEWLINE = '\\n'\n// eslint-disable-next-line regexp/no-super-linear-backtracking\nconst RE_INI_KEY_VAL = /^\\s*([\\w.-]+)\\s*=\\s*(.*)\\s*$/\nconst RE_NEWLINES = /\\\\n/g\nconst NEWLINES_MATCH = /\\r\\n|\\n|\\r/\n\nexport interface EnvOptions {\n  /** @deprecated will probably be replaced by logLevel */\n  debug?: boolean\n  path?: string\n  filename?: string\n  encoding?: BufferEncoding\n  prefix?: string\n  env?: Record<string, string>\n  mode?: string\n}\n\n// BSD-2-Clause License from here https://github.com/motdotla/dotenv/blob/master/lib/main.js#L12\n// eslint-disable-next-line regexp/no-super-linear-backtracking\nconst LINE = /^\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?$/gm\n\n// https://docs.docker.com/compose/how-tos/environment-variables/variable-interpolation/#env-file-syntax\nexport function parseEnvStringAlt(src: string): Record<string, string> {\n  const obj: Record<string, string> = {}\n\n  // Convert buffer to string\n  let lines = src.toString()\n\n  // Convert line breaks to same format\n  lines = lines.replace(/\\r\\n?/g, '\\n')\n\n  let match\n  // eslint-disable-next-line no-cond-assign\n  while ((match = LINE.exec(lines)) != null) {\n    const key = match[1]\n\n    // Default undefined or null to empty string\n    let value = (match[2] || '')\n\n    // Remove whitespace\n    value = value.trim()\n\n    // Check if double quoted\n    const maybeQuote = value[0]\n\n    // Remove surrounding quotes\n    value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/gm, '$2')\n\n    // Expand newlines if double quoted\n    if (maybeQuote === '\"') {\n      value = value.replace(/\\\\n/g, '\\n')\n      value = value.replace(/\\\\r/g, '\\r')\n    }\n\n    // Add to object\n    obj[key] = value\n  }\n\n  return obj\n}\n// Parses src into an Object\nexport function parseEnvString(src: string) {\n  const obj: Record<string, string> = {}\n\n  // convert Buffers before splitting into lines and processing\n  String(src)\n    .split(NEWLINES_MATCH)\n\n    .forEach((line, idx) => {\n      // matching \"KEY' and 'VAL' in 'KEY=VAL'\n      const keyValueArr = line.match(RE_INI_KEY_VAL)\n      // matched?\n\n      // log.debug(\"keyValueArr\", keyValueArr)\n\n      if (keyValueArr != null) {\n        const key = keyValueArr[1]\n        // default undefined or missing values to empty string\n        let val = keyValueArr[2] || ''\n        const end = val.length - 1\n        const isDoubleQuoted = val[0] === '\"' && val[end] === '\"'\n        const isSingleQuoted = val[0] === '\\'' && val[end] === '\\''\n\n        // if single or double quoted, remove quotes\n        if (isSingleQuoted || isDoubleQuoted) {\n          val = val.substring(1, end)\n\n          // if double quoted, expand newlines\n          if (isDoubleQuoted)\n            val = val.replace(RE_NEWLINES, NEWLINE)\n        }\n        else {\n          // remove surrounding whitespace\n          val = val.trim()\n        }\n        obj[key] = val\n      }\n      // else {\n      //   log.debug(`did not match key and value when parsing line ${idx + 1}: ${line}`)\n      // }\n    })\n\n  // log.debug(\"obj\", obj)\n  return obj\n}\n\n/**\n * Return a path relative to the current working directory\n */\nexport function stringToPath(\n  value?: string,\n  defaultValue = '.',\n): string {\n  return resolve(process.cwd(), value ?? defaultValue)\n}\n\nexport function valueToPath(value?: any, defaultValue = ''): string {\n  value ??= defaultValue\n  return stringToPath(String(value).trim(), defaultValue)\n}\n\nexport const toPath = valueToPath\n\nexport function getEnvVariableRelaxed(\n  name: string,\n  env = process.env,\n): string | undefined {\n  if (env[name] != null)\n    return env[name]\n  name = name.toLowerCase()\n  for (const [k, v] of Object.entries(env)) {\n    if (k.toLowerCase() === name)\n      return v\n  }\n}\n\n/** Populates process.env from .env file. */\nexport function setupEnv(options: EnvOptions = {}) {\n  const dotenvPath: string = options?.path ?? toPath(options?.filename ?? '.env')\n  const encoding: BufferEncoding = options?.encoding ?? 'utf8'\n  const debug = options?.debug || false\n\n  try {\n    const parsed: Record<string, string> = {}\n\n    function envOf(name: string) {\n      return fs.existsSync(name)\n        ? parseEnvStringAlt(fs.readFileSync(name, { encoding }))\n        : {}\n    }\n\n    Object.assign(\n      parsed,\n      envOf(dotenvPath),\n      envOf(`${dotenvPath}.local`),\n    )\n\n    if (options.mode) {\n      Object.assign(\n        parsed,\n        envOf(`${dotenvPath}.${options.mode}`),\n        envOf(`${dotenvPath}.${options.mode}.local`),\n      )\n    }\n\n    const env = options?.env ?? process.env\n\n    Object.entries(parsed).forEach(([key, value]) => {\n      if (typeof options?.prefix === 'string')\n        key = options?.prefix + key\n\n      if (!Object.hasOwn(env, key)) {\n        if (value != null)\n          env[key] = value\n      }\n      // else {\n      //   log.debug(`\"${key}\" is already defined and will not be overwritten`)\n      // }\n    })\n    return { parsed }\n  }\n  catch (e) {\n    return { error: e }\n  }\n}\n"],"mappings":";;;;;AAMA,MAAM,UAAU;AAEhB,MAAM,iBAAiB;AACvB,MAAM,cAAc;AACpB,MAAM,iBAAiB;AAevB,MAAM,OAAO;AAGb,SAAgB,kBAAkB,KAAqC;CACrE,MAAM,MAA8B,EAAE;CAGtC,IAAI,QAAQ,IAAI,UAAU;AAG1B,SAAQ,MAAM,QAAQ,UAAU,KAAK;CAErC,IAAI;AAEJ,SAAQ,QAAQ,KAAK,KAAK,MAAM,KAAK,MAAM;EACzC,MAAM,MAAM,MAAM;EAGlB,IAAI,QAAS,MAAM,MAAM;AAGzB,UAAQ,MAAM,MAAM;EAGpB,MAAM,aAAa,MAAM;AAGzB,UAAQ,MAAM,QAAQ,0BAA0B,KAAK;AAGrD,MAAI,eAAe,MAAK;AACtB,WAAQ,MAAM,QAAQ,QAAQ,KAAK;AACnC,WAAQ,MAAM,QAAQ,QAAQ,KAAK;;AAIrC,MAAI,OAAO;;AAGb,QAAO;;AAGT,SAAgB,eAAe,KAAa;CAC1C,MAAM,MAA8B,EAAE;AAGtC,QAAO,IAAI,CACR,MAAM,eAAe,CAErB,SAAS,MAAM,QAAQ;EAEtB,MAAM,cAAc,KAAK,MAAM,eAAe;AAK9C,MAAI,eAAe,MAAM;GACvB,MAAM,MAAM,YAAY;GAExB,IAAI,MAAM,YAAY,MAAM;GAC5B,MAAM,MAAM,IAAI,SAAS;GACzB,MAAM,iBAAiB,IAAI,OAAO,QAAO,IAAI,SAAS;AAItD,OAHuB,IAAI,OAAO,OAAQ,IAAI,SAAS,OAGjC,gBAAgB;AACpC,UAAM,IAAI,UAAU,GAAG,IAAI;AAG3B,QAAI,eACF,OAAM,IAAI,QAAQ,aAAa,QAAQ;SAIzC,OAAM,IAAI,MAAM;AAElB,OAAI,OAAO;;GAKb;AAGJ,QAAO;;;;;AAMT,SAAgB,aACd,OACA,eAAe,KACP;AACR,QAAO,QAAQ,QAAQ,KAAK,EAAE,SAAS,aAAa;;AAGtD,SAAgB,YAAY,OAAa,eAAe,IAAY;AAClE,WAAU;AACV,QAAO,aAAa,OAAO,MAAM,CAAC,MAAM,EAAE,aAAa;;AAGzD,MAAa,SAAS;AAEtB,SAAgB,sBACd,MACA,MAAM,QAAQ,KACM;AACpB,KAAI,IAAI,SAAS,KACf,QAAO,IAAI;AACb,QAAO,KAAK,aAAa;AACzB,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,IAAI,CACtC,KAAI,EAAE,aAAa,KAAK,KACtB,QAAO;;;AAKb,SAAgB,SAAS,UAAsB,EAAE,EAAE;CACjD,MAAM,aAAqB,SAAS,QAAQ,OAAO,SAAS,YAAY,OAAO;CAC/E,MAAM,WAA2B,SAAS,YAAY;AACxC,UAAS;AAEvB,KAAI;EACF,MAAM,SAAiC,EAAE;EAEzC,SAAS,MAAM,MAAc;AAC3B,UAAO,GAAG,WAAW,KAAK,GACtB,kBAAkB,GAAG,aAAa,MAAM,EAAE,UAAU,CAAC,CAAC,GACtD,EAAE;;AAGR,SAAO,OACL,QACA,MAAM,WAAW,EACjB,MAAM,GAAG,WAAW,QAAQ,CAC7B;AAED,MAAI,QAAQ,KACV,QAAO,OACL,QACA,MAAM,GAAG,WAAW,GAAG,QAAQ,OAAO,EACtC,MAAM,GAAG,WAAW,GAAG,QAAQ,KAAK,QAAQ,CAC7C;EAGH,MAAM,MAAM,SAAS,OAAO,QAAQ;AAEpC,SAAO,QAAQ,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW;AAC/C,OAAI,OAAO,SAAS,WAAW,SAC7B,OAAM,SAAS,SAAS;AAE1B,OAAI,CAAC,OAAO,OAAO,KAAK,IAAI,EAC1B;QAAI,SAAS,KACX,KAAI,OAAO;;IAKf;AACF,SAAO,EAAE,QAAQ;UAEZ,GAAG;AACR,SAAO,EAAE,OAAO,GAAG"}