From aa8e66250ecde3a005208d90dd86cf8fce64193b Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 14 Nov 2022 13:59:21 +0100 Subject: [PATCH] fix: don't ignore properties, when put on a default function in CJS context (#2325) * fix: don't ignore "default" key, when put on a function in CJS context * test: test case for default.default --- packages/vite-node/src/client.ts | 2 +- test/cjs/src/default-function.cjs | 8 ++++++++ test/cjs/src/default-function.d.cts | 3 +++ test/cjs/test/function-default.test.ts | 13 +++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/cjs/src/default-function.cjs create mode 100644 test/cjs/src/default-function.d.cts create mode 100644 test/cjs/test/function-default.test.ts 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('') + }) +})