/** * @fileoverview Defines a storage for rules. * @author Nicholas C. Zakas * @author aladdin-add */ "use strict"; //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const builtInRules = require("../rules"); //------------------------------------------------------------------------------ // Typedefs //------------------------------------------------------------------------------ /** @typedef {import("../shared/types").Rule} Rule */ //------------------------------------------------------------------------------ // Public Interface //------------------------------------------------------------------------------ /** * A storage for rules. */ class Rules { constructor() { this._rules = Object.create(null); } /** * Registers a rule module for rule id in storage. * @param {string} ruleId Rule id (file name). * @param {Rule} rule Rule object. * @returns {void} */ define(ruleId, rule) { this._rules[ruleId] = rule; } /** * Access rule handler by id (file name). * @param {string} ruleId Rule id (file name). * @returns {Rule} Rule object. */ get(ruleId) { if (typeof this._rules[ruleId] === "string") { this.define(ruleId, require(this._rules[ruleId])); } if (this._rules[ruleId]) { return this._rules[ruleId]; } if (builtInRules.has(ruleId)) { return builtInRules.get(ruleId); } return null; } *[Symbol.iterator]() { yield* builtInRules; for (const ruleId of Object.keys(this._rules)) { yield [ruleId, this.get(ruleId)]; } } } module.exports = Rules;