diff options
Diffstat (limited to 'node_modules/envify/custom.js')
| -rw-r--r-- | node_modules/envify/custom.js | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/node_modules/envify/custom.js b/node_modules/envify/custom.js new file mode 100644 index 00000000..981ee834 --- /dev/null +++ b/node_modules/envify/custom.js @@ -0,0 +1,91 @@ +var esprima = require('esprima') + , through = require('through') + +var processEnvPattern = /\bprocess\.env\b/ + +module.exports = function(rootEnv) { + rootEnv = rootEnv || process.env || {} + + return function envify(file, argv) { + if (/\.json$/.test(file)) return through() + + var Syntax = esprima.Syntax + var buffer = [] + argv = argv || {} + + return through(write, flush) + + function write(data) { + buffer.push(data) + } + + function transform(source, envs) { + var args = [].concat(envs[0]._ || []).concat(envs[1]._ || []) + var purge = args.indexOf('purge') !== -1 + var replacements = [] + + function match(node) { + return ( + node.type === Syntax.MemberExpression + && node.object.type === Syntax.MemberExpression + && node.object.computed === false + && node.object.object.type === Syntax.Identifier + && node.object.object.name === 'process' + && node.object.property.type === Syntax.Identifier + && node.object.property.name === 'env' + && (node.computed ? node.property.type === Syntax.Literal : node.property.type === Syntax.Identifier) + ) + } + + esprima.parse(source, { tolerant: true }, function(node, meta) { + if (match(node)) { + var key = node.property.name || node.property.value + for (var i = 0; i < envs.length; i++) { + var value = envs[i][key] + if (value !== undefined) { + replacements.push({ node: node, meta: meta, value: JSON.stringify(value) }) + return + } + } + if (purge) { + replacements.push({ node: node, meta: meta, value: undefined }) + } + } else if (node.type === Syntax.AssignmentExpression) { + for (var i = 0; i < replacements.length; ++i) { + if (replacements[i].node === node.left) { + replacements.splice(i, 1) + } + } + } + }) + + var result = source + if (replacements.length > 0) { + replacements.sort(function (a, b) { + return b.meta.start.offset - a.meta.start.offset + }) + for (var i = 0; i < replacements.length; i++) { + var r = replacements[i] + result = result.slice(0, r.meta.start.offset) + r.value + result.slice(r.meta.end.offset) + } + } + + return result + } + + function flush() { + var source = buffer.join('') + + if (processEnvPattern.test(source)) { + try { + source = transform(source, [argv, rootEnv]) + } catch(err) { + return this.emit('error', err) + } + } + + this.queue(source) + this.queue(null) + } + } +} |
