0ecffdfa146d1f15c917d6aedf96327f309265d68f206c866afed6be0c1cb3368b48a947695ca87e86f3c3aabbac9f30a8ef8f311e7957fae87e79e584bf84 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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', 'strictExportPresence']);
  9. }
  10. defaultRule(name) {
  11. return this.defaultRules.getOrCompute(
  12. name,
  13. () => new Rule(this, name, 'defaultRule'),
  14. );
  15. }
  16. rule(name) {
  17. return this.rules.getOrCompute(name, () => new Rule(this, name, 'rule'));
  18. }
  19. toConfig() {
  20. return this.clean(
  21. Object.assign(this.entries() || {}, {
  22. defaultRules: this.defaultRules.values().map((r) => r.toConfig()),
  23. rules: this.rules.values().map((r) => r.toConfig()),
  24. }),
  25. );
  26. }
  27. merge(obj, omit = []) {
  28. if (!omit.includes('rule') && 'rule' in obj) {
  29. Object.keys(obj.rule).forEach((name) =>
  30. this.rule(name).merge(obj.rule[name]),
  31. );
  32. }
  33. if (!omit.includes('defaultRule') && 'defaultRule' in obj) {
  34. Object.keys(obj.defaultRule).forEach((name) =>
  35. this.defaultRule(name).merge(obj.defaultRule[name]),
  36. );
  37. }
  38. return super.merge(obj, ['rule', 'defaultRule']);
  39. }
  40. };