Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix removing unbalanced quotes #376

Merged
merged 7 commits into from Mar 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .flowconfig
Expand Up @@ -20,4 +20,4 @@ untyped-import
untyped-type-import

[version]
^0.84.0
^0.92.1
1 change: 1 addition & 0 deletions .npmignore
@@ -1,4 +1,5 @@
.nyc_output/
examples/
flow-typed/
tests/
.editorconfig
Expand Down
1 change: 0 additions & 1 deletion .travis.yml
Expand Up @@ -9,7 +9,6 @@ os:
node_js:
- "6"
- "8"
- "9"
- "10"
- "11"

Expand Down
38 changes: 8 additions & 30 deletions README.md
Expand Up @@ -38,8 +38,6 @@ DB_USER=root
DB_PASS=s1mpl3
```

That's it.

`process.env` now has the keys and values you defined in your `.env` file.

```javascript
Expand Down Expand Up @@ -77,9 +75,7 @@ $ DOTENV_CONFIG_ENCODING=latin1 node -r dotenv/config your_script.js dotenv_conf

## Config

_Alias: `load`_

`config` will read your .env file, parse the contents, assign it to
`config` will read your `.env` file, parse the contents, assign it to
[`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env),
and return an Object with a `parsed` key containing the loaded content or an `error` key if it failed.

Expand Down Expand Up @@ -164,17 +160,17 @@ The parsing engine currently supports the following rules:
- empty lines are skipped
- lines beginning with `#` are treated as comments
- empty values become empty strings (`EMPTY=` becomes `{EMPTY: ''}`)
- inner quotes are maintained (think JSON) (`JSON={"foo": "bar"}` becomes `{JSON:"{\"foo\": \"bar\"}"`)
- whitespace is removed from both ends of unquoted values (see more on [`trim`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)) (`FOO= some value ` becomes `{FOO: 'some value'}`)
- single and double quoted values are escaped (`SINGLE_QUOTE='quoted'` becomes `{SINGLE_QUOTE: "quoted"}`)
- new lines are expanded if in double quotes (`MULTILINE="new\nline"` becomes
- single and double quoted values maintain whitespace from both ends (`FOO=" some value "` becomes `{FOO: ' some value '}`)
- double quoted values expand new lines (`MULTILINE="new\nline"` becomes

```
{MULTILINE: 'new
line'}
```

- inner quotes are maintained (think JSON) (`JSON={"foo": "bar"}` becomes `{JSON:"{\"foo\": \"bar\"}"`)
- whitespace is removed from both ends of the value (see more on [`trim`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim)) (`FOO=" some value "` becomes `{FOO: 'some value'}`)

## FAQ

### Should I commit my `.env` file?
Expand Down Expand Up @@ -270,26 +266,8 @@ See [CHANGELOG.md](CHANGELOG.md)

See [LICENSE](LICENSE)

## Who's using dotenv

Here's just a few of many repositories using dotenv:

* [jaws](https://github.com/jaws-framework/jaws-core-js)
* [node-lambda](https://github.com/motdotla/node-lambda)
* [resume-cli](https://www.npmjs.com/package/resume-cli)
* [phant](https://www.npmjs.com/package/phant)
* [adafruit-io-node](https://github.com/adafruit/adafruit-io-node)
* [mockbin](https://www.npmjs.com/package/mockbin)
* [and many more...](https://www.npmjs.com/browse/depended/dotenv)

## Go well with dotenv
## Who's using dotenv?

Here's some projects that expand on dotenv. Check them out.
[These npm modules depend on it.](https://www.npmjs.com/browse/depended/dotenv)

* [require-environment-variables](https://github.com/bjoshuanoah/require-environment-variables)
* [dotenv-safe](https://github.com/rolodato/dotenv-safe)
* [envalid](https://github.com/af/envalid)
* [lookenv](https://github.com/RodrigoEspinosa/lookenv)
* [run.env](https://www.npmjs.com/package/run.env)
* [dotenv-webpack](https://github.com/mrsteele/dotenv-webpack)
* [env-path](https://github.com/benrei/env-path)
Projects that expand it often use the [keyword "dotenv" on npm](https://www.npmjs.com/search?q=keywords:dotenv).
60 changes: 60 additions & 0 deletions flow-typed/npm/decache_vx.x.x.js
@@ -0,0 +1,60 @@
// flow-typed signature: abdbe43f01cbcc690c733cdb2033ad4f
// flow-typed version: <<STUB>>/decache_v4.5.0/flow_v0.92.1

/**
* This is an autogenerated libdef stub for:
*
* 'decache'
*
* Fill this stub out by replacing all the `any` types.
*
* Once filled out, we encourage you to share your work with the
* community by sending a pull request to:
* https://github.com/flowtype/flow-typed
*/

declare module 'decache' {
declare module.exports: any;
}

/**
* We include stubs for each file inside this npm package in case you need to
* require those files directly. Feel free to delete any files that aren't
* needed.
*/
declare module 'decache/decache' {
declare module.exports: any;
}

declare module 'decache/lib/mymodule/index' {
declare module.exports: any;
}

declare module 'decache/lib/othermodule' {
declare module.exports: any;
}

declare module 'decache/setup' {
declare module.exports: any;
}

declare module 'decache/test/test' {
declare module.exports: any;
}

// Filename aliases
declare module 'decache/decache.js' {
declare module.exports: $Exports<'decache/decache'>;
}
declare module 'decache/lib/mymodule/index.js' {
declare module.exports: $Exports<'decache/lib/mymodule/index'>;
}
declare module 'decache/lib/othermodule.js' {
declare module.exports: $Exports<'decache/lib/othermodule'>;
}
declare module 'decache/setup.js' {
declare module.exports: $Exports<'decache/setup'>;
}
declare module 'decache/test/test.js' {
declare module.exports: $Exports<'decache/test/test'>;
}
6 changes: 3 additions & 3 deletions lib/env-options.js
Expand Up @@ -3,15 +3,15 @@
// ../config.js accepts options via environment variables
const options = {}

if (process.env.DOTENV_CONFIG_ENCODING) {
if (process.env.DOTENV_CONFIG_ENCODING != null) {
options.encoding = process.env.DOTENV_CONFIG_ENCODING
}

if (process.env.DOTENV_CONFIG_PATH) {
if (process.env.DOTENV_CONFIG_PATH != null) {
options.path = process.env.DOTENV_CONFIG_PATH
}

if (process.env.DOTENV_CONFIG_DEBUG) {
if (process.env.DOTENV_CONFIG_DEBUG != null) {
options.debug = process.env.DOTENV_CONFIG_DEBUG
}

Expand Down
37 changes: 23 additions & 14 deletions lib/main.js
Expand Up @@ -28,32 +28,42 @@ function log (message /*: string */) {
console.log(`[dotenv][DEBUG] ${message}`)
}

const NEWLINE = '\n'
const RE_INI_KEY_VAL = /^\s*([\w.-]+)\s*=\s*(.*)?\s*$/
const RE_NEWLINES = /\\n/g

// Parses src into an Object
function parse (src /*: string | Buffer */, options /*: ?DotenvParseOptions */) /*: DotenvParseOutput */ {
const debug = Boolean(options && options.debug)
const obj = {}

// convert Buffers before splitting into lines and processing
src.toString().split('\n').forEach(function (line, idx) {
src.toString().split(NEWLINE).forEach(function (line, idx) {
// matching "KEY' and 'VAL' in 'KEY=VAL'
const keyValueArr = line.match(/^\s*([\w.-]+)\s*=\s*(.*)?\s*$/)
const keyValueArr = line.match(RE_INI_KEY_VAL)
// matched?
if (keyValueArr != null) {
const key = keyValueArr[1]

// default undefined or missing values to empty string
let value = keyValueArr[2] || ''

// expand newlines in quoted values
const len = value ? value.length : 0
if (len > 0 && value.charAt(0) === '"' && value.charAt(len - 1) === '"') {
value = value.replace(/\\n/gm, '\n')
let val = (keyValueArr[2] || '')
const end = val.length - 1
const isDoubleQuoted = val[0] === '"' && val[end] === '"'
const isSingleQuoted = val[0] === "'" && val[end] === "'"

// if single or double quoted, remove quotes
if (isSingleQuoted || isDoubleQuoted) {
val = val.substring(1, end)

// if double quoted, expand newlines
if (isDoubleQuoted) {
val = val.replace(RE_NEWLINES, NEWLINE)
}
} else {
// remove surrounding whitespace
val = val.trim()
}

// remove any surrounding quotes and extra spaces
value = value.replace(/(^['"]|['"]$)/g, '').trim()

obj[key] = value
obj[key] = val
} else if (debug) {
log(`did not match key and value when parsing line ${idx + 1}: ${line}`)
}
Expand Down Expand Up @@ -99,5 +109,4 @@ function config (options /*: ?DotenvConfigOptions */) /*: DotenvConfigOutput */
}

module.exports.config = config
module.exports.load = config
module.exports.parse = parse