{"version":3,"file":"gen-unit.min.mjs","sources":["../../src/common/constants.ts","../../src/common/is.ts","../../src/common/error.ts","../../src/common/validate-options.ts","../../src/format/constants.ts","../../src/common/transform-items.ts","../../src/common/find-table.ts","../../src/common/exp-items.ts","../../src/common/no-duplicates.ts","../../src/format/user-items.ts","../../src/format/default-items.ts","../../src/format/output.ts","../../src/format/round.ts","../../src/format/create-formatter.ts","../../src/format/find-unit.ts","../../src/format/format.ts","../../src/parse/constants.ts","../../src/parse/user-items.ts","../../src/parse/default-items.ts","../../src/parse/create-parser.ts","../../src/parse/extract-pre.ts","../../src/parse/find-multiplier.ts","../../src/parse/match.ts","../../src/parse/parse.ts"],"sourcesContent":["export const MICRO = '\\xb5'\n","import type { NullishReturn, TypeCheckFunction } from './private-types'\n\nexport function isNullish(value: unknown): value is NullishReturn {\n  return value == null\n}\n\ninterface TypeOfMap {\n  number: number\n  object: object | null\n  function: CallableFunction\n}\n\nfunction isType<T extends keyof TypeOfMap>(type: T): TypeCheckFunction<TypeOfMap[T]> {\n  return (value: unknown): value is TypeOfMap[T] => {\n    return typeof value === type\n  }\n}\n\nexport const isNumber = isType('number')\nexport const isObject = isType('object')\nexport const isFunction = isType('function')\n\ntype UnknownArray = unknown[] | readonly unknown[]\nexport const isArray = Array.isArray as TypeCheckFunction<UnknownArray>\n\nexport const isFiniteNumber = Number.isFinite as {\n  (value: number): boolean\n  (value: unknown): value is number\n}\n","export function error(message: string): TypeError {\n  return new TypeError(message)\n}\n\nexport function rangeError(message: string): RangeError {\n  return new RangeError(message)\n}\n\nexport function errorInvalidOption(optionName: string): TypeError {\n  return error(`Invalid \"${optionName}\" option`)\n}\n","import { error } from './error'\n\nexport function validateOptions<O extends Record<string, unknown>, K extends keyof O>(options: O, valid: K[], removed: Record<string, string>): Pick<O, K>\nexport function validateOptions<O extends Record<string, unknown>>(options: O, valid: string[], removed: Record<string, string>): O\nexport function validateOptions<O extends Record<string, unknown>>(options: O, valid: string[], removed: Record<string, string>): O {\n\n  // key input options\n  const optionsNames = Object.keys(options)\n  const removedOptionNames = Object.keys(removed)\n\n  // throw if removed option present\n  const removedOptionName = optionsNames.find((optionName) => removedOptionNames.includes(optionName))\n  if (removedOptionName) throw error(`Option \"${removedOptionName}\" has been removed. Use \"${removed[removedOptionName]}\" option instead.`)\n\n  // throw if unknown option present\n  const unknownOptionName = optionsNames.find((optionName) => !valid.includes(optionName))\n  if (unknownOptionName) throw error(`Unknown option \"${unknownOptionName}\".`)\n\n  // return options as valid\n  return options\n\n}\n","import type { CreateFormatterOptions } from './types'\n\ntype CreateFormatterValidOptionName = keyof CreateFormatterOptions\ntype CreateFormatterRemovedOptionName = 'table' | 'dec' | 'fixed'\n\nexport const validFormatterOptions: CreateFormatterValidOptionName[] = ['unit', 'find', 'round', 'output']\n\nexport const removedFormatterOptions: Record<CreateFormatterRemovedOptionName, CreateFormatterValidOptionName> = {\n  table: 'find',\n  dec: 'round',\n  fixed: 'round',\n}\n","import { rangeError } from './error'\nimport { isFiniteNumber } from './is'\nimport type { ExponentFindItems, MultiplierFindItems } from './types'\n\nexport function transformFindItems(items: ExponentFindItems, base: number): MultiplierFindItems {\n  return items.map(({ pre, exp }) => {\n\n    // compute multiplier\n    const mul = base ** exp\n\n    // throw if multiplier is invalid\n    if (!isFiniteNumber(mul) || mul <= 0) throw rangeError(`${base} to the power of ${exp} is not a valid multiplier`)\n\n    // return multiplier item\n    return { pre, mul }\n\n  })\n}\n","import type { DeprecatedFindUnitAdvancedOptions } from '../deprecated-types'\nimport { errorInvalidOption } from './error'\nimport { isArray, isNullish, isNumber, isObject } from './is'\nimport type { AllowNullish } from './private-types'\nimport { transformFindItems } from './transform-items'\nimport type { DeclarativeFindUnit, ExponentFindItems, FindUnitAdvancedOptions, MultiplierFindItems } from './types'\n\n/** @deprecated */\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nfunction deprecated_transformAdvancedOptions(find: FindUnitAdvancedOptions): Omit<FindUnitAdvancedOptions, keyof DeprecatedFindUnitAdvancedOptions> {\n\n  // return option if it's a modern option\n  if ('items' in find || !('find' in find)) return find\n\n  // handle deprecated option\n  // use deprecated 'find' member as modern 'items' member\n  // return modern option based on deprecated option\n  // eslint-disable-next-line @typescript-eslint/no-deprecated\n  const { find: items, base } = find\n  return { items, base }\n\n}\n\nexport function createFindTable(find: AllowNullish<DeclarativeFindUnit>, defaultItems: ExponentFindItems, validateItems: (items: ExponentFindItems) => ExponentFindItems): MultiplierFindItems {\n\n  // return default table if \"find\" option is null or undefined\n  if (isNullish(find)) return transformFindItems(defaultItems, 1000)\n\n  // use find option as base if it's a number\n  if (isNumber(find)) return transformFindItems(defaultItems, find)\n\n  // use find option as items if it's an array\n  if (isArray(find)) return transformFindItems(validateItems(find), 1000)\n\n  // throw if find option is not an object at this point\n  if (!isObject(find)) throw errorInvalidOption('find')\n\n  // get items and base from find option\n  // eslint-disable-next-line @typescript-eslint/no-deprecated\n  const { items, base } = deprecated_transformAdvancedOptions(find)\n\n  // normalize base\n  const normalizedBase = base ?? 1000\n\n  // return default items with given base if no items provided\n  if (isNullish(items)) return transformFindItems(defaultItems, normalizedBase)\n\n  // TODO: Throw more descriptive error\n  // throw if items is not an array at this point\n  if (!isArray(items)) throw errorInvalidOption('find')\n\n  // return items based on option\n  return transformFindItems(validateItems(items), normalizedBase)\n\n}\n","import { MICRO } from './constants'\nimport type { ExponentFindItem } from './types'\n\nexport const exa: ExponentFindItem = { pre: 'E', exp: 6 }\nexport const peta: ExponentFindItem = { pre: 'P', exp: 5 }\nexport const tera: ExponentFindItem = { pre: 'T', exp: 4 }\nexport const giga: ExponentFindItem = { pre: 'G', exp: 3 }\nexport const mega: ExponentFindItem = { pre: 'M', exp: 2 }\nexport const kilo: ExponentFindItem = { pre: 'k', exp: 1 }\nexport const milli: ExponentFindItem = { pre: 'm', exp: -1 }\nexport const micro: ExponentFindItem = { pre: MICRO, exp: -2 }\nexport const nano: ExponentFindItem = { pre: 'n', exp: -3 }\nexport const pico: ExponentFindItem = { pre: 'p', exp: -4 }\nexport const femto: ExponentFindItem = { pre: 'f', exp: -5 }\nexport const atto: ExponentFindItem = { pre: 'a', exp: -6 }\n","import { error } from './error'\nimport type { ExponentFindItem, ExponentFindItems } from './types'\n\nexport function noDuplicates(items: ExponentFindItems, key: keyof ExponentFindItem, str: string): ExponentFindItems {\n\n  const { length } = items\n\n  for (let i1 = 0; i1 < length - 1; i1++) {\n    const iut = items[i1][key]\n    for (let i2 = i1 + 1; i2 < length; i2++) {\n      if (items[i2][key] === iut) throw error(`Duplicated ${str} (${iut})`)\n    }\n  }\n\n  return items\n\n}\n","import { noDuplicates } from '../common/no-duplicates'\nimport type { ExponentFindItems } from '../common/types'\n\nexport function validateFormatItems(items: ExponentFindItems): ExponentFindItems {\n\n  // validate items\n  // will throw on duplicated exponent\n  const validated = noDuplicates(\n    items,\n    'exp',\n    'exponent',\n  )\n\n  // return sorted items\n  return validated.sort((a, b) => b.exp - a.exp)\n\n}\n","import { atto, exa, femto, giga, kilo, mega, micro, milli, nano, peta, pico, tera } from '../common/exp-items'\nimport type { MultiplierFindItem } from '../common/types'\nimport { validateFormatItems } from './user-items'\n\nexport const unity: MultiplierFindItem = { pre: '', mul: 1 }\n\nexport const defaultBase1000FormatExpItems = validateFormatItems([\n  exa,\n  peta,\n  tera,\n  giga,\n  mega,\n  kilo,\n  { exp: 0, pre: '' },\n  milli,\n  micro,\n  nano,\n  pico,\n  femto,\n  atto,\n])\n","import { errorInvalidOption, rangeError } from '../common/error'\nimport { isFiniteNumber, isFunction, isNullish, isNumber, isObject } from '../common/is'\nimport type { FormatOutputFunction, FormatOutputOption } from './types'\n\nfunction createFormatterFromOptions(space: string): FormatOutputFunction {\n  return (value, pre, unit) => {\n    const wholeUnit = `${pre}${unit}`\n    const spacedUnit = wholeUnit ? `${space}${wholeUnit}` : ''\n    return `${value}${spacedUnit}`\n  }\n}\n\nconst oneSpace = ' '\n\nexport function createOutputFormatter(output: FormatOutputOption): FormatOutputFunction {\n\n  // return default formatter\n  if (isNullish(output)) return createFormatterFromOptions(oneSpace)\n\n  // return wrapped function if it's a function to ensure it returns a string\n  if (isFunction(output)) {\n    return (value, pre, unit) => {\n\n      // call user function\n      const formatted = output(value, pre, unit)\n\n      // return user function result as string\n      return `${formatted as never}`\n\n    }\n  }\n\n  // throw if option is not an object at this point\n  if (!isObject(output)) throw errorInvalidOption('output')\n\n  // get option members\n  const { space } = output\n\n  // if space member is a number\n  if (isNumber(space)) {\n\n    // throw if it's invalid number of spaces\n    if (!isFiniteNumber(space) || space < 0) throw rangeError(`Can't format output with ${space} spaces`)\n\n    // return formatter with given number of spaces\n    const spaceString = oneSpace.repeat(space)\n    return createFormatterFromOptions(spaceString)\n\n  }\n\n  // normalize space\n  const normalizedSpace = space ?? oneSpace\n\n  // return formatter base on advanced options\n  return createFormatterFromOptions(normalizedSpace)\n\n}\n","import { errorInvalidOption, rangeError } from '../common/error'\nimport { isFiniteNumber, isFunction, isNullish, isNumber, isObject } from '../common/is'\nimport type { AllowNullish } from '../common/private-types'\nimport type { FormatRoundOption, RoundFunction } from './types'\n\nfunction validateNumberOfDecimals(dec: number): number {\n\n  // throw if number of decimals is invalid\n  if (!isFiniteNumber(dec) || dec < 0) throw rangeError(`Can't create round function with ${dec} decimal.`)\n\n  // return valid number of decimals\n  return dec\n\n}\n\nexport function createRounderFromOptions(dec: number, fixed?: AllowNullish<boolean>): RoundFunction {\n\n  // return fixed rounder function if fixed member set\n  if (fixed) return (num: number): string => {\n    return num.toFixed(dec)\n  }\n\n  // compute round multiplier\n  const roundMultiplier = 10 ** dec\n\n  // return regular rounder function\n  return (num: number): number => {\n    return Math.round(num * roundMultiplier) / roundMultiplier\n  }\n\n}\n\nexport function createRounder(round: FormatRoundOption): RoundFunction {\n\n  // return default rounder if round option is nullish\n  if (isNullish(round) || round === true) return createRounderFromOptions(2)\n\n  // return user option if it's a function\n  if (isFunction(round)) return round\n\n  // return rounder with round option as number of decimals if it's a number\n  if (isNumber(round)) return createRounderFromOptions(\n    validateNumberOfDecimals(round),\n  )\n\n  if (round === false) return (n) => n\n\n  // throw if round option is not an object at this point\n  if (!isObject(round)) throw errorInvalidOption('round')\n\n  // get members from advanced round option\n  const { dec, fixed } = round\n\n  if (isNullish(dec)) return createRounderFromOptions(2, fixed)\n\n  // TODO: throw more descriptive error\n  // throw if dec member is not a number\n  if (!isNumber(dec)) throw errorInvalidOption('round')\n\n  // return rounder based on advanced options\n  return createRounderFromOptions(\n    validateNumberOfDecimals(dec),\n    fixed,\n  )\n\n}\n","import { isFiniteNumber, isFunction, isNullish } from '../common/is'\nimport { validateOptions } from '../common/validate-options'\nimport type { DeprecatedFormatGetUnitFunction } from '../deprecated-types'\nimport { removedFormatterOptions, validFormatterOptions } from './constants'\nimport { createUnitFinder } from './find-unit'\nimport { createOutputFormatter } from './output'\nimport { createRounder } from './round'\nimport type { CreateFormatterOptions, CreateFormatterOptionsWithoutUnit, CreateFormatterOptionsWithUnit, Formatter, FormatUnitOption } from './types'\n\n/** @deprecated */\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nfunction deprecated_createGetUnit(unit: FormatUnitOption | DeprecatedFormatGetUnitFunction): DeprecatedFormatGetUnitFunction {\n\n  // return unit option if it's a function (deprecated)\n  if (isFunction(unit)) return unit\n\n  // return a function returning normalized unit\n  const normalizedUnit = unit ?? ''\n  return () => normalizedUnit\n\n}\n\n/**\n * Create a formatter function\n *\n * @param options create formatter options\n */\nexport function createFormatter(options: CreateFormatterOptionsWithoutUnit): Formatter\nexport function createFormatter<U extends FormatUnitOption>(options: CreateFormatterOptionsWithUnit<U>): Formatter\nexport function createFormatter(options?: CreateFormatterOptions): Formatter\nexport function createFormatter(options: CreateFormatterOptions = {}): Formatter {\n\n  const validOptions = validateOptions(\n    options,\n    validFormatterOptions,\n    removedFormatterOptions,\n  )\n\n  const { unit, find, round, output } = validOptions\n\n  // eslint-disable-next-line @typescript-eslint/no-deprecated\n  const getUnit = deprecated_createGetUnit(unit)\n  const findUnit = createUnitFinder(find)\n  const roundNum = createRounder(round)\n  const formatOutput = createOutputFormatter(output)\n\n  const formatWithPre = (value: number, pre: string) => {\n    const rounded = roundNum(value)\n    const computedUnit = getUnit(value, rounded, pre)\n    return formatOutput(\n      rounded,\n      pre,\n      computedUnit,\n    )\n  }\n\n  return (value: number): string => {\n\n    // return value as string if it's not finite\n    if (!isFiniteNumber(value)) return `${value}`\n\n    // find unit\n    const item = findUnit(value)\n\n    // return formatted value * 1 if can't find prefix and multiplier\n    if (isNullish(item)) return formatWithPre(value, '')\n\n    // get prefix and multiplier\n    const { pre, mul: divisor } = item\n\n    // return formatted value\n    return formatWithPre(value / divisor, pre)\n\n  }\n\n}\n","import { error, rangeError } from '../common/error'\nimport { createFindTable } from '../common/find-table'\nimport { isFiniteNumber, isFunction, isNullish, isNumber, isObject } from '../common/is'\nimport type { MultiplierFindItem } from '../common/types'\nimport type { DivisorFindItem } from '../deprecated-types'\nimport { defaultBase1000FormatExpItems } from './default-items'\nimport type { FormatFindUnitFunction, FormatFindUnitOption } from './types'\nimport { validateFormatItems } from './user-items'\n\n/** @deprecated */\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nfunction deprecated_handleResult(item: MultiplierFindItem | DivisorFindItem): MultiplierFindItem {\n\n  // return item if it's modern item\n  if ('mul' in item) return item\n\n  // use deprecated 'div' member as modern 'mul' member\n  // return modern item based on deprecated item\n  // eslint-disable-next-line @typescript-eslint/no-deprecated\n  const { pre, div: mul } = item\n  return { pre, mul }\n\n}\n\nexport function createUnitFinder(find: FormatFindUnitOption): FormatFindUnitFunction {\n\n  // return wrapped user function if option it's a function\n  // wrap function to test for result validity\n  if (isFunction(find)) return (value) => {\n\n    // call user function\n    const result = find(value)\n\n    // return undefined if user function returns nullish\n    if (isNullish(result)) return\n\n    // throw if user function return non-object\n    if (!isObject(result)) throw error(`${result} is not a valid return value for \"find\" option`)\n\n    // normalize result for deprecated result\n    // get prefix and multiplier\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    const { pre, mul } = deprecated_handleResult(result)\n\n    // throw if multiplier is invalid\n    if (!isNumber(mul) || !isFiniteNumber(mul) || mul <= 0) throw rangeError(`${mul} is not a valid multiplier`)\n\n    // return prefix and multiplier\n    return { pre, mul }\n\n  }\n\n  // create find table\n  const findTable = createFindTable(\n    find,\n    defaultBase1000FormatExpItems,\n    validateFormatItems,\n  )\n\n  // get table array length\n  const { length: itemsLength } = findTable\n\n  // always return null if no table items\n  if (itemsLength === 0) return () => null\n\n  return (value) => {\n\n    // return undefined if value equals zero\n    if (value === 0) return\n\n    // get absolute value\n    const absolute = Math.abs(value)\n\n    // iterate through table skipping last item (smallest unit)\n    const lastIndex = itemsLength - 1\n    for (let i = 0; i < lastIndex; i++) {\n      const item = findTable[i]\n      if (absolute >= item.mul) return item\n    }\n\n    // return smallest unit if it couldn't be found\n    return findTable[lastIndex]\n\n  }\n\n}\n","import { createFormatter } from './create-formatter'\nimport type { CreateFormatterOptions, CreateFormatterOptionsWithoutUnit, CreateFormatterOptionsWithUnit, FormatUnitOption } from './types'\n\nexport function format(value: number, options: CreateFormatterOptionsWithoutUnit): string\nexport function format<U extends FormatUnitOption>(value: number, options?: CreateFormatterOptionsWithUnit<U>): string\nexport function format(value: number, options?: CreateFormatterOptions): string\nexport function format(value: number, options?: CreateFormatterOptions): string {\n  const formatter = createFormatter(options)\n  return formatter(value)\n}\n","import type { CreateParserOptions } from './types'\n\ntype CreateParserValidOptionName = keyof CreateParserOptions\ntype CreateParserRemovedOptionName = 'table'\n\nexport const validParserOptions: CreateParserValidOptionName[] = ['unit', 'match', 'find']\n\nexport const removedParserOptions: Record<CreateParserRemovedOptionName, CreateParserValidOptionName> = {\n  table: 'find',\n}\n","import { noDuplicates } from '../common/no-duplicates'\nimport { ExponentFindItems } from '../common/types'\n\nexport function validateParseItems(items: ExponentFindItems): ExponentFindItems {\n\n  // validate items\n  // will throw on duplicated prefix\n  return noDuplicates(\n    items,\n    'pre',\n    'prefix',\n  )\n\n}\n","import { atto, exa, femto, giga, kilo, mega, micro, milli, nano, peta, pico, tera } from '../common/exp-items'\nimport { validateParseItems } from './user-items'\n\nexport const defaultBase1000ParseExpItems = validateParseItems([\n  exa,\n  peta,\n  tera,\n  giga,\n  { pre: 'meg', exp: 2 },\n  mega,\n  { pre: 'K', exp: 1 },\n  kilo,\n  milli,\n  { pre: 'u', exp: -2 },\n  micro,\n  nano,\n  pico,\n  femto,\n  atto,\n])\n","import { error } from '../common/error'\nimport { isFiniteNumber, isNullish, isNumber } from '../common/is'\nimport { validateOptions } from '../common/validate-options'\nimport { removedParserOptions, validParserOptions } from './constants'\nimport { createExtractPre } from './extract-pre'\nimport { createMulFinder } from './find-multiplier'\nimport { createMatcher } from './match'\nimport type { CreateParserOptions, CreateParserOptionsWithoutUnit, CreateParserOptionsWithUnit, ParseInput, Parser, ParseUnitOption } from './types'\n\n/**\n * Create a parser function\n *\n * @param options create parser options\n */\nexport function createParser(options: CreateParserOptionsWithoutUnit): Parser\nexport function createParser<U extends ParseUnitOption>(options: CreateParserOptionsWithUnit<U>): Parser\nexport function createParser(options?: CreateParserOptionsWithUnit<ParseUnitOption> | CreateParserOptionsWithoutUnit): Parser\nexport function createParser(options: CreateParserOptionsWithUnit<ParseUnitOption> | CreateParserOptionsWithoutUnit = {}): Parser {\n\n  // validate options\n  const validOptions = validateOptions(\n    options as CreateParserOptions,\n    validParserOptions,\n    removedParserOptions,\n  )\n\n  const { unit, match, find } = validOptions\n\n  const extractPre = createExtractPre(unit)\n  const findMultiplier = createMulFinder(find)\n  const matchInput = createMatcher(match)\n\n  // return parser function\n  return (input: ParseInput): number => {\n\n    // if input is of type number (number, NaN or Infinity)\n    if (isNumber(input)) {\n\n      // return the number if it's finite (number)\n      if (isFiniteNumber(input)) return input\n\n      // return NaN otherwise (NaN or Infinity)\n      return NaN\n\n    }\n\n    // return NaN if input is falsy (false, '', null or undefined) or true\n    if (!input || input === true) return NaN\n\n    // convert input (probably non-empty string or object) to string\n    const inputAsString = `${input as never}`\n\n    // return NaN if input as string is empty ('')\n    if (!inputAsString) return NaN\n\n    // convert string to number\n    const inputAsNumber = +inputAsString\n\n    // return number if string as number is finite (not NaN or Infinity)\n    if (isFiniteNumber(inputAsNumber)) return inputAsNumber\n\n    // capture value and unit from string\n    const captured = matchInput(inputAsString)\n\n    // return NaN if can't capture value and unit\n    if (!captured) return NaN\n\n    // get captured array length\n    const { length } = captured as string[]\n\n    // throw if captured array has less that 2 items\n    if (length < 2) throw error(`Match result array should have 2 items, got ${length}`)\n\n    // get value and unit from captured array\n    const [capturedValueAsString, wholeUnit] = captured\n\n    // return NaN if captured value is empty string ('')\n    if (!capturedValueAsString) return NaN\n\n    // convert captured value to number\n    const capturedValueAsNumber = +capturedValueAsString\n\n    // return NaN if captured value as number is not finite\n    if (!isFiniteNumber(capturedValueAsNumber)) return NaN\n\n    // extract prefix from whole unit\n    const pre = extractPre(wholeUnit)\n\n    // try to find find multiplier\n    const multiplier = findMultiplier(pre, unit)\n\n    // return NaN if can't find multiplier\n    if (isNullish(multiplier)) return NaN\n\n    // return parsed value\n    return capturedValueAsNumber * multiplier\n\n  }\n\n}\n","import type { ParseUnitOption } from './types'\n\ntype ExtractPrefixFunction = (wholeUnit: string) => string\n\nexport function createExtractPre(unit: ParseUnitOption): ExtractPrefixFunction {\n\n  if (unit) return (wholeUnit) => {\n\n    // return prefix if whole unit ends with unit\n    if (wholeUnit.endsWith(unit)) {\n      const { length: unitLength } = unit\n      return wholeUnit.slice(0, -unitLength)\n    }\n\n    // return whole unit as prefix\n    return wholeUnit\n\n  }\n\n  // return whole unit as prefix\n  return (wholeUnit) => wholeUnit\n\n}\n","import { error, rangeError } from '../common/error'\nimport { createFindTable } from '../common/find-table'\nimport { isFiniteNumber, isFunction, isNullish, isNumber, isObject } from '../common/is'\nimport { defaultBase1000ParseExpItems } from './default-items'\nimport type { ParseFindMultiplierFunction, ParseFindMultiplierOption } from './types'\nimport { validateParseItems } from './user-items'\n\nexport function createMulFinder(find: ParseFindMultiplierOption): ParseFindMultiplierFunction {\n\n  // return wrapped function if find option is a function\n  // wrap function test for result validity\n  if (isFunction(find)) return (prefix, unit) => {\n\n    // find multiplier\n    const result = find(prefix, unit)\n\n    // return undefined if no multiplier found (null | undefined)\n    if (isNullish(result)) return\n\n    // TODO: remove if future version\n    // this feature was removed in version 0.1.0\n    // throw error for removed feature\n    if (isObject(result)) throw error('Function returning object is no longer supported, return a non-zero positive number, null or undefined.')\n\n    // throw if multiplier is not valid\n    if (!isNumber(result) || !isFiniteNumber(result) || result <= 0) throw rangeError(`${result} is not a valid multiplier`)\n\n    // return multiplier\n    return result\n\n  }\n\n  // create find table\n  const findTable = createFindTable(\n    find,\n    defaultBase1000ParseExpItems,\n    validateParseItems,\n  )\n\n  // return function returning null if there are no items to search\n  if (findTable.length === 0) return () => null\n\n  // return multiplier finder function\n  return (prefix: string) => {\n\n    // return 1 as multiplier if captured prefix is empty\n    if (!prefix) return 1\n\n    const item = findTable.find(({ pre }) => pre === prefix)\n\n    // return undefined if not multiplier found\n    if (!item) return\n\n    // return multiplier\n    return item.mul\n\n  }\n\n}\n","import { error } from '../common/error'\nimport { isArray, isFunction, isNullish } from '../common/is'\nimport type { InputMatchResults, MatchFunction, ParseMatchOption } from './types'\n\nexport function createMatcher(match: ParseMatchOption): MatchFunction {\n\n  // return wrapped function if match option is a function\n  // wrap function to test for result validity\n  if (isFunction(match)) return (input) => {\n\n    // call user function\n    const captured = match(input)\n\n    // return undefined if nullish return by user function\n    if (isNullish(captured)) {\n      return\n    }\n\n    // throw if it's not an array\n    if (!isArray(captured)) {\n      throw error('Match function should return an array of strings')\n    }\n\n    // return array\n    // array validation will happen later\n    return captured\n\n  }\n\n  // create regular expression based on option\n  const re = isNullish(match)\n    ? /^\\s*(-?\\d*\\.?\\d*(?:e[+-]?\\d+)?)\\s*([a-z\\xb5]*)\\s*$/i\n    : new RegExp(match)\n\n  // return input match function\n  return (input) => {\n\n    // execute RegExp against input\n    const result = re.exec(input)\n\n    // return undefined if it doesn't match\n    if (!result) return\n\n    // get a slice of the result array containing the captured groups only\n    const resultAsArray = result.slice(1)\n\n    // return array\n    // array validation will happen later\n    return resultAsArray as InputMatchResults\n\n  }\n\n}\n","import { createParser } from './create-parser'\nimport type { CreateParserOptionsWithoutUnit, CreateParserOptionsWithUnit, ParseInput, ParseUnitOption } from './types'\n\n/**\n * Parse value in one step\n *\n * @param input input to parse\n * @param options parser options\n * @returns parsed value or NaN if it can't be parsed\n */\nexport function parse(input: ParseInput, options: CreateParserOptionsWithoutUnit): number\nexport function parse<U extends ParseUnitOption>(input: ParseInput, options: CreateParserOptionsWithUnit<U>): number\nexport function parse(input: ParseInput, options?: CreateParserOptionsWithUnit<ParseUnitOption> | CreateParserOptionsWithoutUnit): number\nexport function parse(input: ParseInput, options?: CreateParserOptionsWithUnit<ParseUnitOption> | CreateParserOptionsWithoutUnit): number {\n  const parser = createParser(options)\n  return parser(input)\n}\n"],"names":["MICRO","isNullish","value","isType","type","isNumber","isObject","isFunction","isArray","Array","isFiniteNumber","Number","isFinite","error","message","TypeError","rangeError","RangeError","errorInvalidOption","optionName","validateOptions","options","valid","removed","optionsNames","Object","keys","removedOptionNames","removedOptionName","find","includes","unknownOptionName","validFormatterOptions","removedFormatterOptions","table","dec","fixed","transformFindItems","items","base","map","_ref","pre","exp","mul","createFindTable","defaultItems","validateItems","deprecated_transformAdvancedOptions","normalizedBase","exa","peta","tera","giga","mega","kilo","milli","micro","nano","pico","femto","atto","noDuplicates","key","str","length","i1","iut","i2","validateFormatItems","sort","a","b","defaultBase1000FormatExpItems","createFormatterFromOptions","space","unit","wholeUnit","validateNumberOfDecimals","createRounderFromOptions","num","toFixed","roundMultiplier","Math","round","createFormatter","validOptions","output","getUnit","normalizedUnit","deprecated_createGetUnit","findUnit","result","item","div","deprecated_handleResult","findTable","itemsLength","absolute","abs","lastIndex","i","createUnitFinder","roundNum","n","createRounder","formatOutput","repeat","createOutputFormatter","formatWithPre","rounded","computedUnit","divisor","format","formatter","validParserOptions","removedParserOptions","validateParseItems","defaultBase1000ParseExpItems","createParser","match","extractPre","endsWith","unitLength","slice","createExtractPre","findMultiplier","prefix","createMulFinder","matchInput","input","captured","re","RegExp","exec","createMatcher","NaN","inputAsString","inputAsNumber","capturedValueAsString","capturedValueAsNumber","multiplier","parse","parser"],"mappings":"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"}