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:
Justin Ridgewell 2018-05-19 15:32:05 -04:00 committed by GitHub
parent 51eef099b3
commit 0879a6d608
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 809 additions and 3 deletions

View File

@ -1069,6 +1069,7 @@ export default class Tokenizer extends LocationParser {
readString(quote: number): void { readString(quote: number): void {
let out = "", let out = "",
chunkStart = ++this.state.pos; chunkStart = ++this.state.pos;
const hasJsonStrings = this.hasPlugin("jsonStrings");
for (;;) { for (;;) {
if (this.state.pos >= this.input.length) { if (this.state.pos >= this.input.length) {
this.raise(this.state.start, "Unterminated string constant"); this.raise(this.state.start, "Unterminated string constant");
@ -1080,10 +1081,14 @@ export default class Tokenizer extends LocationParser {
// $FlowFixMe // $FlowFixMe
out += this.readEscapedChar(false); out += this.readEscapedChar(false);
chunkStart = this.state.pos; chunkStart = this.state.pos;
} else if (
hasJsonStrings &&
(ch === charCodes.lineSeparator || ch === charCodes.paragraphSeparator)
) {
++this.state.pos;
} else if (isNewLine(ch)) {
this.raise(this.state.start, "Unterminated string constant");
} else { } else {
if (isNewLine(ch)) {
this.raise(this.state.start, "Unterminated string constant");
}
++this.state.pos; ++this.state.pos;
} }
} }

View File

@ -0,0 +1,2 @@
"beforeafter";
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')

View File

@ -0,0 +1,105 @@
{
"type": "File",
"start": 0,
"end": 98,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 2,
"column": 82
}
},
"program": {
"type": "Program",
"start": 0,
"end": 98,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 2,
"column": 82
}
},
"sourceType": "script",
"body": [],
"directives": [
{
"type": "Directive",
"start": 0,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 15
}
},
"value": {
"type": "DirectiveLiteral",
"start": 0,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 14
}
},
"value": "beforeafter",
"extra": {
"raw": "\"beforeafter\"",
"rawValue": "beforeafter"
}
},
"trailingComments": [
{
"type": "CommentLine",
"value": " ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')",
"start": 16,
"end": 98,
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 82
}
}
}
]
}
]
},
"comments": [
{
"type": "CommentLine",
"value": " ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')",
"start": 16,
"end": 98,
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 82
}
}
}
]
}

View File

@ -0,0 +1,2 @@
"beforeafter";
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')

View File

@ -0,0 +1,105 @@
{
"type": "File",
"start": 0,
"end": 103,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 2,
"column": 87
}
},
"program": {
"type": "Program",
"start": 0,
"end": 103,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 2,
"column": 87
}
},
"sourceType": "script",
"body": [],
"directives": [
{
"type": "Directive",
"start": 0,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 15
}
},
"value": {
"type": "DirectiveLiteral",
"start": 0,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 14
}
},
"value": "beforeafter",
"extra": {
"raw": "\"beforeafter\"",
"rawValue": "beforeafter"
}
},
"trailingComments": [
{
"type": "CommentLine",
"value": " ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')",
"start": 16,
"end": 103,
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 87
}
}
}
]
}
]
},
"comments": [
{
"type": "CommentLine",
"value": " ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')",
"start": 16,
"end": 103,
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 87
}
}
}
]
}

View File

@ -0,0 +1,3 @@
{
"plugins": ["jsonStrings"]
}

View File

@ -0,0 +1,2 @@
("beforeafter");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')

View File

@ -0,0 +1,107 @@
{
"type": "File",
"start": 0,
"end": 101,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 2,
"column": 83
}
},
"program": {
"type": "Program",
"start": 0,
"end": 101,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 2,
"column": 83
}
},
"sourceType": "script",
"body": [
{
"type": "ExpressionStatement",
"start": 0,
"end": 17,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 17
}
},
"expression": {
"type": "StringLiteral",
"start": 1,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 15
}
},
"extra": {
"rawValue": "beforeafter",
"raw": "\"beforeafter\"",
"parenthesized": true,
"parenStart": 0
},
"value": "beforeafter"
},
"trailingComments": [
{
"type": "CommentLine",
"value": " ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')",
"start": 18,
"end": 101,
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 83
}
}
}
]
}
],
"directives": []
},
"comments": [
{
"type": "CommentLine",
"value": " ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')",
"start": 18,
"end": 101,
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 83
}
}
}
]
}

View File

@ -0,0 +1,2 @@
("beforeafter");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')

View File

@ -0,0 +1,107 @@
{
"type": "File",
"start": 0,
"end": 106,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 2,
"column": 88
}
},
"program": {
"type": "Program",
"start": 0,
"end": 106,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 2,
"column": 88
}
},
"sourceType": "script",
"body": [
{
"type": "ExpressionStatement",
"start": 0,
"end": 17,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 17
}
},
"expression": {
"type": "StringLiteral",
"start": 1,
"end": 15,
"loc": {
"start": {
"line": 1,
"column": 1
},
"end": {
"line": 1,
"column": 15
}
},
"extra": {
"rawValue": "beforeafter",
"raw": "\"beforeafter\"",
"parenthesized": true,
"parenStart": 0
},
"value": "beforeafter"
},
"trailingComments": [
{
"type": "CommentLine",
"value": " ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')",
"start": 18,
"end": 106,
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 88
}
}
}
]
}
],
"directives": []
},
"comments": [
{
"type": "CommentLine",
"value": " ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')",
"start": 18,
"end": 106,
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 88
}
}
}
]
}

View File

@ -0,0 +1,3 @@
src
test
*.log

View File

@ -0,0 +1,54 @@
# @babel/plugin-syntax-json-strings
Allow parsing of the U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR in JS strings
## Examples
**In**
```js
const ex = "beforeafter";
// ^ There's a U+2028 char between 'before' and 'after'
```
**Out**
```js
const ex = "before\u2028after";
// ^ There's a U+2028 char between 'before' and 'after'
```
## Installation
```sh
npm install --save-dev @babel/plugin-proposal-json-strings
```
## Usage
### Via `.babelrc` (Recommended)
**.babelrc**
```json
{
"plugins": ["@babel/plugin-proposal-json-strings"]
}
```
### Via CLI
```sh
babel --plugins @babel/plugin-proposal-json-strings script.js
```
### Via Node API
```javascript
require("@babel/core").transform("code", {
plugins: ["@babel/plugin-proposal-json-strings"]
});
```
## References
- [Proposal: Optional Catch Binding for ECMAScript](https://github.com/babel/proposals/issues/7)

View File

@ -0,0 +1,22 @@
{
"name": "@babel/plugin-proposal-json-strings",
"version": "7.0.0-beta.47",
"description": "Escape U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR in JS strings",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-proposal-json-strings",
"license": "MIT",
"main": "lib/index.js",
"keywords": [
"babel-plugin"
],
"dependencies": {
"@babel/helper-plugin-utils": "7.0.0-beta.47",
"@babel/plugin-syntax-json-strings": "7.0.0-beta.47"
},
"peerDependencies": {
"@babel/core": "7.0.0-beta.47"
},
"devDependencies": {
"@babel/core": "7.0.0-beta.47",
"@babel/helper-plugin-test-runner": "7.0.0-beta.47"
}
}

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

View File

@ -0,0 +1,5 @@
"beforeafter";
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')
""; // Just a U+2028 LINE SEPARATOR
"\"; // Escaped U+2028 LINE SEPARATOR
"\u2028"; // Escaped U+2028 LINE SEPARATOR

View File

@ -0,0 +1,5 @@
"beforeafter";
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')
""; // Just a U+2028 LINE SEPARATOR
"\"; // Escaped U+2028 LINE SEPARATOR
"\u2028"; // Escaped U+2028 LINE SEPARATOR

View File

@ -0,0 +1,7 @@
"before\u2028after"; // ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')
"\u2028"; // Just a U+2028 LINE SEPARATOR
"\"; // Escaped U+2028 LINE SEPARATOR
"\u2028"; // Escaped U+2028 LINE SEPARATOR

View File

@ -0,0 +1,5 @@
"beforeafter";
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')
""; // Just a U+2029 PARAGRAPH SEPARATOR
"\"; // Escaped U+2029 PARAGRAPH SEPARATOR
"\u2029"; // Escaped U+2029 PARAGRAPH SEPARATOR

View File

@ -0,0 +1,5 @@
"beforeafter";
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')
""; // Just a U+2029 PARAGRAPH SEPARATOR
"\"; // Escaped U+2029 PARAGRAPH SEPARATOR
"\u2029"; // Escaped U+2029 PARAGRAPH SEPARATOR

View File

@ -0,0 +1,7 @@
"before\u2029after"; // ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')
"\u2029"; // Just a U+2029 PARAGRAPH SEPARATOR
"\"; // Escaped U+2029 PARAGRAPH SEPARATOR
"\u2029"; // Escaped U+2029 PARAGRAPH SEPARATOR

View File

@ -0,0 +1,27 @@
expect("\u2028".length).toBe(1);
expect("\u2028").toBe("\u2028");
expect("beforeafter".length).toBe(12);
expect("beforeafter").toBe("before\u2028after");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')
expect("".length).toBe(1);
expect("").toBe("\u2028");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\".length).toBe(0);
expect("\").toBe("");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\".length).toBe(2);
expect("\\").toBe("\\\u2028");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\\".length).toBe(1);
expect("\\\").toBe("\\");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\\\".length).toBe(3);
expect("\\\\").toBe("\\\\\u2028");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char

View File

@ -0,0 +1,27 @@
expect("\u2028".length).toBe(1);
expect("\u2028").toBe("\u2028");
expect("beforeafter".length).toBe(12);
expect("beforeafter").toBe("before\u2028after");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')
expect("".length).toBe(1);
expect("").toBe("\u2028");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\".length).toBe(0);
expect("\").toBe("");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\".length).toBe(2);
expect("\\").toBe("\\\u2028");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\\".length).toBe(1);
expect("\\\").toBe("\\");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\\\".length).toBe(3);
expect("\\\\").toBe("\\\\\u2028");
// ^ That's a U+2028 LINE SEPARATOR UTF-16 char

View File

@ -0,0 +1,19 @@
expect("\u2028".length).toBe(1);
expect("\u2028").toBe("\u2028");
expect("before\u2028after".length).toBe(12);
expect("before\u2028after").toBe("before\u2028after"); // ^ That's a U+2028 LINE SEPARATOR UTF-16 char (between 'before' and 'after')
expect("\u2028".length).toBe(1);
expect("\u2028").toBe("\u2028"); // ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\".length).toBe(0);
expect("\").toBe(""); // ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\\u2028".length).toBe(2);
expect("\\\u2028").toBe("\\\u2028"); // ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\\".length).toBe(1);
expect("\\\").toBe("\\"); // ^ That's a U+2028 LINE SEPARATOR UTF-16 char
expect("\\\\\u2028".length).toBe(3);
expect("\\\\\u2028").toBe("\\\\\u2028"); // ^ That's a U+2028 LINE SEPARATOR UTF-16 char

View File

@ -0,0 +1,27 @@
expect("\u2029".length).toBe(1);
expect("\u2029").toBe("\u2029");
expect("beforeafter".length).toBe(12);
expect("beforeafter").toBe("before\u2029after");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')
expect("".length).toBe(1);
expect("").toBe("\u2029");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\".length).toBe(0);
expect("\").toBe("");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\".length).toBe(2);
expect("\\").toBe("\\\u2029");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\\".length).toBe(1);
expect("\\\").toBe("\\");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\\\".length).toBe(3);
expect("\\\\").toBe("\\\\\u2029");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char

View File

@ -0,0 +1,27 @@
expect("\u2029".length).toBe(1);
expect("\u2029").toBe("\u2029");
expect("beforeafter".length).toBe(12);
expect("beforeafter").toBe("before\u2029after");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')
expect("".length).toBe(1);
expect("").toBe("\u2029");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\".length).toBe(0);
expect("\").toBe("");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\".length).toBe(2);
expect("\\").toBe("\\\u2029");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\\".length).toBe(1);
expect("\\\").toBe("\\");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\\\".length).toBe(3);
expect("\\\\").toBe("\\\\\u2029");
// ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char

View File

@ -0,0 +1,19 @@
expect("\u2029".length).toBe(1);
expect("\u2029").toBe("\u2029");
expect("before\u2029after".length).toBe(12);
expect("before\u2029after").toBe("before\u2029after"); // ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char (between 'before' and 'after')
expect("\u2029".length).toBe(1);
expect("\u2029").toBe("\u2029"); // ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\".length).toBe(0);
expect("\").toBe(""); // ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\\u2029".length).toBe(2);
expect("\\\u2029").toBe("\\\u2029"); // ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\\".length).toBe(1);
expect("\\\").toBe("\\"); // ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char
expect("\\\\\u2029".length).toBe(3);
expect("\\\\\u2029").toBe("\\\\\u2029"); // ^ That's a U+2029 PARAGRAPH SEPARATOR UTF-16 char

View File

@ -0,0 +1,3 @@
{
"plugins": ["proposal-json-strings"]
}

View File

@ -0,0 +1,3 @@
import runner from "@babel/helper-plugin-test-runner";
runner(__dirname);

View File

@ -0,0 +1,3 @@
src
test
*.log

View File

@ -0,0 +1,35 @@
# @babel/plugin-syntax-json-strings
Allow parsing of the U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR in JS strings
## Installation
```sh
npm install --save-dev @babel/plugin-syntax-json-strings
```
## Usage
### Via `.babelrc` (Recommended)
**.babelrc**
```json
{
"plugins": ["@babel/plugin-syntax-json-strings"]
}
```
### Via CLI
```sh
babel --plugins @babel/plugin-syntax-json-strings script.js
```
### Via Node API
```javascript
require("@babel/core").transform("code", {
plugins: ["@babel/plugin-syntax-json-strings"]
});
```

View File

@ -0,0 +1,20 @@
{
"name": "@babel/plugin-syntax-json-strings",
"version": "7.0.0-beta.47",
"description": "Allow parsing of the U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR in JS strings",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings",
"license": "MIT",
"main": "lib/index.js",
"keywords": [
"babel-plugin"
],
"dependencies": {
"@babel/helper-plugin-utils": "7.0.0-beta.47"
},
"peerDependencies": {
"@babel/core": "7.0.0-beta.47"
},
"devDependencies": {
"@babel/core": "7.0.0-beta.47"
}
}

View File

@ -0,0 +1,11 @@
import { declare } from "@babel/helper-plugin-utils";
export default declare(api => {
api.assertVersion(7);
return {
manipulateOptions(opts, parserOpts) {
parserOpts.plugins.push("jsonStrings");
},
};
});

View File

@ -11,6 +11,7 @@
"@babel/helper-plugin-utils": "7.0.0-beta.47", "@babel/helper-plugin-utils": "7.0.0-beta.47",
"@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.47", "@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.47",
"@babel/plugin-proposal-class-properties": "7.0.0-beta.47", "@babel/plugin-proposal-class-properties": "7.0.0-beta.47",
"@babel/plugin-proposal-json-strings": "7.0.0-beta.47",
"@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.47", "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.47",
"@babel/plugin-proposal-optional-catch-binding": "7.0.0-beta.47", "@babel/plugin-proposal-optional-catch-binding": "7.0.0-beta.47",
"@babel/plugin-proposal-unicode-property-regex": "7.0.0-beta.47", "@babel/plugin-proposal-unicode-property-regex": "7.0.0-beta.47",

View File

@ -3,6 +3,7 @@ import syntaxDynamicImport from "@babel/plugin-syntax-dynamic-import";
import syntaxImportMeta from "@babel/plugin-syntax-import-meta"; import syntaxImportMeta from "@babel/plugin-syntax-import-meta";
import transformAsyncGeneratorFunctions from "@babel/plugin-proposal-async-generator-functions"; import transformAsyncGeneratorFunctions from "@babel/plugin-proposal-async-generator-functions";
import transformClassProperties from "@babel/plugin-proposal-class-properties"; import transformClassProperties from "@babel/plugin-proposal-class-properties";
import transformJsonStrings from "@babel/plugin-proposal-json-strings";
import transformObjectRestSpread from "@babel/plugin-proposal-object-rest-spread"; import transformObjectRestSpread from "@babel/plugin-proposal-object-rest-spread";
import transformOptionalCatchBinding from "@babel/plugin-proposal-optional-catch-binding"; import transformOptionalCatchBinding from "@babel/plugin-proposal-optional-catch-binding";
import transformUnicodePropertyRegex from "@babel/plugin-proposal-unicode-property-regex"; import transformUnicodePropertyRegex from "@babel/plugin-proposal-unicode-property-regex";
@ -33,6 +34,7 @@ export default declare((api, opts) => {
syntaxImportMeta, syntaxImportMeta,
transformAsyncGeneratorFunctions, transformAsyncGeneratorFunctions,
[transformClassProperties, { loose }], [transformClassProperties, { loose }],
transformJsonStrings,
[transformObjectRestSpread, { loose, useBuiltIns }], [transformObjectRestSpread, { loose, useBuiltIns }],
transformOptionalCatchBinding, transformOptionalCatchBinding,
transformUnicodePropertyRegex, transformUnicodePropertyRegex,