Skip to content

test(vite): narrow and validate Vite 7/8 support#367

Open
jkomyno wants to merge 62 commits intomainfrom
tml-2294-vite-support-matrix
Open

test(vite): narrow and validate Vite 7/8 support#367
jkomyno wants to merge 62 commits intomainfrom
tml-2294-vite-support-matrix

Conversation

@jkomyno
Copy link
Copy Markdown
Contributor

@jkomyno jkomyno commented Apr 22, 2026

Summary

  • narrow @prisma-next/vite-plugin-contract-emit peer support to Vite 7 and 8
  • add a focused Vite plugin integration entrypoint and CI matrix job that runs the HMR suite on Vite 7.3.1 and 8.0.9
  • update the canonical Vite plugin docs to match the tested support range and record the current Vite 8 compatibility note

Testing

  • pnpm test:vite-plugin
  • switched @prisma-next/integration-tests to vite@8.0.9 locally and reran pnpm test:vite-plugin

Tracking

Summary by CodeRabbit

  • New Features

    • Added HMR contract generation validation for Vite plugin, verifying behavior during schema edits and recovery.
  • Tests

    • Introduced multi-version Vite compatibility testing (7.3.1 and 8.0.9) with automated CI integration.
  • Documentation

    • Updated Vite plugin documentation and framework integration matrix to clarify official support for Vite 7 and 8.
  • Chores

    • Updated Vite plugin peer dependency range to ^7.0.0 || ^8.0.0.

jkomyno and others added 30 commits April 19, 2026 23:37
The SQL provider was updated to use context.configDir but the mongo
provider was missed, causing watcher/loader path divergence when cwd
differs from the config directory.
…onfigDir

- Switch config-loader from node:path to pathe for consistency with
  the rest of the tooling layer.
- Resolve .ts contract paths inside load() via context.configDir instead
  of capturing process.cwd() at config-definition time, so the watcher
  and loader always reference the same file.
The paths branch omitted the config file from the watch set, so edits
to prisma-next.config.ts (e.g. changing paths or swapping provider)
would not trigger re-emit. Also surface a partial-coverage warning when
loadConfig fails instead of silently falling back.
Close D1 from the PR #356 review by driving a real Vite dev server
through both scenarios that were previously only unit-mocked:
modifying `contract.prisma` re-emits the contract, and editing the
config to swap the declared PSL input re-emits against the new file.
Align with the Mongo PSL provider and with the parser step's sourceId.
The absolute form stays accessible via meta.absoluteSchemaPath for
downstream consumers that need it.
Collapse the ~20-line inline provider that postgres and mongo facades
each build around a dynamic import of the user's `contract.ts`. The
logic (path resolution, pathToFileURL, default-export extraction) is
family-agnostic, so each contract-ts package exposes it as a sibling
to typescriptContract.
- handleTrackedFileChange now runs ctx.file through pathe.resolve
  before comparing against watchedFiles / ignoredOutputFiles, so
  symlinked or case-folded paths line up with the resolved entries.
- resolveContractOutputFiles no longer falls back to the hardcoded
  'src/prisma/contract.json' when contract.output is missing. The
  filter simply skips; defineConfig() guarantees output is present
  in the happy path, and raw-object configs get a clean no-op instead
  of a path the CLI never actually writes.
…ceContext

Left over from the split that moved configDir out of ContractSourceContext
into ContractSourceEnvironment — the context builder no longer needs it.
jkomyno and others added 14 commits April 21, 2026 17:17
…ma/prisma-next into tml-2276-authoritative-watch-inputs
…uts' into tml-2277-vite-plugin-watch-behavior
…watch-behavior

# Conflicts:
#	packages/1-framework/3-tooling/cli/src/config-path-validation.ts
#	packages/1-framework/3-tooling/cli/test/config-loader.test.ts
#	packages/1-framework/3-tooling/vite-plugin-contract-emit/README.md
#	packages/1-framework/3-tooling/vite-plugin-contract-emit/src/plugin.ts
#	packages/1-framework/3-tooling/vite-plugin-contract-emit/test/plugin.test.ts
Extend the Vite plugin HMR integration suite with a PSL recovery journey.
The new test proves a bad edit preserves the last good artifacts on disk
and that a subsequent valid edit re-emits both contract files.

Refs TML-2293
Add two short comments to the Vite HMR recovery integration test so the
intentional failure phase and the expected recovery phase are easier to
scan in review.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 22, 2026

Warning

Rate limit exceeded

@jkomyno has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 34 minutes and 17 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 34 minutes and 17 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: e62a322a-362f-410f-8192-890d7710de60

📥 Commits

Reviewing files that changed from the base of the PR and between 44ab47f and 6bb7f96.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • .github/workflows/ci.yml
  • test/integration/README.md
  • test/integration/package.json
  • test/integration/test/vite-plugin.hmr.e2e.test.ts
📝 Walkthrough

Walkthrough

This pull request adds explicit Vite version support (7 and 8) to the Vite plugin via GitHub Actions CI testing, updated peer dependency constraints, and expanded integration test coverage. A new parallel test matrix job validates the plugin against both Vite versions. Documentation clarifies the supported version scope. Minor code cleanup and test refinements are included.

Changes

Cohort / File(s) Summary
CI Testing Infrastructure
.github/workflows/ci.yml
Adds test-vite-support job that runs in parallel across a Vite version matrix (7.3.1, 8.0.9), dynamically installing each version as a dev dependency and executing Vite plugin tests.
Documentation & Support Matrix
docs/reference/framework-integration-analysis.md, packages/1-framework/3-tooling/vite-plugin-contract-emit/README.md, test/integration/README.md
Updates documentation to explicitly declare Vite 7/8 support scope, documents peer dependency range in plugin README, and adds integration test invocation instructions.
Package Configuration & Scripts
package.json, packages/1-framework/3-tooling/vite-plugin-contract-emit/package.json, test/integration/package.json
Adds root-level test:vite-plugin script, narrows vite peer dependency from >=5.0.0 to ^7.0.0 || ^8.0.0, and configures dedicated pretest and test:vite-plugin scripts in integration test package.
Unit & Integration Tests
packages/1-framework/3-tooling/vite-plugin-contract-emit/test/plugin.test.ts, test/integration/test/vite-plugin.hmr.e2e.test.ts
Refines unit test mock setup and error assertion, adds 116 lines of HMR e2e test to validate contract file stability during schema errors and recovery across dev server reload cycles.
Code Cleanup
packages/1-framework/3-tooling/cli/src/config-path-validation.ts
Removes single blank line within finalizeConfig function.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Seven, Eight—our Vite now thrives,
With tests across both major vibes,
HMR hops and contracts mend,
Two versions blessed—support extends!
sniff sniff

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'test(vite): narrow and validate Vite 7/8 support' directly summarizes the main change: narrowing Vite plugin support to versions 7 and 8, and validating it through testing.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch tml-2294-vite-support-matrix

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread .github/workflows/ci.yml
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented Apr 22, 2026

Open in StackBlitz

@prisma-next/mongo-runtime

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-runtime@367

@prisma-next/family-mongo

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/family-mongo@367

@prisma-next/sql-runtime

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-runtime@367

@prisma-next/family-sql

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/family-sql@367

@prisma-next/middleware-telemetry

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/middleware-telemetry@367

@prisma-next/mongo

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo@367

@prisma-next/extension-paradedb

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/extension-paradedb@367

@prisma-next/extension-pgvector

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/extension-pgvector@367

@prisma-next/postgres

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/postgres@367

@prisma-next/sql-orm-client

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-orm-client@367

@prisma-next/sqlite

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sqlite@367

@prisma-next/target-mongo

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/target-mongo@367

@prisma-next/adapter-mongo

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/adapter-mongo@367

@prisma-next/driver-mongo

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/driver-mongo@367

@prisma-next/contract

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/contract@367

@prisma-next/utils

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/utils@367

@prisma-next/config

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/config@367

@prisma-next/errors

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/errors@367

@prisma-next/framework-components

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/framework-components@367

@prisma-next/operations

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/operations@367

@prisma-next/ts-render

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/ts-render@367

@prisma-next/contract-authoring

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/contract-authoring@367

@prisma-next/ids

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/ids@367

@prisma-next/psl-parser

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/psl-parser@367

@prisma-next/psl-printer

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/psl-printer@367

@prisma-next/cli

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/cli@367

@prisma-next/emitter

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/emitter@367

@prisma-next/migration-tools

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/migration-tools@367

prisma-next

npm i https://pkg.pr.new/prisma/prisma-next@367

@prisma-next/vite-plugin-contract-emit

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/vite-plugin-contract-emit@367

@prisma-next/runtime-executor

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/runtime-executor@367

@prisma-next/mongo-codec

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-codec@367

@prisma-next/mongo-contract

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-contract@367

@prisma-next/mongo-value

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-value@367

@prisma-next/mongo-contract-psl

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-contract-psl@367

@prisma-next/mongo-contract-ts

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-contract-ts@367

@prisma-next/mongo-emitter

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-emitter@367

@prisma-next/mongo-schema-ir

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-schema-ir@367

@prisma-next/mongo-query-ast

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-query-ast@367

@prisma-next/mongo-orm

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-orm@367

@prisma-next/mongo-query-builder

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-query-builder@367

@prisma-next/mongo-lowering

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-lowering@367

@prisma-next/mongo-wire

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/mongo-wire@367

@prisma-next/sql-contract

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-contract@367

@prisma-next/sql-errors

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-errors@367

@prisma-next/sql-operations

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-operations@367

@prisma-next/sql-schema-ir

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-schema-ir@367

@prisma-next/sql-contract-psl

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-contract-psl@367

@prisma-next/sql-contract-ts

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-contract-ts@367

@prisma-next/sql-contract-emitter

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-contract-emitter@367

@prisma-next/sql-lane-query-builder

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-lane-query-builder@367

@prisma-next/sql-relational-core

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-relational-core@367

@prisma-next/sql-builder

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/sql-builder@367

@prisma-next/target-postgres

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/target-postgres@367

@prisma-next/target-sqlite

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/target-sqlite@367

@prisma-next/adapter-postgres

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/adapter-postgres@367

@prisma-next/adapter-sqlite

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/adapter-sqlite@367

@prisma-next/driver-postgres

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/driver-postgres@367

@prisma-next/driver-sqlite

npm i https://pkg.pr.new/prisma/prisma-next/@prisma-next/driver-sqlite@367

commit: 6bb7f96

Comment thread .github/workflows/ci.yml Outdated
Comment thread .github/workflows/ci.yml Outdated
Comment thread .github/workflows/ci.yml Outdated
Co-authored-by: Alberto Schiabel <jkomyno@users.noreply.github.com>
Signed-off-by: Alberto Schiabel <jkomyno@users.noreply.github.com>
Comment thread .github/workflows/ci.yml
Signed-off-by: Alberto Schiabel <jkomyno@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

@SevInf SevInf left a comment

Choose a reason for hiding this comment

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

I would prefer we'd make it easier to run tests loсally. Right now, specific vite version are hardcoded in CI, pnpm outdated and renovate will not find them and we are almost certainly will forget to update them in time.

Additionally, running it locally requires copying very specific command from a GH Workflow and then not forgetting to undo your changes before you commit.

My suggestion is to do it that way:

  • Add both versions to our dependencies explicitly under different aliases.
  • Importing both in the test file:
import * as vite7 from 'vite7'
import * as vite8 from 'vite8'
  • Wrapping existing tests into a function that accepts generalized version of vite.createServer as an input
  • run those tests over both vite7.createServer and vite8.createServer

Base automatically changed from tml-2293-vite-plugin-test-coverage to main April 22, 2026 14:21
…-matrix

# Conflicts:
#	packages/1-framework/3-tooling/cli/src/config-path-validation.ts
#	packages/1-framework/3-tooling/vite-plugin-contract-emit/src/plugin.ts
#	packages/1-framework/3-tooling/vite-plugin-contract-emit/test/plugin.test.ts
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
packages/1-framework/3-tooling/vite-plugin-contract-emit/README.md (1)

14-14: Simplify the compatibility note by removing internal implementation detail.

The phrase "there is no Vite-8-specific code path today, so the support matrix exists to catch future hook or overlay regressions early" is internal implementation reasoning that doesn't materially affect how users interact with the plugin. As per coding guidelines, user-facing package READMEs should avoid internal implementation detail unless it materially affects usage.

📝 Simplified compatibility note
-- Compatibility note: the current implementation uses the same `configureServer` and `handleHotUpdate` flow on Vite 7 and Vite 8; there is no Vite-8-specific code path today, so the support matrix exists to catch future hook or overlay regressions early
+- Compatibility note: the plugin uses the same `configureServer` and `handleHotUpdate` flow on both Vite 7 and Vite 8

Or remove it entirely if the implementation approach doesn't affect usage decisions.

As per coding guidelines: "For user-facing packages, keep README.md focused on what the package does, when to use it, and a few concrete examples. Avoid internal implementation detail unless it materially affects usage"

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/1-framework/3-tooling/vite-plugin-contract-emit/README.md` at line
14, The compatibility note in README.md includes internal implementation detail
("there is no Vite-8-specific code path today, so the support matrix exists to
catch future hook or overlay regressions early"); remove that clause or replace
it with a short, user-focused statement such as "Compatibility: works with Vite
7 and Vite 8" so the README only communicates compatibility to users and omits
internal reasoning; edit the line containing the compatibility note to delete
the internal explanation and keep a concise, user-facing compatibility message.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 188-209: The new CI job "test-vite-support" is missing the
TEST_TIMEOUT_MULTIPLIER environment setting used by other test jobs, causing
flakiness; modify the test-vite-support job to include an env block that sets
TEST_TIMEOUT_MULTIPLIER: 2 (same as other CI test jobs) so the Vite matrix runs
use the shared timeout multiplier; locate the job by the name test-vite-support
in the workflow and add the env entry alongside existing keys to ensure the HMR
suite uses the increased timeout under CI load.

In `@test/integration/test/vite-plugin.hmr.e2e.test.ts`:
- Around line 443-557: Remove the duplicated "it('preserves the last good
artifacts after a bad PSL edit and recovers on the next good edit')" test block
(keep only the intended single copy), replace the hardcoded setTimeout delay
(new Promise(resolve => setTimeout(resolve, 100))) with the shared short timeout
helper from `@prisma-next/test-utils` (use the project's timeouts constant, e.g.
timeouts.fileWatchDebounce or a similar named helper), and avoid waiting the
full long TypeScript compilation timeout on the passing path by changing the
waitForFileChange calls that pass initialJsonStats.mtimeMs /
initialDtsStats.mtimeMs with timeouts.typeScriptCompilation to use a shorter
helper timeout (or a smaller explicit timeout constant from timeouts) for the
success path; adjust calls to waitForFileChange, readJsonFileWhenReady,
replaceInFileOrThrow and server.watcher.emit accordingly so the test is no
longer duplicated and uses the shared timeout helpers instead of raw numbers.

---

Nitpick comments:
In `@packages/1-framework/3-tooling/vite-plugin-contract-emit/README.md`:
- Line 14: The compatibility note in README.md includes internal implementation
detail ("there is no Vite-8-specific code path today, so the support matrix
exists to catch future hook or overlay regressions early"); remove that clause
or replace it with a short, user-focused statement such as "Compatibility: works
with Vite 7 and Vite 8" so the README only communicates compatibility to users
and omits internal reasoning; edit the line containing the compatibility note to
delete the internal explanation and keep a concise, user-facing compatibility
message.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: 542d438a-2028-411f-ba89-8eeacd3ee72c

📥 Commits

Reviewing files that changed from the base of the PR and between 3134f51 and 44ab47f.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (10)
  • .github/workflows/ci.yml
  • docs/reference/framework-integration-analysis.md
  • package.json
  • packages/1-framework/3-tooling/cli/src/config-path-validation.ts
  • packages/1-framework/3-tooling/vite-plugin-contract-emit/README.md
  • packages/1-framework/3-tooling/vite-plugin-contract-emit/package.json
  • packages/1-framework/3-tooling/vite-plugin-contract-emit/test/plugin.test.ts
  • test/integration/README.md
  • test/integration/package.json
  • test/integration/test/vite-plugin.hmr.e2e.test.ts
💤 Files with no reviewable changes (1)
  • packages/1-framework/3-tooling/cli/src/config-path-validation.ts

Comment thread .github/workflows/ci.yml
Comment thread test/integration/test/vite-plugin.hmr.e2e.test.ts Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants