|
|
- /**
- * @fileoverview Rule to flag the use of empty character classes in regular expressions
- * @author Ian Christian Myers
- */
-
- "use strict";
-
- //------------------------------------------------------------------------------
- // Requirements
- //------------------------------------------------------------------------------
-
- const { RegExpParser, visitRegExpAST } = require("@eslint-community/regexpp");
-
- //------------------------------------------------------------------------------
- // Helpers
- //------------------------------------------------------------------------------
-
- const parser = new RegExpParser();
- const QUICK_TEST_REGEX = /\[\]/u;
-
- //------------------------------------------------------------------------------
- // Rule Definition
- //------------------------------------------------------------------------------
-
- /** @type {import('../shared/types').Rule} */
- module.exports = {
- meta: {
- type: "problem",
-
- docs: {
- description: "Disallow empty character classes in regular expressions",
- recommended: true,
- url: "https://eslint.org/docs/latest/rules/no-empty-character-class"
- },
-
- schema: [],
-
- messages: {
- unexpected: "Empty class."
- }
- },
-
- create(context) {
- return {
- "Literal[regex]"(node) {
- const { pattern, flags } = node.regex;
-
- if (!QUICK_TEST_REGEX.test(pattern)) {
- return;
- }
-
- let regExpAST;
-
- try {
- regExpAST = parser.parsePattern(pattern, 0, pattern.length, {
- unicode: flags.includes("u"),
- unicodeSets: flags.includes("v")
- });
- } catch {
-
- // Ignore regular expressions that regexpp cannot parse
- return;
- }
-
- visitRegExpAST(regExpAST, {
- onCharacterClassEnter(characterClass) {
- if (!characterClass.negate && characterClass.elements.length === 0) {
- context.report({ node, messageId: "unexpected" });
- }
- }
- });
- }
- };
-
- }
- };
|