blob: a09b655950f2d1c74e72d3f5727c8e9db0652724 [file] [log] [blame]
"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