41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import type { MaskRule } from "../types/mask-types.js";
|
|
|
|
/**
|
|
* Phone-number masking strategy.
|
|
*
|
|
* Keeps the last 4 digits of a phone number and replaces all preceding digit
|
|
* positions with `*`, while preserving non-digit separator characters
|
|
* (hyphens, spaces, parentheses, dots, `+`) so the output remains formatted
|
|
* consistently with the input.
|
|
*
|
|
* Example: `+1-555-123-4567` → `*-***-***-4567`
|
|
*
|
|
* @param value - The original phone number string.
|
|
* @param rule - The `MaskRule` (not consumed by this strategy).
|
|
* @returns The masked phone number.
|
|
*/
|
|
export function maskPhone(value: string, rule: MaskRule): string {
|
|
void rule;
|
|
// Extract only the digit characters to determine the last-4 boundary.
|
|
const digits = value.replace(/\D/g, "");
|
|
if (digits.length === 0) return value;
|
|
|
|
const keepFrom = Math.max(0, digits.length - 4);
|
|
// Walk the original string, replacing digits that are NOT in the last 4.
|
|
let digitsSeen = 0;
|
|
let result = "";
|
|
for (const ch of value) {
|
|
if (/\d/.test(ch)) {
|
|
if (digitsSeen < keepFrom) {
|
|
result += "*";
|
|
} else {
|
|
result += ch;
|
|
}
|
|
digitsSeen++;
|
|
} else {
|
|
result += ch;
|
|
}
|
|
}
|
|
return result;
|
|
}
|