diff --git a/packages/astro/src/core/app/index.ts b/packages/astro/src/core/app/index.ts index 900efc6822..76958a549e 100644 --- a/packages/astro/src/core/app/index.ts +++ b/packages/astro/src/core/app/index.ts @@ -286,14 +286,17 @@ export class App { const errorRouteData = matchRoute('/' + status, this.#manifestData); const url = new URL(request.url); if (errorRouteData) { - if (errorRouteData.prerender){ - const maybeDotHtml = errorRouteData.route.endsWith(`/${status}`) ? '.html' : '' - const statusURL = new URL(`${this.#baseWithoutTrailingSlash}/${status}${maybeDotHtml}`, url); + if (errorRouteData.prerender) { + const maybeDotHtml = errorRouteData.route.endsWith(`/${status}`) ? '.html' : ''; + const statusURL = new URL( + `${this.#baseWithoutTrailingSlash}/${status}${maybeDotHtml}`, + url + ); const response = await fetch(statusURL.toString()); // response for /404.html and 500.html is 200, which is not meaningful // so we create an override - const override = { status } + const override = { status }; return this.#mergeResponses(response, originalResponse, override); } @@ -322,27 +325,28 @@ export class App { return response; } - #mergeResponses(newResponse: Response, oldResponse?: Response, override?: { status : 404 | 500 }) { + #mergeResponses(newResponse: Response, oldResponse?: Response, override?: { status: 404 | 500 }) { if (!oldResponse) { if (override !== undefined) { return new Response(newResponse.body, { status: override.status, statusText: newResponse.statusText, - headers: newResponse.headers - }) + headers: newResponse.headers, + }); } return newResponse; } - + const { statusText, headers } = oldResponse; // If the the new response did not have a meaningful status, an override may have been provided // If the original status was 200 (default), override it with the new status (probably 404 or 500) // Otherwise, the user set a specific status while rendering and we should respect that one - const status = - override?.status ? override.status : - oldResponse.status === 200 ? newResponse.status : - oldResponse.status + const status = override?.status + ? override.status + : oldResponse.status === 200 + ? newResponse.status + : oldResponse.status; return new Response(newResponse.body, { status, diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index ea5bcf7dde..fb16b433db 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -341,7 +341,7 @@ async function cleanStaticOutput(opts: StaticBuildOptions, internals: BuildInter // Replace exports (only prerendered pages) with a noop let value = 'const noop = () => {};'; for (const e of exports) { - if (e.n === 'default') value += `\n export default noop;` + if (e.n === 'default') value += `\n export default noop;`; else value += `\nexport const ${e.n} = noop;`; } await fs.promises.writeFile(url, value, { encoding: 'utf8' }); diff --git a/packages/integrations/node/test/prerender-404-500.test.js b/packages/integrations/node/test/prerender-404-500.test.js index 33cebab5ba..4e3edff1ac 100644 --- a/packages/integrations/node/test/prerender-404-500.test.js +++ b/packages/integrations/node/test/prerender-404-500.test.js @@ -61,18 +61,18 @@ describe('Prerender 404', () => { const res1 = await fetch(url); const res2 = await fetch(url); const res3 = await fetch(url); - + expect(res1.status).to.equal(404); expect(res2.status).to.equal(404); expect(res3.status).to.equal(404); - + const html1 = await res1.text(); const html2 = await res2.text(); const html3 = await res3.text(); expect(html1).to.equal(html2); expect(html2).to.equal(html3); - + const $ = cheerio.load(html1); expect($('body').text()).to.equal('Page does not exist'); @@ -90,7 +90,7 @@ describe('Prerender 404', () => { const html2 = await response2.text(); const html3 = await response3.text(); - expect(html1).to.contain("Something went wrong"); + expect(html1).to.contain('Something went wrong'); expect(html1).to.equal(html2); expect(html2).to.equal(html3); @@ -100,11 +100,10 @@ describe('Prerender 404', () => { const response = await fetch(`http://${server.host}:${server.port}/some-base/fivehundred`); const html = await response.text(); const $ = cheerio.load(html); - + // length will be 0 if the stylesheet does not get included expect($('link[rel=stylesheet]')).to.have.a.lengthOf(1); }); - }); describe('Without base', async () => { @@ -143,22 +142,22 @@ describe('Prerender 404', () => { }); it('Can handle prerendered 404', async () => { - const url = `http://${server.host}:${server.port}/some-base/missing` + const url = `http://${server.host}:${server.port}/some-base/missing`; const res1 = await fetch(url); const res2 = await fetch(url); const res3 = await fetch(url); - + expect(res1.status).to.equal(404); expect(res2.status).to.equal(404); expect(res3.status).to.equal(404); - + const html1 = await res1.text(); const html2 = await res2.text(); const html3 = await res3.text(); expect(html1).to.equal(html2); expect(html2).to.equal(html3); - + const $ = cheerio.load(html1); expect($('body').text()).to.equal('Page does not exist'); @@ -207,22 +206,22 @@ describe('Hybrid 404', () => { }); it('Can handle prerendered 404', async () => { - const url = `http://${server.host}:${server.port}/some-base/missing` + const url = `http://${server.host}:${server.port}/some-base/missing`; const res1 = await fetch(url); const res2 = await fetch(url); const res3 = await fetch(url); - + expect(res1.status).to.equal(404); expect(res2.status).to.equal(404); expect(res3.status).to.equal(404); - + const html1 = await res1.text(); const html2 = await res2.text(); const html3 = await res3.text(); expect(html1).to.equal(html2); expect(html2).to.equal(html3); - + const $ = cheerio.load(html1); expect($('body').text()).to.equal('Page does not exist'); @@ -264,22 +263,22 @@ describe('Hybrid 404', () => { }); it('Can handle prerendered 404', async () => { - const url = `http://${server.host}:${server.port}/missing` + const url = `http://${server.host}:${server.port}/missing`; const res1 = await fetch(url); const res2 = await fetch(url); const res3 = await fetch(url); - + expect(res1.status).to.equal(404); expect(res2.status).to.equal(404); expect(res3.status).to.equal(404); - + const html1 = await res1.text(); const html2 = await res2.text(); const html3 = await res3.text(); expect(html1).to.equal(html2); expect(html2).to.equal(html3); - + const $ = cheerio.load(html1); expect($('body').text()).to.equal('Page does not exist');