diff --git a/.changeset/little-bags-suffer.md b/.changeset/little-bags-suffer.md new file mode 100644 index 0000000000..3bdc0a0eb7 --- /dev/null +++ b/.changeset/little-bags-suffer.md @@ -0,0 +1,5 @@ +--- +'@ice/route-manifest': patch +--- + +fix: unique the route id when nested with the same path diff --git a/packages/route-manifest/src/routes.ts b/packages/route-manifest/src/routes.ts index a272333dd5..500985aed1 100644 --- a/packages/route-manifest/src/routes.ts +++ b/packages/route-manifest/src/routes.ts @@ -128,8 +128,7 @@ export function defineRoutes( ? parentRoutes[parentRoutes.length - 1] : undefined; - const id = createRouteId(file, path, parentRoute?.path, options.index); - + const id = createRouteId(file, path, parentRoute?.id, options.index); const route: ConfigRoute = { path, index: options.index ? true : undefined, diff --git a/packages/route-manifest/tests/__snapshots__/generateRouteManifest.spec.ts.snap b/packages/route-manifest/tests/__snapshots__/generateRouteManifest.spec.ts.snap index 4c81670ac1..c4efe6a6c3 100644 --- a/packages/route-manifest/tests/__snapshots__/generateRouteManifest.spec.ts.snap +++ b/packages/route-manifest/tests/__snapshots__/generateRouteManifest.spec.ts.snap @@ -2,42 +2,65 @@ exports[`generateRouteManifest function > basic-routes 1`] = ` { - "/": { + "layout": { + "componentName": "layout", + "file": "layout.tsx", + "id": "layout", + "index": undefined, + "layout": true, + "parentId": undefined, + "path": undefined, + }, + "layout/": { "componentName": "index", "file": "index.tsx", - "id": "/", + "id": "layout/", "index": true, "layout": false, "parentId": "layout", "path": undefined, }, - "About": { + "layout/About": { "componentName": "about-index", "file": "About/index.tsx", - "id": "About", + "id": "layout/About", "index": true, "layout": false, "parentId": "layout", "path": "About", }, - "About/me": { + "layout/About/me": { "componentName": "about-me-index", "file": "About/me/index.tsx", - "id": "About/me", + "id": "layout/About/me", "index": true, "layout": false, "parentId": "layout", "path": "About/me", }, - "home": { + "layout/home": { "componentName": "home", "file": "home.tsx", - "id": "home", + "id": "layout/home", "index": undefined, "layout": false, "parentId": "layout", "path": "home", }, +} +`; + +exports[`generateRouteManifest function > define-extra-routes 1`] = ` +{ + "/about-me": { + "componentName": "about-index", + "file": "About/index.tsx", + "id": "/about-me", + "index": undefined, + "layout": false, + "parentId": undefined, + "path": "/about-me", + }, "layout": { "componentName": "layout", "file": "layout.tsx", @@ -47,47 +70,38 @@ exports[`generateRouteManifest function > basic-routes 1`] = ` "parentId": undefined, "path": undefined, }, -} -`; - -exports[`generateRouteManifest function > define-extra-routes 1`] = ` -{ - "/": { + "layout/": { "componentName": "index", "file": "index.tsx", - "id": "/", + "id": "layout/", "index": true, "layout": false, "parentId": "layout", "path": undefined, }, - "/about-me": { - "componentName": "about-index", - "file": "About/index.tsx", - "id": "/about-me", - "index": undefined, - "layout": false, - "parentId": undefined, - "path": "/about-me", - }, - "About/me": { + "layout/About/me": { "componentName": "about-me-index", "file": "About/me/index.tsx", - "id": "About/me", + "id": "layout/About/me", "index": true, "layout": false, "parentId": "layout", "path": "About/me", }, - "home": { + "layout/home": { "componentName": "home", "file": "home.tsx", - "id": "home", + "id": "layout/home", "index": undefined, "layout": false, "parentId": "layout", "path": "home", }, +} +`; + +exports[`generateRouteManifest function > doc-delimeters-routes 1`] = ` +{ "layout": { "componentName": "layout", "file": "layout.tsx", @@ -97,29 +111,15 @@ exports[`generateRouteManifest function > define-extra-routes 1`] = ` "parentId": undefined, "path": undefined, }, -} -`; - -exports[`generateRouteManifest function > doc-delimeters-routes 1`] = ` -{ - "home/news": { + "layout/home/news": { "componentName": "home.news", "file": "home.news.tsx", - "id": "home/news", + "id": "layout/home/news", "index": undefined, "layout": false, "parentId": "layout", "path": "home/news", }, - "layout": { - "componentName": "layout", - "file": "layout.tsx", - "id": "layout", - "index": undefined, - "layout": true, - "parentId": undefined, - "path": undefined, - }, } `; @@ -189,33 +189,47 @@ exports[`generateRouteManifest function > escape-routes 1`] = ` exports[`generateRouteManifest function > ignore-routes 1`] = ` { - "/": { + "layout": { + "componentName": "layout", + "file": "layout.tsx", + "id": "layout", + "index": undefined, + "layout": true, + "parentId": undefined, + "path": undefined, + }, + "layout/": { "componentName": "index", "file": "index.tsx", - "id": "/", + "id": "layout/", "index": true, "layout": false, "parentId": "layout", "path": undefined, }, - "About/me": { + "layout/About/me": { "componentName": "about-me-index", "file": "About/me/index.tsx", - "id": "About/me", + "id": "layout/About/me", "index": true, "layout": false, "parentId": "layout", "path": "About/me", }, - "home": { + "layout/home": { "componentName": "home", "file": "home.tsx", - "id": "home", + "id": "layout/home", "index": undefined, "layout": false, "parentId": "layout", "path": "home", }, +} +`; + +exports[`generateRouteManifest function > layout-routes 1`] = ` +{ "layout": { "componentName": "layout", "file": "layout.tsx", @@ -225,83 +239,78 @@ exports[`generateRouteManifest function > ignore-routes 1`] = ` "parentId": undefined, "path": undefined, }, -} -`; - -exports[`generateRouteManifest function > layout-routes 1`] = ` -{ - "/": { + "layout/": { "componentName": "index", "file": "index.tsx", - "id": "/", + "id": "layout/", "index": true, "layout": false, "parentId": "layout", "path": undefined, }, - "about": { + "layout/about": { "componentName": "about", "file": "about.tsx", - "id": "about", + "id": "layout/about", "index": undefined, "layout": false, "parentId": "layout", "path": "about", }, - "blog/": { + "layout/blog/layout": { + "componentName": "blog-layout", + "file": "blog/layout.tsx", + "id": "layout/blog/layout", + "index": undefined, + "layout": true, + "parentId": "layout", + "path": "blog", + }, + "layout/blog/layout/": { "componentName": "blog-index", "file": "blog/index.tsx", - "id": "blog/", + "id": "layout/blog/layout/", "index": true, "layout": false, - "parentId": "blog/layout", + "parentId": "layout/blog/layout", "path": undefined, }, - "blog/:id": { + "layout/blog/layout/:id": { "componentName": "blog-$id", "file": "blog/$id.tsx", - "id": "blog/:id", + "id": "layout/blog/layout/:id", "index": undefined, "layout": false, - "parentId": "blog/layout", + "parentId": "layout/blog/layout", "path": ":id", }, - "blog/layout": { - "componentName": "blog-layout", - "file": "blog/layout.tsx", - "id": "blog/layout", + "layout/home/layout": { + "componentName": "home-layout", + "file": "home/layout.tsx", + "id": "layout/home/layout", "index": undefined, "layout": true, "parentId": "layout", - "path": "blog", + "path": "home", }, - "home/": { + "layout/home/layout/": { "componentName": "home-index", "file": "home/index.tsx", - "id": "home/", + "id": "layout/home/layout/", "index": true, "layout": false, - "parentId": "home/layout", + "parentId": "layout/home/layout", "path": undefined, }, - "home/layout": { + "layout/home/layout/layout": { "componentName": "home-layout-index", "file": "home/layout/index.tsx", - "id": "home/layout", + "id": "layout/home/layout/layout", "index": true, "layout": true, - "parentId": "home/layout", + "parentId": "layout/home/layout", "path": "layout", }, - "layout": { - "componentName": "layout", - "file": "layout.tsx", - "id": "layout", - "index": undefined, - "layout": true, - "parentId": undefined, - "path": undefined, - }, } `; @@ -328,26 +337,67 @@ exports[`generateRouteManifest function > nested-routes 1`] = ` } `; -exports[`generateRouteManifest function > splat-routes 1`] = ` +exports[`generateRouteManifest function > nexted-routes-with-same-children 1`] = ` { - "*": { - "componentName": "$", - "file": "$.tsx", - "id": "*", + "/prefix-a": { + "componentName": "layout-a", + "file": "layout-a.tsx", + "id": "/prefix-a", "index": undefined, "layout": false, - "parentId": "layout", - "path": "*", + "parentId": undefined, + "path": "/prefix-a", }, - "home": { - "componentName": "home", - "file": "home.tsx", - "id": "home", + "/prefix-a/base": { + "componentName": "layout-a-a", + "file": "layout-a-a.tsx", + "id": "/prefix-a/base", "index": undefined, "layout": false, - "parentId": "layout", - "path": "home", + "parentId": "/prefix-a", + "path": "base", + }, + "/prefix-a/base/index": { + "componentName": "a", + "file": "a.tsx", + "id": "/prefix-a/base/index", + "index": undefined, + "layout": false, + "parentId": "/prefix-a/base", + "path": "index", }, + "/prefix-b": { + "componentName": "layout-b", + "file": "layout-b.tsx", + "id": "/prefix-b", + "index": undefined, + "layout": false, + "parentId": undefined, + "path": "/prefix-b", + }, + "/prefix-b/base": { + "componentName": "layout-b-b", + "file": "layout-b-b.tsx", + "id": "/prefix-b/base", + "index": undefined, + "layout": false, + "parentId": "/prefix-b", + "path": "base", + }, + "/prefix-b/base/index": { + "componentName": "b", + "file": "b.tsx", + "id": "/prefix-b/base/index", + "index": undefined, + "layout": false, + "parentId": "/prefix-b/base", + "path": "index", + }, +} +`; + +exports[`generateRouteManifest function > splat-routes 1`] = ` +{ "layout": { "componentName": "layout", "file": "layout.tsx", @@ -357,5 +407,23 @@ exports[`generateRouteManifest function > splat-routes 1`] = ` "parentId": undefined, "path": undefined, }, + "layout/*": { + "componentName": "$", + "file": "$.tsx", + "id": "layout/*", + "index": undefined, + "layout": false, + "parentId": "layout", + "path": "*", + }, + "layout/home": { + "componentName": "home", + "file": "home.tsx", + "id": "layout/home", + "index": undefined, + "layout": false, + "parentId": "layout", + "path": "home", + }, } `; diff --git a/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/a.tsx b/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/a.tsx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/b.tsx b/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/b.tsx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/layout-a-a.tsx b/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/layout-a-a.tsx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/layout-a.tsx b/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/layout-a.tsx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/layout-b-b.tsx b/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/layout-b-b.tsx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/layout-b.tsx b/packages/route-manifest/tests/fixtures/nested-with-same-children/src/pages/layout-b.tsx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/route-manifest/tests/generateRouteManifest.spec.ts b/packages/route-manifest/tests/generateRouteManifest.spec.ts index 0cb00ec391..151cc4dfb3 100644 --- a/packages/route-manifest/tests/generateRouteManifest.spec.ts +++ b/packages/route-manifest/tests/generateRouteManifest.spec.ts @@ -78,4 +78,27 @@ describe('generateRouteManifest function', () => { ); expect(routeManifest).toMatchSnapshot(); }); + + test('nexted-routes-with-same-children', () => { + const rootDir = path.join(fixturesDir, 'nexted-with-same-children'); + const routeManifest = generateRouteManifest( + rootDir, + [ + '**', + ], + [(defineRoute) => { + defineRoute('/prefix-a', 'layout-a.tsx', () => { + defineRoute('base', 'layout-a-a.tsx', () => { + defineRoute('index', 'a.tsx'); + }); + }); + defineRoute('/prefix-b', 'layout-b.tsx', () => { + defineRoute('base', 'layout-b-b.tsx', () => { + defineRoute('index', 'b.tsx'); + }); + }); + }], + ); + expect(routeManifest).toMatchSnapshot(); + }); });