Subsume json (#7985)
* Add Subsume JSON transform https://github.com/tc39/proposal-json-superset is at stage 3. This allows U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR to appear unescaped inside strings and directives. * Move to Stage 3 * Break diretive parsing * Update README * Handle multi-escape sequences * Remove babylon files after rename
This commit is contained in:
29
packages/babel-plugin-proposal-json-strings/src/index.js
Normal file
29
packages/babel-plugin-proposal-json-strings/src/index.js
Normal file
@@ -0,0 +1,29 @@
|
||||
import { declare } from "@babel/helper-plugin-utils";
|
||||
import syntaxJsonStrings from "@babel/plugin-syntax-json-strings";
|
||||
|
||||
export default declare(api => {
|
||||
api.assertVersion(7);
|
||||
const regex = /(\\*)([\u2028\u2029])/g;
|
||||
function replace(match, escapes, separator) {
|
||||
// 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 {
|
||||
inherits: syntaxJsonStrings,
|
||||
|
||||
visitor: {
|
||||
"DirectiveLiteral|StringLiteral"({ node }) {
|
||||
const { extra } = node;
|
||||
if (!extra || !extra.raw) return;
|
||||
|
||||
extra.raw = extra.raw.replace(regex, replace);
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
Reference in New Issue
Block a user