UNPKG

@scaleway/changesets-renovate

Version:

Automatically create changesets for Renovate and pnpm catalogs

87 lines (86 loc) 2.66 kB
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 };