Upgrade solidjs beta 17#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 82d0f66
☁️ 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.22%
|
| 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.6 ms | +66.49% |
| ⚡ | Simulation | ssr request loop (vue) |
420.3 ms | 284.1 ms | +47.92% |
| ⚡ | Simulation | ssr request loop (solid) |
174.6 ms | 151.4 ms | +15.36% |
| ⚡ | Simulation | client-side navigation loop (react) |
56.3 ms | 50.3 ms | +11.83% |
| ⚡ | Simulation | client-side navigation loop (vue) |
83 ms | 77 ms | +7.81% |
| 🆕 | Simulation | ssr not-found (vue) |
N/A | 169.7 ms | N/A |
| 🆕 | Simulation | ssr redirect (vue) |
N/A | 68.2 ms | N/A |
| 🆕 | Simulation | ssr head (vue) |
N/A | 326.8 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.4 ms | N/A |
| 🆕 | Simulation | ssr server-fn POST (vue) |
N/A | 71.4 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 | 105.1 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.9 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 | 198 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 (82d0f66) 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. |
There was a problem hiding this comment.
Nx Cloud is proposing a fix for your failed CI:
We fix the multiple entries detected build failure caused by vite-plugin-solid@next.7, which now emits every lazy() target as an explicit Rollup chunk (marked isEntry: true) to guarantee stable SSR manifest entries — even though those chunks are semantically dynamic imports. Our fix pre-collects all chunk filenames that appear in any other chunk's dynamicImports and excludes them from entry detection in normalizeViteClientBuild, mirroring exactly what vite-plugin-solid's own normalizeEmittedLazyEntries already does for the Vite manifest.
Warning
❌ We could not verify this fix.
Suggested Fix changes
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..8940f006 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
@@ -45,10 +45,23 @@ export function normalizeViteClientBuild(
const cssFilesBySourcePath = new Map<string, Array<string>>()
const cssContentByFileName = new Map<string, string>()
+ // Collect all chunk filenames that appear as dynamic imports of any other
+ // chunk. vite-plugin-solid (next.7+) emits every lazy() target as an
+ // explicit Rollup chunk for stable SSR manifest entries, and Rollup marks
+ // those emitted chunks as `isEntry`. Excluding chunks that are reachable via
+ // dynamic imports lets us identify the single true client entry even when
+ // multiple chunks carry `isEntry: true`.
+ const dynamicEntryFileNames = new Set<string>()
+ for (const chunk of chunksByFileName.values()) {
+ for (const dynamicImport of chunk.dynamicImports) {
+ dynamicEntryFileNames.add(dynamicImport)
+ }
+ }
+
for (const chunk of chunksByFileName.values()) {
const bundleEntry = clientBundle[chunk.fileName] as Rollup.OutputChunk
- if (chunk.isEntry) {
+ if (chunk.isEntry && !dynamicEntryFileNames.has(chunk.fileName)) {
if (entryChunkFileName) {
throw new Error(
`multiple entries detected: ${entryChunkFileName} ${chunk.fileName}`,
Or Apply changes locally with:
npx nx-cloud apply-locally YaHb-SuFO
Apply fix locally with your editor ↗ View interactive diff ↗
🎓 Learn more about Self-Healing CI on nx.dev
No description provided.