Module.js 1.12 KB
Newer Older
liang ce committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
const ChainedMap = require('./ChainedMap');
const Rule = require('./Rule');

module.exports = class extends ChainedMap {
  constructor(parent) {
    super(parent);
    this.rules = new ChainedMap(this);
    this.defaultRules = new ChainedMap(this);
    this.extend(['noParse']);
  }

  defaultRule(name) {
    return this.defaultRules.getOrCompute(name, () => new Rule(this, name));
  }

  rule(name) {
    return this.rules.getOrCompute(name, () => new Rule(this, name));
  }

  toConfig() {
    return this.clean(
      Object.assign(this.entries() || {}, {
        defaultRules: this.defaultRules.values().map(r => r.toConfig()),
        rules: this.rules.values().map(r => r.toConfig()),
      })
    );
  }

  merge(obj, omit = []) {
    if (!omit.includes('rule') && 'rule' in obj) {
      Object.keys(obj.rule).forEach(name =>
        this.rule(name).merge(obj.rule[name])
      );
    }

    if (!omit.includes('defaultRule') && 'defaultRule' in obj) {
      Object.keys(obj.defaultRule).forEach(name =>
        this.defaultRule(name).merge(obj.defaultRule[name])
      );
    }

    return super.merge(obj, ['rule', 'defaultRule']);
  }
};