1 | const ChainedMap = require('./ChainedMap');
|
2 | const Rule = require('./Rule');
|
3 |
|
4 | module.exports = class extends ChainedMap {
|
5 | constructor(parent) {
|
6 | super(parent);
|
7 | this.rules = new ChainedMap(this);
|
8 | this.defaultRules = new ChainedMap(this);
|
9 | this.extend(['noParse']);
|
10 | }
|
11 |
|
12 | defaultRule(name) {
|
13 | return this.defaultRules.getOrCompute(name, () => new Rule(this, name));
|
14 | }
|
15 |
|
16 | rule(name) {
|
17 | return this.rules.getOrCompute(name, () => new Rule(this, name));
|
18 | }
|
19 |
|
20 | toConfig() {
|
21 | return this.clean(
|
22 | Object.assign(this.entries() || {}, {
|
23 | defaultRules: this.defaultRules.values().map(r => r.toConfig()),
|
24 | rules: this.rules.values().map(r => r.toConfig()),
|
25 | })
|
26 | );
|
27 | }
|
28 |
|
29 | merge(obj, omit = []) {
|
30 | if (!omit.includes('rule') && 'rule' in obj) {
|
31 | Object.keys(obj.rule).forEach(name =>
|
32 | this.rule(name).merge(obj.rule[name])
|
33 | );
|
34 | }
|
35 |
|
36 | if (!omit.includes('defaultRule') && 'defaultRule' in obj) {
|
37 | Object.keys(obj.defaultRule).forEach(name =>
|
38 | this.defaultRule(name).merge(obj.defaultRule[name])
|
39 | );
|
40 | }
|
41 |
|
42 | return super.merge(obj, ['rule', 'defaultRule']);
|
43 | }
|
44 | };
|