{"version":3,"file":"valueFormats.cjs","sources":["../../../src/valueFormats/valueFormats.ts"],"sourcesContent":["import { clamp } from 'lodash';\n\nimport { DecimalCount } from '../types/displayValue';\nimport { TimeZone } from '../types/time';\n\nimport { getCategories } from './categories';\nimport { toDateTimeValueFormatter } from './dateTimeFormatters';\nimport { getOffsetFromSIPrefix, SIPrefix, currency, fullCurrency } from './symbolFormatters';\n\nexport interface FormattedValue {\n  text: string;\n  prefix?: string;\n  suffix?: string;\n}\n\nexport function formattedValueToString(val: FormattedValue): string {\n  return `${val.prefix ?? ''}${val.text}${val.suffix ?? ''}`;\n}\n\nexport type ValueFormatter = (\n  value: number,\n  decimals?: DecimalCount,\n  scaledDecimals?: DecimalCount,\n  timeZone?: TimeZone,\n  showMs?: boolean\n) => FormattedValue;\n\nexport interface ValueFormat {\n  name: string;\n  id: string;\n  fn: ValueFormatter;\n}\n\nexport interface ValueFormatCategory {\n  name: string;\n  formats: ValueFormat[];\n}\n\nexport interface ValueFormatterIndex {\n  [id: string]: ValueFormatter;\n}\n\n// Globals & formats cache\nlet categories: ValueFormatCategory[] = [];\nconst index: ValueFormatterIndex = {};\nlet hasBuiltIndex = false;\n\nexport function toFixed(value: number, decimals?: DecimalCount): string {\n  if (value === null) {\n    return '';\n  }\n\n  if (value === Number.NEGATIVE_INFINITY || value === Number.POSITIVE_INFINITY) {\n    return value.toLocaleString();\n  }\n\n  if (decimals === null || decimals === undefined) {\n    decimals = getDecimalsForValue(value);\n  }\n\n  if (value === 0) {\n    return value.toFixed(decimals);\n  }\n\n  const factor = decimals ? Math.pow(10, Math.max(0, decimals)) : 1;\n  const formatted = String(Math.round(value * factor) / factor);\n\n  // if exponent return directly\n  if (formatted.indexOf('e') !== -1 || value === 0) {\n    return formatted;\n  }\n\n  const decimalPos = formatted.indexOf('.');\n  const precision = decimalPos === -1 ? 0 : formatted.length - decimalPos - 1;\n  if (precision < decimals) {\n    return (precision ? formatted : formatted + '.') + String(factor).slice(1, decimals - precision + 1);\n  }\n\n  return formatted;\n}\n\nfunction getDecimalsForValue(value: number): number {\n  const absValue = Math.abs(value);\n  const log10 = Math.floor(Math.log(absValue) / Math.LN10);\n  let dec = -log10 + 1;\n  const magn = Math.pow(10, -dec);\n  const norm = absValue / magn; // norm is between 1.0 and 10.0\n\n  // special case for 2.5, requires an extra decimal\n  if (norm > 2.25) {\n    ++dec;\n  }\n\n  if (value % 1 === 0) {\n    dec = 0;\n  }\n\n  const decimals = Math.max(0, dec);\n  return decimals;\n}\n\nexport function toFixedScaled(value: number, decimals: DecimalCount, ext?: string): FormattedValue {\n  return {\n    text: toFixed(value, decimals),\n    suffix: appendPluralIf(ext, Math.abs(value) > 1),\n  };\n}\n\nfunction appendPluralIf(ext: string | undefined, condition: boolean): string | undefined {\n  if (!condition) {\n    return ext;\n  }\n\n  switch (ext) {\n    case ' min':\n    case ' hour':\n    case ' day':\n    case ' week':\n    case ' year':\n      return `${ext}s`;\n    default:\n      return ext;\n  }\n}\n\nexport function toFixedUnit(unit: string, asPrefix?: boolean): ValueFormatter {\n  return (size: number, decimals?: DecimalCount) => {\n    if (size === null) {\n      return { text: '' };\n    }\n    const text = toFixed(size, decimals);\n    if (unit) {\n      if (asPrefix) {\n        return { text, prefix: unit };\n      }\n      return { text, suffix: ' ' + unit };\n    }\n    return { text };\n  };\n}\n\nexport function isBooleanUnit(unit?: string) {\n  return unit && unit.startsWith('bool');\n}\n\nexport function booleanValueFormatter(t: string, f: string): ValueFormatter {\n  return (value) => {\n    return { text: value ? t : f };\n  };\n}\n\nconst logb = (b: number, x: number) => Math.log10(x) / Math.log10(b);\n\nexport function scaledUnits(factor: number, extArray: string[], offset = 0): ValueFormatter {\n  return (size: number, decimals?: DecimalCount) => {\n    if (size === null || size === undefined) {\n      return { text: '' };\n    }\n\n    if (size === Number.NEGATIVE_INFINITY || size === Number.POSITIVE_INFINITY || isNaN(size)) {\n      return { text: size.toLocaleString() };\n    }\n\n    const siIndex = size === 0 ? 0 : Math.floor(logb(factor, Math.abs(size)));\n    const suffix = extArray[clamp(offset + siIndex, 0, extArray.length - 1)];\n\n    return {\n      text: toFixed(size / factor ** clamp(siIndex, -offset, extArray.length - offset - 1), decimals),\n      suffix,\n    };\n  };\n}\n\nexport function locale(value: number, decimals: DecimalCount): FormattedValue {\n  if (value == null) {\n    return { text: '' };\n  }\n  return {\n    text: value.toLocaleString(undefined, { maximumFractionDigits: decimals ?? undefined }),\n  };\n}\n\nexport function simpleCountUnit(symbol: string): ValueFormatter {\n  const units = ['', 'K', 'M', 'B', 'T'];\n  const scaler = scaledUnits(1000, units);\n  return (size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount) => {\n    if (size === null) {\n      return { text: '' };\n    }\n    const v = scaler(size, decimals, scaledDecimals);\n    v.suffix += ' ' + symbol;\n    return v;\n  };\n}\n\nexport function stringFormater(value: number): FormattedValue {\n  return { text: `${value}` };\n}\n\nfunction buildFormats() {\n  categories = getCategories();\n\n  for (const cat of categories) {\n    for (const format of cat.formats) {\n      index[format.id] = format.fn;\n    }\n  }\n\n  // Resolve units pointing to old IDs\n  [{ from: 'farenheit', to: 'fahrenheit' }].forEach((alias) => {\n    const f = index[alias.to];\n    if (f) {\n      index[alias.from] = f;\n    }\n  });\n\n  hasBuiltIndex = true;\n}\n\nexport function getValueFormat(id?: string | null): ValueFormatter {\n  if (!id) {\n    return toFixedUnit('');\n  }\n\n  if (!hasBuiltIndex) {\n    buildFormats();\n  }\n\n  const fmt = index[id];\n\n  if (!fmt && id) {\n    let idx = id.indexOf(':');\n\n    if (idx > 0) {\n      const key = id.substring(0, idx);\n      const sub = id.substring(idx + 1);\n\n      if (key === 'prefix') {\n        return toFixedUnit(sub, true);\n      }\n\n      if (key === 'suffix') {\n        return toFixedUnit(sub, false);\n      }\n\n      if (key === 'time') {\n        return toDateTimeValueFormatter(sub);\n      }\n\n      if (key === 'si') {\n        const offset = getOffsetFromSIPrefix(sub.charAt(0));\n        const unit = offset === 0 ? sub : sub.substring(1);\n        return SIPrefix(unit, offset);\n      }\n\n      if (key === 'count') {\n        return simpleCountUnit(sub);\n      }\n\n      // Supported formats:\n      // currency:$           -> scaled currency ($1.2K)\n      // currency:financial:$ -> full currency ($1,234)\n      // currency:financial:€:suffix -> full currency with suffix (1,234€)\n      if (key === 'currency') {\n        const keySplit = sub.split(':');\n\n        if (keySplit[0] === 'financial' && keySplit.length >= 2) {\n          const symbol = keySplit[1];\n          if (!symbol) {\n            return toFixedUnit(''); // fallback for empty symbol\n          }\n          const asSuffix = keySplit[2] === 'suffix';\n          return fullCurrency(symbol, asSuffix);\n        } else {\n          return currency(sub);\n        }\n      }\n\n      if (key === 'bool') {\n        idx = sub.indexOf('/');\n        if (idx >= 0) {\n          const t = sub.substring(0, idx);\n          const f = sub.substring(idx + 1);\n          return booleanValueFormatter(t, f);\n        }\n        return booleanValueFormatter(sub, '-');\n      }\n    }\n\n    return toFixedUnit(id);\n  }\n\n  return fmt;\n}\n\nexport function getValueFormatterIndex(): ValueFormatterIndex {\n  if (!hasBuiltIndex) {\n    buildFormats();\n  }\n\n  return index;\n}\n\nexport function getValueFormats() {\n  if (!hasBuiltIndex) {\n    buildFormats();\n  }\n\n  return categories.map((cat) => {\n    return {\n      text: cat.name,\n      submenu: cat.formats.map((format) => {\n        return {\n          text: format.name,\n          value: format.id,\n        };\n      }),\n    };\n  });\n}\n"],"names":["clamp","getCategories","toDateTimeValueFormatter","getOffsetFromSIPrefix","SIPrefix","fullCurrency","currency"],"mappings":"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"}