| 'use strict'; |
| |
| var jsTokens = require('js-tokens').default; |
| |
| var processEnvRe = /\bprocess\.env\.[_$a-zA-Z][$\w]+\b/; |
| var spaceOrCommentRe = /^(?:\s|\/[/*])/; |
| |
| function replace(src, envs) { |
| if (!processEnvRe.test(src)) { |
| return src; |
| } |
| |
| var out = []; |
| var purge = envs.some(function(env) { |
| return env._ && env._.indexOf('purge') !== -1; |
| }); |
| |
| jsTokens.lastIndex = 0 |
| var parts = src.match(jsTokens); |
| |
| for (var i = 0; i < parts.length; i++) { |
| if (parts[i ] === 'process' && |
| parts[i + 1] === '.' && |
| parts[i + 2] === 'env' && |
| parts[i + 3] === '.') { |
| var prevCodeToken = getAdjacentCodeToken(-1, parts, i); |
| var nextCodeToken = getAdjacentCodeToken(1, parts, i + 4); |
| var replacement = getReplacementString(envs, parts[i + 4], purge); |
| if (prevCodeToken !== '.' && |
| nextCodeToken !== '.' && |
| nextCodeToken !== '=' && |
| typeof replacement === 'string') { |
| out.push(replacement); |
| i += 4; |
| continue; |
| } |
| } |
| out.push(parts[i]); |
| } |
| |
| return out.join(''); |
| } |
| |
| function getAdjacentCodeToken(dir, parts, i) { |
| while (true) { |
| var part = parts[i += dir]; |
| if (!spaceOrCommentRe.test(part)) { |
| return part; |
| } |
| } |
| } |
| |
| function getReplacementString(envs, name, purge) { |
| for (var j = 0; j < envs.length; j++) { |
| var env = envs[j]; |
| if (typeof env[name] !== 'undefined') { |
| return JSON.stringify(env[name]); |
| } |
| } |
| if (purge) { |
| return 'undefined'; |
| } |
| } |
| |
| module.exports = replace; |