Resolve.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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(name, () => new Plugin(this, name));
  27. }
  28. toConfig() {
  29. return this.clean(
  30. Object.assign(this.entries() || {}, {
  31. alias: this.alias.entries(),
  32. aliasFields: this.aliasFields.values(),
  33. descriptionFiles: this.descriptionFiles.values(),
  34. extensions: this.extensions.values(),
  35. mainFields: this.mainFields.values(),
  36. mainFiles: this.mainFiles.values(),
  37. modules: this.modules.values(),
  38. plugins: this.plugins.values().map(plugin => plugin.toConfig()),
  39. })
  40. );
  41. }
  42. merge(obj, omit = []) {
  43. const omissions = [
  44. 'alias',
  45. 'aliasFields',
  46. 'descriptionFiles',
  47. 'extensions',
  48. 'mainFields',
  49. 'mainFiles',
  50. 'modules',
  51. ];
  52. if (!omit.includes('plugin') && 'plugin' in obj) {
  53. Object.keys(obj.plugin).forEach(name =>
  54. this.plugin(name).merge(obj.plugin[name])
  55. );
  56. }
  57. omissions.forEach(key => {
  58. if (!omit.includes(key) && key in obj) {
  59. this[key].merge(obj[key]);
  60. }
  61. });
  62. return super.merge(obj, [...omit, ...omissions, 'plugin']);
  63. }
  64. };