rules.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /**
  2. * @fileoverview Defines a storage for rules.
  3. * @author Nicholas C. Zakas
  4. * @author aladdin-add
  5. */
  6. "use strict";
  7. //------------------------------------------------------------------------------
  8. // Requirements
  9. //------------------------------------------------------------------------------
  10. const builtInRules = require("../rules");
  11. //------------------------------------------------------------------------------
  12. // Typedefs
  13. //------------------------------------------------------------------------------
  14. /** @typedef {import("../shared/types").Rule} Rule */
  15. //------------------------------------------------------------------------------
  16. // Public Interface
  17. //------------------------------------------------------------------------------
  18. /**
  19. * A storage for rules.
  20. */
  21. class Rules {
  22. constructor() {
  23. this._rules = Object.create(null);
  24. }
  25. /**
  26. * Registers a rule module for rule id in storage.
  27. * @param {string} ruleId Rule id (file name).
  28. * @param {Rule} rule Rule object.
  29. * @returns {void}
  30. */
  31. define(ruleId, rule) {
  32. this._rules[ruleId] = rule;
  33. }
  34. /**
  35. * Access rule handler by id (file name).
  36. * @param {string} ruleId Rule id (file name).
  37. * @returns {Rule} Rule object.
  38. */
  39. get(ruleId) {
  40. if (typeof this._rules[ruleId] === "string") {
  41. this.define(ruleId, require(this._rules[ruleId]));
  42. }
  43. if (this._rules[ruleId]) {
  44. return this._rules[ruleId];
  45. }
  46. if (builtInRules.has(ruleId)) {
  47. return builtInRules.get(ruleId);
  48. }
  49. return null;
  50. }
  51. *[Symbol.iterator]() {
  52. yield* builtInRules;
  53. for (const ruleId of Object.keys(this._rules)) {
  54. yield [ruleId, this.get(ruleId)];
  55. }
  56. }
  57. }
  58. module.exports = Rules;