| /** |
| * @fileoverview Defines a storage for rules. |
| * @author Nicholas C. Zakas |
| * @author aladdin-add |
| */ |
| |
| "use strict"; |
| |
| //------------------------------------------------------------------------------ |
| // Requirements |
| //------------------------------------------------------------------------------ |
| |
| const builtInRules = require("../rules"); |
| |
| //------------------------------------------------------------------------------ |
| // Helpers |
| //------------------------------------------------------------------------------ |
| |
| /** |
| * Normalizes a rule module to the new-style API |
| * @param {(Function|{create: Function})} rule A rule object, which can either be a function |
| * ("old-style") or an object with a `create` method ("new-style") |
| * @returns {{create: Function}} A new-style rule. |
| */ |
| function normalizeRule(rule) { |
| return typeof rule === "function" ? Object.assign({ create: rule }, rule) : rule; |
| } |
| |
| //------------------------------------------------------------------------------ |
| // Public Interface |
| //------------------------------------------------------------------------------ |
| |
| 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 {Function} ruleModule Rule handler. |
| * @returns {void} |
| */ |
| define(ruleId, ruleModule) { |
| this._rules[ruleId] = normalizeRule(ruleModule); |
| } |
| |
| /** |
| * Access rule handler by id (file name). |
| * @param {string} ruleId Rule id (file name). |
| * @returns {{create: Function, schema: JsonSchema[]}} |
| * A rule. This is normalized to always have the new-style shape with a `create` method. |
| */ |
| 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; |