@nexim/sanitizer
Version:
A collection of sanitization utilities for phone numbers and numeric inputs with TypeScript type safety.
81 lines • 2.99 kB
JavaScript
import { createLogger } from './logger.js';
import { convertDigits } from './unicode-digits.js';
import { isNumber } from './utils.js';
const logger = createLogger('@nexim/sanitizer');
export function sanitizeNumberToEnglish(number) {
if (typeof number === 'number') {
return number;
}
if (typeof number === 'string') {
let str = number.trim();
if (str === '') {
logger.error('sanitizeNumberToEnglish', 'empty_string');
return null;
}
str = convertDigits(str, 'en');
if (!isNumber(str)) {
logger.error('sanitizeNumberToEnglish', 'not_a_number');
return null;
}
return +str;
}
logger.error('sanitizeNumberToEnglish', 'invalid_input');
return null;
}
export function sanitizeNumberStringToEnglish(number) {
if (typeof number === 'number') {
return String(number);
}
if (typeof number === 'string') {
let str = number.trim();
if (str === '') {
logger.error('sanitizeNumberStringToEnglish', 'empty_string');
return null;
}
str = convertDigits(str, 'en');
if (!isNumber(str)) {
logger.error('sanitizeNumberStringToEnglish', 'not_a_number');
return null;
}
return str; // Return string to preserve leading zeros
}
logger.error('sanitizeNumberStringToEnglish', 'invalid_input');
return null;
}
/**
* Sanitizes a phone number by converting Unicode digits, removing special characters,
* and standardizing the format with country code.
*
* @param input - The phone number input to sanitize
* @param countryCode - The country code to apply (default: '98' for Iran)
* @returns The sanitized phone number as a number, or null if invalid
*
* @example
* ```ts
* sanitizePhoneNumber('09123456789'); // returns 989123456789
* sanitizePhoneNumber('+98 912 345 6789'); // returns 989123456789
* sanitizePhoneNumber('۰۹۱۲۳۴۵۶۷۸۹'); // returns 989123456789
* sanitizePhoneNumber('invalid'); // returns null
* ```
*/
export function sanitizePhoneNumber(input, countryCode = '98') {
if (input == null) {
logger.error('sanitizePhoneNumber', 'null_input');
return null;
}
const inputStr = typeof input === 'string' ? input.trim() : String(input);
if (inputStr === '') {
logger.error('sanitizePhoneNumber', 'empty_string');
return null;
}
const englishDigits = convertDigits(inputStr, 'en');
const withoutSpecialChars = englishDigits.replace(/[ )(-]+/g, '');
const cleanNumber = withoutSpecialChars.replace(new RegExp(`^(\\+${countryCode}|${countryCode}|^0)`), '');
const fullNumber = countryCode + cleanNumber;
if (fullNumber.length !== countryCode.length + 10 || !isNumber(fullNumber)) {
logger.error('sanitizePhoneNumber', 'invalid_full_number');
return null;
}
return +fullNumber;
}
//# sourceMappingURL=main.js.map