prefer-regexp-exec.js
2.05 KB
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
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("../util");
exports.default = util_1.createRule({
name: 'prefer-regexp-exec',
defaultOptions: [],
meta: {
type: 'suggestion',
docs: {
description: 'Enforce that `RegExp#exec` is used instead of `String#match` if no global flag is provided',
category: 'Best Practices',
recommended: 'error',
requiresTypeChecking: true,
},
messages: {
regExpExecOverStringMatch: 'Use the `RegExp#exec()` method instead.',
},
schema: [],
},
create(context) {
const globalScope = context.getScope();
const service = util_1.getParserServices(context);
const typeChecker = service.program.getTypeChecker();
/**
* Check if a given node is a string.
* @param node The node to check.
*/
function isStringType(node) {
const objectType = typeChecker.getTypeAtLocation(service.esTreeNodeToTSNodeMap.get(node));
return util_1.getTypeName(typeChecker, objectType) === 'string';
}
return {
"CallExpression[arguments.length=1] > MemberExpression.callee[property.name='match'][computed=false]"(node) {
const callNode = node.parent;
const arg = callNode.arguments[0];
const evaluated = util_1.getStaticValue(arg, globalScope);
// Don't report regular expressions with global flag.
if (evaluated &&
evaluated.value instanceof RegExp &&
evaluated.value.flags.includes('g')) {
return;
}
if (isStringType(node.object)) {
context.report({
node: callNode,
messageId: 'regExpExecOverStringMatch',
});
return;
}
},
};
},
});
//# sourceMappingURL=prefer-regexp-exec.js.map