UNPKG

@scaleway/changesets-renovate

Version:

Automatically create changesets for Renovate and pnpm catalogs

61 lines (60 loc) 2.34 kB
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 };