Module.js 1.1 KB

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