diff --git a/packages/router-core/src/new-process-route-tree.ts b/packages/router-core/src/new-process-route-tree.ts index bbdbde56e21..64abb685b6a 100644 --- a/packages/router-core/src/new-process-route-tree.ts +++ b/packages/router-core/src/new-process-route-tree.ts @@ -332,7 +332,13 @@ function parseSegments( // but if there is *also* a layout route at this path, save it as notFound // we can use it when fuzzy matching to display the NotFound component in the layout route if (!isIndex) node.notFound = route - if (!node.route || (!node.isIndex && isIndex)) node.route = route + // does the new route take precedence over an existing one? + // yes if previous is not an index route and new one is an index route + if (!node.route || (!node.isIndex && isIndex)) { + node.route = route + // when replacing, replace all attributes that are route-specific (`fullPath` only at the moment) + node.fullPath = route.fullPath ?? route.from + } node.isIndex ||= isIndex } } diff --git a/packages/router-core/tests/new-process-route-tree.test.ts b/packages/router-core/tests/new-process-route-tree.test.ts index 65b7da14ca2..746cd470928 100644 --- a/packages/router-core/tests/new-process-route-tree.test.ts +++ b/packages/router-core/tests/new-process-route-tree.test.ts @@ -831,6 +831,37 @@ describe('findRouteMatch', () => { expect(result?.params).toEqual({ '**': decoded }) }) }) + describe('edge-cases', () => { + it('#6012: optional index at root with param extraction', () => { + const tree = { + id: '__root__', + fullPath: '/', + path: '/', + isRoot: true, + options: {}, + children: [ + { + id: '/{-$year}/{-$month}/{-$day}', + fullPath: '/{-$year}/{-$month}/{-$day}', + path: '{-$year}/{-$month}/{-$day}', + isRoot: false, + options: {}, + }, + { + id: '/_pathless/{-$language}/', + fullPath: '/{-$language}/', + path: '{-$language}/', + isRoot: false, + options: {}, + }, + ], + } + const { processedTree } = processRouteTree(tree) + const result = findRouteMatch(`/sv`, processedTree) + expect(result?.route.id).toBe('/_pathless/{-$language}/') + expect(result?.params).toEqual({ language: 'sv' }) + }) + }) }) })