UNPKG

2.61 kBJavaScriptView Raw
1/**
2 * @fileoverview Defines a storage for rules.
3 * @author Nicholas C. Zakas
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Requirements
10//------------------------------------------------------------------------------
11
12const loadRules = require("./load-rules");
13
14//------------------------------------------------------------------------------
15// Public Interface
16//------------------------------------------------------------------------------
17
18class 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
95module.exports = Rules;