@lacussoft/cpf-gen
Version:
Utility function to generate valid CPF (Brazilian ID document).
52 lines (46 loc) • 6.36 kB
JavaScript
/**
* LacusSoft :: cpf-gen v1.3.2
*
* @author [object Object].
* @license MIT - 2020-2025
*/
import cpfFmt from '@lacussoft/cpf-fmt';
import numOnly from 'num-only';
import mergeDeep from 'deepmerge';
const defaultOptions = {
format: false,
prefix: ""
};
function mergeOptions(customOptions = {}) {
return mergeDeep(defaultOptions, customOptions);
}
function numberGenerator(length) {
const numericSequence = [];
while (numericSequence.length < length) {
const random = Math.random() * 10;
const integer = Math.floor(random);
numericSequence.push(integer);
}
return numericSequence;
}
function cpfGen(options) {
const userOptions = mergeOptions(options);
const baseSequence = numOnly(userOptions.prefix);
const prefixLength = baseSequence.length;
if (prefixLength < 0 || prefixLength > 9) {
throw new Error('Option "prefix" must be a string containing between 1 and 9 digits.');
}
const cpfSequence = baseSequence.split("").map(Number).concat(numberGenerator(9 - prefixLength));
[9, 10].forEach((nextNumIndex) => {
let factor = nextNumIndex + 1;
let sum = 0;
for (let n = 0; n < nextNumIndex; n++, factor--) {
sum += cpfSequence[n] * factor;
}
const remainder = 11 - sum % 11;
cpfSequence.push(remainder > 9 ? 0 : remainder);
});
return userOptions.format ? cpfFmt(cpfSequence.join("")) : cpfSequence.join("");
}
export { cpfGen as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvbWVyZ2Utb3B0aW9ucy50cyIsIi4uL3NyYy9udW1iZXItZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL2NwZi1nZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1lcmdlRGVlcCBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdHVhbENwZkdlbmVyYXRvck9wdGlvbnMge1xuICBmb3JtYXQ6IGJvb2xlYW47XG4gIHByZWZpeDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDcGZHZW5lcmF0b3JPcHRpb25zID0gUGFydGlhbDxBY3R1YWxDcGZHZW5lcmF0b3JPcHRpb25zPjtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGZvcm1hdDogZmFsc2UsXG4gIHByZWZpeDogJycsXG59O1xuXG4vKipcbiAqIE1lcmdlIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBkZWZhdWx0IG9uZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhjdXN0b21PcHRpb25zOiBDcGZHZW5lcmF0b3JPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIG1lcmdlRGVlcChkZWZhdWx0T3B0aW9ucywgY3VzdG9tT3B0aW9ucykgYXMgQWN0dWFsQ3BmR2VuZXJhdG9yT3B0aW9ucztcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VPcHRpb25zO1xuIiwiLyoqXG4gKiBHZW5lcmF0ZSBhbiBhcnJheSBvZiByYW5kb20gbnVtYmVycyAoYXMgc3RyaW5nKSBiZXR3ZWVuIDAgYW5kICA5LlxuICovXG5mdW5jdGlvbiBudW1iZXJHZW5lcmF0b3IobGVuZ3RoOiBudW1iZXIpIHtcbiAgY29uc3QgbnVtZXJpY1NlcXVlbmNlOiBudW1iZXJbXSA9IFtdO1xuXG4gIHdoaWxlIChudW1lcmljU2VxdWVuY2UubGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKSAqIDEwO1xuICAgIGNvbnN0IGludGVnZXIgPSBNYXRoLmZsb29yKHJhbmRvbSk7XG5cbiAgICBudW1lcmljU2VxdWVuY2UucHVzaChpbnRlZ2VyKTtcbiAgfVxuXG4gIHJldHVybiBudW1lcmljU2VxdWVuY2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG51bWJlckdlbmVyYXRvcjtcbiIsImltcG9ydCBjcGZGbXQgZnJvbSAnQGxhY3Vzc29mdC9jcGYtZm10JztcbmltcG9ydCBudW1Pbmx5IGZyb20gJ251bS1vbmx5JztcblxuaW1wb3J0IG1lcmdlT3B0aW9ucyBmcm9tICcuL21lcmdlLW9wdGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBDcGZHZW5lcmF0b3JPcHRpb25zIH0gZnJvbSAnLi9tZXJnZS1vcHRpb25zJztcbmltcG9ydCBudW1iZXJHZW5lcmF0b3IgZnJvbSAnLi9udW1iZXItZ2VuZXJhdG9yJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHZhbGlkIENQRiAoQnJhemlsaWFuIElEIGRvY3VtZW50KSBudW1lcmljIHNlcXVlbmNlLlxuICovXG5mdW5jdGlvbiBjcGZHZW4ob3B0aW9ucz86IENwZkdlbmVyYXRvck9wdGlvbnMpIHtcbiAgY29uc3QgdXNlck9wdGlvbnMgPSBtZXJnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGJhc2VTZXF1ZW5jZSA9IG51bU9ubHkodXNlck9wdGlvbnMucHJlZml4KTtcbiAgY29uc3QgcHJlZml4TGVuZ3RoID0gYmFzZVNlcXVlbmNlLmxlbmd0aDtcblxuICBpZiAocHJlZml4TGVuZ3RoIDwgMCB8fCBwcmVmaXhMZW5ndGggPiA5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPcHRpb24gXCJwcmVmaXhcIiBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYmV0d2VlbiAxIGFuZCA5IGRpZ2l0cy4nKTtcbiAgfVxuXG4gIGNvbnN0IGNwZlNlcXVlbmNlID0gYmFzZVNlcXVlbmNlXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoTnVtYmVyKVxuICAgIC5jb25jYXQobnVtYmVyR2VuZXJhdG9yKDkgLSBwcmVmaXhMZW5ndGgpKTtcbiAgWzksIDEwXS5mb3JFYWNoKChuZXh0TnVtSW5kZXgpID0+IHtcbiAgICBsZXQgZmFjdG9yID0gbmV4dE51bUluZGV4ICsgMTtcbiAgICBsZXQgc3VtID0gMDtcblxuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbmV4dE51bUluZGV4OyBuKyssIGZhY3Rvci0tKSB7XG4gICAgICBzdW0gKz0gY3BmU2VxdWVuY2Vbbl0gKiBmYWN0b3I7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtYWluZGVyID0gMTEgLSAoc3VtICUgMTEpO1xuICAgIGNwZlNlcXVlbmNlLnB1c2gocmVtYWluZGVyID4gOSA/IDAgOiByZW1haW5kZXIpO1xuICB9KTtcblxuICByZXR1cm4gdXNlck9wdGlvbnMuZm9ybWF0ID8gY3BmRm10KGNwZlNlcXVlbmNlLmpvaW4oJycpKSA6IGNwZlNlcXVlbmNlLmpvaW4oJycpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcGZHZW47XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFTQSxNQUFNLGNBQWlCLEdBQUE7QUFBQSxFQUNyQixNQUFRLEVBQUEsS0FBQTtBQUFBLEVBQ1IsTUFBUSxFQUFBO0FBQ1YsQ0FBQTtBQUtBLFNBQVMsWUFBQSxDQUFhLGFBQXFDLEdBQUEsRUFBSSxFQUFBO0FBQzdELEVBQU8sT0FBQSxTQUFBLENBQVUsZ0JBQWdCLGFBQWEsQ0FBQTtBQUNoRDs7QUNoQkEsU0FBUyxnQkFBZ0IsTUFBZ0IsRUFBQTtBQUN2QyxFQUFBLE1BQU0sa0JBQTRCLEVBQUM7QUFFbkMsRUFBTyxPQUFBLGVBQUEsQ0FBZ0IsU0FBUyxNQUFRLEVBQUE7QUFDdEMsSUFBTSxNQUFBLE1BQUEsR0FBUyxJQUFLLENBQUEsTUFBQSxFQUFXLEdBQUEsRUFBQTtBQUMvQixJQUFNLE1BQUEsT0FBQSxHQUFVLElBQUssQ0FBQSxLQUFBLENBQU0sTUFBTSxDQUFBO0FBRWpDLElBQUEsZUFBQSxDQUFnQixLQUFLLE9BQU8sQ0FBQTtBQUFBO0FBRzlCLEVBQU8sT0FBQSxlQUFBO0FBQ1Q7O0FDSkEsU0FBUyxPQUFPLE9BQStCLEVBQUE7QUFDN0MsRUFBTSxNQUFBLFdBQUEsR0FBYyxhQUFhLE9BQU8sQ0FBQTtBQUN4QyxFQUFNLE1BQUEsWUFBQSxHQUFlLE9BQVEsQ0FBQSxXQUFBLENBQVksTUFBTSxDQUFBO0FBQy9DLEVBQUEsTUFBTSxlQUFlLFlBQWEsQ0FBQSxNQUFBO0FBRWxDLEVBQUksSUFBQSxZQUFBLEdBQWUsQ0FBSyxJQUFBLFlBQUEsR0FBZSxDQUFHLEVBQUE7QUFDeEMsSUFBTSxNQUFBLElBQUksTUFBTSxxRUFBcUUsQ0FBQTtBQUFBO0FBR3ZGLEVBQUEsTUFBTSxXQUFjLEdBQUEsWUFBQSxDQUNqQixLQUFNLENBQUEsRUFBRSxDQUNSLENBQUEsR0FBQSxDQUFJLE1BQU0sQ0FBQSxDQUNWLE1BQU8sQ0FBQSxlQUFBLENBQWdCLENBQUksR0FBQSxZQUFZLENBQUMsQ0FBQTtBQUMzQyxFQUFBLENBQUMsQ0FBRyxFQUFBLEVBQUUsQ0FBRSxDQUFBLE9BQUEsQ0FBUSxDQUFDLFlBQWlCLEtBQUE7QUFDaEMsSUFBQSxJQUFJLFNBQVMsWUFBZSxHQUFBLENBQUE7QUFDNUIsSUFBQSxJQUFJLEdBQU0sR0FBQSxDQUFBO0FBRVYsSUFBQSxLQUFBLElBQVMsQ0FBSSxHQUFBLENBQUEsRUFBRyxDQUFJLEdBQUEsWUFBQSxFQUFjLEtBQUssTUFBVSxFQUFBLEVBQUE7QUFDL0MsTUFBTyxHQUFBLElBQUEsV0FBQSxDQUFZLENBQUMsQ0FBSSxHQUFBLE1BQUE7QUFBQTtBQUcxQixJQUFNLE1BQUEsU0FBQSxHQUFZLEtBQU0sR0FBTSxHQUFBLEVBQUE7QUFDOUIsSUFBQSxXQUFBLENBQVksSUFBSyxDQUFBLFNBQUEsR0FBWSxDQUFJLEdBQUEsQ0FBQSxHQUFJLFNBQVMsQ0FBQTtBQUFBLEdBQy9DLENBQUE7QUFFRCxFQUFPLE9BQUEsV0FBQSxDQUFZLE1BQVMsR0FBQSxNQUFBLENBQU8sV0FBWSxDQUFBLElBQUEsQ0FBSyxFQUFFLENBQUMsQ0FBQSxHQUFJLFdBQVksQ0FBQSxJQUFBLENBQUssRUFBRSxDQUFBO0FBQ2hGOzs7OyJ9