js-essential-kit
Version:
This library provides a comprehensive set of utility functions for various common tasks, including date calculations, formatting, masking, normalizing data, and validation
149 lines (135 loc) • 4.54 kB
text/typescript
import { countries } from '../utils/countries'
/**
* Applies a mask to a given value as CPF or CNPJ.
*
* This function formats the input value as a CPF (xxx.xxx.xxx-xx) or CNPJ (xx.xxx.xxx/xxxx-xx)
* depending on the length of the numeric input.
*
* @param {string} value - The value to be formatted, containing only digits.
* @returns {string} - The formatted value with CPF or CNPJ mask applied.
*
* @example
* // Apply CPF mask
* console.log(cpfCnpjMask('12345678909')); // '123.456.789-09'
*
* // Apply CNPJ mask
* console.log(cpfCnpjMask('12345678000195')); // '12.345.678/0001-95'
*/
export function cpfOrCnpjMask(value: string): string {
value = value.replace(/\D/g, '')
if (value.length <= 11) {
value = value.replace(/(\d{3})(\d)/, '$1.$2')
value = value.replace(/(\d{3})(\d)/, '$1.$2')
value = value.replace(/(\d{3})(\d{1,2})$/, '$1-$2')
} else {
value = value.replace(/^(\d{2})(\d)/, '$1.$2')
value = value.replace(/^(\d{2})\.(\d{3})(\d)/, '$1.$2.$3')
value = value.replace(/\.(\d{3})(\d)/, '.$1/$2')
value = value.replace(/(\d{4})(\d)/, '$1-$2')
}
return value
}
/**
* Applies a mask to a Brazilian CEP (Postal Code).
*
* This function formats the input value as a CEP (xxxxx-xxx) by removing any non-digit characters
* and applying the appropriate mask.
*
* @param {string} value - The value to be formatted, containing only digits.
* @returns {string} - The formatted value with CEP mask applied.
*
* @example
* // Apply CEP mask
* console.log(cepMask('12345678')); // '12345-678'
*/
export function brazilianZipcodeMask(value: string): string {
value = value.replace(/\D/g, '')
value = value.replace(/^(\d{5})(\d)/, '$1-$2')
return value
}
/**
* Applies a mask to a Brazilian telephone number.
*
* This function formats the input value as a Brazilian telephone number, handling
* both 8-digit and 9-digit phone numbers correctly.
*
* @param {string} value - The value to be formatted, containing only digits.
* @returns {string} - The formatted telephone number.
*
* @example
* // Apply telephone mask to 8-digit number
* console.log(telephoneMask('1123456789')); // '(11) 2345-6789'
*
* // Apply telephone mask to 9-digit number
* console.log(telephoneMask('11987654321')); // '(11) 98765-4321'
*/
export function brazilianTelephoneMask(value: string): string {
value = value.replace(/\D/g, '')
if (value.length <= 10) {
value = value.replace(/^(\d{2})(\d{4})(\d{4})$/, '($1) $2-$3')
} else {
value = value.replace(/^(\d{2})(\d{5})(\d{4})$/, '($1) $2-$3')
}
return value
}
/**
* Applies a mask to a phone number based on the country code.
*
* This function finds the appropriate mask for the given country code and applies it
* to the provided phone number. If no mask is found for the country, the original
* phone number is returned.
*
* @param {string} country - The country code (e.g., 'US', 'BR').
* @param {string} phoneNumber - The phone number to be masked.
* @returns {string} - The masked phone number.
*
* @example
* // Mask a US phone number
* console.log(cellphoneMask('US', '1234567890')); // '(123) 456-7890'
*
* // Mask a Brazilian phone number
* console.log(cellphoneMask('BR', '11987654321')); // '(11) 98765-4321'
*/
export const globalCellphoneMask = (
country: string,
phoneNumber: string
): string => {
const selectCountry = countries.find((item) => item.code === country)
const mask = selectCountry?.mask
if (!mask) {
return phoneNumber
}
const digits = phoneNumber.replace(/\D/g, '')
let result = ''
let digitIndex = 0
for (let i = 0; i < mask.length && digitIndex < digits.length; i++) {
if (mask[i] === '9') {
result += digits[digitIndex++]
} else {
result += mask[i]
}
}
return result
}
/**
* Removes all non-digit characters from the input string.
*
* This function is used to clear any mask or formatting from a string,
* leaving only the numeric characters.
*
* @param {string} value - The string from which to remove non-digit characters.
* @returns {string} - The cleaned string containing only digits.
*
* @example
* // Clear mask from CPF
* console.log(clearMask('123.456.789-09')); // '12345678909'
*
* // Clear mask from CNPJ
* console.log(clearMask('12.345.678/0001-95')); // '12345678000195'
*
* // Clear mask from phone number
* console.log(clearMask('+55 (21) 98765-4321')); // '5521987654321'
*/
export function clearMask(value: string): string {
return value.replace(/\D/g, '')
}