diff --git a/.changeset/giant-sites-relate.md b/.changeset/giant-sites-relate.md new file mode 100644 index 000000000000..077917b0d8ab --- /dev/null +++ b/.changeset/giant-sites-relate.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': minor +--- + +feat: Node 24 support diff --git a/packages/adapter-vercel/index.d.ts b/packages/adapter-vercel/index.d.ts index 8d37ce4cc409..c4ea25f7c4a2 100644 --- a/packages/adapter-vercel/index.d.ts +++ b/packages/adapter-vercel/index.d.ts @@ -6,7 +6,7 @@ export default function plugin(config?: Config): Adapter; export interface ServerlessConfig { /** - * Whether to use [Edge Functions](https://vercel.com/docs/concepts/functions/edge-functions) (`'edge'`) or [Serverless Functions](https://vercel.com/docs/concepts/functions/serverless-functions) (`'nodejs18.x'`, `'nodejs20.x'` etc). + * Whether to use [Edge Functions](https://vercel.com/docs/concepts/functions/edge-functions) (`'edge'`) or [Serverless Functions](https://vercel.com/docs/concepts/functions/serverless-functions) (`'nodejs22.x'`, `'nodejs24.x'` etc). * @default Same as the build environment */ runtime?: Exclude; @@ -78,7 +78,7 @@ type ImagesConfig = { /** @deprecated */ export interface EdgeConfig { /** - * Whether to use [Edge Functions](https://vercel.com/docs/concepts/functions/edge-functions) (`'edge'`) or [Serverless Functions](https://vercel.com/docs/concepts/functions/serverless-functions) (`'nodejs18.x'`, `'nodejs20.x'` etc). + * Whether to use [Edge Functions](https://vercel.com/docs/concepts/functions/edge-functions) (`'edge'`) or [Serverless Functions](https://vercel.com/docs/concepts/functions/serverless-functions) (`'nodejs22.x'`, `'nodejs24.x'` etc). */ runtime?: 'edge'; /** diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index b001407c6560..f54765d7536b 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -285,7 +285,7 @@ const plugin = function (defaults = {}) { if (runtime === 'edge') { throw new Error( - `${directory}: Routes using \`isr\` must use a Node.js or Bun runtime (for example 'nodejs22.x' or 'experimental_bun1.x')` + `${directory}: Routes using \`isr\` must use a Node.js or Bun runtime (for example 'nodejs24.x' or 'experimental_bun1.x')` ); } diff --git a/packages/adapter-vercel/utils.js b/packages/adapter-vercel/utils.js index 983b30bbb5be..d7723e1a2af9 100644 --- a/packages/adapter-vercel/utils.js +++ b/packages/adapter-vercel/utils.js @@ -120,6 +120,8 @@ export function resolve_runtime(default_key, override_key) { return key; } +const valid_node_versions = [20, 22, 24]; + /** @returns {RuntimeKey} */ function get_default_runtime() { // TODO may someday need to auto-detect Bun, but this will be complicated because you may want to run your build @@ -127,16 +129,22 @@ function get_default_runtime() { // to tell us what the bun configuration is. const major = Number(process.version.slice(1).split('.')[0]); - if (major !== 20 && major !== 22) { + if (!valid_node_versions.includes(major)) { throw new Error( - `Unsupported Node.js version: ${process.version}. Please use Node 20 or 22 to build your project, or explicitly specify a runtime in your adapter configuration.` + `Unsupported Node.js version: ${process.version}. Please use Node ${valid_node_versions.slice(0, -1).join(', ')} or ${valid_node_versions.at(-1)} to build your project, or explicitly specify a runtime in your adapter configuration.` ); } - return `nodejs${major}.x`; + return `nodejs${/** @type {20 | 22 | 24} */ (major)}.x`; } -const valid_runtimes = /** @type {const} */ (['nodejs20.x', 'nodejs22.x', 'bun1.x', 'edge']); +const valid_runtimes = /** @type {const} */ ([ + 'nodejs20.x', + 'nodejs22.x', + 'nodejs24.x', + 'bun1.x', + 'edge' +]); /** * @param {string} key