You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					66 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					66 lines
				
				1.5 KiB
			| 
											3 years ago
										 | '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; |