From 35a0b6c8a909623d802523006cb3c65e4e70c88f Mon Sep 17 00:00:00 2001 From: Arsh <69170106+lilnasy@users.noreply.github.com> Date: Fri, 21 Jul 2023 00:09:46 +0530 Subject: [PATCH] fix(vercel): Switch to node 18 when local version is not supported (#7718) * fix(vercel): switch to node 18 when needed * fix types, reword * reorder sentences * add changeset * fix(vercel): switch to node 18 when needed * add referencce to vercel documentation --------- Co-authored-by: Nate Moore --- .changeset/gorgeous-ads-develop.md | 5 +++++ .../vercel/src/serverless/adapter.ts | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 .changeset/gorgeous-ads-develop.md diff --git a/.changeset/gorgeous-ads-develop.md b/.changeset/gorgeous-ads-develop.md new file mode 100644 index 0000000000..567ece3147 --- /dev/null +++ b/.changeset/gorgeous-ads-develop.md @@ -0,0 +1,5 @@ +--- +'@astrojs/vercel': patch +--- + +The vercel adapter now Warns when using a deprecated version of Node, and switches to 18 when using an unsupported version. diff --git a/packages/integrations/vercel/src/serverless/adapter.ts b/packages/integrations/vercel/src/serverless/adapter.ts index 456af106ff..79b831a962 100644 --- a/packages/integrations/vercel/src/serverless/adapter.ts +++ b/packages/integrations/vercel/src/serverless/adapter.ts @@ -19,6 +19,13 @@ const PACKAGE_NAME = '@astrojs/vercel/serverless'; export const ASTRO_LOCALS_HEADER = 'x-astro-locals'; export const VERCEL_EDGE_MIDDLEWARE_FILE = 'vercel-edge-middleware'; +// https://vercel.com/docs/concepts/functions/serverless-functions/runtimes/node-js#node.js-version +const SUPPORTED_NODE_VERSIONS: Record = { + 14: { status: 'deprecated', removal: new Date('August 15 2023') }, + 16: { status: 'deprecated', removal: new Date('February 6 2024') }, + 18: { status: 'current' } +} + function getAdapter(): AstroAdapter { return { name: PACKAGE_NAME, @@ -193,5 +200,17 @@ export default function vercelServerless({ function getRuntime() { const version = process.version.slice(1); // 'v16.5.0' --> '16.5.0' const major = version.split('.')[0]; // '16.5.0' --> '16' + const support = SUPPORTED_NODE_VERSIONS[major] + if (support === undefined) { + console.warn(`[${PACKAGE_NAME}] The local Node.js version (${major}) is not supported by Vercel Serverless Functions.`) + console.warn(`[${PACKAGE_NAME}] Your project will use Node.js 18 as the runtime instead.`) + console.warn(`[${PACKAGE_NAME}] Consider switching your local version to 18.`) + return 'nodejs18.x'; + } + if (support.status === 'deprecated') { + console.warn(`[${PACKAGE_NAME}] Your project is being built for Node.js ${major} as the runtime.`) + console.warn(`[${PACKAGE_NAME}] This version is deprecated by Vercel Serverless Functions, and scheduled to be disabled on ${new Intl.DateTimeFormat(undefined, { dateStyle: "long" }).format(support.removal)}.`) + console.warn(`[${PACKAGE_NAME}] Consider upgrading your local version to 18.`) + } return `nodejs${major}.x`; }