| "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 |