diff --git a/.env b/.env new file mode 100644 index 0000000..7999238 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +MESSAGE_FROM_DOTENV=Hello, World! diff --git a/.npmignore b/.npmignore index 5acd1cf..736e521 100644 --- a/.npmignore +++ b/.npmignore @@ -1,2 +1,3 @@ test.js .travis.yml +.env diff --git a/README.md b/README.md index 37f2c65..4ef0b7e 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,27 @@ b.transform(envify({ })) ``` +## Loading `.env` file ## + +Envify can load a `.env` file for you using the +[dotenv](https://github.com/motdotla/dotenv) package. To enable this +functionallity, simply use the subarg syntax and include `dotenv` after +`envify`, e.g.: + +``` bash +browserify index.js -t [ envify dotenv --NODE_ENV development ] +``` + +Or if you're using the module API, you can pass `_: "dotenv"` into your +arguments like so: + +``` javascript +b.transform(envify({ + _: 'dotenv' + , NODE_ENV: 'development' +})) +``` + ## Contributors ## * [hughsk](http://github.com/hughsk) diff --git a/custom.js b/custom.js index 981ee83..5457172 100644 --- a/custom.js +++ b/custom.js @@ -1,8 +1,27 @@ -var esprima = require('esprima') +var dotenv = require('dotenv') + , esprima = require('esprima') + , fs = require('fs') , through = require('through') var processEnvPattern = /\bprocess\.env\b/ +var dotenvCache +function getDotenv() { + if (dotenvCache === undefined) { + try { + dotenvCache = dotenv.parse(fs.readFileSync('.env')) + } catch (err) { + if (err.code === 'ENOENT') { + dotenvCache = {} + } else { + throw err + } + } + } + + return dotenvCache +} + module.exports = function(rootEnv) { rootEnv = rootEnv || process.env || {} @@ -24,6 +43,10 @@ module.exports = function(rootEnv) { var purge = args.indexOf('purge') !== -1 var replacements = [] + if (args.indexOf('dotenv') !== -1) { + envs.push(getDotenv()) + } + function match(node) { return ( node.type === Syntax.MemberExpression diff --git a/package.json b/package.json index 28e3b2d..31f2f51 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "tape": "^4.6.0" }, "dependencies": { + "dotenv": "^4.0.0", "esprima": "^4.0.0", "through": "~2.3.4" }, diff --git a/test.js b/test.js index 7bd5aea..baf5ac7 100644 --- a/test.js +++ b/test.js @@ -183,3 +183,29 @@ test('-t [ envify purge --argument ]', function(t) { , 'var y = process.env.argument' ].join('\n')) }) + +test('-t [ envify dotenv ]', function(t) { + var stream = envify({ argument: 'not purged' }) + var buffer = '' + + stream(__filename, { _: ['dotenv'] }) + .on('data', function(d) { buffer += d }) + .on('end', function() { + t.notEqual(-1, buffer.indexOf('var x = "Hello, World!"'), 'replaces with value from dotenv file') + t.end() + }) + .end('var x = process.env.MESSAGE_FROM_DOTENV') +}) + +test('-t [ envify dotenv --MESSAGE_FROM_DOTENV intercepted ]', function(t) { + var stream = envify({ argument: 'not purged' }) + var buffer = '' + + stream(__filename, { _: ['dotenv'], MESSAGE_FROM_DOTENV: 'intercepted' }) + .on('data', function(d) { buffer += d }) + .on('end', function() { + t.notEqual(-1, buffer.indexOf('var x = "intercepted"'), 'uses arguments before dotenv file') + t.end() + }) + .end('var x = process.env.MESSAGE_FROM_DOTENV') +})