From 711eeaa37fba7bc2bf94d2cab506830c27c9f8fb Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Wed, 13 Apr 2022 06:23:41 +0800 Subject: [PATCH 1/2] test: add failing tests --- .../node/ssr/__tests__/ssrTransform.spec.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index e086365ee25f16..f53ddb91b277a7 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -657,3 +657,25 @@ export function fn1() { " `) }) + +// https://github.com/vitest-dev/vitest/issues/1141 +test('export default statement', async () => { + // esbuild transform result of following TS code + // export default function getRandom() { + // return Math.random() + // } + const code = ` + export default (function getRandom() { + return Math.random(); + }); +` + + expect((await ssrTransform(code, null, null)).code).toMatchInlineSnapshot(` + " + (function getRandom() { + return Math.random(); + }); + + Object.defineProperty(__vite_ssr_exports__, \\"default\\", { enumerable: true, value: getRandom });" + `) +}) From 0deda74adaeedbcc49475ae68dbcf9556db04449 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Wed, 13 Apr 2022 06:28:27 +0800 Subject: [PATCH 2/2] fix(ssr): properly transform export default with expressions --- .../node/ssr/__tests__/ssrTransform.spec.ts | 23 ++++++++++--------- packages/vite/src/node/ssr/ssrTransform.ts | 7 +++++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index f53ddb91b277a7..a5f915edea97fd 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -659,23 +659,24 @@ export function fn1() { }) // https://github.com/vitest-dev/vitest/issues/1141 -test('export default statement', async () => { +test('export default expression', async () => { // esbuild transform result of following TS code // export default function getRandom() { // return Math.random() // } const code = ` - export default (function getRandom() { - return Math.random(); - }); -` +export default (function getRandom() { + return Math.random(); +}); +`.trim() expect((await ssrTransform(code, null, null)).code).toMatchInlineSnapshot(` - " - (function getRandom() { - return Math.random(); - }); - - Object.defineProperty(__vite_ssr_exports__, \\"default\\", { enumerable: true, value: getRandom });" + "__vite_ssr_exports__.default = (function getRandom() { + return Math.random(); + });" `) + + expect( + (await ssrTransform(`export default (class A {});`, null, null)).code + ).toMatchInlineSnapshot(`"__vite_ssr_exports__.default = (class A {});"`) }) diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 56b75f8dd14913..79ccd25f9ca8ff 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -143,7 +143,12 @@ export async function ssrTransform( // default export if (node.type === 'ExportDefaultDeclaration') { - if ('id' in node.declaration && node.declaration.id) { + const expressionTypes = ['FunctionExpression', 'ClassExpression'] + if ( + 'id' in node.declaration && + node.declaration.id && + !expressionTypes.includes(node.declaration.type) + ) { // named hoistable/class exports // export default function foo() {} // export default class A {}