Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
dfd3fae
apply patch correctly for last segment
feedthejim Mar 22, 2023
739a584
re-render layout on parallel key change
feedthejim Mar 22, 2023
a51b1db
refactor for readability
feedthejim Mar 22, 2023
b120b12
implement parallel routes default
feedthejim Mar 23, 2023
a79fe3f
remove useless check
feedthejim Mar 23, 2023
452770a
remove leftover fn
feedthejim Mar 23, 2023
98f6eb2
enable tests in dev
feedthejim Mar 23, 2023
8829681
fix test + small refactor
feedthejim Mar 23, 2023
c6326ca
fix test
feedthejim Mar 23, 2023
59b3634
support @children
feedthejim Mar 24, 2023
6abf5fa
re-enable test for build
feedthejim Mar 24, 2023
3084422
fix adjacent child check for directory only
feedthejim Mar 24, 2023
47a6f00
Merge branch 'canary' into feedthejim/next-748-verify-partial-renderi…
feedthejim Mar 24, 2023
1192d34
fix lint
feedthejim Mar 24, 2023
9ade248
initial implementation
feedthejim Mar 25, 2023
64284d8
refactors
feedthejim Mar 26, 2023
4900fa2
fix hmr
feedthejim Mar 27, 2023
9b83aef
change referrer computation method
feedthejim Mar 27, 2023
92cbf42
add segment tree override
feedthejim Mar 27, 2023
999b516
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 27, 2023
b8bde07
fix types
feedthejim Mar 27, 2023
0fde8ff
fix test
feedthejim Mar 27, 2023
02d037b
update tests
feedthejim Mar 27, 2023
be9e620
rewrite tests
feedthejim Mar 27, 2023
8fdb943
remove logs
feedthejim Mar 27, 2023
94d4a59
add unit test for referrer parsing
feedthejim Mar 27, 2023
9fc9bc9
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 27, 2023
45b1a43
remove log
feedthejim Mar 27, 2023
acb3b29
update comments
feedthejim Mar 27, 2023
d097f9f
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 27, 2023
92237b9
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 27, 2023
09c6ce6
refactor: provide more consistent interface for matchers with pathnam…
wyattjoh Mar 27, 2023
ce365a9
refactor: formatting updates
wyattjoh Mar 27, 2023
be0c36c
fix: added key prop's to test files
wyattjoh Mar 28, 2023
b2ac7dc
fix: corrected invalid slot name
wyattjoh Mar 28, 2023
853f9fd
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 28, 2023
eac2b2d
address comments
feedthejim Mar 28, 2023
6783565
fix windows test
feedthejim Mar 28, 2023
6001b80
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 28, 2023
a1f00be
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 28, 2023
d615593
use check for tests
feedthejim Mar 28, 2023
d66a842
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 28, 2023
f6ab0f7
fix tests failures
feedthejim Mar 28, 2023
76c9726
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 28, 2023
61cd219
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 29, 2023
58d247d
restire test position
feedthejim Mar 28, 2023
ceaa38f
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 31, 2023
1496087
update injection method
feedthejim Mar 31, 2023
9b168df
make sure we patch the tree if the previous page was a __DEFAULT__
feedthejim Mar 31, 2023
148f04f
pass the previous cache node when populating the cache tree
feedthejim Mar 31, 2023
08cdb07
add a fast refresh reducer
feedthejim Mar 31, 2023
ab4533f
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Mar 31, 2023
f7041fe
remove misc change
feedthejim Mar 31, 2023
1512bc8
Merge branch 'canary' into feedthejim/next-749-implement-route-interc…
feedthejim Apr 3, 2023
266c003
pass the existing cache node nonethelesss
feedthejim Apr 3, 2023
c4589bf
skip __DEFAULT__ item when applying fligth data to the cache
feedthejim Apr 3, 2023
5e4abc0
don't overwrite cache node if already ready
feedthejim Apr 3, 2023
6ce7349
add 404 by default for parallel routes
feedthejim Apr 3, 2023
b59a53d
Merge branch 'canary' into feedthejim/next-918-make-default-pagets-404
feedthejim Apr 4, 2023
4a369f8
Merge branch 'canary' into feedthejim/next-918-make-default-pagets-404
feedthejim Apr 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
implement parallel routes default
  • Loading branch information
feedthejim committed Mar 24, 2023
commit b120b129b6091570d7cc40078f934f9382e09ce2
63 changes: 63 additions & 0 deletions packages/next/src/build/webpack/loaders/next-app-loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
} from './metadata/discover'
import { isAppRouteRoute } from '../../../lib/is-app-route-route'
import { isMetadataRoute } from '../../../lib/metadata/is-metadata-route'
import { promises as fs } from 'fs'

export type AppLoaderOptions = {
name: string
Expand Down Expand Up @@ -56,6 +57,8 @@ export type ComponentsType = {
readonly page?: ModuleReference
} & {
readonly metadata?: CollectedMetadata
} & {
readonly defaultPage?: ModuleReference
}

async function createAppRouteCode({
Expand Down Expand Up @@ -132,6 +135,37 @@ async function createTreeCodeFromPath(
let rootLayout: string | undefined
let globalError: string | undefined

async function resolveAdjacentParallelSegments(
segmentPath: string
): Promise<string[]> {
const absoluteSegmentPath = await resolver(
`${appDirPrefix}${segmentPath}`,
true
)

if (!absoluteSegmentPath) {
return []
}

// We need to resolve all parallel routes in this level.
const files = await fs.readdir(absoluteSegmentPath)

const parallelSegments: string[] = ['children']

await Promise.all(
files.map(async (file) => {
const filePath = path.join(absoluteSegmentPath, file)
const stat = await fs.stat(filePath)

if (stat.isDirectory() && file.startsWith('@')) {
parallelSegments.push(file.slice(1))
}
})
)

return parallelSegments
}

async function createSubtreePropsFromSegmentPath(
segments: string[]
): Promise<{
Expand Down Expand Up @@ -257,6 +291,34 @@ async function createTreeCodeFromPath(
]`
}

const adjacentParallelSegments = await resolveAdjacentParallelSegments(
segmentPath
)

for (const adjacentParallelSegment of adjacentParallelSegments) {
if (!props[adjacentParallelSegment]) {
const actualSegment =
adjacentParallelSegment === 'children'
? ''
: `@${adjacentParallelSegment}`
const defaultPath =
(await resolver(
`${appDirPrefix}${segmentPath}/${actualSegment}/default`
)) ??
(await resolver(`next/dist/client/components/parallel-route-default`))

props[adjacentParallelSegment] = `[
'__DEFAULT__',
{},
{
defaultPage: [() => import(/* webpackMode: "eager" */ ${JSON.stringify(
defaultPath
)}), ${JSON.stringify(defaultPath)}],
}
]`
}
}

return {
treeCode: `{
${Object.entries(props)
Expand Down Expand Up @@ -316,6 +378,7 @@ const nextAppLoader: AppLoader = async function nextAppLoader() {

const normalizedAppPaths =
typeof appPaths === 'string' ? [appPaths] : appPaths || []

const resolveParallelSegments = (
pathname: string
): [string, string | string[]][] => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function NoopParallelRouteDefault() {
return null
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ function applyPatch(
const [initialSegment, initialParallelRoutes] = initialTree
const [patchSegment, patchParallelRoutes] = patchTree

// if the applied patch segment is __DEFAULT__ then we can ignore it and return the initial tree
// this is because the __DEFAULT__ segment is used as a placeholder on navigation
if (patchSegment === '__DEFAULT__') {
return initialTree
}

if (matchSegment(initialSegment, patchSegment)) {
const newParallelRoutes: FlightRouterState[1] = {}
for (const key in initialParallelRoutes) {
Expand Down Expand Up @@ -85,7 +91,7 @@ export function applyRouterStatePatchToTree(

let parallelRoutePatch
if (lastSegment) {
parallelRoutePatch = applyPatch(treePatch, parallelRoutes[parallelRouteKey])
parallelRoutePatch = applyPatch(parallelRoutes[parallelRouteKey], treePatch)
} else {
parallelRoutePatch = applyRouterStatePatchToTree(
flightSegmentPath.slice(2),
Expand Down
3 changes: 2 additions & 1 deletion packages/next/src/server/app-render/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,8 @@ export async function renderToHTMLOrFlight(
template,
error,
loading,
page,
defaultPage,
page = defaultPage,
'not-found': notFound,
} = components
const layoutOrPagePath = layout?.[1] || page?.[1]
Expand Down
10 changes: 7 additions & 3 deletions packages/next/src/server/lib/app-dir-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,23 @@ export type LoaderTree = [
]

export async function getLayoutOrPageModule(loaderTree: LoaderTree) {
const { layout, page } = loaderTree[2]
const { layout, page, defaultPage } = loaderTree[2]
const isLayout = typeof layout !== 'undefined'
const isPage = typeof page !== 'undefined'
const isDefaultPage = typeof defaultPage !== 'undefined'

let value = undefined
let modType: 'layout' | 'page' | undefined = undefined

if (isLayout) {
value = await layout[0]()
modType = 'layout'
}
if (isPage) {
} else if (isPage) {
value = await page[0]()
modType = 'page'
} else if (isDefaultPage) {
value = await defaultPage[0]()
modType = 'page'
}

return [value, modType] as const
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function Page() {
return <div>Default</div>
}