From 72f686a68930de52f9a274c13c98acad59925b31 Mon Sep 17 00:00:00 2001 From: Johannes Spohr Date: Fri, 19 May 2023 16:52:46 +0200 Subject: [PATCH] Fix injectRoute for SSR (#7128) * Use manifest routes for SSR app manifest instead of page components to enable injected routes with SSR * Small refactoring Co-authored-by: Emanuele Stoppa --------- Co-authored-by: Emanuele Stoppa --- .changeset/friendly-garlics-chew.md | 5 ++++ .../src/core/build/plugins/plugin-ssr.ts | 28 +++++++------------ packages/astro/test/ssr-dynamic.test.js | 18 ++++++++++++ 3 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 .changeset/friendly-garlics-chew.md diff --git a/.changeset/friendly-garlics-chew.md b/.changeset/friendly-garlics-chew.md new file mode 100644 index 0000000000..cf45ecd77f --- /dev/null +++ b/.changeset/friendly-garlics-chew.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix routes created by `injectRoute` for SSR diff --git a/packages/astro/src/core/build/plugins/plugin-ssr.ts b/packages/astro/src/core/build/plugins/plugin-ssr.ts index ca186a727d..d28ba2db0b 100644 --- a/packages/astro/src/core/build/plugins/plugin-ssr.ts +++ b/packages/astro/src/core/build/plugins/plugin-ssr.ts @@ -151,34 +151,26 @@ function buildManifest( } }; - for (const pageData of eachPageData(internals)) { - if (!pageData.route.prerender) continue; - if (!pageData.route.pathname) continue; + for (const route of opts.manifest.routes) { + if (!route.prerender) continue; + if (!route.pathname) continue; - const outFolder = getOutFolder( - opts.settings.config, - pageData.route.pathname!, - pageData.route.type - ); - const outFile = getOutFile( - opts.settings.config, - outFolder, - pageData.route.pathname!, - pageData.route.type - ); + const outFolder = getOutFolder(opts.settings.config, route.pathname!, route.type); + const outFile = getOutFile(opts.settings.config, outFolder, route.pathname!, route.type); const file = outFile.toString().replace(opts.settings.config.build.client.toString(), ''); routes.push({ file, links: [], scripts: [], styles: [], - routeData: serializeRouteData(pageData.route, settings.config.trailingSlash), + routeData: serializeRouteData(route, settings.config.trailingSlash), }); staticFiles.push(file); } - for (const pageData of eachPageData(internals)) { - if (pageData.route.prerender) continue; + for (const route of opts.manifest.routes) { + const pageData = internals.pagesByComponent.get(route.component); + if (route.prerender || !pageData) continue; const scripts: SerializedRouteInfo['scripts'] = []; if (pageData.hoistedScript) { const hoistedValue = pageData.hoistedScript.value; @@ -217,7 +209,7 @@ function buildManifest( .map(({ stage, content }) => ({ stage, children: content })), ], styles, - routeData: serializeRouteData(pageData.route, settings.config.trailingSlash), + routeData: serializeRouteData(route, settings.config.trailingSlash), }); } diff --git a/packages/astro/test/ssr-dynamic.test.js b/packages/astro/test/ssr-dynamic.test.js index a75ace7e3c..e4bb61b4a7 100644 --- a/packages/astro/test/ssr-dynamic.test.js +++ b/packages/astro/test/ssr-dynamic.test.js @@ -11,6 +11,19 @@ describe('Dynamic pages in SSR', () => { fixture = await loadFixture({ root: './fixtures/ssr-dynamic/', output: 'server', + integrations: [ + { + name: 'inject-routes', + hooks: { + 'astro:config:setup': ({ injectRoute }) => { + injectRoute({ + pattern: '/path-alias/[id]', + entryPoint: './src/pages/api/products/[id].js', + }); + }, + }, + }, + ], adapter: testAdapter(), }); await fixture.build(); @@ -55,6 +68,11 @@ describe('Dynamic pages in SSR', () => { expect(json.id).to.equal('33'); }); + it('Injected route work', async () => { + const json = await fetchJSON('/path-alias/33'); + expect(json.id).to.equal('33'); + }); + it('Public assets take priority', async () => { const favicon = await matchRoute('/favicon.ico'); expect(favicon).to.equal(undefined);