UNPKG

@scaleway/changesets-renovate

Version:

Automatically create changesets for Renovate and pnpm catalogs

82 lines (81 loc) 3.21 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"; //#region src/git-utils.ts var { globSync } = fg; /** * Load catalog from pnpm workspace file at specific git revision * @param revision Git revision to load file from (default: HEAD) * @param filePath Path to the pnpm workspace file (default: pnpm-workspace.yaml) * @returns Catalog object or empty object if not found */ async function loadCatalogFromGit(revision = "HEAD", filePath = "pnpm-workspace.yaml") { try { if (!revision) return {}; return load(await simpleGit().show([`${revision}:${filePath}`]))?.catalog ?? {}; } catch { return {}; } } /** * Find changed dependencies between two git revisions of pnpm workspace * @param oldRevision The previous git revision * @param newRevision The current git revision (default: HEAD) * @param filePath Path to the pnpm workspace file (default: pnpm-workspace.yaml) * @returns Array of package names that have changed */ 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; } /** * Find packages affected by dependency changes * @param changedDeps Array of changed dependency names * @param packageJsonGlob Glob pattern to find package.json files * @returns Set of package names that are affected by the changes */ 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(); } } //#endregion export { findAffectedPackages, findChangedDependenciesFromGit, getBumpsFromGit, handleChangesetFile };