diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a183cbf335e6..259ef7a46f70 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -272,7 +272,7 @@ jobs: !**/node_modules/** test-babel-8-breaking: - name: Test Babel 8 breaking changes on Node.js + name: Test Babel 8 breaking changes on needs: build-babel8 strategy: matrix: diff --git a/packages/babel-generator/src/generators/expressions.ts b/packages/babel-generator/src/generators/expressions.ts index 10b382f4e3ab..28a27b2c7df3 100644 --- a/packages/babel-generator/src/generators/expressions.ts +++ b/packages/babel-generator/src/generators/expressions.ts @@ -190,12 +190,14 @@ export function OptionalCallExpression( ) { this.print(node.callee, node); - this.print(node.typeArguments, node); // Flow this.print(node.typeParameters, node); // TS if (node.optional) { this.token("?."); } + + this.print(node.typeArguments, node); // Flow + this.token("("); this.printList(node.arguments, node); this.token(")"); diff --git a/packages/babel-generator/src/generators/flow.ts b/packages/babel-generator/src/generators/flow.ts index e0cb079e0179..7d037bbf321a 100644 --- a/packages/babel-generator/src/generators/flow.ts +++ b/packages/babel-generator/src/generators/flow.ts @@ -332,6 +332,7 @@ export function FunctionTypeAnnotation( if ( parent && (parent.type === "ObjectTypeCallProperty" || + parent.type === "ObjectTypeInternalSlot" || parent.type === "DeclareFunction" || (parent.type === "ObjectTypeProperty" && parent.method)) ) { diff --git a/packages/babel-generator/test/fixtures/decoratorsBeforeExport/false-to-true/options.json b/packages/babel-generator/test/fixtures/decoratorsBeforeExport/false-to-true/options.json index 5cd524b7c638..72515fd85bfe 100644 --- a/packages/babel-generator/test/fixtures/decoratorsBeforeExport/false-to-true/options.json +++ b/packages/babel-generator/test/fixtures/decoratorsBeforeExport/false-to-true/options.json @@ -1,5 +1,6 @@ { "BABEL_8_BREAKING": false, "plugins": [["decorators", { "decoratorsBeforeExport": false }]], - "decoratorsBeforeExport": true + "decoratorsBeforeExport": true, + "expectedReParseError": true } diff --git a/packages/babel-generator/test/fixtures/decoratorsBeforeExport/true-to-false/options.json b/packages/babel-generator/test/fixtures/decoratorsBeforeExport/true-to-false/options.json index 99dc70805820..dffdbf484f18 100644 --- a/packages/babel-generator/test/fixtures/decoratorsBeforeExport/true-to-false/options.json +++ b/packages/babel-generator/test/fixtures/decoratorsBeforeExport/true-to-false/options.json @@ -1,5 +1,6 @@ { "BABEL_8_BREAKING": false, "plugins": [["decorators", { "decoratorsBeforeExport": true }]], - "decoratorsBeforeExport": false + "decoratorsBeforeExport": false, + "expectedReParseError": true } diff --git a/packages/babel-generator/test/fixtures/flow/internal-slot/output.js b/packages/babel-generator/test/fixtures/flow/internal-slot/output.js index 3b2b5ece1a23..e4345459ab06 100644 --- a/packages/babel-generator/test/fixtures/flow/internal-slot/output.js +++ b/packages/babel-generator/test/fixtures/flow/internal-slot/output.js @@ -8,13 +8,13 @@ interface I1 { [[foo]]: X } interface I2 { - [[foo]]() => X + [[foo]](): X } type T1 = { [[foo]]: X }; type T2 = { - [[foo]]() => X + [[foo]](): X }; type T3 = { [[foo]]?: X diff --git a/packages/babel-generator/test/fixtures/flow/typeapp-call/output.js b/packages/babel-generator/test/fixtures/flow/typeapp-call/output.js index 2c2f43ea0869..6db174c9ad20 100644 --- a/packages/babel-generator/test/fixtures/flow/typeapp-call/output.js +++ b/packages/babel-generator/test/fixtures/flow/typeapp-call/output.js @@ -16,6 +16,6 @@ new C(); o.m(); f < T > .0; o?.m(e); -o.m?.(e); +o.m?.(e); async(); -f?.(e); \ No newline at end of file +f?.(e); \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/types/Decorator/options.json b/packages/babel-generator/test/fixtures/types/Decorator/options.json index b4fee43f66c4..be6fc7ea6fca 100644 --- a/packages/babel-generator/test/fixtures/types/Decorator/options.json +++ b/packages/babel-generator/test/fixtures/types/Decorator/options.json @@ -1 +1,5 @@ -{ "plugins": ["decorators-legacy"] } +{ + "plugins": ["decorators-legacy"], + "decoratorsBeforeExport": true, + "BABEL_8_BREAKING": false +} diff --git a/packages/babel-generator/test/fixtures/types/Decorator/output.js b/packages/babel-generator/test/fixtures/types/Decorator/output.js index db5f62ff6b7c..853583676718 100644 --- a/packages/babel-generator/test/fixtures/types/Decorator/output.js +++ b/packages/babel-generator/test/fixtures/types/Decorator/output.js @@ -32,15 +32,15 @@ class Foo { } -export default @foo -class Foo2 { +@foo +export default class Foo2 { bar() { class Baz {} } } -export @foo -class Foo3 { +@foo +export class Foo3 { bar() { class Baz {} } diff --git a/packages/babel-generator/test/index.js b/packages/babel-generator/test/index.js index b32847f2cdfe..d55ca5492a48 100644 --- a/packages/babel-generator/test/index.js +++ b/packages/babel-generator/test/index.js @@ -811,14 +811,15 @@ suites.forEach(function (testSuite) { const actualCode = actual.code; if (actualCode) { - const actualAst = parse(actualCode, { + const parserOpts = { filename: actual.loc, plugins: task.options.plugins || [], strictMode: task.options.strictMode === false ? false : true, sourceType: "module", sourceMaps: !!task.sourceMap, ...task.options.parserOpts, - }); + }; + const actualAst = parse(actualCode, parserOpts); const options = { sourceFileName: path.relative( path.dirname(fileURLToPath(import.meta.url)), @@ -832,7 +833,7 @@ suites.forEach(function (testSuite) { return generate(actualAst, options, actualCode); }; - const throwMsg = task.options.throws; + const throwMsg = options.throws; if (throwMsg) { expect(() => run()).toThrow( throwMsg === true ? undefined : throwMsg, @@ -864,6 +865,11 @@ suites.forEach(function (testSuite) { } else { try { expect(result.code).toBe(expected.code); + if (!options.expectedReParseError) { + expect(() => { + parse(result.code, parserOpts); + }).not.toThrow(); + } } catch (e) { if (!process.env.OVERWRITE) throw e; console.log(`Updated test file: ${expected.loc}`);