forked from mysticatea/eslint-plugin
/
_rules.js
122 lines (111 loc) · 3.81 KB
/
_rules.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
* @author Toru Nagashima <https://github.com/mysticatea>
* See LICENSE file in root directory for full license.
*/
"use strict"
const { Linter } = require("eslint")
const {
Legacy: { ConfigArrayFactory, ConfigValidator },
} = require("@eslint/eslintrc")
const {
rules: PluginRulesIndex,
} = require("@eslint-community/eslint-plugin-mysticatea")
const { rules: removedRules } = require("./eslint-replacements.json")
const coreRules = new Linter().getRules()
const pluginRules = new Map(
Object.keys(PluginRulesIndex).map((key) => [
`@eslint-community/mysticatea/${key}`,
PluginRulesIndex[key],
])
)
const allRules = new Map([...coreRules, ...pluginRules])
const deprecatedRuleNames = new Set(
Array.from(allRules)
.filter(([, rule]) => rule && rule.meta && rule.meta.deprecated)
.map(([ruleId]) => ruleId)
)
const removedRuleNames = new Set(Object.keys(removedRules))
const configFactory = new ConfigArrayFactory()
const configValidator = new ConfigValidator()
module.exports = {
/**
* Validate the given config object.
* @param {any} config The config object to check.
* @param {string} source The filename of the configuration to show error messages.
* @returns {void}
*/
validateConfig(config, source) {
configValidator.validate(config, source, (ruleId) =>
allRules.get(ruleId)
)
/* istanbul ignore next */
for (const ruleId of [].concat(
Object.keys(config.rules || {}),
...(config.overrides || []).map((c) => Object.keys(c.rules || {}))
)) {
const rule = allRules.get(ruleId)
if (rule == null) {
throw new Error(`The '${ruleId}' rule does not exist.`)
}
if (deprecatedRuleNames.has(ruleId)) {
throw new Error(`The '${ruleId}' rule was deprecated.`)
}
if (removedRuleNames.has(ruleId)) {
throw new Error(`The '${ruleId}' rule was removed.`)
}
}
},
/**
* Get the rule definition of the given ID.
* @param {string} ruleId The rule ID to get.
* @returns {object} The rule definition.
*/
getRuleDefinition(ruleId) {
return allRules.get(ruleId)
},
/**
* Get the core rules.
* @returns {string[]} The core rule names.
*/
getCoreRuleNames() {
return Array.from(coreRules.keys()).filter(
(ruleId) =>
!deprecatedRuleNames.has(ruleId) &&
!removedRuleNames.has(ruleId)
)
},
/**
* Get the plugin rules.
* @param {"eslint-comments"|"node"|"ts"|"vue"} pluginName The plugin name to get.
* @returns {object} The core rules. Keys are rule IDs and values are each rule definition.
*/
getPluginRuleNames(pluginName) {
return Object.keys(PluginRulesIndex)
.filter((ruleId) =>
pluginName === "@eslint-community/mysticatea"
? !ruleId.includes("/")
: ruleId.startsWith(`${pluginName}/`)
)
.map((ruleId) => `@eslint-community/mysticatea/${ruleId}`)
.filter(
(ruleId) =>
!deprecatedRuleNames.has(ruleId) &&
!removedRuleNames.has(ruleId)
)
},
*iterateRulesOfConfig(config, name) {
const filePath = require.resolve(`../../../lib/configs/${name}`)
for (const element of configFactory.create(config, { filePath })) {
if (element.rules) {
yield* Object.entries(element.rules)
}
}
},
getRulesOfConfig(config, name) {
const rules = {}
for (const [key, value] of this.iterateRulesOfConfig(config, name)) {
rules[key] = value
}
return rules
},
}