From 847806855757cbf386f6b325691ea157ae513d7f Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 3 May 2025 15:08:42 +0900 Subject: [PATCH 1/3] fix(ssr)!: don't access `Object` variable in module scope --- package.json | 3 +- packages/vite/src/module-runner/constants.ts | 1 + .../vite/src/module-runner/esmEvaluator.ts | 3 + packages/vite/src/module-runner/runner.ts | 7 ++ packages/vite/src/module-runner/types.ts | 2 + .../node/ssr/__tests__/ssrLoadModule.spec.ts | 2 +- .../node/ssr/__tests__/ssrTransform.spec.ts | 70 +++++++++---------- packages/vite/src/node/ssr/ssrTransform.ts | 4 +- patches/vite-node.patch | 16 +++++ pnpm-lock.yaml | 7 +- 10 files changed, 74 insertions(+), 41 deletions(-) create mode 100644 patches/vite-node.patch diff --git a/package.json b/package.json index c3e82b33ef3da6..f3b545f556c469 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,8 @@ "http-proxy@1.18.1": "patches/http-proxy@1.18.1.patch", "sirv@3.0.1": "patches/sirv@3.0.1.patch", "chokidar@3.6.0": "patches/chokidar@3.6.0.patch", - "dotenv-expand@12.0.2": "patches/dotenv-expand@12.0.2.patch" + "dotenv-expand@12.0.2": "patches/dotenv-expand@12.0.2.patch", + "vite-node": "patches/vite-node.patch" }, "peerDependencyRules": { "allowedVersions": { diff --git a/packages/vite/src/module-runner/constants.ts b/packages/vite/src/module-runner/constants.ts index 9c0f1cb8944395..b850d69ac4b680 100644 --- a/packages/vite/src/module-runner/constants.ts +++ b/packages/vite/src/module-runner/constants.ts @@ -3,4 +3,5 @@ export const ssrModuleExportsKey = `__vite_ssr_exports__` export const ssrImportKey = `__vite_ssr_import__` export const ssrDynamicImportKey = `__vite_ssr_dynamic_import__` export const ssrExportAllKey = `__vite_ssr_exportAll__` +export const ssrExportNameKey = `__vite_ssr_exportName__` export const ssrImportMetaKey = `__vite_ssr_import_meta__` diff --git a/packages/vite/src/module-runner/esmEvaluator.ts b/packages/vite/src/module-runner/esmEvaluator.ts index 003d6b2d242b88..c441aea76b9dc1 100644 --- a/packages/vite/src/module-runner/esmEvaluator.ts +++ b/packages/vite/src/module-runner/esmEvaluator.ts @@ -5,6 +5,7 @@ import { import { ssrDynamicImportKey, ssrExportAllKey, + ssrExportNameKey, ssrImportKey, ssrImportMetaKey, ssrModuleExportsKey, @@ -25,6 +26,7 @@ export class ESModulesEvaluator implements ModuleEvaluator { ssrImportKey, ssrDynamicImportKey, ssrExportAllKey, + ssrExportNameKey, // source map should already be inlined by Vite '"use strict";' + code, ) @@ -35,6 +37,7 @@ export class ESModulesEvaluator implements ModuleEvaluator { context[ssrImportKey], context[ssrDynamicImportKey], context[ssrExportAllKey], + context[ssrExportNameKey], ) Object.seal(context[ssrModuleExportsKey]) diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 339b6a6a8908e6..451aa6cb2d9ad1 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -25,6 +25,7 @@ import { import { ssrDynamicImportKey, ssrExportAllKey, + ssrExportNameKey, ssrImportKey, ssrImportMetaKey, ssrModuleExportsKey, @@ -405,6 +406,12 @@ export class ModuleRunner { [ssrDynamicImportKey]: dynamicRequest, [ssrModuleExportsKey]: exports, [ssrExportAllKey]: (obj: any) => exportAll(exports, obj), + [ssrExportNameKey]: (name, getter) => + Object.defineProperty(exports, name, { + enumerable: true, + configurable: true, + get: getter, + }), [ssrImportMetaKey]: meta, } diff --git a/packages/vite/src/module-runner/types.ts b/packages/vite/src/module-runner/types.ts index e4595f19cdabea..a5b4c711a8939a 100644 --- a/packages/vite/src/module-runner/types.ts +++ b/packages/vite/src/module-runner/types.ts @@ -15,6 +15,7 @@ import type { EvaluatedModuleNode, EvaluatedModules } from './evaluatedModules' import type { ssrDynamicImportKey, ssrExportAllKey, + ssrExportNameKey, ssrImportKey, ssrImportMetaKey, ssrModuleExportsKey, @@ -38,6 +39,7 @@ export interface ModuleRunnerContext { options?: ImportCallOptions, ) => Promise [ssrExportAllKey]: (obj: any) => void + [ssrExportNameKey]: (name: string, getter: () => unknown) => void [ssrImportMetaKey]: ModuleRunnerImportMeta } diff --git a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts index d878ed09a7e6a6..4c61de7052ecd7 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(`165`) }) 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..7430012b7c8725 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 {} }}); + "__vite_ssr_exportName__("foo", () => { 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 {} }}); + "__vite_ssr_exportName__("foo", () => { 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 {} }}); + "__vite_ssr_exportName__("a", () => { try { return a } catch {} }); + __vite_ssr_exportName__("b", () => { 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 {} }}); + "__vite_ssr_exportName__("a", () => { try { return a } catch {} }); + __vite_ssr_exportName__("c", () => { 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 {} }}); + "__vite_ssr_exportName__("ref", () => { try { return __vite_ssr_import_0__.ref } catch {} }); + __vite_ssr_exportName__("c", () => { 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 {} }}); + "__vite_ssr_exportName__("createApp", () => { 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 {} }}); + "__vite_ssr_exportName__("foo", () => { 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 {} }}); + "__vite_ssr_exportName__("foo", () => { 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 {} }}); + "__vite_ssr_exportName__("foo", () => { 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 {} }}); + "__vite_ssr_exportName__("foo", () => { 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 {} }}); + "__vite_ssr_exportName__("arbitrary string", () => { 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 {} }}); + "__vite_ssr_exportName__("arbitrary string", () => { 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 {} }}); + "__vite_ssr_exportName__("arbitrary string", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { 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 {} }}); + "__vite_ssr_exportName__("i", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { try { return A } catch {} }); + __vite_ssr_exportName__("B", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { try { return A } catch {} }); + __vite_ssr_exportName__("B", () => { 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 {} }}); + "__vite_ssr_exportName__("fn1", () => { try { return fn1 } catch {} }); + __vite_ssr_exportName__("fn2", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { 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 {} }}); + "__vite_ssr_exportName__("Test", () => { 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 {} }}); + "__vite_ssr_exportName__("default", () => { try { return __vite_ssr_export_default__ } catch {} }); + __vite_ssr_exportName__("bar", () => { 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 {} }}); + "__vite_ssr_exportName__("b", () => { try { return __vite_ssr_import_1__.b } catch {} }); + __vite_ssr_exportName__("d", () => { try { return __vite_ssr_import_3__ } catch {} }); + __vite_ssr_exportName__("A", () => { 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/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 8d68110e489a97..fb02e44ad5846a 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -43,6 +43,7 @@ export const ssrModuleExportsKey = `__vite_ssr_exports__` export const ssrImportKey = `__vite_ssr_import__` export const ssrDynamicImportKey = `__vite_ssr_dynamic_import__` export const ssrExportAllKey = `__vite_ssr_exportAll__` +export const ssrExportNameKey = `__vite_ssr_exportName__` export const ssrImportMetaKey = `__vite_ssr_import_meta__` const hashbangRE = /^#!.*\n/ @@ -182,8 +183,7 @@ async function ssrTransformScript( // wrap with try/catch to fallback to `undefined` for backward compat. s.appendLeft( fileStartIndex, - `Object.defineProperty(${ssrModuleExportsKey}, ${JSON.stringify(name)}, ` + - `{ enumerable: true, configurable: true, get(){ try { return ${local} } catch {} }});\n`, + `${ssrExportNameKey}(${JSON.stringify(name)}, () => { try { return ${local} } catch {} });\n`, ) } diff --git a/patches/vite-node.patch b/patches/vite-node.patch new file mode 100644 index 00000000000000..029b7370dc8dce --- /dev/null +++ b/patches/vite-node.patch @@ -0,0 +1,16 @@ +diff --git a/dist/client.mjs b/dist/client.mjs +index 3d769de748044f6eb25e70d5803169c3d6cfc889..943aceabe74dadf96107b8965c9b65522ae2c050 100644 +--- a/dist/client.mjs ++++ b/dist/client.mjs +@@ -309,6 +309,11 @@ class ViteNodeRunner { + __vite_ssr_dynamic_import__: request, + __vite_ssr_exports__: exports, + __vite_ssr_exportAll__: (obj) => exportAll(exports, obj), ++ __vite_ssr_exportName__: (name, getter) => Object.defineProperty(exports, name, { ++ enumerable: true, ++ configurable: true, ++ get: getter, ++ }), + __vite_ssr_import_meta__: meta, + require: createRequire(href), + exports: cjsExports, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2eaba5ce579f07..a39ef952993447 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,9 @@ patchedDependencies: sirv@3.0.1: hash: 95b663b930c5cc6e609c7fa15b69a86ff3b30df68978611d1d3d724c65135cb1 path: patches/sirv@3.0.1.patch + vite-node: + hash: aa6923b4c36784da9d52ca43140e9ad2e73e0fb2d31e7be05ad2f247b91ded40 + path: patches/vite-node.patch importers: @@ -13634,7 +13637,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.1: + vite-node@3.1.1(patch_hash=aa6923b4c36784da9d52ca43140e9ad2e73e0fb2d31e7be05ad2f247b91ded40): dependencies: cac: 6.7.14 debug: 4.4.0 @@ -13729,7 +13732,7 @@ snapshots: tinypool: 1.0.2 tinyrainbow: 2.0.0 vite: link:packages/vite - vite-node: 3.1.1 + vite-node: 3.1.1(patch_hash=aa6923b4c36784da9d52ca43140e9ad2e73e0fb2d31e7be05ad2f247b91ded40) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 From 9ac01e34c533bbf15ced52de371256fda2b686f3 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 3 May 2025 15:17:39 +0900 Subject: [PATCH 2/3] test: add test --- .../ssr/runtime/__tests__/fixtures/top-level-object.js | 2 ++ .../node/ssr/runtime/__tests__/server-runtime.spec.ts | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 packages/vite/src/node/ssr/runtime/__tests__/fixtures/top-level-object.js 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 () => { From 92cc912102722b6c1861a1c52d2f39298bf9729b Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 29 May 2025 09:24:03 +0900 Subject: [PATCH 3/3] chore: use vitest beta --- package.json | 5 +- patches/vite-node.patch | 16 ------ pnpm-lock.yaml | 108 ++++++++++++++++++++++------------------ 3 files changed, 62 insertions(+), 67 deletions(-) delete mode 100644 patches/vite-node.patch diff --git a/package.json b/package.json index 50b4ede80a32c3..b17a8380dbb069 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "typescript": "~5.7.2", "typescript-eslint": "^8.32.1", "vite": "workspace:*", - "vitest": "^3.1.4" + "vitest": "3.2.0-beta.3" }, "simple-git-hooks": { "pre-commit": "pnpm exec lint-staged --concurrent false" @@ -100,8 +100,7 @@ "http-proxy@1.18.1": "patches/http-proxy@1.18.1.patch", "sirv@3.0.1": "patches/sirv@3.0.1.patch", "chokidar@3.6.0": "patches/chokidar@3.6.0.patch", - "dotenv-expand@12.0.2": "patches/dotenv-expand@12.0.2.patch", - "vite-node": "patches/vite-node.patch" + "dotenv-expand@12.0.2": "patches/dotenv-expand@12.0.2.patch" }, "peerDependencyRules": { "allowedVersions": { diff --git a/patches/vite-node.patch b/patches/vite-node.patch deleted file mode 100644 index 029b7370dc8dce..00000000000000 --- a/patches/vite-node.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/dist/client.mjs b/dist/client.mjs -index 3d769de748044f6eb25e70d5803169c3d6cfc889..943aceabe74dadf96107b8965c9b65522ae2c050 100644 ---- a/dist/client.mjs -+++ b/dist/client.mjs -@@ -309,6 +309,11 @@ class ViteNodeRunner { - __vite_ssr_dynamic_import__: request, - __vite_ssr_exports__: exports, - __vite_ssr_exportAll__: (obj) => exportAll(exports, obj), -+ __vite_ssr_exportName__: (name, getter) => Object.defineProperty(exports, name, { -+ enumerable: true, -+ configurable: true, -+ get: getter, -+ }), - __vite_ssr_import_meta__: meta, - require: createRequire(href), - exports: cjsExports, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 146d69656d0865..a3b5fa7b322535 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,9 +22,6 @@ patchedDependencies: sirv@3.0.1: hash: 95b663b930c5cc6e609c7fa15b69a86ff3b30df68978611d1d3d724c65135cb1 path: patches/sirv@3.0.1.patch - vite-node: - hash: aa6923b4c36784da9d52ca43140e9ad2e73e0fb2d31e7be05ad2f247b91ded40 - path: patches/vite-node.patch importers: @@ -127,8 +124,8 @@ importers: specifier: workspace:* version: link:packages/vite vitest: - specifier: ^3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@22.15.21) + specifier: 3.2.0-beta.3 + version: 3.2.0-beta.3(@types/debug@4.1.12)(@types/node@22.15.21) docs: devDependencies: @@ -3350,6 +3347,9 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -3362,6 +3362,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/escape-html@1.0.4': resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} @@ -3883,11 +3886,11 @@ packages: '@vitejs/test-worker-exports@file:playground/ssr-webworker/worker-exports': resolution: {directory: playground/ssr-webworker/worker-exports, type: directory} - '@vitest/expect@3.1.4': - resolution: {integrity: sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==} + '@vitest/expect@3.2.0-beta.3': + resolution: {integrity: sha512-kwsUo0cWymcVexKYx6/mxURmXsoJHPSF48FBZKM5tK7ndOSXzkuOm24ZaJeU41HSwh5UQ3KsAivW8um7aswERQ==} - '@vitest/mocker@3.1.4': - resolution: {integrity: sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==} + '@vitest/mocker@3.2.0-beta.3': + resolution: {integrity: sha512-2vweuYiZfIi+dpMaa7sZPDt3cQov1yzjxdmr3p0G/StH0asPauFi6wxAdJkekXlMO4et69yG5NYEq3ORMMTdeA==} peerDependencies: msw: ^2.4.9 vite: workspace:* @@ -3897,20 +3900,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.1.4': - resolution: {integrity: sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==} + '@vitest/pretty-format@3.2.0-beta.3': + resolution: {integrity: sha512-Q6S0xqxK9I6rHlDoWEKWWjzElguQdSdCXeD/0YcI6vZgPsDwYkhKWvh1yOYciEYfDt5x/tzZXVi1FVuoWlIbEg==} - '@vitest/runner@3.1.4': - resolution: {integrity: sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==} + '@vitest/runner@3.2.0-beta.3': + resolution: {integrity: sha512-tc9d35sKwWltMO7hsoLRTyzvbmZo5WKM+dxIriOqJiDulZOKsQA3DZjnFJITxWvqkoHc+q+Hc6x0a2HWn7JdrA==} - '@vitest/snapshot@3.1.4': - resolution: {integrity: sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==} + '@vitest/snapshot@3.2.0-beta.3': + resolution: {integrity: sha512-bLGgmpl9knKv1EJde5THe4eGqmZpb+Vv97Kq0t3lP8uYN1viID4lVsg1swSXtIAd0F1/anx4Uiu3Bp71hmFlow==} - '@vitest/spy@3.1.4': - resolution: {integrity: sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==} + '@vitest/spy@3.2.0-beta.3': + resolution: {integrity: sha512-pfAqZ3VFdg2pPe64UfEGUUrv+CGgv1Wvt6GZ6rSFtbMsHiE+eiz7ggFDbUewDnxbmJRA/Kg+MiUF5jkw7s358A==} - '@vitest/utils@3.1.4': - resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==} + '@vitest/utils@3.2.0-beta.3': + resolution: {integrity: sha512-Q0+cNz5L/6ItK4JAnNu2n46sNeb6p9aXumg4st4bYRaNtAB8A6hiaM5kxNZS+6f67I6SYwSjg9na9JMdmHy4qg==} '@volar/language-core@2.4.11': resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} @@ -7155,8 +7158,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.1.4: - resolution: {integrity: sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==} + vite-node@3.2.0-beta.3: + resolution: {integrity: sha512-9dVQ1mfU3slc6CzcS9tiDHGN8EZYFBRzMYDEGx6kMSeDdm8dV/Xj9snKN/by1mVbhgFr2ftG93XVAK3RHvIFMw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -7181,16 +7184,16 @@ packages: postcss: optional: true - vitest@3.1.4: - resolution: {integrity: sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==} + vitest@3.2.0-beta.3: + resolution: {integrity: sha512-GjTDFg01DWVJyjBp/r5ye9Nk6cgYE6A9hizUjWwfB2REUj6xPEJ3VCx652eC2wfdZVrJ9rIvEDadYQzrutIoeg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.4 - '@vitest/ui': 3.1.4 + '@vitest/browser': 3.2.0-beta.3 + '@vitest/ui': 3.2.0-beta.3 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -9005,6 +9008,10 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 22.15.21 + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/connect@3.4.38': dependencies: '@types/node': 22.15.21 @@ -9019,6 +9026,8 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/escape-html@1.0.4': {} '@types/estree@1.0.7': {} @@ -9482,43 +9491,44 @@ snapshots: '@vitejs/test-worker-exports@file:playground/ssr-webworker/worker-exports': {} - '@vitest/expect@3.1.4': + '@vitest/expect@3.2.0-beta.3': dependencies: - '@vitest/spy': 3.1.4 - '@vitest/utils': 3.1.4 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.0-beta.3 + '@vitest/utils': 3.2.0-beta.3 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.4(vite@packages+vite)': + '@vitest/mocker@3.2.0-beta.3(vite@packages+vite)': dependencies: - '@vitest/spy': 3.1.4 + '@vitest/spy': 3.2.0-beta.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: vite: link:packages/vite - '@vitest/pretty-format@3.1.4': + '@vitest/pretty-format@3.2.0-beta.3': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.4': + '@vitest/runner@3.2.0-beta.3': dependencies: - '@vitest/utils': 3.1.4 + '@vitest/utils': 3.2.0-beta.3 pathe: 2.0.3 - '@vitest/snapshot@3.1.4': + '@vitest/snapshot@3.2.0-beta.3': dependencies: - '@vitest/pretty-format': 3.1.4 + '@vitest/pretty-format': 3.2.0-beta.3 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.4': + '@vitest/spy@3.2.0-beta.3': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.1.4': + '@vitest/utils@3.2.0-beta.3': dependencies: - '@vitest/pretty-format': 3.1.4 + '@vitest/pretty-format': 3.2.0-beta.3 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -13043,7 +13053,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.4(patch_hash=aa6923b4c36784da9d52ca43140e9ad2e73e0fb2d31e7be05ad2f247b91ded40): + vite-node@3.2.0-beta.3: dependencies: cac: 6.7.14 debug: 4.4.1 @@ -13120,20 +13130,22 @@ snapshots: - typescript - universal-cookie - vitest@3.1.4(@types/debug@4.1.12)(@types/node@22.15.21): + vitest@3.2.0-beta.3(@types/debug@4.1.12)(@types/node@22.15.21): dependencies: - '@vitest/expect': 3.1.4 - '@vitest/mocker': 3.1.4(vite@packages+vite) - '@vitest/pretty-format': 3.1.4 - '@vitest/runner': 3.1.4 - '@vitest/snapshot': 3.1.4 - '@vitest/spy': 3.1.4 - '@vitest/utils': 3.1.4 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.0-beta.3 + '@vitest/mocker': 3.2.0-beta.3(vite@packages+vite) + '@vitest/pretty-format': 3.2.0-beta.3 + '@vitest/runner': 3.2.0-beta.3 + '@vitest/snapshot': 3.2.0-beta.3 + '@vitest/spy': 3.2.0-beta.3 + '@vitest/utils': 3.2.0-beta.3 chai: 5.2.0 debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 + picomatch: 4.0.2 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 @@ -13141,7 +13153,7 @@ snapshots: tinypool: 1.0.2 tinyrainbow: 2.0.0 vite: link:packages/vite - vite-node: 3.1.4(patch_hash=aa6923b4c36784da9d52ca43140e9ad2e73e0fb2d31e7be05ad2f247b91ded40) + vite-node: 3.2.0-beta.3 why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12