forked from BrainMaestro/eslint-plugin-optimize-regex
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoptimize-regex.js
112 lines (97 loc) · 2.42 KB
/
optimize-regex.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
/**
* @fileoverview Optimize regex literals
* @author Ezinwa Okpoechi <[email protected]>
*/
'use strict'
const { parse, generate, optimize } = require('regexp-tree')
const optimizerTransforms = require('regexp-tree/dist/optimizer/transforms/index.js')
const transforms = [...optimizerTransforms.keys()]
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
module.exports = {
meta: {
docs: {
description: 'Optimize regex literals',
category: 'Possible Improvements',
recommended: true,
},
fixable: 'code',
schema: [
{
additionalProperties: false,
type: 'object',
properties: {
whitelist: {
type: 'array',
items: {
type: 'string',
enum: transforms
}
},
blacklist: {
type: 'array',
items: {
type: 'string',
enum: transforms
}
}
}
}
],
},
create (context) {
const options = context.options[0] || {}
/**
* Optimize regular expression literals
*
* @param {ASTNode} node node to validate
* @returns {void}
* @private
*/
function optimizeRegexLiteral(node) {
const { raw /* , start */ } = node
let parsedSource
try {
parsedSource = parse(raw)
} catch (e) {
// istanbul ignore next
context.report({
node,
message: "{{original}} can't be parsed: {{message}}",
data: {
original: raw,
message: e.message,
},
})
// istanbul ignore next
return
}
const originalRegex = generate(parsedSource).toString()
const optimizedRegex = optimize(
raw,
options.whitelist,
{
blacklist: options.blacklist
}
).toString()
if (originalRegex === optimizedRegex) {
return
}
context.report({
node,
message: '{{original}} can be optimized to {{optimized}}',
data: {
original: raw,
optimized: optimizedRegex,
},
fix(fixer) {
return fixer.replaceText(node, optimizedRegex)
},
})
}
return {
'Literal[regex]': optimizeRegexLiteral,
}
},
}