@personnummer/generate
Version:
Generate Swedish Personal Identity Numbers
110 lines (108 loc) • 2.86 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
default: () => src_default
});
var randomNumber = (gender) => {
let num = Math.floor(Math.random() * 9);
switch (gender) {
case "male":
if (num % 2 === 0) {
num += 1;
}
break;
case "female":
if (num % 2 !== 0) {
num += 1;
}
break;
default:
break;
}
return num;
};
var randomDate = () => {
const year = new Date().getFullYear();
const start = new Date(year - 100, 1, 1);
const end = new Date(year + 100, 1, 1);
return new Date(
start.getTime() + Math.random() * (end.getTime() - start.getTime())
);
};
var padZero = (i) => i < 10 ? `0${i}` : `${i}`;
var generateSerial = (gender) => "" + randomNumber(gender) + ("" + randomNumber(gender)) + ("" + randomNumber(gender));
var luhn = (str) => {
let v = 0;
let sum = 0;
str += "";
for (let i = 0, l = str.length; i < l; i++) {
v = str[i];
v *= 2 - i % 2;
if (v > 9) {
v -= 9;
}
sum += v;
}
return Math.ceil(sum / 10) * 10 - sum;
};
var src_default = (date, options = {}) => {
let y = 0;
let m = 0;
let d = 0;
if (!(date instanceof Date)) {
options = date;
date = randomDate();
}
y = date.getFullYear();
m = date.getMonth() + 1;
d = date.getDate();
options = Object.assign(
{
gender: "",
format: "long"
},
options || {}
);
let c = "";
y = `${padZero(y)}`;
if (y.length > 2) {
c = y.slice(0, 2);
y = y.slice(2, 4);
}
let serial = generateSerial(options.gender || "");
while (serial === "000") {
serial = generateSerial(options.gender || "");
}
const pin = `${y}${padZero(m)}${padZero(d)}${serial}`;
const full = `${c}${pin}${luhn(pin)}`;
if (options.format === "long") {
return full;
}
let sep = "+";
if (new Date().getFullYear() - parseInt(full.slice(0, 4), 10) < 100) {
sep = "-";
}
return `${full.slice(2, 4)}${full.slice(4, 6)}${full.slice(
6,
8
)}${sep}${full.slice(8)}`;
};
module.exports = src_default;