@lacussoft/cnpj-gen
Version:
Utility function to generate valid CNPJ (Brazilian company ID).
60 lines (53 loc) • 8.12 kB
JavaScript
/**
* LacusSoft :: cnpj-gen v1.2.0
*
* @author Julio L. Muller.
* @license MIT - 2021-2025
*/
import cnpjFmt from '@lacussoft/cnpj-fmt';
import numOnly from 'num-only';
import mergeDeep from 'deepmerge';
function calculateDigit(cnpjSequence) {
let index = 2;
const sum = [...cnpjSequence].reverse().reduce((previousResult, number) => {
const result = previousResult + number * index;
index = index === 9 ? 2 : index + 1;
return result;
}, 0);
const remainder = sum % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
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 cnpjGen(options) {
const userOptions = mergeOptions(options);
const baseSequence = numOnly(userOptions.prefix);
const prefixLength = baseSequence.length;
if (prefixLength < 0 || prefixLength > 12) {
throw new Error('Option "prefix" must be a string containing between 1 and 12 digits.');
}
if (prefixLength > 8 && baseSequence.slice(8) === "0000") {
throw new Error('The branch ID (characters 8 to 11) cannot be "0000".');
}
const branchID = [0, 0, 0, Math.ceil(Math.random() * 9)];
const cnpjSequence = baseSequence.split("").map(Number).concat(numberGenerator(8 - prefixLength)).concat(branchID.slice(0, 12 - prefixLength));
cnpjSequence.push(calculateDigit(cnpjSequence));
cnpjSequence.push(calculateDigit(cnpjSequence));
return userOptions.format ? cnpjFmt(cnpjSequence.join("")) : cnpjSequence.join("");
}
export { cnpjGen as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2FsY3VsYXRlLWRpZ2l0LnRzIiwiLi4vc3JjL21lcmdlLW9wdGlvbnMudHMiLCIuLi9zcmMvbnVtYmVyLWdlbmVyYXRvci50cyIsIi4uL3NyYy9jbnBqLWdlbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQ2FsY3VsYXRlIHRoZSB2ZXJpZmllciBkaWdpdCBiYXNlZCBvbiBDTlBKIGJhc2UgbnVtZXJpYyBzZXF1ZW5jZS5cbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlRGlnaXQoY25walNlcXVlbmNlOiBudW1iZXJbXSkge1xuICBsZXQgaW5kZXggPSAyXG4gIGNvbnN0IHN1bSA9IFsuLi5jbnBqU2VxdWVuY2VdLnJldmVyc2UoKS5yZWR1Y2UoKHByZXZpb3VzUmVzdWx0LCBudW1iZXIpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBwcmV2aW91c1Jlc3VsdCArIG51bWJlciAqIGluZGV4XG4gICAgaW5kZXggPSBpbmRleCA9PT0gOSA/IDIgOiBpbmRleCArIDFcblxuICAgIHJldHVybiByZXN1bHRcbiAgfSwgMClcblxuICBjb25zdCByZW1haW5kZXIgPSBzdW0gJSAxMVxuXG4gIHJldHVybiByZW1haW5kZXIgPCAyID8gMCA6IDExIC0gcmVtYWluZGVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhbGN1bGF0ZURpZ2l0XG4iLCJpbXBvcnQgbWVyZ2VEZWVwIGZyb20gJ2RlZXBtZXJnZSdcblxuZXhwb3J0IHR5cGUgQWN0dWFsQ25wakdlbmVyYXRvck9wdGlvbnMgPSB7XG4gIGZvcm1hdDogYm9vbGVhblxuICBwcmVmaXg6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBDbnBqR2VuZXJhdG9yT3B0aW9ucyA9IFBhcnRpYWw8QWN0dWFsQ25wakdlbmVyYXRvck9wdGlvbnM+XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBmb3JtYXQ6IGZhbHNlLFxuICBwcmVmaXg6ICcnLFxufVxuXG4vKipcbiAqIE1lcmdlIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBkZWZhdWx0IG9uZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhjdXN0b21PcHRpb25zOiBDbnBqR2VuZXJhdG9yT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBtZXJnZURlZXAoZGVmYXVsdE9wdGlvbnMsIGN1c3RvbU9wdGlvbnMpIGFzIEFjdHVhbENucGpHZW5lcmF0b3JPcHRpb25zXG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlT3B0aW9uc1xuIiwiXG4vKipcbiAqIEdlbmVyYXRlIGFuIGFycmF5IG9mIHJhbmRvbSBudW1iZXJzIChhcyBzdHJpbmcpIGJldHdlZW4gMCBhbmQgIDkuXG4gKi9cbmZ1bmN0aW9uIG51bWJlckdlbmVyYXRvcihsZW5ndGg6IG51bWJlcikge1xuICBjb25zdCBudW1lcmljU2VxdWVuY2U6IG51bWJlcltdID0gW11cblxuICB3aGlsZSAobnVtZXJpY1NlcXVlbmNlLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkgKiAxMFxuICAgIGNvbnN0IGludGVnZXIgPSBNYXRoLmZsb29yKHJhbmRvbSlcblxuICAgIG51bWVyaWNTZXF1ZW5jZS5wdXNoKGludGVnZXIpXG4gIH1cblxuICByZXR1cm4gbnVtZXJpY1NlcXVlbmNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IG51bWJlckdlbmVyYXRvclxuIiwiaW1wb3J0IGNucGpGbXQgZnJvbSAnQGxhY3Vzc29mdC9jbnBqLWZtdCdcbmltcG9ydCBudW1Pbmx5IGZyb20gJ251bS1vbmx5J1xuXG5pbXBvcnQgY2FsY3VsYXRlRGlnaXQgZnJvbSAnLi9jYWxjdWxhdGUtZGlnaXQnXG5pbXBvcnQgbWVyZ2VPcHRpb25zIGZyb20gJy4vbWVyZ2Utb3B0aW9ucydcbmltcG9ydCB0eXBlIHsgQ25wakdlbmVyYXRvck9wdGlvbnMgfSBmcm9tICcuL21lcmdlLW9wdGlvbnMnXG5pbXBvcnQgbnVtYmVyR2VuZXJhdG9yIGZyb20gJy4vbnVtYmVyLWdlbmVyYXRvcidcblxuXG4vKipcbiAqIEdlbmVyYXRlIGEgdmFsaWQgQ05QSiAoQnJhemlsaWFuIGNvbXBhbnkgSUQpIG51bWVyaWMgc2VxdWVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNucGpHZW4ob3B0aW9ucz86IENucGpHZW5lcmF0b3JPcHRpb25zKSB7XG4gIGNvbnN0IHVzZXJPcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMpXG4gIGNvbnN0IGJhc2VTZXF1ZW5jZSA9IG51bU9ubHkodXNlck9wdGlvbnMucHJlZml4KVxuICBjb25zdCBwcmVmaXhMZW5ndGggPSBiYXNlU2VxdWVuY2UubGVuZ3RoXG5cbiAgaWYgKHByZWZpeExlbmd0aCA8IDAgfHwgcHJlZml4TGVuZ3RoID4gMTIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbiBcInByZWZpeFwiIG11c3QgYmUgYSBzdHJpbmcgY29udGFpbmluZyBiZXR3ZWVuIDEgYW5kIDEyIGRpZ2l0cy4nKVxuICB9XG4gIGlmIChwcmVmaXhMZW5ndGggPiA4ICYmIGJhc2VTZXF1ZW5jZS5zbGljZSg4KSA9PT0gJzAwMDAnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYnJhbmNoIElEIChjaGFyYWN0ZXJzIDggdG8gMTEpIGNhbm5vdCBiZSBcIjAwMDBcIi4nKVxuICB9XG5cbiAgY29uc3QgYnJhbmNoSUQgPSBbMCwgMCwgMCwgTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiA5KV1cbiAgY29uc3QgY25walNlcXVlbmNlID0gYmFzZVNlcXVlbmNlXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoTnVtYmVyKVxuICAgIC5jb25jYXQobnVtYmVyR2VuZXJhdG9yKDggLSBwcmVmaXhMZW5ndGgpKVxuICAgIC5jb25jYXQoYnJhbmNoSUQuc2xpY2UoMCwgMTIgLSBwcmVmaXhMZW5ndGgpKVxuXG4gIGNucGpTZXF1ZW5jZS5wdXNoKGNhbGN1bGF0ZURpZ2l0KGNucGpTZXF1ZW5jZSkpXG4gIGNucGpTZXF1ZW5jZS5wdXNoKGNhbGN1bGF0ZURpZ2l0KGNucGpTZXF1ZW5jZSkpXG5cbiAgcmV0dXJuIHVzZXJPcHRpb25zLmZvcm1hdFxuICAgID8gY25wakZtdChjbnBqU2VxdWVuY2Uuam9pbignJykpXG4gICAgOiBjbnBqU2VxdWVuY2Uuam9pbignJylcbn1cblxuZXhwb3J0IGRlZmF1bHQgY25wakdlblxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBSUEsU0FBUyxlQUFlLFlBQXdCLEVBQUE7QUFDOUMsRUFBQSxJQUFJLEtBQVEsR0FBQSxDQUFBO0FBQ1osRUFBTSxNQUFBLEdBQUEsR0FBTSxDQUFDLEdBQUcsWUFBWSxDQUFBLENBQUUsU0FBVSxDQUFBLE1BQUEsQ0FBTyxDQUFDLGNBQUEsRUFBZ0IsTUFBVyxLQUFBO0FBQ3pFLElBQU0sTUFBQSxNQUFBLEdBQVMsaUJBQWlCLE1BQVMsR0FBQSxLQUFBO0FBQ3pDLElBQVEsS0FBQSxHQUFBLEtBQUEsS0FBVSxDQUFJLEdBQUEsQ0FBQSxHQUFJLEtBQVEsR0FBQSxDQUFBO0FBRWxDLElBQU8sT0FBQSxNQUFBO0FBQUEsS0FDTixDQUFDLENBQUE7QUFFSixFQUFBLE1BQU0sWUFBWSxHQUFNLEdBQUEsRUFBQTtBQUV4QixFQUFPLE9BQUEsU0FBQSxHQUFZLENBQUksR0FBQSxDQUFBLEdBQUksRUFBSyxHQUFBLFNBQUE7QUFDbEM7O0FDUEEsTUFBTSxjQUFpQixHQUFBO0FBQUEsRUFDckIsTUFBUSxFQUFBLEtBQUE7QUFBQSxFQUNSLE1BQVEsRUFBQTtBQUNWLENBQUE7QUFLQSxTQUFTLFlBQUEsQ0FBYSxhQUFzQyxHQUFBLEVBQUksRUFBQTtBQUM5RCxFQUFPLE9BQUEsU0FBQSxDQUFVLGdCQUFnQixhQUFhLENBQUE7QUFDaEQ7O0FDZkEsU0FBUyxnQkFBZ0IsTUFBZ0IsRUFBQTtBQUN2QyxFQUFBLE1BQU0sa0JBQTRCLEVBQUM7QUFFbkMsRUFBTyxPQUFBLGVBQUEsQ0FBZ0IsU0FBUyxNQUFRLEVBQUE7QUFDdEMsSUFBTSxNQUFBLE1BQUEsR0FBUyxJQUFLLENBQUEsTUFBQSxFQUFXLEdBQUEsRUFBQTtBQUMvQixJQUFNLE1BQUEsT0FBQSxHQUFVLElBQUssQ0FBQSxLQUFBLENBQU0sTUFBTSxDQUFBO0FBRWpDLElBQUEsZUFBQSxDQUFnQixLQUFLLE9BQU8sQ0FBQTtBQUFBO0FBRzlCLEVBQU8sT0FBQSxlQUFBO0FBQ1Q7O0FDSEEsU0FBUyxRQUFRLE9BQWdDLEVBQUE7QUFDL0MsRUFBTSxNQUFBLFdBQUEsR0FBYyxhQUFhLE9BQU8sQ0FBQTtBQUN4QyxFQUFNLE1BQUEsWUFBQSxHQUFlLE9BQVEsQ0FBQSxXQUFBLENBQVksTUFBTSxDQUFBO0FBQy9DLEVBQUEsTUFBTSxlQUFlLFlBQWEsQ0FBQSxNQUFBO0FBRWxDLEVBQUksSUFBQSxZQUFBLEdBQWUsQ0FBSyxJQUFBLFlBQUEsR0FBZSxFQUFJLEVBQUE7QUFDekMsSUFBTSxNQUFBLElBQUksTUFBTSxzRUFBc0UsQ0FBQTtBQUFBO0FBRXhGLEVBQUEsSUFBSSxlQUFlLENBQUssSUFBQSxZQUFBLENBQWEsS0FBTSxDQUFBLENBQUMsTUFBTSxNQUFRLEVBQUE7QUFDeEQsSUFBTSxNQUFBLElBQUksTUFBTSxzREFBc0QsQ0FBQTtBQUFBO0FBR3hFLEVBQU0sTUFBQSxRQUFBLEdBQVcsQ0FBQyxDQUFBLEVBQUcsQ0FBRyxFQUFBLENBQUEsRUFBRyxJQUFLLENBQUEsSUFBQSxDQUFLLElBQUssQ0FBQSxNQUFBLEVBQVcsR0FBQSxDQUFDLENBQUMsQ0FBQTtBQUN2RCxFQUFNLE1BQUEsWUFBQSxHQUFlLGFBQ2xCLEtBQU0sQ0FBQSxFQUFFLEVBQ1IsR0FBSSxDQUFBLE1BQU0sRUFDVixNQUFPLENBQUEsZUFBQSxDQUFnQixJQUFJLFlBQVksQ0FBQyxFQUN4QyxNQUFPLENBQUEsUUFBQSxDQUFTLE1BQU0sQ0FBRyxFQUFBLEVBQUEsR0FBSyxZQUFZLENBQUMsQ0FBQTtBQUU5QyxFQUFhLFlBQUEsQ0FBQSxJQUFBLENBQUssY0FBZSxDQUFBLFlBQVksQ0FBQyxDQUFBO0FBQzlDLEVBQWEsWUFBQSxDQUFBLElBQUEsQ0FBSyxjQUFlLENBQUEsWUFBWSxDQUFDLENBQUE7QUFFOUMsRUFBTyxPQUFBLFdBQUEsQ0FBWSxNQUNmLEdBQUEsT0FBQSxDQUFRLFlBQWEsQ0FBQSxJQUFBLENBQUssRUFBRSxDQUFDLENBQUEsR0FDN0IsWUFBYSxDQUFBLElBQUEsQ0FBSyxFQUFFLENBQUE7QUFDMUI7Ozs7In0=