@lacussoft/cpf-gen
Version:
Utility function to generate valid CPF (Brazilian ID document).
47 lines (41 loc) • 6.3 kB
JavaScript
;
var cpfFmt = require('@lacussoft/cpf-fmt');
var numOnly = require('num-only');
var mergeDeep = require('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("");
}
module.exports = cpfGen;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlcyI6WyIuLi9zcmMvbWVyZ2Utb3B0aW9ucy50cyIsIi4uL3NyYy9udW1iZXItZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL2NwZi1nZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1lcmdlRGVlcCBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdHVhbENwZkdlbmVyYXRvck9wdGlvbnMge1xuICBmb3JtYXQ6IGJvb2xlYW47XG4gIHByZWZpeDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDcGZHZW5lcmF0b3JPcHRpb25zID0gUGFydGlhbDxBY3R1YWxDcGZHZW5lcmF0b3JPcHRpb25zPjtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGZvcm1hdDogZmFsc2UsXG4gIHByZWZpeDogJycsXG59O1xuXG4vKipcbiAqIE1lcmdlIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBkZWZhdWx0IG9uZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhjdXN0b21PcHRpb25zOiBDcGZHZW5lcmF0b3JPcHRpb25zID0ge30pOiBBY3R1YWxDcGZHZW5lcmF0b3JPcHRpb25zIHtcbiAgcmV0dXJuIG1lcmdlRGVlcChkZWZhdWx0T3B0aW9ucywgY3VzdG9tT3B0aW9ucyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlT3B0aW9ucztcbiIsIi8qKlxuICogR2VuZXJhdGUgYW4gYXJyYXkgb2YgcmFuZG9tIG51bWJlcnMgKGFzIHN0cmluZykgYmV0d2VlbiAwIGFuZCAgOS5cbiAqL1xuZnVuY3Rpb24gbnVtYmVyR2VuZXJhdG9yKGxlbmd0aDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCBudW1lcmljU2VxdWVuY2U6IG51bWJlcltdID0gW107XG5cbiAgd2hpbGUgKG51bWVyaWNTZXF1ZW5jZS5sZW5ndGggPCBsZW5ndGgpIHtcbiAgICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpICogMTA7XG4gICAgY29uc3QgaW50ZWdlciA9IE1hdGguZmxvb3IocmFuZG9tKTtcblxuICAgIG51bWVyaWNTZXF1ZW5jZS5wdXNoKGludGVnZXIpO1xuICB9XG5cbiAgcmV0dXJuIG51bWVyaWNTZXF1ZW5jZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbnVtYmVyR2VuZXJhdG9yO1xuIiwiaW1wb3J0IGNwZkZtdCBmcm9tICdAbGFjdXNzb2Z0L2NwZi1mbXQnO1xuaW1wb3J0IG51bU9ubHkgZnJvbSAnbnVtLW9ubHknO1xuXG5pbXBvcnQgbWVyZ2VPcHRpb25zIGZyb20gJy4vbWVyZ2Utb3B0aW9ucyc7XG5pbXBvcnQgdHlwZSB7IENwZkdlbmVyYXRvck9wdGlvbnMgfSBmcm9tICcuL21lcmdlLW9wdGlvbnMnO1xuaW1wb3J0IG51bWJlckdlbmVyYXRvciBmcm9tICcuL251bWJlci1nZW5lcmF0b3InO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgdmFsaWQgQ1BGIChCcmF6aWxpYW4gSUQgZG9jdW1lbnQpIG51bWVyaWMgc2VxdWVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNwZkdlbihvcHRpb25zPzogQ3BmR2VuZXJhdG9yT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHVzZXJPcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBiYXNlU2VxdWVuY2UgPSBudW1Pbmx5KHVzZXJPcHRpb25zLnByZWZpeCk7XG4gIGNvbnN0IHByZWZpeExlbmd0aCA9IGJhc2VTZXF1ZW5jZS5sZW5ndGg7XG5cbiAgaWYgKHByZWZpeExlbmd0aCA8IDAgfHwgcHJlZml4TGVuZ3RoID4gOSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT3B0aW9uIFwicHJlZml4XCIgbXVzdCBiZSBhIHN0cmluZyBjb250YWluaW5nIGJldHdlZW4gMSBhbmQgOSBkaWdpdHMuJyk7XG4gIH1cblxuICBjb25zdCBjcGZTZXF1ZW5jZSA9IGJhc2VTZXF1ZW5jZVxuICAgIC5zcGxpdCgnJylcbiAgICAubWFwKE51bWJlcilcbiAgICAuY29uY2F0KG51bWJlckdlbmVyYXRvcig5IC0gcHJlZml4TGVuZ3RoKSk7XG4gIFs5LCAxMF0uZm9yRWFjaCgobmV4dE51bUluZGV4KSA9PiB7XG4gICAgbGV0IGZhY3RvciA9IG5leHROdW1JbmRleCArIDE7XG4gICAgbGV0IHN1bSA9IDA7XG5cbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5leHROdW1JbmRleDsgbisrLCBmYWN0b3ItLSkge1xuICAgICAgc3VtICs9IGNwZlNlcXVlbmNlW25dICogZmFjdG9yO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbWFpbmRlciA9IDExIC0gKHN1bSAlIDExKTtcbiAgICBjcGZTZXF1ZW5jZS5wdXNoKHJlbWFpbmRlciA+IDkgPyAwIDogcmVtYWluZGVyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHVzZXJPcHRpb25zLmZvcm1hdCA/IGNwZkZtdChjcGZTZXF1ZW5jZS5qb2luKCcnKSkgOiBjcGZTZXF1ZW5jZS5qb2luKCcnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3BmR2VuO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQVNBLE1BQU0sY0FBaUIsR0FBQTtBQUFBLEVBQ3JCLE1BQVEsRUFBQSxLQUFBO0FBQUEsRUFDUixNQUFRLEVBQUE7QUFDVixDQUFBO0FBS0EsU0FBUyxZQUFBLENBQWEsYUFBcUMsR0FBQSxFQUErQixFQUFBO0FBQ3hGLEVBQU8sT0FBQSxTQUFBLENBQVUsZ0JBQWdCLGFBQWEsQ0FBQTtBQUNoRDs7QUNoQkEsU0FBUyxnQkFBZ0IsTUFBMEIsRUFBQTtBQUNqRCxFQUFBLE1BQU0sa0JBQTRCLEVBQUM7QUFFbkMsRUFBTyxPQUFBLGVBQUEsQ0FBZ0IsU0FBUyxNQUFRLEVBQUE7QUFDdEMsSUFBTSxNQUFBLE1BQUEsR0FBUyxJQUFLLENBQUEsTUFBQSxFQUFXLEdBQUEsRUFBQTtBQUMvQixJQUFNLE1BQUEsT0FBQSxHQUFVLElBQUssQ0FBQSxLQUFBLENBQU0sTUFBTSxDQUFBO0FBRWpDLElBQUEsZUFBQSxDQUFnQixLQUFLLE9BQU8sQ0FBQTtBQUFBO0FBRzlCLEVBQU8sT0FBQSxlQUFBO0FBQ1Q7O0FDSkEsU0FBUyxPQUFPLE9BQXVDLEVBQUE7QUFDckQsRUFBTSxNQUFBLFdBQUEsR0FBYyxhQUFhLE9BQU8sQ0FBQTtBQUN4QyxFQUFNLE1BQUEsWUFBQSxHQUFlLE9BQVEsQ0FBQSxXQUFBLENBQVksTUFBTSxDQUFBO0FBQy9DLEVBQUEsTUFBTSxlQUFlLFlBQWEsQ0FBQSxNQUFBO0FBRWxDLEVBQUksSUFBQSxZQUFBLEdBQWUsQ0FBSyxJQUFBLFlBQUEsR0FBZSxDQUFHLEVBQUE7QUFDeEMsSUFBTSxNQUFBLElBQUksTUFBTSxxRUFBcUUsQ0FBQTtBQUFBO0FBR3ZGLEVBQUEsTUFBTSxXQUFjLEdBQUEsWUFBQSxDQUNqQixLQUFNLENBQUEsRUFBRSxDQUNSLENBQUEsR0FBQSxDQUFJLE1BQU0sQ0FBQSxDQUNWLE1BQU8sQ0FBQSxlQUFBLENBQWdCLENBQUksR0FBQSxZQUFZLENBQUMsQ0FBQTtBQUMzQyxFQUFBLENBQUMsQ0FBRyxFQUFBLEVBQUUsQ0FBRSxDQUFBLE9BQUEsQ0FBUSxDQUFDLFlBQWlCLEtBQUE7QUFDaEMsSUFBQSxJQUFJLFNBQVMsWUFBZSxHQUFBLENBQUE7QUFDNUIsSUFBQSxJQUFJLEdBQU0sR0FBQSxDQUFBO0FBRVYsSUFBQSxLQUFBLElBQVMsQ0FBSSxHQUFBLENBQUEsRUFBRyxDQUFJLEdBQUEsWUFBQSxFQUFjLEtBQUssTUFBVSxFQUFBLEVBQUE7QUFDL0MsTUFBTyxHQUFBLElBQUEsV0FBQSxDQUFZLENBQUMsQ0FBSSxHQUFBLE1BQUE7QUFBQTtBQUcxQixJQUFNLE1BQUEsU0FBQSxHQUFZLEtBQU0sR0FBTSxHQUFBLEVBQUE7QUFDOUIsSUFBQSxXQUFBLENBQVksSUFBSyxDQUFBLFNBQUEsR0FBWSxDQUFJLEdBQUEsQ0FBQSxHQUFJLFNBQVMsQ0FBQTtBQUFBLEdBQy9DLENBQUE7QUFFRCxFQUFPLE9BQUEsV0FBQSxDQUFZLE1BQVMsR0FBQSxNQUFBLENBQU8sV0FBWSxDQUFBLElBQUEsQ0FBSyxFQUFFLENBQUMsQ0FBQSxHQUFJLFdBQVksQ0FBQSxJQUFBLENBQUssRUFBRSxDQUFBO0FBQ2hGOzs7OyJ9