| /* |
| Copyright (c) 2015, Scott Motte |
| All rights reserved. |
| |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions are met: |
| |
| * Redistributions of source code must retain the above copyright notice, this |
| list of conditions and the following disclaimer. |
| |
| * Redistributions in binary form must reproduce the above copyright notice, |
| this list of conditions and the following disclaimer in the documentation |
| and/or other materials provided with the distribution. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| import fs from 'fs'; |
| import path from 'path'; |
| import os from 'os'; |
| |
| const version = "dotenv v16.0.3" |
| |
| 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 |
| } |
| |
| export default DotenvModule |