Skip to content

Commit 851a060

Browse files
committed
Add plugin functionality
1 parent 10eec8c commit 851a060

File tree

4 files changed

+1084
-0
lines changed

4 files changed

+1084
-0
lines changed

lib/index.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* @fileoverview Optimize regex literals
3+
* @author Ezinwa Okpoechi
4+
*/
5+
"use strict";
6+
7+
//------------------------------------------------------------------------------
8+
// Requirements
9+
//------------------------------------------------------------------------------
10+
11+
var requireIndex = require("requireindex");
12+
13+
//------------------------------------------------------------------------------
14+
// Plugin Definition
15+
//------------------------------------------------------------------------------
16+
17+
// import all rules in lib/rules
18+
module.exports.rules = requireIndex(__dirname + "/rules");

lib/rules/optimize-regex.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* @fileoverview Optimize regex literals
3+
* @author Ezinwa Okpoechi
4+
*/
5+
6+
'use strict';
7+
8+
const { optimize } = require('regexp-tree');
9+
10+
//------------------------------------------------------------------------------
11+
// Rule Definition
12+
//------------------------------------------------------------------------------
13+
14+
module.exports = {
15+
meta: {
16+
docs: {
17+
description: 'Optimize regex literals',
18+
category: 'Fill me in',
19+
recommended: true,
20+
},
21+
fixable: 'code',
22+
schema: [],
23+
},
24+
25+
create: function(context) {
26+
const sourceCode = context.getSourceCode();
27+
28+
/**
29+
* Validate regular expression literals
30+
* @param {ASTNode} node node to validate
31+
* @returns {void}
32+
* @private
33+
*/
34+
35+
function checkLiteral(node) {
36+
const { type, value, start } = sourceCode.getFirstToken(node);
37+
38+
if (type !== 'RegularExpression') {
39+
return;
40+
}
41+
42+
const optimizedRegex = optimize(value).toRegExp();
43+
44+
if (value === optimizedRegex.toString()) {
45+
return;
46+
}
47+
48+
context.report({
49+
node,
50+
message: '{{original}} can be optimized to {{optimized}}',
51+
data: {
52+
original: value,
53+
optimized: optimizedRegex,
54+
},
55+
fix(fixer) {
56+
return fixer.replaceText(node, optimizedRegex.toString());
57+
},
58+
});
59+
}
60+
61+
return {
62+
Literal: checkLiteral,
63+
};
64+
},
65+
};

tests/lib/rules/optimize-regex.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* @fileoverview Optimize regex literals
3+
* @author Ezinwa Okpoechi
4+
*/
5+
6+
'use strict';
7+
8+
//------------------------------------------------------------------------------
9+
// Requirements
10+
//------------------------------------------------------------------------------
11+
12+
var rule = require('../../../lib/rules/optimize-regex'),
13+
RuleTester = require('eslint').RuleTester;
14+
15+
var ruleTester = new RuleTester();
16+
ruleTester.run('optimize-regex', rule, {
17+
valid: ['var foo = /foo/i'],
18+
19+
invalid: [
20+
{
21+
code: 'var re = /[a-zA-Z_0-9][A-Z_\\da-z]*\\e{1,}/',
22+
output: 'var re = /\\w+e+/',
23+
errors: [
24+
{
25+
message: '/[a-zA-Z_0-9][A-Z_\\da-z]*\\e{1,}/ can be optimized to /\\w+e+/',
26+
type: 'Literal',
27+
},
28+
],
29+
},
30+
],
31+
});

0 commit comments

Comments
 (0)