diff options
Diffstat (limited to 'packages/integrations/vercel/test')
111 files changed, 1483 insertions, 0 deletions
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..9ae583a11 --- /dev/null +++ b/packages/integrations/vercel/test/edge-middleware.test.js @@ -0,0 +1,76 @@ +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('../../../astro/test/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 () => { + let 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/integrations/vercel/test/fixtures/middleware-with-edge-file/dist/middleware.mjs', + ); + console.log(contents); + // 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/integrations/vercel/test/fixtures/middleware-without-edge-file/dist/middleware.mjs', + ); + console.log(contents); + // 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..942139f3d --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/basic/astro.config.mjs @@ -0,0 +1,8 @@ +import vercel from '@astrojs/vercel/serverless'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + adapter: vercel({ + functionPerRoute: true + }) +}); 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..d74792900 --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> 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 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/functionPerRoute/astro.config.mjs b/packages/integrations/vercel/test/fixtures/functionPerRoute/astro.config.mjs new file mode 100644 index 000000000..eb2c7699e --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/functionPerRoute/astro.config.mjs @@ -0,0 +1,9 @@ +import vercel from '@astrojs/vercel/serverless'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + adapter: vercel({ + functionPerRoute: true + }), + output: "server" +}); diff --git a/packages/integrations/vercel/test/fixtures/functionPerRoute/package.json b/packages/integrations/vercel/test/fixtures/functionPerRoute/package.json new file mode 100644 index 000000000..5180b3999 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/functionPerRoute/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/astro-vercel-function-per-route", + "version": "0.0.0", + "private": true, + "dependencies": { + "@astrojs/vercel": "workspace:*", + "astro": "^4.14.6" + } +} diff --git a/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/one.astro new file mode 100644 index 000000000..0c7fb90a7 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/one.astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/prerender.astro b/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/prerender.astro new file mode 100644 index 000000000..c61b83a97 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/prerender.astro @@ -0,0 +1,12 @@ +--- +export const prerender = true; +--- + +<html> + <head> + <title>Prerendered Page</title> + </head> + <body> + <h1>Prerendered Page</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/two.astro new file mode 100644 index 000000000..e7ba9910e --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/functionPerRoute/src/pages/two.astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/image/astro.config.mjs b/packages/integrations/vercel/test/fixtures/image/astro.config.mjs new file mode 100644 index 000000000..78923f2cb --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/image/astro.config.mjs @@ -0,0 +1,15 @@ +import vercel from '@astrojs/vercel/static'; +import { defineConfig } from 'astro/config'; +import { testImageService } from '../../../../../astro/test/test-image-service.js'; + +export default defineConfig({ + adapter: vercel({imageService: 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..1ad1f438d --- /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": "^4.14.6" + } +} diff --git a/packages/integrations/vercel/test/fixtures/image/src/assets/astro.jpeg b/packages/integrations/vercel/test/fixtures/image/src/assets/astro.jpeg Binary files differnew file mode 100644 index 000000000..40d35ef48 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/image/src/assets/astro.jpeg 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 @@ +<svg height="600pt" width="500pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a"><stop offset="0" stop-color="#fff" stop-opacity=".65"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#ffa63f"/><stop offset="1" stop-color="#ff0"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#ffeed7"/><stop offset="1" stop-color="#bdbfc2"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#fff" stop-opacity=".8"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><radialGradient id="e" cx="446.77762" cy="1219.4125" gradientTransform="scale(1.045233 .956725)" gradientUnits="userSpaceOnUse" r="195.07191"><stop offset="0" stop-color="#3f2600" stop-opacity=".6"/><stop offset="1" stop-color="#3f2600" stop-opacity="0"/></radialGradient><linearGradient id="f" gradientTransform="scale(.575262 1.738339)" gradientUnits="userSpaceOnUse" x1="400.57785" x2="400.84448" xlink:href="#c" y1="369.53015" y2="304.07886"/><linearGradient id="g" gradientTransform="scale(1.116071 .896001)" gradientUnits="userSpaceOnUse" x1="303.01761" x2="297.0856" xlink:href="#d" y1="237.93179" y2="330.09561"/><linearGradient id="h" gradientTransform="scale(.816497 1.224744)" gradientUnits="userSpaceOnUse" x1="378.93771" x2="380.27319" xlink:href="#c" y1="278.60202" y2="243.91606"/><linearGradient id="i" gradientTransform="scale(.816497 1.224744)" gradientUnits="userSpaceOnUse" x1="381.38742" x2="380.5517" xlink:href="#c" y1="277.495" y2="245.68338"/><linearGradient id="j" gradientTransform="scale(.816497 1.224744)" gradientUnits="userSpaceOnUse" x1="379.09573" x2="376.79556" xlink:href="#a" y1="240.92712" y2="281.01636"/><linearGradient id="k" gradientTransform="scale(.816497 1.224744)" gradientUnits="userSpaceOnUse" x1="389.63535" x2="387.06866" xlink:href="#a" y1="242.28218" y2="281.32513"/><linearGradient id="l" gradientTransform="scale(.812855 1.230232)" gradientUnits="userSpaceOnUse" spreadMethod="reflect" x1="437.57941" x2="437.57941" xlink:href="#c" y1="528.87177" y2="394.10361"/><linearGradient id="m" gradientTransform="scale(.649784 1.538974)" gradientUnits="userSpaceOnUse" x1="375.17325" x2="377.48541" xlink:href="#c" y1="419.78485" y2="324.03815"/><linearGradient id="n" gradientTransform="scale(1.074798 .930408)" gradientUnits="userSpaceOnUse" x1="320.75104" x2="321.32224" xlink:href="#d" y1="498.17776" y2="614.50439"/><linearGradient id="o" gradientTransform="scale(1.077001 .928504)" gradientUnits="userSpaceOnUse" x1="322.48257" x2="323.2514" xlink:href="#a" y1="435.26761" y2="488.48251"/><linearGradient id="p" gradientTransform="scale(.571707 1.749147)" gradientUnits="userSpaceOnUse" x1="411.2215" x2="411.2215" xlink:href="#a" y1="242.94365" y2="331.44858"/><linearGradient id="q" gradientTransform="scale(.572667 1.746214)" gradientUnits="userSpaceOnUse" x1="867.34546" x2="867.33453" xlink:href="#a" y1="234.73897" y2="314.83911"/><linearGradient id="r" gradientTransform="scale(1.011514 .988617)" gradientUnits="userSpaceOnUse" x1="236.25362" x2="212.5099" xlink:href="#b" y1="657.11133" y2="737.41229"/><linearGradient id="s" gradientTransform="scale(1.065499 .938527)" gradientUnits="userSpaceOnUse" x1="381.56607" x2="279.64313" xlink:href="#c" y1="655.73102" y2="386.66583"/><linearGradient id="t" gradientTransform="scale(1.009851 .990245)" gradientUnits="userSpaceOnUse" x1="218.11714" x2="203.12654" xlink:href="#b" y1="630.30475" y2="737.8537"/><linearGradient id="u" gradientTransform="scale(1.007724 .992335)" gradientUnits="userSpaceOnUse" x1="117.88966" x2="182.24524" xlink:href="#a" y1="587.23602" y2="704.73077"/><linearGradient id="v" gradientTransform="scale(.999504 1.000496)" gradientUnits="userSpaceOnUse" x1="223.10072" x2="230.53499" xlink:href="#a" y1="570.41809" y2="710.97723"/><linearGradient id="w" gradientTransform="scale(1.065499 .938527)" gradientUnits="userSpaceOnUse" x1="316.93988" x2="371.60889" xlink:href="#a" y1="474.01779" y2="582.63507"/><linearGradient id="x" gradientTransform="scale(1.218684 .820557)" gradientUnits="userSpaceOnUse" x1="284.68652" x2="285.45923" xlink:href="#b" y1="410.46326" y2="485.69934"/><linearGradient id="y" gradientTransform="scale(1.221941 .81837)" gradientUnits="userSpaceOnUse" x1="288.82358" x2="288.37628" xlink:href="#a" y1="398.85422" y2="482.55939"/><path d="m670.88202 1166.6423a203.89551 186.63016 0 1 1 -407.79102 0 203.89551 186.63016 0 1 1 407.79102 0z" fill="url(#e)" transform="matrix(1.4177 0 0 .414745 -349.5468 157.94132)"/><path d="m223.627 632.24c-22.388-32.223-26.754-136.984 25.487-201.43 25.886-30.918 32.49-52.465 34.531-81.393 1.389-32.979-23.325-131.442 69.883-138.944 94.406-7.532 89.336 85.66 88.793 134.975-.451 41.64 30.574 65.241 51.796 97.695 39.279 59.63 35.957 162.3-7.399 217.872-54.917 69.568-101.953 39.398-133.19 41.93-58.493 3.202-60.427 34.391-129.901-70.705z" transform="matrix(1.25 0 0 1.25 -125.2984 -231.75768)"/><path d="m246.571 470.864c-12.239 12.496-44.396 69.092 4.869 105.36 17.369 12.633-16.377 59.495-32.005 36.308-27.57-41.618-8.831-106.941 8.315-130.188 11.652-16.487 29.23-22.676 18.821-11.48z" fill="url(#f)" transform="matrix(-1.67739 -.0224516 -.0211236 1.4709 862.8276 -357.26968)"/><path d="m256.513 459.837c-19.915 17.717-56.176 80.091-3.288 120.606 17.37 12.632-15.393 52.463-33.79 32.089-63.963-70.82 1.669-152.254 24.262-180.25 20.192-24.347 38.078 5.752 12.816 27.555z" stroke="#000" stroke-width=".977298" transform="matrix(-1.67755 0 0 1.52374 863.8676 -382.33468)"/><path d="m399.56879 258.15753a58.37323 46.863022 0 1 1 -116.74646 0 58.37323 46.863022 0 1 1 116.74646 0z" fill="url(#g)" transform="matrix(1.26626 -.0713667 -.0459795 1.19574 -108.6094 -190.01368)"/><path d="m328.86324 320.64151a18.087479 27.131195 0 1 1 -36.17496 0 18.087479 27.131195 0 1 1 36.17496 0z" fill="url(#h)" transform="matrix(1.30445 -.0755326 .0771251 1.34257 -165.9954 -241.86968)"/><path d="m328.86324 320.64151a18.087479 27.131195 0 1 1 -36.17496 0 18.087479 27.131195 0 1 1 36.17496 0z" fill="url(#i)" transform="matrix(-1.81082 .0495107 .0317324 1.55333 896.7076 -349.02968)"/><path d="m328.86324 320.64151a18.087479 27.131195 0 1 1 -36.17496 0 18.087479 27.131195 0 1 1 36.17496 0z" transform="matrix(-.823196 -.00176123 -.0182321 .852662 602.9216 -102.24288)"/><path d="m328.86324 320.64151a18.087479 27.131195 0 1 1 -36.17496 0 18.087479 27.131195 0 1 1 36.17496 0z" transform="matrix(.59438 -.0722959 .0688176 .705838 56.6956 -31.83408)"/><path d="m328.86324 320.64151a18.087479 27.131195 0 1 1 -36.17496 0 18.087479 27.131195 0 1 1 36.17496 0z" fill="url(#j)" transform="matrix(-.480323 -.036454 -.0467935 .475606 502.7436 22.75972)"/><path d="m328.86324 320.64151a18.087479 27.131195 0 1 1 -36.17496 0 18.087479 27.131195 0 1 1 36.17496 0z" fill="url(#k)" transform="matrix(.35691 -.0408211 .0413232 .398544 138.5816 50.73832)"/><path d="m258.702 495.425c12.836-29.103 40.114-80.226 40.695-119.758 0-31.442 94.179-38.951 101.737-7.558s26.741 78.483 38.95 101.156c12.208 22.672 47.809 94.695 9.884 157.546-34.157 55.644-137.725 99.666-193.01-7.557-18.603-37.207-15.285-83.315 1.744-123.829z" fill="url(#l)" transform="matrix(1.25 0 0 1.25 -125.2984 -232.48268)"/><path d="m242.905 473.815c-11.263 18.967-35.5 69.309 12.137 102.047 51.311 34.82 46.473 97.062-15.607 61.955-56.777-31.789-22.845-137.778-4.51-162.266 12.107-17.214 29.897-38.031 7.98-1.736z" fill="url(#m)" transform="matrix(1.38936 -.111074 .102211 1.30214 -202.3394 -230.19068)"/><path d="m256.513 449.72c-17.465 28.508-59.377 95.813-3.288 130.723 75.569 46.355 54.173 92.711-14.799 50.974-97.109-58.264-11.825-175.616 27.131-220.338 44.444-50.2 8.554 9.087-9.044 38.641z" stroke="#000" stroke-width="1.25" transform="matrix(1.25 0 0 1.25 -125.2984 -231.75768)"/><path d="m421.481 504.727c0 32.412-29.272 74.516-79.528 74.138-51.828.455-73.949-41.726-73.949-74.138s34.379-58.717 76.739-58.717c42.359 0 76.738 26.305 76.738 58.717z" fill="url(#n)" transform="matrix(1.30209 0 0 1.22525 -140.7104 -217.80968)"/><path d="m398.227 412.292c-.612 38.572-23.18 47.671-51.74 47.671-28.561 0-49.292-5.694-51.741-47.671 0-26.314 23.18-41.542 51.741-41.542 28.56 0 51.74 15.228 51.74 41.542z" fill="url(#o)" transform="matrix(1.1868 0 0 1.06708 -100.1294 -164.33068)"/><g transform="matrix(1.25 0 0 1.25 -125.2984 -231.75768)"><path d="m234.285 456.475c17.716-26.996 55.015-68.364 6.977 5.813-38.951 61.043-14.403 100.273-1.744 111.039 36.527 32.562 34.966 54.349 6.395 37.206-61.625-36.626-48.835-98.248-11.628-154.058z" fill="url(#p)"/><path d="m490.662 467.52c-15.319-31.701-64.134-111.902 2.326-18.603 60.461 84.297 18.022 143.013 10.464 148.827-7.557 5.813-33.137 17.44-25.579-2.907 7.557-20.347 45.234-58.973 12.789-127.317z" fill="url(#q)"/><path d="m220.915 716.921c-40.442-21.416-99.252 4.124-77.902-54.066 4.276-13.238-6.375-33.008.581-45.926 8.139-15.698 25.58-12.209 36.045-22.674 10.318-10.891 16.859-29.649 36.044-26.742 19.184 2.907 31.945 26.461 45.344 55.229 9.883 20.638 44.941 49.664 42.65 72.758-2.696 35.5-43.027 42.19-82.762 21.421z" fill="url(#r)" stroke="#e68c3f" stroke-width="6.25"/></g><path d="m415.072 495.764c-3.007 24.906-35.813 76.627-69.518 81.534-34.26 5.336-66.432-34.06-74.147-71.114-9.889-41.206 22.587-57.6 71.938-56.627 53.301 1.654 74.121 13.891 71.727 46.207z" fill="url(#s)" transform="matrix(.598206 .268584 -.239623 .617213 389.8156 76.21132)"/><path d="m220.274 718.402c-41.327-23.59-99.894 5.605-77.261-55.547 4.736-13.068-6.596-33.552.36-46.47 8.139-15.698 25.801-11.665 36.266-22.13 10.318-10.891 18.827-27.868 38.012-24.961 19.184 2.907 29.977 24.68 43.376 53.448 9.883 20.638 43.415 48.971 41.124 72.065-2.696 35.5-42.724 45.471-81.877 23.595z" fill="url(#t)" stroke="#e68c3f" stroke-width="6.25068" transform="matrix(-1.1685 .423145 .475283 1.16478 417.5906 -278.07368)"/><path d="m216.482 675.68c-86.531-57.503-47.308-70.96-36.843-81.425 10.318-10.891 18.827-27.868 38.012-24.961 19.184 2.907 29.977 24.68 43.376 53.448 9.883 20.638 43.06 48.918 41.124 72.065-2.616 27.11-48.19 5.487-85.669-19.127z" fill="url(#u)" transform="matrix(-.945096 .343745 .424076 .956058 403.5756 -128.59468)"/><path d="m216.506 677.071c-86.531-57.503-46.797-73.57-33.946-81.28 15.399-9.942 15.158-30.831 34.343-27.924 19.184 2.907 30.725 26.107 44.124 54.875 9.883 20.638 43.06 48.918 41.124 72.065-2.616 27.11-48.166 6.878-85.645-17.736z" fill="url(#v)" transform="matrix(1.00431 -.052286 -.0174 1.04575 -66.5614 -92.71798)"/><path d="m415.072 495.764c-3.007 24.906-35.813 76.627-69.518 81.534-34.26 5.336-66.432-34.06-74.147-71.114-9.889-41.206 22.587-57.6 71.938-56.627 53.301 1.654 74.121 13.891 71.727 46.207z" transform="matrix(.515584 .215259 -.206526 .49467 402.5476 158.30632)"/><path d="m415.072 495.764c-3.007 24.906-35.813 76.627-69.518 81.534-34.26 5.336-66.432-34.06-74.147-71.114-9.889-41.206 22.587-57.6 71.938-56.627 53.301 1.654 74.121 13.891 71.727 46.207z" fill="url(#w)" transform="matrix(.351231 .149463 -.128856 .343469 413.7696 254.03832)"/><path d="m309.954 338.729c7.147-6.77 24.811-27.066 57.961-5.755 6.162 4.01 11.162 4.377 23.021 9.455 23.726 9.749 12.382 33.259-12.744 41.108-10.758 3.489-20.536 16.556-40.129 15.439-16.734-.977-21.119-11.874-31.398-17.906-18.269-10.311-20.965-24.254-11.1-31.653 9.866-7.399 13.725-10.059 14.389-10.688z" fill="url(#x)" stroke="#e68c3f" stroke-width="3.75" transform="matrix(1.25 0 0 1.25 -125.2984 -231.75768)"/><path d="m391.251 357.645c-9.883.581-31.393 22.091-54.066 22.091s-36.044-20.929-39.532-20.929" fill="none" stroke="#e68c3f" stroke-width="2.5" transform="matrix(1.25 0 0 1.25 -125.2984 -231.75768)"/><path d="m309.954 338.729c7.147-6.77 29.691-25.348 59.588-6.328 6.299 3.766 12.804 7.865 22.478 13.464 19.162 11.748 9.671 28.678-13.286 39.39-10.418 4.495-27.593 14.415-40.671 13.721-14.533-1.408-23.935-11.399-33.567-17.906-17.67-12.303-16.597-22.237-8.389-30.508 6.205-5.679 13.183-11.204 13.847-11.833z" fill="url(#y)" transform="matrix(.627885 0 0 .595666 81.6136 -12.43538)"/></svg>
\ 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..db7c22eeb --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/image/src/pages/index.astro @@ -0,0 +1,13 @@ +--- +import { Image } from "astro:assets"; +import astro from "../assets/astro.jpeg"; +import penguin from "../assets/penguin.svg"; +--- + +<div id="basic-image"> + <Image src={astro} alt="Astro" /> +</div> + +<div id="svg"> + <Image src={penguin} alt="Astro" /> +</div> 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..4b675ab6c --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/isr/astro.config.mjs @@ -0,0 +1,13 @@ +import vercel from '@astrojs/vercel/serverless'; +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]"] + } + }) +}); 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..91eb1edeb --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>Dynamic</title> + </head> + <body> + <h1>Dynamic</h1> + </body> +</html> 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 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> 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 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> 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..b1866a75b --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/max-duration/astro.config.mjs @@ -0,0 +1,9 @@ +import vercel from '@astrojs/vercel/serverless'; +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..63ec42edd --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> 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 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> 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..f92b18a4e --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/astro.config.mjs @@ -0,0 +1,9 @@ +import vercel from "@astrojs/vercel/serverless"; +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..777da22a5 --- /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": "^4.14.6" + } +} 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..b1a67f550 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/middleware.js @@ -0,0 +1,9 @@ +/** + * @type {import("astro").MiddlewareResponseHandler} + */ +export const onRequest = async (context, next) => { + const test = 'something'; + context.cookies.set('foo', 'bar'); + const response = await next(); + 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 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/middleware-with-edge-file/src/pages/index.astro 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..f92b18a4e --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/astro.config.mjs @@ -0,0 +1,9 @@ +import vercel from "@astrojs/vercel/serverless"; +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..5e56e9ab3 --- /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": "^4.14.6" + } +} 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 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/middleware-without-edge-file/src/pages/index.astro 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..179d18d38 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/no-output/astro.config.mjs @@ -0,0 +1,6 @@ +import vercel from '@astrojs/vercel/serverless'; +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..d77fb224f --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>testing</title> + </head> + <body> + <h1>testing</h1> + </body> +</html> 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..83e1f2f38 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/astro.config.mjs @@ -0,0 +1,7 @@ +import vercel from '@astrojs/vercel/serverless'; +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..5daed73b8 --- /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": "^4.14.6" + } +} diff --git a/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/404.astro b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/404.astro new file mode 100644 index 000000000..162ff90b6 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/404.astro @@ -0,0 +1,4 @@ +--- +export const prerender = true +--- +<h1>404</h1> diff --git a/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/one.astro new file mode 100644 index 000000000..0c7fb90a7 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/one.astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/two.astro new file mode 100644 index 000000000..e7ba9910e --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/prerendered-error-pages/src/pages/two.astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/redirects-serverless/astro.config.mjs b/packages/integrations/vercel/test/fixtures/redirects-serverless/astro.config.mjs new file mode 100644 index 000000000..1071b7e67 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/redirects-serverless/astro.config.mjs @@ -0,0 +1,7 @@ +import vercel from '@astrojs/vercel/serverless'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + output: 'hybrid', + 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..f5d9b202a --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>Testing</title> + </head> + <body> + <h1>Testing</h1> + </body> +</html> 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 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/redirects-serverless/src/pages/subpage.astro 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..707805087 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/redirects/astro.config.mjs @@ -0,0 +1,6 @@ +import vercel from '@astrojs/vercel/static'; +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..5f11f47ae --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>Testing</title> + </head> + <body> + <h1>Testing</h1> + </body> +</html> 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 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/redirects/src/pages/subpage.astro 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; +--- +<html> + <head> + <title>{ title }</title> + </head> + <body> + <h1>{ title }</h1> + </body> +</html> 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..534197429 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/server-islands/astro.config.mjs @@ -0,0 +1,10 @@ +import vercel from '@astrojs/vercel/serverless'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + output: "server", + adapter: vercel(), + experimental: { + serverIslands: true, + } +}); 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..0a397ff90 --- /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": "^4.14.6" + } +} 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 @@ +<h1>I'm an island</h1> 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'; +--- +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + <Island server:defer /> + </body> +</html> 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..4d8f76288 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/serverless-prerender/astro.config.mjs @@ -0,0 +1,10 @@ +import vercel from '@astrojs/vercel/serverless'; +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..98b6abfa9 --- /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": "^4.14.6" + } +} 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..b6b833e53 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/serverless-prerender/src/pages/index.astro @@ -0,0 +1,12 @@ +--- +export const prerender = import.meta.env.PRERENDER; +--- + +<html> + <head> + <title>testing</title> + </head> + <body> + <h1>testing</h1> + </body> +</html> 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..3132bfc53 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/astro.config.mjs @@ -0,0 +1,11 @@ +import vercel from '@astrojs/vercel/serverless'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + adapter: vercel({ + // Pass some value to make sure it doesn't error out + includeFiles: ['included.js'], + functionPerRoute: true, + }), + 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..730e1e0eb --- /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": "^4.14.6" + } +} 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; +--- + +<html> + <head> + <title>testing {Astro.params.id}</title> + </head> + <body> + <h1>testing {Astro.params.id}</h1> + </body> +</html> 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..b6b833e53 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/serverless-with-dynamic-routes/src/pages/index.astro @@ -0,0 +1,12 @@ +--- +export const prerender = import.meta.env.PRERENDER; +--- + +<html> + <head> + <title>testing</title> + </head> + <body> + <h1>testing</h1> + </body> +</html> 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..bf47be6e7 --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>Testing</title> + </head> + <body> + <h1>Testing</h1> + </body> +</html> 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..6e2d7bff7 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/static/astro.config.mjs @@ -0,0 +1,6 @@ +import vercel from '@astrojs/vercel/static'; +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..2cfd7db1e --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>404</title> + </head> + <body> + <h1>404</h1> + </body> +</html> 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 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> 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 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> 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..94f52a3d6 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/streaming/astro.config.mjs @@ -0,0 +1,7 @@ +import vercel from '@astrojs/vercel/serverless'; +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..1ae09b73a --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> 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 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/astro.config.mjs b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/astro.config.mjs new file mode 100644 index 000000000..794734f78 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/astro.config.mjs @@ -0,0 +1,10 @@ +import vercel from '@astrojs/vercel/serverless'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + adapter: vercel({ + speedInsights: { + enabled: true + } + }) +}); diff --git a/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/package.json b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/package.json new file mode 100644 index 000000000..d1e9a9f76 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/astro-vercel-with-speed-insights-enabled-output-as-server", + "version": "0.0.0", + "private": true, + "dependencies": { + "@astrojs/vercel": "workspace:*", + "astro": "^4.14.6" + } +} diff --git a/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/src/pages/one.astro new file mode 100644 index 000000000..0c7fb90a7 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/src/pages/one.astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/src/pages/two.astro new file mode 100644 index 000000000..e7ba9910e --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-server/src/pages/two.astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/astro.config.mjs b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/astro.config.mjs new file mode 100644 index 000000000..589aa3662 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/astro.config.mjs @@ -0,0 +1,10 @@ +import vercel from '@astrojs/vercel/static'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + adapter: vercel({ + speedInsights: { + enabled: true + } + }) +}); diff --git a/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/package.json b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/package.json new file mode 100644 index 000000000..c349e5b15 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/astro-vercel-with-speed-insights-enabled-output-as-static", + "version": "0.0.0", + "private": true, + "dependencies": { + "@astrojs/vercel": "workspace:*", + "astro": "^4.14.6" + } +} diff --git a/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/src/pages/one.astro b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/src/pages/one.astro new file mode 100644 index 000000000..0c7fb90a7 --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/src/pages/one.astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/src/pages/two.astro b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/src/pages/two.astro new file mode 100644 index 000000000..e7ba9910e --- /dev/null +++ b/packages/integrations/vercel/test/fixtures/with-speed-insights-enabled/output-as-static/src/pages/two.astro @@ -0,0 +1,8 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> diff --git a/packages/integrations/vercel/test/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..7a3cec1fd --- /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/static'; +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..9dbcd9728 --- /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": "^4.14.6" + } +} 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 @@ +<html> + <head> + <title>One</title> + </head> + <body> + <h1>One</h1> + </body> +</html> 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 @@ +<html> + <head> + <title>Two</title> + </head> + <body> + <h1>Two</h1> + </body> +</html> 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..2eb8e60ab --- /dev/null +++ b/packages/integrations/vercel/test/hosted/hosted-astro-project/astro.config.mjs @@ -0,0 +1,8 @@ +import vercel from '@astrojs/vercel/serverless'; +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..8af81b50e --- /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": "^4.14.6" + } +} 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 Binary files differnew file mode 100644 index 000000000..218acde5b --- /dev/null +++ b/packages/integrations/vercel/test/hosted/hosted-astro-project/src/assets/penguin.png 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'; +--- + +<Image src={penguin} width={300} alt="" /> 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..b82ac02bf --- /dev/null +++ b/packages/integrations/vercel/test/image.test.js @@ -0,0 +1,78 @@ +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('../../../astro/test/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'); + }); + }); +}); diff --git a/packages/integrations/vercel/test/isr.test.js b/packages/integrations/vercel/test/isr.test.js new file mode 100644 index 000000000..fb957aa78 --- /dev/null +++ b/packages/integrations/vercel/test/isr.test.js @@ -0,0 +1,58 @@ +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: '^\\/_image$', + dest: '_render', + }, + { + src: '^\\/excluded\\/([^/]+?)\\/?$', + dest: '/_isr?x_astro_path=$0', + }, + { + src: '^\\/one\\/?$', + dest: '/_isr?x_astro_path=$0', + }, + { + src: '^\\/two\\/?$', + 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/no-output.test.js b/packages/integrations/vercel/test/no-output.test.js new file mode 100644 index 000000000..34709804d --- /dev/null +++ b/packages/integrations/vercel/test/no-output.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('Missing output config', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/no-output/', + }); + }); + + it('throws during the build', async () => { + let error = undefined; + try { + await fixture.build(); + } catch (err) { + error = err; + } + assert.notEqual(error, undefined); + assert.match(error.message, /output: "server"/); + }); +}); 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..5812c3364 --- /dev/null +++ b/packages/integrations/vercel/test/prerendered-error-pages.test.js @@ -0,0 +1,24 @@ +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.at(-1), { + 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..9d4f9499e --- /dev/null +++ b/packages/integrations/vercel/test/redirects.test.js @@ -0,0 +1,83 @@ +import assert from 'node:assert/strict'; +import { before, describe, it } from 'node:test'; +import { loadFixture } from './test-utils.js'; + +describe('Redirects', () => { + /** @type {import('../../../astro/test/test-utils.js').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/redirects/', + redirects: { + '/one': '/', + '/two': '/', + '/three': { + status: 302, + destination: '/', + }, + '/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); + }); + + 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('define trailingSlash redirect for sub pages', async () => { + const config = await getConfig(); + + const subpathRoute = config.routes.find((r) => r.src === '/subpage'); + assert.notEqual(subpathRoute, undefined); + assert.equal(subpathRoute.headers.Location, '/subpage/'); + }); + + it('does not define trailingSlash redirect for root page', async () => { + const config = await getConfig(); + assert.equal( + config.routes.find((r) => r.src === '/'), + undefined, + ); + }); +}); 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..0306bb8b2 --- /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 (let 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..61e239300 --- /dev/null +++ b/packages/integrations/vercel/test/serverless-prerender.test.js @@ -0,0 +1,55 @@ +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/integrations/vercel/test/fixtures/serverless-prerender/.vercel/output/_functions/pages/_image.astro.mjs', + ); + const contents = await fixture.readFile(file); + assert.ok(!contents.includes('const outDir ='), "outDir is tree-shaken if it's not imported"); + }); + + // TODO: The path here seems to be inconsistent? + it.skip('includeFiles work', async () => { + assert.ok( + await fixture.readFile( + '../.vercel/output/functions/render.func/packages/integrations/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: 'hybrid', + }); + 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..3f9613834 --- /dev/null +++ b/packages/integrations/vercel/test/serverless-with-dynamic-routes.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('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: 'hybrid', + }); + 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/[id]/index.astro.func/.vc-config.json'), + ); + assert.ok( + await fixture.readFile('../.vercel/output/functions/api/[id].js.func/.vc-config.json'), + ); + }); +}); diff --git a/packages/integrations/vercel/test/speed-insights.test.js b/packages/integrations/vercel/test/speed-insights.test.js new file mode 100644 index 000000000..28ca84cd2 --- /dev/null +++ b/packages/integrations/vercel/test/speed-insights.test.js @@ -0,0 +1,47 @@ +import assert from 'node:assert/strict'; +import { before, describe, it } from 'node:test'; +import { loadFixture } from './test-utils.js'; + +describe('Vercel Speed Insights', () => { + describe('output: server', () => { + /** @type {import('./test-utils.js').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/with-speed-insights-enabled/output-as-server/', + output: 'server', + }); + await fixture.build(); + }); + + it('ensures that Vercel Speed Insights is present in the bundle', async () => { + const [page] = await fixture.readdir('../.vercel/output/static/_astro'); + + const bundle = await fixture.readFile(`../.vercel/output/static/_astro/${page}`); + + assert.match(bundle, /VERCEL_ANALYTICS_ID/); + }); + }); + + describe('output: static', () => { + /** @type {import('./test-utils.js').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/with-speed-insights-enabled/output-as-static/', + output: 'static', + }); + await fixture.build(); + }); + + it('ensures that Vercel Speed Insights is present in the bundle', async () => { + const [page] = await fixture.readdir('../.vercel/output/static/_astro'); + + const bundle = await fixture.readFile(`../.vercel/output/static/_astro/${page}`); + + assert.match(bundle, /VERCEL_ANALYTICS_ID/); + }); + }); +}); diff --git a/packages/integrations/vercel/test/split.test.js b/packages/integrations/vercel/test/split.test.js new file mode 100644 index 000000000..4105db7fc --- /dev/null +++ b/packages/integrations/vercel/test/split.test.js @@ -0,0 +1,32 @@ +import assert from 'node:assert/strict'; +import { before, describe, it } from 'node:test'; +import { loadFixture } from './test-utils.js'; + +describe('build: split', () => { + /** @type {import('./test-utils').Fixture} */ + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/functionPerRoute/', + output: 'server', + }); + await fixture.build(); + }); + + it('creates separate functions for non-prerendered pages', async () => { + const files = await fixture.readdir('../.vercel/output/functions/'); + assert.equal(files.length, 3); + assert.equal(files.includes('prerender.astro.func'), false); + }); + + it('creates the route definitions in the config.json', async () => { + const json = await fixture.readFile('../.vercel/output/config.json'); + const config = JSON.parse(json); + assert.equal(config.routes.length, 5); + assert.equal( + config.routes.some((route) => route.dest === 'prerender.astro'), + false, + ); + }); +}); 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..37d3a0577 --- /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('../../../astro/test/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/static'); + await build({ adapter: vercel() }); + await checkValidCacheControl(); + }); + + it('has cache control other assets', async () => { + const { default: vercel } = await import('@astrojs/vercel/static'); + 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/serverless'); + await build({ output: 'server', adapter: vercel() }); + await checkValidCacheControl(); + }); + + it('has cache control other assets', async () => { + const { default: vercel } = await import('@astrojs/vercel/serverless'); + 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..e007862d7 --- /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-utils.js b/packages/integrations/vercel/test/test-utils.js new file mode 100644 index 000000000..6bb3e7c25 --- /dev/null +++ b/packages/integrations/vercel/test/test-utils.js @@ -0,0 +1,10 @@ +import { loadFixture as baseLoadFixture } from '../../../astro/test/test-utils.js'; + +export { fixLineEndings } 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/); + }); + }); +}); |