Skip to content

Require solid 2.0.0-rc.7; drop the async render head-commit workaround - #350

Merged
ryansolid merged 3 commits into
nextfrom
require-solid-rc7
Sep 8, 2026
Merged

Require solid 2.0.0-rc.7; drop the async render head-commit workaround#350
ryansolid merged 3 commits into
nextfrom
require-solid-rc7

Conversation

@ryansolid

@ryansolid ryansolid commented Sep 6, 2026

Copy link
Copy Markdown
Member

Companion to solidjs/solid#3292, which makes `@solidjs/web` freeze the response head when an awaited `renderToStream` completes (before the render owner is disposed). The plugin-side workaround from #349 never shipped, so it is simply removed rather than deprecated:

  • generated SSR entry back to the pre-Add start.renderMode ('stream' | 'async') with per-request module and handleRequest override #349 shape: no `onCompleteAll: commitResponseHead`, no `commitResponseStub` import
  • README: authored entries need no hook; caveat replaced with the rc.7 statement
  • the unreleased `start-render-mode` changeset now states the rc.7 floor (no separate changeset — nothing to "remove" from a user's point of view)
  • `peerDependencies`: `solid-js` / `@solidjs/web` `^2.0.0-rc.0` → `^2.0.0-rc.7`

No plugin release is cut before rc.7, so this lands together with the rc.7 ride commit (workspace catalog → `^2.0.0-rc.7`, lockfile, `minimumReleaseAgeExclude` entries) once rc.7 is on npm, and the pending Version Packages PR picks it all up as one release. Until then, against rc.6 the `render-mode` suite fails exactly the six async head assertions (`httpStatus(404)`, `httpHeader`, pre-flush `Location` × dev/prod; 114/120 otherwise) — the behaviour this PR intentionally hands back to the runtime.


Update — rc.7 is on npm; this PR now also carries:

  • ec7ba9b test: ride solid 2.0.0-rc.7 — workspace catalog → ^2.0.0-rc.7, minimumReleaseAgeExclude extended, lockfile re-resolves every @solidjs/* package to rc.7 (plugin caret ranges untouched). No dist/dev.* paths or patch-channel references in the plugin to update.
  • a810d09 fix: inline solid-js and @solidjs/web in dev server environments (patch changeset). rc.7 adds dist/server.dev.* to both packages behind the nested development condition (solidjs/solid 80ff52e). externalConditions only reaches the runner's own resolutions; the externalized @solidjs/web's native import "solid-js" resolved to the prod copy while the app got the runner's dev copy → two framework instances, and every dev SSR page with a lazy() component died with lazy() called with moduleUrl … but no asset manifest is set (ssr / css-matrix / start-ssr / start-client dev modes all red). Both core packages now go into resolve.noExternal whenever the plugin injects dev mode into a server environment (vitest projects and noExternal: true hosts untouched). Verified with a Node resolve hook: zero native loads of any solid dist file. Also drops the stale ssr: { external: ['solid-js'] } "TEMPORARY" override in the ssr and css-matrix examples.

Full gate against published rc.7: ssr 12/12 + boundary 8/8, css-matrix 87/87 + bridge 19/19, start-ssr 486/486 (render-mode 120/120 — the six async head assertions now pass) + http-bridge 10/10 + components-warning 9/9, start-client 45/45, start-env 47/47, vite-8 vitest 1/1, cypress 1/1.

@changeset-bot

changeset-bot Bot commented Sep 6, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a810d09

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@solidjs/vite-plugin Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

rc.7 (solidjs/solid#3292) freezes the response head when an awaited
renderToStream completes, before the render is disposed, so the generated
SSR entry no longer needs to commit the stub from onCompleteAll and authored
entries need no hook. Peer floors move to ^2.0.0-rc.7; README caveat and the
unreleased render-mode changeset drop the workaround wording.

Against rc.6 the render-mode suite fails exactly the six async head
assertions (status/header/Location, dev+prod); the rc.7 ride commit
(catalog + lockfile + minimumReleaseAgeExclude) turns them green.

Co-authored-by: Cursor <cursoragent@cursor.com>
@ryansolid
ryansolid marked this pull request as ready for review September 6, 2026 06:37
ryansolid and others added 2 commits September 8, 2026 10:00
rc.7 ships solidjs/solid#3292: an awaited renderToStream freezes the
response head before dispose, which is the runtime behaviour the
previous commit's peer floor (^2.0.0-rc.7) requires. The workspace
catalog moves to ^2.0.0-rc.7 (minimumReleaseAgeExclude extended per the
existing pattern) and the lockfile re-resolves solid-js, @solidjs/web,
@solidjs/signals, @solidjs/compiler (+ platform binaries),
@solidjs/babel-plugin and @solidjs/diagnostics to rc.7. The plugin's own
caret ranges already float and are left as-is.

Audited the rc.7 notes against the plugin: no hard-coded dist/dev.*
paths (bd22ac8 rename), no patch-channel option or test (d601119).

Co-authored-by: Cursor <cursoragent@cursor.com>
solid 2.0.0-rc.7 adds `dist/server.dev.*` builds to solid-js and
@solidjs/web, selected by the `development` export condition nested
under `node`/`worker`/`deno` (solidjs/solid 80ff52e). The plugin already
prepends `development` to `resolve.externalConditions`, but that only
reaches the imports Vite's module runner resolves itself: an externalized
package's OWN imports go through Node with Node's conditions. Under
`vite dev` the runner therefore loaded @solidjs/web's dev copy, whose
native `import "solid-js"` landed on solid-js's PROD copy, while the
app's own `solid-js` import was the runner's DEV copy — two instances of
the framework. renderToStream installed the asset resolver on one
sharedConfig and lazy() read the other, so every dev SSR page with a
lazy() component failed with "lazy() called with moduleUrl … but no
asset manifest is set" (ssr, css-matrix, start-ssr and start-client dev
modes all red against rc.7); owner tracking, request events and
hydration keys were split the same way. rc.6 had no solid-js dev server
build, so both paths resolved to the same file and the split was
invisible.

The two core packages now go into `resolve.noExternal` for every server
environment the plugin injects dev mode into, so all resolutions — theirs
included — use the environment's conditions and one dev build is loaded
end to end (verified with a Node resolve hook: zero native loads of any
solid dist file). Vitest projects keep managing their own inlining via
`test.server.deps`, and a host that set `noExternal: true` is untouched.

Also drops the `ssr: { external: ['solid-js'] }` override the ssr and
css-matrix examples carried as a TEMPORARY workaround for a since-removed
workspace link; it now fights the plugin's default.

Co-authored-by: Cursor <cursoragent@cursor.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updated@​solidjs/​diagnostics@​2.0.0-rc.6 ⏵ 2.0.0-rc.778 +2100100 +193 +1100
Updated@​solidjs/​babel-plugin@​2.0.0-rc.6 ⏵ 2.0.0-rc.78010010093100
Updated@​solidjs/​compiler@​2.0.0-rc.6 ⏵ 2.0.0-rc.78110010093 +1100
Updated@​solidjs/​web@​2.0.0-rc.6 ⏵ 2.0.0-rc.710010083 +197100
Updatedsolid-js@​2.0.0-rc.6 ⏵ 2.0.0-rc.7100 +110095 +196100

View full report

@pkg-pr-new

pkg-pr-new Bot commented Sep 8, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@solidjs/vite-plugin@350

commit: a810d09

@ryansolid
ryansolid merged commit ed25117 into next Sep 8, 2026
6 checks passed
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.

1 participant