Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/vitest-5-shared-server-projects.md
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
47 changes: 47 additions & 0 deletions examples/start-ssr/test/run.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1192,6 +1192,16 @@ export default function solidPlugin(options: Partial<Options> = {}): 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
Expand Down
Loading