1 | const ChainedMap = require('./ChainedMap');
|
2 | const ChainedSet = require('./ChainedSet');
|
3 | const Plugin = require('./Plugin');
|
4 |
|
5 | module.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 | };
|