diff --git a/src/index.js b/src/index.js index a0e8aa63c..6d6e380eb 100644 --- a/src/index.js +++ b/src/index.js @@ -121,6 +121,8 @@ import isStrongPassword from './lib/isStrongPassword'; import isVAT from './lib/isVAT'; +import isCpf from './lib/isCpf'; + const version = '13.6.0'; const validator = { @@ -225,6 +227,7 @@ const validator = { isLicensePlate, isVAT, ibanLocales, + isCpf, }; export default validator; diff --git a/src/lib/isCpf.js b/src/lib/isCpf.js new file mode 100644 index 000000000..442a96217 --- /dev/null +++ b/src/lib/isCpf.js @@ -0,0 +1,44 @@ +import assertString from './util/assertString'; + +// Brazilian CPF (Cadastro de Pessoas FĂ­sicas) + +export default function isCpf(cpfString) { + assertString(cpfString); + + let sum = 0; + let rest; + + const cpf = cpfString.toString().replace(/[^0-9]+/g, ''); + + if (cpf === '00000000000') { + return false; + } + + for (let i = 1; i <= 9; i++) { + sum += parseInt(cpf.substring(i - 1, i), 10) * (11 - i); + } + rest = (sum * 10) % 11; + + if (rest === 10 || rest === 11) { + rest = 0; + } + if (rest !== parseInt(cpf.substring(9, 10), 10)) { + return false; + } + + sum = 0; + for (let i = 1; i <= 10; i++) { + sum += parseInt(cpf.substring(i - 1, i), 10) * (12 - i); + } + rest = (sum * 10) % 11; + + if (rest === 10 || rest === 11) { + rest = 0; + } + + if (rest !== parseInt(cpf.substring(10, 11), 10)) { + return false; + } + return true; +} + diff --git a/test/validators.js b/test/validators.js index 91794d521..6bf6a5dc4 100644 --- a/test/validators.js +++ b/test/validators.js @@ -11070,4 +11070,27 @@ describe('Validators', () => { ], }); }); + + it('should validate if has a valid brazilian cpf', () => { + test({ + validator: 'isCpf', + args: ['57170743019', + '25997505049', + '465.839.300-05', + '369.440.070-29', + '918.309.182-03', + '12839471041', + '84018401229', + '1309972150', + '1570758018', + ], + valid: ['57170743019', '25997505049', '465.839.300-05', '369.440.070-29'], + invalid: ['918.309.182-03', + '12839471041', + '84018401229', + '00000000000', + '1309972150', + '1570758018'], + }); + }); });