registerRequireHook.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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 _getIterator2 = require('babel-runtime/core-js/get-iterator');
  8. var _getIterator3 = _interopRequireDefault(_getIterator2);
  9. exports.default = registerRequireHook;
  10. var _module = require('module');
  11. var _module2 = _interopRequireDefault(_module);
  12. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  13. // the module in which the require() call originated
  14. var requireCaller = void 0;
  15. // all custom registered resolvers
  16. /* eslint-disable no-underscore-dangle */
  17. // see https://github.com/nodejs/node/blob/master/lib/module.js
  18. // $FlowFixMe
  19. var pathResolvers = [];
  20. // keep original Module._resolveFilename
  21. var originalResolveFilename = _module2.default._resolveFilename;
  22. // override Module._resolveFilename
  23. _module2.default._resolveFilename = function _resolveFilename() {
  24. for (var _len = arguments.length, parameters = Array(_len), _key = 0; _key < _len; _key++) {
  25. parameters[_key] = arguments[_key];
  26. }
  27. var parent = parameters[1];
  28. // store require() caller (the module in which this require() call originated)
  29. requireCaller = parent;
  30. return originalResolveFilename.apply(this, parameters);
  31. };
  32. // keep original Module._findPath
  33. var originalFindPath = _module2.default._findPath;
  34. // override Module._findPath
  35. _module2.default._findPath = function _findPath() {
  36. for (var _len2 = arguments.length, parameters = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  37. parameters[_key2] = arguments[_key2];
  38. }
  39. var request = parameters[0];
  40. // try to resolve the path with custom resolvers
  41. var _iteratorNormalCompletion = true;
  42. var _didIteratorError = false;
  43. var _iteratorError = undefined;
  44. try {
  45. for (var _iterator = (0, _getIterator3.default)(pathResolvers), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
  46. var resolve = _step.value;
  47. var resolved = resolve(request, requireCaller);
  48. if (typeof resolved !== 'undefined') {
  49. return resolved;
  50. }
  51. }
  52. // and when none found try to resolve path with original resolver
  53. } catch (err) {
  54. _didIteratorError = true;
  55. _iteratorError = err;
  56. } finally {
  57. try {
  58. if (!_iteratorNormalCompletion && _iterator.return) {
  59. _iterator.return();
  60. }
  61. } finally {
  62. if (_didIteratorError) {
  63. throw _iteratorError;
  64. }
  65. }
  66. }
  67. var filename = originalFindPath.apply(this, parameters);
  68. if (filename !== false) {
  69. return filename;
  70. }
  71. return false;
  72. };
  73. function registerRequireHook(dotExt, resolve) {
  74. // cache source code after resolving to avoid another access to the fs
  75. var sourceCache = {};
  76. // store all files that were affected by this hook
  77. var affectedFiles = {};
  78. var resolvePath = function resolvePath(path, parent) {
  79. // get CommonJS module source code for this require() call
  80. var _resolve = resolve(path, parent),
  81. resolvedPath = _resolve.path,
  82. source = _resolve.source;
  83. // if no CommonJS module source code returned - skip this require() hook
  84. if (resolvedPath == null) {
  85. return undefined;
  86. }
  87. // flush require() cache
  88. delete require.cache[resolvedPath];
  89. // put the CommonJS module source code into the hash
  90. sourceCache[resolvedPath] = source;
  91. // return the path to be require()d in order to get the CommonJS module source code
  92. return resolvedPath;
  93. };
  94. var resolveSource = function resolveSource(path) {
  95. var source = sourceCache[path];
  96. delete sourceCache[path];
  97. return source;
  98. };
  99. pathResolvers.push(resolvePath);
  100. // keep original extension loader
  101. var originalLoader = _module2.default._extensions[dotExt];
  102. // override extension loader
  103. _module2.default._extensions[dotExt] = function (module, filename) {
  104. var source = resolveSource(filename);
  105. if (typeof source === 'undefined') {
  106. // load the file with the original loader
  107. (originalLoader || _module2.default._extensions['.js'])(module, filename);
  108. return;
  109. }
  110. affectedFiles[filename] = true;
  111. // compile javascript module from its source
  112. module._compile(source, filename);
  113. };
  114. return function unmout() {
  115. pathResolvers = pathResolvers.filter(function (r) {
  116. return r !== resolvePath;
  117. });
  118. _module2.default._extensions[dotExt] = originalLoader;
  119. (0, _keys2.default)(affectedFiles).forEach(function (path) {
  120. delete require.cache[path];
  121. delete sourceCache[path];
  122. delete affectedFiles[path];
  123. });
  124. };
  125. }