-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
/
index.ts
34 lines (29 loc) 路 1.04 KB
/
index.ts
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
import { declare } from "@babel/helper-plugin-utils";
import syntaxJsonStrings from "@babel/plugin-syntax-json-strings";
import type * as t from "@babel/types";
import type { NodePath } from "@babel/traverse";
export default declare(api => {
api.assertVersion(7);
const regex = /(\\*)([\u2028\u2029])/g;
function replace(match: string, escapes: string, separator: string) {
// If there's an odd number, that means the separator itself was escaped.
// "\X" escapes X.
// "\\X" escapes the backslash, so X is unescaped.
const isEscaped = escapes.length % 2 === 1;
if (isEscaped) return match;
return `${escapes}\\u${separator.charCodeAt(0).toString(16)}`;
}
return {
name: "proposal-json-strings",
inherits: syntaxJsonStrings.default,
visitor: {
"DirectiveLiteral|StringLiteral"({
node,
}: NodePath<t.DirectiveLiteral | t.StringLiteral>) {
const { extra } = node;
if (!extra?.raw) return;
extra.raw = (extra.raw as string).replace(regex, replace);
},
},
};
});