Skip to content

Commit 979f5f8

Browse files
committed
Merge branch 'main' of https://github.com/rishi-raj-jain/trigger.dev into rishi-raj-jain-main
# Conflicts: # pnpm-lock.yaml
2 parents fef1670 + 4b64c2d commit 979f5f8

File tree

4 files changed

+117
-1
lines changed

4 files changed

+117
-1
lines changed

.changeset/swift-eagles-float.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@trigger.dev/cli": patch
3+
---
4+
5+
fix: Add an update sub-command the @trigger.dev/cli that updates all @trigger.dev/* packages

packages/cli/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
"trigger-cli": "./dist/index.js"
3636
},
3737
"devDependencies": {
38-
"@trigger.dev/tsconfig": "workspace:*",
3938
"@gmrchk/cli-testing-library": "^0.1.2",
39+
"@trigger.dev/tsconfig": "workspace:*",
4040
"@types/gradient-string": "^1.1.2",
4141
"@types/inquirer": "^9.0.3",
4242
"@types/jest": "^29.5.3",
@@ -71,6 +71,7 @@
7171
"nanoid": "^4.0.2",
7272
"ngrok": "5.0.0-beta.2",
7373
"node-fetch": "^3.3.0",
74+
"npm-check-updates": "^16.12.2",
7475
"openai": "^3.3.0",
7576
"ora": "^6.1.2",
7677
"path-to-regexp": "^6.2.1",

packages/cli/src/cli/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { initCommand } from "../commands/init";
88
import { CLOUD_TRIGGER_URL, COMMAND_NAME } from "../consts";
99
import { telemetryClient } from "../telemetry/telemetry";
1010
import { getVersion } from "../utils/getVersion";
11+
import { updateCommand } from "../commands/update";
1112

1213
export const program = new Command();
1314

@@ -80,6 +81,14 @@ program
8081
await createIntegrationCommand(path, options);
8182
});
8283

84+
program
85+
.command("update")
86+
.description("Updates all @trigger.dev/* packages to their latest compatible versions")
87+
.argument("[path]", "The path to the directory that contains the package.json file", ".")
88+
.action(async (path) => {
89+
await updateCommand(path);
90+
});
91+
8392
program
8493
.command("whoami")
8594
.description("display the current logged in user and project details")

packages/cli/src/commands/update.ts

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import path from "path";
2+
import inquirer from "inquirer";
3+
import { run, RunOptions } from "npm-check-updates";
4+
import { installDependencies } from "../utils/installDependencies.js";
5+
import { readJSONFileSync, writeJSONFile } from "../utils/fileSystem.js";
6+
7+
export async function updateCommand(projectPath: string) {
8+
const triggerDevPackage = "@trigger.dev";
9+
const packageJSONPath = path.join(projectPath, "package.json")
10+
const packageData = readJSONFileSync(packageJSONPath);
11+
12+
if (!packageData) {
13+
return;
14+
}
15+
16+
const packageMaps: { [k: string]: { type: string; version: string } } = {};
17+
const packageDependencies = packageData.dependencies || {};
18+
const packageDevDependencies = packageData.devDependencies || {};
19+
Object.keys(packageDependencies).forEach((i) => {
20+
packageMaps[i] = { type: "dependencies", version: packageDependencies[i] };
21+
});
22+
Object.keys(packageDevDependencies).forEach((i) => {
23+
packageMaps[i] = {
24+
type: "devDependencies",
25+
version: packageDevDependencies[i],
26+
};
27+
});
28+
29+
// Use npm-check-updates to get updated dependency versions
30+
const ncuOptions: RunOptions = {
31+
packageData,
32+
upgrade: true,
33+
jsonUpgraded: true,
34+
};
35+
36+
// Can either give a json like package.json or just with deps and their new versions
37+
const updatedDependencies: { [k: string]: any } | void = await run(ncuOptions);
38+
39+
if (!updatedDependencies) return;
40+
41+
const ifUpdatedDependenciesIsPackageJSON =
42+
updatedDependencies.hasOwnProperty("dependencies") ||
43+
updatedDependencies.hasOwnProperty("devDependencies");
44+
45+
const dependencies = updatedDependencies.dependencies || {};
46+
const devDependencies = updatedDependencies.devDependencies || {};
47+
48+
const allDependencies = ifUpdatedDependenciesIsPackageJSON
49+
? Object.keys({ ...dependencies, ...devDependencies })
50+
: Object.keys(updatedDependencies);
51+
52+
const triggerPackages = allDependencies.filter((pkg) => pkg.startsWith(triggerDevPackage));
53+
54+
// If there are no @trigger.dev packages
55+
if (triggerPackages.length === 0) {
56+
console.log("No @trigger.dev/* packages found in package.json.");
57+
return;
58+
}
59+
60+
// Filter the packages with null and what don't match what
61+
// they are installed with so that they can be updated
62+
const packagesToUpdate = triggerPackages.filter((pkg: string) => updatedDependencies[pkg]);
63+
64+
// If no packages require any updation
65+
if (packagesToUpdate.length === 0) {
66+
console.log("All @trigger.dev/* packages are up to date.");
67+
return;
68+
}
69+
70+
// Inform the user of the dependencies that can be updated
71+
console.log("\nNewer versions found for the following packages:");
72+
console.table(
73+
packagesToUpdate.map((i) => ({
74+
name: i,
75+
old: packageMaps[i]?.version,
76+
new: updatedDependencies[i],
77+
}))
78+
);
79+
80+
// Ask the user if they want to update the dependencies
81+
const { confirm } = await inquirer.prompt({
82+
type: "confirm",
83+
name: "confirm",
84+
message: "Do you want to update these packages in package.json and re-install dependencies?",
85+
});
86+
87+
if (confirm) {
88+
const newPackageJSON = packageData;
89+
packagesToUpdate.forEach((packageName) => {
90+
const tmp = packageMaps[packageName];
91+
if (tmp) {
92+
newPackageJSON[tmp.type][packageName] = updatedDependencies[packageName];
93+
}
94+
});
95+
await writeJSONFile(packageJSONPath, newPackageJSON);
96+
console.log("package.json updated. Reinstalling dependencies...");
97+
await installDependencies(projectPath);
98+
} else {
99+
console.log("Operation canceled. No changes were made.");
100+
}
101+
}

0 commit comments

Comments
 (0)