diff --git a/packages/integrations/vercel/package.json b/packages/integrations/vercel/package.json index 4e73e0832389..fe44fbae86cf 100644 --- a/packages/integrations/vercel/package.json +++ b/packages/integrations/vercel/package.json @@ -42,8 +42,9 @@ "dev": "astro-scripts dev \"src/**/*.ts\"", "build": "astro-scripts build \"src/**/*.ts\" && tsc", "build:ci": "astro-scripts build \"src/**/*.ts\"", - "test": "astro-scripts test --timeout 60000 \"test/**/!(hosted).test.js\"", - "test:hosted": "astro-scripts test --timeout 30000 \"test/hosted/*.test.js\"" + "test": "astro-scripts test --timeout 60000 \"test/**/!(hosted).test.ts\"", + "test:hosted": "astro-scripts test --timeout 30000 \"test/hosted/*.test.ts\"", + "typecheck:tests": "tsc --build tsconfig.test.json" }, "dependencies": { "@astrojs/internal-helpers": "workspace:*", diff --git a/packages/integrations/vercel/test/edge-middleware.test.js b/packages/integrations/vercel/test/edge-middleware.test.ts similarity index 88% rename from packages/integrations/vercel/test/edge-middleware.test.js rename to packages/integrations/vercel/test/edge-middleware.test.ts index 89c2a3c3f472..3785e0cdd2de 100644 --- a/packages/integrations/vercel/test/edge-middleware.test.js +++ b/packages/integrations/vercel/test/edge-middleware.test.ts @@ -1,15 +1,14 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture, getVercelConfig } from './test-utils.ts'; describe('Vercel edge middleware', () => { - /** @type {import('./test-utils.js').Fixture} */ - let build; + let build: Fixture; before(async () => { build = await loadFixture({ root: './fixtures/middleware-with-edge-file/', }); - await build.build(); + await build.build({}); }); it('an edge function is created', async () => { @@ -22,8 +21,7 @@ describe('Vercel edge middleware', () => { }); it('deployment config points to the middleware edge function', async () => { - const contents = await build.readFile('../.vercel/output/config.json'); - const { routes } = JSON.parse(contents); + const { routes } = await getVercelConfig(build); assert.equal( routes.some((route) => route.dest === '_middleware'), true, @@ -35,7 +33,7 @@ describe('Vercel edge middleware', () => { '../.vercel/output/functions/_middleware.func/middleware.mjs', build.config.outDir, ); - const module = await import(entry); + const module = await import(entry.href); const request = new Request('http://example.com/foo'); const response = await module.default(request, {}); assert.equal(response.headers.get('set-cookie'), 'foo=bar'); @@ -47,10 +45,10 @@ describe('Vercel edge middleware', () => { '../.vercel/output/functions/_middleware.func/middleware.mjs', build.config.outDir, ); - const module = await import(entry); + const module = await import(entry.href); const originalFetch = globalThis.fetch; - let captured; + let captured: RequestInit | undefined; globalThis.fetch = async (_url, opts) => { captured = opts; return new Response('ok', { status: 200 }); @@ -62,6 +60,7 @@ describe('Vercel edge middleware', () => { headers: { 'Content-Type': 'application/json' }, }); await module.default(request, {}); + assert.ok(captured, 'fetch was called'); assert.equal(captured.method, 'POST', 'forwards the HTTP method'); assert.ok(captured.body, 'forwards the request body'); } finally { @@ -74,7 +73,7 @@ describe('Vercel edge middleware', () => { const fixture = await loadFixture({ root: './fixtures/middleware-with-edge-file/', }); - await fixture.build(); + 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', @@ -89,7 +88,7 @@ describe('Vercel edge middleware', () => { const fixture = await loadFixture({ root: './fixtures/middleware-without-edge-file/', }); - await fixture.build(); + 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', diff --git a/packages/integrations/vercel/test/image.test.js b/packages/integrations/vercel/test/image.test.ts similarity index 88% rename from packages/integrations/vercel/test/image.test.js rename to packages/integrations/vercel/test/image.test.ts index c3ae7b60ff01..ac2125e8ed1d 100644 --- a/packages/integrations/vercel/test/image.test.js +++ b/packages/integrations/vercel/test/image.test.ts @@ -1,17 +1,16 @@ 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'; +import { type Fixture, type DevServer, loadFixture } from './test-utils.ts'; describe('Image', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/image/', }); - await fixture.build(); + await fixture.build({}); }); it('build successful', async () => { @@ -23,7 +22,7 @@ describe('Image', () => { const $ = cheerio.load(html); const img = $('#basic-image img'); - assert.equal(img.attr('src').startsWith('/_vercel/image?url=_astr'), true); + assert.equal(img.attr('src')!.startsWith('/_vercel/image?url=_astr'), true); assert.equal(img.attr('loading'), 'lazy'); assert.equal(img.attr('width'), '225'); }); @@ -33,12 +32,12 @@ describe('Image', () => { const $ = cheerio.load(html); const img = $('#small-source img'); const widths = img - .attr('srcset') + .attr('srcset')! .split(', ') .map((entry) => entry.split(' ')[1]); assert.deepEqual(widths, ['640w'], 'uses valid widths in srcset'); - const url = new URL(img.attr('src'), 'http://localhost'); + const url = new URL(img.attr('src')!, 'http://localhost'); assert.equal(url.searchParams.get('w'), '640', 'uses valid width in src'); assert.equal(img.attr('width'), '225', 'uses requested width in img attribute'); @@ -48,7 +47,7 @@ describe('Image', () => { const html = await fixture.readFile('../.vercel/output/static/index.html'); const $ = cheerio.load(html); const img = $('#densities-test img'); - const srcset = img.attr('srcset'); + const srcset = img.attr('srcset')!; // Extract widths from srcset (format: "url 1x", "url 1.5x", etc) const descriptors = srcset.split(', ').map((entry) => entry.split(' ')[1]); @@ -57,7 +56,7 @@ describe('Image', () => { const urls = srcset.split(', ').map((entry) => entry.split(' ')[0]); const widthsFromUrls = urls.map((url) => { const urlObj = new URL(url, 'http://localhost'); - return Number.parseInt(urlObj.searchParams.get('w'), 10); + return Number.parseInt(urlObj.searchParams.get('w')!, 10); }); // The configured sizes are [640, 750, 828, 1080, 1200, 1920, 2048, 3840] @@ -101,7 +100,7 @@ describe('Image', () => { }); describe('dev', () => { - let devServer; + let devServer: DevServer; before(async () => { devServer = await fixture.startDevServer(); @@ -116,7 +115,7 @@ describe('Image', () => { const $ = cheerio.load(html); const img = $('#basic-image img'); - assert.equal(img.attr('src').startsWith('/_image?href='), true); + assert.equal(img.attr('src')!.startsWith('/_image?href='), true); assert.equal(img.attr('loading'), 'lazy'); assert.equal(img.attr('width'), '225'); }); @@ -125,7 +124,7 @@ describe('Image', () => { const html = await fixture.fetch('/').then((res) => res.text()); const $ = cheerio.load(html); const img = $('#svg img'); - const src = img.attr('src'); + const src = img.attr('src')!; const res = await fixture.fetch(src); assert.equal(res.status, 200); @@ -137,7 +136,7 @@ describe('Image', () => { const $ = cheerio.load(html); const img = $('#responsive img'); const widths = img - .attr('srcset') + .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.ts similarity index 90% rename from packages/integrations/vercel/test/integration-assets.test.js rename to packages/integrations/vercel/test/integration-assets.test.ts index 4bc4a570a486..246b59e8ca99 100644 --- a/packages/integrations/vercel/test/integration-assets.test.js +++ b/packages/integrations/vercel/test/integration-assets.test.ts @@ -1,13 +1,13 @@ import assert from 'node:assert/strict'; import { describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { loadFixture } from './test-utils.ts'; 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(); + await fixture.build({}); const sitemap = await fixture.readFile('../.vercel/output/static/sitemap-index.xml'); assert(sitemap.includes('')); }); @@ -17,7 +17,7 @@ describe('Assets generated by integrations', () => { root: './fixtures/integration-assets/', output: 'server', }); - await fixture.build(); + 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.ts similarity index 91% rename from packages/integrations/vercel/test/isr.test.js rename to packages/integrations/vercel/test/isr.test.ts index 0b8e2d70c9be..94edc0505b50 100644 --- a/packages/integrations/vercel/test/isr.test.js +++ b/packages/integrations/vercel/test/isr.test.ts @@ -1,16 +1,15 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; describe('ISR', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/isr/', }); - await fixture.build(); + await fixture.build({}); }); it('generates expected prerender config', async () => { diff --git a/packages/integrations/vercel/test/max-duration.test.js b/packages/integrations/vercel/test/max-duration.test.ts similarity index 77% rename from packages/integrations/vercel/test/max-duration.test.js rename to packages/integrations/vercel/test/max-duration.test.ts index d5e26fc1a999..ba331e11bf90 100644 --- a/packages/integrations/vercel/test/max-duration.test.js +++ b/packages/integrations/vercel/test/max-duration.test.ts @@ -1,16 +1,15 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; describe('maxDuration', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/max-duration/', }); - await fixture.build(); + await fixture.build({}); }); it('makes it to vercel function configuration', async () => { diff --git a/packages/integrations/vercel/test/path-override-security.test.js b/packages/integrations/vercel/test/path-override-security.test.ts similarity index 83% rename from packages/integrations/vercel/test/path-override-security.test.js rename to packages/integrations/vercel/test/path-override-security.test.ts index b72fe702ea7d..aa1c35cd0a35 100644 --- a/packages/integrations/vercel/test/path-override-security.test.js +++ b/packages/integrations/vercel/test/path-override-security.test.ts @@ -1,8 +1,8 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; -async function loadFunctionModule(fixture, functionName) { +async function loadFunctionModule(fixture: Fixture, functionName: string) { const functionConfig = JSON.parse( await fixture.readFile(`../.vercel/output/functions/${functionName}.func/.vc-config.json`), ); @@ -11,20 +11,19 @@ async function loadFunctionModule(fixture, functionName) { fixture.config.outDir, ); - return import(functionEntry); + return import(functionEntry.href); } describe('Vercel serverless path override security', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { - process.env.PRERENDER = true; + process.env.PRERENDER = 'true'; fixture = await loadFixture({ root: './fixtures/serverless-with-dynamic-routes/', output: 'server', }); - await fixture.build(); + await fixture.build({}); }); it('ignores untrusted x_astro_path query param on _render', async () => { diff --git a/packages/integrations/vercel/test/prerendered-error-pages.test.js b/packages/integrations/vercel/test/prerendered-error-pages.test.ts similarity index 66% rename from packages/integrations/vercel/test/prerendered-error-pages.test.js rename to packages/integrations/vercel/test/prerendered-error-pages.test.ts index 79a1f4aafe0f..dd7d56667813 100644 --- a/packages/integrations/vercel/test/prerendered-error-pages.test.js +++ b/packages/integrations/vercel/test/prerendered-error-pages.test.ts @@ -1,20 +1,19 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture, getVercelConfig } from './test-utils.ts'; describe('prerendered error pages routing', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/prerendered-error-pages/', }); - await fixture.build(); + await fixture.build({}); }); it('falls back to 404.html', async () => { - const deploymentConfig = JSON.parse(await fixture.readFile('../.vercel/output/config.json')); + const deploymentConfig = await getVercelConfig(fixture); assert.deepEqual( deploymentConfig.routes.find((r) => r.status === 404), { diff --git a/packages/integrations/vercel/test/redirects-serverless.test.js b/packages/integrations/vercel/test/redirects-serverless.test.ts similarity index 79% rename from packages/integrations/vercel/test/redirects-serverless.test.js rename to packages/integrations/vercel/test/redirects-serverless.test.ts index 8d7dcf75b403..6536d7f529bd 100644 --- a/packages/integrations/vercel/test/redirects-serverless.test.js +++ b/packages/integrations/vercel/test/redirects-serverless.test.ts @@ -1,10 +1,9 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; describe('Redirects Serverless', () => { - /** @type {import('astro/test/test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ @@ -14,7 +13,7 @@ describe('Redirects Serverless', () => { '/other': '/subpage', }, }); - await fixture.build(); + await fixture.build({}); }); it('does not create .html files', async () => { diff --git a/packages/integrations/vercel/test/redirects.test.js b/packages/integrations/vercel/test/redirects.test.ts similarity index 68% rename from packages/integrations/vercel/test/redirects.test.js rename to packages/integrations/vercel/test/redirects.test.ts index a76ff6ad9ed6..e47c93e5421b 100644 --- a/packages/integrations/vercel/test/redirects.test.js +++ b/packages/integrations/vercel/test/redirects.test.ts @@ -1,10 +1,9 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture, getVercelConfig } from './test-utils.ts'; describe('Redirects', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ @@ -25,49 +24,43 @@ describe('Redirects', () => { }, trailingSlash: 'always', }); - await fixture.build(); + 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, '/'); + const config = await getVercelConfig(fixture); + 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, '/'); + 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, '/'); + 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'); + 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 config = await getVercelConfig(fixture); - const staticRoute = config.routes.find((r) => r.src === '^/Basic/http-2-0\\.html$'); + 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.headers['Location'], '/posts/http2'); assert.equal(staticRoute.status, 301); }); it('defines dynamic routes', async () => { - const config = await getConfig(); + const config = await getVercelConfig(fixture); - const blogRoute = config.routes.find((r) => r.src.startsWith('^/blog')); + 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.headers['Location'].startsWith('/team/articles'), true); assert.equal(blogRoute.status, 301); }); @@ -79,7 +72,7 @@ describe('Redirects', () => { '/blog/(![...slug]': '/team/articles/[...slug]', }, }); - await assert.rejects(() => fails.build(), { + 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.ts similarity index 70% rename from packages/integrations/vercel/test/server-islands.test.js rename to packages/integrations/vercel/test/server-islands.test.ts index f4f1767075d8..e5787e536720 100644 --- a/packages/integrations/vercel/test/server-islands.test.js +++ b/packages/integrations/vercel/test/server-islands.test.ts @@ -1,20 +1,19 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture, getVercelConfig } from './test-utils.ts'; describe('Server Islands', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/server-islands/', }); - await fixture.build(); + await fixture.build({}); }); it('server islands route is in the config', async () => { - const config = JSON.parse(await fixture.readFile('../.vercel/output/config.json')); + const config = await getVercelConfig(fixture); let found = null; for (const route of config.routes) { if (route.src?.includes('_server-islands')) { diff --git a/packages/integrations/vercel/test/serverless-prerender.test.js b/packages/integrations/vercel/test/serverless-prerender.test.ts similarity index 82% rename from packages/integrations/vercel/test/serverless-prerender.test.js rename to packages/integrations/vercel/test/serverless-prerender.test.ts index 662e74ac39fd..3c584b2c4d36 100644 --- a/packages/integrations/vercel/test/serverless-prerender.test.js +++ b/packages/integrations/vercel/test/serverless-prerender.test.ts @@ -1,17 +1,16 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; describe('Serverless prerender', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { - process.env.PRERENDER = true; + process.env.PRERENDER = 'true'; fixture = await loadFixture({ root: './fixtures/serverless-prerender/', }); - await fixture.build(); + await fixture.build({}); }); it('build successful', async () => { @@ -41,16 +40,15 @@ describe('Serverless prerender', () => { }); describe('Serverless hybrid rendering', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { - process.env.PRERENDER = true; + process.env.PRERENDER = 'true'; fixture = await loadFixture({ root: './fixtures/serverless-prerender/', output: 'static', }); - await fixture.build(); + await fixture.build({}); }); it('build successful', async () => { diff --git a/packages/integrations/vercel/test/serverless-with-dynamic-routes.test.js b/packages/integrations/vercel/test/serverless-with-dynamic-routes.test.ts similarity index 75% rename from packages/integrations/vercel/test/serverless-with-dynamic-routes.test.js rename to packages/integrations/vercel/test/serverless-with-dynamic-routes.test.ts index b402ad0bb2e6..31f89dd2bc86 100644 --- a/packages/integrations/vercel/test/serverless-with-dynamic-routes.test.js +++ b/packages/integrations/vercel/test/serverless-with-dynamic-routes.test.ts @@ -1,18 +1,17 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; describe('Serverless with dynamic routes', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { - process.env.PRERENDER = true; + process.env.PRERENDER = 'true'; fixture = await loadFixture({ root: './fixtures/serverless-with-dynamic-routes/', output: 'server', }); - await fixture.build(); + await fixture.build({}); }); it('build successful', async () => { diff --git a/packages/integrations/vercel/test/static-assets.test.js b/packages/integrations/vercel/test/static-assets.test.ts similarity index 74% rename from packages/integrations/vercel/test/static-assets.test.js rename to packages/integrations/vercel/test/static-assets.test.ts index 8e8b18c8e769..3d5578f3cb86 100644 --- a/packages/integrations/vercel/test/static-assets.test.js +++ b/packages/integrations/vercel/test/static-assets.test.ts @@ -1,14 +1,26 @@ import assert from 'node:assert/strict'; import { describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { + type Fixture, + type AstroInlineConfig, + loadFixture, + getVercelConfig, +} from './test-utils.ts'; describe('Static Assets', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; const VALID_CACHE_CONTROL = 'public, max-age=31536000, immutable'; - async function build({ adapter, assets, output }) { + async function build({ + adapter, + assets, + output, + }: { + adapter?: AstroInlineConfig['adapter']; + assets?: string; + output?: AstroInlineConfig['output']; + }) { fixture = await loadFixture({ root: './fixtures/static-assets/', output, @@ -17,27 +29,20 @@ describe('Static Assets', () => { assets, }, }); - await fixture.build(); - } - - async function getConfig() { - const json = await fixture.readFile('../.vercel/output/config.json'); - const config = JSON.parse(json); - - return config; + await fixture.build({}); } async function getAssets() { return fixture.config.build.assets; } - async function checkValidCacheControl(assets) { - const config = await getConfig(); + async function checkValidCacheControl(assets?: string) { + const config = await getVercelConfig(fixture); 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); + assert.equal(route!.headers['cache-control'], VALID_CACHE_CONTROL); + assert.equal(route!.continue, true); } describe('static adapter', () => { diff --git a/packages/integrations/vercel/test/static-headers.test.js b/packages/integrations/vercel/test/static-headers.test.ts similarity index 70% rename from packages/integrations/vercel/test/static-headers.test.js rename to packages/integrations/vercel/test/static-headers.test.ts index 26fee84a4a09..9074353efccd 100644 --- a/packages/integrations/vercel/test/static-headers.test.js +++ b/packages/integrations/vercel/test/static-headers.test.ts @@ -1,22 +1,22 @@ import * as assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture, getVercelConfig } from './test-utils.ts'; describe('Static headers', () => { - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/static-headers', }); - await fixture.build(); + await fixture.build({}); }); it('CSP headers are added when CSP is enabled', async () => { - const config = JSON.parse(await fixture.readFile('../.vercel/output/config.json')); + const config = await getVercelConfig(fixture); const routes = config.routes; - const headers = routes.find((x) => x.src === '/').headers; + const headers = routes.find((x) => x.src === '/')!.headers; assert.ok(headers['content-security-policy'], 'the index must have CSP headers'); assert.ok( diff --git a/packages/integrations/vercel/test/static.test.js b/packages/integrations/vercel/test/static.test.ts similarity index 79% rename from packages/integrations/vercel/test/static.test.js rename to packages/integrations/vercel/test/static.test.ts index 8702cf52d8db..bf86d679046d 100644 --- a/packages/integrations/vercel/test/static.test.js +++ b/packages/integrations/vercel/test/static.test.ts @@ -1,16 +1,15 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; describe('static routing', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/static/', }); - await fixture.build(); + await fixture.build({}); }); it('falls back to 404.html', async () => { diff --git a/packages/integrations/vercel/test/streaming.test.js b/packages/integrations/vercel/test/streaming.test.ts similarity index 77% rename from packages/integrations/vercel/test/streaming.test.js rename to packages/integrations/vercel/test/streaming.test.ts index 1e4b0f111e05..cd57ec07d272 100644 --- a/packages/integrations/vercel/test/streaming.test.js +++ b/packages/integrations/vercel/test/streaming.test.ts @@ -1,16 +1,15 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; describe('streaming', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/streaming/', }); - await fixture.build(); + await fixture.build({}); }); it('makes it to vercel function configuration', async () => { diff --git a/packages/integrations/vercel/test/test-utils.js b/packages/integrations/vercel/test/test-utils.js deleted file mode 100644 index 8e70e9a1c82a..000000000000 --- a/packages/integrations/vercel/test/test-utils.js +++ /dev/null @@ -1,8 +0,0 @@ -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/test-utils.ts b/packages/integrations/vercel/test/test-utils.ts new file mode 100644 index 000000000000..06cad424e9aa --- /dev/null +++ b/packages/integrations/vercel/test/test-utils.ts @@ -0,0 +1,32 @@ +import { + loadFixture as baseLoadFixture, + type Fixture, + type DevServer, + type AstroInlineConfig, +} from '../../../astro/test/test-utils.js'; + +export type { Fixture, DevServer, AstroInlineConfig }; + +export interface VercelOutputConfig { + version: number; + routes: Array<{ + src: string; + dest: string; + status: number; + headers: Record; + continue: boolean; + handle: string; + }>; +} + +export async function getVercelConfig(fixture: Fixture): Promise { + const json = await fixture.readFile('../.vercel/output/config.json'); + return JSON.parse(json); +} + +export function loadFixture(config: AstroInlineConfig) { + if (config?.root) { + config.root = new URL(config.root as string, import.meta.url).toString(); + } + return baseLoadFixture(config); +} diff --git a/packages/integrations/vercel/test/web-analytics.test.js b/packages/integrations/vercel/test/web-analytics.test.ts similarity index 83% rename from packages/integrations/vercel/test/web-analytics.test.js rename to packages/integrations/vercel/test/web-analytics.test.ts index d5056d0acb90..cd85327b56ff 100644 --- a/packages/integrations/vercel/test/web-analytics.test.js +++ b/packages/integrations/vercel/test/web-analytics.test.ts @@ -1,18 +1,17 @@ import assert from 'node:assert/strict'; import { before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; +import { type Fixture, loadFixture } from './test-utils.ts'; describe('Vercel Web Analytics', () => { describe('output: static', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; + let fixture: Fixture; before(async () => { fixture = await loadFixture({ root: './fixtures/with-web-analytics-enabled/output-as-static/', output: 'static', }); - await fixture.build(); + await fixture.build({}); }); it('ensures that Vercel Web Analytics is present in the header', async () => { diff --git a/packages/integrations/vercel/tsconfig.test.json b/packages/integrations/vercel/tsconfig.test.json new file mode 100644 index 000000000000..c2f7d8eabd2b --- /dev/null +++ b/packages/integrations/vercel/tsconfig.test.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../tsconfig.base.json", + "include": ["test/**/*.ts"], + "exclude": ["test/fixtures/**"], + "compilerOptions": { + "noEmit": true, + "allowJs": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "rewriteRelativeImportExtensions": true, + "rootDir": "." + }, + "references": [{ "path": "../../astro/tsconfig.test.json" }] +}