index.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. var Module = require('module');
  2. var fs = require('fs');
  3. var exists = fs.existsSync;
  4. var _require = Module.prototype.require;
  5. var SAVE_FILENAME =
  6. process.env.CACHE_REQUIRE_PATHS_FILE ?
  7. process.env.CACHE_REQUIRE_PATHS_FILE :
  8. './.cache-require-paths.json';
  9. var nameCache;
  10. try {
  11. nameCache = exists(SAVE_FILENAME) ? JSON.parse(fs.readFileSync(SAVE_FILENAME, 'utf-8')) : {};
  12. } catch (err) {
  13. nameCache = {};
  14. }
  15. var currentModuleCache;
  16. var pathToLoad;
  17. Module.prototype.require = function cachePathsRequire(name) {
  18. currentModuleCache = nameCache[this.filename];
  19. if (!currentModuleCache) {
  20. currentModuleCache = {};
  21. nameCache[this.filename] = currentModuleCache;
  22. }
  23. if (currentModuleCache[name] &&
  24. // Some people hack Object.prototype to insert their own properties on
  25. // every dictionary (for example, the 'should' testing framework). Check
  26. // that the key represents a path.
  27. typeof currentModuleCache[name] === 'string') {
  28. pathToLoad = currentModuleCache[name];
  29. } else {
  30. pathToLoad = Module._resolveFilename(name, this);
  31. currentModuleCache[name] = pathToLoad;
  32. }
  33. try {
  34. return _require.call(this, pathToLoad);
  35. } catch (err) {
  36. // Cache may be outdated; resolve and try again
  37. pathToLoad = Module._resolveFilename(name, this);
  38. currentModuleCache[name] = pathToLoad;
  39. return _require.call(this, pathToLoad);
  40. }
  41. };
  42. function printCache() {
  43. Object.keys(nameCache).forEach(function (fromFilename) {
  44. console.log(fromFilename);
  45. var moduleCache = nameCache[fromFilename];
  46. Object.keys(moduleCache).forEach(function (name) {
  47. console.log(' ', name, '->', moduleCache[name]);
  48. });
  49. });
  50. }
  51. process.once('exit', function () {
  52. try {
  53. fs.writeFileSync(SAVE_FILENAME,
  54. JSON.stringify(nameCache, null, 2), 'utf-8');
  55. } catch (err) {
  56. console.error('cache-require-paths: Failed saving cache: ' + err.toString());
  57. }
  58. });