Environment
@solidjs/vite-plugin 3.0.0-next.44
vitest 5.0.1, multi-project (projects), pool: threads, isolate: false
solid-js / @solidjs/web 2.0.0-rc.9
@solidjs/testing-library 1.0.0-beta.3
Reproduction
A vitest config with two projects, one jsdom ("client") and one node ("server"):
test: {
projects: [
{ test: { name: "client", environment: "jsdom", include: ["src/**/*.test.tsx"] } },
{ test: { name: "server", environment: "node", include: ["src/server/**/*.test.ts"] } },
],
}
In a test file, import { isServer } from "@solidjs/web" is false (correct browser build). But inside @solidjs/testing-library's render, @solidjs/web is the server build (isServer === true), so render/hydrate behave incorrectly.
Root cause
In the client/jsdom test posture the plugin injects browser into resolve.conditions (fixing inlined modules) but leaves @solidjs/web and @solidjs/testing-library externalized — and explicitly externalizes solid-js via test.server.deps.external: [/solid-js/]. Externalized modules are executed natively by Node, whose resolution conditions are ['node', 'import', 'default'] (no browser). So @solidjs/testing-library's own import { render, hydrate } from "@solidjs/web" resolves the node export (dist/server.js).
The plugin already handles the inverse case for the node/server posture by inlining /solid-js/ + /@solidjs[+/]web/, but the client posture gets no equivalent treatment.
Workaround
Inline the runtime packages so their imports resolve through Vite's browser condition:
test: {
server: {
deps: {
inline: ["solid-js", "@solidjs/web", "@solidjs/testing-library"],
},
},
}
(deps.inline takes precedence over deps.external.)
Environment
@solidjs/vite-plugin3.0.0-next.44vitest5.0.1, multi-project (projects),pool: threads,isolate: falsesolid-js/@solidjs/web2.0.0-rc.9@solidjs/testing-library1.0.0-beta.3Reproduction
A vitest config with two projects, one
jsdom("client") and onenode("server"):In a test file,
import { isServer } from "@solidjs/web"isfalse(correct browser build). But inside@solidjs/testing-library'srender,@solidjs/webis the server build (isServer === true), sorender/hydratebehave incorrectly.Root cause
In the client/jsdom test posture the plugin injects
browserintoresolve.conditions(fixing inlined modules) but leaves@solidjs/weband@solidjs/testing-libraryexternalized — and explicitly externalizessolid-jsviatest.server.deps.external: [/solid-js/]. Externalized modules are executed natively by Node, whose resolution conditions are['node', 'import', 'default'](nobrowser). So@solidjs/testing-library's ownimport { render, hydrate } from "@solidjs/web"resolves thenodeexport (dist/server.js).The plugin already handles the inverse case for the
node/server posture by inlining/solid-js/+/@solidjs[+/]web/, but the client posture gets no equivalent treatment.Workaround
Inline the runtime packages so their imports resolve through Vite's
browsercondition:(
deps.inlinetakes precedence overdeps.external.)