From a431df80b3d30976c54e3acb45b9b71c1169263f Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sun, 25 Dec 2022 11:13:16 +0300 Subject: [PATCH] fix: correctly automock nested interoped defaults (#2559) * fix: correctly automock nested interoped defaults * chore: cleanup * chore: cleanup --- examples/mocks/src/external/cjs-pseudoesm.cjs | 4 ++++ examples/mocks/src/external/default-cjs.cjs | 1 + .../mocks/src/{ => external}/external.mjs | 0 examples/mocks/test/external.test.ts | 2 +- examples/mocks/test/nested-default.spec.ts | 9 +++++++++ examples/mocks/vite.config.ts | 2 +- packages/vite-node/src/client.ts | 20 +++++++++++++++++++ 7 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 examples/mocks/src/external/cjs-pseudoesm.cjs create mode 100644 examples/mocks/src/external/default-cjs.cjs rename examples/mocks/src/{ => external}/external.mjs (100%) create mode 100644 examples/mocks/test/nested-default.spec.ts diff --git a/examples/mocks/src/external/cjs-pseudoesm.cjs b/examples/mocks/src/external/cjs-pseudoesm.cjs new file mode 100644 index 000000000000..742bcf4d21d9 --- /dev/null +++ b/examples/mocks/src/external/cjs-pseudoesm.cjs @@ -0,0 +1,4 @@ +const fn = () => {} + +exports.fn = fn +Object.defineProperty(exports, '__esModule', { value: true, enumerable: false }) diff --git a/examples/mocks/src/external/default-cjs.cjs b/examples/mocks/src/external/default-cjs.cjs new file mode 100644 index 000000000000..588e242a2f73 --- /dev/null +++ b/examples/mocks/src/external/default-cjs.cjs @@ -0,0 +1 @@ +module.exports = require('./cjs-pseudoesm.cjs') diff --git a/examples/mocks/src/external.mjs b/examples/mocks/src/external/external.mjs similarity index 100% rename from examples/mocks/src/external.mjs rename to examples/mocks/src/external/external.mjs diff --git a/examples/mocks/test/external.test.ts b/examples/mocks/test/external.test.ts index 1142e26c01c7..fcdb8a631567 100644 --- a/examples/mocks/test/external.test.ts +++ b/examples/mocks/test/external.test.ts @@ -1,4 +1,4 @@ -import '../src/external.mjs' +import '../src/external/external.mjs' import { expect, test, vi } from 'vitest' import axios from 'axios' diff --git a/examples/mocks/test/nested-default.spec.ts b/examples/mocks/test/nested-default.spec.ts new file mode 100644 index 000000000000..e242f17ab889 --- /dev/null +++ b/examples/mocks/test/nested-default.spec.ts @@ -0,0 +1,9 @@ +// @vitest-environment jsdom + +import * as modDefaultCjs from '../src/external/default-cjs.cjs' + +vi.mock('../src/external/default-cjs.cjs') + +test('default is mocked', () => { + expect(vi.isMockFunction(modDefaultCjs.default.fn)).toBe(true) +}) diff --git a/examples/mocks/vite.config.ts b/examples/mocks/vite.config.ts index b1984f3093d5..46dc4f567ccf 100644 --- a/examples/mocks/vite.config.ts +++ b/examples/mocks/vite.config.ts @@ -24,7 +24,7 @@ export default defineConfig({ globals: true, environment: 'node', deps: { - external: [/src\/external\.mjs/], + external: [/src\/external/], }, }, }) diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index f7e3d789a73e..cee1de50f15f 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -414,6 +414,26 @@ export class ViteNodeRunner { return defaultExport !== undefined return prop in mod || (defaultExport && prop in defaultExport) }, + // this is needed for mocker to know what is available to mock + ownKeys(mod) { + const keys = Reflect.ownKeys(mod) + if (!defaultExport || isPrimitive(defaultExport)) + return keys + const allKeys = [...keys, 'default', ...Reflect.ownKeys(defaultExport)] + return Array.from(new Set(allKeys)) + }, + getOwnPropertyDescriptor(mod, prop) { + const descriptor = Reflect.getOwnPropertyDescriptor(mod, prop) + if (descriptor) + return descriptor + if (prop === 'default' && defaultExport !== undefined) { + return { + value: defaultExport, + enumerable: true, + configurable: true, + } + } + }, }) } }