{"version":3,"file":"index.modern.mjs","sources":["../src/common.ts","../src/account-num.ts","../src/d-num.ts","../src/f-num.ts","../src/kid.ts","../src/org-num.ts"],"sourcesContent":["export type RandomFloatFun = typeof Math.random;\nexport const retrySym = Symbol('retry');\nexport const defaultRandomFloat = () => Math.random();\n\nconst daysInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconst fNumControl1Weights = [3, 7, 6, 1, 8, 9, 4, 5, 2];\nconst fNumControl2Weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];\n\nconst femaleDigits = [0, 2, 4, 6, 8];\nconst maleDigits = [1, 3, 5, 7, 9];\n\n/**\n * Determine if a given year is a leap year. Based on this documentation:\n * From https://learn.microsoft.com/en-us/office/troubleshoot/excel/determine-a-leap-year\n */\nexport function getIsLeapYear(year: number) {\n  return year % 4 === 0 && year % 100 === 0 && year % 400 === 0;\n}\n\n/**\n * Generate a random integer between `minInclusive` and `maxInclusive`. Uses\n * a random function that returns a float between 0 and 1 to do the work. Based\n * on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values\n */\nexport function randomInt(\n  randomFloat: RandomFloatFun,\n  minInclusive: number,\n  maxInclusive: number,\n) {\n  const min = Math.ceil(minInclusive);\n  const max = Math.floor(maxInclusive + 1);\n  const value = randomFloat();\n  if (value < 0 || value > 1) {\n    throw new Error('Random generator returned value outside of range 0..1');\n  }\n  return Math.floor(value * (max - min) + min);\n}\n\nexport function sum(digits: number[]): number {\n  return digits.reduce((acc, cur) => acc + cur, 0);\n}\n\n/**\n * Given a number, calculate the mod11 control digit for that number\n */\nexport function getMod11ControlDigit(sum: number): number {\n  const control = 11 - (sum % 11);\n  return control === 11 ? 0 : control;\n}\n\n/**\n * For each digit, multiply it with the weight at the same index and return the\n * sum of all the multiplications.\n */\nexport function getWeightedSum(digits: number[], weights: number[]): number {\n  if (digits.length !== weights.length) {\n    throw new Error('weights and digits arrays must be the same length');\n  }\n  const multiplied = digits.map((num, index) => num * weights[index]!);\n  return sum(multiplied);\n}\n\nexport function getFnumControlDigits(\n  digits: number[],\n): [control1: number, control2: number] {\n  const controlSum1 = getWeightedSum(digits, fNumControl1Weights);\n  const controlDigit1 = getMod11ControlDigit(controlSum1);\n  const controlSum2 = getWeightedSum(\n    [...digits, controlDigit1],\n    fNumControl2Weights,\n  );\n  const controlDigit2 = getMod11ControlDigit(controlSum2);\n  return [controlDigit1, controlDigit2];\n}\n\n/**\n * Generate a valid random birth date between `startYear` and `endYear`,\n * inclusive.\n */\nexport function randomBirthDate(args: {\n  randomFloat: RandomFloatFun;\n  startYear: number;\n  endYear: number;\n}): { year: number; month: number; day: number } {\n  const { endYear, randomFloat, startYear } = args;\n  const year = randomInt(randomFloat, startYear, endYear);\n  const month = randomInt(randomFloat, 1, 12);\n  const isLeapYear = getIsLeapYear(year);\n\n  const maxDay = month === 2 && isLeapYear ? 29 : daysInMonth[month];\n  if (typeof maxDay !== 'number') {\n    throw new Error('maxDay is not a number. This should never happen');\n  }\n  const day = randomInt(randomFloat, 1, maxDay);\n  return { day, month, year };\n}\n\nexport function randomIndividualNumber(args: {\n  randomFloat: RandomFloatFun;\n  year: number;\n  gender: 'f' | 'm';\n}): number {\n  const { gender, randomFloat, year } = args;\n  const [min, max] = individualNumberRange(year);\n  const base = randomInt(randomFloat, min, max);\n  const last =\n    gender === 'f'\n      ? femaleDigits[randomInt(randomFloat, 0, 4)]\n      : maleDigits[randomInt(randomFloat, 0, 4)];\n  if (typeof last !== 'number') {\n    throw new Error('Invalid number of digits');\n  }\n  return base - (base % 10) + last;\n}\n\n/**\n * Get the allowed range for the \"individual number\" part of an f-num. The range\n * is determined by the birth year of the person whose number is being\n * generated.\n */\nfunction individualNumberRange(year: number): [min: number, max: number] {\n  if (year >= 1854 && year <= 1899) {\n    return [500, 749];\n  } else if (year >= 1900 && year <= 1999) {\n    return [0, 499];\n  } else if (year >= 2000 && year <= 2049) {\n    return [500, 999];\n  } else {\n    throw new Error(`Could not find number for year ${year}`);\n  }\n}\n\n/**\n * Call the `fun` callback. As long as the callback returns `retrySym`, keep\n * retrying the call. If it returns any other value, return that value.\n * If no valid value was returned after trying the call `attempts` times, then\n * throw an error.\n * @param fun\n * @param attempts\n * @returns\n */\nexport function attempt<T>(fun: () => T | typeof retrySym, attempts = 100): T {\n  let maxAttempts = Math.abs(attempts);\n  while (maxAttempts-- > 0) {\n    const ret = fun();\n    if (ret !== retrySym) {\n      return ret;\n    }\n  }\n  throw new Error(`Not able to find legal value in ${attempts} attempts`);\n}\n","import {\n  type RandomFloatFun,\n  retrySym,\n  randomInt,\n  attempt,\n  defaultRandomFloat,\n  getWeightedSum,\n  getMod11ControlDigit,\n} from './common';\n\nconst weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];\n\nfunction innerMakeAccountNum(args: {\n  randomFloat: RandomFloatFun;\n  registerNumber?: string;\n}): string | typeof retrySym {\n  const { randomFloat, registerNumber } = args;\n  const register = registerNumber ?? randomInt(randomFloat, 0, 9999);\n  const accountGroup = randomInt(randomFloat, 0, 99);\n  const customerNumber = randomInt(randomFloat, 0, 9999);\n  const digits = [\n    register.toString().padStart(4, '0'),\n    accountGroup.toString().padStart(2, '0'),\n    customerNumber.toString().padStart(4, '0'),\n  ]\n    .flatMap((e) => e.split(''))\n    .map((e) => Number(e));\n\n  const sum = getWeightedSum(digits, weights);\n  const control = getMod11ControlDigit(sum);\n  if (control === 10) {\n    return retrySym;\n  }\n  return `${digits.join('')}${control}`;\n}\n\nexport function accountNum(args?: {\n  randomFloat: RandomFloatFun;\n  registerNumber?: string;\n}) {\n  const registerNumber = args?.registerNumber;\n  const randomFloat = args?.randomFloat ?? defaultRandomFloat;\n  return attempt(() => innerMakeAccountNum({ registerNumber, randomFloat }));\n}\n","import {\n  type RandomFloatFun,\n  retrySym,\n  randomInt,\n  randomBirthDate,\n  randomIndividualNumber,\n  defaultRandomFloat,\n  attempt,\n  getFnumControlDigits,\n} from './common';\n\nfunction dNumInner(args: {\n  randomFloat: RandomFloatFun;\n  startYear: number;\n  endYear: number;\n  gender: 'f' | 'm';\n}): string | typeof retrySym {\n  const { endYear, gender, randomFloat, startYear } = args;\n  const { day, month, year } = randomBirthDate({\n    endYear,\n    randomFloat,\n    startYear,\n  });\n  const individualNum = randomIndividualNumber({ gender, randomFloat, year });\n\n  const digits = [\n    day.toString().padStart(2, '0'),\n    month.toString().padStart(2, '0'),\n    year.toString().slice(-2).padStart(2, '0'),\n    individualNum.toString().padStart(3, '0'),\n  ]\n    .flatMap((e) => e.split(''))\n    // add 4 to first digit of d-num\n    .map((e, n) => (n === 0 ? Number(e) + 4 : e))\n    .map((e) => Number(e));\n\n  const [controlDigit1, controlDigit2] = getFnumControlDigits(digits);\n\n  if (controlDigit1 === 10 || controlDigit2 === 10) {\n    return retrySym;\n  } else {\n    return `${digits.join('')}${controlDigit1}${controlDigit2}`;\n  }\n}\n\nexport function dNum(args?: {\n  randomFloat?: RandomFloatFun;\n  startYear?: number;\n  endYear?: number;\n  gender?: 'f' | 'm';\n}): string {\n  const randomFloat = args?.randomFloat ?? defaultRandomFloat;\n  const startYear = args?.startYear ?? 1854;\n  const endYear = args?.endYear ?? 2039;\n  const gender = args?.gender ?? randomInt(randomFloat, 1, 2) === 1 ? 'f' : 'm';\n  return attempt(() => dNumInner({ endYear, gender, randomFloat, startYear }));\n}\n","import {\n  type RandomFloatFun,\n  retrySym,\n  randomInt,\n  randomBirthDate,\n  randomIndividualNumber,\n  defaultRandomFloat,\n  attempt,\n  getFnumControlDigits,\n} from './common';\n\nfunction innerFNum(args: {\n  randomFloat: RandomFloatFun;\n  startYear: number;\n  endYear: number;\n  gender: 'f' | 'm';\n}): string | typeof retrySym {\n  const { endYear, gender, randomFloat, startYear } = args;\n  const { day, month, year } = randomBirthDate({\n    endYear,\n    randomFloat,\n    startYear,\n  });\n  const individualNum = randomIndividualNumber({ gender, randomFloat, year });\n\n  const digits = [\n    day.toString().padStart(2, '0'),\n    month.toString().padStart(2, '0'),\n    year.toString().slice(-2).padStart(2, '0'),\n    individualNum.toString().padStart(3, '0'),\n  ]\n    .flatMap((e) => e.split(''))\n    .map((e) => Number(e));\n\n  const [controlDigit1, controlDigit2] = getFnumControlDigits(digits);\n\n  if (controlDigit1 === 10 || controlDigit2 === 10) {\n    return retrySym;\n  } else {\n    return `${digits.join('')}${controlDigit1}${controlDigit2}`;\n  }\n}\n\nexport function fNum(args?: {\n  randomFloat?: RandomFloatFun;\n  startYear?: number;\n  endYear?: number;\n  gender?: 'f' | 'm';\n}): string {\n  const randomFloat = args?.randomFloat ?? defaultRandomFloat;\n  const startYear = args?.startYear ?? 1854;\n  const endYear = args?.endYear ?? 2039;\n  const gender = args?.gender ?? randomInt(randomFloat, 1, 2) === 1 ? 'f' : 'm';\n  return attempt(() => innerFNum({ endYear, gender, randomFloat, startYear }));\n}\n","import {\n  attempt,\n  defaultRandomFloat,\n  getMod11ControlDigit,\n  getWeightedSum,\n  RandomFloatFun,\n  randomInt,\n  retrySym,\n  sum,\n} from './common';\n\nexport type KidAlgorithm = 'mod10' | 'mod11';\n\nfunction mod10Kid(args: {\n  randomFloat: RandomFloatFun;\n  length?: number;\n  prefix: string;\n}): string {\n  const { prefix, randomFloat } = args;\n  let length = args.length ? args.length - 1 : randomInt(randomFloat, 2, 25);\n\n  // fixme: move this test to top level\n  if (prefix !== '') {\n    if (prefix.length >= 24) {\n      throw new Error('Prefix is too long');\n    }\n\n    length = randomInt(randomFloat, prefix.length + 1, 25);\n  }\n\n  const digits = Array.from({ length })\n    .map(() => randomInt(randomFloat, 0, 9))\n    .map((e, n) => prefix.charAt(n) || e)\n    .map((e) => Number(e));\n\n  const controlDigits = Array.from(digits)\n    .reverse()\n    .map((digit, index) => {\n      if (index % 2 === 0) {\n        const multiplied = digit * 2;\n        return multiplied < 10 ? multiplied : multiplied - 9;\n      } else {\n        return digit;\n      }\n    });\n\n  const controlSum = sum(controlDigits);\n  const checkDigit = (10 - (controlSum % 10)) % 10;\n  return [...digits, checkDigit].map((e) => e.toString()).join('');\n}\n\n/**\n * Spec:\n * https://www.nets.eu/no-nb/PublishingImages/Lists/Accordion%20%20OCR%20giro/AllItems/OCR%20giro%20Systemspesifikasjon.pdf\n * The weights are 2,3,4,5,6,7, and then repeats from 2.\n * The weights are applied from right to left. So the last digit has the weight\n * 2.\n */\nfunction mod11Weights(digits: number[]): number[] {\n  return digits.map((_, n) => (n % 6) + 2).reverse();\n}\n\nfunction mod11Kid(args: {\n  randomFloat: RandomFloatFun;\n  length?: number;\n  prefix: string;\n}): string | typeof retrySym {\n  const { randomFloat, prefix } = args;\n  let length = args.length ? args.length - 1 : randomInt(randomFloat, 2, 25);\n\n  // fixme: move this test to top level\n  if (prefix !== '') {\n    if (prefix.length >= 24) {\n      throw new Error('Prefix is too long');\n    }\n\n    length = randomInt(randomFloat, prefix.length + 1, 25);\n  }\n\n  const digits = Array.from({ length })\n    .map(() => randomInt(randomFloat, 0, 9))\n    .map((e, n) => prefix.charAt(n) || e)\n    .map((e) => Number(e));\n\n  const controlSum = getWeightedSum(digits, mod11Weights(digits));\n  const control = getMod11ControlDigit(controlSum);\n\n  if (control === 10) {\n    return retrySym;\n  } else {\n    return [...digits, control].join('');\n  }\n}\n\nexport function kid(args: {\n  randomFloat?: RandomFloatFun;\n  algorithm?: KidAlgorithm;\n  length?: number;\n  prefix?: string;\n}) {\n  const randomFloat = args.randomFloat ?? defaultRandomFloat;\n  const prefix = args.prefix ?? '';\n  const algorithm: KidAlgorithm =\n    args.algorithm ?? (randomFloat() > 0.5 ? 'mod10' : 'mod11');\n\n  return attempt(() => {\n    if (algorithm === 'mod10') {\n      return mod10Kid({ prefix, randomFloat, length: args.length });\n    } else {\n      return mod11Kid({ prefix, randomFloat, length: args.length });\n    }\n  });\n}\n","import {\n  type RandomFloatFun,\n  randomInt,\n  attempt,\n  retrySym,\n  getWeightedSum,\n  getMod11ControlDigit,\n} from './common';\n\nconst weights = [3, 2, 7, 6, 5, 4, 3, 2];\n\nexport function orgNum(args?: {\n  randomFloat?: RandomFloatFun;\n  prefix?: string;\n}): string {\n  const randomFloat = args?.randomFloat ?? (() => Math.random());\n  const prefix = args?.prefix ?? '';\n  return attempt(() => {\n    const orgNum = randomInt(randomFloat, 0, 99_999_999);\n    const digits = orgNum\n      .toString()\n      .padStart(8, '0')\n      .split('')\n      .map((e, n) => prefix.charAt(n) || e)\n      .map((e) => Number(e));\n    const sum = getWeightedSum(digits, weights);\n    const control = getMod11ControlDigit(sum);\n    return control !== 10 ? [...digits, control].join('') : retrySym;\n  });\n}\n"],"names":["retrySym","Symbol","Math","random","daysInMonth","fNumControl1Weights","fNumControl2Weights","maleDigits","randomInt","randomFloat","minInclusive","maxInclusive","min","ceil","floor","value","Error","max","sum","digits","reduce","acc","cur","getMod11ControlDigit","control","getWeightedSum","weights","length","map","num","index","getFnumControlDigits","controlDigit1","randomBirthDate","args","endYear","startYear","year","month","getIsLeapYear","isLeapYear","maxDay","day","gender","individualNumberRange","base","last","femaleDigits","attempt","fun","attempts","maxAttempts","abs","ret","accountNum","_args$randomFloat","registerNumber","defaultRandomFloat","register","accountGroup","customerNumber","toString","padStart","flatMap","e","split","Number","join","innerMakeAccountNum","dNum","_args$startYear","_args$endYear","_args$gender","individualNum","randomIndividualNumber","slice","n","controlDigit2","dNumInner","fNum","innerFNum","kid","_args$prefix","_args$algorithm","prefix","algorithm","Array","from","charAt","checkDigit","reverse","digit","multiplied","controlSum","_","mod11Weights","mod11Kid","orgNum"],"mappings":"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"}