Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ test('json', async () => {
null,
'/test.json',
)
expect(json?.code.length).toMatchInlineSnapshot(`208`)
expect(json?.code.length).toMatchInlineSnapshot(`225`)
})

test('file url', async () => {
Expand Down
78 changes: 39 additions & 39 deletions packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ test('export function declaration', async () => {
await ssrTransformSimpleCode(`export function foo() {}`),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ return foo }});
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return foo } catch {} }});
function foo() {}"
`,
)
Expand All @@ -66,7 +66,7 @@ test('export class declaration', async () => {
await ssrTransformSimpleCode(`export class foo {}`),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ return foo }});
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return foo } catch {} }});
class foo {}"
`,
)
Expand All @@ -77,8 +77,8 @@ test('export var declaration', async () => {
await ssrTransformSimpleCode(`export const a = 1, b = 2`),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "a", { enumerable: true, configurable: true, get(){ return a }});
Object.defineProperty(__vite_ssr_exports__, "b", { enumerable: true, configurable: true, get(){ return b }});
"Object.defineProperty(__vite_ssr_exports__, "a", { enumerable: true, configurable: true, get(){ try { return a } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "b", { enumerable: true, configurable: true, get(){ try { return b } catch {} }});
const a = 1, b = 2"
`,
)
Expand All @@ -89,8 +89,8 @@ test('export named', async () => {
await ssrTransformSimpleCode(`const a = 1, b = 2; export { a, b as c }`),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "a", { enumerable: true, configurable: true, get(){ return a }});
Object.defineProperty(__vite_ssr_exports__, "c", { enumerable: true, configurable: true, get(){ return b }});
"Object.defineProperty(__vite_ssr_exports__, "a", { enumerable: true, configurable: true, get(){ try { return a } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "c", { enumerable: true, configurable: true, get(){ try { return b } catch {} }});
const a = 1, b = 2; "
`,
)
Expand All @@ -101,8 +101,8 @@ test('export named from', async () => {
await ssrTransformSimpleCode(`export { ref, computed as c } from 'vue'`),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "ref", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_0__.ref }});
Object.defineProperty(__vite_ssr_exports__, "c", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_0__.computed }});
"Object.defineProperty(__vite_ssr_exports__, "ref", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_0__.ref } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "c", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_0__.computed } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("vue", {"importedNames":["ref","computed"]});"
`,
)
Expand All @@ -115,7 +115,7 @@ test('named exports of imported binding', async () => {
),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "createApp", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_0__.createApp }});
"Object.defineProperty(__vite_ssr_exports__, "createApp", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_0__.createApp } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("vue", {"importedNames":["createApp"]});"
`,
)
Expand All @@ -139,7 +139,7 @@ test('export * as from', async () => {
await ssrTransformSimpleCode(`export * as foo from 'vue'`),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_0__ }});
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_0__ } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("vue");"
`,
)
Expand All @@ -152,7 +152,7 @@ import * as foo from 'foo'
export * as foo from 'foo'
`),
).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_1__ }});
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_1__ } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("foo");
const __vite_ssr_import_1__ = await __vite_ssr_import__("foo");
"
Expand All @@ -164,7 +164,7 @@ import { foo } from 'foo'
export { foo } from 'foo'
`),
).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_1__.foo }});
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_1__.foo } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("foo", {"importedNames":["foo"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("foo", {"importedNames":["foo"]});
"
Expand All @@ -176,7 +176,7 @@ import { foo } from 'foo'
export { foo as foo } from 'foo'
`),
).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_1__.foo }});
"Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_1__.foo } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("foo", {"importedNames":["foo"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("foo", {"importedNames":["foo"]});
"
Expand All @@ -188,7 +188,7 @@ test('export * as from arbitrary module namespace identifier', async () => {
await ssrTransformSimpleCode(`export * as "arbitrary string" from 'vue'`),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "arbitrary string", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_0__ }});
"Object.defineProperty(__vite_ssr_exports__, "arbitrary string", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_0__ } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("vue");"
`,
)
Expand All @@ -201,7 +201,7 @@ test('export as arbitrary module namespace identifier', async () => {
),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "arbitrary string", { enumerable: true, configurable: true, get(){ return something }});
"Object.defineProperty(__vite_ssr_exports__, "arbitrary string", { enumerable: true, configurable: true, get(){ try { return something } catch {} }});
const something = "Something";"
`,
)
Expand All @@ -214,7 +214,7 @@ test('export as from arbitrary module namespace identifier', async () => {
),
).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "arbitrary string", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_0__["arbitrary string2"] }});
"Object.defineProperty(__vite_ssr_exports__, "arbitrary string", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_0__["arbitrary string2"] } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("vue", {"importedNames":["arbitrary string2"]});"
`,
)
Expand All @@ -223,9 +223,9 @@ test('export as from arbitrary module namespace identifier', async () => {
test('export default', async () => {
expect(await ssrTransformSimpleCode(`export default {}`))
.toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return __vite_ssr_export_default__ }});
const __vite_ssr_export_default__ = {}"
`)
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }});
const __vite_ssr_export_default__ = {}"
`)
})

test('export then import minified', async () => {
Expand Down Expand Up @@ -347,7 +347,7 @@ test('dynamic import', async () => {
)
expect(result?.code).toMatchInlineSnapshot(
`
"Object.defineProperty(__vite_ssr_exports__, "i", { enumerable: true, configurable: true, get(){ return i }});
"Object.defineProperty(__vite_ssr_exports__, "i", { enumerable: true, configurable: true, get(){ try { return i } catch {} }});
const i = () => __vite_ssr_dynamic_import__('./foo')"
`,
)
Expand Down Expand Up @@ -507,8 +507,8 @@ test('should declare variable for imported super class', async () => {
`export class B extends Foo {}`,
),
).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return A }});
Object.defineProperty(__vite_ssr_exports__, "B", { enumerable: true, configurable: true, get(){ return B }});
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return A } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "B", { enumerable: true, configurable: true, get(){ try { return B } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("./dependency", {"importedNames":["Foo"]});const Foo = __vite_ssr_import_0__.Foo;
class A extends Foo {};
class B extends Foo {}"
Expand All @@ -520,14 +520,14 @@ test('should handle default export variants', async () => {
// default anonymous functions
expect(await ssrTransformSimpleCode(`export default function() {}\n`))
.toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return __vite_ssr_export_default__ }});
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }});
const __vite_ssr_export_default__ = function() {}
"
`)
// default anonymous class
expect(await ssrTransformSimpleCode(`export default class {}\n`))
.toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return __vite_ssr_export_default__ }});
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }});
const __vite_ssr_export_default__ = class {}
"
`)
Expand All @@ -538,7 +538,7 @@ test('should handle default export variants', async () => {
`foo.prototype = Object.prototype;`,
),
).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return foo }});
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return foo } catch {} }});
function foo() {};
foo.prototype = Object.prototype;"
`)
Expand All @@ -548,8 +548,8 @@ test('should handle default export variants', async () => {
`export default class A {}\n` + `export class B extends A {}`,
),
).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return A }});
Object.defineProperty(__vite_ssr_exports__, "B", { enumerable: true, configurable: true, get(){ return B }});
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return A } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "B", { enumerable: true, configurable: true, get(){ try { return B } catch {} }});
class A {};
class B extends A {}"
`)
Expand Down Expand Up @@ -988,8 +988,8 @@ export function fn1() {
`,
),
).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "fn1", { enumerable: true, configurable: true, get(){ return fn1 }});
Object.defineProperty(__vite_ssr_exports__, "fn2", { enumerable: true, configurable: true, get(){ return fn2 }});
"Object.defineProperty(__vite_ssr_exports__, "fn1", { enumerable: true, configurable: true, get(){ try { return fn1 } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "fn2", { enumerable: true, configurable: true, get(){ try { return fn2 } catch {} }});

function fn1() {
};function fn2() {
Expand All @@ -1011,17 +1011,17 @@ export default (function getRandom() {
`.trim()

expect(await ssrTransformSimpleCode(code)).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return __vite_ssr_export_default__ }});
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }});
const __vite_ssr_export_default__ = (function getRandom() {
return Math.random();
});"
`)

expect(await ssrTransformSimpleCode(`export default (class A {});`))
.toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return __vite_ssr_export_default__ }});
const __vite_ssr_export_default__ = (class A {});"
`)
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }});
const __vite_ssr_export_default__ = (class A {});"
`)
})

// #8002
Expand Down Expand Up @@ -1095,7 +1095,7 @@ export class Test {
};`.trim()

expect(await ssrTransformSimpleCode(code)).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "Test", { enumerable: true, configurable: true, get(){ return Test }});
"Object.defineProperty(__vite_ssr_exports__, "Test", { enumerable: true, configurable: true, get(){ try { return Test } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("foobar", {"importedNames":["foo","bar"]});
if (false) {
const foo = 'foo';
Expand Down Expand Up @@ -1285,8 +1285,8 @@ export * as bar from './bar'
console.log(bar)
`),
).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ return __vite_ssr_export_default__ }});
Object.defineProperty(__vite_ssr_exports__, "bar", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_1__ }});
"Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "bar", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_1__ } catch {} }});

const __vite_ssr_import_0__ = await __vite_ssr_import__("./foo", {"importedNames":["foo"]});const __vite_ssr_import_1__ = await __vite_ssr_import__("./bar");;
const __vite_ssr_export_default__ = (0,__vite_ssr_import_0__.foo)();
Expand Down Expand Up @@ -1542,9 +1542,9 @@ import("e")
export * as A from "a";
`)
expect(result?.code).toMatchInlineSnapshot(`
"Object.defineProperty(__vite_ssr_exports__, "b", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_1__.b }});
Object.defineProperty(__vite_ssr_exports__, "d", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_3__ }});
Object.defineProperty(__vite_ssr_exports__, "A", { enumerable: true, configurable: true, get(){ return __vite_ssr_import_4__ }});
"Object.defineProperty(__vite_ssr_exports__, "b", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_1__.b } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "d", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_3__ } catch {} }});
Object.defineProperty(__vite_ssr_exports__, "A", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_4__ } catch {} }});
const __vite_ssr_import_0__ = await __vite_ssr_import__("a", {"importedNames":["default"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("b", {"importedNames":["b"]});
const __vite_ssr_import_2__ = await __vite_ssr_import__("c");__vite_ssr_exportAll__(__vite_ssr_import_2__);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,15 +290,19 @@ describe('module runner initialization', async () => {
await expect(() =>
runner.import('/fixtures/cyclic2/test5/index.js'),
).rejects.toMatchInlineSnapshot(
`[ReferenceError: Cannot access '__vite_ssr_import_1__' before initialization]`,
`[TypeError: Cannot read properties of undefined (reading 'ok')]`,
)
})

it(`cyclic invalid 2`, async ({ runner }) => {
await expect(() =>
runner.import('/fixtures/cyclic2/test6/index.js'),
).rejects.toMatchInlineSnapshot(
`[ReferenceError: Cannot access 'dep1' before initialization]`,
expect(
await runner.import('/fixtures/cyclic2/test6/index.js'),
).toMatchInlineSnapshot(
`
{
"dep1": "dep1: dep2: undefined",
}
`,
)
})

Expand Down Expand Up @@ -374,10 +378,14 @@ describe('module runner initialization', async () => {

it(`export default getter is hoisted`, async ({ runner }) => {
// Node error is `ReferenceError: Cannot access 'dep' before initialization`
await expect(() =>
runner.import('/fixtures/cyclic2/test9/index.js'),
).rejects.toMatchInlineSnapshot(
`[ReferenceError: Cannot access '__vite_ssr_export_default__' before initialization]`,
expect(
await runner.import('/fixtures/cyclic2/test9/index.js'),
).toMatchInlineSnapshot(
`
{
"default": undefined,
}
`,
)
})
})
Expand Down
2 changes: 1 addition & 1 deletion packages/vite/src/node/ssr/ssrTransform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ async function ssrTransformScript(
s.appendLeft(
fileStartIndex,
`Object.defineProperty(${ssrModuleExportsKey}, ${JSON.stringify(name)}, ` +
`{ enumerable: true, configurable: true, get(){ return ${local} }});\n`,
`{ enumerable: true, configurable: true, get(){ try { return ${local} } catch {} }});\n`,
)
}

Expand Down
2 changes: 1 addition & 1 deletion vitest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export default defineConfig({
// importing non-entry files (e.g. config.ts, build.ts, server/index.ts) is broken due to cyclic import
// as it can be seen from tsx (try pnpm exec tsx packages/vite/src/node/server/index.ts).
// we can use `setupFiles` to ensure the modules are evaluated via main node entry.
setupFiles: ['./packages/vite/src/node/index.ts'],
// setupFiles: ['./packages/vite/src/node/index.ts'],
},
esbuild: {
target: 'node18',
Expand Down