index.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /**
  2. * espower-loader - Power Assert feature instrumentor on the fly.
  3. *
  4. * https://github.com/power-assert-js/espower-loader
  5. *
  6. * Copyright (c) 2013-2017 Takuto Wada
  7. * Licensed under the MIT license.
  8. * https://github.com/power-assert-js/espower-loader/blob/master/MIT-LICENSE.txt
  9. */
  10. var extensions = require.extensions;
  11. var originalLoader = extensions['.js'];
  12. var fs = require('fs');
  13. var extend = require('xtend');
  14. var minimatch = require('minimatch');
  15. var convert = require('convert-source-map');
  16. var sourceMapSupport = require('source-map-support');
  17. var espowerSourceToSource = require('espower-source');
  18. var pathToMap = {};
  19. function espowerLoader (options) {
  20. 'use strict';
  21. options = extend({ cwd: process.cwd() }, options);
  22. var patternStartsWithSlash = (options.pattern.lastIndexOf('/', 0) === 0);
  23. var separator = patternStartsWithSlash ? '' : '/';
  24. var pattern = options.cwd + separator + options.pattern;
  25. sourceMapSupport.install({
  26. retrieveSourceMap: function (source) {
  27. if (minimatch(source, pattern) && pathToMap[source]) {
  28. return {
  29. map: pathToMap[source]
  30. };
  31. }
  32. return null;
  33. }
  34. });
  35. var espowerOptions = extend({ sourceRoot: options.cwd }, options.espowerOptions);
  36. extensions['.js'] = function (localModule, filepath) {
  37. var output;
  38. if (minimatch(filepath, pattern)){
  39. output = espowerSourceToSource(fs.readFileSync(filepath, 'utf-8'), filepath, espowerOptions);
  40. var map = convert.fromSource(output).toObject();
  41. pathToMap[filepath] = map;
  42. localModule._compile(output, filepath);
  43. } else {
  44. originalLoader(localModule, filepath);
  45. }
  46. };
  47. }
  48. module.exports = espowerLoader;