diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index 998464fc2028..fa4b71eb958f 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -273,7 +273,7 @@ export class ViteNodeRunner { // returns undefined, when accessing named exports, if default is not an object // but is still present inside hasOwnKeys, this is Node behaviour for CJS - if (exports.default === null || typeof exports.default !== 'object') { + if (isPrimitive(exports.default)) { defineExport(exports, p, () => undefined) return true } diff --git a/test/cjs/src/default-function.cjs b/test/cjs/src/default-function.cjs new file mode 100644 index 000000000000..db64778ef506 --- /dev/null +++ b/test/cjs/src/default-function.cjs @@ -0,0 +1,8 @@ +'use strict' + +function format() { + return '' +} + +module.exports = format +module.exports.default = format diff --git a/test/cjs/src/default-function.d.cts b/test/cjs/src/default-function.d.cts new file mode 100644 index 000000000000..542d181f0123 --- /dev/null +++ b/test/cjs/src/default-function.d.cts @@ -0,0 +1,3 @@ +declare function format(): string + +export default format diff --git a/test/cjs/test/function-default.test.ts b/test/cjs/test/function-default.test.ts new file mode 100644 index 000000000000..51b4b6b930c0 --- /dev/null +++ b/test/cjs/test/function-default.test.ts @@ -0,0 +1,13 @@ +import { describe, expect, it } from 'vitest' +import format from '../src/default-function.cjs' + +describe('correctly puts default on default', () => { + it('works on default function', () => { + expect(format()).toBe('') + }) + + it('works on nested default function', () => { + // @ts-expect-error types defined only default + expect(format.default()).toBe('') + }) +})