{"version":3,"file":"formatters.cjs","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"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","sourcesContent":["const FALLBACK_LOCALE = 'en';\n\nconst twoDecimals = {\n  minimumFractionDigits: 2,\n  maximumFractionDigits: 2,\n};\n\nconst oneSignificantDigit = {\n  minimumSignificantDigits: 1,\n  maximumSignificantDigits: 1,\n};\n\nconst threeSignificantDigits = {\n  minimumSignificantDigits: 3,\n  maximumSignificantDigits: 3,\n};\n\nconst numberFormatCache: Record<string, Intl.NumberFormat> = {};\n\n/**\n * Get cached number format instance.\n *\n * @param locale - Locale string.\n * @param options - Optional Intl.NumberFormat options.\n * @returns Cached Intl.NumberFormat instance.\n */\nfunction getCachedNumberFormat(\n  locale: string,\n  options: Intl.NumberFormatOptions = {},\n) {\n  const key = `${locale}_${JSON.stringify(options)}`;\n\n  let format = numberFormatCache[key];\n\n  if (format) {\n    return format;\n  }\n\n  try {\n    format = new Intl.NumberFormat(locale, options);\n  } catch (error) {\n    if (error instanceof RangeError) {\n      // Fallback for invalid options (e.g. currency code)\n      format = new Intl.NumberFormat(locale, twoDecimals);\n    } else {\n      throw error;\n    }\n  }\n\n  numberFormatCache[key] = format;\n  return format;\n}\n\n/**\n * Format a number with optional Intl overrides.\n *\n * @param config - Configuration object with locale.\n * @param config.locale - Locale string.\n * @param value - Numeric value to format.\n * @param options - Optional Intl.NumberFormat overrides.\n * @returns Formatted number string.\n */\nfunction formatNumber(\n  config: { locale: string },\n  value: number | bigint | `${number}`,\n  options: Intl.NumberFormatOptions = {},\n) {\n  if (!Number.isFinite(Number(value))) {\n    return '';\n  }\n\n  const numberFormat = getCachedNumberFormat(config.locale, options);\n\n  // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n  return numberFormat.format(value);\n}\n\n/**\n * Format a value as a currency string.\n *\n * @param config - Configuration object with locale.\n * @param config.locale - Locale string.\n * @param value - Numeric value to format.\n * @param currency - ISO 4217 currency code.\n * @param options - Optional Intl.NumberFormat overrides.\n * @returns Formatted currency string.\n */\nfunction formatCurrency(\n  config: { locale: string },\n  value: number | bigint | `${number}`,\n  currency: Intl.NumberFormatOptions['currency'],\n  options: Intl.NumberFormatOptions = {},\n) {\n  if (!Number.isFinite(Number(value))) {\n    return '';\n  }\n\n  const numberFormat = getCachedNumberFormat(config.locale, {\n    style: 'currency',\n    currency,\n    ...options,\n  });\n\n  // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n  return numberFormat.format(value);\n}\n\n/**\n * Compact currency formatting (e.g. $1.2K, $3.4M).\n *\n * @param config - Configuration object with locale.\n * @param config.locale - Locale string.\n * @param value - Numeric value to format.\n * @param currency - ISO 4217 currency code.\n * @returns Formatted compact currency string.\n */\nfunction formatCurrencyCompact(\n  config: { locale: string },\n  value: number | bigint | `${number}`,\n  currency: Intl.NumberFormatOptions['currency'],\n) {\n  return formatCurrency(config, value, currency, {\n    notation: 'compact',\n    ...twoDecimals,\n  });\n}\n\n/**\n * Currency formatting with minimum threshold for small values.\n *\n * @param config - Configuration object with locale.\n * @param config.locale - Locale string.\n * @param value - Numeric value to format.\n * @param currency - ISO 4217 currency code.\n * @returns Formatted currency string with threshold handling.\n */\nfunction formatCurrencyWithMinThreshold(\n  config: { locale: string },\n  value: number | bigint | `${number}`,\n  currency: Intl.NumberFormatOptions['currency'],\n) {\n  const minThreshold = 0.01;\n  const number = Number(value);\n  const absoluteValue = Math.abs(number);\n\n  if (!Number.isFinite(number)) {\n    return '';\n  }\n\n  if (number === 0) {\n    return formatCurrency(config, 0, currency);\n  }\n\n  if (absoluteValue < minThreshold) {\n    const formattedMin = formatCurrency(config, minThreshold, currency);\n    return `<${formattedMin}`;\n  }\n\n  return formatCurrency(config, number, currency);\n}\n\n/**\n * Format a value as a token string with symbol.\n *\n * @param config - Configuration object with locale.\n * @param config.locale - Locale string.\n * @param value - Numeric value to format.\n * @param symbol - Token symbol.\n * @param options - Optional Intl.NumberFormat overrides.\n * @returns Formatted token string.\n */\nfunction formatToken(\n  config: { locale: string },\n  value: number | bigint | `${number}`,\n  symbol: string,\n  options: Intl.NumberFormatOptions = {},\n) {\n  if (!Number.isFinite(Number(value))) {\n    return '';\n  }\n\n  const numberFormat = getCachedNumberFormat(config.locale, {\n    style: 'decimal',\n    ...options,\n  });\n\n  // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n  const formattedNumber = numberFormat.format(value);\n\n  return `${formattedNumber} ${symbol}`;\n}\n\n/**\n * Format token price with varying precision based on value.\n *\n * @param config - Configuration object with locale.\n * @param config.locale - Locale string.\n * @param value - Numeric value to format.\n * @param currency - ISO 4217 currency code.\n * @returns Formatted token price string.\n */\nfunction formatCurrencyTokenPrice(\n  config: { locale: string },\n  value: number | bigint | `${number}`,\n  currency: Intl.NumberFormatOptions['currency'],\n) {\n  const minThreshold = 0.00000001;\n  const number = Number(value);\n  const absoluteValue = Math.abs(number);\n\n  if (!Number.isFinite(number)) {\n    return '';\n  }\n\n  if (number === 0) {\n    return formatCurrency(config, 0, currency);\n  }\n\n  if (absoluteValue < minThreshold) {\n    return `<${formatCurrency(config, minThreshold, currency, oneSignificantDigit)}`;\n  }\n\n  if (absoluteValue < 1) {\n    return formatCurrency(config, number, currency, threeSignificantDigits);\n  }\n\n  if (absoluteValue < 1_000_000) {\n    return formatCurrency(config, number, currency);\n  }\n\n  return formatCurrencyCompact(config, number, currency);\n}\n\n/**\n * Format token quantity with varying precision based on value.\n *\n * @param config - Configuration object with locale.\n * @param config.locale - Locale string.\n * @param value - Numeric value to format.\n * @param symbol - Token symbol.\n * @returns Formatted token quantity string.\n */\nfunction formatTokenQuantity(\n  config: { locale: string },\n  value: number | bigint | `${number}`,\n  symbol: string,\n) {\n  const minThreshold = 0.00001;\n  const number = Number(value);\n  const absoluteValue = Math.abs(number);\n\n  if (!Number.isFinite(number)) {\n    return '';\n  }\n\n  if (number === 0) {\n    return formatToken(config, 0, symbol);\n  }\n\n  if (absoluteValue < minThreshold) {\n    return `<${formatToken(config, minThreshold, symbol, oneSignificantDigit)}`;\n  }\n\n  if (absoluteValue < 1) {\n    return formatToken(config, number, symbol, threeSignificantDigits);\n  }\n\n  if (absoluteValue < 1_000_000) {\n    return formatToken(config, number, symbol);\n  }\n\n  return formatToken(config, number, symbol, {\n    notation: 'compact',\n    ...twoDecimals,\n  });\n}\n\n/**\n * Create formatter functions with the given locale.\n *\n * @param options - Configuration options.\n * @param options.locale - Locale string.\n * @returns Object with formatter functions.\n */\nexport function createFormatters({ locale = FALLBACK_LOCALE }) {\n  return {\n    /**\n     * Format a number with optional Intl overrides.\n     *\n     * @param value - Numeric value to format.\n     * @param options - Optional Intl.NumberFormat overrides.\n     */\n    formatNumber: formatNumber.bind(null, { locale }),\n    /**\n     * Format a value as a currency string.\n     *\n     * @param value - Numeric value to format.\n     * @param currency - ISO 4217 currency code (e.g. 'USD').\n     * @param options - Optional Intl.NumberFormat overrides.\n     */\n    formatCurrency: formatCurrency.bind(null, { locale }),\n    /**\n     * Compact currency (e.g. $1.2K, $3.4M) with up to two decimal digits.\n     *\n     * @param value - Numeric value to format.\n     * @param currency - ISO 4217 currency code.\n     */\n    formatCurrencyCompact: formatCurrencyCompact.bind(null, { locale }),\n    /**\n     * Currency with thresholds for small values.\n     *\n     * @param value - Numeric value to format.\n     * @param currency - ISO 4217 currency code.\n     */\n    formatCurrencyWithMinThreshold: formatCurrencyWithMinThreshold.bind(null, {\n      locale,\n    }),\n    /**\n     * Format token price with varying precision based on value.\n     *\n     * @param value - Numeric value to format.\n     * @param currency - ISO 4217 currency code.\n     */\n    formatCurrencyTokenPrice: formatCurrencyTokenPrice.bind(null, { locale }),\n    /**\n     * Format a value as a token string with symbol.\n     *\n     * @param value - Numeric value to format.\n     * @param symbol - Token symbol (e.g. 'ETH', 'SepoliaETH').\n     * @param options - Optional Intl.NumberFormat overrides.\n     */\n    formatToken: formatToken.bind(null, { locale }),\n    /**\n     * Format token quantity with varying precision based on value.\n     *\n     * @param value - Numeric value to format.\n     * @param symbol - Token symbol (e.g. 'ETH', 'SepoliaETH').\n     */\n    formatTokenQuantity: formatTokenQuantity.bind(null, { locale }),\n  };\n}\n"]}