Resolve.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. const ChainedMap = require('./ChainedMap');
  2. const ChainedSet = require('./ChainedSet');
  3. const Plugin = require('./Plugin');
  4. module.exports = class extends ChainedMap {
  5. constructor(parent) {
  6. super(parent);
  7. this.alias = new ChainedMap(this);
  8. this.aliasFields = new ChainedSet(this);
  9. this.descriptionFiles = new ChainedSet(this);
  10. this.extensions = new ChainedSet(this);
  11. this.mainFields = new ChainedSet(this);
  12. this.mainFiles = new ChainedSet(this);
  13. this.modules = new ChainedSet(this);
  14. this.plugins = new ChainedMap(this);
  15. this.extend([
  16. 'cachePredicate',
  17. 'cacheWithContext',
  18. 'concord',
  19. 'enforceExtension',
  20. 'enforceModuleExtension',
  21. 'symlinks',
  22. 'unsafeCache',
  23. ]);
  24. }
  25. plugin(name) {
  26. return this.plugins.getOrCompute(
  27. name,
  28. () => new Plugin(this, name, 'resolve.plugin'),
  29. );
  30. }
  31. toConfig() {
  32. return this.clean(
  33. Object.assign(this.entries() || {}, {
  34. alias: this.alias.entries(),
  35. aliasFields: this.aliasFields.values(),
  36. descriptionFiles: this.descriptionFiles.values(),
  37. extensions: this.extensions.values(),
  38. mainFields: this.mainFields.values(),
  39. mainFiles: this.mainFiles.values(),
  40. modules: this.modules.values(),
  41. plugins: this.plugins.values().map((plugin) => plugin.toConfig()),
  42. }),
  43. );
  44. }
  45. merge(obj, omit = []) {
  46. const omissions = [
  47. 'alias',
  48. 'aliasFields',
  49. 'descriptionFiles',
  50. 'extensions',
  51. 'mainFields',
  52. 'mainFiles',
  53. 'modules',
  54. ];
  55. if (!omit.includes('plugin') && 'plugin' in obj) {
  56. Object.keys(obj.plugin).forEach((name) =>
  57. this.plugin(name).merge(obj.plugin[name]),
  58. );
  59. }
  60. omissions.forEach((key) => {
  61. if (!omit.includes(key) && key in obj) {
  62. this[key].merge(obj[key]);
  63. }
  64. });
  65. return super.merge(obj, [...omit, ...omissions, 'plugin']);
  66. }
  67. };