From 2b13547a5f72f033bf300fb737b84252a98fe9b4 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 18 May 2026 16:30:36 +0900 Subject: [PATCH] fix: apply cjs interop for truthy `__esModule` (#10363) --- .../runtime/moduleRunner/moduleEvaluator.ts | 2 +- test/unit/deps/dep-cjs/esmodule-false.js | 2 + test/unit/deps/dep-cjs/esmodule.js | 2 + test/unit/deps/dep-cjs/package.json | 2 + test/unit/test/interop.test.ts | 44 +++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 test/unit/deps/dep-cjs/esmodule-false.js create mode 100644 test/unit/deps/dep-cjs/esmodule.js create mode 100644 test/unit/test/interop.test.ts diff --git a/packages/vitest/src/runtime/moduleRunner/moduleEvaluator.ts b/packages/vitest/src/runtime/moduleRunner/moduleEvaluator.ts index 297840c70c67..9fc24fd352f7 100644 --- a/packages/vitest/src/runtime/moduleRunner/moduleEvaluator.ts +++ b/packages/vitest/src/runtime/moduleRunner/moduleEvaluator.ts @@ -531,7 +531,7 @@ function interopModule(mod: any) { let defaultExport = 'default' in mod ? mod.default : mod - if (!isPrimitive(defaultExport) && '__esModule' in defaultExport) { + if (!isPrimitive(defaultExport) && defaultExport.__esModule) { mod = defaultExport if ('default' in defaultExport) { defaultExport = defaultExport.default diff --git a/test/unit/deps/dep-cjs/esmodule-false.js b/test/unit/deps/dep-cjs/esmodule-false.js new file mode 100644 index 000000000000..a9fdd6494cfd --- /dev/null +++ b/test/unit/deps/dep-cjs/esmodule-false.js @@ -0,0 +1,2 @@ +exports.__esModule = false +exports.test = 'hello' diff --git a/test/unit/deps/dep-cjs/esmodule.js b/test/unit/deps/dep-cjs/esmodule.js new file mode 100644 index 000000000000..6d1bd23dd125 --- /dev/null +++ b/test/unit/deps/dep-cjs/esmodule.js @@ -0,0 +1,2 @@ +exports.__esModule = true +exports.test = 'hello' diff --git a/test/unit/deps/dep-cjs/package.json b/test/unit/deps/dep-cjs/package.json index f424b60c62fb..1d7e46883ea9 100644 --- a/test/unit/deps/dep-cjs/package.json +++ b/test/unit/deps/dep-cjs/package.json @@ -2,6 +2,8 @@ "name": "@vitest/test-dep-cjs", "type": "commonjs", "exports": { + "./esmodule": "./esmodule.js", + "./esmodule-false": "./esmodule-false.js", "./esm-comment": "./esm-comment.js", "./esm-string": "./esm-string.js" } diff --git a/test/unit/test/interop.test.ts b/test/unit/test/interop.test.ts new file mode 100644 index 000000000000..88709c220b0c --- /dev/null +++ b/test/unit/test/interop.test.ts @@ -0,0 +1,44 @@ +// @ts-expect-error no type +import * as esModule from '@vitest/test-dep-cjs/esmodule' +// @ts-expect-error no type +import * as esModuleFalse from '@vitest/test-dep-cjs/esmodule-false' +import { expect, test } from 'vitest' + +const nodeMajor = Number(process.versions.node.split('.')[0]) + +test('interop', async ({ task }) => { + expect(esModule).toMatchInlineSnapshot(` + { + "__esModule": true, + "test": "hello", + } + `) + if (task.file.projectName === 'vmThreads' || nodeMajor < 23) { + expect(esModuleFalse).toMatchInlineSnapshot(` + { + "__esModule": false, + "default": { + "__esModule": false, + "test": "hello", + }, + "test": "hello", + } + `) + } + else { + expect(esModuleFalse).toMatchInlineSnapshot(` + { + "__esModule": false, + "default": { + "__esModule": false, + "test": "hello", + }, + "module.exports": { + "__esModule": false, + "test": "hello", + }, + "test": "hello", + } + `) + } +})