text: 'use strict';
  
  var jsTokens = require('js-tokens');
  
  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;
  