/
index.js
52 lines (48 loc) · 1.52 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"use strict";
function createRegExpLiteral(args, prettify, t) {
const evaluatedArgs = args.map((a) => a.evaluate());
if (!evaluatedArgs.every((a) => a.confident && typeof a.value === "string")) {
return;
}
let pattern = (evaluatedArgs.length >= 1 &&
evaluatedArgs[0].value !== "") ?
evaluatedArgs[0].value :
"(?:)";
const flags = evaluatedArgs.length >= 2 ?
evaluatedArgs[1].value :
"";
pattern = new RegExp(pattern).source;
if (prettify) {
pattern = pattern.replace(/\n/g, "\\n")
.replace(/\u2028/g, "\\u2028")
.replace(/\u2029/g, "\\u2029")
.replace(/[\b]/g, "[\\b]")
.replace(/\v/g, "\\v")
.replace(/\f/g, "\\f")
.replace(/\r/g, "\\r");
}
return t.regExpLiteral(pattern, flags);
}
function maybeReplaceWithRegExpLiteral(path, t) {
if (!t.isIdentifier(path.node.callee, {name: "RegExp"})) {
return;
}
const regExpLiteral = createRegExpLiteral(path.get("arguments"), true, t);
if (regExpLiteral) {
path.replaceWith(regExpLiteral);
}
}
module.exports = function({ types: t }) {
return {
name: "transform-regexp-constructors",
visitor: {
NewExpression(path) {
maybeReplaceWithRegExpLiteral(path, t);
},
CallExpression(path) {
// equivalent to `new RegExp()` according to §21.2.3
maybeReplaceWithRegExpLiteral(path, t);
},
},
};
};