[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

fix: fix `importOriginal` with optimizer and query import (#10469)

Co-authored-by: David Harris <dharris@teamraft.com>
Co-authored-by: Hiroshi Ogawa <hi.ogawa.zz@gmail.com>
Co-authored-by: Hiroshi Ogawa <4232207+hi-ogawa@users.noreply.github.com>
Co-authored-by: Codex <noreply@openai.com>

authored by

David Harris
David Harris
Hiroshi Ogawa
Hiroshi Ogawa
Codex
and committed by
GitHub
(Jun 4, 2026, 9:58 AM +0900) 6a3bb02e 6d6e46b1

+125 -4
+8
pnpm-lock.yaml
··· 1393 1393 test-dep-simple: 1394 1394 specifier: file:./deps/dep-simple 1395 1395 version: file:test/e2e/deps/dep-simple 1396 + test-dep-simple2: 1397 + specifier: file:./deps/dep-simple2 1398 + version: file:test/e2e/deps/dep-simple2 1396 1399 tinyexec: 1397 1400 specifier: ^1.0.2 1398 1401 version: 1.0.2 ··· 9665 9668 9666 9669 test-dep-error@file:test/browser/deps/test-dep-error: 9667 9670 resolution: {directory: test/browser/deps/test-dep-error, type: directory} 9671 + 9672 + test-dep-simple2@file:test/e2e/deps/dep-simple2: 9673 + resolution: {directory: test/e2e/deps/dep-simple2, type: directory} 9668 9674 9669 9675 test-dep-simple@file:test/e2e/deps/dep-simple: 9670 9676 resolution: {directory: test/e2e/deps/dep-simple, type: directory} ··· 19000 19006 test-dep-conditions-indirect: file:test/e2e/deps/test-dep-conditions-indirect 19001 19007 19002 19008 test-dep-error@file:test/browser/deps/test-dep-error: {} 19009 + 19010 + test-dep-simple2@file:test/e2e/deps/dep-simple2: {} 19003 19011 19004 19012 test-dep-simple@file:test/e2e/deps/dep-simple: {} 19005 19013
+2 -1
test/tsconfig.json
··· 2 2 "extends": "../tsconfig.base.json", 3 3 "compilerOptions": { 4 4 "types": [ 5 - "node" 5 + "node", 6 + "vite/client" 6 7 ] 7 8 }, 8 9 "include": [
+1
test/e2e/package.json
··· 40 40 "test-dep-conditions": "file:./deps/test-dep-conditions", 41 41 "test-dep-invalid": "link:./deps/dep-invalid", 42 42 "test-dep-simple": "file:./deps/dep-simple", 43 + "test-dep-simple2": "file:./deps/dep-simple2", 43 44 "tinyexec": "^1.0.2", 44 45 "tinyspy": "catalog:", 45 46 "typescript": "catalog:",
+21
test/e2e/test/optimize-deps-mock.test.ts
··· 1 + import { expect, test } from 'vitest' 2 + import { runVitest } from '../../test-utils' 3 + 4 + test.for(['forks', 'threads', 'vmThreads', 'vmForks'])( 5 + 'optimize deps and mock - %s', 6 + async (pool) => { 7 + const { errorTree, stderr } = await runVitest({ 8 + root: './fixtures/optimize-deps-mock', 9 + pool, 10 + }) 11 + 12 + expect(stderr).toBe('') 13 + expect(errorTree()).toMatchInlineSnapshot(` 14 + { 15 + "basic.test.ts": { 16 + "basic": "passed", 17 + }, 18 + } 19 + `) 20 + }, 21 + )
+1
test/e2e/deps/dep-simple2/index.js
··· 1 + export default 'test-dep-simple2'
+6
test/e2e/deps/dep-simple2/package.json
··· 1 + { 2 + "name": "test-dep-simple2", 3 + "type": "module", 4 + "private": true, 5 + "exports": "./index.js" 6 + }
+40
test/e2e/fixtures/optimize-deps-mock/basic.test.ts
··· 1 + import { expect, test, vi } from 'vitest' 2 + // @ts-expect-error no type 3 + import * as dep from "@test/test-dep-url" 4 + // @ts-expect-error no type 5 + import * as simple from "test-dep-simple" 6 + // @ts-expect-error no type 7 + import * as simple2 from "test-dep-simple2" 8 + 9 + // mock + optimized 10 + vi.mock('@test/test-dep-url', async (importOriginal) => { 11 + const original = await importOriginal<any>() 12 + return { ...original, mocked: "ok" }; 13 + }) 14 + 15 + // mock + not optimized + no external 16 + vi.mock('test-dep-simple', async (importOriginal) => { 17 + const original = await importOriginal<any>() 18 + return { ...original, mocked: "ok" }; 19 + }) 20 + 21 + // mock + not optimized + external 22 + vi.mock('test-dep-simple2', async (importOriginal) => { 23 + const original = await importOriginal<any>() 24 + return { ...original, mocked: "ok" }; 25 + }) 26 + 27 + test('basic', () => { 28 + expect.soft({...dep}).toEqual({ 29 + mocked: 'ok', 30 + importMetaUrl: expect.stringContaining('/node_modules/.vite/vitest/') 31 + }) 32 + expect({...simple}).toEqual({ 33 + mocked: 'ok', 34 + default: 'test-dep-simple', 35 + }) 36 + expect({...simple2}).toEqual({ 37 + mocked: 'ok', 38 + default: 'test-dep-simple2', 39 + }) 40 + })
+19
test/e2e/fixtures/optimize-deps-mock/vitest.config.ts
··· 1 + import { defineConfig } from 'vitest/config' 2 + 3 + export default defineConfig({ 4 + ssr: { 5 + noExternal: ["test-dep-simple"], 6 + optimizeDeps: { 7 + include: ["@test/test-dep-url"], 8 + }, 9 + }, 10 + test: { 11 + deps: { 12 + optimizer: { 13 + ssr: { 14 + enabled: true, 15 + }, 16 + }, 17 + }, 18 + }, 19 + })
+1
test/unit/test/mocking/import-actual-query-target.ts
··· 1 + export default 'import-actual-query-target'
+20
test/unit/test/mocking/import-actual-query.test.ts
··· 1 + import { expect, test, vi } from 'vitest' 2 + import * as target from './import-actual-query-target?raw' 3 + 4 + vi.mock(import('./import-actual-query-target?raw'), async (importOriginal) => { 5 + const original = await importOriginal<any>() 6 + return { 7 + ...original, 8 + mocked: 'ok', 9 + } 10 + }) 11 + 12 + test('importOriginal preserves query parameters', () => { 13 + expect({ ...target }).toMatchInlineSnapshot(` 14 + { 15 + "default": "export default 'import-actual-query-target' 16 + ", 17 + "mocked": "ok", 18 + } 19 + `) 20 + })
+6 -3
packages/vitest/src/runtime/moduleRunner/utils.ts
··· 1 - // copied from vite/src/shared/utils.ts 1 + // copied from vite 2 + // https://github.com/vitejs/vite/blob/4417b4f305623b2850bd6ae6553834c017694672/packages/vite/src/shared/utils.ts 3 + // https://github.com/vitejs/vite/blob/4417b4f305623b2850bd6ae6553834c017694672/packages/vite/src/node/utils.ts 2 4 const postfixRE = /[?#].*$/ 5 + const trailingSeparatorRE = /[?&]$/ 3 6 4 7 function cleanUrl(url: string): string { 5 8 return url.replace(postfixRE, '') ··· 16 19 17 20 export function removeQuery(url: string, queryToRemove: string): string { 18 21 return url 19 - .replace(new RegExp(`[?&]${queryToRemove}(?=[&#]|$)`), '') 20 - .replace(/\?$/, '') 22 + .replace(new RegExp(`([?&])${queryToRemove}(?:&|$)`), '$1') 23 + .replace(trailingSeparatorRE, '') 21 24 }