| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | /** * @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//------------------------------------------------------------------------------/** * 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 {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;
 |