@scaleway/changesets-renovate
Version:
Automatically create changesets for Renovate and pnpm catalogs
87 lines (86 loc) • 2.66 kB
JavaScript
import { readFile } from "node:fs/promises";
import { env } from "node:process";
import fg from "fast-glob";
import { load } from "js-yaml";
import { simpleGit } from "simple-git";
const { globSync } = fg;
async function loadCatalogFromGit(revision = "HEAD", filePath = "pnpm-workspace.yaml") {
try {
if (!revision) {
return {};
}
const git = simpleGit();
const content = await git.show([`${revision}:${filePath}`]);
const parsed = load(content);
return parsed?.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,
loadCatalogFromGit
};