chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env node
|
||||
// scripts/check/lib/allowlist.mjs
|
||||
// Shared helper for stale-allowlist enforcement (6A.3).
|
||||
//
|
||||
// Purpose: detect allowlist entries that no longer correspond to any live
|
||||
// violation. When a developer fixes a violation, the entry in KNOWN_* must
|
||||
// also be removed — otherwise the gate silently allows the violation to
|
||||
// regress. This pattern is validated practice (ESLint --report-unused-disable-
|
||||
// directives; Notion suppression hygiene).
|
||||
|
||||
/**
|
||||
* Returns the subset of `allowlist` entries that do NOT appear in
|
||||
* `liveViolations`. These are "stale" entries — the violation they once
|
||||
* suppressed has been corrected, so the entry should be removed to prevent
|
||||
* silent regression.
|
||||
*
|
||||
* @param {string[] | Set<string>} allowlist - The known-violations list/set.
|
||||
* @param {string[] | Set<string>} liveViolations - Violations detected in the
|
||||
* current run (strings as they appear in the allowlist).
|
||||
* @param {string} gateName - Gate name used only in future error messages; not
|
||||
* used internally by this function but kept for API consistency with
|
||||
* assertNoStale.
|
||||
* @returns {string[]} Stale entries (present in allowlist, absent in live).
|
||||
*/
|
||||
export function reportStaleEntries(allowlist, liveViolations, gateName) {
|
||||
const liveSet = liveViolations instanceof Set ? liveViolations : new Set(liveViolations);
|
||||
const stale = [];
|
||||
for (const entry of allowlist) {
|
||||
if (!liveSet.has(entry)) {
|
||||
stale.push(entry);
|
||||
}
|
||||
}
|
||||
return stale;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls reportStaleEntries; if any stale entries are found, logs them to
|
||||
* stderr and sets process.exitCode = 1 so the gate fails without throwing
|
||||
* (allowing multiple gates to report before the process exits).
|
||||
*
|
||||
* @param {string[] | Set<string>} allowlist
|
||||
* @param {string[] | Set<string>} liveViolations
|
||||
* @param {string} gateName - Shown in the error message to identify the gate.
|
||||
* @returns {string[]} The same stale array returned by reportStaleEntries.
|
||||
*/
|
||||
export function assertNoStale(allowlist, liveViolations, gateName) {
|
||||
const stale = reportStaleEntries(allowlist, liveViolations, gateName);
|
||||
if (stale.length > 0) {
|
||||
console.error(
|
||||
`[${gateName}] ${stale.length} entrada(s) obsoleta(s) na allowlist ` +
|
||||
`— a violação foi corrigida; REMOVA a entrada para travar a correção:\n` +
|
||||
stale.map((e) => ` ✗ ${e}`).join("\n")
|
||||
);
|
||||
process.exitCode = 1;
|
||||
}
|
||||
return stale;
|
||||
}
|
||||
Reference in New Issue
Block a user