From 3bb190b53dd89a4951f51faa9411dc77217d7f1b Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Mon, 28 Mar 2022 15:13:14 -0300 Subject: [PATCH] Build API Routes --- packages/integrations/vercel/package.json | 5 ++-- packages/integrations/vercel/src/index.ts | 29 +++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/integrations/vercel/package.json b/packages/integrations/vercel/package.json index 31a07bc037..e93639b60d 100644 --- a/packages/integrations/vercel/package.json +++ b/packages/integrations/vercel/package.json @@ -23,8 +23,9 @@ }, "dependencies": { "@astrojs/webapi": "^0.11.0", - "@vercel/nft": "^0.18.0", - "@vercel/node": "^1.14.0" + "@vercel/node": "^1.14.0", + "esbuild": "0.14.25", + "globby": "^12.2.0" }, "devDependencies": { "astro": "workspace:*", diff --git a/packages/integrations/vercel/src/index.ts b/packages/integrations/vercel/src/index.ts index ab35b9e554..c89435ece3 100644 --- a/packages/integrations/vercel/src/index.ts +++ b/packages/integrations/vercel/src/index.ts @@ -1,30 +1,37 @@ import type { AstroIntegration, AstroConfig } from 'astro'; import fs from 'fs/promises'; import type { PathLike } from 'fs'; +import { fileURLToPath } from 'url'; +import { globby } from 'globby'; +import esbuild from 'esbuild'; export type { VercelApiHandler, VercelRequest, VercelRequestBody, VercelRequestCookies, VercelRequestQuery, VercelResponse } from '@vercel/node'; const writeJson = (path: PathLike, data: any) => fs.writeFile(path, JSON.stringify(data), { encoding: 'utf-8' }); +const ENDPOINT_GLOB = 'api/**/*.{js,ts,tsx}'; + export function vercelFunctions(): AstroIntegration { let _config: AstroConfig; let output: URL; + return { name: '@astrojs/vercel', hooks: { - 'astro:config:setup': ({ config }) => { + 'astro:config:setup': ({ config, ignorePages }) => { output = new URL('./.output/', config.projectRoot); config.dist = new URL('./static/', output); config.buildOptions.pageUrlFormat = 'directory'; + ignorePages(ENDPOINT_GLOB); }, - 'astro:config:done': async ({ config, setAdapter }) => { - // setAdapter(getAdapter(config.buildOptions.site)); + 'astro:config:done': async ({ config }) => { _config = config; }, 'astro:build:start': async () => { - await fs.rm(output, { recursive: true }); + await fs.rm(output, { recursive: true, force: true }); }, 'astro:build:done': async ({ pages }) => { + // Split pages from the rest of files await Promise.all( pages.map(async ({ pathname }) => { const origin = new URL(`./static/${pathname}index.html`, output); @@ -43,6 +50,20 @@ export function vercelFunctions(): AstroIntegration { basePath: '/', pages404: false, }); + + const endpoints = await globby([ENDPOINT_GLOB, '!_*'], { onlyFiles: true, cwd: _config.pages }); + + if (endpoints.length === 0) return; + + await esbuild.build({ + entryPoints: endpoints.map((endpoint) => new URL(endpoint, _config.pages)).map(fileURLToPath), + outdir: fileURLToPath(new URL('./server/pages/api/', output)), + outbase: fileURLToPath(new URL('./api/', _config.pages)), + bundle: true, + target: 'node14', + platform: 'node', + format: 'cjs', + }); }, }, };