Version Packages (next) - #368
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/next
branch
2 times, most recently
from
September 18, 2026 10:22
a17b25f to
cd955af
Compare
github-actions
Bot
force-pushed
the
changeset-release/next
branch
from
September 18, 2026 10:27
cd955af to
a218c30
Compare
commit: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to next, this PR will be updated.
nextis currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, runchangeset pre exitonnext.Releases
@solidjs/vite-plugin@3.0.0-next.44
Minor Changes
22858a3:
start.node: the build emits a ready-to-run Node server. Withstart: { node: true }the ssr build writesdist/server/node.jsbesideserver.js—node dist/server/node.js(envPORT, default 3000, andHOST) serves the client build statically (files underbuild.assetsDirasCache-Control: public, max-age=31536000, immutable, everything elsepublic, max-age=0, must-revalidatewithLast-Modified; a reasonable MIME table,HEAD, dot-segment paths and..traversal refused) and hands every other request tohandleRequestwith the raw Node request asnativeEvent, sogetRequestEvent().nativeEventanswers the same as undervite devandvite preview. The node<->web bridge is the plugin's ownsrc/http.ts— the code the dev and preview middlewares already run (HTTP/2 pseudo-headers,https:on TLS sockets, client disconnects as the request'sAbortSignal, HEAD short-circuit,set-cookiesplit, backpressure that also settles on close) — shipped as a separate build artifact of the package (dist/node-entry.mjs) that the plugin reads at build time and emits under a small generated header carrying the emit-time constants (client dir relative to the server dir,assetsDir,base, the mode). The file is ESM with no dependency beyondnode:*and./server.js, listens only when run directly, and exportslistener(the(req, res)function, mountable intohttp.createServer, Express, Fastify),createListener({ static?, event? })—static: falseleaves files and the client-modeindex.htmlfallback to a framework such asexpress.staticor a CDN and keeps only the bridge;event: (req) => fieldsmerges extra request-event fields over{ nativeEvent: req }— andserve({ port?, host?, static?, event? }).Why: the fullstack templates shipped a hand-written
server.jswhose bulk was this generic Node bridge, copied into every scaffold and baked into the CLI, so bridge fixes never reached users — and it looked custom-made. Node is the one mainstream runtime without a fetch-shaped server API (Workers, Deno, Bun, Netlify, Nitro consume the server bundle's{ fetch }directly), so the gap is Node-only and belongs in the build output. It is astart.*option, notssr.*(ssrstays boolean-only), and applies to both start modes: SSR mode renders pages; client mode withserverFunctions(which keepsdist/server) serves the static client with anindex.htmlhistory fallback for HTML navigations plus the endpoint.node.jsis an emitted asset, never a second build input —server.jsand itshandleRequest/{ fetch }contracts are unchanged, and nothing changes without the option. Where no server bundle exists (client mode withoutserverFunctions, orstart.external) the build warns and emits nothing. Compression/proxy stance unchanged: plain HTTP, put a reverse proxy or CDN in front. Follow-ups this unlocks: the templates dropserver.jsand point theirstartscript atnode dist/server/node.js; create-solid drops its bakedSERVER_JSconstant.Patch Changes
7fa5aa3: Avoid overriding environments configured in Vitest workspaces and projects with the
jsdomdefault (forward-port of Avoid overriding environments configured in Vitest workspaces #323 by @carloitaben, fixes Test environment detection doesn't consider Vitest workspaces #205). A root config that definestest.projects(or the pre-Vitest-4test.workspace) runs no tests itself, so it no longer getstest.environment: 'jsdom'injected — which made Vitest probe for (and prompt to install) jsdom at startup even when every project runs under node or in browser mode. Each project keeps controlling its own environment.d30f051: Only inject the
@testing-library/jest-domVitest setup file when the package resolves from the project root (forward-port of fix: resolve @testing-library/jest-dom from the project root #364 by @brenelz, fixes Check for@testing-library/jest-domdoesn't guarantee it's safe to use assetupFilesin Vitest #231). Previously the check ran from the plugin's own location, so with pnpm a transitive jest-dom (for example via Storybook) made Vitest fail withFailed to load url .../@testing-library/jest-dom/vitest. The probe now walksnode_modulesup from the Vite root the way Vitest resolves baresetupFiles— deliberately ignoringNODE_PATH, which pnpm's bin shims (pnpm vitest) point at the hoisted virtual store where every transitive dependency is reachable.2e79544: Require solid-js / @solidjs/web 2.0.0-rc.9 (peer floor) and compile with @solidjs/compiler / @solidjs/babel-plugin rc.9 — runtime and compiler move in lockstep. The rc.9 compilers emit output only the rc.9 runtime understands, so this floor is a hard requirement, not policy: native elements with several spread sources compile to the runtimes' array form (
spread(el, [a, b], …)on the client,ssrElement(tag, [a, b], …)on the server — nomergeProps()proxy, no memo, no hydration id; #3418/#3419/#3423) which only rc.9's@solidjs/webaccepts; delegated event handlers move off Solid 1's$$<type>element key onto_$$<type>in both compiled output and the runtime's document delegate, so an rc.8 runtime would never fire an rc.9-compiledonClick(and vice versa); and undercomponentNames— which the plugin already turns on for its dev and observe postures — SSR output keepscreateComponent(Comp, props, "Comp")so the server runtime's observe/dev tier labels the owner and a server finding'sownerPathreads<App> › <Page>like the client's. Nothing in the plugin itself had to change for rc.9: the newobserve/developmentexport conditions on@solidjs/web's server-functions and frames client entries (andobserveon every server entry) are picked up by the condition lists the plugin already installs, and the newsolid-js/internalsubpath is covered by the existingsolid-jsinlining.256c25d:
start.instrument: a server-only module the plugin runs to completion before anything else in the server graph loads — the app, the middleware,@solidjs/web, every dependency. The seam for instrumentation that must patch the runtime before the modules it patches are loaded (an APM's OpenTelemetry setup, a profiler, amodule.registerhook), honored on every surface:vite dev,vite build,vite preview, and a host consuming the handler entry. Replaces the per-hostnode --import instrument.mjsdance.Import order cannot do this in ESM — static imports are hoisted and evaluated in dependency order — so the generated handler entry becomes
await import(instrument); await import(handler), with the handler's surface (handleRequest, thefetchdefault) re-declared by name. The module may be async and needs no exports; the server build must keep code splitting on (the default).Also: the
componentNamesnote in the compiler options no longer calls the labels DOM-only — the SSR generate emits them too from the compilers that carry feat(compiler,babel-plugin,solid): componentNames for SSR output; ssrScope swaps the id-bearing owner solid#3441 (2.0.0-rc.9), and the start-ssr suite gains anobservemode that asserts anobserve: trueproduction build resolves the observe artifacts and carries component labels (the SSR half asserted once the workspace rides an rc that emits them).