| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | /** * @author Toru Nagashima <https://github.com/mysticatea> * See LICENSE file in root directory for full license. */"use strict"const { RegExpValidator } = require("regexpp")const { getRegExpCalls } = require("../utils")/** * Verify a given regular expression. * @param {RuleContext} context The rule context to report. * @param {Node} node The AST node to report. * @param {string} pattern The pattern part of a RegExp. * @param {string} flags The flags part of a RegExp. * @returns {void} */function verify(context, node, pattern, flags) {    try {        let found = false        new RegExpValidator({            onCapturingGroupEnter(_start, name) {                if (name) {                    found = true                }            },            onBackreference(_start, _end, ref) {                if (typeof ref === "string") {                    found = true                }            },        }).validatePattern(pattern, 0, pattern.length, flags.includes("u"))        if (found) {            context.report({ node, messageId: "forbidden" })        }    } catch (error) {        //istanbul ignore else        if (error.message.startsWith("Invalid regular expression:")) {            return        }        //istanbul ignore next        throw error    }}module.exports = {    meta: {        docs: {            description: "disallow RegExp named capture groups.",            category: "ES2018",            recommended: false,            url:                "http://mysticatea.github.io/eslint-plugin-es/rules/no-regexp-named-capture-groups.html",        },        fixable: null,        schema: [],        messages: {            forbidden: "ES2018 RegExp named capture groups are forbidden.",        },    },    create(context) {        return {            "Literal[regex]"(node) {                const { pattern, flags } = node.regex                verify(context, node, pattern || "", flags || "")            },            "Program:exit"() {                const scope = context.getScope()                for (const { node, pattern, flags } of getRegExpCalls(scope)) {                    verify(context, node, pattern || "", flags || "")                }            },        }    },}
 |