Skip to content

Commit db41877

Browse files
fiskersindresorhus
authored andcommitted
Update regex-shorthand (#454)
1 parent b498100 commit db41877

File tree

2 files changed

+35
-35
lines changed

2 files changed

+35
-35
lines changed

rules/regex-shorthand.js

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
const cleanRegexp = require('clean-regexp');
3-
const {generate, optimize, parse} = require('regexp-tree');
3+
const {optimize} = require('regexp-tree');
44
const getDocumentationUrl = require('./utils/get-documentation-url');
55
const quoteString = require('./utils/quote-string');
66

@@ -9,45 +9,32 @@ const message = 'Use regex shorthands to improve readability.';
99
const create = context => {
1010
return {
1111
'Literal[regex]': node => {
12-
const {type, value} = context.getSourceCode().getFirstToken(node);
12+
const {raw: original, regex} = node;
1313

14-
if (type !== 'RegularExpression') {
14+
// Regular Expressions with `u` flag are not well handled by `regexp-tree`
15+
// https://github.com/DmitrySoshnikov/regexp-tree/issues/162
16+
if (regex.flags.includes('u')) {
1517
return;
1618
}
1719

18-
let parsedSource;
19-
try {
20-
parsedSource = parse(value);
21-
} catch (error) {
22-
context.report({
23-
node,
24-
message: '{{original}} can\'t be parsed: {{message}}',
25-
data: {
26-
original: value,
27-
message: error.message
28-
}
29-
});
20+
let optimized = original;
3021

31-
return;
32-
}
33-
34-
const originalRegex = generate(parsedSource).toString();
35-
const optimizedRegex = optimize(value).toString();
22+
try {
23+
optimized = optimize(original).toString();
24+
} catch (_) {}
3625

37-
if (originalRegex === optimizedRegex) {
26+
if (original === optimized) {
3827
return;
3928
}
4029

4130
context.report({
4231
node,
4332
message: '{{original}} can be optimized to {{optimized}}',
4433
data: {
45-
original: value,
46-
optimized: optimizedRegex
34+
original,
35+
optimized
4736
},
48-
fix(fixer) {
49-
return fixer.replaceText(node, optimizedRegex);
50-
}
37+
fix: fixer => fixer.replaceText(node, optimized)
5138
});
5239
},
5340
'NewExpression[callee.name="RegExp"]': node => {

test/regex-shorthand.js

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@ import avaRuleTester from 'eslint-ava-rule-tester';
33
import rule from '../rules/regex-shorthand';
44

55
const ruleTester = avaRuleTester(test, {
6-
env: {
7-
es6: true
8-
},
96
parserOptions: {
10-
sourceType: 'module'
7+
ecmaVersion: 2020
118
}
129
});
1310

@@ -20,20 +17,36 @@ ruleTester.run('regex-shorthand', rule, {
2017
valid: [
2118
'const foo = /\\d/',
2219
'const foo = /\\W/i',
23-
'const foo = /\\w/ig',
24-
'const foo = /[a-z]/ig',
25-
'const foo = /\\d*?/ig',
20+
'const foo = /\\w/gi',
21+
'const foo = /[a-z]/gi',
22+
'const foo = /\\d*?/gi',
2623
'const foo = new RegExp(\'\\d\')',
2724
'const foo = new RegExp(\'\\d\', \'ig\')',
2825
'const foo = new RegExp(\'\\d*?\')',
2926
'const foo = new RegExp(\'[a-z]\', \'i\')',
3027
'const foo = new RegExp(/\\d/)',
31-
'const foo = new RegExp(/\\d/ig)',
28+
'const foo = new RegExp(/\\d/gi)',
3229
'const foo = new RegExp(/\\d/, \'ig\')',
3330
'const foo = new RegExp(/\\d*?/)',
34-
'const foo = new RegExp(/[a-z]/, \'i\')'
31+
'const foo = new RegExp(/[a-z]/, \'i\')',
32+
33+
// Should not crash ESLint (#446 and #448)
34+
'/\\{\\{verificationUrl\\}\\}/gu',
35+
'/^test-(?<name>[a-zA-Z-\\d]+)$/u',
36+
37+
// Should not suggest wrong regex (#447)
38+
'/(\\s|\\.|@|_|-)/u',
39+
'/[\\s.@_-]/u'
3540
],
3641
invalid: [
42+
{
43+
code: 'const foo = /\\w/ig',
44+
errors: [{
45+
...error,
46+
message: '/\\w/ig can be optimized to /\\w/gi'
47+
}],
48+
output: 'const foo = /\\w/gi'
49+
},
3750
{
3851
code: 'const foo = /[0-9]/',
3952
errors: [{

0 commit comments

Comments
 (0)