From a600d7741e3dcbe2516bcbe776410e2aa230a7a4 Mon Sep 17 00:00:00 2001 From: Rob Stanford Date: Fri, 14 Apr 2023 16:58:28 +0100 Subject: [PATCH 1/4] fix: ensure falsy dataRoutes are not included in the edge manifest --- packages/runtime/src/helpers/edge.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/runtime/src/helpers/edge.ts b/packages/runtime/src/helpers/edge.ts index bdaa21664f..cc4d34281f 100644 --- a/packages/runtime/src/helpers/edge.ts +++ b/packages/runtime/src/helpers/edge.ts @@ -275,14 +275,14 @@ export const writeRscDataEdgeFunction = async ({ } const staticAppdirRoutes: Array = [] for (const [path, route] of Object.entries(prerenderManifest.routes)) { - if (isAppDirRoute(route.srcRoute, appPathRoutesManifest)) { + if (isAppDirRoute(route.srcRoute, appPathRoutesManifest) && route.dataRoute) { staticAppdirRoutes.push(path, route.dataRoute) } } const dynamicAppDirRoutes: Array = [] for (const [path, route] of Object.entries(prerenderManifest.dynamicRoutes)) { - if (isAppDirRoute(path, appPathRoutesManifest)) { + if (isAppDirRoute(path, appPathRoutesManifest) && route.dataRouteRegex) { dynamicAppDirRoutes.push(route.routeRegex, route.dataRouteRegex) } } From ab60685fe411c2a062eaf8e20c291a6cea8d14f8 Mon Sep 17 00:00:00 2001 From: Rob Stanford Date: Fri, 14 Apr 2023 16:58:52 +0100 Subject: [PATCH 2/4] test: add tests for falsy dataRoutes in the edge manifest --- test/edge.spec.ts | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 test/edge.spec.ts diff --git a/test/edge.spec.ts b/test/edge.spec.ts new file mode 100644 index 0000000000..6c18d51702 --- /dev/null +++ b/test/edge.spec.ts @@ -0,0 +1,118 @@ +import { writeRscDataEdgeFunction } from '../packages/runtime/src/helpers/edge' +import type { PrerenderManifest } from 'next/dist/build' + +const basePrerenderManifest: PrerenderManifest = { + version: 3, + routes: {}, + dynamicRoutes: {}, + notFoundRoutes: [], + preview: { + previewModeId: '', + previewModeSigningKey: '', + previewModeEncryptionKey: '', + }, +} + +describe('writeRscDataEdgeFunction', () => { + it('should return manifest entries for static appDir routes', async () => { + const prerenderManifest: PrerenderManifest = { + ...basePrerenderManifest, + routes: { + '/': { + initialRevalidateSeconds: false, + srcRoute: '/', + dataRoute: '/index.rsc', + }, + }, + } + const appPathRoutesManifest = { + '/page': '/', + } + const edgeManifest = await writeRscDataEdgeFunction({ prerenderManifest, appPathRoutesManifest }) + + expect(edgeManifest).toEqual([ + { + function: 'rsc-data', + name: 'RSC data routing', + path: '/', + }, + { + function: 'rsc-data', + name: 'RSC data routing', + path: '/index.rsc', + }, + ]) + }) + + it('should not return manifest entries for static appDir routes without dataRoutes', async () => { + const prerenderManifest: PrerenderManifest = { + ...basePrerenderManifest, + routes: { + '/api/hello': { + initialRevalidateSeconds: false, + srcRoute: '/api/hello', + dataRoute: null, + }, + }, + } + const appPathRoutesManifest = { + '/api/hello/route': '/api/hello', + } + const edgeManifest = await writeRscDataEdgeFunction({ prerenderManifest, appPathRoutesManifest }) + + expect(edgeManifest).toEqual([]) + }) + + it('should return manifest entries for dynamic appDir routes', async () => { + const prerenderManifest: PrerenderManifest = { + ...basePrerenderManifest, + dynamicRoutes: { + '/blog/[author]': { + routeRegex: '^/blog/([^/]+?)(?:/)?$', + dataRoute: '/blog/[author].rsc', + fallback: null, + dataRouteRegex: '^/blog/([^/]+?)\\.rsc$', + }, + }, + } + + const appPathRoutesManifest = { + '/blog/[author]/page': '/blog/[author]', + } + const edgeManifest = await writeRscDataEdgeFunction({ prerenderManifest, appPathRoutesManifest }) + + expect(edgeManifest).toEqual([ + { + function: 'rsc-data', + name: 'RSC data routing', + pattern: '^/blog/([^/]+?)(?:/)?$', + }, + { + function: 'rsc-data', + name: 'RSC data routing', + pattern: '^/blog/([^/]+?)\\.rsc$', + }, + ]) + }) + + it('should not return manifest entries for dynamic appDir routes without dataRoutes', async () => { + const prerenderManifest: PrerenderManifest = { + ...basePrerenderManifest, + dynamicRoutes: { + '/api/[endpoint]': { + routeRegex: '^/api/([^/]+?)(?:/)?$', + dataRoute: '/api/[endpoint].rsc', + fallback: null, + dataRouteRegex: null, + }, + }, + } + + const appPathRoutesManifest = { + '/api/[endpoint]/route': '/api/[endpoint]', + } + const edgeManifest = await writeRscDataEdgeFunction({ prerenderManifest, appPathRoutesManifest }) + + expect(edgeManifest).toEqual([]) + }) +}) From 1141f4ff6b2296f2d9fb85056beed29eb10cfe7e Mon Sep 17 00:00:00 2001 From: Rob Stanford Date: Mon, 17 Apr 2023 12:11:28 +0100 Subject: [PATCH 3/4] chore: rename rsc data edge manifest function --- packages/runtime/src/helpers/edge.ts | 4 ++-- test/edge.spec.ts | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/runtime/src/helpers/edge.ts b/packages/runtime/src/helpers/edge.ts index cc4d34281f..59b9b85cb0 100644 --- a/packages/runtime/src/helpers/edge.ts +++ b/packages/runtime/src/helpers/edge.ts @@ -263,7 +263,7 @@ export const writeDevEdgeFunction = async ({ * Writes an edge function that routes RSC data requests to the `.rsc` route */ -export const writeRscDataEdgeFunction = async ({ +export const generateRscDataEdgeManifest = async ({ prerenderManifest, appPathRoutesManifest, }: { @@ -368,7 +368,7 @@ export const writeEdgeFunctions = async ({ return } - const rscFunctions = await writeRscDataEdgeFunction({ + const rscFunctions = await generateRscDataEdgeManifest({ prerenderManifest: await loadPrerenderManifest(netlifyConfig), appPathRoutesManifest: await loadAppPathRoutesManifest(netlifyConfig), }) diff --git a/test/edge.spec.ts b/test/edge.spec.ts index 6c18d51702..85b3e95865 100644 --- a/test/edge.spec.ts +++ b/test/edge.spec.ts @@ -1,4 +1,4 @@ -import { writeRscDataEdgeFunction } from '../packages/runtime/src/helpers/edge' +import { generateRscDataEdgeManifest } from '../packages/runtime/src/helpers/edge' import type { PrerenderManifest } from 'next/dist/build' const basePrerenderManifest: PrerenderManifest = { @@ -13,7 +13,7 @@ const basePrerenderManifest: PrerenderManifest = { }, } -describe('writeRscDataEdgeFunction', () => { +describe('generateRscDataEdgeManifest', () => { it('should return manifest entries for static appDir routes', async () => { const prerenderManifest: PrerenderManifest = { ...basePrerenderManifest, @@ -28,7 +28,7 @@ describe('writeRscDataEdgeFunction', () => { const appPathRoutesManifest = { '/page': '/', } - const edgeManifest = await writeRscDataEdgeFunction({ prerenderManifest, appPathRoutesManifest }) + const edgeManifest = await generateRscDataEdgeManifest({ prerenderManifest, appPathRoutesManifest }) expect(edgeManifest).toEqual([ { @@ -58,7 +58,7 @@ describe('writeRscDataEdgeFunction', () => { const appPathRoutesManifest = { '/api/hello/route': '/api/hello', } - const edgeManifest = await writeRscDataEdgeFunction({ prerenderManifest, appPathRoutesManifest }) + const edgeManifest = await generateRscDataEdgeManifest({ prerenderManifest, appPathRoutesManifest }) expect(edgeManifest).toEqual([]) }) @@ -79,7 +79,7 @@ describe('writeRscDataEdgeFunction', () => { const appPathRoutesManifest = { '/blog/[author]/page': '/blog/[author]', } - const edgeManifest = await writeRscDataEdgeFunction({ prerenderManifest, appPathRoutesManifest }) + const edgeManifest = await generateRscDataEdgeManifest({ prerenderManifest, appPathRoutesManifest }) expect(edgeManifest).toEqual([ { @@ -95,7 +95,7 @@ describe('writeRscDataEdgeFunction', () => { ]) }) - it('should not return manifest entries for dynamic appDir routes without dataRoutes', async () => { + it('should not return manifest entries for dynamic appDir routes without dataRoute', async () => { const prerenderManifest: PrerenderManifest = { ...basePrerenderManifest, dynamicRoutes: { @@ -111,7 +111,7 @@ describe('writeRscDataEdgeFunction', () => { const appPathRoutesManifest = { '/api/[endpoint]/route': '/api/[endpoint]', } - const edgeManifest = await writeRscDataEdgeFunction({ prerenderManifest, appPathRoutesManifest }) + const edgeManifest = await generateRscDataEdgeManifest({ prerenderManifest, appPathRoutesManifest }) expect(edgeManifest).toEqual([]) }) From b82d3d98c994fe10c787010d8ff00acf8a5326d0 Mon Sep 17 00:00:00 2001 From: Rob Stanford Date: Mon, 17 Apr 2023 12:12:00 +0100 Subject: [PATCH 4/4] chore: update dataroute regex test description --- test/edge.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/edge.spec.ts b/test/edge.spec.ts index 85b3e95865..80d6d782ce 100644 --- a/test/edge.spec.ts +++ b/test/edge.spec.ts @@ -95,7 +95,7 @@ describe('generateRscDataEdgeManifest', () => { ]) }) - it('should not return manifest entries for dynamic appDir routes without dataRoute', async () => { + it('should not return manifest entries for dynamic appDir routes without dataRouteRegex', async () => { const prerenderManifest: PrerenderManifest = { ...basePrerenderManifest, dynamicRoutes: {