diff options
author | 2023-07-05 16:45:58 +0100 | |
---|---|---|
committer | 2023-07-05 16:45:58 +0100 | |
commit | 9e5fafa2b25b5128084c7072aa282642fcfbb14b (patch) | |
tree | 80e21475f93da004a5eae87e3a0d2d6a4f22cce6 /packages/integrations/vercel/src/serverless/adapter.ts | |
parent | cfd5b2b785ad277b82c380fdf68ead0475ddb42f (diff) | |
download | astro-9e5fafa2b25b5128084c7072aa282642fcfbb14b.tar.gz astro-9e5fafa2b25b5128084c7072aa282642fcfbb14b.tar.zst astro-9e5fafa2b25b5128084c7072aa282642fcfbb14b.zip |
feat: vercel edge middleware support (#7532)
Co-authored-by: Bjorn Lu <bjornlu.dev@gmail.com>
Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
Diffstat (limited to 'packages/integrations/vercel/src/serverless/adapter.ts')
-rw-r--r-- | packages/integrations/vercel/src/serverless/adapter.ts | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/packages/integrations/vercel/src/serverless/adapter.ts b/packages/integrations/vercel/src/serverless/adapter.ts index 007fb8537..9d799a7bf 100644 --- a/packages/integrations/vercel/src/serverless/adapter.ts +++ b/packages/integrations/vercel/src/serverless/adapter.ts @@ -13,8 +13,12 @@ import { exposeEnv } from '../lib/env.js'; import { getVercelOutput, removeDir, writeJson } from '../lib/fs.js'; import { copyDependenciesToFunction } from '../lib/nft.js'; import { getRedirects } from '../lib/redirects.js'; +import { generateEdgeMiddleware } from './middleware.js'; +import { fileURLToPath } from 'node:url'; const PACKAGE_NAME = '@astrojs/vercel/serverless'; +export const ASTRO_LOCALS_HEADER = 'x-astro-locals'; +export const VERCEL_EDGE_MIDDLEWARE_FILE = 'vercel-edge-middleware'; function getAdapter(): AstroAdapter { return { @@ -70,6 +74,8 @@ export default function vercelServerless({ }); } + const filesToInclude = includeFiles?.map((file) => new URL(file, _config.root)) || []; + return { name: PACKAGE_NAME, hooks: { @@ -106,17 +112,32 @@ export default function vercelServerless({ `); } }, - 'astro:build:ssr': async ({ entryPoints }) => { + + 'astro:build:ssr': async ({ entryPoints, middlewareEntryPoint }) => { _entryPoints = entryPoints; + if (middlewareEntryPoint) { + const outPath = fileURLToPath(buildTempFolder); + const vercelEdgeMiddlewareHandlerPath = new URL( + VERCEL_EDGE_MIDDLEWARE_FILE, + _config.srcDir + ); + const bundledMiddlewarePath = await generateEdgeMiddleware( + middlewareEntryPoint, + outPath, + vercelEdgeMiddlewareHandlerPath + ); + // let's tell the adapter that we need to save this file + filesToInclude.push(bundledMiddlewarePath); + } }, + 'astro:build:done': async ({ routes }) => { // Merge any includes from `vite.assetsInclude - const inc = includeFiles?.map((file) => new URL(file, _config.root)) || []; if (_config.vite.assetsInclude) { const mergeGlobbedIncludes = (globPattern: unknown) => { if (typeof globPattern === 'string') { const entries = glob.sync(globPattern).map((p) => pathToFileURL(p)); - inc.push(...entries); + filesToInclude.push(...entries); } else if (Array.isArray(globPattern)) { for (const pattern of globPattern) { mergeGlobbedIncludes(pattern); @@ -133,14 +154,18 @@ export default function vercelServerless({ if (_entryPoints.size) { for (const [route, entryFile] of _entryPoints) { const func = basename(entryFile.toString()).replace(/\.mjs$/, ''); - await createFunctionFolder(func, entryFile, inc); + await createFunctionFolder(func, entryFile, filesToInclude); routeDefinitions.push({ src: route.pattern.source, dest: func, }); } } else { - await createFunctionFolder('render', new URL(serverEntry, buildTempFolder), inc); + await createFunctionFolder( + 'render', + new URL(serverEntry, buildTempFolder), + filesToInclude + ); routeDefinitions.push({ src: '/.*', dest: 'render' }); } |