WIP: Upgrade to solid 2 beta#2091
Draft
brenelz wants to merge 50 commits into
Draft
Conversation
✅ Deploy Preview for solid-start-landing-page ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
🦋 Changeset detectedLatest commit: ab9a641 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
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 |
commit: |
brenelz
commented
Mar 4, 2026
brenelz
commented
Mar 4, 2026
brenelz
commented
Mar 4, 2026
brenelz
commented
Mar 7, 2026
brenelz
commented
Mar 7, 2026
lxsmnsyc
reviewed
Mar 9, 2026
Member
|
We can probably use |
Member
|
needs rebasing |
- Update leftover accessor-style children callbacks to beta.15 semantics: non-keyed <For> and keyed <Show> now pass raw values, not accessors (notes, hackernews, todomvc fixtures + one missed spot in the dev overlay) - Patch terracotta to shim removed @solidjs/web createDynamic export - Align @solidjs/signals in apps/tests with solid-js 2.0.0-beta.15 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts: # apps/tests/vite.config.ts # packages/start/package.json # packages/start/src/config/index.ts # packages/start/src/fns/handler.ts # packages/start/src/fns/server.ts # packages/start/src/server/handler.ts # pnpm-lock.yaml
- onSettled no longer accepts async callbacks (a returned Promise is an invalid cleanup value) — wrap the async work in a void IIFE across the test routes, and convert main's new server-env route from createEffect(async) to the same pattern - dev overlay: Errored's fallback now receives an accessor, and signal writes inside the boundary's owned scope throw — read the error and defer the push to a microtask Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
In Solid 2, createEffect's compute runs during SSR, so the export check executed on the server — where the "use server" module legitimately still exports testQuery — baking "true" into the markup. Use onSettled (a server no-op) like the other server-function routes so the check runs against the client module, where non-function exports are stripped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
terracotta next.6 migrated to solid 2.0.0-beta.15 (own createDynamic helper, JSX types from @solidjs/web), so the pnpm patch shimming the removed @solidjs/web createDynamic export is no longer needed, and the dev overlay's Select props no longer need the `as any` cast. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
katywings
reviewed
Jul 8, 2026
brenelz
commented
Jul 8, 2026
Bring back the withAssets logic in shared/lazy.ts (id$$ manifest lookup + useAssets injection with nonce), adapted to beta.15 where lazy() takes a required moduleUrl in SSR: - config/lazy.ts: inject vite-plugin-solid's __SOLID_LAZY_MODULE__ placeholder into user-land lazy() calls before rewriting the solid-js import, since the plugin only injects it for "solid-js" imports - server/handler.ts: resolve unknown moduleUrls in the dev manifest via a Proxy fallback so client hydration can preload lazy modules in dev - css fixture: replace removed createAsync with createMemo, pass an explicit moduleUrl for the import.meta.glob lazy, and fix onSettled returning a non-cleanup value Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The raw-HTML-string workaround existed for a babel-plugin-jsx-dom-expressions spread crash that's fixed in 0.50.0-next.14. The remaining blocker was beta.15's owner-based hydration keys: useAssets thunks run at shell-injection time with no owner, so ssrElement's getNextContextId call threw and killed the server process. Wrapping the asset JSX in <NoHydration> provides an owner with hydration-key generation disabled — correct for head tags, which never hydrate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Solid v2 renders the css already itself
Co-authored-by: Cursor <cursoragent@cursor.com>
The dom-expressions asset registry + vite-plugin-solid's virtual manifests now cover everything Start's custom plumbing did: - pass virtual:solid-manifest straight to renderToString/renderToStream (dev: async resolver collecting inline styles from the module graph; prod: the client build manifest), replacing getSsrManifest, collect-styles, and the per-request asset collection in createPageEvent - register entry-owned CSS at render start in dev (the resolver manifest can't be enumerated by the runtime) and inject vite-plugin-solid's devStylePatch for HMR adoption of streamed style tags - acquire/release route CSS on the client through virtual:solid-manifest/client + acquireAsset, keyed by route source, so navigations add stylesheets before paint and drop them on leave - use solid-js lazy directly; its moduleUrl transform, hydration-id keyed module map, and modulepreload registration replace Start's wrapper and the lazy() config transforms - delete the now-unused manifest/, assets/, collect-styles, shared/lazy modules and the capture-client-bundle plugin Co-authored-by: Cursor <cursoragent@cursor.com>
…ization protocol Deletes src/directives/* in favor of the serverFunctions() plugin hoisted into vite-plugin-solid (same compiler, plus root-relative function id hashing and a persisted client->SSR manifest for two-invocation builds). Ports fns/serialization.ts onto @solidjs/web/serialization: the default JSON codec now gets its plugin set, feature policy, and depth limit from the shared protocol layer, and the opt-in "js" (eval) mode shares the same plugin resolution. Files are annotated with a protocol/generic/ policy taxonomy to guide what hoists next. Co-authored-by: Cursor <cursoragent@cursor.com>
Start's fns layer is now configuration over the core runtime: the client re-exports the fetch transport (endpoint set from BASE_URL), the server configures event provisioning and endpoint over the core registry, and the HTTP handler is core handleServerFunctionRequest with Start's policies as hooks (single-flight collection, no-JS flash cookie). The bespoke registration/serialization/shared modules and the customBody shim are deleted — the router (0.17.0-next.5) consumes the core protocol directly. The eval-based SEROVAL_MODE option is dropped. Everything now resolves from the published stack: solid 2.0.0-beta.19, router 0.17.0-next.5, vite-plugin-solid 3.0.0-next.11 (local link overrides removed). Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
brenelz
commented
Jul 20, 2026
| esbuildOptions: { | ||
| plugins: [ | ||
| { | ||
| name: "solid-compat", |
Contributor
Author
There was a problem hiding this comment.
this can probably be removed
Single-flight collection and the no-JS flash-cookie convention move to
@solidjs/router (their vocabulary — query cache keys, submissions — is
the router's). handleSingleFlight's data-only app render, transformResult,
createSingleFlightHeaders, handleNoJS, and the flash-cookie SSR seeding
are deleted; the handler wires createFlightDataCollector({ routes, base })
(the router's pure preload runner over the file-system route tree) and
createNoJSHandler({ base }) from @solidjs/router/server into the core
handler hooks. TEMPORARY workspace overrides link the sibling
solid-router/solid checkouts until the releases carrying the flight
bridge ship.
Co-authored-by: Cursor <cursoragent@cursor.com>
Start's GET read the client proxy's .GET property, which the core extension surface removed (references now declare their method through GET(fn) over the metadata channel). The shim would silently return undefined; @solidjs/start now re-exports GET from @solidjs/web/server-functions so the import surface is unchanged. Co-authored-by: Cursor <cursoragent@cursor.com>
… 3.0.0-next.14 The published releases now carry the flight bridge and the router's server-function integration, so the TEMPORARY workspace links to the sibling solid/solid-router checkouts are removed in favor of pinned versions. Co-authored-by: Cursor <cursoragent@cursor.com>
…rror test Solid pins move to beta.22 across packages/start, apps/tests, and the fixtures; the minimumReleaseAge exclusions follow (babel-plugin-jsx to 0.50.0-next.25 via babel-preset-solid). vite-plugin-solid stays at 3.0.0-next.14. The runtime now percent-encodes non-latin1 messages on the X-Server-Function-Error header behind the =?1? marker with a symmetric client decoder, so the unicode error propagation test is unskipped and tightened to assert the message round-trips exactly. Co-authored-by: Cursor <cursoragent@cursor.com>
…tory
The router 1.0 removes the component API, so @solidjs/start/router now
exports the file-system route tree as a value — fileRoutes — instead of
the FileRoutes component; apps pass it to createRouter({ routes }) and
render the returned instance with their root layout as the render-prop
child. Routes are immutable per instance, so one shared tree replaces
the per-request build: PageEvent.routes is gone and the single-flight
collector consumes fileRoutes directly. The tests app and fixtures move
to the factory (rootPreload becomes the factory's preload option,
<Navigate> becomes useNavigate during setup, <A> becomes plain anchors
with active styling on the router's [data-active] attribute).
Known blocker: client hydration fails against this router build because
setupLinkClaims creates a client-only createRenderEffect under the
id-carrying router owner, consuming a hydration child id the server
never allocates — every subsequent id shifts and lazy route modules are
not preloaded before hydration. 19 of 26 e2e tests fail on it; needs an
upstream router fix (the claims effect must not consume hydration ids).
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Vite's bundledDev serves only bundled output filenames and provides no API to map a module id to its served URL, so Start's streamed-SSR preload/hydration hints emit URLs that 404 and hydration of code-split routes fails. Warn at dev-server startup instead of degrading silently, and drop the e2e:bundled-dev leg from test:all until Vite ships the module-URL API (vitejs/vite#22991). The script and its playwright config are kept for when it does. Co-authored-by: Cursor <cursoragent@cursor.com>
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.
PR Checklist
Seeing what It take to update SolidStart to use Solid 2.0 beta. The examples work even with solid-router