From b88e0356f4727d10ad4c8e6745b4f28e7d349df8 Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Tue, 30 Jun 2026 15:13:02 +0100 Subject: [PATCH] feat(runtime): add node-24/node-26, deprecate node(21), default new projects to node-24 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BuildRuntime enum: add node-24, node-26 - DEFAULT_RUNTIME: node → node-24 - buildImage.ts: repin node-22→22.23.1, add node-24/26 images, fix bun sidecar (node-20→node-22) - runtime.ts: add node-24/26 cases to all switches - config.ts: deprecation warning when runtime="node" (EOL node-21) - init.ts: scaffold node-24 as default for new projects TRI-11473 --- packages/cli-v3/src/commands/init.ts | 6 +++--- packages/cli-v3/src/config.ts | 9 ++++++++- packages/cli-v3/src/deploy/buildImage.ts | 15 ++++++++++----- packages/core/src/v3/build/runtime.ts | 10 ++++++++-- packages/core/src/v3/schemas/build.ts | 2 +- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/packages/cli-v3/src/commands/init.ts b/packages/cli-v3/src/commands/init.ts index 34b941b0556..d97b286b13d 100644 --- a/packages/cli-v3/src/commands/init.ts +++ b/packages/cli-v3/src/commands/init.ts @@ -50,7 +50,7 @@ const InitCommandOptions = CommonCommandOptions.extend({ overrideConfig: z.boolean().default(false), tag: z.string().default(cliVersion), skipPackageInstall: z.boolean().default(false), - runtime: z.string().default("node"), + runtime: z.string().default("node-24"), pkgArgs: z.string().optional(), gitRef: z.string().default("main"), javascript: z.boolean().default(false), @@ -94,8 +94,8 @@ Examples: ) .option( "-r, --runtime ", - "Which runtime to use for the project. Currently only supports node and bun", - "node" + "Which runtime to use for the project. Supported: node-24 (default, LTS), node-22, node-26, bun", + "node-24" ) .option("--skip-package-install", "Skip installing the @trigger.dev/sdk package") .option("--override-config", "Override the existing config file if it exists") diff --git a/packages/cli-v3/src/config.ts b/packages/cli-v3/src/config.ts index 9751c4bdcba..6ecd50f4bc1 100644 --- a/packages/cli-v3/src/config.ts +++ b/packages/cli-v3/src/config.ts @@ -194,7 +194,7 @@ async function resolveConfig( ["run_engine_v2" as const].concat(config.compatibilityFlags ?? []) ); - const defaultRuntime: BuildRuntime = features.run_engine_v2 ? "node" : DEFAULT_RUNTIME; + const defaultRuntime: BuildRuntime = DEFAULT_RUNTIME; const mergedConfig = defu( { @@ -284,6 +284,13 @@ async function autoDetectDirs(workingDir: string): Promise { } function validateConfig(config: TriggerConfig, warn = true) { + if (config.runtime === "node") { + warn && + prettyWarning( + `The "node" runtime is deprecated (it used Node.js 21 which is EOL). Please migrate to "node-24" (recommended LTS) or "node-22". Update your trigger.config.ts: runtime: "node-24"` + ); + } + if (config.additionalFiles && config.additionalFiles.length > 0) { warn && prettyWarning( diff --git a/packages/cli-v3/src/deploy/buildImage.ts b/packages/cli-v3/src/deploy/buildImage.ts index abd0391fe98..071ceb48489 100644 --- a/packages/cli-v3/src/deploy/buildImage.ts +++ b/packages/cli-v3/src/deploy/buildImage.ts @@ -687,11 +687,14 @@ export type GenerateContainerfileOptions = { entrypoint: string; }; +// "node" (node-21) is deprecated. Existing configs using it will still work but +// new projects default to node-24. Remove in a future major version. const BASE_IMAGE: Record = { - bun: "imbios/bun-node:1.3.3-20-slim@sha256:59d84856a7e31eec83afedadb542f7306f672343b8b265c70d733404a6e8834b", - node: "node:21.7.3-bookworm-slim@sha256:dfc05dee209a1d7adf2ef189bd97396daad4e97c6eaa85778d6f75205ba1b0fb", - "node-22": - "node:22.16.0-bookworm-slim@sha256:048ed02c5fd52e86fda6fbd2f6a76cf0d4492fd6c6fee9e2c463ed5108da0e34", + bun: "imbios/bun-node:1.1.43-22-slim", + node: "node:22.23.1-bookworm-slim", + "node-22": "node:22.23.1-bookworm-slim", + "node-24": "node:24.18.0-bookworm-slim", + "node-26": "node:26.4.0-bookworm-slim", }; const DEFAULT_PACKAGES = ["busybox", "ca-certificates", "dumb-init", "git", "openssl"]; @@ -699,7 +702,9 @@ const DEFAULT_PACKAGES = ["busybox", "ca-certificates", "dumb-init", "git", "ope export async function generateContainerfile(options: GenerateContainerfileOptions) { switch (options.runtime) { case "node": - case "node-22": { + case "node-22": + case "node-24": + case "node-26": { return await generateNodeContainerfile(options); } case "bun": { diff --git a/packages/core/src/v3/build/runtime.ts b/packages/core/src/v3/build/runtime.ts index 1618a50ffd4..7230a33d3b2 100644 --- a/packages/core/src/v3/build/runtime.ts +++ b/packages/core/src/v3/build/runtime.ts @@ -4,12 +4,14 @@ import { BuildRuntime } from "../schemas/build.js"; import { dedupFlags } from "./flags.js"; import { homedir } from "node:os"; -export const DEFAULT_RUNTIME = "node" satisfies BuildRuntime; +export const DEFAULT_RUNTIME = "node-24" satisfies BuildRuntime; export function binaryForRuntime(runtime: BuildRuntime): string { switch (runtime) { case "node": case "node-22": + case "node-24": + case "node-26": return "node"; case "bun": return "bun"; @@ -22,6 +24,8 @@ export function execPathForRuntime(runtime: BuildRuntime): string { switch (runtime) { case "node": case "node-22": + case "node-24": + case "node-26": return process.execPath; case "bun": if (typeof process.env.BUN_INSTALL === "string") { @@ -50,7 +54,9 @@ export function execOptionsForRuntime( ): string { switch (runtime) { case "node": - case "node-22": { + case "node-22": + case "node-24": + case "node-26": { const importEntryPoint = options.loaderEntryPoint ? `--import=${pathToFileURL(options.loaderEntryPoint).href}` : undefined; diff --git a/packages/core/src/v3/schemas/build.ts b/packages/core/src/v3/schemas/build.ts index eeeaba73116..398f515a233 100644 --- a/packages/core/src/v3/schemas/build.ts +++ b/packages/core/src/v3/schemas/build.ts @@ -13,7 +13,7 @@ export const BuildTarget = z.enum(["dev", "deploy", "unmanaged"]); export type BuildTarget = z.infer; -export const BuildRuntime = z.enum(["node", "node-22", "bun"]); +export const BuildRuntime = z.enum(["node", "node-22", "node-24", "node-26", "bun"]); export type BuildRuntime = z.infer;