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
			| 
								 
											3 years ago
										 
									 | 
							
								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
							 |