diff --git a/packages/vitest/src/runtime/moduleRunner/utils.ts b/packages/vitest/src/runtime/moduleRunner/utils.ts index 83c58a4a1..daf4b446b 100644 --- a/packages/vitest/src/runtime/moduleRunner/utils.ts +++ b/packages/vitest/src/runtime/moduleRunner/utils.ts @@ -1,5 +1,8 @@ -// copied from vite/src/shared/utils.ts +// copied from vite +// https://github.com/vitejs/vite/blob/4417b4f305623b2850bd6ae6553834c017694672/packages/vite/src/shared/utils.ts +// https://github.com/vitejs/vite/blob/4417b4f305623b2850bd6ae6553834c017694672/packages/vite/src/node/utils.ts const postfixRE = /[?#].*$/ +const trailingSeparatorRE = /[?&]$/ function cleanUrl(url: string): string { return url.replace(postfixRE, '') @@ -16,6 +19,6 @@ export function injectQuery(url: string, queryToInject: string): string { export function removeQuery(url: string, queryToRemove: string): string { return url - .replace(new RegExp(`[?&]${queryToRemove}(?=[&#]|$)`), '') - .replace(/\?$/, '') + .replace(new RegExp(`([?&])${queryToRemove}(?:&|$)`), '$1') + .replace(trailingSeparatorRE, '') } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4d2c401c4..c7f5e3f76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1329,6 +1329,9 @@ importers: test-dep-simple: specifier: file:./deps/dep-simple version: file:test/cli/deps/dep-simple + test-dep-simple2: + specifier: file:./deps/dep-simple2 + version: file:test/cli/deps/dep-simple2 tinyspy: specifier: 'catalog:' version: 4.0.4 @@ -9849,6 +9852,9 @@ packages: test-dep-simple@file:test/cli/deps/dep-simple: resolution: {directory: test/cli/deps/dep-simple, type: directory} + test-dep-simple2@file:test/cli/deps/dep-simple2: + resolution: {directory: test/cli/deps/dep-simple2, type: directory} + text-decoder@1.1.1: resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} @@ -19268,6 +19274,8 @@ snapshots: test-dep-simple@file:test/cli/deps/dep-simple: {} + test-dep-simple2@file:test/cli/deps/dep-simple2: {} + text-decoder@1.1.1: dependencies: b4a: 1.6.4 diff --git a/test/cli/deps/dep-simple2/index.js b/test/cli/deps/dep-simple2/index.js new file mode 100644 index 000000000..02a729f2b --- /dev/null +++ b/test/cli/deps/dep-simple2/index.js @@ -0,0 +1 @@ +export default 'test-dep-simple2' diff --git a/test/cli/deps/dep-simple2/package.json b/test/cli/deps/dep-simple2/package.json new file mode 100644 index 000000000..a86653f7c --- /dev/null +++ b/test/cli/deps/dep-simple2/package.json @@ -0,0 +1,6 @@ +{ + "name": "test-dep-simple2", + "type": "module", + "private": true, + "exports": "./index.js" +} diff --git a/test/cli/fixtures/optimize-deps/basic.test.ts b/test/cli/fixtures/optimize-deps/basic.test.ts new file mode 100644 index 000000000..83ed7c04f --- /dev/null +++ b/test/cli/fixtures/optimize-deps/basic.test.ts @@ -0,0 +1,37 @@ +import { expect, test, vi } from 'vitest' +// @ts-expect-error no type +import * as dep from '@test/test-dep-url' +// @ts-expect-error no type +import * as simple from 'test-dep-simple' +// @ts-expect-error no type +import * as simple2 from 'test-dep-simple2' + +vi.mock('@test/test-dep-url', async (importOriginal) => { + const original = await importOriginal() + return { ...original, mocked: 'ok' } +}) + +vi.mock('test-dep-simple', async (importOriginal) => { + const original = await importOriginal() + return { ...original, mocked: 'ok' } +}) + +vi.mock('test-dep-simple2', async (importOriginal) => { + const original = await importOriginal() + return { ...original, mocked: 'ok' } +}) + +test('basic', () => { + expect.soft({ ...dep }).toEqual({ + mocked: 'ok', + importMetaUrl: expect.stringContaining('/node_modules/.vite/vitest/'), + }) + expect({ ...simple }).toEqual({ + mocked: 'ok', + default: 'test-dep-simple', + }) + expect({ ...simple2 }).toEqual({ + mocked: 'ok', + default: 'test-dep-simple2', + }) +}) diff --git a/test/cli/fixtures/optimize-deps/vitest.config.ts b/test/cli/fixtures/optimize-deps/vitest.config.ts index 3184a6562..b1b7108bb 100644 --- a/test/cli/fixtures/optimize-deps/vitest.config.ts +++ b/test/cli/fixtures/optimize-deps/vitest.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ include: ["@test/test-dep-url"], }, ssr: { + noExternal: ["test-dep-simple"], optimizeDeps: { include: ["@test/test-dep-url"], }, diff --git a/test/cli/package.json b/test/cli/package.json index 714a061ef..92c675cb6 100644 --- a/test/cli/package.json +++ b/test/cli/package.json @@ -31,6 +31,7 @@ "playwright": "catalog:", "test-dep-invalid": "link:./deps/dep-invalid", "test-dep-simple": "file:./deps/dep-simple", + "test-dep-simple2": "file:./deps/dep-simple2", "tinyspy": "catalog:", "typescript": "catalog:", "unplugin-swc": "^1.5.9", diff --git a/test/cli/test/optimize-deps.test.ts b/test/cli/test/optimize-deps.test.ts index e36fa8892..ee39b2aa5 100644 --- a/test/cli/test/optimize-deps.test.ts +++ b/test/cli/test/optimize-deps.test.ts @@ -12,6 +12,9 @@ test.for(['forks', 'threads', 'vmThreads', 'vmForks'])( expect(stderr).toBe('') expect(errorTree()).toMatchInlineSnapshot(` { + "basic.test.ts": { + "basic": "passed", + }, "ssr.test.ts": { "import.meta.url": "passed", }, diff --git a/test/core/test/mocking/import-actual-query-target.ts b/test/core/test/mocking/import-actual-query-target.ts new file mode 100644 index 000000000..adf5d0bb8 --- /dev/null +++ b/test/core/test/mocking/import-actual-query-target.ts @@ -0,0 +1 @@ +export default 'import-actual-query-target' diff --git a/test/core/test/mocking/import-actual-query.test.ts b/test/core/test/mocking/import-actual-query.test.ts new file mode 100644 index 000000000..cb6e96d79 --- /dev/null +++ b/test/core/test/mocking/import-actual-query.test.ts @@ -0,0 +1,20 @@ +import { expect, test, vi } from 'vitest' +import * as target from './import-actual-query-target?raw' + +vi.mock(import('./import-actual-query-target?raw'), async (importOriginal) => { + const original = await importOriginal() + return { + ...original, + mocked: 'ok', + } +}) + +test('importOriginal preserves query parameters', () => { + expect({ ...target }).toMatchInlineSnapshot(` + { + "default": "export default 'import-actual-query-target' + ", + "mocked": "ok", + } + `) +}) diff --git a/test/tsconfig.json b/test/tsconfig.json index fa940a1db..21d0ae210 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -2,7 +2,8 @@ "extends": "../tsconfig.base.json", "compilerOptions": { "types": [ - "node" + "node", + "vite/client" ] }, "include": [