From 432122260149b641762ef8302b93e5b55b2b948b Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 21 Aug 2023 17:28:59 -0700 Subject: [PATCH] Fix data route ordering in dev --- .../src/server/lib/router-utils/setup-dev.ts | 5 +++- .../pages/[name]/[comment]/[...rest].js | 12 ++++++++ .../dynamic-routing/test/index.test.js | 30 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/integration/dynamic-routing/pages/[name]/[comment]/[...rest].js diff --git a/packages/next/src/server/lib/router-utils/setup-dev.ts b/packages/next/src/server/lib/router-utils/setup-dev.ts index a87ae086c4507..1a2f5f782de75 100644 --- a/packages/next/src/server/lib/router-utils/setup-dev.ts +++ b/packages/next/src/server/lib/router-utils/setup-dev.ts @@ -1246,10 +1246,12 @@ async function startWatcher(opts: SetupOpts) { }) .filter(Boolean) as any + const dataRoutes: typeof opts.fsChecker.dynamicRoutes = [] + for (const page of sortedRoutes) { const route = buildDataRoute(page, 'development') const routeRegex = getRouteRegex(route.page) - opts.fsChecker.dynamicRoutes.push({ + dataRoutes.push({ ...route, regex: routeRegex.re.toString(), match: getRouteMatcher({ @@ -1267,6 +1269,7 @@ async function startWatcher(opts: SetupOpts) { }), }) } + opts.fsChecker.dynamicRoutes.unshift(...dataRoutes) if (!prevSortedRoutes?.every((val, idx) => val === sortedRoutes[idx])) { // emit the change so clients fetch the update diff --git a/test/integration/dynamic-routing/pages/[name]/[comment]/[...rest].js b/test/integration/dynamic-routing/pages/[name]/[comment]/[...rest].js new file mode 100644 index 0000000000000..74e30e4905d55 --- /dev/null +++ b/test/integration/dynamic-routing/pages/[name]/[comment]/[...rest].js @@ -0,0 +1,12 @@ +// this checks priority issues with catch-all routes that +// can match `_next/data/build-id/path.json + +export function getServerSideProps() { + return { + notFound: true, + } +} + +export default function Page() { + return

nested catch-all

+} diff --git a/test/integration/dynamic-routing/test/index.test.js b/test/integration/dynamic-routing/test/index.test.js index 417e5317b36db..0f9530cce5388 100644 --- a/test/integration/dynamic-routing/test/index.test.js +++ b/test/integration/dynamic-routing/test/index.test.js @@ -1318,6 +1318,22 @@ function runTests({ dev }) { nxtPrest: 'nxtPrest', }, }, + { + dataRouteRegex: normalizeRegEx( + `^\\/_next\\/data\\/${escapeRegex( + buildId + )}\\/([^\\/]+?)\\/([^\\/]+?)\\/(.+?)\\.json$` + ), + namedDataRouteRegex: `^/_next/data/${escapeRegex( + buildId + )}/(?[^/]+?)/(?[^/]+?)/(?.+?)\\.json$`, + page: '/[name]/[comment]/[...rest]', + routeKeys: { + nxtPcomment: 'nxtPcomment', + nxtPname: 'nxtPname', + nxtPrest: 'nxtPrest', + }, + }, ], dynamicRoutes: [ { @@ -1458,6 +1474,19 @@ function runTests({ dev }) { nxtPcomment: 'nxtPcomment', }, }, + { + namedRegex: + '^/(?[^/]+?)/(?[^/]+?)/(?.+?)(?:/)?$', + page: '/[name]/[comment]/[...rest]', + regex: normalizeRegEx( + '^\\/([^\\/]+?)\\/([^\\/]+?)\\/(.+?)(?:\\/)?$' + ), + routeKeys: { + nxtPcomment: 'nxtPcomment', + nxtPname: 'nxtPname', + nxtPrest: 'nxtPrest', + }, + }, ], rsc: { header: 'RSC', @@ -1475,6 +1504,7 @@ function runTests({ dev }) { expect(manifest).toEqual({ '/[name]/[comment]': 'pages/[name]/[comment].js', + '/[name]/[comment]/[...rest]': 'pages/[name]/[comment]/[...rest].js', '/[name]/comments': 'pages/[name]/comments.js', '/[name]': 'pages/[name].js', '/[name]/on-mount-redir': 'pages/[name]/on-mount-redir.html',