ci(deps): gate extension-owned root dependencies

This commit is contained in:
Peter Steinberger
2026-04-21 21:07:58 +01:00
parent b2e8b7d4bb
commit e5af4e3b5c
4 changed files with 112 additions and 2 deletions

View File

@@ -268,6 +268,23 @@ export function collectRootDependencyOwnershipAudit(params = {}) {
.toSorted((left, right) => left.depName.localeCompare(right.depName));
}
export function collectRootDependencyOwnershipCheckErrors(records) {
return records
.filter((record) => record.category === "extension_only_localizable")
.map((record) => {
const declaredInExtensions =
record.declaredInExtensions.length > 0
? `; extension declarations: ${record.declaredInExtensions.join(", ")}`
: "";
const sampleFiles =
record.sampleFiles.length > 0 ? `; sample imports: ${record.sampleFiles.join(", ")}` : "";
return (
`root dependency '${record.depName}' is extension-owned (${record.recommendation})` +
`${declaredInExtensions}${sampleFiles}`
);
});
}
function printTextReport(records) {
const grouped = new Map();
for (const record of records) {
@@ -294,7 +311,22 @@ function printTextReport(records) {
function main(argv = process.argv.slice(2)) {
const asJson = argv.includes("--json");
const check = argv.includes("--check");
const records = collectRootDependencyOwnershipAudit();
if (check) {
const errors = collectRootDependencyOwnershipCheckErrors(records);
if (errors.length > 0) {
for (const error of errors) {
console.error(`[root-dependency-ownership] ${error}`);
}
process.exitCode = 1;
return;
}
if (!asJson) {
console.error("[root-dependency-ownership] ok");
return;
}
}
if (asJson) {
console.log(JSON.stringify(records, null, 2));
return;