[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(browser): optimize build output and always prebundle vitest

Vladimir Sheremet (Jun 5, 2025, 12:10 PM +0200) 00a39165 142c735e

+56 -42
+3 -3
pnpm-lock.yaml
··· 688 688 '@vitest/spy': 689 689 specifier: workspace:* 690 690 version: link:../spy 691 + '@vitest/utils': 692 + specifier: workspace:* 693 + version: link:../utils 691 694 estree-walker: 692 695 specifier: ^3.0.3 693 696 version: 3.0.3 ··· 698 701 '@types/estree': 699 702 specifier: 'catalog:' 700 703 version: 1.0.7 701 - '@vitest/utils': 702 - specifier: workspace:* 703 - version: link:../utils 704 704 acorn-walk: 705 705 specifier: 'catalog:' 706 706 version: 8.3.4
+1
packages/mocker/package.json
··· 67 67 }, 68 68 "dependencies": { 69 69 "@vitest/spy": "workspace:*", 70 + "@vitest/utils": "workspace:*", 70 71 "estree-walker": "^3.0.3", 71 72 "magic-string": "catalog:" 72 73 },
+1
packages/mocker/rollup.config.js
··· 23 23 ...Object.keys(pkg.dependencies || {}), 24 24 ...Object.keys(pkg.peerDependencies || {}), 25 25 /^msw/, 26 + '@vitest/utils/source-map', 26 27 ] 27 28 28 29 const dtsUtils = createDtsUtils()
-4
packages/utils/package.json
··· 24 24 "types": "./dist/diff.d.ts", 25 25 "default": "./dist/diff.js" 26 26 }, 27 - "./ast": { 28 - "types": "./dist/ast.d.ts", 29 - "default": "./dist/ast.js" 30 - }, 31 27 "./error": { 32 28 "types": "./dist/error.d.ts", 33 29 "default": "./dist/error.js"
+1
packages/vitest/rollup.config.js
··· 82 82 'vite-node/utils', 83 83 '@vitest/mocker', 84 84 '@vitest/mocker/node', 85 + '@vitest/mocker/browser', 85 86 '@vitest/utils/diff', 86 87 '@vitest/utils/ast', 87 88 '@vitest/utils/error',
+1 -1
packages/browser/src/client/client.ts
··· 1 - import type { ModuleMocker } from '@vitest/mocker/browser' 2 1 import type { CancelReason } from '@vitest/runner' 3 2 import type { BirpcReturn } from 'birpc' 3 + import type { ModuleMocker } from 'vitest/internal/browser' 4 4 import type { WebSocketBrowserEvents, WebSocketBrowserHandlers } from '../node/types' 5 5 import type { IframeOrchestrator } from './orchestrator' 6 6 import { createBirpc } from 'birpc'
+14 -1
packages/browser/src/client/orchestrator.ts
··· 1 1 import type { GlobalChannelIncomingEvent, IframeChannelIncomingEvent, IframeChannelOutgoingEvent, IframeViewportDoneEvent, IframeViewportFailEvent } from '@vitest/browser/client' 2 2 import type { BrowserTesterOptions, SerializedConfig } from 'vitest' 3 3 import { channel, client, globalChannel } from '@vitest/browser/client' 4 - import { generateHash } from '@vitest/runner/utils' 5 4 import { relative } from 'pathe' 6 5 import { getUiAPI } from './ui' 7 6 import { getBrowserState, getConfig } from './utils' ··· 295 294 const project = config.name || '' 296 295 const path = relative(config.root, file) 297 296 return generateHash(`${path}${project}`) 297 + } 298 + 299 + // importing this from @vitest/runner bring it the whole runner 300 + function generateHash(str: string): string { 301 + let hash = 0 302 + if (str.length === 0) { 303 + return `${hash}` 304 + } 305 + for (let i = 0; i < str.length; i++) { 306 + const char = str.charCodeAt(i) 307 + hash = (hash << 5) - hash + char 308 + hash = hash & hash // Convert to 32bit integer 309 + } 310 + return `${hash}` 298 311 } 299 312 300 313 async function setIframeViewport(
+5 -23
packages/browser/src/node/plugin.ts
··· 188 188 ...(project.config.snapshotSerializers || []), 189 189 ] 190 190 191 - const exclude = [ 192 - 'vitest', 193 - 'vitest/internal/browser', 194 - 'vitest/runners', 195 - '@vitest/browser', 196 - '@vitest/browser/client', 197 - '@vitest/utils', 198 - '@vitest/utils/source-map', 199 - '@vitest/runner', 200 - '@vitest/spy', 201 - '@vitest/utils/error', 202 - '@vitest/snapshot', 203 - '@vitest/expect', 204 - 'std-env', 205 - 'tinybench', 206 - 'tinyspy', 207 - 'tinyrainbow', 208 - 'pathe', 209 - 'msw', 210 - 'msw/browser', 211 - ] 212 - 213 191 if (typeof project.config.diff === 'string') { 214 192 entries.push(project.config.diff) 215 193 } 194 + 195 + const exclude: string[] = [] 216 196 217 197 if (parentServer.vitest.coverageProvider) { 218 198 const coverage = parentServer.vitest.config.coverage ··· 237 217 } 238 218 239 219 const include = [ 220 + 'vitest', 221 + 'vitest/internal/browser', 240 222 'vitest > expect-type', 241 223 'vitest > @vitest/snapshot > magic-string', 242 224 'vitest > chai', ··· 275 257 }, 276 258 optimizeDeps: { 277 259 entries, 278 - exclude, 260 + // exclude, 279 261 include, 280 262 }, 281 263 }
+6
packages/mocker/src/node/index.ts
··· 1 + import { fileURLToPath } from 'node:url' 2 + import { resolve } from 'pathe' 3 + 1 4 export { createManualModuleSource } from '../utils' 2 5 export { automockModule, automockPlugin } from './automockPlugin' 3 6 export type { AutomockPluginOptions } from './automockPlugin' ··· 15 18 ServerMockResolution, 16 19 ServerResolverOptions, 17 20 } from './resolver' 21 + 22 + const pkgRoot = resolve(fileURLToPath(import.meta.url), '../..') 23 + export const distRoot: string = resolve(pkgRoot, 'dist')
+8 -2
packages/vitest/src/node/project.ts
··· 536 536 this.config.root, 537 537 this.vitest.version, 538 538 ) 539 - const { createBrowserServer, distRoot } = await import('@vitest/browser') 539 + const [ 540 + { createBrowserServer, distRoot }, 541 + { distRoot: mockerDist }, 542 + ] = await Promise.all([ 543 + import('@vitest/browser'), 544 + import('@vitest/mocker/node'), 545 + ]) 540 546 let cacheDir: string 541 547 const browser = await createBrowserServer( 542 548 this, ··· 550 556 }, 551 557 ...MocksPlugins({ 552 558 filter(id) { 553 - if (id.includes(distRoot) || id.includes(cacheDir)) { 559 + if (id.includes(distRoot) || id.includes(mockerDist) || id.includes(cacheDir)) { 554 560 return false 555 561 } 556 562 return true
+5 -1
packages/vitest/src/public/browser.ts
··· 3 3 stopCoverageInsideWorker, 4 4 takeCoverageInsideWorker, 5 5 } from '../integrations/coverage' 6 - 7 6 export { 8 7 loadDiffConfig, 9 8 loadSnapshotSerializers, 10 9 setupCommonEnv, 11 10 } from '../runtime/setup-common' 11 + 12 + export { NodeBenchmarkRunner, VitestTestRunner } from './runners' 13 + export { ModuleMocker } from '@vitest/mocker/browser' 12 14 export { collectTests, processError, startTests } from '@vitest/runner' 13 15 export * as SpyModule from '@vitest/spy' 14 16 export { ··· 19 21 } from '@vitest/utils' 20 22 export type { LoupeOptions, ParsedStack, StringifyOptions } from '@vitest/utils' 21 23 export { 24 + createStackString, 22 25 originalPositionFor, 26 + parseStacktrace, 23 27 TraceMap, 24 28 } from '@vitest/utils/source-map'
+1 -1
packages/browser/src/client/tester/mocker.ts
··· 1 - import { ModuleMocker } from '@vitest/mocker/browser' 1 + import { ModuleMocker } from 'vitest/internal/browser' 2 2 import { getBrowserState } from '../utils' 3 3 4 4 export class VitestBrowserClientMocker extends ModuleMocker {
+4 -2
packages/browser/src/client/tester/runner.ts
··· 5 5 import { globalChannel, onCancel } from '@vitest/browser/client' 6 6 import { page, userEvent } from '@vitest/browser/context' 7 7 import { 8 + createStackString, 8 9 loadDiffConfig, 9 10 loadSnapshotSerializers, 11 + NodeBenchmarkRunner, 10 12 originalPositionFor, 13 + parseStacktrace, 11 14 takeCoverageInsideWorker, 12 15 TraceMap, 16 + VitestTestRunner, 13 17 } from 'vitest/internal/browser' 14 - import { NodeBenchmarkRunner, VitestTestRunner } from 'vitest/runners' 15 - import { createStackString, parseStacktrace } from '../../../../utils/src/source-map' 16 18 import { executor, getWorkerState } from '../utils' 17 19 import { rpc } from './rpc' 18 20 import { VitestBrowserSnapshotEnvironment } from './snapshot'
+6 -4
packages/browser/src/client/tester/tester.ts
··· 19 19 import { browserHashMap, initiateRunner } from './runner' 20 20 import { CommandsManager } from './utils' 21 21 22 + const now = performance.now.bind(performance) 23 + 22 24 const debugVar = getConfig().env.VITEST_BROWSER_DEBUG 23 25 const debug = debugVar && debugVar !== 'false' 24 - ? (...args: unknown[]) => client.rpc.debug?.(...args.map(String)) 26 + ? (...args: unknown[]) => client.rpc.debug(...args.map(String)) 25 27 : undefined 26 28 27 29 channel.addEventListener('message', async (e) => { ··· 142 144 }) 143 145 } 144 146 145 - state.durations.prepare = performance.now() - options.startTime 147 + state.durations.prepare = options.startTime - now() 146 148 147 149 return { 148 150 runner, ··· 194 196 } 195 197 196 198 async function prepare(options: PrepareOptions) { 199 + // fetch('file://non-existing-1').catch(() => {}) 197 200 preparedData = await prepareTestEnvironment(options) 201 + // fetch('file://non-existing-2').catch(() => {}) 198 202 199 203 // page is reloading 200 204 debug?.('runner resolved successfully') 201 205 202 206 const { config, state } = preparedData 203 - 204 - state.durations.prepare = performance.now() - state.durations.prepare 205 207 206 208 debug?.('prepare time', state.durations.prepare, 'ms') 207 209