Added a script to automatically update template repo @trigger.dev packages instead of having to do it manually

This commit is contained in:
Eric Allam
2023-03-02 15:34:53 +00:00
parent 1789d9d215
commit 408bd6ddc8
3 changed files with 119 additions and 3 deletions
+113
View File
@@ -0,0 +1,113 @@
const { exec } = require("child_process");
const fs = require("fs");
const path = require("path");
const fetch = require("node-fetch");
const templatesDir = process.argv[2];
if (!templatesDir) {
console.error("Please provide a path to the templates directory");
process.exit(1);
}
async function updateTemplate(templateName) {
const templateDir = path.join(templatesDir, templateName);
if (fs.statSync(templateDir).isDirectory()) {
console.log(`Updating dependencies for template '${templateName}'`);
// Make sure we're on the main branch and there are no uncommitted changes
await execAsync(`cd ${templateDir} && git checkout main`);
// Make sure there are no uncommitted changes
const preStatus = await execAsync(`cd ${templateDir} && git status`);
if (!preStatus.includes("nothing to commit")) {
console.error(
`There are uncommitted changes in template '${templateName}'`
);
return;
}
// Make sure we're up to date with the remote
await execAsync(`cd ${templateDir} && git pull origin main`);
// Find all the dependencies that start with @trigger.dev/
const packageJson = JSON.parse(
fs.readFileSync(path.join(templateDir, "package.json"))
);
const dependencies = Object.keys(packageJson.dependencies).filter((dep) =>
dep.startsWith("@trigger.dev/")
);
if (!dependencies) {
console.error(`No dependencies defined for template '${templateName}'`);
return;
}
const npmInstallCommand = `npm install ${dependencies
.map((dep) => `${dep}@latest`)
.join(" ")}`;
console.log(`Attempting ${npmInstallCommand}`);
await execAsync(
`cd ${templateDir} && npm install ${dependencies
.map((dep) => `${dep}@latest`)
.join(" ")}`
);
// Check if there are any changes
const status = await execAsync(`cd ${templateDir} && git status`);
if (!status.includes("modified:")) {
console.log(`No changes for template '${templateName}'`);
return;
}
console.log(`Changes for template '${templateName}':`, status);
// Create a commit
await execAsync(
`cd ${templateDir} && git add package.json package-lock.json && git commit -m "[triggerbot] Updated packages ${dependencies.join(
", "
)}"`
);
// Push to remote
await execAsync(`cd ${templateDir} && git push`);
console.log(`Updated dependencies for template '${templateName}'`);
} else {
console.log(`Skipping '${templateName}'`);
}
}
async function execAsync(command) {
return new Promise((resolve, reject) => {
exec(command, (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
resolve(stdout);
}
});
});
}
async function main() {
// Make a JSON request to https://app.trigger.dev/api/v1/templates and parse the response as an array of templates
const templates = await fetch(
"https://app.trigger.dev/api/v1/templates"
).then((res) => res.json());
for (const template of templates) {
try {
await updateTemplate(template.slug);
} catch (error) {
console.log(`Failed to update template '${template}'`, error);
}
}
}
main().catch(console.error);