summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Arsh <69170106+lilnasy@users.noreply.github.com> 2024-01-10 14:52:29 +0000
committerGravatar GitHub <noreply@github.com> 2024-01-10 14:52:29 +0000
commit9bd43625f85ae17731e51628e593b9f54007af80 (patch)
tree0fc0d02a4ce18a46db84b960b8061fa1e91b6824
parent26bfa78a65bc733cf37c696fef197f8037f8a835 (diff)
downloadastro-9bd43625f85ae17731e51628e593b9f54007af80.tar.gz
astro-9bd43625f85ae17731e51628e593b9f54007af80.tar.zst
astro-9bd43625f85ae17731e51628e593b9f54007af80.zip
fix(vercel): fallback to static 404.html (#9648)
-rw-r--r--packages/integrations/vercel/src/serverless/adapter.ts15
-rw-r--r--packages/integrations/vercel/test/fixtures/prerendered-error-pages/astro.config.mjs7
-rw-r--r--packages/integrations/vercel/test/fixtures/prerendered-error-pages/package.json9
-rw-r--r--packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/404.astro4
-rw-r--r--packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/one.astro8
-rw-r--r--packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/two.astro8
-rw-r--r--packages/integrations/vercel/test/prerendered-error-pages.test.js23
-rw-r--r--packages/integrations/vercel/test/static.test.js2
8 files changed, 73 insertions, 3 deletions
diff --git a/packages/integrations/vercel/src/serverless/adapter.ts b/packages/integrations/vercel/src/serverless/adapter.ts
index dd07e723b..db7f42805 100644
--- a/packages/integrations/vercel/src/serverless/adapter.ts
+++ b/packages/integrations/vercel/src/serverless/adapter.ts
@@ -287,9 +287,15 @@ You can set functionPerRoute: false to prevent surpassing the limit.`
excludeFiles,
maxDuration,
});
- routeDefinitions.push({ src: '/.*', dest: 'render' });
+ for (const route of routes) {
+ if (route.prerender) continue
+ routeDefinitions.push({
+ src: route.pattern.source,
+ dest: 'render',
+ })
+ }
}
-
+ const fourOhFourRoute = routes.find((route) => route.pathname === '/404');
// Output configuration
// https://vercel.com/docs/build-output-api/v3#build-output-configuration
await writeJson(new URL(`./config.json`, _config.outDir), {
@@ -303,6 +309,11 @@ You can set functionPerRoute: false to prevent surpassing the limit.`
},
{ handle: 'filesystem' },
...routeDefinitions,
+ ...fourOhFourRoute ? [{
+ src: '/.*',
+ dest: fourOhFourRoute.prerender ? '/404.html' : 'render',
+ status: 404,
+ }] : [],
],
...(imageService || imagesConfig
? {
diff --git a/packages/integrations/vercel/test/fixtures/prerendered-error-pages/astro.config.mjs b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/astro.config.mjs
new file mode 100644
index 000000000..b3f5bd362
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/astro.config.mjs
@@ -0,0 +1,7 @@
+import { defineConfig } from 'astro/config';
+import vercel from '@astrojs/vercel/serverless';
+
+export default defineConfig({
+ output: 'server',
+ adapter: vercel()
+});
diff --git a/packages/integrations/vercel/test/fixtures/prerendered-error-pages/package.json b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/package.json
new file mode 100644
index 000000000..5cfc0e24c
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-prerendered-error-pages",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/404.astro b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/404.astro
new file mode 100644
index 000000000..162ff90b6
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/404.astro
@@ -0,0 +1,4 @@
+---
+export const prerender = true
+---
+<h1>404</h1>
diff --git a/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/one.astro
new file mode 100644
index 000000000..0c7fb90a7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/one.astro
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <title>One</title>
+ </head>
+ <body>
+ <h1>One</h1>
+ </body>
+</html>
diff --git a/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/two.astro
new file mode 100644
index 000000000..e7ba9910e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/two.astro
@@ -0,0 +1,8 @@
+<html>
+ <head>
+ <title>Two</title>
+ </head>
+ <body>
+ <h1>Two</h1>
+ </body>
+</html>
diff --git a/packages/integrations/vercel/test/prerendered-error-pages.test.js b/packages/integrations/vercel/test/prerendered-error-pages.test.js
new file mode 100644
index 000000000..908566223
--- /dev/null
+++ b/packages/integrations/vercel/test/prerendered-error-pages.test.js
@@ -0,0 +1,23 @@
+import { loadFixture } from './test-utils.js';
+import { expect } from 'chai';
+
+describe('prerendered error pages routing', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/prerendered-error-pages/',
+ });
+ await fixture.build();
+ });
+
+ it('falls back to 404.html', async () => {
+ const deploymentConfig = JSON.parse(await fixture.readFile('../.vercel/output/config.json'));
+ expect(deploymentConfig.routes.at(-1)).to.deep.include({
+ src: '/.*',
+ dest: '/404.html',
+ status: 404,
+ });
+ });
+});
diff --git a/packages/integrations/vercel/test/static.test.js b/packages/integrations/vercel/test/static.test.js
index fc97e46ad..a3d0ea738 100644
--- a/packages/integrations/vercel/test/static.test.js
+++ b/packages/integrations/vercel/test/static.test.js
@@ -1,7 +1,7 @@
import { loadFixture } from './test-utils.js';
import { expect } from 'chai';
-describe('maxDuration', () => {
+describe('static routing', () => {
/** @type {import('./test-utils.js').Fixture} */
let fixture;