-
-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy patheslint-compat.js
116 lines (106 loc) · 3.59 KB
/
eslint-compat.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
"use strict"
/**
* @typedef {import('eslint')} eslint
*/
/** @param {eslint} eslint */
module.exports = function compat(eslint) {
return {
ESLint: eslint.ESLint || getESLintClassForV6(eslint),
RuleTester: eslint.RuleTester,
Linter: eslint.Linter,
}
}
/** @returns {typeof eslint.ESLint} */
function getESLintClassForV6(eslint) {
class ESLintForV6 {
static get version() {
return eslint.CLIEngine.version
}
/** @param {eslint.ESLint.Options} options */
constructor(options) {
const {
overrideConfig: {
plugins,
globals,
rules,
env,
...overrideConfig
} = {
plugins: [],
globals: {},
rules: {},
},
overrideConfigFile,
fix,
reportUnusedDisableDirectives,
plugins: pluginsMap,
...otherOptions
} = options || {}
/** @type {eslint.CLIEngine.Options} */
const newOptions = {
fix: Boolean(fix),
reportUnusedDisableDirectives: reportUnusedDisableDirectives
? reportUnusedDisableDirectives !== "off"
: undefined,
configFile: overrideConfigFile,
...otherOptions,
envs: Object.entries(env)
.filter(([, v]) => v)
.map(([k]) => k),
globals: globals
? Object.keys(globals).filter((n) => globals[n])
: undefined,
plugins: plugins || [],
rules: rules
? Object.entries(rules).reduce(
(o, [ruleId, opt]) => {
if (opt) {
o[ruleId] = opt
}
return o
},
/** @type {NonNullable<eslint.CLIEngine.Options["rules"]>} */ {},
)
: undefined,
...overrideConfig,
}
this.engine = new eslint.CLIEngine(newOptions)
for (const [name, plugin] of Object.entries(pluginsMap || {})) {
this.engine.addPlugin(name, plugin)
}
}
/**
* @param {Parameters<eslint.ESLint['lintText']>} params
* @returns {ReturnType<eslint.ESLint['lintText']>}
*/
async lintText(...params) {
const result = this.engine.executeOnText(
params[0],
params[1].filePath,
)
return result.results
}
/**
* @param {Parameters<eslint.ESLint['lintFiles']>} params
* @returns {ReturnType<eslint.ESLint['lintFiles']>}
*/
async lintFiles(...params) {
const result = this.engine.executeOnFiles(
Array.isArray(params[0]) ? params[0] : [params[0]],
)
return result.results
}
/**
* @param {Parameters<eslint.ESLint['outputFixes']>} params
* @returns {ReturnType<eslint.ESLint['outputFixes']>}
*/
static async outputFixes(...params) {
return eslint.CLIEngine.outputFixes({
results: params[0],
})
}
}
/** @type {typeof eslint.ESLint} */
const eslintClass = /** @type {any} */ ESLintForV6
return eslintClass
}