Source: generator.js

'use strict';

const path = require('path');

const DEFAULT_PREFIX = 'NODE_APP';
const DEFAULT_NO_PREFIX = false;
const PACKAGE_NAME_PREFIX_PLACEHOLDER = '@';
const DEFAULT_SEPARATOR = '_';
const CASING_UPPER = 'upper';
const CASING_LOWER = 'lower';
const CASING_UNCHANGED = 'unchanged';
const DEFAULT_CASING = CASING_UPPER;
const DEFAULT_EMPTIES = false;
/**
 * Generates an object suitable for use with [config](https://npmjs.com/package/config)'s `config/custom-environment-variables.json`, skipping any functions encountered in the given object.
 * Example:
 * ```
 *   const fs = require('fs');
 *   const config = require('config');
 *   const cev = require('config-custom-environment-variables-generator');
 *   fs.writeFileSync('config/custom-environment-variables.json', JSON.stringify(cev.generate(config, { prefix: 'MYAPP' }), null, 2)));
 * ```
 * @param {object} obj An object, most likely the one returned by `require('config')`.
 * @param {string} [opts.prefix='NODE_APP'] Prefix to use on environment variables.  Use `@` to use the name of your application (see exported `DEFAULT_PREFIX`).
 * @param {boolean} [opts.noPrefix=false] Overrides use of any prefix (see exported `DEFAULT_NO_PREFIX`).
 * @param {separator} [opts.separator='_'] The word separator in environment variables (see exported `DEFAULT_SEPARATOR`).
 * @param {'upper'|'lower'|undefined} [opts.casing='upper'] The case to use.  `upper` forces upper case, `lower` forces lower case, else case is unchanged (see exported `DEFAULT_CASING`, `CASING_UPPER`, `CASING_LOWER`, and `CASING_UNCHANGED`).
 * @param {boolean} [opts.empties=false] If `true`, preserves empty objects that didn't have any environment variables, else skips entries that wouldn't have any environment variables (functions are always skipped).
 * @param {object} [opts.formats={}] If given, must be an object that specifies the __format value for the corresponding key of the first argument,
 * @returns {object} An object containing the generated environment variables for each key in the input object.
 */

const generate = function generate(obj, opts) {
  obj = obj || {};
  opts = opts || {};
  opts.formats = opts.formats || {};
  let prefix = '';
  const noPrefix = opts.noPrefix;

  if (!noPrefix) {
    prefix = opts.prefix || module.exports.DEFAULT_PREFIX;

    if (prefix === PACKAGE_NAME_PREFIX_PLACEHOLDER) {
      prefix = require(path.resolve('package.json')).name;
    }
  }

  const separator = opts.separator || module.exports.DEFAULT_SEPARATOR;
  const keys = Object.keys(opts);
  const casing = keys.indexOf('casing') === -1 ? DEFAULT_CASING : opts.casing.toString().toLowerCase();
  const empties = keys.indexOf('empties') === -1 ? DEFAULT_EMPTIES : !!opts.empties;
  const vars = {};
  Object.keys(obj).forEach(function (key) {
    if (obj[key] instanceof Function) {
      return null; // skip
    }

    if (obj[key] instanceof Object) {
      // recurse
      const pre = applyCasing((prefix ? prefix + separator : '') + key, casing);
      vars[key] = generate(obj[key], {
        prefix: pre,
        separator: separator,
        casing: casing,
        empties: empties,
        formats: opts.formats[key]
      });
      if (!Object.keys(vars[key]).length && !empties) delete vars[key];
    } else {
      // add
      const v = applyCasing((prefix ? prefix + separator : '') + key, casing); // support __format feature

      if (opts.formats[key]) {
        vars[key] = {
          __name: v,
          __format: opts.formats[key]
        };
      } else {
        vars[key] = v;
      }
    }
  });
  return vars;
};

function applyCasing(value, casing) {
  value = value.toString();

  switch (casing) {
    case CASING_UPPER:
      return value.toUpperCase();

    case CASING_LOWER:
      return value.toLowerCase();

    default:
      // CASING_UNCHANGED
      return value;
  }
}

module.exports = generate;
module.exports.generate = generate;
module.exports.DEFAULT_PREFIX = DEFAULT_PREFIX;
module.exports.DEFAULT_NO_PREFIX = DEFAULT_NO_PREFIX;
module.exports.DEFAULT_SEPARATOR = DEFAULT_SEPARATOR;
module.exports.DEFAULT_EMPTIES = DEFAULT_EMPTIES;
module.exports.DEFAULT_CASING = DEFAULT_CASING;
module.exports.CASING_UPPER = CASING_UPPER;
module.exports.CASING_LOWER = CASING_LOWER;
module.exports.CASING_UNCHANGED = CASING_UNCHANGED;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9nZW5lcmF0b3IuanMiXSwibmFtZXMiOlsicGF0aCIsInJlcXVpcmUiLCJERUZBVUxUX1BSRUZJWCIsIkRFRkFVTFRfTk9fUFJFRklYIiwiUEFDS0FHRV9OQU1FX1BSRUZJWF9QTEFDRUhPTERFUiIsIkRFRkFVTFRfU0VQQVJBVE9SIiwiQ0FTSU5HX1VQUEVSIiwiQ0FTSU5HX0xPV0VSIiwiQ0FTSU5HX1VOQ0hBTkdFRCIsIkRFRkFVTFRfQ0FTSU5HIiwiREVGQVVMVF9FTVBUSUVTIiwiZ2VuZXJhdGUiLCJvYmoiLCJvcHRzIiwiZm9ybWF0cyIsInByZWZpeCIsIm5vUHJlZml4IiwibW9kdWxlIiwiZXhwb3J0cyIsInJlc29sdmUiLCJuYW1lIiwic2VwYXJhdG9yIiwia2V5cyIsIk9iamVjdCIsImNhc2luZyIsImluZGV4T2YiLCJ0b1N0cmluZyIsInRvTG93ZXJDYXNlIiwiZW1wdGllcyIsInZhcnMiLCJmb3JFYWNoIiwia2V5IiwiRnVuY3Rpb24iLCJwcmUiLCJhcHBseUNhc2luZyIsImxlbmd0aCIsInYiLCJfX25hbWUiLCJfX2Zvcm1hdCIsInZhbHVlIiwidG9VcHBlckNhc2UiXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBLE1BQU1BLElBQUksR0FBR0MsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBRUEsTUFBTUMsY0FBYyxHQUFHLFVBQXZCO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsS0FBMUI7QUFDQSxNQUFNQywrQkFBK0IsR0FBRyxHQUF4QztBQUNBLE1BQU1DLGlCQUFpQixHQUFHLEdBQTFCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLE9BQXJCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLE9BQXJCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsV0FBekI7QUFDQSxNQUFNQyxjQUFjLEdBQUdILFlBQXZCO0FBQ0EsTUFBTUksZUFBZSxHQUFHLEtBQXhCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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TSxDQUFDQyxPQUFQLENBQWVYLFlBQWYsR0FBOEJBLFlBQTlCO0FBQ0FVLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlVixnQkFBZixHQUFrQ0EsZ0JBQWxDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcblxuY29uc3QgREVGQVVMVF9QUkVGSVggPSAnTk9ERV9BUFAnXG5jb25zdCBERUZBVUxUX05PX1BSRUZJWCA9IGZhbHNlXG5jb25zdCBQQUNLQUdFX05BTUVfUFJFRklYX1BMQUNFSE9MREVSID0gJ0AnXG5jb25zdCBERUZBVUxUX1NFUEFSQVRPUiA9ICdfJ1xuY29uc3QgQ0FTSU5HX1VQUEVSID0gJ3VwcGVyJ1xuY29uc3QgQ0FTSU5HX0xPV0VSID0gJ2xvd2VyJ1xuY29uc3QgQ0FTSU5HX1VOQ0hBTkdFRCA9ICd1bmNoYW5nZWQnXG5jb25zdCBERUZBVUxUX0NBU0lORyA9IENBU0lOR19VUFBFUlxuY29uc3QgREVGQVVMVF9FTVBUSUVTID0gZmFsc2VcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gb2JqZWN0IHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBbY29uZmlnXShodHRwczovL25wbWpzLmNvbS9wYWNrYWdlL2NvbmZpZykncyBgY29uZmlnL2N1c3RvbS1lbnZpcm9ubWVudC12YXJpYWJsZXMuanNvbmAsIHNraXBwaW5nIGFueSBmdW5jdGlvbnMgZW5jb3VudGVyZWQgaW4gdGhlIGdpdmVuIG9iamVjdC5cbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuICogICBjb25zdCBjb25maWcgPSByZXF1aXJlKCdjb25maWcnKTtcbiAqICAgY29uc3QgY2V2ID0gcmVxdWlyZSgnY29uZmlnLWN1c3RvbS1lbnZpcm9ubWVudC12YXJpYWJsZXMtZ2VuZXJhdG9yJyk7XG4gKiAgIGZzLndyaXRlRmlsZVN5bmMoJ2NvbmZpZy9jdXN0b20tZW52aXJvbm1lbnQtdmFyaWFibGVzLmpzb24nLCBKU09OLnN0cmluZ2lmeShjZXYuZ2VuZXJhdGUoY29uZmlnLCB7IHByZWZpeDogJ01ZQVBQJyB9KSwgbnVsbCwgMikpKTtcbiAqIGBgYFxuICogQHBhcmFtIHtvYmplY3R9IG9iaiBBbiBvYmplY3QsIG1vc3QgbGlrZWx5IHRoZSBvbmUgcmV0dXJuZWQgYnkgYHJlcXVpcmUoJ2NvbmZpZycpYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5wcmVmaXg9J05PREVfQVBQJ10gUHJlZml4IHRvIHVzZSBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICBVc2UgYEBgIHRvIHVzZSB0aGUgbmFtZSBvZiB5b3VyIGFwcGxpY2F0aW9uIChzZWUgZXhwb3J0ZWQgYERFRkFVTFRfUFJFRklYYCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLm5vUHJlZml4PWZhbHNlXSBPdmVycmlkZXMgdXNlIG9mIGFueSBwcmVmaXggKHNlZSBleHBvcnRlZCBgREVGQVVMVF9OT19QUkVGSVhgKS5cbiAqIEBwYXJhbSB7c2VwYXJhdG9yfSBbb3B0cy5zZXBhcmF0b3I9J18nXSBUaGUgd29yZCBzZXBhcmF0b3IgaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIChzZWUgZXhwb3J0ZWQgYERFRkFVTFRfU0VQQVJBVE9SYCkuXG4gKiBAcGFyYW0geyd1cHBlcid8J2xvd2VyJ3x1bmRlZmluZWR9IFtvcHRzLmNhc2luZz0ndXBwZXInXSBUaGUgY2FzZSB0byB1c2UuICBgdXBwZXJgIGZvcmNlcyB1cHBlciBjYXNlLCBgbG93ZXJgIGZvcmNlcyBsb3dlciBjYXNlLCBlbHNlIGNhc2UgaXMgdW5jaGFuZ2VkIChzZWUgZXhwb3J0ZWQgYERFRkFVTFRfQ0FTSU5HYCwgYENBU0lOR19VUFBFUmAsIGBDQVNJTkdfTE9XRVJgLCBhbmQgYENBU0lOR19VTkNIQU5HRURgKS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZW1wdGllcz1mYWxzZV0gSWYgYHRydWVgLCBwcmVzZXJ2ZXMgZW1wdHkgb2JqZWN0cyB0aGF0IGRpZG4ndCBoYXZlIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGVsc2Ugc2tpcHMgZW50cmllcyB0aGF0IHdvdWxkbid0IGhhdmUgYW55IGVudmlyb25tZW50IHZhcmlhYmxlcyAoZnVuY3Rpb25zIGFyZSBhbHdheXMgc2tpcHBlZCkuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdHMuZm9ybWF0cz17fV0gSWYgZ2l2ZW4sIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIHRoZSBfX2Zvcm1hdCB2YWx1ZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcga2V5IG9mIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIEByZXR1cm5zIHtvYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBlYWNoIGtleSBpbiB0aGUgaW5wdXQgb2JqZWN0LlxuICovXG5jb25zdCBnZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlIChvYmosIG9wdHMpIHtcbiAgb2JqID0gb2JqIHx8IHt9XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIG9wdHMuZm9ybWF0cyA9IG9wdHMuZm9ybWF0cyB8fCB7fVxuXG4gIGxldCBwcmVmaXggPSAnJ1xuICBjb25zdCBub1ByZWZpeCA9IG9wdHMubm9QcmVmaXhcbiAgaWYgKCFub1ByZWZpeCkge1xuICAgIHByZWZpeCA9IG9wdHMucHJlZml4IHx8IG1vZHVsZS5leHBvcnRzLkRFRkFVTFRfUFJFRklYXG4gICAgaWYgKHByZWZpeCA9PT0gUEFDS0FHRV9OQU1FX1BSRUZJWF9QTEFDRUhPTERFUikge1xuICAgICAgcHJlZml4ID0gcmVxdWlyZShwYXRoLnJlc29sdmUoJ3BhY2thZ2UuanNvbicpKS5uYW1lXG4gICAgfVxuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IG9wdHMuc2VwYXJhdG9yIHx8IG1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0VQQVJBVE9SXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRzKVxuICBjb25zdCBjYXNpbmcgPSBrZXlzLmluZGV4T2YoJ2Nhc2luZycpID09PSAtMVxuICAgID8gREVGQVVMVF9DQVNJTkdcbiAgICA6IG9wdHMuY2FzaW5nLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKVxuICBjb25zdCBlbXB0aWVzID0ga2V5cy5pbmRleE9mKCdlbXB0aWVzJykgPT09IC0xXG4gICAgPyBERUZBVUxUX0VNUFRJRVNcbiAgICA6ICghIW9wdHMuZW1wdGllcylcblxuICBjb25zdCB2YXJzID0ge31cblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICgob2JqW2tleV0gaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiBudWxsIC8vIHNraXBcbiAgICB9XG5cbiAgICBpZiAob2JqW2tleV0gaW5zdGFuY2VvZiBPYmplY3QpIHsgLy8gcmVjdXJzZVxuICAgICAgY29uc3QgcHJlID0gYXBwbHlDYXNpbmcoKHByZWZpeCA/IChwcmVmaXggKyBzZXBhcmF0b3IpIDogJycpICsga2V5LCBjYXNpbmcpXG4gICAgICB2YXJzW2tleV0gPSBnZW5lcmF0ZShvYmpba2V5XSwge1xuICAgICAgICBwcmVmaXg6IHByZSxcbiAgICAgICAgc2VwYXJhdG9yOiBzZXBhcmF0b3IsXG4gICAgICAgIGNhc2luZzogY2FzaW5nLFxuICAgICAgICBlbXB0aWVzOiBlbXB0aWVzLFxuICAgICAgICBmb3JtYXRzOiBvcHRzLmZvcm1hdHNba2V5XVxuICAgICAgfSlcbiAgICAgIGlmICgoIU9iamVjdC5rZXlzKHZhcnNba2V5XSkubGVuZ3RoKSAmJiAhZW1wdGllcykgZGVsZXRlIHZhcnNba2V5XVxuICAgIH0gZWxzZSB7IC8vIGFkZFxuICAgICAgY29uc3QgdiA9IGFwcGx5Q2FzaW5nKChwcmVmaXggPyBwcmVmaXggKyBzZXBhcmF0b3IgOiAnJykgKyBrZXksIGNhc2luZylcbiAgICAgIC8vIHN1cHBvcnQgX19mb3JtYXQgZmVhdHVyZVxuICAgICAgaWYgKG9wdHMuZm9ybWF0c1trZXldKSB7XG4gICAgICAgIHZhcnNba2V5XSA9IHtcbiAgICAgICAgICBfX25hbWU6IHYsXG4gICAgICAgICAgX19mb3JtYXQ6IG9wdHMuZm9ybWF0c1trZXldXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNba2V5XSA9IHZcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiB2YXJzXG59XG5cbmZ1bmN0aW9uIGFwcGx5Q2FzaW5nICh2YWx1ZSwgY2FzaW5nKSB7XG4gIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKVxuICBzd2l0Y2ggKGNhc2luZykge1xuICAgIGNhc2UgQ0FTSU5HX1VQUEVSOlxuICAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKClcbiAgICBjYXNlIENBU0lOR19MT1dFUjpcbiAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpXG4gICAgZGVmYXVsdDogLy8gQ0FTSU5HX1VOQ0hBTkdFRFxuICAgICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZW5lcmF0ZVxubW9kdWxlLmV4cG9ydHMuZ2VuZXJhdGUgPSBnZW5lcmF0ZVxubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9QUkVGSVggPSBERUZBVUxUX1BSRUZJWFxubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9OT19QUkVGSVggPSBERUZBVUxUX05PX1BSRUZJWFxubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TRVBBUkFUT1IgPSBERUZBVUxUX1NFUEFSQVRPUlxubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9FTVBUSUVTID0gREVGQVVMVF9FTVBUSUVTXG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX0NBU0lORyA9IERFRkFVTFRfQ0FTSU5HXG5tb2R1bGUuZXhwb3J0cy5DQVNJTkdfVVBQRVIgPSBDQVNJTkdfVVBQRVJcbm1vZHVsZS5leHBvcnRzLkNBU0lOR19MT1dFUiA9IENBU0lOR19MT1dFUlxubW9kdWxlLmV4cG9ydHMuQ0FTSU5HX1VOQ0hBTkdFRCA9IENBU0lOR19VTkNIQU5HRURcbiJdfQ==