code: function NormalLoaderApplier(loaders, dataMap, done) {
    return function apply(cursor, sourceCode, sourceMap, inputValues) {
      var loader = loaders[cursor];
      var context;
  
      if (!loader) {
        return done(null, sourceCode, sourceMap);
      }
  
      context = loader.context;
      context.data = dataMap[cursor];
      context.inputValues = inputValues || {};
  
      var fn = loader.module.__esModule === true ?
        loader.module.default :
        loader.module
      ;
  
      applySyncOrAsync(fn, context, [ sourceCode, sourceMap ],
        function(err, nextSource, nextSourceMap) {
          if (err) {
            return done(err);
          }
  
          apply(cursor - 1, nextSource, nextSourceMap, context.values);
        }
      );
    };
  }
docs: Generates a function that will perform the "normal" loader phase (ie non-pitching.)  Normal loaders are applied from right-to-left and may yield one or both of "sourceCode" and "sourceMap" values.  Each application will forward a state variable called "inputValues" to the succeeding loader, which gets populated as "values" in the preceding one.  For example, for a request like this "b!a!./foo.js"  // a-loader.js module.exports = function(code) { this.values = { foo: 'bar' };  return code; };  // b-loader.js module.exports = function(code) { console.log(this.inputValues); // { foo: "bar" };  return code; };  @param {Array.<Object>} dataMap Data generated during the pitching phase. This set is expected to be fully populated (even if each item is an empty object) and be ordered after the loaders in the @loaders array.