blob: 577ae6cf8271d114f6b005bd5692e62ea1544864 [file] [log] [blame]
Yang Guo4fd355c2019-09-19 10:59:03 +02001/**
2 * @fileoverview Rule to enforce the use of `u` flag on RegExp.
3 * @author Toru Nagashima
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Requirements
10//------------------------------------------------------------------------------
11
12const {
13 CALL,
14 CONSTRUCT,
15 ReferenceTracker,
16 getStringIfConstant
17} = require("eslint-utils");
18
19//------------------------------------------------------------------------------
20// Rule Definition
21//------------------------------------------------------------------------------
22
Tim van der Lippe0ceb4652022-01-06 14:23:36 +010023/** @type {import('../shared/types').Rule} */
Yang Guo4fd355c2019-09-19 10:59:03 +020024module.exports = {
25 meta: {
26 type: "suggestion",
27
28 docs: {
29 description: "enforce the use of `u` flag on RegExp",
Yang Guo4fd355c2019-09-19 10:59:03 +020030 recommended: false,
31 url: "https://eslint.org/docs/rules/require-unicode-regexp"
32 },
33
34 messages: {
35 requireUFlag: "Use the 'u' flag."
36 },
37
38 schema: []
39 },
40
41 create(context) {
42 return {
43 "Literal[regex]"(node) {
44 const flags = node.regex.flags || "";
45
46 if (!flags.includes("u")) {
47 context.report({ node, messageId: "requireUFlag" });
48 }
49 },
50
51 Program() {
52 const scope = context.getScope();
53 const tracker = new ReferenceTracker(scope);
54 const trackMap = {
55 RegExp: { [CALL]: true, [CONSTRUCT]: true }
56 };
57
58 for (const { node } of tracker.iterateGlobalReferences(trackMap)) {
59 const flagsNode = node.arguments[1];
60 const flags = getStringIfConstant(flagsNode, scope);
61
62 if (!flagsNode || (typeof flags === "string" && !flags.includes("u"))) {
63 context.report({ node, messageId: "requireUFlag" });
64 }
65 }
66 }
67 };
68 }
69};