summaryrefslogtreecommitdiff
path: root/tools/node_modules/eslint/lib/rules/prefer-named-capture-group.js
diff options
context:
space:
mode:
authorcjihrig <cjihrig@gmail.com>2019-03-01 21:47:17 -0500
committercjihrig <cjihrig@gmail.com>2019-03-03 22:04:24 -0500
commit17b7fa75c345ec2ef59c489a33aa14f346d60dc5 (patch)
treed16f47fc4bdafa0db5a450b44e65a64dbbc3756c /tools/node_modules/eslint/lib/rules/prefer-named-capture-group.js
parent8c597df3502c26fba74c966168376c818b61b73b (diff)
downloadandroid-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.js123
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"));
+ }
+ }
+ }
+ };
+ }
+};