Skip to content

Commit 29bb3b7

Browse files
authored
Refactor to improve internal severity coercion
Closes GH-287. Reviewed-by: Titus Wormer <tituswormer@gmail.com> Reviewed-by: Christian Murphy <christian.murphy.42@gmail.com>
1 parent d1e24ff commit 29bb3b7

File tree

1 file changed

+25
-50
lines changed

1 file changed

+25
-50
lines changed

packages/unified-lint-rule/lib/index.js

Lines changed: 25 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919

2020
import {wrap} from 'trough'
2121

22-
const primitives = new Set(['string', 'number', 'boolean'])
23-
2422
/**
2523
* @param {string|RuleMeta} meta
2624
* @param {Rule} rule
@@ -80,54 +78,31 @@ export function lintRule(meta, rule) {
8078
* @returns {SeverityTuple}
8179
*/
8280
function coerce(name, config) {
81+
if (!Array.isArray(config)) return [1, config]
8382
/** @type {Array<unknown>} */
84-
let result
85-
86-
if (config === null || config === undefined) {
87-
result = [1]
88-
} else if (
89-
Array.isArray(config) &&
90-
// `isArray(unknown)` is turned into `Array<any>`:
91-
// type-coverage:ignore-next-line
92-
primitives.has(typeof config[0])
93-
) {
94-
// `isArray(unknown)` is turned into `Array<any>`:
95-
// type-coverage:ignore-next-line
96-
result = [...config]
97-
} else {
98-
result = [1, config]
99-
}
100-
101-
let level = result[0]
102-
103-
if (typeof level === 'boolean') {
104-
level = level ? 1 : 0
105-
} else if (typeof level === 'string') {
106-
if (level === 'off') {
107-
level = 0
108-
} else if (level === 'on' || level === 'warn') {
109-
level = 1
110-
} else if (level === 'error') {
111-
level = 2
112-
} else {
113-
level = 1
114-
result = [level, result]
115-
}
116-
}
117-
118-
if (typeof level !== 'number' || level < 0 || level > 2) {
119-
throw new Error(
120-
'Incorrect severity `' +
121-
level +
122-
'` for `' +
123-
name +
124-
'`, ' +
125-
'expected 0, 1, or 2'
126-
)
83+
const [severity, ...options] = config
84+
switch (severity) {
85+
case false:
86+
case 'off':
87+
case 0:
88+
return [0, ...options]
89+
case true:
90+
case 'on':
91+
case 'warn':
92+
case 1:
93+
return [1, ...options]
94+
case 'error':
95+
case 2:
96+
return [2, ...options]
97+
default:
98+
if (typeof severity !== 'number') return [1, config]
99+
throw new Error(
100+
'Incorrect severity `' +
101+
severity +
102+
'` for `' +
103+
name +
104+
'`, ' +
105+
'expected 0, 1, or 2'
106+
)
127107
}
128-
129-
result[0] = level
130-
131-
// @ts-expect-error: it’s now a valid tuple.
132-
return result
133108
}

0 commit comments

Comments
 (0)