UNPKG

1.98 kBJavaScriptView Raw
1/**
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
23module.exports = {
24 meta: {
25 type: "suggestion",
26
27 docs: {
28 description: "enforce the use of `u` flag on RegExp",
29 category: "Best Practices",
30 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};