From 84287fc27b981723647e69c558b257bd67b9f5f6 Mon Sep 17 00:00:00 2001 From: Adam Hines Date: Thu, 16 Jan 2025 05:50:14 -0700 Subject: [PATCH] fix: re-apply default conditions if using vite 6 or later (#7071) Co-authored-by: thebanjomatic Co-authored-by: Hiroshi Ogawa --- .../vitest/src/node/plugins/conditions.ts | 16 +++++++++++++ packages/vitest/src/node/plugins/index.ts | 7 ++++-- packages/vitest/src/node/plugins/workspace.ts | 7 ++++-- pnpm-lock.yaml | 8 +++++++ .../deps/test-dep-conditions/default.js | 1 + .../config/deps/test-dep-conditions/module.js | 1 + test/config/deps/test-dep-conditions/node.js | 1 + .../deps/test-dep-conditions/package.json | 12 ++++++++++ .../fixtures/conditions-subpackage/module.js | 1 + .../default-conditions.test.js | 6 +++++ .../default-conditions/vitest.config.ts | 3 +++ test/config/package.json | 1 + test/config/test/default-conditions.test.ts | 23 +++++++++++++++++++ 13 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 packages/vitest/src/node/plugins/conditions.ts create mode 100644 test/config/deps/test-dep-conditions/default.js create mode 100644 test/config/deps/test-dep-conditions/module.js create mode 100644 test/config/deps/test-dep-conditions/node.js create mode 100644 test/config/deps/test-dep-conditions/package.json create mode 100644 test/config/fixtures/conditions-subpackage/module.js create mode 100644 test/config/fixtures/default-conditions/default-conditions.test.js create mode 100644 test/config/fixtures/default-conditions/vitest.config.ts create mode 100644 test/config/test/default-conditions.test.ts diff --git a/packages/vitest/src/node/plugins/conditions.ts b/packages/vitest/src/node/plugins/conditions.ts new file mode 100644 index 000000000000..8684cc0ba867 --- /dev/null +++ b/packages/vitest/src/node/plugins/conditions.ts @@ -0,0 +1,16 @@ +import * as vite from 'vite' + +type Vite6Options = typeof vite & Partial<{ + defaultServerConditions?: string[] +}> + +/** + * In Vite 6+, providing a value for resolve.conditions overrides the defaults + * In Vite 5, passing ["node"] will be merged with the defaults + * + * @returns the appropriate conditions array depending on the vite version + * + */ +export function getDefaultServerConditions() { + return (vite as Vite6Options).defaultServerConditions ?? ['node'] +} diff --git a/packages/vitest/src/node/plugins/index.ts b/packages/vitest/src/node/plugins/index.ts index 1bc182c542b5..aa1794de80d0 100644 --- a/packages/vitest/src/node/plugins/index.ts +++ b/packages/vitest/src/node/plugins/index.ts @@ -12,6 +12,7 @@ import { generateScopedClassName } from '../../integrations/css/css-modules' import { resolveApiServerConfig } from '../config/resolveConfig' import { Vitest } from '../core' import { createViteLogger, silenceImportViteIgnoreWarning } from '../viteLogger' +import { getDefaultServerConditions } from './conditions' import { CoverageTransform } from './coverageTransform' import { CSSEnablerPlugin } from './cssEnabler' import { MocksPlugins } from './mocks' @@ -73,6 +74,8 @@ export async function VitestPlugin( open = testConfig.uiBase ?? '/__vitest__/' } + const conditions = getDefaultServerConditions() + const config: ViteConfig = { root: viteConfig.test?.root || options.root, esbuild: @@ -90,7 +93,7 @@ export async function VitestPlugin( // setting this option can bypass that and fallback to cjs version mainFields: [], alias: testConfig.alias, - conditions: ['node'], + conditions, }, server: { ...testConfig.api, @@ -119,7 +122,7 @@ export async function VitestPlugin( // by default Vite resolves `module` field, which not always a native ESM module // setting this option can bypass that and fallback to cjs version mainFields: [], - conditions: ['node'], + conditions, }, }, }, diff --git a/packages/vitest/src/node/plugins/workspace.ts b/packages/vitest/src/node/plugins/workspace.ts index a3e91bdcf29e..3af3fda5edf0 100644 --- a/packages/vitest/src/node/plugins/workspace.ts +++ b/packages/vitest/src/node/plugins/workspace.ts @@ -7,6 +7,7 @@ import { basename, dirname, relative, resolve } from 'pathe' import { configDefaults } from '../../defaults' import { generateScopedClassName } from '../../integrations/css/css-modules' import { createViteLogger, silenceImportViteIgnoreWarning } from '../viteLogger' +import { getDefaultServerConditions } from './conditions' import { CoverageTransform } from './coverageTransform' import { CSSEnablerPlugin } from './cssEnabler' import { MocksPlugins } from './mocks' @@ -62,6 +63,8 @@ export function WorkspaceVitestPlugin( } } + const conditions = getDefaultServerConditions() + const config: ViteConfig = { root, resolve: { @@ -69,7 +72,7 @@ export function WorkspaceVitestPlugin( // setting this option can bypass that and fallback to cjs version mainFields: [], alias: testConfig.alias, - conditions: ['node'], + conditions, }, esbuild: viteConfig.esbuild === false ? false @@ -104,7 +107,7 @@ export function WorkspaceVitestPlugin( // by default Vite resolves `module` field, which not always a native ESM module // setting this option can bypass that and fallback to cjs version mainFields: [], - conditions: ['node'], + conditions, }, }, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13b65d9b0853..e589ef9c8f02 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1123,6 +1123,9 @@ importers: test/config: devDependencies: + '@vitest/test-dep-conditions': + specifier: file:./deps/test-dep-conditions + version: file:test/config/deps/test-dep-conditions tinyexec: specifier: ^0.3.2 version: 0.3.2 @@ -4101,6 +4104,9 @@ packages: '@vitest/test-dep-cjs@file:test/core/deps/dep-cjs': resolution: {directory: test/core/deps/dep-cjs, type: directory} + '@vitest/test-dep-conditions@file:test/config/deps/test-dep-conditions': + resolution: {directory: test/config/deps/test-dep-conditions, type: directory} + '@vitest/test-dep1@file:test/core/deps/dep1': resolution: {directory: test/core/deps/dep1, type: directory} @@ -12721,6 +12727,8 @@ snapshots: '@vitest/test-dep-cjs@file:test/core/deps/dep-cjs': {} + '@vitest/test-dep-conditions@file:test/config/deps/test-dep-conditions': {} + '@vitest/test-dep1@file:test/core/deps/dep1': {} '@vitest/test-dep2@file:test/core/deps/dep2': diff --git a/test/config/deps/test-dep-conditions/default.js b/test/config/deps/test-dep-conditions/default.js new file mode 100644 index 000000000000..4f7ee4f8e9fa --- /dev/null +++ b/test/config/deps/test-dep-conditions/default.js @@ -0,0 +1 @@ +export default 'default' diff --git a/test/config/deps/test-dep-conditions/module.js b/test/config/deps/test-dep-conditions/module.js new file mode 100644 index 000000000000..3734dc62953b --- /dev/null +++ b/test/config/deps/test-dep-conditions/module.js @@ -0,0 +1 @@ +export default 'module' diff --git a/test/config/deps/test-dep-conditions/node.js b/test/config/deps/test-dep-conditions/node.js new file mode 100644 index 000000000000..aabc41e65094 --- /dev/null +++ b/test/config/deps/test-dep-conditions/node.js @@ -0,0 +1 @@ +export default 'node' diff --git a/test/config/deps/test-dep-conditions/package.json b/test/config/deps/test-dep-conditions/package.json new file mode 100644 index 000000000000..165383748017 --- /dev/null +++ b/test/config/deps/test-dep-conditions/package.json @@ -0,0 +1,12 @@ +{ + "name": "@vitest/test-dep-conditions", + "type": "module", + "private": true, + "exports": { + ".": { + "module": "./module.js", + "node": "./node.js", + "default": "./default.js" + } + } +} diff --git a/test/config/fixtures/conditions-subpackage/module.js b/test/config/fixtures/conditions-subpackage/module.js new file mode 100644 index 000000000000..3734dc62953b --- /dev/null +++ b/test/config/fixtures/conditions-subpackage/module.js @@ -0,0 +1 @@ +export default 'module' diff --git a/test/config/fixtures/default-conditions/default-conditions.test.js b/test/config/fixtures/default-conditions/default-conditions.test.js new file mode 100644 index 000000000000..7210b272f141 --- /dev/null +++ b/test/config/fixtures/default-conditions/default-conditions.test.js @@ -0,0 +1,6 @@ +import { test, expect } from 'vitest'; +import condition from '@vitest/test-dep-conditions'; + +test('condition is correct', () => { + expect(condition).toBe('module') +}) diff --git a/test/config/fixtures/default-conditions/vitest.config.ts b/test/config/fixtures/default-conditions/vitest.config.ts new file mode 100644 index 000000000000..abed6b2116e1 --- /dev/null +++ b/test/config/fixtures/default-conditions/vitest.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({}) diff --git a/test/config/package.json b/test/config/package.json index c59161d0a6b0..dd7c8c7b2d1a 100644 --- a/test/config/package.json +++ b/test/config/package.json @@ -6,6 +6,7 @@ "test": "vitest --typecheck.enabled" }, "devDependencies": { + "@vitest/test-dep-conditions": "file:./deps/test-dep-conditions", "tinyexec": "^0.3.2", "vite": "latest", "vitest": "workspace:*" diff --git a/test/config/test/default-conditions.test.ts b/test/config/test/default-conditions.test.ts new file mode 100644 index 000000000000..0de3acb42ed6 --- /dev/null +++ b/test/config/test/default-conditions.test.ts @@ -0,0 +1,23 @@ +import { expect, test } from 'vitest' +import { runVitest } from '../../test-utils' + +test('"module" condition for external dep', async () => { + const { stderr } = await runVitest({ + root: 'fixtures/default-conditions', + }) + + expect(stderr).toBe('') +}) + +test('"module" condition for inline dep', async () => { + const { stderr } = await runVitest({ + root: 'fixtures/default-conditions', + server: { + deps: { + inline: ['@vitest/test-dep-conditions'], + }, + }, + }) + + expect(stderr).toBe('') +})