UNPKG

1.53 kBJavaScriptView Raw
1'use strict';
2
3var jsTokens = require('js-tokens').default;
4
5var processEnvRe = /\bprocess\.env\.[_$a-zA-Z][$\w]+\b/;
6var spaceOrCommentRe = /^(?:\s|\/[/*])/;
7
8function replace(src, envs) {
9 if (!processEnvRe.test(src)) {
10 return src;
11 }
12
13 var out = [];
14 var purge = envs.some(function(env) {
15 return env._ && env._.indexOf('purge') !== -1;
16 });
17
18 jsTokens.lastIndex = 0
19 var parts = src.match(jsTokens);
20
21 for (var i = 0; i < parts.length; i++) {
22 if (parts[i ] === 'process' &&
23 parts[i + 1] === '.' &&
24 parts[i + 2] === 'env' &&
25 parts[i + 3] === '.') {
26 var prevCodeToken = getAdjacentCodeToken(-1, parts, i);
27 var nextCodeToken = getAdjacentCodeToken(1, parts, i + 4);
28 var replacement = getReplacementString(envs, parts[i + 4], purge);
29 if (prevCodeToken !== '.' &&
30 nextCodeToken !== '.' &&
31 nextCodeToken !== '=' &&
32 typeof replacement === 'string') {
33 out.push(replacement);
34 i += 4;
35 continue;
36 }
37 }
38 out.push(parts[i]);
39 }
40
41 return out.join('');
42}
43
44function getAdjacentCodeToken(dir, parts, i) {
45 while (true) {
46 var part = parts[i += dir];
47 if (!spaceOrCommentRe.test(part)) {
48 return part;
49 }
50 }
51}
52
53function getReplacementString(envs, name, purge) {
54 for (var j = 0; j < envs.length; j++) {
55 var env = envs[j];
56 if (typeof env[name] !== 'undefined') {
57 return JSON.stringify(env[name]);
58 }
59 }
60 if (purge) {
61 return 'undefined';
62 }
63}
64
65module.exports = replace;