From e6ca6fc1a4ffbebe6fa5bce1130725ce9494b9dd Mon Sep 17 00:00:00 2001 From: Ritwij Aryan Parmar Date: Wed, 17 Jun 2026 14:41:19 -0400 Subject: [PATCH] Fix update check for catalog protocol deps --- packages/cli-v3/src/commands/update.test.ts | 73 +++++++++++++ packages/cli-v3/src/commands/update.ts | 110 ++++++++++++-------- 2 files changed, 137 insertions(+), 46 deletions(-) create mode 100644 packages/cli-v3/src/commands/update.test.ts diff --git a/packages/cli-v3/src/commands/update.test.ts b/packages/cli-v3/src/commands/update.test.ts new file mode 100644 index 0000000000..e8206836d2 --- /dev/null +++ b/packages/cli-v3/src/commands/update.test.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from "vitest"; +import { getTriggerDependencies, getVersionMismatches, type Dependency } from "./update.js"; + +describe("update command dependency checks", () => { + it("skips unresolved package-manager protocol specifiers", async () => { + const deps = await getTriggerDependencies( + { + dependencies: { + "@trigger.dev/sdk": "catalog:", + "@trigger.dev/core": "workspace:4.5.0", + "@trigger.dev/build": "file:../build", + react: "^19.0.0", + }, + devDependencies: { + "@trigger.dev/eslint-plugin": "link:../eslint-plugin", + }, + }, + "/tmp/trigger-catalog-repro/package.json" + ); + + expect(deps).toEqual([]); + }); + + it("keeps normal trigger dependencies for version mismatch checks", async () => { + const deps = await getTriggerDependencies( + { + dependencies: { + "@trigger.dev/sdk": "4.4.6", + }, + }, + "/tmp/trigger-version-repro/package.json" + ); + + expect(deps).toEqual([ + { + type: "dependencies", + name: "@trigger.dev/sdk", + version: "4.4.6", + }, + ]); + }); + + it("does not throw when an invalid specifier reaches downgrade detection", () => { + const deps: Dependency[] = [ + { + type: "dependencies", + name: "@trigger.dev/sdk", + version: "catalog:", + }, + ]; + + expect(() => getVersionMismatches(deps, "4.5.0")).not.toThrow(); + expect(getVersionMismatches(deps, "4.5.0")).toEqual({ + mismatches: deps, + isDowngrade: false, + }); + }); + + it("still detects downgrade prompts for valid semver ranges", () => { + const deps: Dependency[] = [ + { + type: "dependencies", + name: "@trigger.dev/sdk", + version: "^5.0.0", + }, + ]; + + expect(getVersionMismatches(deps, "4.5.0")).toEqual({ + mismatches: deps, + isDowngrade: true, + }); + }); +}); diff --git a/packages/cli-v3/src/commands/update.ts b/packages/cli-v3/src/commands/update.ts index b7df5837f2..ce92488907 100644 --- a/packages/cli-v3/src/commands/update.ts +++ b/packages/cli-v3/src/commands/update.ts @@ -42,6 +42,7 @@ export function configureUpdateCommand(program: Command) { } const triggerPackageFilter = /^@trigger\.dev/; +const packageManagerProtocolFilter = /^(catalog|workspace|file|link|portal|patch):/; export async function updateCommand(dir: string, options: UpdateCommandOptions) { await updateTriggerPackages(dir, options, false); @@ -111,45 +112,6 @@ export async function updateTriggerPackages( logger.debug("Resolved trigger deps", { triggerDependencies }); - function getVersionMismatches( - deps: Dependency[], - targetVersion: string - ): { - mismatches: Dependency[]; - isDowngrade: boolean; - } { - logger.debug("Checking for version mismatches", { deps, targetVersion }); - - const mismatches: Dependency[] = []; - - for (const dep of deps) { - if ( - dep.version === targetVersion || - dep.version.startsWith("https://pkg.pr.new") || - dep.version.startsWith("0.0.0") - ) { - continue; - } - - mismatches.push(dep); - } - - const isDowngrade = mismatches.some((dep) => { - const depMinVersion = semver.minVersion(dep.version); - - if (!depMinVersion) { - return false; - } - - return semver.gt(depMinVersion, targetVersion); - }); - - return { - mismatches, - isDowngrade, - }; - } - const { mismatches, isDowngrade } = getVersionMismatches(triggerDependencies, cliVersion); logger.debug("Version mismatches", { mismatches, isDowngrade }); @@ -309,13 +271,59 @@ export async function updateTriggerPackages( return hasOutput; } -type Dependency = { +export type Dependency = { type: "dependencies" | "devDependencies"; name: string; version: string; }; -async function getTriggerDependencies( +export function getVersionMismatches( + deps: Dependency[], + targetVersion: string +): { + mismatches: Dependency[]; + isDowngrade: boolean; +} { + logger.debug("Checking for version mismatches", { deps, targetVersion }); + + const mismatches: Dependency[] = []; + + for (const dep of deps) { + if ( + dep.version === targetVersion || + dep.version.startsWith("https://pkg.pr.new") || + dep.version.startsWith("0.0.0") + ) { + continue; + } + + mismatches.push(dep); + } + + const isDowngrade = mismatches.some((dep) => { + if (!semver.validRange(dep.version)) { + logger.debug("Skipping downgrade check for non-semver dependency specifier", { + dep, + }); + return false; + } + + const depMinVersion = semver.minVersion(dep.version); + + if (!depMinVersion) { + return false; + } + + return semver.gt(depMinVersion, targetVersion); + }); + + return { + mismatches, + isDowngrade, + }; +} + +export async function getTriggerDependencies( packageJson: PackageJson, packageJsonPath: string ): Promise { @@ -327,10 +335,6 @@ async function getTriggerDependencies( continue; } - if (version.startsWith("workspace")) { - continue; - } - if (!triggerPackageFilter.test(name)) { continue; } @@ -343,7 +347,21 @@ async function getTriggerDependencies( const $version = await tryResolveTriggerPackageVersion(name, dirname(packageJsonPath)); - deps.push({ type, name, version: $version ?? version }); + if ($version) { + deps.push({ type, name, version: $version }); + continue; + } + + if (packageManagerProtocolFilter.test(version)) { + logger.debug("Skipping unresolved package-manager dependency specifier", { + type, + name, + version, + }); + continue; + } + + deps.push({ type, name, version }); } }