rea/src/domain/explicitSensitiveValues.ts

21 lines
769 B
TypeScript

/** Replace caller-declared literal text values without guessing sensitivity from names. */
export const redactExplicitText = (
value: string,
sensitiveValues: readonly string[],
): string => {
const literals = [...new Set(sensitiveValues)].filter(
(literal) => literal !== "",
);
const replacement =
["[REDACTED]", "…", ""].find((candidate) =>
literals.every((literal) => !candidate.includes(literal)),
) ?? "";
let result = value;
for (const literal of literals.sort(
(left, right) => right.length - left.length,
))
result = result.replaceAll(literal, replacement);
// Replacement boundaries can form another declaration; exclude that text.
return literals.some((literal) => result.includes(literal)) ? "" : result;
};