brazilian-values
Version:
Validates and formats brazilian values, like money (BRL), CPF, CNPJ, dates etc.
980 lines (873 loc) • 26.9 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
/**
* Parses a brazilian formatted list into an Array.
* @example
* parseToArray('');
* //=> []
* parseToArray('1');
* //=> ['1']
* parseToArray('1 e 2');
* //=> ['1', '2']
* parseToArray('1, 2, 3, 4 e 5');
* //=> ['1', '2', '3', '4', '5']
* parseToArray('Fernanda, Luana e Ana Carolina');
* //=> ['Fernanda', 'Luana', 'Ana Carolina']
* @param value - A brazilian formatted list.
*/
var parseToArray = function parseToArray(value) {
if (!value.trim()) return [];
var items = value.split(' e ');
if (items.length === 1) return items;
return items[0].split(', ').concat(items[1]);
};
/**
* Transforms pieces of a date into a Date instance.
* @param pieces - Date pieces.
*/
var parsePiecesToDate = function parsePiecesToDate(pieces) {
return new Date(pieces.year, pieces.month, pieces.date, pieces.hours, pieces.minutes, pieces.seconds);
};
/**
* Compare pieces of a date to values obtained from a Date instance.
* @param pieces - Pieces of a date (date, month, year, hours, minutes and seconds).
* @param instance - A Date instance.
*/
var comparePiecesToDate = function comparePiecesToDate(pieces, instance) {
if (instance === void 0) {
instance = parsePiecesToDate(pieces);
}
return instance.getDate() === pieces.date && instance.getMonth() === pieces.month && instance.getFullYear() === pieces.year && instance.getHours() === pieces.hours && instance.getMinutes() === pieces.minutes && instance.getSeconds() === pieces.seconds;
};
/**
* Resolve a brazilian formatted date or datetime into date, month, year pieces and hours, minutes and seconds pieces (if contains time).
* @param value - A date in DD/MM/YYYY or DD/MM/YYYY HH:mm:ss.
*/
var mapToPieces = function mapToPieces(value) {
var expression = /^(\d{2})\/(\d{2})\/(\d{4})( (\d{2}):(\d{2})(:(\d{2}))?)?$/;
var _a = expression.exec(value),
DD = _a[1],
MM = _a[2],
YYYY = _a[3],
HH = _a[5],
mm = _a[6],
ss = _a[8];
return {
date: parseInt(DD, 10),
year: parseInt(YYYY, 10),
month: parseInt(MM, 10) - 1,
hours: parseInt(HH !== null && HH !== void 0 ? HH : 0, 10),
minutes: parseInt(mm !== null && mm !== void 0 ? mm : 0, 10),
seconds: parseInt(ss !== null && ss !== void 0 ? ss : 0, 10)
};
};
/**
* A `RegExp` that matches common brazilian date and, optionally, time formats.
*
* In date and time the seconds are optional too. So the valid formats are:
* "DD/MM/YYYY", "DD/MM/YYYY HH:mm" and "DD/MM/YYYY HH:mm:ss".
*/
var DATE_TIME_PATTERN = /^\d{2}\/\d{2}\/\d{4}( \d{2}:\d{2}(:\d{2})?)?$/;
/**
* Parses a brazilian formatted date into a Date instance.
* @example ```js
* parseToDate('28/03/1996')
* //=> '1996-03-28T03:00:00.000Z'
*
* parseToDate('31/02/2018')
* //=> throws Error('Value "31/02/2018" is an invalid date.')
* ```
* @param value - A date in DD/MM/YYYY.
*/
var parseToDate = function parseToDate(value) {
if (!DATE_TIME_PATTERN.test(value)) throw new Error("Value \"" + value + "\" does not match format.");
var pieces = mapToPieces(value);
var instance = parsePiecesToDate(pieces);
if (!comparePiecesToDate(pieces, instance)) throw new Error("Value \"" + value + "\" is an invalid date.");
return instance;
};
/**
* Parses brazilian formatted number to number.
* @example
* parseToNumber('10')
* //=> 10
* parseToNumber('-1.299')
* //=> -1299
* parseToNumber('0,981')
* //=> 0.981
* parseToNumber('19.898,1298')
* //=> 19898.1298
* @param value - A brazilian formatted number.
*/
var parseToNumber = function parseToNumber(value) {
return Number(value.replace(/\./g, '').replace(',', '.'));
};
/**
* Generate the next digit from a CAEPF number.
* @param numbers - Numbers used to generate checkers.
* @param validators - Validators used to generate checkers.
*/
var calculateCAEPFDigit = function calculateCAEPFDigit(numbers, validators) {
var digit = numbers.reduce(function (digit, value, index) {
return digit += Number(value) * Number(validators[index]);
}, 0);
return digit % 11 % 10;
};
/**
* Generate CAEPF checksums. Generate simple checksums, add 12 and subtract 100
* if it's more than that. Used to validate document number.
* @param numbers - Numbers used to generate checkers.
* @param validators - Validators used to generate checkers.
*/
var generateCAEPFCheckSums = function generateCAEPFCheckSums(numbers, validators) {
var value = numbers.slice();
value[12] = calculateCAEPFDigit(value.slice(0, 12), validators.slice(1, 13));
value[13] = calculateCAEPFDigit(value.slice(0, 13), validators);
var dv = (Number("" + value[12] + value[13]) + 12) % 100;
return [Math.floor(dv / 10), dv % 10];
};
/**
* Check if items are same, if their values are repeated.
* @param item
*/
var isRepeatedArray = function isRepeatedArray(items) {
return items.every(function (item) {
return items[0] === item;
});
};
/**
* Matches every non-numeric characters.
*/
var NonNumeric = /\D/g;
/**
* Maps to a text containing only numeric characters.
* @param value - A text containing numbers.
*/
var mapToNumeric = function mapToNumeric(value) {
return value.replace(NonNumeric, '');
};
/**
* Maps a text to a collection of it's numbers.
* @param value - A text containing numbers.
*/
var mapToNumbers = function mapToNumbers(value) {
return mapToNumeric(value).split('').map(Number);
};
/**
* Pattern to match formatted CAEPF (999.999.999/999-99) or 14 numbers.
*/
var CAEPF_PATTERN = /^(\d{14}|\d{3}\.\d{3}\.\d{3}\/\d{3}\-\d{2})$/;
/**
* Check if value is a valid CAEPF.
* @example ```js
* isCAEPF('41142260000101')
* //=> true
*
* isCAEPF('411.422.600/001-01')
* //=> true
*
* isCAEPF('111.111.111/111-11')
* //=> false
*
* isCAEPF('411407182')
* //=> false
*
* ```
* @param value - A text containing a CAEPF.
*/
var isCAEPF = function isCAEPF(value) {
if (!CAEPF_PATTERN.test(value)) return false;
var numbers = mapToNumbers(value);
if (isRepeatedArray(numbers)) return false;
var validators = [5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 7, 8, 9];
var checkers = generateCAEPFCheckSums(numbers, validators);
return numbers[12] === checkers[0] && numbers[13] === checkers[1];
};
/**
* Pattern to match formatted CEP (99999-999) or 8 numbers.
*/
var CEP_PATTERN = /^(\d{8}|\d{2}\.?\d{3}\-\d{3})$/;
/**
* Check if value is a valid CEP.
* @example ```js
* isCEP('50.833-000')
* //=> true
*
* isCEP('02998-050')
* //=> true
*
* isCEP('00000000')
* //=> true
*
* isCEP('0')
* //=> false
*
* isCEP('1982891928981982198')
* //=> false
* ```
* @param value - A text containing a CEP.
*/
var isCEP = function isCEP(value) {
return CEP_PATTERN.test(value);
};
/**
* Generate check sums. Multiply numbers to validators and sum them to generate
* check sums, they're used to check if numbers are valid.
* @param numbers - Numbers used to generate checkers.
* @param validators - Validators used to generate checkers.
*/
var generateCheckSums = function generateCheckSums(numbers, validators) {
var initialCheckSums = [0, 0];
return validators.reduce(function (_a, validator, index) {
var checkerA = _a[0],
checkerB = _a[1];
return [index === 0 ? 0 : checkerA + numbers[index - 1] * validator, checkerB + numbers[index] * validator];
}, initialCheckSums);
};
/**
* Get remaining of 11 or `0` if lower than 2.
* @param value - Value used remaining.
*/
var getRemaining = function getRemaining(value) {
return value % 11 < 2 ? 0 : 11 - value % 11;
};
/**
* Pattern to match formatted CNPJ (99.999.999/9999-99) or 14 numbers.
*/
var CNPJ_PATTERN = /^(\d{14}|\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2})$/;
/**
* Check if value is a valid CNPJ.
* @example ```js
* isCNPJ('41142260000189')
* //=> true
*
* isCNPJ('45.723.174/0001-10')
* //=> true
*
* isCNPJ('411407182')
* //=> false
*
* isCNPJ('11.111.111/1111-11')
* //=> false
* ```
* @param value - A text containing a CNPJ.
*/
var isCNPJ = function isCNPJ(value) {
if (!CNPJ_PATTERN.test(value)) return false;
var numbers = mapToNumbers(value);
if (isRepeatedArray(numbers)) return false;
var validators = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
var checkers = generateCheckSums(numbers, validators);
return numbers[12] === getRemaining(checkers[0]) && numbers[13] === getRemaining(checkers[1]);
};
/**
* Pattern to match formatted CPF (999.999.999-99) or 11 numbers.
*/
var CPF_PATTERN = /^(\d{11}|\d{3}\.\d{3}\.\d{3}\-\d{2})$/;
/**
* Check if value is a valid CPF.
* @example ```js
* isCPF('366.418.768-70')
* //=> true
*
* isCPF('36641876870')
* //=> true
*
* isCPF('213.198.013-20')
* //=> false
*
* isCPF('2131201872781')
* //=> false
*
* isCPF('11111111111')
* //=> false
* ```
* @param value - A text containing a CPF.
*/
var isCPF = function isCPF(value) {
if (!CPF_PATTERN.test(value)) return false;
var numbers = mapToNumbers(value);
if (isRepeatedArray(numbers)) return false;
var validators = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2];
var checkers = generateCheckSums(numbers, validators);
return numbers[9] === getRemaining(checkers[0]) && numbers[10] === getRemaining(checkers[1]);
};
/**
* Pattern to match brazilian formatted dates (99/99/9999).
*/
var DATE_PATTERN = /^\d{2}\/\d{2}\/\d{4}((\s)?(\d{2}:\d{2}:\d{2}))?$/;
/**
* Check if a brazilian formatted date is valid.
* @example ```js
* isDate('03/08/2017')
* //=> true
*
* isDate('28/13/2017')
* //=> false
*
* isDate('03-08-2017')
* //=> false
*
* isDate('31/03/18')
* //=> false
* ```
* @param value - A date in DD/MM/YYYY.
*/
var isDate = function isDate(value) {
return DATE_PATTERN.test(value) && comparePiecesToDate(mapToPieces(value));
};
/**
* Brazilian valid DDD (direct dialing at a distance) codes.
*/
var DDDs = ["11", "12", "13", "14", "15", "16", "17", "18", "19", "21", "22", "24", "27", "28", "31", "32", "33", "34", "35", "37", "38", "41", "42", "43", "44", "45", "46", "47", "48", "49", "51", "53", "54", "55", "61", "62", "63", "64", "65", "66", "67", "68", "69", "71", "73", "74", "75", "77", "79", "81", "82", "83", "84", "85", "86", "87", "88", "89", "91", "92", "93", "94", "95", "96", "97", "98", "99"];
/**
* Check if value is a valid DDD.
* @example ```js
* isDDD('81')
* //=> true
*
* isDDD('10')
* //=> false
*
* isDDD('A#')
* //=> false
* ```
* @param code
*/
var isDDD = function isDDD(code) {
return DDDs.indexOf(code) !== -1;
};
/**
* Pattern for common brazilian telephone number formats, optionally with DDI,
* DDD and the ninth digit.
*/
var PHONE_PATTERN = /^(\+55)? ?\(?(\d{2})?\)? ?9?\d{4}[-| ]?\d{4}$/;
/**
* Check if value is a valid brazilian phone number. It can check a wide
* variety of formats optionally with DDI, DDD and the ninth digit.
*
* @example ```js
* isPhone('+55 (11) 98273-1182')
* //=> true
*
* isPhone('11 98273 1182')
* //=> true
*
* isPhone('1139723768')
* //=> true
*
* isPhone('(23) 3972-3768')
* //=> false
*
* isPhone('(13) 65093-2093')
* //=> false
*
* isPhone('(81) 555 178')
* //=> false
* ```
* @param value
*/
var isPhone = function isPhone(value) {
if (!PHONE_PATTERN.test(value)) return false;
var _a = PHONE_PATTERN.exec(value),
DDD = _a[2];
return DDD ? isDDD(DDD) : true;
};
var PATTERNS = [CPF_PATTERN, CNPJ_PATTERN];
/**
* Check if a value is a valid CPF or CNPJ
* @example ```js
* isCPFOrCNPJ('366.418.768-70')
* //=> true
*
* isCPFOrCNPJ('36641876870')
* //=> true
*
* isCPFOrCNPJ('213.198.013-20')
* //=> false
*
* isCPFOrCNPJ('2131201872781')
* //=> false
*
* isCPFOrCNPJ('11111111111')
* //=> false
*
* isCPFOrCNPJ('41142260000189')
* //=> true
*
* isCPFOrCNPJ('45.723.174/0001-10')
* //=> true
*
* isCPFOrCNPJ('411407182')
* //=> false
*
* isCPFOrCNPJ('11.111.111/1111-11')
* //=> false
* ```
* @param value - A text containing a CPF or CNPJ
*/
var isCPFOrCNPJ = function isCPFOrCNPJ(value) {
var matches = PATTERNS.map(function (pattern) {
return pattern.test(value);
});
if (!matches.includes(true)) return false;
return matches[0] ? isCPF(value) : isCNPJ(value);
};
/**
* Add periods to a numeric string value.
* @param value - A numeric string value.
*/
var addPeriods = function addPeriods(value) {
return value.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1.');
};
/**
* Formats a number into money (BRL) format.
* @example ```js
* formatToBRL(1928.93)
* //=> 'R$ 1.928,93'
*
* formatToBRL('9211928.18203')
* //=> 'R$ 9.211.928,18'
*
* formatToBRL(-18.49)
* //=> 'R$ -18,49'
* ```
* @param value BRL value.
*/
var formatToBRL = function formatToBRL(value) {
var number = Number(value).toFixed(2).replace('.', ',');
return 'R$ ' + addPeriods(number);
};
/**
* Formats step-by-step a `string` value into a CAEPF.
* @example ```js
* formatToCAEPF('1234567')
* //=> '123.456.7'
*
* formatToCAEPF('12345678900199')
* //=> '123.456.789/001-99'
*
* formatToCAEPF('00.000.0.0--0-0000.00')
* //=> '000.000.000/000-00'
*
* formatToCAEPF('123.456.789/001-99')
* //=> '123.456.789/001-99'
* ```
* @param value - A `string` value of a CAEPF.
*/
var formatToCAEPF = function formatToCAEPF(value) {
return mapToNumeric(value).replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d)/, '$1/$2').replace(/(\d{3})(\d{1,2})$/, '$1-$2');
};
/**
* Format a `string` number sequence into CEP format.
* @example ```js
* formatToCEP('15998030')
* //=> '15998-030'
*
* formatToCEP('02999')
* //=> '02999'
* ```
* @param value A `string` with CEP numbers.
*/
var formatToCEP = function formatToCEP(value) {
return mapToNumeric(value).replace(/(\d{5})(\d{1,3})/, '$1-$2');
};
/**
* Formats step-by-step a `string` value into a CNPJ.
* @example ```js
* formatToCNPJ('128781')
* //=> '12.878.1'
*
* formatToCNPJ('32284981000138')
* //=> '32.284.981/0001-38'
*
* formatToCNPJ('00.0.000.00.00--00-00')
* //=> '00.000.000/0000-00'
* ```
* @param value - A `string` value of a CNPJ.
*/
var formatToCNPJ = function formatToCNPJ(value) {
return mapToNumeric(value).replace(/(\d{2})(\d)/, '$1.$2').replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d)/, '$1/$2').replace(/(\d{4})(\d{1,2})$/, '$1-$2');
};
/**
* Formats step-by-step a `string` value into a CPF.
* @example ```js
* formatToCPF('00000000')
* //=> '000.000.00'
*
* formatToCPF('00000000000')
* //=> '000.000.000-00'
*
* formatToCPF('366.418.768-70')
* //=> '366.418.768-70'
* ```
* @param value - A `string` value of a CPF.
*/
var formatToCPF = function formatToCPF(value) {
return mapToNumeric(value).replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})(\d{1,2})$/, '$1-$2');
};
/**
* Check if a `string` value can be formatted to CPF.
* @param value - A `string` value of a CPF or CNPJ.
*/
var canFormatToCPF = function canFormatToCPF(value) {
var _a, _b;
return ((_b = (_a = value.match(/\d/g)) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) <= 11;
};
/**
* Formats step-by-step a `string` value to CPF or CNPJ depending on its length.
* @example
* formatToCPFOrCNPJ('00000000')
* //=> '000.000.00'
*
* formatToCPFOrCNPJ('366.418.768-70')
* //=> '366.418.768-70'
*
* formatToCPFOrCNPJ('32284981000138')
* //=> '32.284.981/0001-38'
*
* formatToCPFOrCNPJ('00.0.000.00.00--00-00')
* //=> '00.000.000/0000-00'
* @param value - A `string` value of a CPF or CNPJ.
*/
var formatToCPFOrCNPJ = function formatToCPFOrCNPJ(value) {
return canFormatToCPF(value) ? formatToCPF(value) : formatToCNPJ(value);
};
/**
* Capitalizes a word.
* @param word - A `string` (word) to be capitalized.
*/
var capitalizeWord = function capitalizeWord(word) {
return word.charAt(0).toLocaleUpperCase() + word.substr(1).toLocaleLowerCase();
};
/**
* Normalize white spaces in a `string` (value).
* @param value - A `string` to be normalized.
*/
var normalizeWhiteSpaces = function normalizeWhiteSpaces(value) {
return value.trim().replace(/\s+/g, ' ');
};
/**
* Splits text into words.
* @param text - A `string` to be splitted into words.
*/
var splitIntoWords = function splitIntoWords(text) {
return text ? text.split(/\s+/) : [];
};
/**
* A list of default words to keep upper case.
*/
var DEFAULT_WORDS_TO_KEEP_UPPER_CASE = ['cnpj', 'cpf', 'ltda', 'qp', 'tv'];
/**
* A list of default words to keep lower case.
*/
var DEFAULT_WORDS_TO_KEEP_LOWER_CASE = ['a', 'com', 'da', 'das', 'de', 'do', 'dos', 'e', 'em', 'i', 'na', 'nas', 'no', 'nos', 'o', 'por', 'sem', 'u'];
/**
* Capitaliza as palavras de um texto, com exceção das palavras configuradas
* para serem deixadas em caixa-alta ou em caixa-baixa (menos a primeira palavra
* que não será caixa-baixa mesmo se configurada como).
*
* @example ```js
* formatToCapitalized('SERVIDOR PÚBLICO MUNICIPAL')
* //=> 'Servidor Público Municipal'
*
* formatToCapitalized(' os PrimEIROS HOMens da tERra', {
* wordsToKeepLowerCase: ['os', 'da']
* })
* //=> 'Os Primeiros Homens da Terra'
*
* formatToCapitalized('nova tv foi lançada', {
* wordsToKeepUpperCase: ['tv']
* })
* //=> 'Nova TV Foi Lançada'
*
* formatToCapitalized(' com espaços antes e depois ', {
* trimTrailingWhiteSpaces: false
* })
* //=> ' Com Espaços Antes e Depois '
* ```
* @param value - A `string` to capitalize
*/
var formatToCapitalized = function formatToCapitalized(value, _a) {
var _b = _a === void 0 ? {} : _a,
_c = _b.wordsToKeepLowerCase,
wordsToKeepLowerCase = _c === void 0 ? DEFAULT_WORDS_TO_KEEP_LOWER_CASE : _c,
_d = _b.wordsToKeepUpperCase,
wordsToKeepUpperCase = _d === void 0 ? DEFAULT_WORDS_TO_KEEP_UPPER_CASE : _d,
_e = _b.trimTrailingWhiteSpaces,
trimTrailingWhiteSpaces = _e === void 0 ? true : _e;
return splitIntoWords(trimTrailingWhiteSpaces ? normalizeWhiteSpaces(value) : value).map(function (word, index, words) {
var isFirstWord = word && index === 0 || !words[0] && index === 1;
var wordInLowerCase = word.toLocaleLowerCase();
if (!isFirstWord && wordsToKeepLowerCase.indexOf(wordInLowerCase) !== -1) return wordInLowerCase;
if (wordsToKeepUpperCase.indexOf(wordInLowerCase) !== -1) return word.toLocaleUpperCase();
return capitalizeWord(word);
}).join(" ");
};
/**
* Fills a number with zeros.
* @param value - A number value.
* @param length - Number of characters to be filled with zeros.
*/
var fillWithZeros = function fillWithZeros(value, length) {
var numbers = value.toString(10);
while (numbers.length < length) {
numbers = '0' + numbers;
}
return numbers;
};
/**
* Formats a Date instance to brazilian format, DD/MM/YYYY.
* @example ```js
* formatToDate(new Date(2002, 7, 21))
* //=> '21/08/2002'
*
* formatToDate(new Date())
* //=> '08/09/2018'
* ```
* @param value - A Date instance.
*/
var formatToDate = function formatToDate(value) {
return fillWithZeros(value.getDate(), 2) + '/' + fillWithZeros(value.getMonth() + 1, 2) + '/' + fillWithZeros(value.getFullYear(), 4);
};
/**
* Formats a Date instance to brazilian format of date and time, DD/MM/YYYY HH:mm.
* @example ```js
* formatToDateTime(new Date(2002, 7, 21, 18, 30))
* //=> '21/08/2002 18:30'
* ```
* @param value - A Date instance.
*/
var formatToDateTime = function formatToDateTime(value) {
return formatToDate(value) + ' ' + fillWithZeros(value.getHours(), 2) + ':' + fillWithZeros(value.getMinutes(), 2);
};
/**
* Formats a phone value into brazilian common phone formats.
* @example ```js
* formatToGenericPhone('23456789')
* //=> '2345-6789'
*
* formatToGenericPhone('923456789')
* //=> '92345-6789'
*
* formatToGenericPhone('21923456789')
* //=> '(21) 92345-6789'
*
* formatToGenericPhone('021923456789')
* //=> '021 92345-6789'
*
* formatToGenericPhone('5521923456789')
* //=> '+55 21 92345-6789'
* ```
* @param value
* @param countryCodeLength
*/
var formatToGenericPhone = function formatToGenericPhone(value,
/*
Brazil country code: +55
*/
countryCodeLength) {
if (countryCodeLength === void 0) {
countryCodeLength = 2;
}
var phone = mapToNumeric(value);
if (phone.length === 8) {
return phone.replace(/(^\d{4})(\d{4}$)/gi, "$1-$2");
}
if (phone.length === 9) {
return phone.replace(/(^\d{5})(\d{4}$)/gi, "$1-$2");
}
if (phone.length === 10) {
return phone.replace(/(^\d{2})(\d{4})(\d{4}$)/gi, "($1) $2-$3");
}
if (phone.length === 11) {
return phone.replace(/(^\d{2})(\d{4,5})(\d{4}$)/gi, "($1) $2-$3");
}
if (phone.length === 12) {
return phone.replace(/(^\d{3})(\d{5})(\d{4}$)/gi, "$1 $2-$3");
}
var re = new RegExp("([0-9]{" + countryCodeLength + "})([0-9][0-9])([0-9]{5})([0-9]{4})", "gi");
return phone.replace(re, "+$1 $2 $3-$4");
};
var normalizeRange = function normalizeRange(range, limit) {
if (Array.isArray(range)) return range;
if (range >= 0) return [0, range];
return [limit + 1 - Math.abs(range), limit];
};
var within = function within(range, value) {
return value >= range[0] && value <= range[1];
};
/** A {@link RegExp} that matches numbers between `0-9`. */
var DIGIT = /^\d$/;
/**
* Parses the received `string` value to a tree of characters.
* @param value
*/
var parseToCharacters = function parseToCharacters(value) {
var digits = 0;
var children = value.split('').map(function (character) {
if (DIGIT.test(character)) return {
character: character,
kind: 'digit',
digit: ++digits
};
return {
character: character,
kind: 'other'
};
});
return {
digits: digits,
children: children,
kind: 'root'
};
};
/**
* Formats a `string` value with digits by replacing the digits within the
* range using the hider character as replacement.
*
* @example ```js
* formatToHiddenDigits('00.000-000')
* //=> '**.*00-000'
*
* formatToHiddenDigits('03/04/2002', { hider: '-' })
* //=> '--/-4/2002'
*
* formatToHiddenDigits('111.111.111-11', { range: [4, 9] })
* //=> '111.***.***-11'
*
* formatToHiddenDigits('12.345.678-9', { hider: '#', range: 5 })
* //=> '##.###.678-9'
*
* formatToHiddenDigits('52.715.348/0001-69', { hider: '@', range: -9 })
* //=> '52.715.@@@/@@@@-@@'
* ```
*
* @param value - A `string` with digits, with or without a mask.
* @param options - The options object.
*/
var formatToHiddenDigits = function formatToHiddenDigits(value, options) {
var _a;
if (options === void 0) {
options = {};
}
var characters = parseToCharacters(value);
var range = normalizeRange((_a = options.range) !== null && _a !== void 0 ? _a : 3, characters.digits);
return characters.children.map(function (node) {
var _a;
if (node.kind === "digit" && within(range, node.digit)) return (_a = options.hider) !== null && _a !== void 0 ? _a : "*";
return node.character;
}).join("");
};
/**
* Split `Array` elements into every but last and last element.
* @param value - An Array with at least one item.
*/
var splitOnLast = function splitOnLast(value) {
return [value.slice(0, value.length - 1), value[value.length - 1]];
};
/**
* Formats an Array into brazilian formatted list.
* @example
* formatToList(['Vitor', 'William', 'Fernando'])
* //=> 'Vitor, William e Fernando'
*
* formatToList([])
* // => ''
*
* formatToList(['1', '2'])
* // => '1 e 2'
*
* formatToList(['Direito Civil'])
* //=> 'Direito Civil'
* @param value - An array of string values.
*/
var formatToList = function formatToList(value) {
if (value.length === 0) return '';
if (value.length === 1) return value[0];
var _a = splitOnLast(value),
everyButLast = _a[0],
last = _a[1];
return everyButLast.join(', ') + ' e ' + last;
};
/**
* Formats a number to brazilian formatted number.
* @example
* formatToNumber(0)
* //=> '0'
* formatToNumber(-1299)
* //=> '-1.299'
* formatToNumber(.981)
* //=> '0,981'
* formatToNumber('19898.1298')
* //=> '19.898,1298'
* @param value - Number value to be formatted.
*/
var formatToNumber = function formatToNumber(value) {
var _a = Number(value).toString(10).split('.'),
number = _a[0],
trunc = _a[1];
if (!trunc) return addPeriods(number);
return addPeriods(number) + ',' + trunc;
};
/**
* Formats a phone value into brazilian common phone formats.
* @example ```js
* formatToPhone('11')
* //=> '(11'
*
* formatToPhone('11971626')
* //=> '(11) 9716-26'
*
* formatToPhone('11971626799')
* //=> '(11) 97162-6799'
* ```
* @param value
*/
var formatToPhone = function formatToPhone(value) {
return mapToNumeric(value).replace(/(\d{1,2})/, '($1').replace(/(\(\d{2})(\d{1,4})/, '$1) $2').replace(/( \d{4})(\d{1,4})/, '$1-$2').replace(/( \d{4})(?:-)(\d{1})(\d{4})/, '$1$2-$3');
};
/**
* Progressively formats a `string` into a RG.
* @example ```js
* formatToRG('00000000A', 'SP')
* //=> '00.000.000-A'
*
* formatToRG('00.00.0000-0', 'RJ')
* //=> '00.000.000-0'
*
* formatToRG('MG-14.808.688', 'MG')
* //=> 'MG-14.808.688'
* ```
* @param value - A `string` representing an RG.
* @param state - Brazilian state which defines RG format.
*/
var formatToRG = function formatToRG(value, state) {
return state !== 'RJ' && state !== 'SP' ? value : value.toUpperCase().replace(/[^\d|A|B|X]/g, '').replace(/(\d{2})(\d)/, '$1.$2').replace(/(\d{3})(\d)/, '$1.$2').replace(/(\d{3})([\d|A|B|X]{1})$/, '$1-$2');
};
exports.formatToBRL = formatToBRL;
exports.formatToCAEPF = formatToCAEPF;
exports.formatToCEP = formatToCEP;
exports.formatToCNPJ = formatToCNPJ;
exports.formatToCPF = formatToCPF;
exports.formatToCPFOrCNPJ = formatToCPFOrCNPJ;
exports.formatToCapitalized = formatToCapitalized;
exports.formatToDate = formatToDate;
exports.formatToDateTime = formatToDateTime;
exports.formatToGenericPhone = formatToGenericPhone;
exports.formatToHiddenDigits = formatToHiddenDigits;
exports.formatToList = formatToList;
exports.formatToNumber = formatToNumber;
exports.formatToPhone = formatToPhone;
exports.formatToRG = formatToRG;
exports.isCAEPF = isCAEPF;
exports.isCEP = isCEP;
exports.isCNPJ = isCNPJ;
exports.isCPF = isCPF;
exports.isCPFOrCNPJ = isCPFOrCNPJ;
exports.isDDD = isDDD;
exports.isDate = isDate;
exports.isPhone = isPhone;
exports.parseToArray = parseToArray;
exports.parseToDate = parseToDate;
exports.parseToNumber = parseToNumber;