diff --git a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts index d878ed09a7e6a6..5dc8644aa7ff1b 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts @@ -235,7 +235,7 @@ test('json', async () => { null, '/test.json', ) - expect(json?.code.length).toMatchInlineSnapshot(`225`) + expect(json?.code.length).toMatchInlineSnapshot(`236`) }) test('file url', async () => { diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index 08f21dff809af2..cc31b67f4fa6c9 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -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(){ try { return foo } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return foo } catch {} }}); function foo() {}" `, ) @@ -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(){ try { return foo } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return foo } catch {} }}); class foo {}" `, ) @@ -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(){ try { return a } catch {} }}); - Object.defineProperty(__vite_ssr_exports__, "b", { enumerable: true, configurable: true, get(){ try { return b } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "a", { enumerable: true, configurable: true, get(){ try { return a } catch {} }}); + globalThis.Object.defineProperty(__vite_ssr_exports__, "b", { enumerable: true, configurable: true, get(){ try { return b } catch {} }}); const a = 1, b = 2" `, ) @@ -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(){ try { return a } catch {} }}); - Object.defineProperty(__vite_ssr_exports__, "c", { enumerable: true, configurable: true, get(){ try { return b } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "a", { enumerable: true, configurable: true, get(){ try { return a } catch {} }}); + globalThis.Object.defineProperty(__vite_ssr_exports__, "c", { enumerable: true, configurable: true, get(){ try { return b } catch {} }}); const a = 1, b = 2; " `, ) @@ -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(){ 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 {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "ref", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_0__.ref } catch {} }}); + globalThis.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"]});" `, ) @@ -115,7 +115,7 @@ test('named exports of imported binding', async () => { ), ).toMatchInlineSnapshot( ` - "Object.defineProperty(__vite_ssr_exports__, "createApp", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_0__.createApp } catch {} }}); + "globalThis.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"]});" `, ) @@ -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(){ try { return __vite_ssr_import_0__ } catch {} }}); + "globalThis.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");" `, ) @@ -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(){ try { return __vite_ssr_import_1__ } catch {} }}); + "globalThis.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"); " @@ -164,7 +164,7 @@ import { foo } from 'foo' export { foo } from 'foo' `), ).toMatchInlineSnapshot(` - "Object.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_1__.foo } catch {} }}); + "globalThis.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"]}); " @@ -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(){ try { return __vite_ssr_import_1__.foo } catch {} }}); + "globalThis.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"]}); " @@ -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(){ try { return __vite_ssr_import_0__ } catch {} }}); + "globalThis.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");" `, ) @@ -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(){ try { return something } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "arbitrary string", { enumerable: true, configurable: true, get(){ try { return something } catch {} }}); const something = "Something";" `, ) @@ -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(){ try { return __vite_ssr_import_0__["arbitrary string2"] } catch {} }}); + "globalThis.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"]});" `, ) @@ -223,7 +223,7 @@ 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(){ try { return __vite_ssr_export_default__ } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }}); const __vite_ssr_export_default__ = {}" `) }) @@ -347,7 +347,7 @@ test('dynamic import', async () => { ) expect(result?.code).toMatchInlineSnapshot( ` - "Object.defineProperty(__vite_ssr_exports__, "i", { enumerable: true, configurable: true, get(){ try { return i } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "i", { enumerable: true, configurable: true, get(){ try { return i } catch {} }}); const i = () => __vite_ssr_dynamic_import__('./foo')" `, ) @@ -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(){ try { return A } catch {} }}); - Object.defineProperty(__vite_ssr_exports__, "B", { enumerable: true, configurable: true, get(){ try { return B } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return A } catch {} }}); + globalThis.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 {}" @@ -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(){ try { return __vite_ssr_export_default__ } catch {} }}); + "globalThis.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(){ try { return __vite_ssr_export_default__ } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }}); const __vite_ssr_export_default__ = class {} " `) @@ -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(){ try { return foo } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return foo } catch {} }}); function foo() {}; foo.prototype = Object.prototype;" `) @@ -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(){ try { return A } catch {} }}); - Object.defineProperty(__vite_ssr_exports__, "B", { enumerable: true, configurable: true, get(){ try { return B } catch {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return A } catch {} }}); + globalThis.Object.defineProperty(__vite_ssr_exports__, "B", { enumerable: true, configurable: true, get(){ try { return B } catch {} }}); class A {}; class B extends A {}" `) @@ -988,8 +988,8 @@ export function fn1() { `, ), ).toMatchInlineSnapshot(` - "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 {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "fn1", { enumerable: true, configurable: true, get(){ try { return fn1 } catch {} }}); + globalThis.Object.defineProperty(__vite_ssr_exports__, "fn2", { enumerable: true, configurable: true, get(){ try { return fn2 } catch {} }}); function fn1() { };function fn2() { @@ -1011,7 +1011,7 @@ export default (function getRandom() { `.trim() expect(await ssrTransformSimpleCode(code)).toMatchInlineSnapshot(` - "Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }}); + "globalThis.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(); });" @@ -1019,7 +1019,7 @@ export default (function getRandom() { expect(await ssrTransformSimpleCode(`export default (class A {});`)) .toMatchInlineSnapshot(` - "Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }}); + "globalThis.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 {});" `) }) @@ -1095,7 +1095,7 @@ export class Test { };`.trim() expect(await ssrTransformSimpleCode(code)).toMatchInlineSnapshot(` - "Object.defineProperty(__vite_ssr_exports__, "Test", { enumerable: true, configurable: true, get(){ try { return Test } catch {} }}); + "globalThis.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'; @@ -1285,8 +1285,8 @@ export * as bar from './bar' console.log(bar) `), ).toMatchInlineSnapshot(` - "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 {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "default", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_export_default__ } catch {} }}); + globalThis.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)(); @@ -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(){ 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 {} }}); + "globalThis.Object.defineProperty(__vite_ssr_exports__, "b", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_1__.b } catch {} }}); + globalThis.Object.defineProperty(__vite_ssr_exports__, "d", { enumerable: true, configurable: true, get(){ try { return __vite_ssr_import_3__ } catch {} }}); + globalThis.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__); diff --git a/packages/vite/src/node/ssr/runtime/__tests__/fixtures/top-level-object.js b/packages/vite/src/node/ssr/runtime/__tests__/fixtures/top-level-object.js new file mode 100644 index 00000000000000..e5a6d27e67665c --- /dev/null +++ b/packages/vite/src/node/ssr/runtime/__tests__/fixtures/top-level-object.js @@ -0,0 +1,2 @@ +const Object = "my-object"; +export { Object }; diff --git a/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts b/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts index 2942856f780ea8..870809370c1a1d 100644 --- a/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts +++ b/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts @@ -390,6 +390,15 @@ describe('module runner initialization', async () => { `, ) }) + + it(`handle Object variable`, async ({ runner }) => { + const mod = await runner.import('/fixtures/top-level-object.js') + expect(mod).toMatchInlineSnapshot(` + { + "Object": "my-object", + } + `) + }) }) describe('optimize-deps', async () => { diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 8d68110e489a97..3181cf11a05186 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -182,7 +182,7 @@ async function ssrTransformScript( // wrap with try/catch to fallback to `undefined` for backward compat. s.appendLeft( fileStartIndex, - `Object.defineProperty(${ssrModuleExportsKey}, ${JSON.stringify(name)}, ` + + `globalThis.Object.defineProperty(${ssrModuleExportsKey}, ${JSON.stringify(name)}, ` + `{ enumerable: true, configurable: true, get(){ try { return ${local} } catch {} }});\n`, ) }