From e586d7d704d475afe3373a1de6ae20d504f79d6d Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 5 Jun 2025 14:25:23 +0000
Subject: Sync from a8e1c0a7402940e0fc5beef669522b315052df1b
---
.../vercel/test/edge-middleware.test.js | 74 +++++++++++++++++
.../vercel/test/fixtures/basic/astro.config.mjs | 6 ++
.../vercel/test/fixtures/basic/package.json | 9 +++
.../vercel/test/fixtures/basic/src/pages/one.astro | 8 ++
.../vercel/test/fixtures/basic/src/pages/two.astro | 8 ++
.../vercel/test/fixtures/image/astro.config.mjs | 22 +++++
.../vercel/test/fixtures/image/package.json | 12 +++
.../test/fixtures/image/src/assets/astro.jpeg | Bin 0 -> 3663 bytes
.../test/fixtures/image/src/assets/penguin.jpg | Bin 0 -> 258734 bytes
.../test/fixtures/image/src/assets/penguin.svg | 1 +
.../test/fixtures/image/src/pages/index.astro | 18 +++++
.../fixtures/integration-assets/astro.config.mjs | 10 +++
.../test/fixtures/integration-assets/package.json | 10 +++
.../integration-assets/src/pages/one.astro | 8 ++
.../integration-assets/src/pages/two.astro | 8 ++
.../vercel/test/fixtures/isr/astro.config.mjs | 13 +++
.../vercel/test/fixtures/isr/package.json | 9 +++
.../test/fixtures/isr/src/pages/api/[dynamic].ts | 3 +
.../test/fixtures/isr/src/pages/api/index.ts | 3 +
.../isr/src/pages/excluded/[...rest].astro | 8 ++
.../isr/src/pages/excluded/[dynamic].astro | 8 ++
.../vercel/test/fixtures/isr/src/pages/one.astro | 8 ++
.../vercel/test/fixtures/isr/src/pages/two.astro | 8 ++
.../test/fixtures/max-duration/astro.config.mjs | 9 +++
.../vercel/test/fixtures/max-duration/package.json | 9 +++
.../test/fixtures/max-duration/src/pages/one.astro | 8 ++
.../test/fixtures/max-duration/src/pages/two.astro | 8 ++
.../middleware-with-edge-file/astro.config.mjs | 9 +++
.../middleware-with-edge-file/package.json | 9 +++
.../middleware-with-edge-file/src/middleware.js | 14 ++++
.../src/pages/index.astro | 0
.../src/vercel-edge-middleware.js | 5 ++
.../middleware-without-edge-file/astro.config.mjs | 9 +++
.../middleware-without-edge-file/package.json | 9 +++
.../middleware-without-edge-file/src/middleware.js | 8 ++
.../src/pages/index.astro | 0
.../test/fixtures/no-output/astro.config.mjs | 6 ++
.../vercel/test/fixtures/no-output/package.json | 9 +++
.../test/fixtures/no-output/src/pages/index.astro | 8 ++
.../prerendered-error-pages/astro.config.mjs | 7 ++
.../fixtures/prerendered-error-pages/package.json | 9 +++
.../prerendered-error-pages/src/pages/404.astro | 4 +
.../prerendered-error-pages/src/pages/one.astro | 8 ++
.../prerendered-error-pages/src/pages/two.astro | 8 ++
.../fixtures/redirects-serverless/astro.config.mjs | 7 ++
.../fixtures/redirects-serverless/package.json | 9 +++
.../redirects-serverless/src/pages/index.astro | 8 ++
.../redirects-serverless/src/pages/subpage.astro | 0
.../test/fixtures/redirects/astro.config.mjs | 6 ++
.../vercel/test/fixtures/redirects/package.json | 9 +++
.../test/fixtures/redirects/src/pages/index.astro | 8 ++
.../fixtures/redirects/src/pages/subpage.astro | 0
.../src/pages/team/articles/[...slug].astro | 25 ++++++
.../test/fixtures/server-islands/astro.config.mjs | 7 ++
.../test/fixtures/server-islands/package.json | 9 +++
.../server-islands/src/components/Island.astro | 1 +
.../fixtures/server-islands/src/pages/index.astro | 12 +++
.../fixtures/serverless-prerender/astro.config.mjs | 10 +++
.../test/fixtures/serverless-prerender/included.js | 1 +
.../fixtures/serverless-prerender/package.json | 9 +++
.../serverless-prerender/src/pages/index.astro | 12 +++
.../astro.config.mjs | 10 +++
.../serverless-with-dynamic-routes/included.js | 1 +
.../serverless-with-dynamic-routes/package.json | 9 +++
.../src/pages/[id]/index.astro | 12 +++
.../src/pages/api/[id].js | 7 ++
.../src/pages/index.astro | 12 +++
.../test/fixtures/static-assets/astro.config.mjs | 4 +
.../test/fixtures/static-assets/package.json | 9 +++
.../fixtures/static-assets/src/pages/index.astro | 8 ++
.../vercel/test/fixtures/static/astro.config.mjs | 6 ++
.../vercel/test/fixtures/static/package.json | 9 +++
.../test/fixtures/static/src/pages/404.astro | 8 ++
.../test/fixtures/static/src/pages/one.astro | 8 ++
.../test/fixtures/static/src/pages/two.astro | 8 ++
.../test/fixtures/streaming/astro.config.mjs | 7 ++
.../vercel/test/fixtures/streaming/package.json | 9 +++
.../test/fixtures/streaming/src/pages/one.astro | 8 ++
.../test/fixtures/streaming/src/pages/two.astro | 8 ++
.../output-as-static/astro.config.mjs | 10 +++
.../output-as-static/package.json | 9 +++
.../output-as-static/src/pages/one.astro | 8 ++
.../output-as-static/src/pages/two.astro | 8 ++
packages/integrations/vercel/test/hosted/README.md | 3 +
.../hosted/hosted-astro-project/astro.config.mjs | 8 ++
.../test/hosted/hosted-astro-project/package.json | 12 +++
.../hosted-astro-project/src/assets/penguin.png | Bin 0 -> 7295878 bytes
.../hosted-astro-project/src/pages/index.astro | 6 ++
.../integrations/vercel/test/hosted/hosted.test.js | 14 ++++
packages/integrations/vercel/test/image.test.js | 89 +++++++++++++++++++++
.../vercel/test/integration-assets.test.js | 24 ++++++
packages/integrations/vercel/test/isr.test.js | 66 +++++++++++++++
.../integrations/vercel/test/max-duration.test.js | 22 +++++
.../vercel/test/prerendered-error-pages.test.js | 27 +++++++
.../vercel/test/redirects-serverless.test.js | 29 +++++++
.../integrations/vercel/test/redirects.test.js | 88 ++++++++++++++++++++
.../vercel/test/server-islands.test.js | 27 +++++++
.../vercel/test/serverless-prerender.test.js | 59 ++++++++++++++
.../test/serverless-with-dynamic-routes.test.js | 22 +++++
.../integrations/vercel/test/static-assets.test.js | 72 +++++++++++++++++
packages/integrations/vercel/test/static.test.js | 25 ++++++
.../integrations/vercel/test/streaming.test.js | 22 +++++
.../integrations/vercel/test/test-image-service.js | 32 ++++++++
packages/integrations/vercel/test/test-utils.js | 8 ++
.../integrations/vercel/test/web-analytics.test.js | 26 ++++++
105 files changed, 1402 insertions(+)
create mode 100644 packages/integrations/vercel/test/edge-middleware.test.js
create mode 100644 packages/integrations/vercel/test/fixtures/basic/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/basic/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/basic/src/pages/one.astro
create mode 100644 packages/integrations/vercel/test/fixtures/basic/src/pages/two.astro
create mode 100644 packages/integrations/vercel/test/fixtures/image/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/image/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/image/src/assets/astro.jpeg
create mode 100644 packages/integrations/vercel/test/fixtures/image/src/assets/penguin.jpg
create mode 100644 packages/integrations/vercel/test/fixtures/image/src/assets/penguin.svg
create mode 100644 packages/integrations/vercel/test/fixtures/image/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/integration-assets/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/integration-assets/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/integration-assets/src/pages/one.astro
create mode 100644 packages/integrations/vercel/test/fixtures/integration-assets/src/pages/two.astro
create mode 100644 packages/integrations/vercel/test/fixtures/isr/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/isr/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/isr/src/pages/api/[dynamic].ts
create mode 100644 packages/integrations/vercel/test/fixtures/isr/src/pages/api/index.ts
create mode 100644 packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[...rest].astro
create mode 100644 packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[dynamic].astro
create mode 100644 packages/integrations/vercel/test/fixtures/isr/src/pages/one.astro
create mode 100644 packages/integrations/vercel/test/fixtures/isr/src/pages/two.astro
create mode 100644 packages/integrations/vercel/test/fixtures/max-duration/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/max-duration/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/max-duration/src/pages/one.astro
create mode 100644 packages/integrations/vercel/test/fixtures/max-duration/src/pages/two.astro
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-with-edge-file/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-with-edge-file/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/middleware.js
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/vercel-edge-middleware.js
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-without-edge-file/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-without-edge-file/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-without-edge-file/src/middleware.js
create mode 100644 packages/integrations/vercel/test/fixtures/middleware-without-edge-file/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/no-output/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/no-output/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/no-output/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/prerendered-error-pages/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/prerendered-error-pages/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/404.astro
create mode 100644 packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/one.astro
create mode 100644 packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/two.astro
create mode 100644 packages/integrations/vercel/test/fixtures/redirects-serverless/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/redirects-serverless/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/redirects-serverless/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/redirects-serverless/src/pages/subpage.astro
create mode 100644 packages/integrations/vercel/test/fixtures/redirects/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/redirects/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/redirects/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/redirects/src/pages/subpage.astro
create mode 100644 packages/integrations/vercel/test/fixtures/redirects/src/pages/team/articles/[...slug].astro
create mode 100644 packages/integrations/vercel/test/fixtures/server-islands/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/server-islands/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/server-islands/src/components/Island.astro
create mode 100644 packages/integrations/vercel/test/fixtures/server-islands/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-prerender/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-prerender/included.js
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-prerender/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-prerender/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/included.js
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/[id]/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/api/[id].js
create mode 100644 packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/static-assets/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/static-assets/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/static-assets/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/fixtures/static/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/static/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/static/src/pages/404.astro
create mode 100644 packages/integrations/vercel/test/fixtures/static/src/pages/one.astro
create mode 100644 packages/integrations/vercel/test/fixtures/static/src/pages/two.astro
create mode 100644 packages/integrations/vercel/test/fixtures/streaming/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/streaming/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/streaming/src/pages/one.astro
create mode 100644 packages/integrations/vercel/test/fixtures/streaming/src/pages/two.astro
create mode 100644 packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/package.json
create mode 100644 packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/src/pages/one.astro
create mode 100644 packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/src/pages/two.astro
create mode 100644 packages/integrations/vercel/test/hosted/README.md
create mode 100644 packages/integrations/vercel/test/hosted/hosted-astro-project/astro.config.mjs
create mode 100644 packages/integrations/vercel/test/hosted/hosted-astro-project/package.json
create mode 100644 packages/integrations/vercel/test/hosted/hosted-astro-project/src/assets/penguin.png
create mode 100644 packages/integrations/vercel/test/hosted/hosted-astro-project/src/pages/index.astro
create mode 100644 packages/integrations/vercel/test/hosted/hosted.test.js
create mode 100644 packages/integrations/vercel/test/image.test.js
create mode 100644 packages/integrations/vercel/test/integration-assets.test.js
create mode 100644 packages/integrations/vercel/test/isr.test.js
create mode 100644 packages/integrations/vercel/test/max-duration.test.js
create mode 100644 packages/integrations/vercel/test/prerendered-error-pages.test.js
create mode 100644 packages/integrations/vercel/test/redirects-serverless.test.js
create mode 100644 packages/integrations/vercel/test/redirects.test.js
create mode 100644 packages/integrations/vercel/test/server-islands.test.js
create mode 100644 packages/integrations/vercel/test/serverless-prerender.test.js
create mode 100644 packages/integrations/vercel/test/serverless-with-dynamic-routes.test.js
create mode 100644 packages/integrations/vercel/test/static-assets.test.js
create mode 100644 packages/integrations/vercel/test/static.test.js
create mode 100644 packages/integrations/vercel/test/streaming.test.js
create mode 100644 packages/integrations/vercel/test/test-image-service.js
create mode 100644 packages/integrations/vercel/test/test-utils.js
create mode 100644 packages/integrations/vercel/test/web-analytics.test.js
(limited to 'packages/integrations/vercel/test')
diff --git a/packages/integrations/vercel/test/edge-middleware.test.js b/packages/integrations/vercel/test/edge-middleware.test.js
new file mode 100644
index 000000000..d6313d483
--- /dev/null
+++ b/packages/integrations/vercel/test/edge-middleware.test.js
@@ -0,0 +1,74 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Vercel edge middleware', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let build;
+ before(async () => {
+ build = await loadFixture({
+ root: './fixtures/middleware-with-edge-file/',
+ });
+ await build.build();
+ });
+
+ it('an edge function is created', async () => {
+ const contents = await build.readFile(
+ '../.vercel/output/functions/_middleware.func/.vc-config.json',
+ );
+ const contentsJSON = JSON.parse(contents);
+ assert.equal(contentsJSON.runtime, 'edge');
+ assert.equal(contentsJSON.entrypoint, 'middleware.mjs');
+ });
+
+ it('deployment config points to the middleware edge function', async () => {
+ const contents = await build.readFile('../.vercel/output/config.json');
+ const { routes } = JSON.parse(contents);
+ assert.equal(
+ routes.some((route) => route.dest === '_middleware'),
+ true,
+ );
+ });
+
+ it('edge sets Set-Cookie headers', async () => {
+ const entry = new URL(
+ '../.vercel/output/functions/_middleware.func/middleware.mjs',
+ build.config.outDir,
+ );
+ const module = await import(entry);
+ const request = new Request('http://example.com/foo');
+ const response = await module.default(request, {});
+ assert.equal(response.headers.get('set-cookie'), 'foo=bar');
+ assert.ok((await response.text()).length, 'Body is included');
+ });
+
+ // TODO: The path here seems to be inconsistent?
+ it.skip('with edge handle file, should successfully build the middleware', async () => {
+ const fixture = await loadFixture({
+ root: './fixtures/middleware-with-edge-file/',
+ });
+ await fixture.build();
+ const _contents = await fixture.readFile(
+ // this is abysmal...
+ '../.vercel/output/functions/render.func/www/withastro/astro/packages/vercel/test/fixtures/middleware-with-edge-file/dist/middleware.mjs',
+ );
+ // assert.equal(contents.includes('title:')).to.be.true;
+ // chaiJestSnapshot.setTestName('Middleware with handler file');
+ // assert.equal(contents).to.matchSnapshot(true);
+ });
+
+ // TODO: The path here seems to be inconsistent?
+ it.skip('without edge handle file, should successfully build the middleware', async () => {
+ const fixture = await loadFixture({
+ root: './fixtures/middleware-without-edge-file/',
+ });
+ await fixture.build();
+ const _contents = await fixture.readFile(
+ // this is abysmal...
+ '../.vercel/output/functions/render.func/www/withastro/astro/packages/vercel/test/fixtures/middleware-without-edge-file/dist/middleware.mjs',
+ );
+ // assert.equal(contents.includes('title:')).to.be.false;
+ // chaiJestSnapshot.setTestName('Middleware without handler file');
+ // assert.equal(contents).to.matchSnapshot(true);
+ });
+});
diff --git a/packages/integrations/vercel/test/fixtures/basic/astro.config.mjs b/packages/integrations/vercel/test/fixtures/basic/astro.config.mjs
new file mode 100644
index 000000000..b31352db4
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/basic/astro.config.mjs
@@ -0,0 +1,6 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: vercel({})
+});
diff --git a/packages/integrations/vercel/test/fixtures/basic/package.json b/packages/integrations/vercel/test/fixtures/basic/package.json
new file mode 100644
index 000000000..89fb910ff
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/basic/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-basic",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/basic/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/basic/src/pages/one.astro
new file mode 100644
index 000000000..0c7fb90a7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/basic/src/pages/one.astro
@@ -0,0 +1,8 @@
+
+
+ One
+
+
+ One
+
+
diff --git a/packages/integrations/vercel/test/fixtures/basic/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/basic/src/pages/two.astro
new file mode 100644
index 000000000..e7ba9910e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/basic/src/pages/two.astro
@@ -0,0 +1,8 @@
+
+
+ Two
+
+
+ Two
+
+
diff --git a/packages/integrations/vercel/test/fixtures/image/astro.config.mjs b/packages/integrations/vercel/test/fixtures/image/astro.config.mjs
new file mode 100644
index 000000000..5c4aa7709
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/image/astro.config.mjs
@@ -0,0 +1,22 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+import { testImageService } from '../../test-image-service.js';
+
+export default defineConfig({
+ adapter: vercel({
+ imageService: true,
+ }),
+ experimental: {
+ responsiveImages: true,
+ },
+ image: {
+ service: testImageService(),
+ domains: ['astro.build'],
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: '**.amazonaws.com',
+ },
+ ],
+ },
+});
diff --git a/packages/integrations/vercel/test/fixtures/image/package.json b/packages/integrations/vercel/test/fixtures/image/package.json
new file mode 100644
index 000000000..87fefe2e0
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/image/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "@test/astro-vercel-image",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "astro dev"
+ },
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/image/src/assets/astro.jpeg b/packages/integrations/vercel/test/fixtures/image/src/assets/astro.jpeg
new file mode 100644
index 000000000..40d35ef48
Binary files /dev/null and b/packages/integrations/vercel/test/fixtures/image/src/assets/astro.jpeg differ
diff --git a/packages/integrations/vercel/test/fixtures/image/src/assets/penguin.jpg b/packages/integrations/vercel/test/fixtures/image/src/assets/penguin.jpg
new file mode 100644
index 000000000..73f0ee316
Binary files /dev/null and b/packages/integrations/vercel/test/fixtures/image/src/assets/penguin.jpg differ
diff --git a/packages/integrations/vercel/test/fixtures/image/src/assets/penguin.svg b/packages/integrations/vercel/test/fixtures/image/src/assets/penguin.svg
new file mode 100644
index 000000000..d93379b68
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/image/src/assets/penguin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/integrations/vercel/test/fixtures/image/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/image/src/pages/index.astro
new file mode 100644
index 000000000..ec329b51b
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/image/src/pages/index.astro
@@ -0,0 +1,18 @@
+---
+import { Image } from "astro:assets";
+import astro from "../assets/astro.jpeg";
+import penguin from "../assets/penguin.svg";
+import bigPenguin from "../assets/penguin.jpg";
+---
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/integrations/vercel/test/fixtures/integration-assets/astro.config.mjs b/packages/integrations/vercel/test/fixtures/integration-assets/astro.config.mjs
new file mode 100644
index 000000000..e49ca112f
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/integration-assets/astro.config.mjs
@@ -0,0 +1,10 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+import sitemap from '@astrojs/sitemap';
+
+export default defineConfig({
+ site: 'https://example.com',
+ adapter: vercel({}),
+ integrations: [sitemap()]
+});
\ No newline at end of file
diff --git a/packages/integrations/vercel/test/fixtures/integration-assets/package.json b/packages/integrations/vercel/test/fixtures/integration-assets/package.json
new file mode 100644
index 000000000..3bee8ef6d
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/integration-assets/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "@test/astro-vercel-integration-assets",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/sitemap": "^3.3.1",
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/integration-assets/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/integration-assets/src/pages/one.astro
new file mode 100644
index 000000000..0c7fb90a7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/integration-assets/src/pages/one.astro
@@ -0,0 +1,8 @@
+
+
+ One
+
+
+ One
+
+
diff --git a/packages/integrations/vercel/test/fixtures/integration-assets/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/integration-assets/src/pages/two.astro
new file mode 100644
index 000000000..e7ba9910e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/integration-assets/src/pages/two.astro
@@ -0,0 +1,8 @@
+
+
+ Two
+
+
+ Two
+
+
diff --git a/packages/integrations/vercel/test/fixtures/isr/astro.config.mjs b/packages/integrations/vercel/test/fixtures/isr/astro.config.mjs
new file mode 100644
index 000000000..3bc1a44b5
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/isr/astro.config.mjs
@@ -0,0 +1,13 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ output: "server",
+ adapter: vercel({
+ isr: {
+ bypassToken: "1c9e601d-9943-4e7c-9575-005556d774a8",
+ expiration: 120,
+ exclude: ["/two", "/excluded/[dynamic]", "/excluded/[...rest]", /^\/api/]
+ }
+ })
+});
diff --git a/packages/integrations/vercel/test/fixtures/isr/package.json b/packages/integrations/vercel/test/fixtures/isr/package.json
new file mode 100644
index 000000000..a1fd601d3
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/isr/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/vercel-isr",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/isr/src/pages/api/[dynamic].ts b/packages/integrations/vercel/test/fixtures/isr/src/pages/api/[dynamic].ts
new file mode 100644
index 000000000..ecbac57c9
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/isr/src/pages/api/[dynamic].ts
@@ -0,0 +1,3 @@
+export async function GET({ params }) {
+ return new Response(`OK ${params.dynamic}`)
+}
diff --git a/packages/integrations/vercel/test/fixtures/isr/src/pages/api/index.ts b/packages/integrations/vercel/test/fixtures/isr/src/pages/api/index.ts
new file mode 100644
index 000000000..fd3425452
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/isr/src/pages/api/index.ts
@@ -0,0 +1,3 @@
+export async function GET() {
+ return new Response("OK")
+}
diff --git a/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[...rest].astro b/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[...rest].astro
new file mode 100644
index 000000000..caf4f5416
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[...rest].astro
@@ -0,0 +1,8 @@
+
+
+ Rest
+
+
+ Rest
+
+
diff --git a/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[dynamic].astro b/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[dynamic].astro
new file mode 100644
index 000000000..54ba67fa8
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/isr/src/pages/excluded/[dynamic].astro
@@ -0,0 +1,8 @@
+
+
+ Dynamic
+
+
+ Dynamic
+
+
diff --git a/packages/integrations/vercel/test/fixtures/isr/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/isr/src/pages/one.astro
new file mode 100644
index 000000000..0c7fb90a7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/isr/src/pages/one.astro
@@ -0,0 +1,8 @@
+
+
+ One
+
+
+ One
+
+
diff --git a/packages/integrations/vercel/test/fixtures/isr/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/isr/src/pages/two.astro
new file mode 100644
index 000000000..e7ba9910e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/isr/src/pages/two.astro
@@ -0,0 +1,8 @@
+
+
+ Two
+
+
+ Two
+
+
diff --git a/packages/integrations/vercel/test/fixtures/max-duration/astro.config.mjs b/packages/integrations/vercel/test/fixtures/max-duration/astro.config.mjs
new file mode 100644
index 000000000..109c261d9
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/max-duration/astro.config.mjs
@@ -0,0 +1,9 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ output: "server",
+ adapter: vercel({
+ maxDuration: 60
+ })
+});
diff --git a/packages/integrations/vercel/test/fixtures/max-duration/package.json b/packages/integrations/vercel/test/fixtures/max-duration/package.json
new file mode 100644
index 000000000..142cd608a
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/max-duration/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/vercel-max-duration",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/max-duration/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/max-duration/src/pages/one.astro
new file mode 100644
index 000000000..0c7fb90a7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/max-duration/src/pages/one.astro
@@ -0,0 +1,8 @@
+
+
+ One
+
+
+ One
+
+
diff --git a/packages/integrations/vercel/test/fixtures/max-duration/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/max-duration/src/pages/two.astro
new file mode 100644
index 000000000..e7ba9910e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/max-duration/src/pages/two.astro
@@ -0,0 +1,8 @@
+
+
+ Two
+
+
+ Two
+
+
diff --git a/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/astro.config.mjs b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/astro.config.mjs
new file mode 100644
index 000000000..0f09ab040
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/astro.config.mjs
@@ -0,0 +1,9 @@
+import vercel from "@astrojs/vercel";
+import {defineConfig} from "astro/config";
+
+export default defineConfig({
+ adapter: vercel({
+ edgeMiddleware: true
+ }),
+ output: 'server'
+});
diff --git a/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/package.json b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/package.json
new file mode 100644
index 000000000..2579a8c92
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/vercel-edge-middleware-with-edge-file",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/middleware.js b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/middleware.js
new file mode 100644
index 000000000..cf085321c
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/middleware.js
@@ -0,0 +1,14 @@
+export const hello = async () => 'hello world';
+
+const message = await hello();
+
+/**
+ * @type {import("astro").MiddlewareResponseHandler}
+ */
+export const onRequest = async (context, next) => {
+ const test = 'something';
+ context.cookies.set('foo', 'bar');
+ const response = await next();
+ response.headers.set('x-message', message);
+ return response;
+};
diff --git a/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/pages/index.astro
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/vercel-edge-middleware.js b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/vercel-edge-middleware.js
new file mode 100644
index 000000000..bf69edb3e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/vercel-edge-middleware.js
@@ -0,0 +1,5 @@
+export default function ({ request, context }) {
+ return {
+ title: 'Hello world',
+ };
+}
diff --git a/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/astro.config.mjs b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/astro.config.mjs
new file mode 100644
index 000000000..0f09ab040
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/astro.config.mjs
@@ -0,0 +1,9 @@
+import vercel from "@astrojs/vercel";
+import {defineConfig} from "astro/config";
+
+export default defineConfig({
+ adapter: vercel({
+ edgeMiddleware: true
+ }),
+ output: 'server'
+});
diff --git a/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/package.json b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/package.json
new file mode 100644
index 000000000..d5638ce16
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/vercel-edge-middleware-without-edge-file",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/src/middleware.js b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/src/middleware.js
new file mode 100644
index 000000000..349a0aa79
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/src/middleware.js
@@ -0,0 +1,8 @@
+/**
+ * @type {import("astro").MiddlewareResponseHandler}
+ */
+export const onRequest = async (context, next) => {
+ const test = 'something';
+ const response = await next();
+ return response;
+};
diff --git a/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/src/pages/index.astro
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/integrations/vercel/test/fixtures/no-output/astro.config.mjs b/packages/integrations/vercel/test/fixtures/no-output/astro.config.mjs
new file mode 100644
index 000000000..e9a1b74e3
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/no-output/astro.config.mjs
@@ -0,0 +1,6 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: vercel()
+});
diff --git a/packages/integrations/vercel/test/fixtures/no-output/package.json b/packages/integrations/vercel/test/fixtures/no-output/package.json
new file mode 100644
index 000000000..604b4e4ea
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/no-output/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-no-output",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/no-output/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/no-output/src/pages/index.astro
new file mode 100644
index 000000000..6368ce118
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/no-output/src/pages/index.astro
@@ -0,0 +1,8 @@
+
+
+ testing
+
+
+ testing
+
+
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..2f83b8b03
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/astro.config.mjs
@@ -0,0 +1,7 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+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
+---
+404
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 @@
+
+
+ One
+
+
+ One
+
+
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 @@
+
+
+ Two
+
+
+ Two
+
+
diff --git a/packages/integrations/vercel/test/fixtures/redirects-serverless/astro.config.mjs b/packages/integrations/vercel/test/fixtures/redirects-serverless/astro.config.mjs
new file mode 100644
index 000000000..b769a9820
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/redirects-serverless/astro.config.mjs
@@ -0,0 +1,7 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ output: 'static',
+ adapter: vercel(),
+});
diff --git a/packages/integrations/vercel/test/fixtures/redirects-serverless/package.json b/packages/integrations/vercel/test/fixtures/redirects-serverless/package.json
new file mode 100644
index 000000000..c8de30d66
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/redirects-serverless/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-redirects-serverless",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/redirects-serverless/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/redirects-serverless/src/pages/index.astro
new file mode 100644
index 000000000..9c077e2a3
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/redirects-serverless/src/pages/index.astro
@@ -0,0 +1,8 @@
+
+
+ Testing
+
+
+ Testing
+
+
diff --git a/packages/integrations/vercel/test/fixtures/redirects-serverless/src/pages/subpage.astro b/packages/integrations/vercel/test/fixtures/redirects-serverless/src/pages/subpage.astro
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/integrations/vercel/test/fixtures/redirects/astro.config.mjs b/packages/integrations/vercel/test/fixtures/redirects/astro.config.mjs
new file mode 100644
index 000000000..26121ce60
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/redirects/astro.config.mjs
@@ -0,0 +1,6 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: vercel(),
+});
diff --git a/packages/integrations/vercel/test/fixtures/redirects/package.json b/packages/integrations/vercel/test/fixtures/redirects/package.json
new file mode 100644
index 000000000..d7dcc5471
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/redirects/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-redirects",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/redirects/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/redirects/src/pages/index.astro
new file mode 100644
index 000000000..9c077e2a3
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/redirects/src/pages/index.astro
@@ -0,0 +1,8 @@
+
+
+ Testing
+
+
+ Testing
+
+
diff --git a/packages/integrations/vercel/test/fixtures/redirects/src/pages/subpage.astro b/packages/integrations/vercel/test/fixtures/redirects/src/pages/subpage.astro
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/integrations/vercel/test/fixtures/redirects/src/pages/team/articles/[...slug].astro b/packages/integrations/vercel/test/fixtures/redirects/src/pages/team/articles/[...slug].astro
new file mode 100644
index 000000000..716d3bd5d
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/redirects/src/pages/team/articles/[...slug].astro
@@ -0,0 +1,25 @@
+---
+export const getStaticPaths = (async () => {
+ const posts = [
+ { slug: 'one', data: {draft: false, title: 'One'} },
+ { slug: 'two', data: {draft: false, title: 'Two'} }
+ ];
+ return posts.map((post) => {
+ return {
+ params: { slug: post.slug },
+ props: { draft: post.data.draft, title: post.data.title },
+ };
+ });
+})
+
+const { slug } = Astro.params;
+const { title } = Astro.props;
+---
+
+
+ { title }
+
+
+ { title }
+
+
diff --git a/packages/integrations/vercel/test/fixtures/server-islands/astro.config.mjs b/packages/integrations/vercel/test/fixtures/server-islands/astro.config.mjs
new file mode 100644
index 000000000..9185b61bf
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/server-islands/astro.config.mjs
@@ -0,0 +1,7 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ output: "server",
+ adapter: vercel()
+});
diff --git a/packages/integrations/vercel/test/fixtures/server-islands/package.json b/packages/integrations/vercel/test/fixtures/server-islands/package.json
new file mode 100644
index 000000000..358d220e3
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/server-islands/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/vercel-server-islands",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/server-islands/src/components/Island.astro b/packages/integrations/vercel/test/fixtures/server-islands/src/components/Island.astro
new file mode 100644
index 000000000..9d2832bc1
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/server-islands/src/components/Island.astro
@@ -0,0 +1 @@
+I'm an island
diff --git a/packages/integrations/vercel/test/fixtures/server-islands/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/server-islands/src/pages/index.astro
new file mode 100644
index 000000000..835126c2b
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/server-islands/src/pages/index.astro
@@ -0,0 +1,12 @@
+---
+import Island from '../components/Island.astro';
+---
+
+
+ One
+
+
+ One
+
+
+
diff --git a/packages/integrations/vercel/test/fixtures/serverless-prerender/astro.config.mjs b/packages/integrations/vercel/test/fixtures/serverless-prerender/astro.config.mjs
new file mode 100644
index 000000000..2ff5cb4ff
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-prerender/astro.config.mjs
@@ -0,0 +1,10 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: vercel({
+ // Pass some value to make sure it doesn't error out
+ includeFiles: ['included.js'],
+ }),
+ output: 'server'
+});
diff --git a/packages/integrations/vercel/test/fixtures/serverless-prerender/included.js b/packages/integrations/vercel/test/fixtures/serverless-prerender/included.js
new file mode 100644
index 000000000..4e64b2d61
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-prerender/included.js
@@ -0,0 +1 @@
+'works'
\ No newline at end of file
diff --git a/packages/integrations/vercel/test/fixtures/serverless-prerender/package.json b/packages/integrations/vercel/test/fixtures/serverless-prerender/package.json
new file mode 100644
index 000000000..c51362516
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-prerender/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-serverless-prerender",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/serverless-prerender/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/serverless-prerender/src/pages/index.astro
new file mode 100644
index 000000000..2a976957b
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-prerender/src/pages/index.astro
@@ -0,0 +1,12 @@
+---
+export const prerender = true;
+---
+
+
+
+ testing
+
+
+ testing
+
+
diff --git a/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/astro.config.mjs b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/astro.config.mjs
new file mode 100644
index 000000000..2ff5cb4ff
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/astro.config.mjs
@@ -0,0 +1,10 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: vercel({
+ // Pass some value to make sure it doesn't error out
+ includeFiles: ['included.js'],
+ }),
+ output: 'server'
+});
diff --git a/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/included.js b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/included.js
new file mode 100644
index 000000000..4e64b2d61
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/included.js
@@ -0,0 +1 @@
+'works'
\ No newline at end of file
diff --git a/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/package.json b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/package.json
new file mode 100644
index 000000000..e22a7e932
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-serverless-with-dynamic-routes",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/[id]/index.astro b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/[id]/index.astro
new file mode 100644
index 000000000..4eab5952d
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/[id]/index.astro
@@ -0,0 +1,12 @@
+---
+export const prerender = false;
+---
+
+
+
+ testing {Astro.params.id}
+
+
+ testing {Astro.params.id}
+
+
diff --git a/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/api/[id].js b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/api/[id].js
new file mode 100644
index 000000000..f54e673a8
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/api/[id].js
@@ -0,0 +1,7 @@
+export const prerender = false;
+
+export async function GET({ params }) {
+ return Response.json({
+ id: params.id
+ });
+}
diff --git a/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/index.astro
new file mode 100644
index 000000000..2a976957b
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/index.astro
@@ -0,0 +1,12 @@
+---
+export const prerender = true;
+---
+
+
+
+ testing
+
+
+ testing
+
+
diff --git a/packages/integrations/vercel/test/fixtures/static-assets/astro.config.mjs b/packages/integrations/vercel/test/fixtures/static-assets/astro.config.mjs
new file mode 100644
index 000000000..20b0b8e2b
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/static-assets/astro.config.mjs
@@ -0,0 +1,4 @@
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+});
diff --git a/packages/integrations/vercel/test/fixtures/static-assets/package.json b/packages/integrations/vercel/test/fixtures/static-assets/package.json
new file mode 100644
index 000000000..e1b608a85
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/static-assets/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-static-assets",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/static-assets/src/pages/index.astro b/packages/integrations/vercel/test/fixtures/static-assets/src/pages/index.astro
new file mode 100644
index 000000000..9c077e2a3
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/static-assets/src/pages/index.astro
@@ -0,0 +1,8 @@
+
+
+ Testing
+
+
+ Testing
+
+
diff --git a/packages/integrations/vercel/test/fixtures/static/astro.config.mjs b/packages/integrations/vercel/test/fixtures/static/astro.config.mjs
new file mode 100644
index 000000000..e9a1b74e3
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/static/astro.config.mjs
@@ -0,0 +1,6 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: vercel()
+});
diff --git a/packages/integrations/vercel/test/fixtures/static/package.json b/packages/integrations/vercel/test/fixtures/static/package.json
new file mode 100644
index 000000000..2f2936e31
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/static/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-static",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/static/src/pages/404.astro b/packages/integrations/vercel/test/fixtures/static/src/pages/404.astro
new file mode 100644
index 000000000..9e307c5c2
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/static/src/pages/404.astro
@@ -0,0 +1,8 @@
+
+
+ 404
+
+
+ 404
+
+
diff --git a/packages/integrations/vercel/test/fixtures/static/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/static/src/pages/one.astro
new file mode 100644
index 000000000..0c7fb90a7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/static/src/pages/one.astro
@@ -0,0 +1,8 @@
+
+
+ One
+
+
+ One
+
+
diff --git a/packages/integrations/vercel/test/fixtures/static/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/static/src/pages/two.astro
new file mode 100644
index 000000000..e7ba9910e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/static/src/pages/two.astro
@@ -0,0 +1,8 @@
+
+
+ Two
+
+
+ Two
+
+
diff --git a/packages/integrations/vercel/test/fixtures/streaming/astro.config.mjs b/packages/integrations/vercel/test/fixtures/streaming/astro.config.mjs
new file mode 100644
index 000000000..9185b61bf
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/streaming/astro.config.mjs
@@ -0,0 +1,7 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ output: "server",
+ adapter: vercel()
+});
diff --git a/packages/integrations/vercel/test/fixtures/streaming/package.json b/packages/integrations/vercel/test/fixtures/streaming/package.json
new file mode 100644
index 000000000..5045c97a4
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/streaming/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/vercel-streaming",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/streaming/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/streaming/src/pages/one.astro
new file mode 100644
index 000000000..0c7fb90a7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/streaming/src/pages/one.astro
@@ -0,0 +1,8 @@
+
+
+ One
+
+
+ One
+
+
diff --git a/packages/integrations/vercel/test/fixtures/streaming/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/streaming/src/pages/two.astro
new file mode 100644
index 000000000..e7ba9910e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/streaming/src/pages/two.astro
@@ -0,0 +1,8 @@
+
+
+ Two
+
+
+ Two
+
+
diff --git a/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/astro.config.mjs b/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/astro.config.mjs
new file mode 100644
index 000000000..609c97dd0
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/astro.config.mjs
@@ -0,0 +1,10 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: vercel({
+ webAnalytics: {
+ enabled: true
+ }
+ })
+});
diff --git a/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/package.json b/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/package.json
new file mode 100644
index 000000000..c54ef16c7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-vercel-with-web-analytics-enabled-output-as-static",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/src/pages/one.astro
new file mode 100644
index 000000000..0c7fb90a7
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/src/pages/one.astro
@@ -0,0 +1,8 @@
+
+
+ One
+
+
+ One
+
+
diff --git a/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/src/pages/two.astro
new file mode 100644
index 000000000..e7ba9910e
--- /dev/null
+++ b/packages/integrations/vercel/test/fixtures/with-web-analytics-enabled/output-as-static/src/pages/two.astro
@@ -0,0 +1,8 @@
+
+
+ Two
+
+
+ Two
+
+
diff --git a/packages/integrations/vercel/test/hosted/README.md b/packages/integrations/vercel/test/hosted/README.md
new file mode 100644
index 000000000..9dbb9bbc0
--- /dev/null
+++ b/packages/integrations/vercel/test/hosted/README.md
@@ -0,0 +1,3 @@
+The tests in this folder are done directly on a deployed Vercel website (hosted at https://astro-vercel-image-test.vercel.app) and are not run by the test suite. They instead run every week through a GitHub action.
+
+The purpose of those tests is to make sure that everything works as expected while deployed. In a way, they're as E2E as it gets.
diff --git a/packages/integrations/vercel/test/hosted/hosted-astro-project/astro.config.mjs b/packages/integrations/vercel/test/hosted/hosted-astro-project/astro.config.mjs
new file mode 100644
index 000000000..28544e7e9
--- /dev/null
+++ b/packages/integrations/vercel/test/hosted/hosted-astro-project/astro.config.mjs
@@ -0,0 +1,8 @@
+import vercel from '@astrojs/vercel';
+import { defineConfig } from 'astro/config';
+
+// https://astro.build/config
+export default defineConfig({
+ output: 'server',
+ adapter: vercel(),
+});
diff --git a/packages/integrations/vercel/test/hosted/hosted-astro-project/package.json b/packages/integrations/vercel/test/hosted/hosted-astro-project/package.json
new file mode 100644
index 000000000..b20c4385b
--- /dev/null
+++ b/packages/integrations/vercel/test/hosted/hosted-astro-project/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "vercel-hosted-astro-project",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "build": "astro build"
+ },
+ "dependencies": {
+ "@astrojs/vercel": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/vercel/test/hosted/hosted-astro-project/src/assets/penguin.png b/packages/integrations/vercel/test/hosted/hosted-astro-project/src/assets/penguin.png
new file mode 100644
index 000000000..218acde5b
Binary files /dev/null and b/packages/integrations/vercel/test/hosted/hosted-astro-project/src/assets/penguin.png differ
diff --git a/packages/integrations/vercel/test/hosted/hosted-astro-project/src/pages/index.astro b/packages/integrations/vercel/test/hosted/hosted-astro-project/src/pages/index.astro
new file mode 100644
index 000000000..256bfb407
--- /dev/null
+++ b/packages/integrations/vercel/test/hosted/hosted-astro-project/src/pages/index.astro
@@ -0,0 +1,6 @@
+---
+import { Image } from 'astro:assets';
+import penguin from '../assets/penguin.png';
+---
+
+
diff --git a/packages/integrations/vercel/test/hosted/hosted.test.js b/packages/integrations/vercel/test/hosted/hosted.test.js
new file mode 100644
index 000000000..e090188a7
--- /dev/null
+++ b/packages/integrations/vercel/test/hosted/hosted.test.js
@@ -0,0 +1,14 @@
+import assert from 'node:assert/strict';
+import { describe, it } from 'node:test';
+
+const VERCEL_TEST_URL = 'https://astro-vercel-image-test.vercel.app';
+
+describe('Hosted Vercel Tests', () => {
+ it('Image endpoint works', async () => {
+ const image = await fetch(
+ VERCEL_TEST_URL + '/_image?href=%2F_astro%2Fpenguin.e9c64733.png&w=300&f=webp',
+ );
+
+ assert.equal(image.status, 200);
+ });
+});
diff --git a/packages/integrations/vercel/test/image.test.js b/packages/integrations/vercel/test/image.test.js
new file mode 100644
index 000000000..f5dac6d86
--- /dev/null
+++ b/packages/integrations/vercel/test/image.test.js
@@ -0,0 +1,89 @@
+import assert from 'node:assert/strict';
+import { after, before, describe, it } from 'node:test';
+import * as cheerio from 'cheerio';
+import { loadFixture } from './test-utils.js';
+
+describe('Image', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/image/',
+ });
+ await fixture.build();
+ });
+
+ it('build successful', async () => {
+ assert.ok(await fixture.readFile('../.vercel/output/static/index.html'));
+ });
+
+ it('has link to vercel in build with proper attributes', async () => {
+ const html = await fixture.readFile('../.vercel/output/static/index.html');
+ const $ = cheerio.load(html);
+ const img = $('#basic-image img');
+
+ assert.equal(img.attr('src').startsWith('/_vercel/image?url=_astr'), true);
+ assert.equal(img.attr('loading'), 'lazy');
+ assert.equal(img.attr('width'), '225');
+ });
+
+ it('has proper vercel config', async () => {
+ const vercelConfig = JSON.parse(await fixture.readFile('../.vercel/output/config.json'));
+
+ assert.deepEqual(vercelConfig.images, {
+ sizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+ domains: ['astro.build'],
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: '**.amazonaws.com',
+ },
+ ],
+ });
+ });
+
+ describe('dev', () => {
+ let devServer;
+
+ before(async () => {
+ devServer = await fixture.startDevServer();
+ });
+
+ after(async () => {
+ await devServer.stop();
+ });
+
+ it('has link to local image in dev with proper attributes', async () => {
+ const html = await fixture.fetch('/').then((res) => res.text());
+ const $ = cheerio.load(html);
+ const img = $('#basic-image img');
+
+ assert.equal(img.attr('src').startsWith('/_image?href='), true);
+ assert.equal(img.attr('loading'), 'lazy');
+ assert.equal(img.attr('width'), '225');
+ });
+
+ it('supports SVGs', async () => {
+ const html = await fixture.fetch('/').then((res) => res.text());
+ const $ = cheerio.load(html);
+ const img = $('#svg img');
+ const src = img.attr('src');
+
+ const res = await fixture.fetch(src);
+ assert.equal(res.status, 200);
+ assert.equal(res.headers.get('content-type'), 'image/svg+xml');
+ });
+
+ it('generates valid srcset for responsive images', async () => {
+ const html = await fixture.fetch('/').then((res) => res.text());
+ const $ = cheerio.load(html);
+ const img = $('#responsive img');
+ const widths = img
+ .attr('srcset')
+ .split(', ')
+ .map((entry) => entry.split(' ')[1]);
+ assert.deepEqual(widths, ['640w', '750w', '828w', '1080w', '1200w', '1920w']);
+ });
+ });
+});
diff --git a/packages/integrations/vercel/test/integration-assets.test.js b/packages/integrations/vercel/test/integration-assets.test.js
new file mode 100644
index 000000000..4bc4a570a
--- /dev/null
+++ b/packages/integrations/vercel/test/integration-assets.test.js
@@ -0,0 +1,24 @@
+import assert from 'node:assert/strict';
+import { describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Assets generated by integrations', () => {
+ it('moves static assets generated by integrations to the correct location: static output', async () => {
+ const fixture = await loadFixture({
+ root: './fixtures/integration-assets/',
+ });
+ await fixture.build();
+ const sitemap = await fixture.readFile('../.vercel/output/static/sitemap-index.xml');
+ assert(sitemap.includes(''));
+ });
+
+ it('moves static assets generated by integrations to the correct location: server output', async () => {
+ const fixture = await loadFixture({
+ root: './fixtures/integration-assets/',
+ output: 'server',
+ });
+ await fixture.build();
+ const sitemap = await fixture.readFile('../.vercel/output/static/sitemap-index.xml');
+ assert(sitemap.includes(''));
+ });
+});
diff --git a/packages/integrations/vercel/test/isr.test.js b/packages/integrations/vercel/test/isr.test.js
new file mode 100644
index 000000000..25dfe1dba
--- /dev/null
+++ b/packages/integrations/vercel/test/isr.test.js
@@ -0,0 +1,66 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('ISR', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/isr/',
+ });
+ await fixture.build();
+ });
+
+ it('generates expected prerender config', async () => {
+ const vcConfig = JSON.parse(
+ await fixture.readFile('../.vercel/output/functions/_isr.prerender-config.json'),
+ );
+ assert.deepEqual(vcConfig, {
+ expiration: 120,
+ bypassToken: '1c9e601d-9943-4e7c-9575-005556d774a8',
+ allowQuery: ['x_astro_path'],
+ passQuery: true,
+ });
+ });
+
+ it('generates expected routes', async () => {
+ const deploymentConfig = JSON.parse(await fixture.readFile('../.vercel/output/config.json'));
+ // the first two are /_astro/*, and filesystem routes
+ assert.deepEqual(deploymentConfig.routes.slice(2), [
+ {
+ src: '^/two$',
+ dest: '_render',
+ },
+ {
+ src: '^/excluded/([^/]+?)$',
+ dest: '_render',
+ },
+ {
+ src: '^/excluded(?:/(.*?))?$',
+ dest: '_render',
+ },
+ {
+ src: '^/api/([^/]+?)$',
+ dest: '_render',
+ },
+ {
+ src: '^/api$',
+ dest: '_render',
+ },
+ {
+ src: '^/_server-islands/([^/]+?)/?$',
+ dest: '_render',
+ },
+ {
+ src: '^/_image/?$',
+ dest: '_render',
+ },
+ {
+ src: '^/one/?$',
+ dest: '/_isr?x_astro_path=$0',
+ },
+ ]);
+ });
+});
diff --git a/packages/integrations/vercel/test/max-duration.test.js b/packages/integrations/vercel/test/max-duration.test.js
new file mode 100644
index 000000000..d5e26fc1a
--- /dev/null
+++ b/packages/integrations/vercel/test/max-duration.test.js
@@ -0,0 +1,22 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('maxDuration', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/max-duration/',
+ });
+ await fixture.build();
+ });
+
+ it('makes it to vercel function configuration', async () => {
+ const vcConfig = JSON.parse(
+ await fixture.readFile('../.vercel/output/functions/_render.func/.vc-config.json'),
+ );
+ assert.equal(vcConfig.maxDuration, 60);
+ });
+});
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..79a1f4aaf
--- /dev/null
+++ b/packages/integrations/vercel/test/prerendered-error-pages.test.js
@@ -0,0 +1,27 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+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'));
+ assert.deepEqual(
+ deploymentConfig.routes.find((r) => r.status === 404),
+ {
+ src: '^/.*$',
+ dest: '/404.html',
+ status: 404,
+ },
+ );
+ });
+});
diff --git a/packages/integrations/vercel/test/redirects-serverless.test.js b/packages/integrations/vercel/test/redirects-serverless.test.js
new file mode 100644
index 000000000..8d7dcf75b
--- /dev/null
+++ b/packages/integrations/vercel/test/redirects-serverless.test.js
@@ -0,0 +1,29 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Redirects Serverless', () => {
+ /** @type {import('astro/test/test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/redirects-serverless/',
+ redirects: {
+ '/one': '/',
+ '/other': '/subpage',
+ },
+ });
+ await fixture.build();
+ });
+
+ it('does not create .html files', async () => {
+ let hasErrored = false;
+ try {
+ await fixture.readFile('../.vercel/output/static/other/index.html');
+ } catch {
+ hasErrored = true;
+ }
+ assert.equal(hasErrored, true, 'this file should not exist');
+ });
+});
diff --git a/packages/integrations/vercel/test/redirects.test.js b/packages/integrations/vercel/test/redirects.test.js
new file mode 100644
index 000000000..a76ff6ad9
--- /dev/null
+++ b/packages/integrations/vercel/test/redirects.test.js
@@ -0,0 +1,88 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Redirects', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/redirects/',
+ redirects: {
+ '/one': '/',
+ '/two': '/',
+ '/three': {
+ status: 302,
+ destination: '/',
+ },
+ '/four': {
+ status: 302,
+ destination: 'http://example.com',
+ },
+ '/blog/[...slug]': '/team/articles/[...slug]',
+ '/Basic/http-2-0.html': '/posts/http2',
+ },
+ trailingSlash: 'always',
+ });
+ await fixture.build();
+ });
+
+ async function getConfig() {
+ const json = await fixture.readFile('../.vercel/output/config.json');
+ const config = JSON.parse(json);
+ return config;
+ }
+
+ it('define static routes', async () => {
+ const config = await getConfig();
+ const oneRoute = config.routes.find((r) => r.src === '^/one$');
+ assert.equal(oneRoute.headers.Location, '/');
+ assert.equal(oneRoute.status, 301);
+
+ const twoRoute = config.routes.find((r) => r.src === '^/two$');
+ assert.equal(twoRoute.headers.Location, '/');
+ assert.equal(twoRoute.status, 301);
+
+ const threeRoute = config.routes.find((r) => r.src === '^/three$');
+ assert.equal(threeRoute.headers.Location, '/');
+ assert.equal(threeRoute.status, 302);
+
+ const fourRoute = config.routes.find((r) => r.src === '^/four$');
+ assert.equal(fourRoute.headers.Location, 'http://example.com');
+ assert.equal(fourRoute.status, 302);
+ });
+
+ it('define redirects for static files', async () => {
+ const config = await getConfig();
+
+ const staticRoute = config.routes.find((r) => r.src === '^/Basic/http-2-0\\.html$');
+ assert.notEqual(staticRoute, undefined);
+ assert.equal(staticRoute.headers.Location, '/posts/http2');
+ assert.equal(staticRoute.status, 301);
+ });
+
+ it('defines dynamic routes', async () => {
+ const config = await getConfig();
+
+ const blogRoute = config.routes.find((r) => r.src.startsWith('^/blog'));
+ assert.notEqual(blogRoute, undefined);
+ assert.equal(blogRoute.headers.Location.startsWith('/team/articles'), true);
+ assert.equal(blogRoute.status, 301);
+ });
+
+ it('throws an error for invalid redirects', async () => {
+ const fails = await loadFixture({
+ root: './fixtures/redirects/',
+ redirects: {
+ // Invalid source syntax
+ '/blog/(![...slug]': '/team/articles/[...slug]',
+ },
+ });
+ await assert.rejects(() => fails.build(), {
+ name: 'AstroUserError',
+ message:
+ 'Error generating redirects: Redirect at index 0 has invalid `source` regular expression "/blog/(!:slug*".',
+ });
+ });
+});
diff --git a/packages/integrations/vercel/test/server-islands.test.js b/packages/integrations/vercel/test/server-islands.test.js
new file mode 100644
index 000000000..f4f176707
--- /dev/null
+++ b/packages/integrations/vercel/test/server-islands.test.js
@@ -0,0 +1,27 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Server Islands', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/server-islands/',
+ });
+ await fixture.build();
+ });
+
+ it('server islands route is in the config', async () => {
+ const config = JSON.parse(await fixture.readFile('../.vercel/output/config.json'));
+ let found = null;
+ for (const route of config.routes) {
+ if (route.src?.includes('_server-islands')) {
+ found = route;
+ break;
+ }
+ }
+ assert.notEqual(found, null, 'Default server islands route included');
+ });
+});
diff --git a/packages/integrations/vercel/test/serverless-prerender.test.js b/packages/integrations/vercel/test/serverless-prerender.test.js
new file mode 100644
index 000000000..662e74ac3
--- /dev/null
+++ b/packages/integrations/vercel/test/serverless-prerender.test.js
@@ -0,0 +1,59 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Serverless prerender', () => {
+ /** @type {import('./test-utils').Fixture} */
+ let fixture;
+
+ before(async () => {
+ process.env.PRERENDER = true;
+ fixture = await loadFixture({
+ root: './fixtures/serverless-prerender/',
+ });
+ await fixture.build();
+ });
+
+ it('build successful', async () => {
+ assert.ok(await fixture.readFile('../.vercel/output/static/index.html'));
+ });
+
+ it('outDir is tree-shaken if not needed', async () => {
+ const [file] = await fixture.glob(
+ '../.vercel/output/functions/_render.func/packages/vercel/test/fixtures/serverless-prerender/.vercel/output/_functions/pages/_image.astro.mjs',
+ );
+ try {
+ await fixture.readFile(file);
+ assert.fail();
+ } catch {
+ assert.ok('Function do be three-shaken');
+ }
+ });
+
+ // TODO: The path here seems to be inconsistent?
+ it.skip('includeFiles work', async () => {
+ assert.ok(
+ await fixture.readFile(
+ '../.vercel/output/functions/render.func/packages/vercel/test/fixtures/serverless-prerender/dist/middleware.mjs',
+ ),
+ );
+ });
+});
+
+describe('Serverless hybrid rendering', () => {
+ /** @type {import('./test-utils').Fixture} */
+ let fixture;
+
+ before(async () => {
+ process.env.PRERENDER = true;
+ fixture = await loadFixture({
+ root: './fixtures/serverless-prerender/',
+ output: 'static',
+ });
+ await fixture.build();
+ });
+
+ it('build successful', async () => {
+ assert.ok(await fixture.readFile('../.vercel/output/static/index.html'));
+ });
+});
diff --git a/packages/integrations/vercel/test/serverless-with-dynamic-routes.test.js b/packages/integrations/vercel/test/serverless-with-dynamic-routes.test.js
new file mode 100644
index 000000000..b402ad0bb
--- /dev/null
+++ b/packages/integrations/vercel/test/serverless-with-dynamic-routes.test.js
@@ -0,0 +1,22 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Serverless with dynamic routes', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ process.env.PRERENDER = true;
+ fixture = await loadFixture({
+ root: './fixtures/serverless-with-dynamic-routes/',
+ output: 'server',
+ });
+ await fixture.build();
+ });
+
+ it('build successful', async () => {
+ assert.ok(await fixture.readFile('../.vercel/output/static/index.html'));
+ assert.ok(await fixture.readFile('../.vercel/output/functions/_render.func/.vc-config.json'));
+ });
+});
diff --git a/packages/integrations/vercel/test/static-assets.test.js b/packages/integrations/vercel/test/static-assets.test.js
new file mode 100644
index 000000000..9fe3d0bb5
--- /dev/null
+++ b/packages/integrations/vercel/test/static-assets.test.js
@@ -0,0 +1,72 @@
+import assert from 'node:assert/strict';
+import { describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Static Assets', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ const VALID_CACHE_CONTROL = 'public, max-age=31536000, immutable';
+
+ async function build({ adapter, assets, output }) {
+ fixture = await loadFixture({
+ root: './fixtures/static-assets/',
+ output,
+ adapter,
+ build: {
+ assets,
+ },
+ });
+ await fixture.build();
+ }
+
+ async function getConfig() {
+ const json = await fixture.readFile('../.vercel/output/config.json');
+ const config = JSON.parse(json);
+
+ return config;
+ }
+
+ async function getAssets() {
+ return fixture.config.build.assets;
+ }
+
+ async function checkValidCacheControl(assets) {
+ const config = await getConfig();
+ const theAssets = assets ?? (await getAssets());
+
+ const route = config.routes.find((r) => r.src === `^/${theAssets}/(.*)$`);
+ assert.equal(route.headers['cache-control'], VALID_CACHE_CONTROL);
+ assert.equal(route.continue, true);
+ }
+
+ describe('static adapter', () => {
+ it('has cache control', async () => {
+ const { default: vercel } = await import('@astrojs/vercel');
+ await build({ adapter: vercel() });
+ await checkValidCacheControl();
+ });
+
+ it('has cache control other assets', async () => {
+ const { default: vercel } = await import('@astrojs/vercel');
+ const assets = '_foo';
+ await build({ adapter: vercel(), assets });
+ await checkValidCacheControl(assets);
+ });
+ });
+
+ describe('serverless adapter', () => {
+ it('has cache control', async () => {
+ const { default: vercel } = await import('@astrojs/vercel');
+ await build({ output: 'server', adapter: vercel() });
+ await checkValidCacheControl();
+ });
+
+ it('has cache control other assets', async () => {
+ const { default: vercel } = await import('@astrojs/vercel');
+ const assets = '_foo';
+ await build({ output: 'server', adapter: vercel(), assets });
+ await checkValidCacheControl(assets);
+ });
+ });
+});
diff --git a/packages/integrations/vercel/test/static.test.js b/packages/integrations/vercel/test/static.test.js
new file mode 100644
index 000000000..20507f864
--- /dev/null
+++ b/packages/integrations/vercel/test/static.test.js
@@ -0,0 +1,25 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('static routing', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/static/',
+ });
+ await fixture.build();
+ });
+
+ it('falls back to 404.html', async () => {
+ const deploymentConfig = JSON.parse(await fixture.readFile('../.vercel/output/config.json'));
+ // change the index if necesseary
+ assert.deepEqual(deploymentConfig.routes[2], {
+ src: '^/.*$',
+ dest: '/404.html',
+ status: 404,
+ });
+ });
+});
diff --git a/packages/integrations/vercel/test/streaming.test.js b/packages/integrations/vercel/test/streaming.test.js
new file mode 100644
index 000000000..1e4b0f111
--- /dev/null
+++ b/packages/integrations/vercel/test/streaming.test.js
@@ -0,0 +1,22 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('streaming', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/streaming/',
+ });
+ await fixture.build();
+ });
+
+ it('makes it to vercel function configuration', async () => {
+ const vcConfig = JSON.parse(
+ await fixture.readFile('../.vercel/output/functions/_render.func/.vc-config.json'),
+ );
+ assert.equal(vcConfig.supportsResponseStreaming, true);
+ });
+});
diff --git a/packages/integrations/vercel/test/test-image-service.js b/packages/integrations/vercel/test/test-image-service.js
new file mode 100644
index 000000000..e3c5b4b6e
--- /dev/null
+++ b/packages/integrations/vercel/test/test-image-service.js
@@ -0,0 +1,32 @@
+import { fileURLToPath } from 'node:url';
+import { baseService } from 'astro/assets';
+
+/**
+ * stub image service that returns images as-is without optimization
+ * @param {{ foo?: string }} [config]
+ */
+export function testImageService(config = {}) {
+ return {
+ entrypoint: fileURLToPath(import.meta.url),
+ config,
+ };
+}
+
+/** @type {import("../dist/@types/astro").LocalImageService} */
+export default {
+ ...baseService,
+ propertiesToHash: [...baseService.propertiesToHash, 'data-custom'],
+ getHTMLAttributes(options, serviceConfig) {
+ options['data-service'] = 'my-custom-service';
+ if (serviceConfig.service.config.foo) {
+ options['data-service-config'] = serviceConfig.service.config.foo;
+ }
+ return baseService.getHTMLAttributes(options);
+ },
+ async transform(buffer, transform) {
+ return {
+ data: buffer,
+ format: transform.format,
+ };
+ },
+};
diff --git a/packages/integrations/vercel/test/test-utils.js b/packages/integrations/vercel/test/test-utils.js
new file mode 100644
index 000000000..8e70e9a1c
--- /dev/null
+++ b/packages/integrations/vercel/test/test-utils.js
@@ -0,0 +1,8 @@
+import { loadFixture as baseLoadFixture } from '../../../astro/test/test-utils.js';
+
+export function loadFixture(config) {
+ if (config?.root) {
+ config.root = new URL(config.root, import.meta.url);
+ }
+ return baseLoadFixture(config);
+}
diff --git a/packages/integrations/vercel/test/web-analytics.test.js b/packages/integrations/vercel/test/web-analytics.test.js
new file mode 100644
index 000000000..d5056d0ac
--- /dev/null
+++ b/packages/integrations/vercel/test/web-analytics.test.js
@@ -0,0 +1,26 @@
+import assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import { loadFixture } from './test-utils.js';
+
+describe('Vercel Web Analytics', () => {
+ describe('output: static', () => {
+ /** @type {import('./test-utils.js').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: './fixtures/with-web-analytics-enabled/output-as-static/',
+ output: 'static',
+ });
+ await fixture.build();
+ });
+
+ it('ensures that Vercel Web Analytics is present in the header', async () => {
+ const pageOne = await fixture.readFile('../.vercel/output/static/one/index.html');
+ const pageTwo = await fixture.readFile('../.vercel/output/static/two/index.html');
+
+ assert.match(pageOne, /\/_vercel\/insights\/script.js/);
+ assert.match(pageTwo, /\/_vercel\/insights\/script.js/);
+ });
+ });
+});
--
cgit v1.2.3