From e0e20176cd6c93988727ae2c9883fead23d2d39e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Thu, 30 Nov 2023 17:09:20 +0200 Subject: [PATCH 1/9] perf: close pool early in run-mode (#4623) --- packages/vitest/src/node/core.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index bc36be4c30d3..58d1a1903d0c 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -10,7 +10,7 @@ import { ViteNodeRunner } from 'vite-node/client' import { SnapshotManager } from '@vitest/snapshot/manager' import type { CancelReason, File } from '@vitest/runner' import { ViteNodeServer } from 'vite-node/server' -import type { ArgumentsType, CoverageProvider, OnServerRestartHandler, Reporter, ResolvedConfig, UserConfig, UserWorkspaceConfig, VitestRunMode } from '../types' +import type { ArgumentsType, Awaitable, CoverageProvider, OnServerRestartHandler, Reporter, ResolvedConfig, UserConfig, UserWorkspaceConfig, VitestRunMode } from '../types' import { hasFailed, noop, slash, toArray } from '../utils' import { getCoverageProvider } from '../integrations/coverage' import type { BrowserProvider } from '../types/browser' @@ -76,6 +76,7 @@ export class Vitest { private _onClose: (() => Awaited)[] = [] private _onSetServer: OnServerRestartHandler[] = [] private _onCancelListeners: ((reason: CancelReason) => Promise | void)[] = [] + private _poolClosePromise?: Awaitable async setServer(options: UserConfig, server: ViteDevServer, cliOptions: UserConfig) { this.unregisterWatcher?.() @@ -357,6 +358,10 @@ export class Vitest { await this.runFiles(files) } + // In run mode close pool as early as possible + if (!this.config.watch && this.pool?.close) + this._poolClosePromise = this.pool.close() + await this.reportCoverage(true) if (this.config.watch) @@ -780,7 +785,9 @@ export class Vitest { if (this.pool) { closePromises.push((async () => { - await this.pool?.close?.() + await (this._poolClosePromise || this.pool?.close?.()) + + this._poolClosePromise = undefined this.pool = undefined })()) } From 723f65b9b20dbda37522f73b0f8ff691d8bd1251 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 30 Nov 2023 19:48:48 +0100 Subject: [PATCH 2/9] fix(browser): respect "server" option in vite config (#4627) --- packages/vitest/src/integrations/browser/server.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/vitest/src/integrations/browser/server.ts b/packages/vitest/src/integrations/browser/server.ts index 84a12a8ce157..2485b2fe7479 100644 --- a/packages/vitest/src/integrations/browser/server.ts +++ b/packages/vitest/src/integrations/browser/server.ts @@ -39,7 +39,10 @@ export async function createBrowserServer(project: WorkspaceProject, configFile: // browser never runs in middleware mode server.middlewareMode = false - config.server = server + config.server = { + ...config.server, + ...server, + } config.server.fs ??= {} config.server.fs.allow = config.server.fs.allow || [] config.server.fs.allow.push( From c01c2ff06aadc2f91e1330ef8064c2a8759e3057 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 30 Nov 2023 22:22:03 +0100 Subject: [PATCH 3/9] docs: set node to 20, update tsx (#4629) --- netlify.toml | 2 +- package.json | 2 +- pnpm-lock.yaml | 57 +++++++++++++++++++++++++------------------------- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/netlify.toml b/netlify.toml index 4e1a606e9416..7a1c0873a351 100755 --- a/netlify.toml +++ b/netlify.toml @@ -1,5 +1,5 @@ [build.environment] - NODE_VERSION = "18" + NODE_VERSION = "20" # don't need playwright for docs build PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = "1" diff --git a/package.json b/package.json index 02796f9fd2ab..4dc59eb41213 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "rollup-plugin-esbuild": "^6.1.0", "rollup-plugin-license": "^3.2.0", "simple-git-hooks": "^2.9.0", - "tsx": "^4.1.1", + "tsx": "^4.6.1", "typescript": "^5.2.2", "vite": "^5.0.0-beta.19", "vitest": "workspace:*" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b85e08c62343..10fa0810c6d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,8 +96,8 @@ importers: specifier: ^2.9.0 version: 2.9.0 tsx: - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.6.1 + version: 4.6.1 typescript: specifier: ^5.2.2 version: 5.2.2 @@ -5563,7 +5563,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -5584,7 +5584,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -5621,7 +5621,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 jest-mock: 27.5.1 dev: true @@ -5638,7 +5638,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 20.10.0 + '@types/node': 18.18.9 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -5667,7 +5667,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -5798,7 +5798,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.10.0 + '@types/node': 18.18.9 '@types/yargs': 16.0.7 chalk: 4.1.2 dev: true @@ -8922,7 +8922,7 @@ packages: resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==} dependencies: '@types/connect': 3.4.37 - '@types/node': 20.10.0 + '@types/node': 18.18.9 dev: true /@types/braces@3.0.1: @@ -8943,7 +8943,7 @@ packages: /@types/connect@3.4.37: resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==} dependencies: - '@types/node': 20.10.0 + '@types/node': 18.18.9 dev: true /@types/cookie@0.4.1: @@ -9010,7 +9010,7 @@ packages: /@types/express-serve-static-core@4.17.39: resolution: {integrity: sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==} dependencies: - '@types/node': 20.10.0 + '@types/node': 18.18.9 '@types/qs': 6.9.9 '@types/range-parser': 1.2.6 '@types/send': 0.17.3 @@ -9064,7 +9064,7 @@ packages: /@types/graceful-fs@4.1.8: resolution: {integrity: sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==} dependencies: - '@types/node': 20.10.0 + '@types/node': 18.18.9 dev: true /@types/hast@2.3.4: @@ -9214,7 +9214,7 @@ packages: /@types/node-fetch@2.6.7: resolution: {integrity: sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg==} dependencies: - '@types/node': 20.10.0 + '@types/node': 18.18.9 form-data: 4.0.0 dev: true @@ -9393,7 +9393,7 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.10.0 + '@types/node': 18.18.9 dev: true /@types/resolve@1.20.2: @@ -9411,7 +9411,7 @@ packages: resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==} dependencies: '@types/mime': 1.3.4 - '@types/node': 20.10.0 + '@types/node': 18.18.9 dev: true /@types/serve-static@1.15.4: @@ -9419,7 +9419,7 @@ packages: dependencies: '@types/http-errors': 2.0.3 '@types/mime': 3.0.3 - '@types/node': 20.10.0 + '@types/node': 18.18.9 dev: true /@types/set-cookie-parser@2.4.2: @@ -18182,7 +18182,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -18317,7 +18317,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -18335,7 +18335,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true @@ -18379,7 +18379,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.8 - '@types/node': 20.10.0 + '@types/node': 18.18.9 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -18419,7 +18419,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -18499,7 +18499,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 dev: true /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): @@ -18560,7 +18560,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -18625,7 +18625,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 20.10.0 + '@types/node': 18.18.9 graceful-fs: 4.2.11 dev: true @@ -18676,7 +18676,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -18713,7 +18713,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.10.0 + '@types/node': 18.18.9 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -24885,14 +24885,13 @@ packages: fsevents: 2.3.3 dev: true - /tsx@4.1.1: - resolution: {integrity: sha512-zyPn5BFMB0TB5kMLbYPNx4x/oL/oSlaecdKCv6WeJ0TeSEfx8RTJWjuB5TZ2dSewktgfBsBO/HNA9mrMWqLXMA==} + /tsx@4.6.1: + resolution: {integrity: sha512-OQ4TAPHXAPUo/NZAmmIybl0o8LFOTlycQxFepLBAp6EV87U88fOKYGCQI2viGAEOVU9UW/cgQcxcOMnfEKVY3Q==} engines: {node: '>=18.0.0'} hasBin: true dependencies: esbuild: 0.18.20 get-tsconfig: 4.7.2 - source-map-support: 0.5.21 optionalDependencies: fsevents: 2.3.3 dev: true From ca870270a4478fb266147711824b556e0f3f93d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Thu, 30 Nov 2023 23:22:37 +0200 Subject: [PATCH 4/9] docs: update social links (#4624) Co-authored-by: Vladimir --- docs/.vitepress/contributors.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/.vitepress/contributors.ts b/docs/.vitepress/contributors.ts index 187ece01e93c..6991219ddab4 100644 --- a/docs/.vitepress/contributors.ts +++ b/docs/.vitepress/contributors.ts @@ -73,6 +73,9 @@ const plainTeamMembers: CoreTeam[] = [ avatar: contributorsAvatars.AriPerkkio, name: 'Ari Perkkiƶ', github: 'AriPerkkio', + mastodon: 'https://elk.zone/m.webtoo.ls/@AriPerkkio', + twitter: 'ari_perkkio', + sponsor: 'https://github.com/sponsors/AriPerkkio', title: 'A fullstack developer, working', desc: 'Core team member of Vitest', org: 'Cloudamite', From 8c74e456c6a54e5d930ca025b4263770aa83eb12 Mon Sep 17 00:00:00 2001 From: Sjoert <63722509+Sjoertjuh@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:48:32 +0100 Subject: [PATCH 5/9] chore: fix undefined mocked key error suggestion (#4636) --- packages/vitest/src/runtime/mocker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vitest/src/runtime/mocker.ts b/packages/vitest/src/runtime/mocker.ts index 44812b8b3cb0..686a0ed9d428 100644 --- a/packages/vitest/src/runtime/mocker.ts +++ b/packages/vitest/src/runtime/mocker.ts @@ -207,7 +207,7 @@ export class VitestMocker { return { ...actual, // your mocked methods - }, + } })`)}\n`, ) } From 8385c981747e719e274ff24313d9a3d087aa0d0c Mon Sep 17 00:00:00 2001 From: Sam Thorogood Date: Sat, 2 Dec 2023 01:53:17 +1100 Subject: [PATCH 6/9] fix: BrowserTestRunner called incorrect super methods (#4632) --- packages/browser/src/client/runner.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/browser/src/client/runner.ts b/packages/browser/src/client/runner.ts index 5f5693bc5b24..cfa79438d840 100644 --- a/packages/browser/src/client/runner.ts +++ b/packages/browser/src/client/runner.ts @@ -1,4 +1,4 @@ -import type { File, TaskResultPack, Test } from '@vitest/runner' +import type { File, TaskResultPack, Test, VitestRunner } from '@vitest/runner' import type { ResolvedConfig } from 'vitest' import { rpc } from './rpc' @@ -11,7 +11,10 @@ interface CoverageHandler { takeCoverage: () => Promise } -export function createBrowserRunner(original: any, coverageModule: CoverageHandler | null) { +export function createBrowserRunner( + original: { new(config: ResolvedConfig): VitestRunner }, + coverageModule: CoverageHandler | null, +): { new(options: BrowserRunnerOptions): VitestRunner } { return class BrowserTestRunner extends original { public config: ResolvedConfig hashMap = new Map() @@ -23,7 +26,7 @@ export function createBrowserRunner(original: any, coverageModule: CoverageHandl } async onAfterRunTask(task: Test) { - await super.onAfterRunTest?.(task) + await super.onAfterRunTask?.(task) task.result?.errors?.forEach((error) => { console.error(error.message) }) @@ -39,8 +42,8 @@ export function createBrowserRunner(original: any, coverageModule: CoverageHandl } } - async onAfterRunFiles() { - await super.onAfterRun?.() + async onAfterRunFiles(files: File[]) { + await super.onAfterRunFiles?.(files) const coverage = await coverageModule?.takeCoverage?.() if (coverage) { From ceca93dc6d679c0571b279e77673396d033b0992 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Fri, 1 Dec 2023 22:57:31 +0800 Subject: [PATCH 7/9] docs: `os.cpu()` should be `os.cpus()` (#4634) --- docs/config/index.md | 2 +- packages/vitest/src/types/coverage.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index eeb7bf9e5d88..e756e27f6150 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -1326,7 +1326,7 @@ Watermarks for statements, lines, branches and functions. See [istanbul document #### coverage.processingConcurrency - **Type:** `boolean` -- **Default:** `Math.min(20, os.cpu().length)` +- **Default:** `Math.min(20, os.cpus().length)` - **Available for providers:** `'v8' | 'istanbul'` - **CLI:** `--coverage.processingConcurrency=` diff --git a/packages/vitest/src/types/coverage.ts b/packages/vitest/src/types/coverage.ts index 9b88026200fe..9590a61442af 100644 --- a/packages/vitest/src/types/coverage.ts +++ b/packages/vitest/src/types/coverage.ts @@ -208,7 +208,7 @@ export interface BaseCoverageOptions { /** * Concurrency limit used when processing the coverage results. - * Defaults to `Math.min(20, os.cpu().length)` + * Defaults to `Math.min(20, os.cpus().length)` */ processingConcurrency?: number } From 54d52d4441329114b593a79f3f2b1e66c80c4ddd Mon Sep 17 00:00:00 2001 From: Maarten Hogeveen Date: Sat, 2 Dec 2023 10:03:21 +0100 Subject: [PATCH 8/9] fix(vm): remove sequencer usage from createVmThreadsPool function (#4638) --- packages/vitest/src/node/pools/vm-threads.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/vitest/src/node/pools/vm-threads.ts b/packages/vitest/src/node/pools/vm-threads.ts index c3c5f6223a44..143d506bb425 100644 --- a/packages/vitest/src/node/pools/vm-threads.ts +++ b/packages/vitest/src/node/pools/vm-threads.ts @@ -120,9 +120,6 @@ export function createVmThreadsPool(ctx: Vitest, { execArgv, env, vmPath }: Pool } } - const Sequencer = ctx.config.sequence.sequencer - const sequencer = new Sequencer(ctx) - return async (specs, invalidates) => { const configs = new Map() const getConfig = (project: WorkspaceProject): ResolvedConfig => { @@ -134,13 +131,6 @@ export function createVmThreadsPool(ctx: Vitest, { execArgv, env, vmPath }: Pool return config } - const { shard } = ctx.config - - if (shard) - specs = await sequencer.shard(specs) - - specs = await sequencer.sort(specs) - const filesByEnv = await groupFilesByEnv(specs) const promises = Object.values(filesByEnv).flat() const results = await Promise.allSettled(promises From eca25dc9b3a952b87a07bd4063ed92f0d81e3914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Sun, 3 Dec 2023 19:54:58 +0200 Subject: [PATCH 9/9] fix: set process name for idle workers (#4641) --- packages/vitest/src/runtime/child.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/vitest/src/runtime/child.ts b/packages/vitest/src/runtime/child.ts index 70e1c1ed312b..1311a20ae284 100644 --- a/packages/vitest/src/runtime/child.ts +++ b/packages/vitest/src/runtime/child.ts @@ -13,17 +13,17 @@ import { mockMap, moduleCache, startViteNode } from './execute' import { createSafeRpc, rpcDone } from './rpc' import { setupInspect } from './inspector' +try { + process.title = `node (vitest ${poolId})` +} +catch {} + async function init(ctx: ChildContext) { const { config, workerId, providedContext } = ctx process.env.VITEST_WORKER_ID = String(workerId) process.env.VITEST_POOL_ID = String(poolId) - try { - process.title = `node (vitest ${poolId})` - } - catch {} - let setCancel = (_reason: CancelReason) => {} const onCancel = new Promise((resolve) => { setCancel = resolve