UNPKG

2.29 kBJavaScriptView Raw
1/**
2 * @fileoverview Defines a storage for rules.
3 * @author Nicholas C. Zakas
4 * @author aladdin-add
5 */
6
7"use strict";
8
9//------------------------------------------------------------------------------
10// Requirements
11//------------------------------------------------------------------------------
12
13const builtInRules = require("../rules");
14
15//------------------------------------------------------------------------------
16// Helpers
17//------------------------------------------------------------------------------
18
19/**
20 * Normalizes a rule module to the new-style API
21 * @param {(Function|{create: Function})} rule A rule object, which can either be a function
22 * ("old-style") or an object with a `create` method ("new-style")
23 * @returns {{create: Function}} A new-style rule.
24 */
25function normalizeRule(rule) {
26 return typeof rule === "function" ? Object.assign({ create: rule }, rule) : rule;
27}
28
29//------------------------------------------------------------------------------
30// Public Interface
31//------------------------------------------------------------------------------
32
33class Rules {
34 constructor() {
35 this._rules = Object.create(null);
36 }
37
38 /**
39 * Registers a rule module for rule id in storage.
40 * @param {string} ruleId Rule id (file name).
41 * @param {Function} ruleModule Rule handler.
42 * @returns {void}
43 */
44 define(ruleId, ruleModule) {
45 this._rules[ruleId] = normalizeRule(ruleModule);
46 }
47
48 /**
49 * Access rule handler by id (file name).
50 * @param {string} ruleId Rule id (file name).
51 * @returns {{create: Function, schema: JsonSchema[]}}
52 * A rule. This is normalized to always have the new-style shape with a `create` method.
53 */
54 get(ruleId) {
55 if (typeof this._rules[ruleId] === "string") {
56 this.define(ruleId, require(this._rules[ruleId]));
57 }
58 if (this._rules[ruleId]) {
59 return this._rules[ruleId];
60 }
61 if (builtInRules.has(ruleId)) {
62 return builtInRules.get(ruleId);
63 }
64
65 return null;
66 }
67
68 *[Symbol.iterator]() {
69 yield* builtInRules;
70
71 for (const ruleId of Object.keys(this._rules)) {
72 yield [ruleId, this.get(ruleId)];
73 }
74 }
75}
76
77module.exports = Rules;