feat(start): add inline CSS runtime controls and asset URL templates#7380
Conversation
|
View your CI Pipeline Execution ↗ for commit 251e585
☁️ Nx Cloud last updated this comment at |
🚀 Changeset Version Preview3 package(s) bumped directly, 20 bumped as dependents. 🟩 Patch bumps
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds runtime-configurable inline CSS and optional CSS URL template extraction for transformAssets. Schema accepts boolean or object ({ enabled, transformAssets }); manifests include inline CSS templates; runtime pipeline supports per-request inline control and css-url transformations; docs, tests, and e2e updated. ChangesInline CSS Feature Implementation
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Warning Review ran into problems🔥 ProblemsGit: Failed to clone repository. Please run the Tip 💬 Introducing Slack Agent: The best way for teams to turn conversations into code.Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.
Built for teams:
One agent for your entire SDLC. Right inside Slack. Comment |
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.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/start/framework/react/guide/css-styling.md`:
- Around line 197-204: The example incorrectly calls handler.fetch(...); update
the custom runtime wrapper example so it invokes the handler as a callable
function (handler(request, { inlineCss })) rather than accessing a non-existent
.fetch property; change the fetch implementation inside createServerEntry to
call handler(request, { inlineCss: request.headers.get('x-inline-css') !==
'false' }) so it matches the handler returned by
createStartHandler()/createServerEntry and the e2e tests.
In `@packages/start-server-core/src/createStartHandler.ts`:
- Around line 316-317: The module-scoped cache Map cachedFinalManifestPromises
is shared across all handlers and causes cross-handler pollution; move its
declaration into the createStartHandler scope (or the handler factory) so each
handler instance gets its own Map, and update all usages (including the warmup
code paths that currently write into cachedFinalManifestPromises) to reference
the instance-local variable instead of the module-scoped one; similarly relocate
or convert the other module-scoped caches referenced around the other spots
(lines ~423-428, ~639-660) to instance-local variables so different
transformAssets configs cannot reuse another handler’s cached manifest.
In `@packages/start-server-core/src/transformAssetUrls.ts`:
- Around line 469-474: The returned inlineCss is passed by reference from
source.manifest.inlineCss, allowing downstream mutation of styles/templates to
leak into the cached base manifest; instead, when opts?.inlineCss !== false set
inlineCss to a cloned copy of source.manifest.inlineCss (use a safe clone
strategy such as structuredClone or a shallow copy via spread/map depending on
the shape) so mutations to the returned value don't affect the original
manifest; update the return in transformAssetUrls.ts where inlineCss is assigned
to use the clone and keep the existing opts?.inlineCss check.
- Around line 219-230: The current code fills transformedStyles in the order
promises resolve, which can reorder inlineCss.styles; change the mapping so you
produce an array of promises that each resolve to a tuple [stylesheetHref,
transformedCss] (use transformInlineCssTemplate for templates or css fallback)
and then await Promise.all on that array and assign results into
transformedStyles in the original source order by iterating the resolved tuples;
reference inlineCss.styles, inlineCss.templates, transformInlineCssTemplate, and
transformedStyles.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 8c3e2c7b-271a-4677-ab05-ece2e4902ad8
📥 Commits
Reviewing files that changed from the base of the PR and between b1c061a and 700fd012f9a3a59bac7fa7aa56678e3b356f3dc6.
⛔ Files ignored due to path filters (1)
e2e/react-start/css-inline/src/styles/inline-dot.svgis excluded by!**/*.svg
📒 Files selected for processing (35)
.changeset/quiet-dragons-collect.mddocs/start/config.jsondocs/start/framework/react/guide/cdn-asset-urls.mddocs/start/framework/react/guide/css-styling.mddocs/start/framework/react/guide/early-hints.mddocs/start/framework/solid/guide/css-styling.mde2e/react-start/css-inline/package.jsone2e/react-start/css-inline/playwright.config.tse2e/react-start/css-inline/rsbuild.config.tse2e/react-start/css-inline/src/server.tse2e/react-start/css-inline/tests/css-inline.spec.tse2e/react-start/css-inline/vite.config.tse2e/react-start/server-routes/src/routeTree.gen.tse2e/react-start/transform-asset-urls/package.jsone2e/react-start/transform-asset-urls/playwright.config.tse2e/react-start/transform-asset-urls/src/server.tspackages/router-core/src/manifest.tspackages/start-plugin-core/src/rsbuild/plugin.tspackages/start-plugin-core/src/rsbuild/schema.tspackages/start-plugin-core/src/rsbuild/start-router-plugin.tspackages/start-plugin-core/src/rsbuild/virtual-modules.tspackages/start-plugin-core/src/schema.tspackages/start-plugin-core/src/start-manifest-plugin/inlineCss.tspackages/start-plugin-core/src/start-manifest-plugin/manifestBuilder.tspackages/start-plugin-core/src/vite/plugin.tspackages/start-plugin-core/src/vite/schema.tspackages/start-plugin-core/tests/start-manifest-plugin/manifestBuilder.test.tspackages/start-server-core/skills/start-server-core/SKILL.mdpackages/start-server-core/src/createStartHandler.tspackages/start-server-core/src/index.tsxpackages/start-server-core/src/inlineCss.tspackages/start-server-core/src/request-handler.tspackages/start-server-core/src/transformAssetUrls.tspackages/start-server-core/tests/createStartHandler.test.tspackages/start-server-core/tests/transformAssets.test.ts
💤 Files with no reviewable changes (1)
- e2e/react-start/transform-asset-urls/playwright.config.ts
Merging this PR will not alter performance
Comparing Footnotes
|
eb7fde7 to
29f09f2
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (3)
e2e/react-start/css-inline/playwright.config.ts (1)
7-10: ⚡ Quick winValidate
CSS_INLINE_TRANSFORM_ASSETSinstead of silently coercing unknown valuesRight now any non-
"true"value is treated as disabled, which can mask bad env input. Please fail fast (or normalize explicitly) so misconfiguration is obvious.Proposed patch
+function readBooleanEnv(name: string, defaultValue: boolean): boolean { + const raw = process.env[name] + if (raw == null) return defaultValue + if (raw === 'true') return true + if (raw === 'false') return false + throw new Error(`${name} must be "true" or "false", received "${raw}"`) +} + const toolchain = process.env.E2E_TOOLCHAIN ?? 'vite' -const inlineCssTransformAssets = - process.env.CSS_INLINE_TRANSFORM_ASSETS ?? 'false' +const inlineCssTransformAssets = readBooleanEnv( + 'CSS_INLINE_TRANSFORM_ASSETS', + false, +) const transformAssetsSuffix = - inlineCssTransformAssets === 'true' ? '-transform-assets' : '' + inlineCssTransformAssets ? '-transform-assets' : '' const distDir = process.env.E2E_DIST_DIR ?? `dist-${toolchain}${transformAssetsSuffix}-ssr` @@ env: { E2E_DIST_DIR: distDir, PORT: String(PORT), - CSS_INLINE_TRANSFORM_ASSETS: inlineCssTransformAssets, + CSS_INLINE_TRANSFORM_ASSETS: inlineCssTransformAssets ? 'true' : 'false', },As per coding guidelines,
**/*.{ts,tsx}: Use TypeScript strict mode with extensive type safety.Also applies to: 41-41
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@e2e/react-start/css-inline/playwright.config.ts` around lines 7 - 10, The code silently treats any non-"true" CSS_INLINE_TRANSFORM_ASSETS value as disabled; update the initialization of inlineCssTransformAssets and transformAssetsSuffix so the env var is validated explicitly: accept only "true" or "false" (or empty) and either throw a clear error for any other value or normalize by forcing to lowercase and mapping "1"/"0"/"yes"/"no" to "true"/"false"; use the inlineCssTransformAssets variable (string) to derive a boolean (e.g., isInline = inlineCssTransformAssets === 'true') and then compute transformAssetsSuffix from that boolean, and ensure invalid input causes a fast fail with a descriptive message mentioning CSS_INLINE_TRANSFORM_ASSETS and the offending value.packages/start-plugin-core/src/start-manifest-plugin/inlineCss.ts (1)
109-114: 💤 Low valueInconsistent index calculation pattern between
Urlandimportvisitors.The
Urlvisitor pushes tourlsfirst then usesurls.length - 1, while theimportrule usesurls.lengththen pushes. Both produce correct indices, but the inconsistency reduces readability.Consider aligning the pattern:
♻️ Suggested alignment (push-then-reference style)
Rule: { import(rule: any) { if (!shouldTransformInlineCssUrl(rule.value.url)) { return rule } const rebasedUrl = rebaseCssUrl(rule.value.url, options.cssHref) + + if (templates) { + urls.push(rebasedUrl) + } + const value = { url: templates - ? createInlineCssUrlPlaceholder(urls.length) + ? createInlineCssUrlPlaceholder(urls.length - 1) : rebasedUrl, loc: rule.value.loc, ...(rule.value.media ? { media: rule.value.media } : {}), ...(rule.value.layer ? { layer: rule.value.layer } : {}), ...(rule.value.supports ? { supports: rule.value.supports } : {}), } - if (templates) { - urls.push(rebasedUrl) - } - return { ...rule, value, } }, },Also applies to: 129-141
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/start-plugin-core/src/start-manifest-plugin/inlineCss.ts` around lines 109 - 114, The Url visitor and the import rule use two different index patterns when adding entries to the urls array (Url pushes then references urls.length - 1; import references urls.length then pushes), which is inconsistent; standardize to a single pattern (prefer push-then-reference) across both visitors by updating the import handling to push the rebasedUrl into urls first and then call createInlineCssUrlPlaceholder(urls.length - 1) so both Url visitor and import rule use the same push-then-reference flow, and ensure you update all similar blocks (including the region around 129-141) to use the same approach for the urls array and placeholder creation.packages/start-server-core/src/createStartHandler.ts (1)
632-660: 💤 Low valueWarmup always warms the
inline-cssvariant regardless of handler default.When
warmupTransformManifestis true, warmup pre-computes theinline-cssmanifest. If the handler'sinlineCssoption defaults tofalse, the warmed cache entry may never be used while thelinked-cssvariant is computed on first request.This is a minor inefficiency for uncommon configurations. Consider documenting this behavior or conditionally warming based on the handler's effective default.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/start-server-core/src/createStartHandler.ts` around lines 632 - 660, The warmup currently always computes the 'inline-css' variant regardless of the handler's effective inlineCss default; change the warmup gate to only precompute the manifest variant that matches the handler's effective default (inline or linked). Concretely, determine the handler's default inlineCss setting (e.g., derive a boolean like handlerDefaultInlineCss from the handler/options used to create the start handler) and replace the hardcoded 'inline-css' warmup key and transform arguments with a conditional that selects either 'inline-css' (and inlineCss: true) or the linked-css key (and inlineCss: false) before calling getBaseManifest, getTransformFn, transformManifestAssets or buildManifestWithClientEntry; keep the same error/retry logic and still clear cachedCreateTransformPromise on failure.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@e2e/react-start/css-inline/playwright.config.ts`:
- Around line 7-10: The code silently treats any non-"true"
CSS_INLINE_TRANSFORM_ASSETS value as disabled; update the initialization of
inlineCssTransformAssets and transformAssetsSuffix so the env var is validated
explicitly: accept only "true" or "false" (or empty) and either throw a clear
error for any other value or normalize by forcing to lowercase and mapping
"1"/"0"/"yes"/"no" to "true"/"false"; use the inlineCssTransformAssets variable
(string) to derive a boolean (e.g., isInline = inlineCssTransformAssets ===
'true') and then compute transformAssetsSuffix from that boolean, and ensure
invalid input causes a fast fail with a descriptive message mentioning
CSS_INLINE_TRANSFORM_ASSETS and the offending value.
In `@packages/start-plugin-core/src/start-manifest-plugin/inlineCss.ts`:
- Around line 109-114: The Url visitor and the import rule use two different
index patterns when adding entries to the urls array (Url pushes then references
urls.length - 1; import references urls.length then pushes), which is
inconsistent; standardize to a single pattern (prefer push-then-reference)
across both visitors by updating the import handling to push the rebasedUrl into
urls first and then call createInlineCssUrlPlaceholder(urls.length - 1) so both
Url visitor and import rule use the same push-then-reference flow, and ensure
you update all similar blocks (including the region around 129-141) to use the
same approach for the urls array and placeholder creation.
In `@packages/start-server-core/src/createStartHandler.ts`:
- Around line 632-660: The warmup currently always computes the 'inline-css'
variant regardless of the handler's effective inlineCss default; change the
warmup gate to only precompute the manifest variant that matches the handler's
effective default (inline or linked). Concretely, determine the handler's
default inlineCss setting (e.g., derive a boolean like handlerDefaultInlineCss
from the handler/options used to create the start handler) and replace the
hardcoded 'inline-css' warmup key and transform arguments with a conditional
that selects either 'inline-css' (and inlineCss: true) or the linked-css key
(and inlineCss: false) before calling getBaseManifest, getTransformFn,
transformManifestAssets or buildManifestWithClientEntry; keep the same
error/retry logic and still clear cachedCreateTransformPromise on failure.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: c276de89-fa5d-4bdd-9738-a4c7d14f31cb
📥 Commits
Reviewing files that changed from the base of the PR and between 700fd012f9a3a59bac7fa7aa56678e3b356f3dc6 and 29f09f2.
⛔ Files ignored due to path filters (1)
e2e/react-start/css-inline/src/styles/inline-dot.svgis excluded by!**/*.svg
📒 Files selected for processing (35)
.changeset/quiet-dragons-collect.mddocs/start/config.jsondocs/start/framework/react/guide/cdn-asset-urls.mddocs/start/framework/react/guide/css-styling.mddocs/start/framework/react/guide/early-hints.mddocs/start/framework/solid/guide/css-styling.mde2e/react-start/css-inline/package.jsone2e/react-start/css-inline/playwright.config.tse2e/react-start/css-inline/rsbuild.config.tse2e/react-start/css-inline/src/server.tse2e/react-start/css-inline/tests/css-inline.spec.tse2e/react-start/css-inline/vite.config.tse2e/react-start/server-routes/src/routeTree.gen.tse2e/react-start/transform-asset-urls/package.jsone2e/react-start/transform-asset-urls/playwright.config.tse2e/react-start/transform-asset-urls/src/server.tspackages/router-core/src/manifest.tspackages/start-plugin-core/src/rsbuild/plugin.tspackages/start-plugin-core/src/rsbuild/schema.tspackages/start-plugin-core/src/rsbuild/start-router-plugin.tspackages/start-plugin-core/src/rsbuild/virtual-modules.tspackages/start-plugin-core/src/schema.tspackages/start-plugin-core/src/start-manifest-plugin/inlineCss.tspackages/start-plugin-core/src/start-manifest-plugin/manifestBuilder.tspackages/start-plugin-core/src/vite/plugin.tspackages/start-plugin-core/src/vite/schema.tspackages/start-plugin-core/tests/start-manifest-plugin/manifestBuilder.test.tspackages/start-server-core/skills/start-server-core/SKILL.mdpackages/start-server-core/src/createStartHandler.tspackages/start-server-core/src/index.tsxpackages/start-server-core/src/inlineCss.tspackages/start-server-core/src/request-handler.tspackages/start-server-core/src/transformAssetUrls.tspackages/start-server-core/tests/createStartHandler.test.tspackages/start-server-core/tests/transformAssets.test.ts
💤 Files with no reviewable changes (1)
- e2e/react-start/transform-asset-urls/playwright.config.ts
✅ Files skipped from review due to trivial changes (9)
- docs/start/framework/react/guide/early-hints.md
- packages/start-server-core/skills/start-server-core/SKILL.md
- .changeset/quiet-dragons-collect.md
- docs/start/framework/solid/guide/css-styling.md
- e2e/react-start/css-inline/package.json
- packages/start-plugin-core/src/rsbuild/schema.ts
- packages/start-server-core/tests/createStartHandler.test.ts
- docs/start/framework/react/guide/cdn-asset-urls.md
- e2e/react-start/server-routes/src/routeTree.gen.ts
🚧 Files skipped from review as they are similar to previous changes (20)
- packages/start-server-core/src/inlineCss.ts
- packages/start-plugin-core/src/vite/plugin.ts
- packages/start-plugin-core/src/rsbuild/plugin.ts
- packages/start-plugin-core/src/rsbuild/start-router-plugin.ts
- e2e/react-start/css-inline/vite.config.ts
- packages/start-plugin-core/src/schema.ts
- packages/router-core/src/manifest.ts
- e2e/react-start/css-inline/tests/css-inline.spec.ts
- packages/start-plugin-core/src/rsbuild/virtual-modules.ts
- packages/start-plugin-core/tests/start-manifest-plugin/manifestBuilder.test.ts
- e2e/react-start/transform-asset-urls/package.json
- packages/start-server-core/src/index.tsx
- e2e/react-start/css-inline/src/server.ts
- e2e/react-start/css-inline/rsbuild.config.ts
- docs/start/config.json
- packages/start-server-core/src/request-handler.ts
- packages/start-plugin-core/src/vite/schema.ts
- packages/start-server-core/tests/transformAssets.test.ts
- e2e/react-start/transform-asset-urls/src/server.ts
- packages/start-server-core/src/transformAssetUrls.ts
28adacb to
1263b50
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/start-server-core/src/createStartHandler.ts`:
- Around line 420-423: The current branch stores a rejected
computeFinalManifest() promise in cachedFinalManifestPromises (via
cachedFinalManifestPromise and cacheKey), which permanently poisons that cache
entry on transient failures; fix this by attaching an error handler to the
promise returned by computeFinalManifest() that, on rejection, removes the entry
from cachedFinalManifestPromises and clears cachedFinalManifestPromise for that
cacheKey, then rethrows the error so callers still observe the failure; ensure
the successful promise is still stored as before and only failed promises are
evicted.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 41412420-4083-4bc4-89b1-8ce8bba3eb5c
📒 Files selected for processing (3)
e2e/react-start/css-inline/playwright.config.tspackages/start-plugin-core/src/start-manifest-plugin/inlineCss.tspackages/start-server-core/src/createStartHandler.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- e2e/react-start/css-inline/playwright.config.ts
- packages/start-plugin-core/src/start-manifest-plugin/inlineCss.ts
a5b7e6f to
d68d38b
Compare
There was a problem hiding this comment.
Important
At least one additional CI pipeline execution has run since the conclusion below was written and it may no longer be applicable.
Nx Cloud has identified a possible root cause for your failed CI:
We identified that the failing test invalidates transitive server function compiler state during HMR is not related to this PR's changes, as the same failure is reproducible on branch 7382 with identical errors. Since the tanstack-react-start-e2e-hmr project was not modified by this PR, this appears to be a pre-existing environment issue that should be investigated independently.
No code changes were suggested for this issue.
Trigger a rerun:
🎓 Learn more about Self-Healing CI on nx.dev
d68d38b to
89b75f5
Compare
beaussan
left a comment
There was a problem hiding this comment.
Approved with one nitpick comment
2a48aed to
e880abb
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
packages/start-server-core/src/transformAssetUrls.ts (1)
476-481: 💤 Low valueGuard against cloning undefined
inlineCss.When
source.manifest.inlineCssis undefined,structuredClone(undefined)returns undefined, adding an explicitinlineCss: undefinedproperty to the returned manifest. While functionally equivalent in most cases, this may cause unexpected behavior in code that checks'inlineCss' in manifest.💡 Suggested refinement
return { - ...(opts?.inlineCss === false + ...(opts?.inlineCss === false || !source.manifest.inlineCss ? {} : { inlineCss: structuredClone(source.manifest.inlineCss) }), routes, }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/start-server-core/src/transformAssetUrls.ts` around lines 476 - 481, The returned manifest unconditionally adds an inlineCss property when opts?.inlineCss !== false by using structuredClone(source.manifest.inlineCss), which creates an explicit inlineCss: undefined entry if source.manifest.inlineCss is undefined; change the conditional so the spread only adds inlineCss when source.manifest.inlineCss is actually defined (e.g., check source.manifest.inlineCss !== undefined) so that when undefined the property is omitted; update the expression around opts?.inlineCss and source.manifest.inlineCss (the conditional that builds { inlineCss: structuredClone(source.manifest.inlineCss) }) to only spread that object when source.manifest.inlineCss is not undefined.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/start-server-core/src/finalManifest.ts`:
- Around line 74-86: The cached base manifest loader
(createCachedBaseManifestLoader) currently stores a single Promise
(baseManifestPromise) and never clears it on rejection, causing permanent
failure if loadBaseManifest() rejects; change the implementation so when you
call loadBaseManifest() you attach a rejection handler that clears
baseManifestPromise (set it back to undefined) on error (similar to the final
manifest cache behavior), ensuring subsequent calls will retry; locate the
baseManifestPromise assignment inside createCachedBaseManifestLoader and wrap
loadBaseManifest() with a .catch (or equivalent) that resets baseManifestPromise
on failure while propagating the error.
In `@scripts/nx/playwright-plugin.ts`:
- Around line 178-190: The validation for playwrightModes entries currently
treats null as an object and later crashes at Object.entries; update the check
in the block that inspects modeMetadata.env to explicitly reject null (in
addition to non-object and arrays) so that when modeMetadata.env === null you
throw the same descriptive Error as for other invalid types; locate the code
around modeMetadata.env and the for (const [key, value] of
Object.entries(modeMetadata.env)) loop and modify the conditional that currently
checks typeof modeMetadata.env !== 'object' || Array.isArray(modeMetadata.env)
to also treat null as invalid and ensure the thrown Error message references the
same index/playwrightModes context.
---
Nitpick comments:
In `@packages/start-server-core/src/transformAssetUrls.ts`:
- Around line 476-481: The returned manifest unconditionally adds an inlineCss
property when opts?.inlineCss !== false by using
structuredClone(source.manifest.inlineCss), which creates an explicit inlineCss:
undefined entry if source.manifest.inlineCss is undefined; change the
conditional so the spread only adds inlineCss when source.manifest.inlineCss is
actually defined (e.g., check source.manifest.inlineCss !== undefined) so that
when undefined the property is omitted; update the expression around
opts?.inlineCss and source.manifest.inlineCss (the conditional that builds {
inlineCss: structuredClone(source.manifest.inlineCss) }) to only spread that
object when source.manifest.inlineCss is not undefined.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: d34d4a4e-861b-4f64-a072-090d2828b1ee
⛔ Files ignored due to path filters (1)
e2e/react-start/css-inline/src/styles/inline-dot.svgis excluded by!**/*.svg
📒 Files selected for processing (40)
.changeset/quiet-dragons-collect.mddocs/start/config.jsondocs/start/framework/react/guide/cdn-asset-urls.mddocs/start/framework/react/guide/css-styling.mddocs/start/framework/react/guide/early-hints.mddocs/start/framework/solid/guide/css-styling.mde2e/react-start/css-inline/package.jsone2e/react-start/css-inline/playwright.config.tse2e/react-start/css-inline/rsbuild.config.tse2e/react-start/css-inline/src/server.tse2e/react-start/css-inline/tests/css-inline.spec.tse2e/react-start/css-inline/vite.config.tse2e/react-start/server-routes/src/routeTree.gen.tse2e/react-start/transform-asset-urls/package.jsone2e/react-start/transform-asset-urls/playwright.config.tse2e/react-start/transform-asset-urls/src/server.tspackages/router-core/src/manifest.tspackages/start-plugin-core/src/rsbuild/plugin.tspackages/start-plugin-core/src/rsbuild/schema.tspackages/start-plugin-core/src/rsbuild/start-router-plugin.tspackages/start-plugin-core/src/rsbuild/virtual-modules.tspackages/start-plugin-core/src/schema.tspackages/start-plugin-core/src/start-manifest-plugin/inlineCss.tspackages/start-plugin-core/src/start-manifest-plugin/manifestBuilder.tspackages/start-plugin-core/src/vite/plugin.tspackages/start-plugin-core/src/vite/schema.tspackages/start-plugin-core/tests/start-manifest-plugin/manifestBuilder.test.tspackages/start-server-core/skills/start-server-core/SKILL.mdpackages/start-server-core/src/createStartHandler.tspackages/start-server-core/src/early-hints.tspackages/start-server-core/src/finalManifest.tspackages/start-server-core/src/index.tsxpackages/start-server-core/src/inlineCss.tspackages/start-server-core/src/request-handler.tspackages/start-server-core/src/transformAssetUrls.tspackages/start-server-core/tests/createStartHandler.test.tspackages/start-server-core/tests/early-hints.test.tspackages/start-server-core/tests/finalManifest.test.tspackages/start-server-core/tests/transformAssets.test.tsscripts/nx/playwright-plugin.ts
💤 Files with no reviewable changes (1)
- e2e/react-start/transform-asset-urls/playwright.config.ts
✅ Files skipped from review due to trivial changes (5)
- .changeset/quiet-dragons-collect.md
- packages/start-server-core/skills/start-server-core/SKILL.md
- packages/start-plugin-core/src/vite/schema.ts
- docs/start/framework/react/guide/css-styling.md
- e2e/react-start/server-routes/src/routeTree.gen.ts
🚧 Files skipped from review as they are similar to previous changes (23)
- packages/start-plugin-core/src/vite/plugin.ts
- packages/start-server-core/src/inlineCss.ts
- e2e/react-start/css-inline/package.json
- e2e/react-start/css-inline/rsbuild.config.ts
- packages/start-server-core/src/request-handler.ts
- packages/start-server-core/src/index.tsx
- docs/start/framework/solid/guide/css-styling.md
- packages/start-server-core/tests/createStartHandler.test.ts
- packages/start-plugin-core/src/rsbuild/plugin.ts
- packages/start-plugin-core/src/rsbuild/start-router-plugin.ts
- packages/start-plugin-core/src/rsbuild/schema.ts
- e2e/react-start/css-inline/src/server.ts
- docs/start/config.json
- e2e/react-start/transform-asset-urls/package.json
- e2e/react-start/css-inline/tests/css-inline.spec.ts
- packages/start-plugin-core/tests/start-manifest-plugin/manifestBuilder.test.ts
- e2e/react-start/css-inline/vite.config.ts
- packages/start-plugin-core/src/rsbuild/virtual-modules.ts
- packages/start-plugin-core/src/schema.ts
- e2e/react-start/css-inline/playwright.config.ts
- packages/start-plugin-core/src/start-manifest-plugin/manifestBuilder.ts
- packages/start-plugin-core/src/start-manifest-plugin/inlineCss.ts
- docs/start/framework/react/guide/cdn-asset-urls.md
| if (modeMetadata.env !== undefined) { | ||
| if ( | ||
| typeof modeMetadata.env !== 'object' || | ||
| Array.isArray(modeMetadata.env) | ||
| ) { | ||
| throw new Error( | ||
| `[Playwright Sharding Plugin] Invalid env for playwrightModes[${index}]: ` + | ||
| `Expected an object of string values.`, | ||
| ) | ||
| } | ||
|
|
||
| for (const [key, value] of Object.entries(modeMetadata.env)) { | ||
| if (typeof value !== 'string') { |
There was a problem hiding this comment.
Handle playwrightModes[].env = null explicitly in validation.
null passes the current check and then crashes at Object.entries(...) (Line 189) with a raw TypeError. Reject null up front so users get the intended plugin validation error.
Proposed fix
if (modeMetadata.env !== undefined) {
if (
+ modeMetadata.env === null ||
typeof modeMetadata.env !== 'object' ||
Array.isArray(modeMetadata.env)
) {
throw new Error(
`[Playwright Sharding Plugin] Invalid env for playwrightModes[${index}]: ` +
`Expected an object of string values.`,
)
}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@scripts/nx/playwright-plugin.ts` around lines 178 - 190, The validation for
playwrightModes entries currently treats null as an object and later crashes at
Object.entries; update the check in the block that inspects modeMetadata.env to
explicitly reject null (in addition to non-object and arrays) so that when
modeMetadata.env === null you throw the same descriptive Error as for other
invalid types; locate the code around modeMetadata.env and the for (const [key,
value] of Object.entries(modeMetadata.env)) loop and modify the conditional that
currently checks typeof modeMetadata.env !== 'object' ||
Array.isArray(modeMetadata.env) to also treat null as invalid and ensure the
thrown Error message references the same index/playwrightModes context.
* fix: republish react-start-rsc dependency chain * ci: changeset release * chore: sync published start package versions * ci: changeset release * fix publishing * ci: changeset release * fix * ci: apply automated fixes * ci: changeset release * refactor: switch router stores to atom get/set API (#7150) * ci: changeset release * refactor: shorten internal router store names (#7152) * ci: changeset release * chore(types): re-export SearchMiddleware type from react-router (#7087) * fix(start-plugin-core): reuse deduped server function ids across compilers (#7153) * ci: changeset release * fix(router-core): avoid false notFound matches for proxied loader data (#7156) * fix(router-core): avoid false notFound matches for proxied loader data * test(react-start): cover proxied loader data notFound regression * test(react-start): move notFound regression to rsc direct loader * chore: add changeset * ci: changeset release * fix: reduce start SSR manifest asset duplication (#7157) Co-authored-by: schiller-manuel <schiller-manuel@users.noreply.github.com> Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * ci: changeset release * docs: fix file extension syntax for prefix/suffix routing examples (#7149) docs: fix file-based routing examples with literal dots * chore: bump to h3 v2 rc.20 (#7140) * ci: changeset release * chore: stabilize tests (#7159) * chore: add vite 8 to peer deps (#7160) Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: changeset release * chore(start-server-core): remove unnecessary `any` in `getRequestHeaders` (#7164) * fix(router-generator): harden route file transform rewrites (#7167) * fix docs (#7168) * ci: changeset release * fix(router-plugin): update vite-plugin-solid peer dependency to support version 3.0.0-0 (#7170) * ci: changeset release * fix(router-generator): normalize virtual physical subtree paths (#7169) Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * ci: changeset release * fix: unify virtual module handling for Start Vite plugins (#7178) Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: CodeRabbit <noreply@coderabbit.ai> Co-authored-by: schiller-manuel <schiller-manuel@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * ci: changeset release * fix: add react-server server export for react-start (#7180) * ci: changeset release * fix(docs): correct server function name in example (#7173) * fix react server exports for start and react-router (#7183) Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * chore: stabilize tests (#7185) * ci: changeset release * fix(router-core): avoid intermediate success state for async notFound (#7184) * ci: changeset release * Add a React Start server-components skill (#7181) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * chore: add sharding for playwright tests (#7187) * add sharding * fix dependnancy * fix playwright shard port reuse * full bust * throw more runners into this run * try to throw money at it and see the effect * tune * fix react-router shared route css persistence on nav (#7186) Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * ci: changeset release * chore: stabilize test (#7192) * fix(start): include Vite style.css when cssCodeSplit is disabled (#7191) Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * ci: changeset release * chore: bump solid-js override 1.9.12 (#7202) * chore: bump query override to 5.99.0 (#7203) * fix(solid-router): use keyed Show in Outlet to fix child route rendering with useQuery (#7204) * ci: changeset release * docs(start): fix authenticated routes doc URL (#7214) * chore(deps): vitest 4.1.4 (#7212) * stabilize rsc tests (#7217) * fix(react-router): prevent webpack static analysis of React.use with let binding (#7182) * ci: changeset release * stabilize test (#7220) * chore: unify react-start basic e2e mode projects (#7206) * feat(nx): support rsbuild in Playwright inference (#7221) * test(e2e-rsc): migrate to playwrightModes and dynamic inferred dist (#7222) * fix(nx): align playwright mode build target naming (#7223) * docs(start): add missing space after comma in 'Handling requests with a body' (#7234) * update intent workflow (#7243) * rsbuild plugin (#7228) Co-authored-by: neverland <chenjiahan.jait@bytedance.com> Co-authored-by: Keven Arroyo <dake.3601@gmail.com> * ci: changeset release * fix: Split Start plugin core (#7249) * ci: changeset release * update intent workflow (#7244) * fix: asset sorting (#7251) * ci: changeset release * chore(deps): update Rsbuild related deps to v2.0.1 (#7245) * fix actions again? (#7252) * inline css (#7253) * ci: changeset release * fix: do not import 'react-refresh/runtime' (#7255) Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * ci: changeset release * chore(examples): checkin git outdated route-tree files for react and solid examples (#7257) * add new bundlesize measurements for rsbuild (#7256) Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * refactor(router-plugin): upgrade unplugin to `v3` (#7258) * refactor(router-plugin): upgrade unplugin to `v3` * refactor(start-client-core): use a more explicit typing to `CustomFetch` type * chore(examples): runtime enforce for needing the `VITE_CONVEX_URL` * ci: changeset release * fix: issue 7240 causing fouc (#7250) * fix: server middleware type in solid-router (#7260) * replace tsx by jiti (#7261) Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * ci: changeset release * docs: Fix server function middleware prop (#7262) * feat(query): add support for custom dehydrate and hydrate options in SSR integration (#7246) Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: changeset release * fix: use loader data goes undefined (#7265) * fix: streaming when using Await component (#7264) * ci: changeset release * fix(solid-start): bundle solid-query packages during SSR to fix duplicate QueryClientContext (#6151) (#7267) * ci: changeset release * fix(solid-router): hydration mismatch for ssr='data-only' with pendingComponent (#7266) * docs(router): fix typo in doc (#7268) * ci: changeset release * fix(router-core): wildcard nodes respect DFS priority like other nodes in route matching (#7273) * ci: changeset release * fix(solid-router): enable route component HMR for Solid * ci: apply automated fixes * Revert "ci: apply automated fixes" This reverts commit 7122f28. * Revert "fix(solid-router): enable route component HMR for Solid" This reverts commit b86b061. * fix(react-start-rsc): re-export renderable types from public entries (#7278) * fix(react-start-rsc): re-export renderable types from public entries * changeset - patch * ci: changeset release * fix: disabled topLevelVar (#7293) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: changeset release * fix: fix exports for react-start so useServerFn is available with RSC (#7292) Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * feat: match params (#7263) * ci: changeset release * fix(start-plugin-core): sort server fn manifest entries for deterministic build output (#7287) Co-authored-by: Dor Alagem <doralagem@MacBook-Pro-sl-Dor.local> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Manuel Schiller <meisterpink@gmail.com> * docs: remove redundant code example from query integration doc (#7298) * ci: changeset release * fix: Ignore fully type-only imports and re-exports when collecting im… (#7305) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: changeset release * feat: `strict: false` for server functions (#7277) * feat: `strict: false` for server functions Add a `strict` option to `createServerFn` for type-level server function serialization checks * feat: `strict: false` for server functions [Self-Healing CI Rerun] --------- Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * ci: changeset release * fix: parse params union inference (#7306) * ci: changeset release * feat: rsc css (#7310) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: changeset release * fix(router-plugin): isolate route metadata per plugin instance (#7313) * ci: changeset release * docs: Improve key differences b/w Start Server Functions and Next.js Server Actions (#7312) * fix(deps): move fetchdts from devDependencies to dependencies (#7317) * Revise bug report template for clarity and requirements Updated the bug report template to clarify the requirements for a reproducer project and modified some labels and descriptions for better clarity. * ci: changeset release * chore: fix duplicate "the" typo across router packages (#7323) * feat: early hints (#7324) * ci: changeset release * feat: Link header (#7327) Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * ci: changeset release * docs(skills): address 8 agent failure modes from user feedback (#7314) * docs(skills): address 8 agent failure modes from external feedback Adds new start-core/auth-server-primitives skill (sessions, cookies, OAuth+PKCE, password-reset enumeration defense, CSRF, rate limiting, session rotation) and updates 8 existing skills + matching docs to fix patterns where agents produce insecure or wrong-framework output. Skill changes: - new: start-core/auth-server-primitives (server half of auth) - router-core/auth-and-guards: route guard != RPC guard - start-core/server-functions: wrong import path, RPC auth required, Cache-Control public is a cross-tenant leak, wrong-framework patterns - start-core/middleware: wrong import path, sendContext shape vs access (3-layer wrong/still-wrong/correct), authMiddleware framing - start-core/execution-model: file markers (server-only/client-only), module-level process.env is undefined under Worker SSR - start-core/deployment: cloudflare env-at-request-time - router-core/ssr: wrong file structures (next.js, react-router-dom) - router-core/type-safety: wrong-framework imports + structures Docs updated to mirror each skill change so source-of-truth and the intent-indexed skill stay in sync. New authentication-server-primitives guide is the long-form companion to the new skill. intent validate: 30 skill files pass (was 29). * ci: apply automated fixes * docs(skills): address coderabbit review feedback - Fix internal docs links to use correct relative paths instead of an absolute /start/latest/... URL and missing one ../ segment - Remove blank line inside auth-and-guards blockquote (markdownlint MD028) - Restore overload pattern in type-safety ValidateNavigateOptions and ValidateRedirectOptions examples; the casts I had introduced stripped generic context and contradicted the skill's own no-cast rule - Add db.sessions.revokeAllForUser before create in login rotation snippets so the example matches the prose - Soften useServerFn guidance: it's required only when the server function throws redirect/notFound; plain-data calls work directly and via useMutation/useQuery * ci: apply automated fixes * docs(skills): compress type-safety to stay under 500-line cap Prettier's autofix expanded my single-line overload signatures across multiple lines, pushing the file over the 500-line limit. Drop the redundant fetchOrRedirect example (same pattern as useDelayedNavigate) and describe ValidateRedirectOptions usage in prose instead. * docs(skills): CSRF origin check should compare full origin, not host alone Comparing only new URL(origin).host against APP_HOST silently accepts a mismatched scheme — http://example.com would pass a check meant for https://example.com. Compare the full origin (scheme + host + port) against APP_ORIGIN instead. Same fix in skill and docs. * docs(skills): make useDelayedNavigate callback truly return void The callback returned the result of setTimeout (a timer handle), not void as the public overload's return type implied. Wrap in a block so the example matches the declared return type. Skipped the related nitpick to add a separate redirect example — the existing prose already describes the same overload pattern, and a duplicate example would push the file close to the 500-line cap that prettier autofix has been bumping us against. * docs(skills): fix two real bugs in auth-server-primitives examples 1. Cookie parser truncated values containing '='. Signed cookies, JWTs, and base64-padded values all use '='. Use indexOf to split on the FIRST '=' only. 2. Login example short-circuited verifyPasswordHash on user-not-found, contradicting the prose's "same time, same error" claim — the no-user branch returned instantly while wrong-password spent ~100ms hashing, leaking account existence over the wire. Always verify against a hash; use a precomputed DUMMY_PASSWORD_HASH when the user is missing, then combine with the user-exists bit for the final ok. Same fixes in the SKILL.md and the docs companion. * docs(skills): address manuel's review on react-specific guides - middleware.md, server-functions.md: drop cross-framework <framework> placeholders; this is the React-specific guide, just say @tanstack/react-start - execution-model.md: drop the same trailing line about solid-start / vue-start paths - hosting.md: remove the Cloudflare env-handling subsection — the general per-request rule lives in environment-variables.md and doesn't need to be repeated under a specific host - environment-variables.md: mention the cloudflare:workers env binding as the canonical Cloudflare way to read env (including module scope), per Manuel's link to the Cloudflare docs - deployment skill: same upgrade — show the cloudflare:workers env pattern alongside the per-request handler approach * docs(skills): drop redundant server-only marker in session example The file already imports from @tanstack/react-start/server, which is on import protection's default client-deny specifier list. The side-effect marker is redundant — drop it. Same fix in skill and docs. * docs(skills): drop wrong-import-path mistakes — TS already catches them Manuel pointed out that TypeScript catches both common wrong paths: '@tanstack/react-router' has no exported member createServerFn / createMiddleware, and '@tanstack/start' is "Cannot find module". Skill space is precious; the items don't earn their slot if tsc handles them. Removed: - Common Mistake "Wrong import path" from server-functions and middleware skills (renumbered the remaining mistakes) - The matching top-of-file CRITICAL line in both skills - The "Import path" callouts in the middleware and server-functions docs --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * remove old intent artifacts (#7333) * fix(start-server-core): fall back to GET handler for HEAD requests (RFC 9110 §9.3.2) (#7325) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: changeset release * test: add reproducer for #2514 (#7336) * test: reproducer for #2547 (#7337) * fix: fix plain TypeScript parser handling (#7342) * ci: changeset release * fix: disable rsbuild server compression (#7348) * fix: update deps (#7340) * ci: changeset release * update bundlesize benchmark (#7356) * fix: Bump jiti to 2.7.0 (#7355) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * ci: apply automated fixes * ci: changeset release * Document server function strict serialization options (#7358) * Document server function strict option Agent-Logs-Url: https://github.com/TanStack/router/sessions/8deabe7a-7412-455e-9111-97a13cb4582e Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * Refine strict docs wording Agent-Logs-Url: https://github.com/TanStack/router/sessions/e2857d6e-314e-496c-b99b-78c207c28c77 Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * feat(start): CSRF middleware (#7373) * fix(router-core): fix missing closing paren in CSS.supports check for view transition types (#7369) * fix: fix jiti usage for tsconfig paths (#7382) * Enable jiti tsconfig path aliases Agent-Logs-Url: https://github.com/TanStack/router/sessions/0a481c9b-eb97-4543-acc5-71d43b97d386 Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * Use fixture for jiti tsconfig aliases Agent-Logs-Url: https://github.com/TanStack/router/sessions/182b9baa-9e54-4813-a322-c33a1da5417d Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * Track fixture path alias helper Agent-Logs-Url: https://github.com/TanStack/router/sessions/182b9baa-9e54-4813-a322-c33a1da5417d Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * Add router-generator changeset Agent-Logs-Url: https://github.com/TanStack/router/sessions/ab1a42cc-7326-4e36-a656-f01179221cee Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * Format virtual config fixture Agent-Logs-Url: https://github.com/TanStack/router/sessions/22194166-b3a7-431e-b723-ad594d4b0405 Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * Update bundle-size.yml * Update labeler.yml * Update bundle-size.yml * ci: add pinGitHubActionDigests (#7387) * chore(deps): pin dependencies (#7388) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * minor semver bump to all packages (#7395) * ci: zizmor (#7389) * chore(pnpm): update pnpm to v11 (#7392) * chore: add CODEOWNERS file (#7394) * chore: add CODEOWNERS file * chore: add Nx and NPMRC * Update .github/CODEOWNERS --------- Co-authored-by: Nicolas Beaussart <nic.beaussart@gmail.com> * fix: revert plugin changes, createCsrfMiddleware compilation, fix HMR tests (#7400) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Manuel Schiller <manuel.schiller@caligano.de> * ci: align release workflow to query (#7404) * ci: Version Packages (#7405) ci: changeset release Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * feat(start): add inline CSS runtime controls and asset URL templates (#7380) * ci: Version Packages (#7407) * fix: Fix literal underscore paths under pathless layouts (#7408) * ci: Version Packages (#7409) ci: changeset release Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * feat(router-core): params.priority route option as tie breaker in matching algorithm (#7411) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: Version Packages (#7413) * fix(router-core): hydrate before initial client route match (#7416) * ci: Version Packages (#7417) * fix(router-plugin): detect typed root route context for HMR (#7420) * ci: Version Packages (#7421) * fix: fix route mismatch warnings and HMR route indexes (#7422) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: Version Packages (#7423) * security: stricter pnpm config blockExoticSubdeps & trustPolicy (#7425) * docs(start): use router package for module declaration to type the request context (#7427) * feat: deferred hydration (#7362) * feat: deferred hydration * fix * tests * solid tests * Changes before error encountered Agent-Logs-Url: https://github.com/TanStack/router/sessions/5263c469-75c2-4470-bd4c-86f9b43964f4 Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * chore: address hydration review follow-ups Agent-Logs-Url: https://github.com/TanStack/router/sessions/16e27113-ff01-4de8-aded-b9be9f6dd4ff Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> * fix(start-client-core): correct import order in hydrateStart.ts Co-authored-by: schiller-manuel <schiller-manuel@users.noreply.github.com> * chore: remove tracked nx self-healing artifacts Agent-Logs-Url: https://github.com/TanStack/router/sessions/95750760-1348-437c-8f73-cc45e899003a Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> Co-authored-by: schiller-manuel <schiller-manuel@users.noreply.github.com> * chore: update @swc/core in example/react/quickstart-webpack-file-based (#7434) * chore: update @swc/core in example/react/quickstart-webpack-file-based * chore: update @swc/core in example/react/quickstart-webpack-file-based [Self-Healing CI Rerun] --------- Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> * docs(start): compare deferred hydration to Astro islands (#7438) Adds a short mental-model section answering the common question about how TanStack Start's deferred hydration relates to Astro islands. * docs(start): compare deferred hydration to React selective hydration (#7442) Adds a short comparison section answering the common question about how TanStack Start's deferred hydration relates to React 18's selective hydration. The framing: selective hydration controls the order of inevitable hydration work; deferred hydration controls whether and when that work happens at all. * chore: update chokidar to v5 (#7439) * chore: update @rolldown/pluginutils to 1.0.1 (#7440) * chore: update zod to v4.4.3 (#7441) * chore: update zod to v4.4.3 * fix(start): preserve route path defaults * fix(examples): resolve zod 4 build failures * chore: update express and webpack-dev-server (#7443) * chore: update express to v5.2.1 * chore: update webpack-dev-server to v5.2.4 * ci: Version Packages (#7435) ci: changeset release Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * chore: ignore nx generated folders (#7451) * perf: optimize and test rewrite (#7448) optimize and test rewrite * fix: fix scroll restoration issues (#7447) Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * ci: Version Packages (#7452) * fix: Fix escaped underscore index route generation (#7453) * ci: Version Packages (#7454) * ci: fix release notes diff range after Release PR flow (#7456) * fix(start): explicitly re-export public API to survive SSR cold-start cycle (#7466) * fix: Fix hash scrolling with `resetScroll={false}` (#7464) Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * chore: enforce pnpm 11 (#7465) * ci: Version Packages (#7467) * chore: only run autofix on PRs (#7469) * feat(start): support rsbuild iife client output (#7477) * ci: Version Packages (#7478) * fix: bundled dev support for vite (#7482) * ci: Version Packages (#7483) * fix(start): avoid encoded virtual adapter ids in vite dev (#7484) * fix release (#7487) * ci: Version Packages (#7485) * chore: migrate changesets changelog generator (#7490) * fix: Fix Hydrate re-exports to avoid circular HMR updates (#7492) * ci: Version Packages (#7493) * fix(start): emit boot-sibling chunks as scripts for IIFE entries (#7501) Co-authored-by: Keven Arroyo <kevenarroyo@microsoft.com> * ci: Version Packages (#7502) * chore: stabilize tests (#7503) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * fix: fix streaming (#7497) * ci: Version Packages (#7504) ci: changeset release Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * ci: update all actions (#7506) * ci: update all actions * disable package manager cache * fix: fix primitive beforeLoad errors (#7505) * fix: fix primitive beforeLoad errors * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: Version Packages (#7508) * feat(rsbuild): add RSC support (#7509) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> * ci: Version Packages (#7513) * fix(solid): resolve Solid 2 merge issues * ci: apply automated fixes * use v2 query * fix solid v2 imports * solid v2 port of new e2e * solid v2 * nxignore solid v1 peer deps * use "@rsbuild/plugin-solid": "^2.0.0-beta.0", * fix hydrationscript * add nohydration * remove early return * fix: solid-start hydration * fix: update createEffect to return true for hydration signals * remove nxignore * add back nxignore for 3rdparty deps * $_TSR stub to fix serialization tests * Revert "$_TSR stub to fix serialization tests" This reverts commit ef802e9. * fix: update solid selective ssr links * fix: stream solid Await fallback * align solid-start basic by removing test:e2e * remove unusese build:prerender build:spa * fix: clean up solid hydrate fallback dom * fix: resolve solid wrapper children * fix: stabilize serialization stream e2e test * fix: keep SSR globals through document parse * html standard mode * clean * fix: pass solid ssr manifest * use await fallback --------- Co-authored-by: Tanner Linsley <tannerlinsley@gmail.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Manuel Schiller <manuel.schiller@caligano.de> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Flo <fpellet@ensc.fr> Co-authored-by: James Howard <james@reetgood.co.uk> Co-authored-by: schiller-manuel <schiller-manuel@users.noreply.github.com> Co-authored-by: nx-cloud[bot] <71083854+nx-cloud[bot]@users.noreply.github.com> Co-authored-by: Mohamed Khaled <mohamedkhaled012@yahoo.com> Co-authored-by: Birk Skyum <74932975+birkskyum@users.noreply.github.com> Co-authored-by: schiller-manuel <6340397+schiller-manuel@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Ulrich Stark <github@ustark.de> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: CodeRabbit <noreply@coderabbit.ai> Co-authored-by: MoonBrillante <32852571+MoonBrillante@users.noreply.github.com> Co-authored-by: Coding Cossack <108333654+CodingCossack@users.noreply.github.com> Co-authored-by: Nicolas Beaussart <nic.beaussart@gmail.com> Co-authored-by: Pavan Shinde <pavann97@gmail.com> Co-authored-by: mixelburg <52622705+mixelburg@users.noreply.github.com> Co-authored-by: Mukunda Rao Katta <mukunda.vjcs6@gmail.com> Co-authored-by: Sarah Gerrard <gerrardsarah@gmail.com> Co-authored-by: neverland <chenjiahan.jait@bytedance.com> Co-authored-by: Keven Arroyo <dake.3601@gmail.com> Co-authored-by: Sean Cassiere <33615041+SeanCassiere@users.noreply.github.com> Co-authored-by: Abhishek Raj <abhi@raj.me> Co-authored-by: Dominik Dorfmeister 🔮 <office@dorfmeister.cc> Co-authored-by: Birk Skyum <birk.skyum@pm.me> Co-authored-by: Keven Arroyo <kevenarroyo@microsoft.com> Co-authored-by: Dor Alagem <dor3382@gmail.com> Co-authored-by: Dor Alagem <doralagem@MacBook-Pro-sl-Dor.local> Co-authored-by: Manuel Schiller <meisterpink@gmail.com> Co-authored-by: Franklin Shera <fshera96@gmail.com> Co-authored-by: Tom Smithhisler <tomsmithhisler@gmail.com> Co-authored-by: dfedoryshchev <64079946+dfedoryshchev@users.noreply.github.com> Co-authored-by: Sarah Gerrard <hello@sarahgerrard.me> Co-authored-by: Zelys <zelys@dfkhelper.com> Co-authored-by: Shkumbin Hasani <34962865+shkumbinhasani@users.noreply.github.com> Co-authored-by: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Harry Whorlow <79278353+harry-whorlow@users.noreply.github.com> Co-authored-by: Corbin Crutchley <git@crutchcorn.dev> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Summary by CodeRabbit
New Features
Documentation
Chores
Tests