/**
|
* espower-loader - Power Assert feature instrumentor on the fly.
|
*
|
* https://github.com/power-assert-js/espower-loader
|
*
|
* Copyright (c) 2013-2017 Takuto Wada
|
* Licensed under the MIT license.
|
* https://github.com/power-assert-js/espower-loader/blob/master/MIT-LICENSE.txt
|
*/
|
var extensions = require.extensions;
|
var originalLoader = extensions['.js'];
|
var fs = require('fs');
|
var extend = require('xtend');
|
var minimatch = require('minimatch');
|
var convert = require('convert-source-map');
|
var sourceMapSupport = require('source-map-support');
|
var espowerSourceToSource = require('espower-source');
|
var pathToMap = {};
|
|
function espowerLoader (options) {
|
'use strict';
|
options = extend({ cwd: process.cwd() }, options);
|
|
var patternStartsWithSlash = (options.pattern.lastIndexOf('/', 0) === 0);
|
var separator = patternStartsWithSlash ? '' : '/';
|
var pattern = options.cwd + separator + options.pattern;
|
sourceMapSupport.install({
|
retrieveSourceMap: function (source) {
|
if (minimatch(source, pattern) && pathToMap[source]) {
|
return {
|
map: pathToMap[source]
|
};
|
}
|
return null;
|
}
|
});
|
var espowerOptions = extend({ sourceRoot: options.cwd }, options.espowerOptions);
|
|
extensions['.js'] = function (localModule, filepath) {
|
var output;
|
if (minimatch(filepath, pattern)){
|
output = espowerSourceToSource(fs.readFileSync(filepath, 'utf-8'), filepath, espowerOptions);
|
var map = convert.fromSource(output).toObject();
|
pathToMap[filepath] = map;
|
localModule._compile(output, filepath);
|
} else {
|
originalLoader(localModule, filepath);
|
}
|
};
|
}
|
|
module.exports = espowerLoader;
|