From d5f4505c7e90caf36c530f55165f4b3a0afc1edb Mon Sep 17 00:00:00 2001 From: Bogdan Savluk Date: Mon, 18 Jul 2022 10:47:00 +0200 Subject: [PATCH] fix: allow exporting `TSDeclareFunction` as default (#14763) --- .../src/index.ts | 1 + .../src/ast-types/generated/index.ts | 7 +++++- .../src/builders/generated/index.ts | 6 ++++- packages/babel-types/src/definitions/core.ts | 1 + .../typescript/exportDefaultDeclaration.js | 23 +++++++++++++++++++ 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 packages/babel-types/test/builders/typescript/exportDefaultDeclaration.js diff --git a/packages/babel-plugin-transform-modules-systemjs/src/index.ts b/packages/babel-plugin-transform-modules-systemjs/src/index.ts index f2cf1b4ee672..887adf4b5722 100644 --- a/packages/babel-plugin-transform-modules-systemjs/src/index.ts +++ b/packages/babel-plugin-transform-modules-systemjs/src/index.ts @@ -436,6 +436,7 @@ export default declare((api, options: Options) => { } removedPaths.push(path); } else { + // @ts-expect-error TSDeclareFunction is not expected here path.replaceWith(buildExportCall("default", declar)); } } else if (path.isExportNamedDeclaration()) { diff --git a/packages/babel-types/src/ast-types/generated/index.ts b/packages/babel-types/src/ast-types/generated/index.ts index ec419a324510..5b77c64d0714 100644 --- a/packages/babel-types/src/ast-types/generated/index.ts +++ b/packages/babel-types/src/ast-types/generated/index.ts @@ -813,7 +813,11 @@ export interface ExportAllDeclaration extends BaseNode { export interface ExportDefaultDeclaration extends BaseNode { type: "ExportDefaultDeclaration"; - declaration: FunctionDeclaration | ClassDeclaration | Expression; + declaration: + | TSDeclareFunction + | FunctionDeclaration + | ClassDeclaration + | Expression; exportKind?: "value" | null; } @@ -6722,6 +6726,7 @@ export interface ParentMaps { TSDeclareFunction: | BlockStatement | DoWhileStatement + | ExportDefaultDeclaration | ExportNamedDeclaration | ForInStatement | ForOfStatement diff --git a/packages/babel-types/src/builders/generated/index.ts b/packages/babel-types/src/builders/generated/index.ts index 5b07d9824037..acfef5336e0b 100644 --- a/packages/babel-types/src/builders/generated/index.ts +++ b/packages/babel-types/src/builders/generated/index.ts @@ -639,7 +639,11 @@ export function exportAllDeclaration( }); } export function exportDefaultDeclaration( - declaration: t.FunctionDeclaration | t.ClassDeclaration | t.Expression, + declaration: + | t.TSDeclareFunction + | t.FunctionDeclaration + | t.ClassDeclaration + | t.Expression, ): t.ExportDefaultDeclaration { return validateNode({ type: "ExportDefaultDeclaration", diff --git a/packages/babel-types/src/definitions/core.ts b/packages/babel-types/src/definitions/core.ts index c938999f717c..920078e0cfdc 100644 --- a/packages/babel-types/src/definitions/core.ts +++ b/packages/babel-types/src/definitions/core.ts @@ -1521,6 +1521,7 @@ defineType("ExportDefaultDeclaration", { fields: { declaration: { validate: assertNodeType( + "TSDeclareFunction", "FunctionDeclaration", "ClassDeclaration", "Expression", diff --git a/packages/babel-types/test/builders/typescript/exportDefaultDeclaration.js b/packages/babel-types/test/builders/typescript/exportDefaultDeclaration.js new file mode 100644 index 000000000000..8042f4323907 --- /dev/null +++ b/packages/babel-types/test/builders/typescript/exportDefaultDeclaration.js @@ -0,0 +1,23 @@ +import * as t from "../../../lib/index.js"; + +describe("builders", function () { + describe("typescript", function () { + describe("exportDefaultDeclaration", function () { + it("accept TSDeclareFunction as argument for exportDefaultDeclaration", function () { + // this can be used when having function overrides for function exported as default + // export default function test(); + // export default function test() {}; + expect(() => { + t.exportDefaultDeclaration( + t.tsDeclareFunction( + t.identifier("test"), + null, + [], + t.tsTypeAnnotation(t.tsVoidKeyword()), + ), + ); + }).not.toThrow(); + }); + }); + }); +});