Files
Wyatt JohnsonandGitHub 291aefd985 Fix 404 responses for interception routes with missing children slots (#85779)
### What?

Introduces a null-rendering default component for interception routes to
prevent 404 responses when children slots are missing.

### Why?

When rendering interception routes like `(.)[id]`, there's a segment
mismatch where the interception route lacks a children slot that the
base `[id]` route has.

**The Bug:**
Previously, the framework injected a 404 page into the missing default
slot for the children route. On platforms like Vercel, this caused full
404 RSC responses because the HTTP status code has semantic meaning for
route behavior when using cache components. This resulted in the
"unknown segment value fallback page" issue.

**Impact:**
- RSC requests for interception routes would return 404 status codes
- Platform routing behavior was incorrectly triggered by these 404
responses
- Only affects pages rendering with cache components

### How?

- Created new `default-null.tsx` builtin component that renders `null`
- Updated Rust code (`app_structure.rs`) to detect interception routes
and use the null default
- Updated webpack loader (`next-app-loader/index.ts`) to check
`isInterceptionRouteAppPath()` and inject the null default
- Removed test-specific default component that was working around this
bug
- The old `page.tsx` is still used during client navigation, so there's
no visible change to users

This ensures minimal RSC payload changes and prevents 404 status codes
while maintaining existing client-side behavior.

NAR-483
2025-11-12 18:57:32 -07:00

18 lines
541 B
TypeScript

/**
* TEST CASE 3: Interception route WITH parallel routes AND page.tsx
*
* Expected: NO default.tsx needed for children slot
* Reason: Has page.tsx which fills the children slot
* The @sidebar slot exists but children slot has content
*/
export default function Page() {
return (
<div>
<h3>✅ TEST CASE 3: Has both @sidebar AND page.tsx</h3>
<p>This level has @sidebar parallel route AND a page.tsx</p>
<p>The page.tsx fills the children slot.</p>
<p>NO default.tsx needed!</p>
</div>
)
}