{"version":3,"file":"index.cjs","sources":["../../src/utils.ts","../../src/consumablestring.ts","../../src/decode.ts","../../src/validate.ts","../../src/encode.ts"],"sourcesContent":["import { MinMax, ActualNumber } from \"./types\";\n\n/**\n * Calculates the checksum of an Estonian personal identification code\n * using one or two passes of modulo-11 checkdigit algorithm.\n * \n * @param {string} code - Estonian personal identification code(isikukood).\n * @returns {Number} The checksum.\n */\n export function calculateChecksum(code: string) {\n    code = code.toString();\n    if(code.length < 10) throw new Error(`Expected input length of at least 10, got ${code.length}`);\n    const data = code.slice(0, 10);\n    \n    const weights1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1];\n    const weights2 = [3, 4, 5, 6, 7, 8, 9, 1, 2, 3];\n\n    // weights1\n    let sum = 0;\n    for(let i = 0; i < data.length; i++) {\n        sum += parseInt(data[i]) * weights1[i];\n    }\n    const modulo1 = sum % 11;\n    if(modulo1 < 10 || isNaN(modulo1))\n        return modulo1;\n\n    // weights2\n    sum = 0;\n    for(let i = 0; i < data.length; i++) {\n        sum += parseInt(data[i]) * weights2[i];\n    }\n    const modulo2 = sum % 11;\n    return modulo2 < 10 ? modulo2 : 0;\n}\n\nexport function determineHospital(id: number, date: Date) {\n    const hospitalStartDate = new Date(\"1989-10-12\");\n    const hospitalEndDate = new Date(\"2013-01-01\");\n\n    if(date > hospitalStartDate && date < hospitalEndDate) {\n        let location: string;\n        let order: number;\n\n        if(id >= 1 && id <= 10) {\n            location = \"Kuressaare haigla\";\n            order = id - 0;\n        } else if(id <= 19) {\n            location = \"Tartu Ülikooli Naistekliinik\";\n            order = id - 10;\n        } else if(id >= 21 && id <= 150) {\n            location = \"Ida-Tallinna keskhaigla, Pelgulinna sünnitusmaja\";\n            order = id - 20;\n        } else if(id <= 160) {\n            location = \"Keila haigla\";\n            order = id - 150;\n        } else if(id <= 220) {\n            location = \"Rapla haigla, Loksa haigla, Hiiumaa haigla\";\n            order = id - 160;\n        } else if(id <= 270) {\n            location = \"Ida-Viru keskhaigla\";\n            order = id - 220;\n        } else if(id <= 370) {\n            location = \"Maarjamõisa kliinikum (Tartu), Jõgeva haigla\";\n            order = id - 270;\n        } else if(id <= 420) {\n            location = \"Narva haigla\";\n            order = id - 370;\n        } else if(id <= 470) {\n            location = \"Pärnu haigla\";\n            order = id - 420;\n        } else if(id <= 490) {\n            location = \"Haapsalu haigla\";\n            order = id - 470;\n        } else if(id <= 520) {\n            location = \"Järvamaa haigla\";\n            order = id - 490;\n        } else if(id <= 570) {\n            location = \"Rakvere haigla, Tapa haigla\";\n            order = id - 520;\n        } else if(id <= 600) {\n            location = \"Valga haigla\";\n            order = id - 570;\n        } else if(id <= 650) {\n            location = \"Viljandi haigla\";\n            order = id - 600;\n        } else if(id <= 700) {\n            location = \"Lõuna-Eesti haigla (Võru), Põlva haigla\";\n            order = id - 650;\n        } else {\n            location = \"Välismaa\";\n            order = id - 700;\n        }\n        return { location, order };\n    }\n    return null;\n}\n\n// export function intOrNaN(str: string, len = 0) {\n//     return isNaN(str.replaceAll(\".\", \"\") as any) || (len && str.length !== len) ? NaN : parseInt(str, 10);\n// }\n\nexport function isNumeric(str: string) {\n    for(let i = 0; i < str.length; i++) {\n        const c = str.charCodeAt(i);\n        // 47 is one charcode before \"0\" and 58 is one after \"9\"\n        if(c < 47 || c > 58) \n            return false;\n    }\n    return !!str.length; // empty string cant be numeric\n}\n\n// isNaN() is not used here because it accepts \".\", which is not acceptable here.\nexport function intOrNaN(str: string, len = 0) {\n    return isNumeric(str) && (len === 0 || str.length === len) ? parseInt(str, 10) : NaN;\n}\n\nexport function removeFromEnd(str: string, char: string) {\n    let lastIndex = str.length;\n    for(let i = lastIndex - 1; i >= 0; i--) {\n        if(str[i] !== char) break;\n        lastIndex = i;\n    }\n    return str.slice(0, lastIndex);\n}\n\nexport function hasLeapYears(year: MinMax & ActualNumber) {\n    const { min, max, actual } = year;\n    if(isInteger(actual)) return !(actual % 4);\n    else if(isInteger(min) && isInteger(max)) {\n        const nextLeapYear = min + 3 * (min % 4);\n        return min <= nextLeapYear && max >= nextLeapYear;\n    }\n    // throw new Error(\"Invalid year\");\n    return true;\n}\n\nexport function tryIntoActual(minMaxActual: MinMax & ActualNumber) {\n    const { actual, min, max } = minMaxActual;\n    if(isInteger(actual)) {\n        return { actual };\n    } else if(isInteger(min) && isInteger(max)) {\n        return (max - min) ? { min, max } : { actual: min };\n    }\n    throw new Error(\"Not minmaxactual\");\n}\n\nexport function asMinMax(minMaxActual: MinMax & ActualNumber) {\n    const { actual, min, max } = minMaxActual;\n    if(isInteger(actual)) {\n        return { min: actual, max: actual };\n    } else if(isInteger(min) && isInteger(max)) {\n        return { min, max };\n    }\n    throw new Error(\"Not minmaxactual\");\n}\n\n// no validity check\nexport function getMonthMaxDay(month: number, year: number) {\n    return month !== 2 ? 30 + ((month > 7 ? month + 1 : (month || 1)) % 2) : (28 + Number(!((year || 0) % 4)));\n}\n\nexport function normalizeMinMax(withminmax?: MinMax): MinMax & ActualNumber | undefined {\n    return withminmax && ((withminmax.max! - withminmax.min!) === 0) ? { actual: withminmax.min } : withminmax;\n}\n\nexport function intersectDecodeAndRangeIntersect(pattern: string, minPattern: string, maxPattern: string) {\n    const i = intersectDecode(pattern, minPattern, maxPattern);\n    return rangeIntersect(i.min, i.max, parseInt(minPattern), parseInt(maxPattern));\n}\n\n// https://scicomp.stackexchange.com/a/26260\nexport function rangeIntersect(r1s: number, r1e: number, r2s: number, r2e: number) {\n    if(r2s > r1e || r1s > r2e) return undefined;\n    return { min: Math.max(r1s, r2s), max: Math.min(r1e, r2e) };\n}\n\nexport function intersectDecode(pattern: string, minPattern: string, maxPattern: string) {\n\tlet minBuilder = [];\n\tlet maxBuilder = [];\n\tfor(let i = 0; i < pattern.length; i++) {\n\t\tif(pattern[i] === \"x\") {\n\t\t\tminBuilder.push(minPattern[i]);\n\t\t\tmaxBuilder.push(maxPattern[i]);\n\t\t} else if(isNumeric(pattern[i])) {\n\t\t\tminBuilder.push(pattern[i]);\n\t\t\tmaxBuilder.push(pattern[i]);\n\t\t} else {\n            throw new Error(\"Invalid input\");\n        }\n\t}\n\treturn { min: parseInt(minBuilder.join(\"\")), max: parseInt(maxBuilder.join(\"\")) };\n}\n\nexport const isInteger = (v: unknown): v is number => Number.isInteger(v);\nexport const asStrSlice = (v: any, i1: number, i2: number): string => v.toString().slice(i1, i2);","export class ConsumableString {\n    str: string;\n    slice: string;\n    constructor(str: string) {\n      this.str = str;\n      this.slice = \"\";\n    }\n  \n    consumeStart(amount: number) {\n      this.slice = this.str.slice(0, amount);\n      this.str = this.str.slice(amount);\n      return this;\n    }\n  \n    trimSliceEnd(char: string) {\n      this.slice = removeFromEnd(this.slice, char);\n      return this;\n    }\n  \n    get() {\n      return this.slice;\n    }\n  \n    parsed() {\n      return !this.str.length\n    }\n}\n\nexport function removeFromEnd(str: string, char: string) {\n    let lastIndex = str.length;\n    for(let i = lastIndex - 1; i >= 0; i--) {\n        if(str[i] !== char) break;\n        lastIndex = i;\n    }\n    return str.slice(0, lastIndex);\n}","import { ConsumableString } from \"./consumablestring\";\nimport { IsikukoodParsed, DecoderCallback, ParseOptions } from \"./types\";\nimport { asMinMax, calculateChecksum, getMonthMaxDay, hasLeapYears, intersectDecode, intersectDecodeAndRangeIntersect, intOrNaN, isInteger, isNumeric, rangeIntersect, tryIntoActual } from \"./utils\";\n\nconst decodingTable: [DecoderCallback, number][] = [\n    [decodeGenderAndCentury, 1],\n    [decodeYear, 2],\n    [decodeMonth, 2],\n    [decodeDay, 2],\n    [decodeSerial, 3],\n    [decodeChecksum, 1]\n];\n\nlet log_error: Function = console.error;\n\nfunction consumeWithPlaceholders(consumable: ConsumableString, amount: number) {\n    return consumable.consumeStart(amount).trimSliceEnd(\"x\").get();\n}\nfunction consumeWithoutPlaceholders(consumable: ConsumableString, amount: number) {\n    return consumable.consumeStart(amount).get();\n}\n\nexport function setErrorLogger(errFn: Function) {\n    log_error = errFn;\n}\n\n/**\n * Decodes an Estonian personal identification code.\n * \n * If a field is incomplete then returns the range in which it could be\n * \n * @param {string} code - Estonian personal identification code.\n * @param {ParseOptions} options - Options to change the behaviour of the function\n * @returns {IsikukoodParsed} Returns validation errors and parsed data.\n */\nexport function decode(code: string, options: ParseOptions = { placeholders: false, checklength: true }): IsikukoodParsed {\n    const { placeholders, checklength } = options;\n    if(placeholders === false && !isNumeric(code)) {\n        throw new Error(\"Input code must contain only numbers\");\n    }\n\n    const data: IsikukoodParsed = { results: { code, valid: false }, errors: {} };\n    const consumable = new ConsumableString(code);\n    // const consume = (placeholders ? consumeWithPlaceholders : consumeWithoutPlaceholders).bind(null, consumable);\n    const consume = consumeWithoutPlaceholders.bind(null, consumable);\n\n    for (let [decoder, positions] of decodingTable) {\n        if (consumable.parsed()) break;\n        decoder(consume(positions).padEnd(positions, \"x\"), data);\n    }\n\n    // if checklength is omitted then the length should be checked too\n    if (checklength !== false && code.length !== 11) {\n        data.errors.length = { required: 11, actual: code.length };\n    }\n\n    const hasErrors = !!Object.keys(data.errors).length;\n    data.results.valid = !(hasErrors || code.length < 11);\n\n    return data;\n}\n\nexport function decodeGenderAndCentury(pattern = \"x\", obj: IsikukoodParsed) {\n    try {\n        if (pattern === \"x\") {\n            obj.results.gender = { actual: \"any\", pattern };\n            obj.results.year = { min: 1800, max: 2199 };\n            return;\n        }\n\n        const genderNr = intOrNaN(pattern);\n        if (genderNr >= 1 && genderNr <= 6) {\n            const mul = Math.floor((genderNr + 1) / 2) - 1;\n            const century = 1800 + mul * 100;\n\n            obj.results.gender = { actual: genderNr % 2 ? \"male\" : \"female\", pattern };\n            obj.results.year = { min: century, max: century + 99 };\n            return;\n        }\n    } catch(e) { log_error(e); }\n    obj.errors.genderAndCentury = { min: 1, max: 6, actual: pattern };\n}\n\nexport function decodeYear(pattern = \"xx\", obj: IsikukoodParsed) {\n    try {\n        const { min, max } = intersectDecodeAndRangeIntersect(pattern, \"00\", \"99\")!;\n        if(isInteger(min) && isInteger(max)) {\n            obj.results.shortYear = {...tryIntoActual({ min, max }), pattern };\n            if(obj.results.year) {\n                const year = asMinMax(obj.results.year);\n                const minYear = (Math.floor(year.min / 100) * 100) + min;\n                const maxYear = (Math.floor(year.max / 100) * 100) + max;\n    \n                // TODO: needs pattern probably\n                obj.results.year = tryIntoActual(rangeIntersect(minYear, maxYear, obj.results.year.min!, obj.results.year.max!)!);\n            }\n            return;\n        }\n    } catch(e) { log_error(e); }\n\n    obj.errors.shortYear = { min: 0, max: 99, actual: pattern };\n}\n\nexport function decodeMonth(pattern = \"xx\", obj: IsikukoodParsed) {\n    try {\n        const { min, max } = intersectDecodeAndRangeIntersect(pattern, \"01\", \"12\")!;\n        if(isInteger(min) && isInteger(max)) {\n            obj.results.month = {...tryIntoActual({ min, max }), pattern };\n            return;\n        }\n    } catch(e) { log_error(e); }\n    obj.errors.month = { min: 1, max: 12, actual: pattern };\n}\n\n// NB: months, where min and max are the same will result in erroneous results\nexport function decodeDay(pattern = \"xx\", obj: IsikukoodParsed) {\n    let maxMonthDay = 31;\n    try {\n        const month = obj.results.month as any;\n\n        const dominantMonth = (month?.max - month?.min) ? 1 : (month?.actual || month?.min || month?.max);\n        const dominantYear = 3 + Number(hasLeapYears((obj.results.year || obj.results.shortYear)!));\n        maxMonthDay = getMonthMaxDay(dominantMonth, dominantYear);\n        console.log(maxMonthDay);\n\n        const { min, max } = intersectDecodeAndRangeIntersect(pattern, \"01\", maxMonthDay.toString().padStart(2, \"x\"))!;\n        if(isInteger(min) && isInteger(max)) {\n            obj.results.day = {...tryIntoActual({ min, max }), pattern };\n            return;\n        }\n    } catch(e) { log_error(e); }\n\n    obj.errors.day = { min: 1, max: maxMonthDay, actual: pattern };\n}\n\nexport function decodeSerial(pattern = \"xxx\", obj: IsikukoodParsed) {\n    try {\n        const { min, max } = intersectDecodeAndRangeIntersect(pattern, \"001\", \"999\")!;\n        if(max !== undefined && min !== undefined) {\n            obj.results.serial = {...tryIntoActual({ min, max }), pattern };\n            return;\n        }\n    } catch(e) { log_error(e); }\n    obj.errors.serial = { min: 1, max: 999, actual: pattern };\n}\n\nexport function decodeChecksum(pattern = \"x\", obj: IsikukoodParsed) { \n    try {\n        const checksumNr = intOrNaN(pattern);\n        if (!isNaN(checksumNr) || pattern === \"x\") {\n            const correctChecksum = calculateChecksum(obj.results.code);\n            if (checksumNr === correctChecksum || pattern === \"x\") {\n                obj.results.checksum = { actual: checksumNr, pattern };\n                return;\n            } else {\n                obj.errors.checksum = { required: correctChecksum, actual: pattern };\n                return;\n            }\n        }\n    } catch(e) { log_error(e); }\n\n    obj.errors.checksum = { min: 0, max: 9, actual: pattern };\n}\n","import { getMonthMaxDay } from \"./utils\";\n\nexport function isValidSerial(serial: number) {\n    return serial > 0 && serial <= 999;\n}\nexport function isValidMonth(month: number) {\n    return month > 0 && month < 13;\n}\nexport function isValidShortYear(year: number) {\n    return year >= 0 && year <= 99;\n}\nexport function isValidYear(year: number) {\n    return year > 1799 && year < 2200;\n}\nexport function isValidDay(day: number, month: number, year: number) {\n    const maxDay = getMonthMaxDay(month, year);\n    return day > 0 && day <= maxDay;\n}","import { ActualNumber, EncoderCallback, IsikukoodData, IsikukoodParsed, MinMax } from \"./types\";\nimport { asStrSlice, calculateChecksum, getMonthMaxDay, hasLeapYears, isInteger, normalizeMinMax } from \"./utils\";\nimport { isValidYear, isValidShortYear, isValidMonth, isValidDay, isValidSerial } from \"./validate\";\n\nconst encodingTable: EncoderCallback[] = [\n    encodeGenderAndCentury,\n    encodeYear,\n    encodeMonth,\n    encodeDay,\n    encodeSerial,\n    encodeChecksum\n];\n\nfunction randomIntegerBetween(start: number, end: number): number {\n    return Math.round(start + (Math.random() * (end - start)));\n}\n\n/**\n * Randomizes a decoded Estonian personal identification code\n * by converting `minmax` and `undefined` fields into `actual` fields.\n * \n * Modifies the input data object.\n * Checksum will be calculated automatically\n * \n * @param {IsikukoodData} data - IsikukoodData object containing data to be randomized\n * @returns {IsikukoodData} Returns the modified `data` parameter\n */\nexport function randomize(data: IsikukoodData): IsikukoodData {\n    const { gender, year, shortYear, month, day, serial, checksum } = data;\n    if(!(gender?.actual === \"male\" || gender?.actual === \"female\")) {\n        data.gender = { actual: Math.random() < 0.5 ? \"male\" : \"female\" };\n    }\n\n    if(!year?.actual) {\n        const currentYear = new Date().getFullYear();\n        const maxYears = 150;\n        if(year?.min && year?.max) {\n            data.year = { actual: Math.round(year.min + (Math.random() * (year.max - year.min))) };\n        } else {\n            const century = (new Date().getFullYear()).toString().slice(0, 2);\n\n            if(shortYear?.actual) {\n                data.year = { actual: parseInt(century + shortYear.actual) };\n            } else if(shortYear?.min && shortYear?.max) {\n                data.year = { actual: parseInt(century + (Math.random() * (shortYear.max - shortYear.min))) };\n            } else {\n                data.year = { actual: Math.round(currentYear - (Math.random() * maxYears)) };\n            }\n        }\n    }\n    data.shortYear = { actual: parseInt(data.year?.actual?.toString().slice(2, 4) as string) };\n\n    if(!month?.actual) {\n        data.month = { actual: randomIntegerBetween(month?.min || 1, month?.max || 12)}\n    }\n    if(!day?.actual) {\n        data.day = { actual: randomIntegerBetween(day?.min || 1, day?.max || getMonthMaxDay(data?.month?.actual as number, data?.year?.actual as number)) };\n    }\n    if(!serial?.actual) {\n        data.serial = { actual: randomIntegerBetween(serial?.min || 1, serial?.max || 999) };\n    }\n    data.checksum = { actual: calculateChecksum(encode(data).slice(0, 10)) };\n    return data;\n}\n\n/**\n * Encodes an Estonian personal identification code.\n * \n * Checksum may be omitted, in which case it will be calculated automatically\n * \n * @param {IsikukoodData} data - IsikukoodData object containing data to be encoded\n * @returns {string} Returns encoded personal identification code.\n */\nexport function encode(data: IsikukoodData | IsikukoodParsed) {\n    const newData = ((data as any).results || data || {}) as IsikukoodData;\n    Object.keys(newData).forEach(key => (newData as any)[key] = normalizeMinMax((newData as any)[key]));\n\n    return encodingTable.map(fn => fn(newData)).join(\"\");\n}\n\nexport function encodeGenderAndCentury(data: IsikukoodData) {\n    const { gender, year } = data;\n    if(gender?.pattern) return gender.pattern;\n\n    const genderOffset = gender?.actual.startsWith(\"m\") ? 0 : (gender?.actual.startsWith(\"f\") ? 1 : NaN);\n\n    let century = NaN;\n    const { min, max, actual } = year!;\n    if(isInteger(actual)) {\n        century = parseInt(asStrSlice(actual, 0, 2));\n    } else if(isInteger(min) && isInteger(max)) {\n        const minCentury = asStrSlice(min, 0, 2);\n        const maxCentury = asStrSlice(max, 0, 2);\n        if(minCentury === maxCentury) {\n            century = parseInt(minCentury);\n        }\n    }\n\n    if(century < 18 || century > 21) throw new Error(\"Invalid year\");\n    return ((1 + genderOffset + (century - 18) * 2) || \"x\").toString();\n}\n\nexport function encodeYear(data: IsikukoodData) {\n    const { year, shortYear } = data;\n    if(shortYear?.pattern) return shortYear.pattern;\n\n    const { encoded, encodedMin, encodedMax } = year ? toEncodableString(year, 2, 4, isValidYear) : (shortYear ? toEncodableString(shortYear, 0, 2, isValidShortYear) : {} as any);\n    return encoded || intersectEncode(encodedMin, encodedMax, 2);\n}\n\nexport function encodeMonth(data: IsikukoodData) {\n    const { month } = data;\n    if(month?.pattern) return month.pattern;\n\n    const { encoded, encodedMin, encodedMax } = month ? toEncodableString(month, 0, 2, isValidMonth) : {} as any;\n    return encoded || intersectEncode(encodedMin, encodedMax, 2);\n}\n\nexport function encodeDay(data: IsikukoodData) {\n    const { day, month, year, shortYear } = data;\n    if(day?.pattern) return day.pattern;\n\n    const y = year || shortYear;\n    const theoreticalMonth = month?.actual || 1;\n    // The actual year doesnt matter here. Will only be 3 if its february and not a leap year, otherwise 4.\n    const theoreticalYear = (theoreticalMonth !== 2 || !y) ? 4 : 3 + Number(hasLeapYears(y));\n\n    const validator = (d: number) => isValidDay(d, theoreticalMonth, theoreticalYear);\n\n    const { encoded, encodedMin, encodedMax } = day ? toEncodableString(day, 0, 2, validator) : {} as any;\n    return encoded || intersectEncode(encodedMin, encodedMax, 2);\n}\n\nexport function encodeSerial(data: IsikukoodData) {\n    const { serial } = data;\n    if(serial?.pattern) return serial.pattern;\n\n    const { encoded, encodedMin, encodedMax } = serial ? toEncodableString(serial, 0, 3, isValidSerial) : {} as any;\n    return encoded || intersectEncode(encodedMin, encodedMax, 3);\n}\n\nexport function encodeChecksum(data: IsikukoodData) {\n    const { checksum } = data;\n    if(checksum?.pattern) return checksum.pattern;\n\n    const { encoded, encodedMin, encodedMax } = checksum ? toEncodableString(checksum, 0, 1) : {} as any;\n    return encoded || intersectEncode(encodedMin, encodedMax, 1);\n}\n\nexport function intersectEncode(encodedMin: string, encodedMax: string, length: number) {\n    const stringBuilder: string[] = [];\n    encodedMin = encodedMin || \"\";\n    encodedMax = encodedMax || \"\";\n\n    // hasBeenUnequal is used to guarantee that every match after the first x also results in a x\n    // Incorrect: min: \"89\", max: \"99\" => result: \"x9\"\n    // Correct:   min: \"89\", max: \"99\" => result: \"xx\"\n    let hasBeenUnequal = false;\n    for(let i = 0; i < length; i++) {\n        const char1 = encodedMin[i];\n        const char2 = encodedMax[i];\n        const isEqual: boolean = !hasBeenUnequal && char1 === char2;\n        stringBuilder.push(isEqual && char1 !== undefined ? char1 : \"x\");\n\n        if(!hasBeenUnequal) {\n            hasBeenUnequal = isEqual;\n        }\n    }\n    return stringBuilder.join(\"\");\n}\n\nexport function toEncodableString(minmaxActual: MinMax & ActualNumber | undefined, sliceStart: number, sliceEnd: number, validateCb = (_: any) => true) {\n    const sliceLength = sliceEnd - sliceStart;\n    const { min, max, actual } = minmaxActual!;\n    let encoded, encodedMin, encodedMax;\n    if(isInteger(actual) && validateCb(actual)) {\n        encoded = asStrSlice(actual, sliceStart, sliceEnd).padStart(sliceLength, \"0\");\n    } else if(isInteger(min) && validateCb(min) && isInteger(max) && validateCb(max)) {\n        encodedMin = asStrSlice(min, sliceStart, sliceEnd).padStart(sliceLength, \"0\");\n        encodedMax = asStrSlice(max, sliceStart, sliceEnd).padStart(sliceLength, \"0\");\n    } else {\n        throw new Error(\"Invalid input\");\n    }\n    return { encoded, encodedMin, encodedMax };\n}"],"names":["removeFromEnd"],"mappings":"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"}