@type-ddd/zip-code
Version:
This package provides TypeScript type definitions for handling Brazilian Zip Code in Domain-Driven Design contexts
90 lines (89 loc) • 3.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isValidCpfDigit = exports.calculateCpfDigits = exports.removeSpecialCharsFromCpf = exports.formatValueToCpfPattern = void 0;
const removeSpecialCharsFromCpfRegex = /[\.]|[-]/g;
const formatValueToCpfPattern = (cpf) => {
const cpfValue = (0, exports.removeSpecialCharsFromCpf)(cpf);
let formattedValue = '';
let index = 0;
while (formattedValue.length < 14 && index < 11) {
if (index === 3 || index === 6) {
formattedValue += '.';
}
else if (index === 9) {
formattedValue += '-';
}
formattedValue += cpfValue[index];
index++;
}
return formattedValue;
};
exports.formatValueToCpfPattern = formatValueToCpfPattern;
const removeSpecialCharsFromCpf = (cpf) => {
return cpf.replace(removeSpecialCharsFromCpfRegex, '');
};
exports.removeSpecialCharsFromCpf = removeSpecialCharsFromCpf;
const getCpfDigitsNumbers = (cpf) => {
const lastTwoNumbers = cpf.slice(cpf.length - 2);
const penultimateDigit = parseInt(lastTwoNumbers[0]);
const ultimateDigit = parseInt(lastTwoNumbers[1]);
return {
penultimateDigit,
ultimateDigit,
};
};
const transformCpfInArrNumber = (cpf) => {
var arr = [];
let index = 0;
while (index < 9) {
arr.push(parseInt(cpf[index]));
index++;
}
return arr;
};
const calculateCpfDigits = (cpfNumbers) => {
const factor = 11;
let index = 0;
let startAuxValue = 10;
let totalForDigit = 0;
while (index < 9) {
totalForDigit = totalForDigit + cpfNumbers[index] * startAuxValue;
startAuxValue--;
index++;
}
const calcPDigit = totalForDigit % factor;
const resultPDigit = factor - calcPDigit;
const zeroIfPGreaterThanNine = resultPDigit > 9 ? 0 : resultPDigit;
const penultimateDigit = zeroIfPGreaterThanNine;
index = 0;
startAuxValue = 11;
totalForDigit = 0;
cpfNumbers.push(penultimateDigit);
while (index < 10) {
totalForDigit = totalForDigit + cpfNumbers[index] * startAuxValue;
startAuxValue--;
index++;
}
const calcUDigit = totalForDigit % factor;
const resultUDigit = factor - calcUDigit;
const zeroIfGreaterThanNine = resultUDigit > 9 ? 0 : resultUDigit;
const ultimateDigit = zeroIfGreaterThanNine;
return {
penultimateDigit,
ultimateDigit,
};
};
exports.calculateCpfDigits = calculateCpfDigits;
const isValidCpfDigit = (cpf) => {
const onlyNumbers = (0, exports.removeSpecialCharsFromCpf)(cpf);
if (onlyNumbers.length !== 11) {
return false;
}
const digits = getCpfDigitsNumbers(onlyNumbers);
const arrNumbers = transformCpfInArrNumber(onlyNumbers);
const validDigits = (0, exports.calculateCpfDigits)(arrNumbers);
return (digits.penultimateDigit === validDigits.penultimateDigit &&
digits.ultimateDigit === validDigits.ultimateDigit);
};
exports.isValidCpfDigit = isValidCpfDigit;
exports.default = exports.isValidCpfDigit;