81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @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;
 |