1 | /**
|
2 | * @fileoverview Defines a storage for rules.
|
3 | * @author Nicholas C. Zakas
|
4 | */
|
5 |
|
6 | ;
|
7 |
|
8 | //------------------------------------------------------------------------------
|
9 | // Requirements
|
10 | //------------------------------------------------------------------------------
|
11 |
|
12 | const loadRules = require("./load-rules");
|
13 |
|
14 | //------------------------------------------------------------------------------
|
15 | // Public Interface
|
16 | //------------------------------------------------------------------------------
|
17 |
|
18 | class Rules {
|
19 | constructor() {
|
20 | this._rules = Object.create(null);
|
21 |
|
22 | this.load();
|
23 | }
|
24 |
|
25 | /**
|
26 | * Registers a rule module for rule id in storage.
|
27 | * @param {string} ruleId Rule id (file name).
|
28 | * @param {Function} ruleModule Rule handler.
|
29 | * @returns {void}
|
30 | */
|
31 | define(ruleId, ruleModule) {
|
32 | this._rules[ruleId] = ruleModule;
|
33 | }
|
34 |
|
35 | /**
|
36 | * Loads and registers all rules from passed rules directory.
|
37 | * @param {string} [rulesDir] Path to rules directory, may be relative. Defaults to `lib/rules`.
|
38 | * @param {string} cwd Current working directory
|
39 | * @returns {void}
|
40 | */
|
41 | load(rulesDir, cwd) {
|
42 | const newRules = loadRules(rulesDir, cwd);
|
43 |
|
44 | Object.keys(newRules).forEach(ruleId => {
|
45 | this.define(ruleId, newRules[ruleId]);
|
46 | });
|
47 | }
|
48 |
|
49 | /**
|
50 | * Registers all given rules of a plugin.
|
51 | * @param {Object} plugin The plugin object to import.
|
52 | * @param {string} pluginName The name of the plugin without prefix (`eslint-plugin-`).
|
53 | * @returns {void}
|
54 | */
|
55 | importPlugin(plugin, pluginName) {
|
56 | if (plugin.rules) {
|
57 | Object.keys(plugin.rules).forEach(ruleId => {
|
58 | const qualifiedRuleId = `${pluginName}/${ruleId}`,
|
59 | rule = plugin.rules[ruleId];
|
60 |
|
61 | this.define(qualifiedRuleId, rule);
|
62 | });
|
63 | }
|
64 | }
|
65 |
|
66 | /**
|
67 | * Access rule handler by id (file name).
|
68 | * @param {string} ruleId Rule id (file name).
|
69 | * @returns {Function} Rule handler.
|
70 | */
|
71 | get(ruleId) {
|
72 | if (typeof this._rules[ruleId] === "string") {
|
73 | return require(this._rules[ruleId]);
|
74 | }
|
75 | return this._rules[ruleId];
|
76 |
|
77 | }
|
78 |
|
79 | /**
|
80 | * Get an object with all currently loaded rules
|
81 | * @returns {Map} All loaded rules
|
82 | */
|
83 | getAllLoadedRules() {
|
84 | const allRules = new Map();
|
85 |
|
86 | Object.keys(this._rules).forEach(name => {
|
87 | const rule = this.get(name);
|
88 |
|
89 | allRules.set(name, rule);
|
90 | });
|
91 | return allRules;
|
92 | }
|
93 | }
|
94 |
|
95 | module.exports = Rules;
|