.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / eslint / lib / linter / rules.js
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
13 const 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  */
25 function normalizeRule(rule) {
26     return typeof rule === "function" ? Object.assign({ create: rule }, rule) : rule;
27 }
28
29 //------------------------------------------------------------------------------
30 // Public Interface
31 //------------------------------------------------------------------------------
32
33 class 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
77 module.exports = Rules;