diff --git a/packages/vitest/src/runtime/moduleRunner/moduleRunner.ts b/packages/vitest/src/runtime/moduleRunner/moduleRunner.ts index 5d4f7dcad..2099d708d 100644 --- a/packages/vitest/src/runtime/moduleRunner/moduleRunner.ts +++ b/packages/vitest/src/runtime/moduleRunner/moduleRunner.ts @@ -87,6 +87,17 @@ export class VitestModuleRunner extends viteModuleRunner.ModuleRunner { } } + /** + * Vite checks that the module has exports emulating the Node.js behaviour, + * but Vitest is more relaxed. + * + * We should keep the Vite behavour when there is a `strict` flag. + * @internal + */ + processImport(exports: Record): Record { + return exports + } + public async import(rawId: string): Promise { const resolved = await this.vitestOptions.transport.resolveId(rawId) return super.import(resolved ? resolved.url : rawId) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc30dbec5..829577f1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1244,6 +1244,9 @@ importers: '@standard-schema/spec': specifier: ^1.0.0 version: 1.0.0 + '@test/dep-esm-non-existing': + specifier: link:./deps/dep-esm-non-existing + version: link:deps/dep-esm-non-existing '@test/vite-environment-external': specifier: link:./projects/vite-environment-external version: link:projects/vite-environment-external diff --git a/test/core/deps/dep-esm-non-existing/index.mjs b/test/core/deps/dep-esm-non-existing/index.mjs new file mode 100644 index 000000000..e69de29bb diff --git a/test/core/deps/dep-esm-non-existing/index.mts b/test/core/deps/dep-esm-non-existing/index.mts new file mode 100644 index 000000000..de6ff4475 --- /dev/null +++ b/test/core/deps/dep-esm-non-existing/index.mts @@ -0,0 +1 @@ +export type NonExported = true diff --git a/test/core/deps/dep-esm-non-existing/package.json b/test/core/deps/dep-esm-non-existing/package.json new file mode 100644 index 000000000..0ead8ed77 --- /dev/null +++ b/test/core/deps/dep-esm-non-existing/package.json @@ -0,0 +1,5 @@ +{ + "name": "@test/dep-esm-non-existing", + "type": "module", + "main": "./index.mjs" +} diff --git a/test/core/package.json b/test/core/package.json index 1fc4e6013..953c0b958 100644 --- a/test/core/package.json +++ b/test/core/package.json @@ -14,6 +14,7 @@ }, "devDependencies": { "@standard-schema/spec": "^1.0.0", + "@test/dep-esm-non-existing": "link:./deps/dep-esm-non-existing", "@test/vite-environment-external": "link:./projects/vite-environment-external", "@test/vite-external": "link:./projects/vite-external", "@types/debug": "catalog:", diff --git a/test/core/test/imports.test.ts b/test/core/test/imports.test.ts index 3832aec96..eed9d40a9 100644 --- a/test/core/test/imports.test.ts +++ b/test/core/test/imports.test.ts @@ -1,5 +1,6 @@ import { mkdir, writeFile } from 'node:fs/promises' import { fileURLToPath } from 'node:url' +import { NonExported } from '@test/dep-esm-non-existing' import { resolve } from 'pathe' import { describe, expect, test, vi } from 'vitest' // @ts-expect-error module is not typed @@ -7,6 +8,11 @@ import promiseExport from '../src/cjs/promise-export' import { dynamicRelativeImport } from '../src/relative-import' +test('can import type from an ESM dependency', () => { + // @ts-expect-error NonExported is type + expect(NonExported).toBe(undefined) +}) + test('promise export works correctly', async () => { await expect(promiseExport).resolves.toEqual({ value: 42 }) }) diff --git a/test/core/vite.config.ts b/test/core/vite.config.ts index a7bbd1909..ff2ee56b3 100644 --- a/test/core/vite.config.ts +++ b/test/core/vite.config.ts @@ -91,6 +91,7 @@ export default defineConfig({ /packages\/web-worker/, /\.wasm$/, /\/wasm-bindgen-no-cyclic\/index_bg.js/, + /dep-esm-non-existing/, ], inline: ['inline-lib'], },