Justin Ridgewell 0879a6d608
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
2018-05-19 15:32:05 -04:00

30 lines
844 B
JavaScript

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);
},
},
};
});