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"; +--- + +
+ Astro +
+ +
+ Astro +
+ +
+ Astro +
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