UNPKG

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