diff options
author | cjihrig <cjihrig@gmail.com> | 2019-03-01 21:47:17 -0500 |
---|---|---|
committer | cjihrig <cjihrig@gmail.com> | 2019-03-03 22:04:24 -0500 |
commit | 17b7fa75c345ec2ef59c489a33aa14f346d60dc5 (patch) | |
tree | d16f47fc4bdafa0db5a450b44e65a64dbbc3756c /tools/node_modules/eslint/lib/rules/prefer-named-capture-group.js | |
parent | 8c597df3502c26fba74c966168376c818b61b73b (diff) | |
download | android-node-v8-17b7fa75c345ec2ef59c489a33aa14f346d60dc5.tar.gz android-node-v8-17b7fa75c345ec2ef59c489a33aa14f346d60dc5.tar.bz2 android-node-v8-17b7fa75c345ec2ef59c489a33aa14f346d60dc5.zip |
tools: update ESLint to 5.15.0
Update ESLint to 5.15.0
PR-URL: https://github.com/nodejs/node/pull/26391
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Masashi Hirano <shisama07@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Diffstat (limited to 'tools/node_modules/eslint/lib/rules/prefer-named-capture-group.js')
-rw-r--r-- | tools/node_modules/eslint/lib/rules/prefer-named-capture-group.js | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/tools/node_modules/eslint/lib/rules/prefer-named-capture-group.js b/tools/node_modules/eslint/lib/rules/prefer-named-capture-group.js new file mode 100644 index 0000000000..07e69f022c --- /dev/null +++ b/tools/node_modules/eslint/lib/rules/prefer-named-capture-group.js @@ -0,0 +1,123 @@ +/** + * @fileoverview Rule to enforce requiring named capture groups in regular expression. + * @author Pig Fang <https://github.com/g-plane> + */ + +"use strict"; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const { + CALL, + CONSTRUCT, + ReferenceTracker, + getStringIfConstant +} = require("eslint-utils"); +const regexpp = require("regexpp"); + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +const parser = new regexpp.RegExpParser(); + +//------------------------------------------------------------------------------ +// Rule Definition +//------------------------------------------------------------------------------ + +module.exports = { + meta: { + type: "suggestion", + + docs: { + description: "enforce using named capture group in regular expression", + category: "Best Practices", + recommended: false, + url: "https://eslint.org/docs/rules/prefer-named-capture-group" + }, + + schema: [], + + messages: { + required: "Capture group '{{group}}' should be converted to a named or non-capturing group." + } + }, + + create(context) { + + /** + * Function to check regular expression. + * + * @param {string} regex The regular expression to be check. + * @param {ASTNode} node AST node which contains regular expression. + * @param {boolean} uFlag Flag indicates whether unicode mode is enabled or not. + * @returns {void} + */ + function checkRegex(regex, node, uFlag) { + let ast; + + try { + ast = parser.parsePattern(regex, 0, regex.length, uFlag); + } catch (_) { + + // ignore regex syntax errors + return; + } + + regexpp.visitRegExpAST(ast, { + onCapturingGroupEnter(group) { + if (!group.name) { + const locNode = node.type === "Literal" ? node : node.arguments[0]; + + context.report({ + node, + messageId: "required", + loc: { + start: { + line: locNode.loc.start.line, + column: locNode.loc.start.column + group.start + 1 + }, + end: { + line: locNode.loc.start.line, + column: locNode.loc.start.column + group.end + 1 + } + }, + data: { + group: group.raw + } + }); + } + } + }); + } + + return { + Literal(node) { + if (node.regex) { + checkRegex(node.regex.pattern, node, node.regex.flags.includes("u")); + } + }, + Program() { + const scope = context.getScope(); + const tracker = new ReferenceTracker(scope); + const traceMap = { + RegExp: { + [CALL]: true, + [CONSTRUCT]: true + } + }; + + for (const { node } of tracker.iterateGlobalReferences(traceMap)) { + const regex = getStringIfConstant(node.arguments[0]); + const flags = getStringIfConstant(node.arguments[1]); + + if (regex) { + checkRegex(regex, node, flags && flags.includes("u")); + } + } + } + }; + } +}; |