@scaleway/changesets-renovate
Version:
Automatically create changesets for Renovate and pnpm catalogs
61 lines (60 loc) • 2.34 kB
JavaScript
import { env } from "node:process";
import { simpleGit } from "simple-git";
import { readFile } from "node:fs/promises";
import fg from "fast-glob";
import { load } from "js-yaml";
var { globSync } = fg;
async function loadCatalogFromGit(revision = "HEAD", filePath = "pnpm-workspace.yaml") {
try {
if (!revision) return {};
return load(await simpleGit().show([`${revision}:${filePath}`]))?.catalog ?? {};
} catch {
return {};
}
}
async function findChangedDependenciesFromGit(oldRevision, newRevision = "HEAD", filePath = "pnpm-workspace.yaml") {
const oldCatalog = await loadCatalogFromGit(oldRevision, filePath);
const newCatalog = await loadCatalogFromGit(newRevision, filePath);
const bumps = /* @__PURE__ */ new Map();
const filtedPackage = Object.entries(newCatalog).filter(([pkg, newVersion]) => oldCatalog[pkg] && oldCatalog[pkg] !== newVersion);
for (const [pkg, newVersion] of filtedPackage) bumps.set(pkg, newVersion);
return bumps;
}
async function getBumpsFromGit(files) {
const bumps = /* @__PURE__ */ new Map();
const promises = files.map(async (file) => {
const changes = await simpleGit().show([file]);
for (const change of changes.split("\n")) if (change.startsWith("+ ")) {
const match = change.match(/"(.*?)"/g);
if (match?.[0] && match[1]) bumps.set(match[0].replace(/"/g, ""), match[1].replace(/"/g, ""));
}
});
await Promise.all(promises);
return bumps;
}
async function findAffectedPackages(changedDeps, packageJsonGlob = "packages/*/package.json") {
if (changedDeps.length === 0) return /* @__PURE__ */ new Set();
const packageJsonPaths = globSync(packageJsonGlob);
const affectedPackages = /* @__PURE__ */ new Set();
for (const pkgJsonPath of packageJsonPaths) try {
const json = JSON.parse(await readFile(pkgJsonPath, "utf8"));
const deps = {
...json.dependencies,
...json.devDependencies,
...json.peerDependencies
};
for (const dep of changedDeps) if (deps[dep]) {
affectedPackages.add(json.name);
break;
}
} catch {}
return affectedPackages;
}
async function handleChangesetFile(fileName) {
if (!env["SKIP_COMMIT"]) {
await simpleGit().add(fileName);
await simpleGit().commit(`chore: add ${fileName}`);
await simpleGit().push();
}
}
export { findAffectedPackages, findChangedDependenciesFromGit, getBumpsFromGit, handleChangesetFile };