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 |