registerInMemoryCompiler.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _keys = require('babel-runtime/core-js/object/keys');
  6. var _keys2 = _interopRequireDefault(_keys);
  7. var _map = require('babel-runtime/core-js/map');
  8. var _map2 = _interopRequireDefault(_map);
  9. exports.default = registerInMemoryCompiler;
  10. var _path = require('path');
  11. var _path2 = _interopRequireDefault(_path);
  12. var _sourceMapSupport = require('source-map-support');
  13. var _sourceMapSupport2 = _interopRequireDefault(_sourceMapSupport);
  14. var _memoryFs = require('memory-fs');
  15. var _memoryFs2 = _interopRequireDefault(_memoryFs);
  16. var _registerRequireHook = require('../../util/registerRequireHook');
  17. var _registerRequireHook2 = _interopRequireDefault(_registerRequireHook);
  18. var _paths = require('../../util/paths');
  19. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  20. function registerInMemoryCompiler(compiler) {
  21. // register memory fs to webpack
  22. var memoryFs = new _memoryFs2.default();
  23. compiler.outputFileSystem = memoryFs; // eslint-disable-line no-param-reassign
  24. // build asset map to allow fast checks for file existence
  25. var assetMap = new _map2.default();
  26. compiler.hooks.done.tap('mocha-webpack', function (stats) {
  27. assetMap.clear();
  28. if (!stats.hasErrors()) {
  29. (0, _keys2.default)(stats.compilation.assets).forEach(function (assetPath) {
  30. return assetMap.set((0, _paths.ensureAbsolutePath)(assetPath, compiler.options.output.path), true);
  31. });
  32. }
  33. });
  34. // provide file reader to read from memory fs
  35. var readFile = function readFile(filePath) {
  36. if (assetMap.has(filePath)) {
  37. try {
  38. var code = memoryFs.readFileSync(filePath, 'utf8');
  39. return code;
  40. } catch (e) {
  41. return null;
  42. }
  43. }
  44. return null;
  45. };
  46. // module resolver for require calls from memory fs
  47. var resolveFile = function resolveFile(filePath, requireCaller) {
  48. // try to read file from memory-fs as it is
  49. var code = readFile(filePath);
  50. var resolvedPath = filePath;
  51. if (code === null && requireCaller != null) {
  52. var filename = requireCaller.filename;
  53. if (filename != null) {
  54. // if that didn't work, resolve the file relative to it's parent
  55. resolvedPath = _path2.default.resolve(_path2.default.dirname(filename), filePath);
  56. code = readFile(resolvedPath);
  57. }
  58. }
  59. return { path: code !== null ? resolvedPath : null, source: code };
  60. };
  61. // install require hook to be able to require webpack bundles from memory
  62. var unmountHook = (0, _registerRequireHook2.default)('.js', resolveFile);
  63. // install source map support to read source map from memory
  64. _sourceMapSupport2.default.install({
  65. emptyCacheBetweenOperations: true,
  66. handleUncaughtExceptions: false,
  67. environment: 'node',
  68. retrieveFile: function retrieveFile(f) {
  69. return readFile(f);
  70. } // wrapper function to fake an unmount function
  71. });
  72. return function unmount() {
  73. unmountHook();
  74. readFile = function readFile(filePath) {
  75. return null;
  76. }; // eslint-disable-line no-unused-vars
  77. };
  78. }