* 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[], )
| 331 | * file, a deleted file, or unparseable JSON. |
| 332 | */ |
| 333 | async 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. */ |
| 378 | function releaseTriggeringDevDepsChanged( |
no test coverage detected
searching dependent graphs…