You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.8 KiB
71 lines
1.8 KiB
/** |
|
* @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;
|
|
|