Skip to content

Use Vite 8 and Vitest 4 everywhere#12947

Open
penalosa wants to merge 7 commits intomainfrom
penalosa/vite-8-everywhere
Open

Use Vite 8 and Vitest 4 everywhere#12947
penalosa wants to merge 7 commits intomainfrom
penalosa/vite-8-everywhere

Conversation

@penalosa
Copy link
Contributor

@penalosa penalosa commented Mar 18, 2026

Fixes #[N/A — caretaking cleanup].

Standardise the repo on Vite 8 and Vitest 4 for all workspace development and testing. The vite-legacy dep in vite-plugin-cloudflare is intentionally kept for backwards compat with users on older Vite.

What changed

Catalog cleanup

  • Single default catalog with vite: ^8.0.0, vitest: 4.1.0, @types/node: ^22.10.1
  • Removed vitest-3, vitest-4, and vite-plugin named catalogs
  • Removed vitest vite overrides from root package.json
  • Moved all catalog:vitest-3 / catalog:vitest-4 / catalog:vite-plugin refs to catalog:default
  • Fixed pre-existing catalog drift (tree-kill, workerd, typescript, ws)
  • Removed vite from root package.json devDependencies

Catalog enforcement

  • Added tools/deployments/validate-catalog-usage.ts — fails CI if a workspace member hardcodes a version that exists in the catalog
  • Wired into pnpm check as check:catalog

vitest-pool-workers v4 migration (circular-dep packages)

  • kv-asset-handler, pages-shared, workers-shared, workflows-shared: migrated vitest configs from defineWorkersProject/defineWorkersConfig (removed ./config export) to cloudflareTest() plugin
  • Updated @cloudflare/vitest-pool-workers catalog from ^0.10.0 to ^0.13.0
  • Updated test tsconfigs: @cloudflare/vitest-pool-workers@cloudflare/vitest-pool-workers/types

Test fixes for Vitest 4

  • workflows-shared: unique DO instance IDs per test (isolatedStorage dropped in v4), workerdUnsafe.abortAllDurableObjects() for DO reset (avoids uncatchable durableObjectReset unhandled rejection)
  • pages-shared: await mocked fetchAsset return to avoid unhandled rejection
  • create-cloudflare: mockReset: true in vitest config, cast beforeAll ctx to RunnerTestSuite

Vite 8 type/peer compat

  • moduleResolution: "node""bundler" in workers-editor-shared and format-errors tsconfigs
  • Bumped @vitejs/plugin-react to ^5.2.0, @vitejs/plugin-basic-ssl to ^2.2.0, @tailwindcss/vite to ^4.2.1

  • Tests
    • Tests included/updated
    • Automated tests not possible - manual testing has been completed as follows:
    • Additional testing not necessary because:
  • Public documentation
    • Cloudflare docs PR(s):
    • Documentation not necessary because: internal tooling only

Open with Devin

@changeset-bot
Copy link

changeset-bot bot commented Mar 18, 2026

⚠️ No Changeset found

Latest commit: b4e4eab

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@workers-devprod
Copy link
Contributor

workers-devprod commented Mar 18, 2026

Codeowners approval required for this PR:

  • @cloudflare/deploy-config
  • @cloudflare/workflows
  • @cloudflare/wrangler
Show detailed file reviewers
  • .opencode/todos/vite-8-everywhere.md: [@cloudflare/wrangler]
  • package.json: [@cloudflare/wrangler]
  • packages/create-cloudflare/e2e/tests/cli/cli.test.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/e2e/tests/frameworks/frameworks.test.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/e2e/tests/workers/workers.test.ts: [@cloudflare/wrangler]
  • packages/create-cloudflare/package.json: [@cloudflare/wrangler]
  • packages/create-cloudflare/vitest.config.mts: [@cloudflare/wrangler]
  • packages/format-errors/tsconfig.json: [@cloudflare/wrangler]
  • packages/kv-asset-handler/package.json: [@cloudflare/wrangler]
  • packages/kv-asset-handler/vitest.config.mts: [@cloudflare/wrangler]
  • packages/local-explorer-ui/package.json: [@cloudflare/wrangler]
  • packages/pages-shared/tests/asset-server/handler.test.ts: [@cloudflare/wrangler]
  • packages/pages-shared/package.json: [@cloudflare/wrangler]
  • packages/pages-shared/vitest.config.mts: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/additional-modules/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/assets/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/bindings/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/block-concurrency-while/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/child-environment/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/cloudflare-env/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/config-changes/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/containers/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/cron-triggers/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/ctx-exports/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/custom-build-app/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/deps-assets-importing/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/dev-vars/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/dot-env/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/durable-objects/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/dynamic-import-paths/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/email-worker/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/errors/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/external-durable-objects/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/external-workers/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/external-workflows/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/hot-channel/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/importable-env/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/main-resolution/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/middleware-mode/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/module-resolution/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/multi-worker/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/node-compat/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/node-env/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/partyserver/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/prerendering/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/prisma/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/react-spa/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/same-worker-service-bindings/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/sensitive-files/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/spa-with-api/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/static-mpa/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/static/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/streaming/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/virtual-modules/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/vitest-setup.ts: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/websockets/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/worker-♫/package.json: [@cloudflare/wrangler]
  • packages/vite-plugin-cloudflare/playground/workflows/package.json: [@cloudflare/wrangler]
  • packages/workers-editor-shared/package.json: [@cloudflare/wrangler]
  • packages/workers-editor-shared/tsconfig.node.json: [@cloudflare/wrangler]
  • packages/workers-playground/package.json: [@cloudflare/wrangler]
  • packages/workers-shared/asset-worker/tests/tsconfig.json: [@cloudflare/deploy-config @cloudflare/wrangler]
  • packages/workers-shared/asset-worker/vitest.config.mts: [@cloudflare/deploy-config @cloudflare/wrangler]
  • packages/workers-shared/package.json: [@cloudflare/deploy-config @cloudflare/wrangler]
  • packages/workers-shared/router-worker/tests/tsconfig.json: [@cloudflare/deploy-config @cloudflare/wrangler]
  • packages/workers-shared/router-worker/vitest.config.mts: [@cloudflare/deploy-config @cloudflare/wrangler]
  • packages/workflows-shared/package.json: [@cloudflare/workflows @cloudflare/wrangler]
  • packages/workflows-shared/tests/context.test.ts: [@cloudflare/workflows @cloudflare/wrangler]
  • packages/workflows-shared/tests/engine.test.ts: [@cloudflare/workflows @cloudflare/wrangler]
  • packages/workflows-shared/tests/tsconfig.json: [@cloudflare/workflows @cloudflare/wrangler]
  • packages/workflows-shared/vitest.config.mts: [@cloudflare/workflows @cloudflare/wrangler]
  • packages/workflows-shared/vitest.config.ts: [@cloudflare/workflows @cloudflare/wrangler]
  • packages/wrangler/e2e/unenv-preset/worker/index.ts: [@cloudflare/wrangler]
  • packages/wrangler/package.json: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/cloudchamber/apply.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/cloudchamber/create.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/cloudchamber/curl.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/cloudchamber/delete.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/cloudchamber/images.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/cloudchamber/list.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/cloudchamber/modify.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/containers/delete.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/containers/deploy.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/containers/images.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/containers/info.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/containers/instances.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/containers/list.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/containers/ssh.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/r2/sql.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/tail.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/vitest.setup.ts: [@cloudflare/wrangler]
  • pnpm-lock.yaml: [@cloudflare/wrangler]
  • pnpm-workspace.yaml: [@cloudflare/wrangler]
  • tools/deployments/validate-catalog-usage.ts: [@cloudflare/wrangler]

Copy link
Contributor

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 6 additional findings.

Open in Devin Review

@pkg-pr-new
Copy link

pkg-pr-new bot commented Mar 18, 2026

create-cloudflare

npm i https://pkg.pr.new/create-cloudflare@12947

@cloudflare/kv-asset-handler

npm i https://pkg.pr.new/@cloudflare/kv-asset-handler@12947

miniflare

npm i https://pkg.pr.new/miniflare@12947

@cloudflare/pages-shared

npm i https://pkg.pr.new/@cloudflare/pages-shared@12947

@cloudflare/unenv-preset

npm i https://pkg.pr.new/@cloudflare/unenv-preset@12947

@cloudflare/vite-plugin

npm i https://pkg.pr.new/@cloudflare/vite-plugin@12947

@cloudflare/vitest-pool-workers

npm i https://pkg.pr.new/@cloudflare/vitest-pool-workers@12947

@cloudflare/workers-editor-shared

npm i https://pkg.pr.new/@cloudflare/workers-editor-shared@12947

wrangler

npm i https://pkg.pr.new/wrangler@12947

commit: b4e4eab

@penalosa penalosa force-pushed the penalosa/vite-8-everywhere branch 2 times, most recently from 40a7953 to 57c5f1c Compare March 18, 2026 02:17
@penalosa penalosa marked this pull request as draft March 18, 2026 02:49
@penalosa penalosa force-pushed the penalosa/vite-8-everywhere branch 3 times, most recently from ef95d91 to f010fc4 Compare March 18, 2026 21:13
- Update default catalog: vite ^8.0.0, vitest 4.1.0, @types/node ^22.10.1
- Remove vitest-3, vitest-4, and vite-plugin catalogs (single default catalog)
- Remove vitest vite overrides from root package.json
- Move all catalog:vitest-3 and catalog:vitest-4 refs to catalog:default
- Update circular-dep packages to @cloudflare/vitest-pool-workers ^0.13.0
- Migrate vitest-pool-workers configs from defineWorkersProject/defineWorkersConfig
  to cloudflareTest() plugin (./config export removed in v4)
- Rename vitest configs to .mts where needed for ESM-only imports
- Fix workflows-shared: unique DO instance IDs (isolatedStorage dropped in v4),
  use workerdUnsafe.abortAllDurableObjects() for DO reset
- Fix pages-shared: await mocked fetchAsset to avoid unhandled rejection
- Fix create-cloudflare: add mockReset, cast beforeAll ctx to RunnerTestSuite
- Fix moduleResolution: node -> bundler for Vite 8 type resolution
- Update @vitest/pool-workers types path in test tsconfigs (./types in v4)
- Bump @vitejs/plugin-react ^5.2.0, @vitejs/plugin-basic-ssl ^2.2.0,
  @tailwindcss/vite ^4.2.1 for Vite 8 peer compat
- Fix pre-existing catalog drift (tree-kill, workerd, typescript, ws)
- Remove vite from root package.json devDependencies
- Add validate-catalog-usage.ts check to enforce catalog usage in CI
@penalosa penalosa force-pushed the penalosa/vite-8-everywhere branch from f010fc4 to 078e710 Compare March 18, 2026 22:20
patch-console was only used as patchConsole(() => {}) — a no-op to silence
console output. This is redundant with the existing mockConsoleMethods() helper.
Removing it also removes the need for the console.Console monkeypatch in
vitest.setup.ts that worked around Vitest 4 stripping the constructor property.
vi.unstubAllEnvs() does not reliably remove env vars from process.env
in Vitest 4 fork mode. Track keys before each test and delete additions
in afterEach.
Vitest 4 requires object destructuring for the first argument in hooks.
A plain parameter name like _fixtures is rejected at parse time.
@penalosa penalosa marked this pull request as ready for review March 19, 2026 01:29
Copy link
Contributor

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

⚠️ 1 issue in files not directly in the diff

⚠️ Stale AGENTS.md describes removed pnpm catalog convention (packages/vite-plugin-cloudflare/AGENTS.md:1)

The packages/vite-plugin-cloudflare/AGENTS.md states "Uses separate pnpm catalog (catalogs.vite-plugin) with different Vite version (7.x) than rest of repo (5.x)" but this PR removes the catalogs.vite-plugin catalog entirely from pnpm-workspace.yaml:46-53 and consolidates all Vite references to catalog:default with vite: "^8.0.0". AI agents relying on this file will be misled about the project's dependency management conventions. Per the repository's own rules in root AGENTS.md, these files provide mandatory guidance to AI coding agents.

View 13 additional findings in Devin Review.

Open in Devin Review

- Set NODE_ENV=development before starting playground dev server (Vitest 4
  defaults to NODE_ENV=test)
- Add ts-expect-error for createCipher/createDecipher removed in @types/node@22
- Remove stale ts-expect-error for node:sqlite (types exist in @types/node@22)
Copy link
Contributor

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

⚠️ 1 issue in files not directly in the diff

⚠️ Stale AGENTS.md describes removed pnpm catalog convention (packages/vite-plugin-cloudflare/AGENTS.md:1)

The packages/vite-plugin-cloudflare/AGENTS.md states "Uses separate pnpm catalog (catalogs.vite-plugin) with different Vite version (7.x) than rest of repo (5.x)" but this PR removes the catalogs.vite-plugin catalog entirely from pnpm-workspace.yaml:46-53 and consolidates all Vite references to catalog:default with vite: "^8.0.0". AI agents relying on this file will be misled about the project's dependency management conventions. Per the repository's own rules in root AGENTS.md, these files provide mandatory guidance to AI coding agents.

View 14 additional findings in Devin Review.

Open in Devin Review

Vitest 4 defaults NODE_ENV to test. Set it to development or production
based on isBuild before starting the Vite server.
Copy link
Contributor

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

⚠️ 1 issue in files not directly in the diff

⚠️ Stale AGENTS.md describes removed pnpm catalog convention (packages/vite-plugin-cloudflare/AGENTS.md:1)

The packages/vite-plugin-cloudflare/AGENTS.md states "Uses separate pnpm catalog (catalogs.vite-plugin) with different Vite version (7.x) than rest of repo (5.x)" but this PR removes the catalogs.vite-plugin catalog entirely from pnpm-workspace.yaml:46-53 and consolidates all Vite references to catalog:default with vite: "^8.0.0". AI agents relying on this file will be misled about the project's dependency management conventions. Per the repository's own rules in root AGENTS.md, these files provide mandatory guidance to AI coding agents.

View 16 additional findings in Devin Review.

Open in Devin Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Untriaged

Development

Successfully merging this pull request may close these issues.

2 participants