You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							113 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
	
	
							113 lines
						
					
					
						
							2.7 KiB
						
					
					
				const fs = require('fs')
 | 
						|
const path = require('path')
 | 
						|
const os = require('os')
 | 
						|
const packageJson = require('../package.json')
 | 
						|
 | 
						|
const version = packageJson.version
 | 
						|
 | 
						|
const LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg
 | 
						|
 | 
						|
// Parser src into an Object
 | 
						|
function parse (src) {
 | 
						|
  const obj = {}
 | 
						|
 | 
						|
  // Convert buffer to string
 | 
						|
  let lines = src.toString()
 | 
						|
 | 
						|
  // Convert line breaks to same format
 | 
						|
  lines = lines.replace(/\r\n?/mg, '\n')
 | 
						|
 | 
						|
  let match
 | 
						|
  while ((match = LINE.exec(lines)) != null) {
 | 
						|
    const key = match[1]
 | 
						|
 | 
						|
    // Default undefined or null to empty string
 | 
						|
    let value = (match[2] || '')
 | 
						|
 | 
						|
    // Remove whitespace
 | 
						|
    value = value.trim()
 | 
						|
 | 
						|
    // Check if double quoted
 | 
						|
    const maybeQuote = value[0]
 | 
						|
 | 
						|
    // Remove surrounding quotes
 | 
						|
    value = value.replace(/^(['"`])([\s\S]*)\1$/mg, '$2')
 | 
						|
 | 
						|
    // Expand newlines if double quoted
 | 
						|
    if (maybeQuote === '"') {
 | 
						|
      value = value.replace(/\\n/g, '\n')
 | 
						|
      value = value.replace(/\\r/g, '\r')
 | 
						|
    }
 | 
						|
 | 
						|
    // Add to object
 | 
						|
    obj[key] = value
 | 
						|
  }
 | 
						|
 | 
						|
  return obj
 | 
						|
}
 | 
						|
 | 
						|
function _log (message) {
 | 
						|
  console.log(`[dotenv@${version}][DEBUG] ${message}`)
 | 
						|
}
 | 
						|
 | 
						|
function _resolveHome (envPath) {
 | 
						|
  return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath
 | 
						|
}
 | 
						|
 | 
						|
// Populates process.env from .env file
 | 
						|
function config (options) {
 | 
						|
  let dotenvPath = path.resolve(process.cwd(), '.env')
 | 
						|
  let encoding = 'utf8'
 | 
						|
  const debug = Boolean(options && options.debug)
 | 
						|
  const override = Boolean(options && options.override)
 | 
						|
 | 
						|
  if (options) {
 | 
						|
    if (options.path != null) {
 | 
						|
      dotenvPath = _resolveHome(options.path)
 | 
						|
    }
 | 
						|
    if (options.encoding != null) {
 | 
						|
      encoding = options.encoding
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  try {
 | 
						|
    // Specifying an encoding returns a string instead of a buffer
 | 
						|
    const parsed = DotenvModule.parse(fs.readFileSync(dotenvPath, { encoding }))
 | 
						|
 | 
						|
    Object.keys(parsed).forEach(function (key) {
 | 
						|
      if (!Object.prototype.hasOwnProperty.call(process.env, key)) {
 | 
						|
        process.env[key] = parsed[key]
 | 
						|
      } else {
 | 
						|
        if (override === true) {
 | 
						|
          process.env[key] = parsed[key]
 | 
						|
        }
 | 
						|
 | 
						|
        if (debug) {
 | 
						|
          if (override === true) {
 | 
						|
            _log(`"${key}" is already defined in \`process.env\` and WAS overwritten`)
 | 
						|
          } else {
 | 
						|
            _log(`"${key}" is already defined in \`process.env\` and was NOT overwritten`)
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    })
 | 
						|
 | 
						|
    return { parsed }
 | 
						|
  } catch (e) {
 | 
						|
    if (debug) {
 | 
						|
      _log(`Failed to load ${dotenvPath} ${e.message}`)
 | 
						|
    }
 | 
						|
 | 
						|
    return { error: e }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const DotenvModule = {
 | 
						|
  config,
 | 
						|
  parse
 | 
						|
}
 | 
						|
 | 
						|
module.exports.config = DotenvModule.config
 | 
						|
module.exports.parse = DotenvModule.parse
 | 
						|
module.exports = DotenvModule
 |