Upgrade solidjs beta 18#7813
Conversation
Bumps solid-js, @solidjs/web, and babel-preset-solid from 2.0.0-beta.15 to 2.0.0-beta.16 across packages, examples, e2e apps, benchmarks, and the pnpm overrides in pnpm-workspace.yaml. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bumps solid-js, @solidjs/web, and babel-preset-solid from 2.0.0-beta.16 to 2.0.0-beta.17 across packages, examples, e2e apps, and benchmarks. The scoped babel-preset-solid overrides in pnpm-workspace.yaml are removed instead of bumped: vite-plugin-solid@3.0.0-next.5 and @rsbuild/plugin-solid@2.0.0-beta.0 both declare '>=2.0.0-beta.0 <2.0.0-experimental.0', which resolves to the newest v2 beta on its own, while Solid 1.x consumers keep babel-preset-solid 1.x. A stale override here silently kept the beta.16 compiler (with its broken omitLastClosingTag marker handling) in the build pipeline. The @dom-expressions/* scope is added to minimumReleaseAgeExclude, covering the renamed compiler package (@dom-expressions/babel-plugin-jsx, formerly babel-plugin-jsx-dom-expressions). Two unrelated loose specs are pinned to their locked versions because re-resolving the lockfile pulled broken releases: @platformatic/flame 1.7.0 fails pnpm's trust-downgrade policy, and the nitro-nightly 'latest' tag depends on an unpublished h3 version. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
On the client, returning the loadPromise from MatchInner's pending branch keeps a live async source in the tree whenever a match is pending. Since Solid 2.0.0-beta.16, that routes every signal write into a transition hold for the rest of the flush, which breaks router-core's synchronous write-then-load flows: invalidate() on a notFound match never re-ran the loader, and writes to unrelated signals were held too. SSR keeps the suspension so the streaming engine waits for the match to settle; the client now renders just the pending component. Verified on beta.17: without this, "re-runs loaders that throw notFound() when invalidated via HMR filter" and "keeps rendering a route notFoundComponent when loader returns notFound() after invalidate" fail. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
View your CI Pipeline Execution ↗ for commit d81a244
☁️ Nx Cloud last updated this comment at |
🚀 Changeset Version Preview6 package(s) bumped directly, 0 bumped as dependents. 🟩 Patch bumps
|
|
All alerts resolved. Learn more about Socket for GitHub. This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored. |
Merging this PR will improve performance by 56.02%
|
| Mode | Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|---|
| ⚡ | Simulation | ssr request loop (react) |
330.5 ms | 77.9 ms | ×4.2 |
| ⚡ | Simulation | client-side navigation loop (solid) |
72.6 ms | 43.8 ms | +65.67% |
| ⚡ | Simulation | ssr request loop (vue) |
420.3 ms | 284.2 ms | +47.85% |
| ⚡ | Simulation | ssr request loop (solid) |
174.6 ms | 151.8 ms | +15.06% |
| ⚡ | Simulation | client-side navigation loop (react) |
56.3 ms | 50.4 ms | +11.75% |
| ⚡ | Simulation | client-side navigation loop (vue) |
83 ms | 76.9 ms | +7.88% |
| 🆕 | Simulation | ssr not-found (vue) |
N/A | 169.5 ms | N/A |
| 🆕 | Simulation | ssr redirect (vue) |
N/A | 68.2 ms | N/A |
| 🆕 | Simulation | ssr head (vue) |
N/A | 326.9 ms | N/A |
| 🆕 | Simulation | ssr loaders (vue) |
N/A | 136.8 ms | N/A |
| 🆕 | Simulation | ssr selective (vue) |
N/A | 139.7 ms | N/A |
| 🆕 | Simulation | ssr server-fn GET (vue) |
N/A | 74.6 ms | N/A |
| 🆕 | Simulation | ssr server-fn POST (vue) |
N/A | 71.3 ms | N/A |
| 🆕 | Simulation | ssr server-route middleware (vue) |
N/A | 63.3 ms | N/A |
| 🆕 | Simulation | ssr server-route (vue) |
N/A | 60.8 ms | N/A |
| 🆕 | Simulation | ssr streaming deferred (vue) |
N/A | 104.9 ms | N/A |
| 🆕 | Simulation | ssr assets inline-css cdn (vue) |
N/A | 188.5 ms | N/A |
| 🆕 | Simulation | ssr assets linked-css control (vue) |
N/A | 215.7 ms | N/A |
| 🆕 | Simulation | ssr before-load chain (vue) |
N/A | 184.9 ms | N/A |
| 🆕 | Simulation | ssr control-flow error 500 (vue) |
N/A | 197.6 ms | N/A |
| ... | ... | ... | ... | ... | ... |
ℹ️ Only the first 20 benchmarks are displayed. Go to the app to view all benchmarks.
Tip
Curious why this is faster? Comment @codspeedbot explain why this is faster on this PR, or directly use the CodSpeed MCP with your agent.
Comparing upgrade-solidjs-beta-16 (d81a244) with solid-router-v2-pre (67a9040)1
Footnotes
The lockfile entry for @rspack/binding@2.0.8 only listed the darwin-arm64 binding, so linux CI runners had no matching native binding and rspack fell back to a hoisted 2.0.0 binary, crashing the bundle-size benchmark with a core/binding version mismatch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… suspension Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bundle Size Benchmarks
Current gzip tracks all emitted client JS chunks. Initial gzip tracks only the entry/import graph. Trend sparkline is historical current gzip ending with this PR measurement; lower is better. |
…id to next.8 Bumps solid-js, @solidjs/web, and babel-preset-solid from 2.0.0-beta.17 to 2.0.0-beta.18 and vite-plugin-solid from 3.0.0-next.7 to 3.0.0-next.8 (which pins @dom-expressions/jsx-compiler to 0.50.0-next.21) across packages, examples, e2e apps, and benchmarks. vite-plugin-solid is added to minimumReleaseAgeExclude: Solid publishes plugin prereleases in lockstep with the runtime betas, often minutes before we bump, and pnpm's 24h release-age gate otherwise filters the new version with a misleading NO_MATCHING_VERSION error. Verified: solid-router unit tests (client + server modes), solid-start basic e2e (80 passed), solid-router basic-file-based e2e (120 passed), and all 17 bundle-size benchmark scenarios build cleanly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…stead of asserting a single entry vite-plugin-solid >= 3.0.0-next.6 emits a facade chunk for every dynamically imported project module during SSR client builds (to keep its own manifest lookups stable), and emitted chunks are flagged `isEntry` just like the configured entry. The start manifest capture plugin asserted the client bundle contains exactly one entry chunk, so every solid-start app failed to build with "multiple entries detected". The capture plugin now receives the resolved client entry path and picks the entry chunk whose facadeModuleId matches it; other entry-flagged chunks are treated as ordinary chunks. When no chunk matches, a single entry is still accepted as before, and the multiple-entries error now lists every entry chunk with its facade module to ease diagnosis. Verified with fresh package builds: previously failing memory-server solid benchmark targets, all 17 bundle-size scenarios, solid-start basic build + e2e (80 passed), react-start basic build, and the start-plugin-core unit suite (494 tests). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n dev manifest test Fixes the type tests after startManifestPlugin gained a required getClientEntry option. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…odule instead of asserting a single entry" This reverts commit d0f4926.
next.10 ships the fix for the lazy facade entry reclassification under rolldown-vite (solidjs/vite-plugin-solid#269): assigning isEntry = false instead of deleting the property, so the reclassification actually propagates through rolldown's bundle proxies and downstream plugins no longer see every lazy facade chunk as an application entry. This is the proper replacement for the reverted start-plugin-core workaround (see a1ee163) — the strict single-entry assertion now holds again. Verified: e2e/solid-start/basic build + e2e suite (80 passed), solid-router test:unit client (814) + server (2) modes, start-plugin-core unit tests (486). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Nx Cloud is proposing a fix for your failed CI:
We re-apply the fix that was accidentally reverted before the vite-plugin-solid@next.10 upgrade landed: normalizeViteClientBuild now receives the configured client entry path and selects the matching entry chunk by its facadeModuleId instead of asserting there is only one entry. This resolves the multiple entries detected build failure caused by the devtools chunks (BaseTanStackRouterDevtoolsPanel, FloatingTanStackRouterDevtools) being emitted as additional entry chunks by the upgraded plugin.
Tip
✅ We verified this fix by re-running tanstack-solid-start-example-basic-authjs:build, tanstack-solid-start-e2e-query-integration:build, tanstack-solid-start-example-basic-auth:build and 26 more.
Suggested Fix changes
diff --git a/packages/start-plugin-core/src/vite/plugin.ts b/packages/start-plugin-core/src/vite/plugin.ts
index 5fd9356f..b926510a 100644
--- a/packages/start-plugin-core/src/vite/plugin.ts
+++ b/packages/start-plugin-core/src/vite/plugin.ts
@@ -239,6 +239,7 @@ export function tanStackStartVite(
}),
startManifestPlugin({
getConfig,
+ getClientEntry: () => configContext.resolveEntries().entryPaths.client,
}),
// When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),
// install a middleware that rewrites incoming request URLs to prepend the vite base prefix.
diff --git a/packages/start-plugin-core/src/vite/start-manifest-plugin/normalized-client-build.ts b/packages/start-plugin-core/src/vite/start-manifest-plugin/normalized-client-build.ts
index c14609bc..aada2beb 100644
--- a/packages/start-plugin-core/src/vite/start-manifest-plugin/normalized-client-build.ts
+++ b/packages/start-plugin-core/src/vite/start-manifest-plugin/normalized-client-build.ts
@@ -1,6 +1,7 @@
import { tsrSplit } from '@tanstack/router-plugin'
import { tssHydrate } from '../../hydration-constants'
import { getCssAssetSource } from '../../start-manifest-plugin/inlineCss'
+import { normalizePath } from 'vite'
import type { Rollup } from 'vite'
import type { NormalizedClientBuild, NormalizedClientChunk } from '../../types'
@@ -38,8 +39,10 @@ export function normalizeViteClientChunks(
export function normalizeViteClientBuild(
clientBundle: Rollup.OutputBundle,
+ opts: { clientEntryPath: string },
): NormalizedClientBuild {
let entryChunkFileName: string | undefined
+ const normalizedClientEntryPath = normalizePath(opts.clientEntryPath)
const chunksByFileName = normalizeViteClientChunks(clientBundle)
const chunkFileNamesByRouteFilePath = new Map<string, Array<string>>()
const cssFilesBySourcePath = new Map<string, Array<string>>()
@@ -49,12 +52,13 @@ export function normalizeViteClientBuild(
const bundleEntry = clientBundle[chunk.fileName] as Rollup.OutputChunk
if (chunk.isEntry) {
- if (entryChunkFileName) {
- throw new Error(
- `multiple entries detected: ${entryChunkFileName} ${chunk.fileName}`,
- )
+ const facadeModuleId = bundleEntry.facadeModuleId
+ if (
+ facadeModuleId !== null &&
+ normalizePath(facadeModuleId) === normalizedClientEntryPath
+ ) {
+ entryChunkFileName = chunk.fileName
}
- entryChunkFileName = chunk.fileName
}
for (const routeFilePath of chunk.routeFilePaths) {
diff --git a/packages/start-plugin-core/src/vite/start-manifest-plugin/plugin.ts b/packages/start-plugin-core/src/vite/start-manifest-plugin/plugin.ts
index 9b9c2745..93727222 100644
--- a/packages/start-plugin-core/src/vite/start-manifest-plugin/plugin.ts
+++ b/packages/start-plugin-core/src/vite/start-manifest-plugin/plugin.ts
@@ -21,6 +21,7 @@ type StartManifestEnvironment = {
export function startManifestPlugin(opts: {
getConfig: GetConfigFn
+ getClientEntry: () => string
}): PluginOption {
let clientBuild: NormalizedClientBuild | undefined
let cssCodeSplitDisabledFileName: string | undefined
@@ -39,7 +40,9 @@ export function startManifestPlugin(opts: {
)
}
- clientBuild = normalizeViteClientBuild(bundle)
+ clientBuild = normalizeViteClientBuild(bundle, {
+ clientEntryPath: opts.getClientEntry(),
+ })
cssCodeSplitDisabledFileName = getAssetFileNameByName(
bundle,
'style.css',
diff --git a/packages/start-plugin-core/tests/start-manifest-plugin.test.ts b/packages/start-plugin-core/tests/start-manifest-plugin.test.ts
index 68270fb6..1d000de1 100644
--- a/packages/start-plugin-core/tests/start-manifest-plugin.test.ts
+++ b/packages/start-plugin-core/tests/start-manifest-plugin.test.ts
@@ -33,6 +33,7 @@ function loadDevManifest(opts: { bundledDev: boolean }) {
},
},
}) as any,
+ getClientEntry: () => '/src/client.tsx',
}) as Array<any>
const plugin = plugins.find(
(item) => item.name === 'tanstack-start:start-manifest-plugin',
Or Apply changes locally with:
npx nx-cloud apply-locally dnc1-DUiN
Apply fix locally with your editor ↗ View interactive diff ↗
🎓 Learn more about Self-Healing CI on nx.dev
No description provided.