@lacussoft/cnpj-gen
Version:
Utility function to generate valid CNPJ (Brazilian company ID).
62 lines (54 loc) • 8.15 kB
JavaScript
/**
* LacusSoft :: cnpj-gen v1.2.0
*
* @author Julio L. Muller.
* @license MIT - 2021-2025
*/
;
var cnpjFmt = require('@lacussoft/cnpj-fmt');
var numOnly = require('num-only');
var mergeDeep = require('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("");
}
module.exports = cnpjGen;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2FsY3VsYXRlLWRpZ2l0LnRzIiwiLi4vc3JjL21lcmdlLW9wdGlvbnMudHMiLCIuLi9zcmMvbnVtYmVyLWdlbmVyYXRvci50cyIsIi4uL3NyYy9jbnBqLWdlbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQ2FsY3VsYXRlIHRoZSB2ZXJpZmllciBkaWdpdCBiYXNlZCBvbiBDTlBKIGJhc2UgbnVtZXJpYyBzZXF1ZW5jZS5cbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlRGlnaXQoY25walNlcXVlbmNlOiBudW1iZXJbXSkge1xuICBsZXQgaW5kZXggPSAyXG4gIGNvbnN0IHN1bSA9IFsuLi5jbnBqU2VxdWVuY2VdLnJldmVyc2UoKS5yZWR1Y2UoKHByZXZpb3VzUmVzdWx0LCBudW1iZXIpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBwcmV2aW91c1Jlc3VsdCArIG51bWJlciAqIGluZGV4XG4gICAgaW5kZXggPSBpbmRleCA9PT0gOSA/IDIgOiBpbmRleCArIDFcblxuICAgIHJldHVybiByZXN1bHRcbiAgfSwgMClcblxuICBjb25zdCByZW1haW5kZXIgPSBzdW0gJSAxMVxuXG4gIHJldHVybiByZW1haW5kZXIgPCAyID8gMCA6IDExIC0gcmVtYWluZGVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhbGN1bGF0ZURpZ2l0XG4iLCJpbXBvcnQgbWVyZ2VEZWVwIGZyb20gJ2RlZXBtZXJnZSdcblxuZXhwb3J0IHR5cGUgQWN0dWFsQ25wakdlbmVyYXRvck9wdGlvbnMgPSB7XG4gIGZvcm1hdDogYm9vbGVhblxuICBwcmVmaXg6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBDbnBqR2VuZXJhdG9yT3B0aW9ucyA9IFBhcnRpYWw8QWN0dWFsQ25wakdlbmVyYXRvck9wdGlvbnM+XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBmb3JtYXQ6IGZhbHNlLFxuICBwcmVmaXg6ICcnLFxufVxuXG4vKipcbiAqIE1lcmdlIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBkZWZhdWx0IG9uZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhjdXN0b21PcHRpb25zOiBDbnBqR2VuZXJhdG9yT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBtZXJnZURlZXAoZGVmYXVsdE9wdGlvbnMsIGN1c3RvbU9wdGlvbnMpIGFzIEFjdHVhbENucGpHZW5lcmF0b3JPcHRpb25zXG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlT3B0aW9uc1xuIiwiXG4vKipcbiAqIEdlbmVyYXRlIGFuIGFycmF5IG9mIHJhbmRvbSBudW1iZXJzIChhcyBzdHJpbmcpIGJldHdlZW4gMCBhbmQgIDkuXG4gKi9cbmZ1bmN0aW9uIG51bWJlckdlbmVyYXRvcihsZW5ndGg6IG51bWJlcikge1xuICBjb25zdCBudW1lcmljU2VxdWVuY2U6IG51bWJlcltdID0gW11cblxuICB3aGlsZSAobnVtZXJpY1NlcXVlbmNlLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkgKiAxMFxuICAgIGNvbnN0IGludGVnZXIgPSBNYXRoLmZsb29yKHJhbmRvbSlcblxuICAgIG51bWVyaWNTZXF1ZW5jZS5wdXNoKGludGVnZXIpXG4gIH1cblxuICByZXR1cm4gbnVtZXJpY1NlcXVlbmNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IG51bWJlckdlbmVyYXRvclxuIiwiaW1wb3J0IGNucGpGbXQgZnJvbSAnQGxhY3Vzc29mdC9jbnBqLWZtdCdcbmltcG9ydCBudW1Pbmx5IGZyb20gJ251bS1vbmx5J1xuXG5pbXBvcnQgY2FsY3VsYXRlRGlnaXQgZnJvbSAnLi9jYWxjdWxhdGUtZGlnaXQnXG5pbXBvcnQgbWVyZ2VPcHRpb25zIGZyb20gJy4vbWVyZ2Utb3B0aW9ucydcbmltcG9ydCB0eXBlIHsgQ25wakdlbmVyYXRvck9wdGlvbnMgfSBmcm9tICcuL21lcmdlLW9wdGlvbnMnXG5pbXBvcnQgbnVtYmVyR2VuZXJhdG9yIGZyb20gJy4vbnVtYmVyLWdlbmVyYXRvcidcblxuXG4vKipcbiAqIEdlbmVyYXRlIGEgdmFsaWQgQ05QSiAoQnJhemlsaWFuIGNvbXBhbnkgSUQpIG51bWVyaWMgc2VxdWVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNucGpHZW4ob3B0aW9ucz86IENucGpHZW5lcmF0b3JPcHRpb25zKSB7XG4gIGNvbnN0IHVzZXJPcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMpXG4gIGNvbnN0IGJhc2VTZXF1ZW5jZSA9IG51bU9ubHkodXNlck9wdGlvbnMucHJlZml4KVxuICBjb25zdCBwcmVmaXhMZW5ndGggPSBiYXNlU2VxdWVuY2UubGVuZ3RoXG5cbiAgaWYgKHByZWZpeExlbmd0aCA8IDAgfHwgcHJlZml4TGVuZ3RoID4gMTIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbiBcInByZWZpeFwiIG11c3QgYmUgYSBzdHJpbmcgY29udGFpbmluZyBiZXR3ZWVuIDEgYW5kIDEyIGRpZ2l0cy4nKVxuICB9XG4gIGlmIChwcmVmaXhMZW5ndGggPiA4ICYmIGJhc2VTZXF1ZW5jZS5zbGljZSg4KSA9PT0gJzAwMDAnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYnJhbmNoIElEIChjaGFyYWN0ZXJzIDggdG8gMTEpIGNhbm5vdCBiZSBcIjAwMDBcIi4nKVxuICB9XG5cbiAgY29uc3QgYnJhbmNoSUQgPSBbMCwgMCwgMCwgTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkgKiA5KV1cbiAgY29uc3QgY25walNlcXVlbmNlID0gYmFzZVNlcXVlbmNlXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoTnVtYmVyKVxuICAgIC5jb25jYXQobnVtYmVyR2VuZXJhdG9yKDggLSBwcmVmaXhMZW5ndGgpKVxuICAgIC5jb25jYXQoYnJhbmNoSUQuc2xpY2UoMCwgMTIgLSBwcmVmaXhMZW5ndGgpKVxuXG4gIGNucGpTZXF1ZW5jZS5wdXNoKGNhbGN1bGF0ZURpZ2l0KGNucGpTZXF1ZW5jZSkpXG4gIGNucGpTZXF1ZW5jZS5wdXNoKGNhbGN1bGF0ZURpZ2l0KGNucGpTZXF1ZW5jZSkpXG5cbiAgcmV0dXJuIHVzZXJPcHRpb25zLmZvcm1hdFxuICAgID8gY25wakZtdChjbnBqU2VxdWVuY2Uuam9pbignJykpXG4gICAgOiBjbnBqU2VxdWVuY2Uuam9pbignJylcbn1cblxuZXhwb3J0IGRlZmF1bHQgY25wakdlblxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFJQSxTQUFTLGVBQWUsWUFBd0IsRUFBQTtBQUM5QyxFQUFBLElBQUksS0FBUSxHQUFBLENBQUE7QUFDWixFQUFNLE1BQUEsR0FBQSxHQUFNLENBQUMsR0FBRyxZQUFZLENBQUEsQ0FBRSxTQUFVLENBQUEsTUFBQSxDQUFPLENBQUMsY0FBQSxFQUFnQixNQUFXLEtBQUE7QUFDekUsSUFBTSxNQUFBLE1BQUEsR0FBUyxpQkFBaUIsTUFBUyxHQUFBLEtBQUE7QUFDekMsSUFBUSxLQUFBLEdBQUEsS0FBQSxLQUFVLENBQUksR0FBQSxDQUFBLEdBQUksS0FBUSxHQUFBLENBQUE7QUFFbEMsSUFBTyxPQUFBLE1BQUE7QUFBQSxLQUNOLENBQUMsQ0FBQTtBQUVKLEVBQUEsTUFBTSxZQUFZLEdBQU0sR0FBQSxFQUFBO0FBRXhCLEVBQU8sT0FBQSxTQUFBLEdBQVksQ0FBSSxHQUFBLENBQUEsR0FBSSxFQUFLLEdBQUEsU0FBQTtBQUNsQzs7QUNQQSxNQUFNLGNBQWlCLEdBQUE7QUFBQSxFQUNyQixNQUFRLEVBQUEsS0FBQTtBQUFBLEVBQ1IsTUFBUSxFQUFBO0FBQ1YsQ0FBQTtBQUtBLFNBQVMsWUFBQSxDQUFhLGFBQXNDLEdBQUEsRUFBSSxFQUFBO0FBQzlELEVBQU8sT0FBQSxTQUFBLENBQVUsZ0JBQWdCLGFBQWEsQ0FBQTtBQUNoRDs7QUNmQSxTQUFTLGdCQUFnQixNQUFnQixFQUFBO0FBQ3ZDLEVBQUEsTUFBTSxrQkFBNEIsRUFBQztBQUVuQyxFQUFPLE9BQUEsZUFBQSxDQUFnQixTQUFTLE1BQVEsRUFBQTtBQUN0QyxJQUFNLE1BQUEsTUFBQSxHQUFTLElBQUssQ0FBQSxNQUFBLEVBQVcsR0FBQSxFQUFBO0FBQy9CLElBQU0sTUFBQSxPQUFBLEdBQVUsSUFBSyxDQUFBLEtBQUEsQ0FBTSxNQUFNLENBQUE7QUFFakMsSUFBQSxlQUFBLENBQWdCLEtBQUssT0FBTyxDQUFBO0FBQUE7QUFHOUIsRUFBTyxPQUFBLGVBQUE7QUFDVDs7QUNIQSxTQUFTLFFBQVEsT0FBZ0MsRUFBQTtBQUMvQyxFQUFNLE1BQUEsV0FBQSxHQUFjLGFBQWEsT0FBTyxDQUFBO0FBQ3hDLEVBQU0sTUFBQSxZQUFBLEdBQWUsT0FBUSxDQUFBLFdBQUEsQ0FBWSxNQUFNLENBQUE7QUFDL0MsRUFBQSxNQUFNLGVBQWUsWUFBYSxDQUFBLE1BQUE7QUFFbEMsRUFBSSxJQUFBLFlBQUEsR0FBZSxDQUFLLElBQUEsWUFBQSxHQUFlLEVBQUksRUFBQTtBQUN6QyxJQUFNLE1BQUEsSUFBSSxNQUFNLHNFQUFzRSxDQUFBO0FBQUE7QUFFeEYsRUFBQSxJQUFJLGVBQWUsQ0FBSyxJQUFBLFlBQUEsQ0FBYSxLQUFNLENBQUEsQ0FBQyxNQUFNLE1BQVEsRUFBQTtBQUN4RCxJQUFNLE1BQUEsSUFBSSxNQUFNLHNEQUFzRCxDQUFBO0FBQUE7QUFHeEUsRUFBTSxNQUFBLFFBQUEsR0FBVyxDQUFDLENBQUEsRUFBRyxDQUFHLEVBQUEsQ0FBQSxFQUFHLElBQUssQ0FBQSxJQUFBLENBQUssSUFBSyxDQUFBLE1BQUEsRUFBVyxHQUFBLENBQUMsQ0FBQyxDQUFBO0FBQ3ZELEVBQU0sTUFBQSxZQUFBLEdBQWUsYUFDbEIsS0FBTSxDQUFBLEVBQUUsRUFDUixHQUFJLENBQUEsTUFBTSxFQUNWLE1BQU8sQ0FBQSxlQUFBLENBQWdCLElBQUksWUFBWSxDQUFDLEVBQ3hDLE1BQU8sQ0FBQSxRQUFBLENBQVMsTUFBTSxDQUFHLEVBQUEsRUFBQSxHQUFLLFlBQVksQ0FBQyxDQUFBO0FBRTlDLEVBQWEsWUFBQSxDQUFBLElBQUEsQ0FBSyxjQUFlLENBQUEsWUFBWSxDQUFDLENBQUE7QUFDOUMsRUFBYSxZQUFBLENBQUEsSUFBQSxDQUFLLGNBQWUsQ0FBQSxZQUFZLENBQUMsQ0FBQTtBQUU5QyxFQUFPLE9BQUEsV0FBQSxDQUFZLE1BQ2YsR0FBQSxPQUFBLENBQVEsWUFBYSxDQUFBLElBQUEsQ0FBSyxFQUFFLENBQUMsQ0FBQSxHQUM3QixZQUFhLENBQUEsSUFBQSxDQUFLLEVBQUUsQ0FBQTtBQUMxQjs7OzsifQ==