diff --git a/.changeset/vitest-5-shared-server-projects.md b/.changeset/vitest-5-shared-server-projects.md new file mode 100644 index 00000000..7781421a --- /dev/null +++ b/.changeset/vitest-5-shared-server-projects.md @@ -0,0 +1,5 @@ +--- +'@solidjs/vite-plugin': patch +--- + +When the root config declares `test.projects` and leaves `test.sharedViteServer` unset, the plugin now sets it to `false` so every inline project resolves its own Vite config, as under Vitest 4; an explicit value is respected. Vitest 5 defaults the option to `true`, and a shared inline project takes its `test` options from the raw root block captured before any `config` hook runs, so it lost everything the plugin injects (posture, the `@testing-library/jest-dom` setup file, `server.deps`). Refs #369. diff --git a/README.md b/README.md index 68b757cc..052b23f3 100644 --- a/README.md +++ b/README.md @@ -1045,6 +1045,8 @@ test: { }, ``` +The posture is chosen while each project resolves its own Vite config. Vitest 5 lets inline projects reuse the root Vite server instead (`test.sharedViteServer`, on by default), which skips that step, so the plugin sets `sharedViteServer: false` when the root config declares `test.projects` — trading Vitest 5's shared-server optimization for the per-project resolution Vitest 4 always did. Setting the option yourself overrides this; with `true`, every shared project runs with the root config's posture, without the injected `jest-dom` setup file, and without the plugin's `server.deps` handling (the framework inlined for the server posture, externalized for the client one). + # Credits - [solid-js](https://github.com/solidjs/solid) diff --git a/examples/start-ssr/test/run.mjs b/examples/start-ssr/test/run.mjs index b898951a..b490f634 100644 --- a/examples/start-ssr/test/run.mjs +++ b/examples/start-ssr/test/run.mjs @@ -5231,6 +5231,53 @@ async function runVitestMode() { projectsEnvPass ? undefined : projectsEnvError || `environment: ${projectsEnv}`, ); + // Vitest 5 defaults `test.sharedViteServer` to true, and a shared inline + // project takes its `test` options from the raw root block captured before + // any `config` hook runs — so it would never see the posture, jest-dom + // setup file, or server.deps the plugin injects (#369). The plugin turns + // sharing off when the root declares `test.projects` and the user hasn't + // chosen. Asserted at the config-resolution level, which is + // version-independent: the examples pin vitest 4, where the option has no + // effect, but the resolved value is what Vitest 5's getOwnServerReason + // reads. + const resolveSharedViteServer = async (testBlock) => { + const resolved = await resolveConfig( + { root: exampleDir, mode: 'test', test: testBlock }, + 'serve', + ); + return resolved.test?.sharedViteServer; + }; + const projectsBlock = [{ extends: true, test: { name: 'node', environment: 'node' } }]; + let sharedWithProjects; + let sharedWithoutProjects; + let sharedExplicit; + let sharedError = ''; + try { + sharedWithProjects = await resolveSharedViteServer({ projects: projectsBlock }); + sharedWithoutProjects = await resolveSharedViteServer({}); + sharedExplicit = await resolveSharedViteServer({ + projects: projectsBlock, + sharedViteServer: true, + }); + } catch (e) { + sharedError = String(e); + } + const sharedPass = + !sharedError && + sharedWithProjects === false && + sharedWithoutProjects === undefined && + sharedExplicit === true; + record( + mode, + 'shared-vite-server', + 'root config with test.projects gets sharedViteServer: false (untouched without projects, explicit true preserved)', + sharedPass, + sharedPass + ? undefined + : sharedError || + `projects: ${sharedWithProjects}, none: ${sharedWithoutProjects}, explicit: ${sharedExplicit}`, + ); + // The jest-dom setup file is injected only when the PROJECT can resolve // `@testing-library/jest-dom` — by walking node_modules up from the Vite // root, the way vitest itself resolves bare `setupFiles`. Two ways the diff --git a/src/index.ts b/src/index.ts index f4d66873..f370343a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1192,6 +1192,16 @@ export default function solidPlugin(options: Partial = {}): Plugin[] { test.environment = 'jsdom'; } + // Vitest 5 defaults `test.sharedViteServer` to true: inline projects + // then reuse the root Vite server and take their `test` options from + // the raw root block captured BEFORE any `config` hook runs, so nothing + // injected here (posture, jest-dom, server.deps) reaches them. Vitest + // reads the option off the resolved root config (getOwnServerReason), so + // this restores per-project resolution as under Vitest 4 (#369). + if (userTest.projects && userTest.sharedViteServer === undefined) { + test.sharedViteServer = false; + } + if (serverTestPosture) { // The worker pool is shared across the whole vitest workspace and // imports externalized deps natively with `--conditions` derived