diff --git a/packages/integrations/vercel/src/edge/adapter.ts b/packages/integrations/vercel/src/edge/adapter.ts index c11d348286..3c2d39116e 100644 --- a/packages/integrations/vercel/src/edge/adapter.ts +++ b/packages/integrations/vercel/src/edge/adapter.ts @@ -80,7 +80,7 @@ export default function vercelEdge({ if (config.output === 'static') { throw new Error(` - [@astrojs/vercel] \`output: "server"\` is required to use the edge adapter. + [@astrojs/vercel] \`output: "server"\` or \`output: "hybrid"\` is required to use the edge adapter. `); } diff --git a/packages/integrations/vercel/src/lib/prerender.ts b/packages/integrations/vercel/src/lib/prerender.ts new file mode 100644 index 0000000000..9265c80bf0 --- /dev/null +++ b/packages/integrations/vercel/src/lib/prerender.ts @@ -0,0 +1,5 @@ +import type { AstroConfig } from 'astro'; + +export function isHybridOutput(config: AstroConfig) { + return config.experimental.hybridOutput && config.output === 'hybrid'; +} diff --git a/packages/integrations/vercel/src/serverless/adapter.ts b/packages/integrations/vercel/src/serverless/adapter.ts index 755f088916..8a18707702 100644 --- a/packages/integrations/vercel/src/serverless/adapter.ts +++ b/packages/integrations/vercel/src/serverless/adapter.ts @@ -75,7 +75,7 @@ export default function vercelServerless({ if (config.output === 'static') { throw new Error(` - [@astrojs/vercel] \`output: "server"\` is required to use the serverless adapter. + [@astrojs/vercel] \`output: "server"\` or \`output: "hybrid"\` is required to use the serverless adapter. `); } diff --git a/packages/integrations/vercel/src/static/adapter.ts b/packages/integrations/vercel/src/static/adapter.ts index cab0b3fc04..a7b7e5f94d 100644 --- a/packages/integrations/vercel/src/static/adapter.ts +++ b/packages/integrations/vercel/src/static/adapter.ts @@ -9,6 +9,7 @@ import { import { exposeEnv } from '../lib/env.js'; import { emptyDir, getVercelOutput, writeJson } from '../lib/fs.js'; import { getRedirects } from '../lib/redirects.js'; +import { isHybridOutput } from '../lib/prerender.js'; const PACKAGE_NAME = '@astrojs/vercel/static'; @@ -54,7 +55,7 @@ export default function vercelStatic({ setAdapter(getAdapter()); _config = config; - if (config.output === 'server') { + if (config.output === 'server' || isHybridOutput(config)) { throw new Error(`${PACKAGE_NAME} should be used with output: 'static'`); } }, 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 index 0752535505..b6b833e535 100644 --- a/packages/integrations/vercel/test/fixtures/serverless-prerender/src/pages/index.astro +++ b/packages/integrations/vercel/test/fixtures/serverless-prerender/src/pages/index.astro @@ -1,5 +1,5 @@ --- -export const prerender = true +export const prerender = import.meta.env.PRERENDER; --- diff --git a/packages/integrations/vercel/test/serverless-prerender.test.js b/packages/integrations/vercel/test/serverless-prerender.test.js index 491c6d0bdb..ec9887bdb6 100644 --- a/packages/integrations/vercel/test/serverless-prerender.test.js +++ b/packages/integrations/vercel/test/serverless-prerender.test.js @@ -6,6 +6,7 @@ describe('Serverless prerender', () => { let fixture; before(async () => { + process.env.PRERENDER = true; fixture = await loadFixture({ root: './fixtures/serverless-prerender/', }); @@ -16,3 +17,24 @@ describe('Serverless prerender', () => { expect(await fixture.readFile('../.vercel/output/static/index.html')).to.be.ok; }); }); + +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', + experimental:{ + hybridOutput: true + } + }); + }); + + it('build successful', async () => { + await fixture.build(); + expect(await fixture.readFile('../.vercel/output/static/index.html')).to.be.ok; + }); +});