MCPcopy Create free account
hub / github.com/dmno-dev/bumpy / packageJsonAffectsRelease

Function packageJsonAffectsRelease

packages/bumpy/src/commands/check.ts:333–375  ·  view source on GitHub ↗

* Decide whether a package's `package.json` change is release-affecting — i.e. whether * a bump file should be required for it. Diffs the file against the base ref and returns * true if any top-level field changed *other* than the ignored ones (default: * `devDependencies`). A changed `devDepende

(
  rootDir: string,
  baseRef: string,
  pkgRelDir: string,
  ignoredFields: string[],
  releaseTriggeringDevDeps?: string[],
)

Source from the content-addressed store, hash-verified

331 * file, a deleted file, or unparseable JSON.
332 */
333async function packageJsonAffectsRelease(
334 rootDir: string,
335 baseRef: string,
336 pkgRelDir: string,
337 ignoredFields: string[],
338 releaseTriggeringDevDeps?: string[],
339): Promise<boolean> {
340 const relPath = pkgRelDir ? `${pkgRelDir}/package.json` : 'package.json';
341 const beforeRaw = readFileAtRef(rootDir, baseRef, relPath);
342 if (beforeRaw == null) return true; // not present at base (new package) → release-affecting
343
344 const afterPath = resolve(rootDir, relPath);
345 const afterRaw = (await exists(afterPath)) ? await readText(afterPath) : null;
346 if (afterRaw == null) return true; // removed in the working tree → be conservative
347
348 let before: Record<string, unknown>;
349 let after: Record<string, unknown>;
350 try {
351 before = JSON.parse(beforeRaw);
352 after = JSON.parse(afterRaw);
353 } catch {
354 return true; // unparseable → can't tell, so require a bump file
355 }
356
357 const ignored = new Set(ignoredFields);
358 const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
359 for (const key of keys) {
360 if (deepEqual(before[key], after[key])) continue;
361 if (!ignored.has(key)) return true; // a publish-affecting field changed
362 // The field is ignored — but a release-relevant devDependency change still affects output.
363 if (
364 key === 'devDependencies' &&
365 releaseTriggeringDevDepsChanged(
366 before.devDependencies as Record<string, string> | undefined,
367 after.devDependencies as Record<string, string> | undefined,
368 releaseTriggeringDevDeps,
369 )
370 ) {
371 return true;
372 }
373 }
374 return false;
375}
376
377/** Whether any devDependency matching `releaseTriggeringDevDeps` was added/removed/changed. */
378function releaseTriggeringDevDepsChanged(

Callers 1

findChangedPackagesFunction · 0.85

Calls 5

readFileAtRefFunction · 0.90
existsFunction · 0.90
readTextFunction · 0.90
deepEqualFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…