21 lines
769 B
TypeScript
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;
|
|
};
|