@eternl/formats 0.10.17 → 0.10.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- let big_js = require("big.js");
2
+ let _eternl_big = require("@eternl/big");
3
3
 
4
4
  //#region src/types.ts
5
5
  const NUMBER_STYLES = {
@@ -41,7 +41,7 @@ const DEFAULT_SIGN_PLUS = "+";
41
41
  const DECIMAL_ZERO = "0";
42
42
  const DECIMAL_EMPTY = "";
43
43
  const DECIMAL_DOT = ".";
44
- const BIG_ZERO = (0, big_js.Big)(0);
44
+ const BIG_ZERO = (0, _eternl_big.Big)(0);
45
45
  const DECIMALS_CARDANO = 6;
46
46
 
47
47
  //#endregion
@@ -162,10 +162,10 @@ const resolveLocale = (value) => {
162
162
  //#endregion
163
163
  //#region src/internal/numeric.ts
164
164
  const ROUNDING_MODE_MAP = {
165
- roundDown: big_js.Big.roundDown,
166
- roundHalfUp: big_js.Big.roundHalfUp,
167
- roundHalfEven: big_js.Big.roundHalfEven,
168
- roundUp: big_js.Big.roundUp
165
+ roundDown: _eternl_big.Big.roundDown,
166
+ roundHalfUp: _eternl_big.Big.roundHalfUp,
167
+ roundHalfEven: _eternl_big.Big.roundHalfEven,
168
+ roundUp: _eternl_big.Big.roundUp
169
169
  };
170
170
  const assertNonNegativeInteger = (value, label) => {
171
171
  if (value === void 0) return;
@@ -181,21 +181,21 @@ const isZeroString = (input) => {
181
181
  return /^[-+]?0+(?:\.0+)?$/.test(input);
182
182
  };
183
183
  const normalizeNumeric = (value, clone = false) => {
184
- if (value instanceof big_js.Big) return clone ? new big_js.Big(value) : value;
184
+ if (value instanceof _eternl_big.Big) return clone ? new _eternl_big.Big(value) : value;
185
185
  if (typeof value === "number") {
186
186
  if (!Number.isFinite(value)) throw toRangeError(FormatError.NumericValueNonFinite);
187
- return value === 0 ? BIG_ZERO : new big_js.Big(value);
187
+ return value === 0 ? BIG_ZERO : new _eternl_big.Big(value);
188
188
  }
189
189
  if (typeof value === "string") {
190
190
  const trimmed = value.trim();
191
191
  if (!trimmed) throw toRangeError(FormatError.NumericStringEmpty);
192
192
  if (isZeroString(trimmed)) return BIG_ZERO;
193
- return new big_js.Big(trimmed);
193
+ return new _eternl_big.Big(trimmed);
194
194
  }
195
195
  throw toTypeError(FormatError.UnsupportedNumericInput);
196
196
  };
197
197
  const mapRoundingMode = (mode) => {
198
- if (!mode) return big_js.Big.roundHalfUp;
198
+ if (!mode) return _eternl_big.Big.roundHalfUp;
199
199
  return ROUNDING_MODE_MAP[mode];
200
200
  };
201
201
  const computeNumericParts = (value, options = {}) => {
@@ -262,10 +262,10 @@ const applyGrouping = (integer, grouping, enableGrouping) => {
262
262
  //#endregion
263
263
  //#region src/display.ts
264
264
  const defaultCompactThresholds = {
265
- K: new big_js.Big(1e3),
266
- M: new big_js.Big(1e6),
267
- B: new big_js.Big(1e9),
268
- T: new big_js.Big(0xe8d4a51000)
265
+ K: new _eternl_big.Big(1e3),
266
+ M: new _eternl_big.Big(1e6),
267
+ B: new _eternl_big.Big(1e9),
268
+ T: new _eternl_big.Big(0xe8d4a51000)
269
269
  };
270
270
  const defaultCompactSuffixes = {
271
271
  K: "K",
@@ -591,7 +591,7 @@ const parseDisplayInternal = (formatted, options) => {
591
591
  const normalizedCore = normalizeNumericCore(numericCore, getNumberFormatPattern(resolveLocale(locale), buildNumberFormatOptions(options ?? {}, STYLE_DECIMAL)));
592
592
  if (!normalizedCore || normalizedCore === DEFAULT_SIGN_MINUS || normalizedCore === DEFAULT_SIGN_PLUS) return NaN;
593
593
  try {
594
- return (0, big_js.Big)(normalizedCore).toNumber();
594
+ return (0, _eternl_big.Big)(normalizedCore).toNumber();
595
595
  } catch (error) {}
596
596
  }
597
597
  let normalized = expandSubscriptDigits(numericCore);
@@ -618,7 +618,7 @@ const parseDisplayInternal = (formatted, options) => {
618
618
  normalized = normalized.replace(/,/g, "");
619
619
  if (!normalized || normalized === DEFAULT_SIGN_MINUS || normalized === DEFAULT_SIGN_PLUS) return NaN;
620
620
  try {
621
- return (0, big_js.Big)(normalized).toNumber();
621
+ return (0, _eternl_big.Big)(normalized).toNumber();
622
622
  } catch (error) {
623
623
  return NaN;
624
624
  }
@@ -756,17 +756,36 @@ const buildCsv = (rows, columns, delimiter = ",", lineEnding = "\n") => {
756
756
  return `${lines.join(lineEnding)}${lineEnding}`;
757
757
  };
758
758
 
759
+ //#endregion
760
+ //#region src/time.ts
761
+ const checkTime = (i) => i == 0 ? "00" : (i < 10 ? "0" : "") + i;
762
+ const formatRemainingTime = (seconds) => {
763
+ const days = Math.floor(seconds / (1440 * 60));
764
+ seconds -= days * (1440 * 60);
765
+ const hours = Math.floor(seconds / 3600);
766
+ seconds -= hours * 3600;
767
+ const mins = Math.floor(seconds / 60);
768
+ seconds -= mins * 60;
769
+ const secs = Math.floor(seconds);
770
+ let str = "";
771
+ if (days > 0) str = days + "d ";
772
+ if (hours >= 0) str = str + checkTime(hours) + "h ";
773
+ if (mins >= 0) str = str + checkTime(mins) + "m ";
774
+ if (secs >= 0) str = str + checkTime(secs) + "s ";
775
+ return str;
776
+ };
777
+
759
778
  //#endregion
760
779
  //#region src/big.ts
761
780
  const bigQuantityFromAmount = (amount, decimals) => {
762
781
  if (!amount || amount === "0" || amount === 0) return BIG_ZERO;
763
- if (!decimals || decimals <= 0) return (0, big_js.Big)(amount);
764
- return (0, big_js.Big)(amount).mul(Math.pow(10, decimals)).round(0);
782
+ if (!decimals || decimals <= 0) return (0, _eternl_big.Big)(amount);
783
+ return (0, _eternl_big.Big)(amount)._mul(Math.pow(10, decimals)).round(0);
765
784
  };
766
785
  const bigAmountFromQuantity = (quantity, decimals) => {
767
786
  if (!quantity || quantity === "0" || quantity === 0) return BIG_ZERO;
768
- if (!decimals || decimals <= 0) return (0, big_js.Big)(quantity);
769
- return (0, big_js.Big)(quantity).div(Math.pow(10, decimals)).round(decimals);
787
+ if (!decimals || decimals <= 0) return (0, _eternl_big.Big)(quantity);
788
+ return (0, _eternl_big.Big)(quantity)._div(Math.pow(10, decimals)).round(decimals);
770
789
  };
771
790
  const bigLovelaceFromAda = (ada, decimals = DECIMALS_CARDANO) => bigQuantityFromAmount(ada, decimals);
772
791
  const bigAdaFromLovelace = (lovelace, decimals = DECIMALS_CARDANO) => bigAmountFromQuantity(lovelace, decimals);
@@ -796,6 +815,7 @@ exports.formatDisplayCurrency = formatDisplayCurrency;
796
815
  exports.formatDisplayDate = formatDisplayDate;
797
816
  exports.formatDisplayNumber = formatDisplayNumber;
798
817
  exports.formatDisplayPercent = formatDisplayPercent;
818
+ exports.formatRemainingTime = formatRemainingTime;
799
819
  exports.getFormatErrorMessage = getFormatErrorMessage;
800
820
  exports.parseDisplayValue = parseDisplayValue;
801
821
  exports.toError = toError;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Big","Big"],"sources":["../src/types.ts","../src/constants.ts","../src/errors.ts","../src/internal/intl-cache.ts","../src/internal/locale.ts","../src/internal/numeric.ts","../src/display.ts","../src/date.ts","../src/csv.ts","../src/big.ts"],"sourcesContent":["import { BigSource } from 'big.js'\n\nexport type NumericLike = BigSource\nexport type RoundingMode = 'roundDown' | 'roundHalfUp' | 'roundHalfEven' | 'roundUp'\n\nexport const NUMBER_STYLES = {\n\n decimal: 'decimal',\n currency: 'currency',\n percent: 'percent'\n\n} as const\n\nexport type NumberStyle = typeof NUMBER_STYLES[keyof typeof NUMBER_STYLES]\n\nexport const SIGN_DISPLAYS = {\n\n auto: 'auto',\n always: 'always',\n exceptZero: 'exceptZero',\n never: 'never',\n negative: 'negative'\n\n} as const\n\nexport type SignDisplay = typeof SIGN_DISPLAYS[keyof typeof SIGN_DISPLAYS]\n\nexport const COMPACT_UNITS = ['K', 'M', 'B', 'T'] as const\n\nexport type CompactUnit = typeof COMPACT_UNITS[number]\n\nexport interface CommonNumberOptions {\n\n minDecimals?: number\n maxDecimals?: number\n precision?: number\n roundingMode?: RoundingMode\n trimTrailingZeros?: boolean\n}\n\nexport interface DisplayNumberOptions extends CommonNumberOptions {\n\n locale?: string\n style?: NumberStyle\n currencyCode?: string\n useSymbol?: boolean\n customSymbols?: Record<string, string>\n compact?: boolean\n compactThresholds?: Partial<Record<CompactUnit, BigSource>>\n compactSuffixes?: Partial<Record<CompactUnit, string>>\n signDisplay?: SignDisplay\n useGrouping?: boolean\n isHidden?: boolean\n hiddenCharacter?: string\n compactDecimalZeros?: boolean\n forceSign?: boolean\n}\n\nexport interface CsvNumberOptions extends CommonNumberOptions {\n\n locale?: string\n decimalDelimiter?: string\n}\n\nexport interface CsvDateOptions {\n\n format?: 'iso' | 'utc-datetime'\n}\n\nexport type CsvRow = Record<string, unknown> | unknown[]\n\nexport interface CsvColumnSpec<T = any> {\n\n header: string\n accessor: (row: T) => unknown\n formatter?: (value: unknown) => string\n}\n\nexport interface FormatDisplayParams {\n\n locale?: string\n options: Intl.NumberFormatOptions\n}\n","import { Big } from 'big.js'\n\nimport {\n COMPACT_UNITS,\n CompactUnit,\n NUMBER_STYLES,\n NumberStyle,\n} from './types'\n\nexport const STYLE_DECIMAL: NumberStyle = NUMBER_STYLES.decimal\nexport const STYLE_CURRENCY: NumberStyle = NUMBER_STYLES.currency\nexport const STYLE_PERCENT: NumberStyle = NUMBER_STYLES.percent\n\nexport const DEFAULT_LOCALE = 'en-US'\n\nexport const DISPLAY_SIGNS = {\n\n minus: 'minus',\n plus: 'plus',\n none: 'none'\n\n} as const\n\nexport type DisplaySignValue = typeof DISPLAY_SIGNS[keyof typeof DISPLAY_SIGNS]\n\nexport const DISPLAY_SIGN_MINUS = DISPLAY_SIGNS.minus\nexport const DISPLAY_SIGN_PLUS = DISPLAY_SIGNS.plus\nexport const DISPLAY_SIGN_NONE = DISPLAY_SIGNS.none\n\nexport const COMPACT_ORDER: CompactUnit[] = [...COMPACT_UNITS].reverse() as CompactUnit[]\n\nexport const DEFAULT_SIGN_MINUS = '-'\nexport const DEFAULT_SIGN_PLUS = '+'\n\nexport const DECIMAL_ZERO = '0'\nexport const DECIMAL_EMPTY = ''\nexport const DECIMAL_DOT = '.'\n\nexport const BIG_ZERO = Big(0)\n\n// This is a shortcut to avoid @eternl/network-id dependency in this package.\nexport const DECIMALS_CARDANO = 6\n","export enum FormatError {\n\n NonNegativeIntegerRequired = 'nonNegativeIntegerRequired',\n PositiveIntegerRequired = 'positiveIntegerRequired',\n NumericValueNonFinite = 'numericValueNonFinite',\n NumericStringEmpty = 'numericStringEmpty',\n UnsupportedNumericInput = 'unsupportedNumericInput',\n MaxDecimalsLessThanMinimum = 'maxDecimalsLessThanMinimum',\n MissingLocale = 'missingLocale',\n MissingCurrencyCode = 'missingCurrencyCode',\n DateValueInvalid = 'dateValueInvalid',\n DateStringEmpty = 'dateStringEmpty',\n DateNumberNonFinite = 'dateNumberNonFinite',\n InvalidDateString = 'invalidDateString',\n UnsupportedDateInput = 'unsupportedDateInput'\n}\n\ntype ErrorDetails = Record<string, string>\n\ntype ErrorMessageMap = Record<FormatError, string>\n\nconst FORMAT_ERROR_MESSAGES = {\n\n [FormatError.NonNegativeIntegerRequired]: '%label% must be a non-negative integer',\n [FormatError.PositiveIntegerRequired]: '%label% must be a positive integer',\n [FormatError.NumericValueNonFinite]: 'Numeric value must be a finite number',\n [FormatError.NumericStringEmpty]: 'Numeric string cannot be empty',\n [FormatError.UnsupportedNumericInput]: 'Unsupported numeric input type',\n [FormatError.MaxDecimalsLessThanMinimum]: 'maxDecimals cannot be less than minDecimals',\n [FormatError.MissingLocale]: 'Display formatting requires a locale',\n [FormatError.MissingCurrencyCode]: 'Currency formatting requires a currencyCode',\n [FormatError.DateValueInvalid]: 'Invalid date value',\n [FormatError.DateStringEmpty]: 'Date string cannot be empty',\n [FormatError.DateNumberNonFinite]: 'Date number must be finite',\n [FormatError.InvalidDateString]: 'Invalid date string',\n [FormatError.UnsupportedDateInput]: 'Unsupported date input type'\n\n} satisfies ErrorMessageMap\n\nconst applyDetails = (template: string,\n details?: ErrorDetails): string => {\n\n if (!details) { return template }\n\n return Object.keys(details).reduce((message, key) => message.replace(new RegExp(`%${key}%`, 'g'), details[key]), template)\n}\n\nexport const getFormatErrorMessage = (code: FormatError,\n details?: ErrorDetails): string => applyDetails(FORMAT_ERROR_MESSAGES[code], details)\n\nexport const toRangeError = (code: FormatError, details?: ErrorDetails): RangeError => new RangeError(getFormatErrorMessage(code, details))\nexport const toTypeError = (code: FormatError, details?: ErrorDetails): TypeError => new TypeError(getFormatErrorMessage(code, details))\nexport const toError = (code: FormatError, details?: ErrorDetails): Error => new Error(getFormatErrorMessage(code, details))\n","interface GroupingMetadata {\n\n primary: number\n secondary?: number\n}\n\nexport interface FormatPattern {\n\n positive: Intl.NumberFormatPart[]\n negative: Intl.NumberFormatPart[]\n groupSeparator: string\n decimalSeparator: string\n grouping: GroupingMetadata\n minusSign?: string\n plusSign?: string\n}\n\nconst numberFormatCache = new Map<string, Intl.NumberFormat>()\nconst numberFormatMetaCache = new Map<string, FormatPattern>()\nconst dateFormatCache = new Map<string, Intl.DateTimeFormat>()\n\nconst serializeOptions = (options: Intl.NumberFormatOptions | Intl.DateTimeFormatOptions): string => {\n\n const entries = Object.entries(options)\n .filter( ([, value]) => value !== undefined )\n .sort( ([a], [b]) => (a < b ? -1 : a > b ? 1 : 0) )\n .map( ([key, value]) => {\n\n if (value\n && typeof value === 'object'\n && !Array.isArray(value)) { return `${key}:{${serializeOptions(value as Intl.NumberFormatOptions)}}` }\n if (Array.isArray(value)) { return `${key}:[${value.join('|')}]` }\n\n return `${key}:${String(value)}`\n } )\n\n return entries.join(',')\n}\n\nconst buildNumberFormatKey = (locale: string, options: Intl.NumberFormatOptions): string => `${locale}|${serializeOptions(options)}`\nconst buildDateFormatKey = (locale: string, options?: Intl.DateTimeFormatOptions): string => `${locale}|${options ? serializeOptions(options) : ''}`\n\nexport const getNumberFormat = (locale: string, options: Intl.NumberFormatOptions): Intl.NumberFormat => {\n\n const key = buildNumberFormatKey(locale, options)\n const cached = numberFormatCache.get(key)\n\n if (cached) { return cached }\n\n const nf = new Intl.NumberFormat(locale, options)\n\n numberFormatCache.set(key, nf)\n\n return nf\n}\n\nconst deriveGrouping = (parts: Intl.NumberFormatPart[]): GroupingMetadata => {\n\n const integerParts = parts.filter((part) => part.type === 'integer')\n\n if (integerParts.length <= 1) { return { primary: 0 } }\n\n const lengths = integerParts.map((part) => part.value.length)\n const primary = lengths[lengths.length - 1]\n const secondary = lengths.length > 1 ? lengths[lengths.length - 2] : undefined\n\n if (secondary === primary) { return { primary } }\n\n return { primary, secondary }\n}\n\nconst analyzePattern = (nf: Intl.NumberFormat): FormatPattern => {\n\n const sampleValue = 1234567.89123456\n const positiveParts = nf.formatToParts(sampleValue)\n const negativeParts = nf.formatToParts(-sampleValue)\n const plusProbe = nf.formatToParts(1)\n\n const groupSeparator = positiveParts.find((part) => part.type === 'group')?.value ?? ''\n const decimalSeparator = positiveParts.find((part) => part.type === 'decimal')?.value ?? '.'\n const grouping = deriveGrouping(positiveParts)\n const minusSign = negativeParts.find((part) => part.type === 'minusSign')?.value\n const plusSign = plusProbe.find((part) => part.type === 'plusSign')?.value\n\n return {\n\n positive: positiveParts,\n negative: negativeParts,\n groupSeparator,\n decimalSeparator,\n grouping,\n minusSign,\n plusSign\n }\n}\n\nexport const getNumberFormatPattern = (locale: string, options: Intl.NumberFormatOptions): FormatPattern => {\n\n const key = buildNumberFormatKey(locale, options)\n const cached = numberFormatMetaCache.get(key)\n\n if (cached) { return cached }\n\n const nf = getNumberFormat(locale, options)\n const pattern = analyzePattern(nf)\n\n numberFormatMetaCache.set(key, pattern)\n\n return pattern\n}\n\nexport const getDateFormat = (locale: string, options?: Intl.DateTimeFormatOptions): Intl.DateTimeFormat => {\n\n const key = buildDateFormatKey(locale, options)\n const cached = dateFormatCache.get(key)\n\n if (cached) { return cached }\n\n const df = new Intl.DateTimeFormat(locale, options)\n\n dateFormatCache.set(key, df)\n\n return df\n}\n","import { DEFAULT_LOCALE } from '../constants'\n\nexport const resolveLocale = (value?: string): string => {\n\n const candidate = value?.trim()\n\n return candidate && candidate.length > 0 ? candidate : DEFAULT_LOCALE\n}\n","import { Big } from 'big.js'\n\nimport {\n BIG_ZERO,\n DECIMAL_DOT,\n DECIMAL_EMPTY,\n DECIMAL_ZERO,\n DEFAULT_SIGN_MINUS,\n} from '../constants'\nimport {\n FormatError,\n toRangeError,\n toTypeError,\n} from '../errors'\nimport {\n CommonNumberOptions,\n NumericLike,\n RoundingMode,\n} from '../types'\n\nconst ROUNDING_MODE_MAP = {\n roundDown: Big.roundDown,\n roundHalfUp: Big.roundHalfUp,\n roundHalfEven: Big.roundHalfEven,\n roundUp: Big.roundUp\n} satisfies Record<RoundingMode, Big.RoundingMode>\n\nexport interface NumericParts {\n\n big: Big\n integer: string\n fraction: string\n isNegative: boolean\n isZero: boolean\n}\n\nexport interface GroupingConfig {\n\n separator: string\n primary: number\n secondary?: number\n}\n\nconst assertNonNegativeInteger = (value: number | undefined,\n label: string): number | undefined => {\n\n if (value === undefined) {\n\n return undefined\n }\n\n if (!Number.isInteger(value) || value < 0) {\n\n throw toRangeError(FormatError.NonNegativeIntegerRequired, { label })\n }\n\n return value\n}\n\nconst assertPositiveInteger = (value: number | undefined,\n label: string): number | undefined => {\n\n if (value === undefined) {\n\n return undefined\n }\n\n if (!Number.isInteger(value) || value <= 0) {\n\n throw toRangeError(FormatError.PositiveIntegerRequired, { label })\n }\n\n return value\n}\n\nconst isZeroString = (input: string): boolean => {\n\n return /^[-+]?0+(?:\\.0+)?$/.test(input)\n}\n\nexport const normalizeNumeric = (value: NumericLike,\n clone: boolean = false): Big => {\n\n if (value instanceof Big) {\n\n return clone ? new Big(value) : value\n }\n\n if (typeof value === 'number') {\n\n if (!Number.isFinite(value)) {\n\n throw toRangeError(FormatError.NumericValueNonFinite)\n }\n\n return value === 0 ? BIG_ZERO : new Big(value)\n }\n\n if (typeof value === 'string') {\n\n const trimmed = value.trim()\n\n if (!trimmed) {\n\n throw toRangeError(FormatError.NumericStringEmpty)\n }\n\n if (isZeroString(trimmed)) {\n\n return BIG_ZERO\n }\n\n return new Big(trimmed)\n }\n\n throw toTypeError(FormatError.UnsupportedNumericInput)\n}\n\nconst mapRoundingMode = (mode?: RoundingMode): Big.RoundingMode => {\n\n if (!mode) {\n\n return Big.roundHalfUp\n }\n\n return ROUNDING_MODE_MAP[mode]\n}\n\nexport const toFixedNoSci = (value: Big,\n fractionDigits?: number,\n roundingMode?: RoundingMode): string => {\n\n const rm = mapRoundingMode(roundingMode)\n let working = value\n\n if (fractionDigits !== undefined) {\n\n working = working.round(fractionDigits, rm)\n }\n\n return bigToDecimalString(working)\n}\n\nexport const computeNumericParts = (value: NumericLike,\n options: CommonNumberOptions = {}): NumericParts => {\n\n const minDecimals = assertNonNegativeInteger(options.minDecimals, 'minDecimals') ?? 0\n const maxDecimals = assertNonNegativeInteger(options.maxDecimals, 'maxDecimals')\n const precision = assertPositiveInteger(options.precision, 'precision')\n const roundingMode = mapRoundingMode(options.roundingMode)\n\n if (maxDecimals !== undefined && maxDecimals < minDecimals) {\n\n throw toRangeError(FormatError.MaxDecimalsLessThanMinimum)\n }\n\n let bigValue = normalizeNumeric(value)\n\n if (precision !== undefined) {\n\n bigValue = bigValue.prec(precision, roundingMode)\n }\n\n if (maxDecimals !== undefined) {\n\n bigValue = bigValue.round(maxDecimals, roundingMode)\n }\n\n const isZero = bigValue.eq(0)\n const isNegative = !isZero && bigValue.s < 0\n const canonical = bigToDecimalString(bigValue.abs())\n let [integerPart,\n fractionPart = DECIMAL_EMPTY] = canonical.split(DECIMAL_DOT)\n\n integerPart = integerPart.replace(/^(0+)(\\d)/, '$2')\n\n if (!integerPart) {\n\n integerPart = DECIMAL_ZERO\n }\n\n if (!options.trimTrailingZeros && fractionPart.length < minDecimals) {\n\n fractionPart = fractionPart.padEnd(minDecimals, DECIMAL_ZERO)\n }\n\n if (maxDecimals !== undefined && fractionPart.length > maxDecimals) {\n\n fractionPart = fractionPart.slice(0, maxDecimals)\n }\n\n if (options.trimTrailingZeros) {\n\n const minKeep = minDecimals\n\n while (fractionPart.length > minKeep && fractionPart.endsWith(DECIMAL_ZERO)) {\n\n fractionPart = fractionPart.slice(0, -1)\n }\n }\n\n return {\n big: bigValue,\n integer: integerPart,\n fraction: fractionPart,\n isNegative,\n isZero\n }\n}\n\nexport const bigToDecimalString = (value: Big): string => {\n\n const coefficient = (value.c ?? [0]) as number[]\n const exponent = value.e ?? 0\n const sign = value.s < 0 ? DEFAULT_SIGN_MINUS : DECIMAL_EMPTY\n\n if (coefficient.every((digit) => digit === 0)) {\n\n return DECIMAL_ZERO\n }\n\n const digits = coefficient.join('')\n const decimalIndex = exponent + 1\n\n if (decimalIndex <= 0) {\n\n const zeros = DECIMAL_ZERO.repeat(Math.abs(decimalIndex))\n\n return `${sign}${DECIMAL_ZERO}${DECIMAL_DOT}${zeros}${digits}`.replace(/\\.$/, DECIMAL_EMPTY)\n }\n\n if (decimalIndex >= digits.length) {\n\n const zeros = DECIMAL_ZERO.repeat(decimalIndex - digits.length)\n\n return `${sign}${digits}${zeros}`\n }\n\n const integerPart = digits.slice(0, decimalIndex)\n const fractionPart = digits.slice(decimalIndex)\n\n return `${sign}${integerPart}${DECIMAL_DOT}${fractionPart}`\n}\n\nexport const applyGrouping = (integer: string,\n grouping: GroupingConfig,\n enableGrouping: boolean): string => {\n\n if (!enableGrouping || grouping.primary === 0 || integer.length <= grouping.primary) {\n\n return integer\n }\n\n const groups = [] as string[]\n const primary = grouping.primary\n const secondary = grouping.secondary ?? primary\n let index = integer.length\n let usePrimary = true\n\n while (index > 0) {\n\n const size = usePrimary ? primary : secondary\n\n if (size <= 0) {\n\n groups.unshift(integer.slice(0, index))\n break\n }\n\n const start = Math.max(index - size, 0)\n\n groups.unshift(integer.slice(start, index))\n index = start\n\n if (index <= 0) {\n\n break\n }\n\n usePrimary = false\n }\n\n return groups.join(grouping.separator)\n}\n","import { Big } from 'big.js'\n\nimport {\n COMPACT_ORDER,\n DEFAULT_SIGN_MINUS,\n DEFAULT_SIGN_PLUS,\n DISPLAY_SIGN_MINUS,\n DISPLAY_SIGN_NONE,\n DISPLAY_SIGN_PLUS,\n STYLE_CURRENCY,\n STYLE_DECIMAL,\n STYLE_PERCENT,\n} from './constants'\nimport {\n FormatError,\n toError,\n} from './errors'\nimport {\n FormatPattern,\n getNumberFormatPattern,\n} from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport {\n applyGrouping,\n computeNumericParts,\n normalizeNumeric,\n} from './internal/numeric'\nimport {\n CompactUnit,\n DisplayNumberOptions,\n NumberStyle,\n NumericLike,\n SIGN_DISPLAYS,\n SignDisplay,\n} from './types'\n\ninterface CompactResult {\n value: Big\n suffix?: string\n}\n\ninterface CurrencyResolution {\n value: string\n fromCustom: boolean\n}\n\nconst defaultCompactThresholds: Record<CompactUnit, Big> = {\n\n K: new Big(1_000),\n M: new Big(1_000_000),\n B: new Big(1_000_000_000),\n T: new Big(1_000_000_000_000)\n}\n\nconst defaultCompactSuffixes: Record<CompactUnit, string> = {\n\n K: 'K',\n M: 'M',\n B: 'B',\n T: 'T'\n}\n\nconst compactThresholdCache = new WeakMap<DisplayNumberOptions, Map<string, Big>>()\nconst COMPACT_DECIMAL_BUFFER = 12\n\nconst SUBSCRIPT_DIGITS = [\n\n '₀',\n '₁',\n '₂',\n '₃',\n '₄',\n '₅',\n '₆',\n '₇',\n '₈',\n '₉'\n\n] as const\n\nconst SUBSCRIPT_TO_DIGIT = SUBSCRIPT_DIGITS.reduce<Record<string, string>>((acc, digit, index) => {\n\n acc[digit] = index.toString()\n return acc\n}, {})\n\nconst toSubscriptNumber = (value: number): string => value\n .toString()\n .split('')\n .map((digit) => SUBSCRIPT_DIGITS[digit.charCodeAt(0) - 48])\n .join('')\n\nconst expandSubscriptDigits = (value: string): string => {\n\n let result = ''\n\n for (let index = 0; index < value.length; index += 1) {\n\n const char = value[index]!\n const mapped = SUBSCRIPT_TO_DIGIT[char]\n\n if (mapped === undefined) {\n\n result += char\n continue\n }\n\n let subscriptBuffer = mapped\n\n while (index + 1 < value.length) {\n\n const nextChar = value[index + 1]!\n const nextMapped = SUBSCRIPT_TO_DIGIT[nextChar]\n\n if (nextMapped === undefined) {\n\n break\n }\n\n subscriptBuffer += nextMapped\n index += 1\n }\n\n const zeroCount = Number(subscriptBuffer)\n\n if (Number.isNaN(zeroCount) || zeroCount <= 0) {\n\n continue\n }\n\n result += '0'.repeat(zeroCount)\n }\n\n return result\n}\n\nconst compactFractionLeadingZeros = (fraction: string): string => {\n\n const match = /^(0{2,})(.+)$/.exec(fraction)\n\n if (!match) {\n\n return fraction\n }\n\n const [, zeros, remainder] = match\n\n if (!remainder || /^0+$/.test(remainder)) {\n\n return fraction\n }\n\n const annotation = toSubscriptNumber(zeros.length - 1)\n\n return `${zeros[0]}${annotation}${remainder}`\n}\n\nconst resolveSignKind = (isNegative: boolean,\n isZero: boolean,\n signDisplay?: SignDisplay,\n forceSign?: boolean): typeof DISPLAY_SIGN_MINUS | typeof DISPLAY_SIGN_PLUS | typeof DISPLAY_SIGN_NONE => {\n\n const mode = signDisplay ?? (forceSign ? SIGN_DISPLAYS.always : SIGN_DISPLAYS.auto)\n\n switch (mode) {\n\n case SIGN_DISPLAYS.always: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_PLUS\n case SIGN_DISPLAYS.exceptZero: return isNegative ? DISPLAY_SIGN_MINUS : (isZero ? DISPLAY_SIGN_NONE : DISPLAY_SIGN_PLUS)\n case SIGN_DISPLAYS.never: return DISPLAY_SIGN_NONE\n case SIGN_DISPLAYS.negative: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_NONE\n case SIGN_DISPLAYS.auto:\n default: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_NONE\n }\n}\n\nconst resolveCurrencyToken = (template: string,\n options: DisplayNumberOptions): CurrencyResolution => {\n\n const code = options.currencyCode?.toUpperCase() ?? ''\n\n if (options.useSymbol === false) {\n\n return { value: code, fromCustom: false }\n }\n\n const custom = code ? options.customSymbols?.[code] : undefined\n\n if (custom) {\n\n return { value: custom, fromCustom: true }\n }\n\n if (template && template !== code) {\n\n return { value: template, fromCustom: false }\n }\n\n return { value: code, fromCustom: false }\n}\n\nconst getNormalizedThreshold = (options: DisplayNumberOptions,\n unit: CompactUnit): Big | undefined => {\n\n const overrides = options.compactThresholds\n\n if (!overrides || overrides[unit] === undefined) {\n\n return undefined\n }\n\n let cache = compactThresholdCache.get(options)\n\n if (!cache) {\n\n cache = new Map()\n compactThresholdCache.set(options, cache)\n }\n\n let normalized = cache.get(unit)\n\n if (!normalized) {\n\n normalized = normalizeNumeric(overrides[unit]!, true)\n cache.set(unit, normalized)\n }\n\n return normalized\n}\n\nconst resolveCompact = (value: Big,\n options: DisplayNumberOptions,\n enabled: boolean): CompactResult => {\n\n if (!enabled) {\n\n return { value }\n }\n\n const abs = value.abs()\n\n for (const unit of COMPACT_ORDER) {\n\n const overrideThreshold = getNormalizedThreshold(options, unit)\n const threshold = overrideThreshold ?? getDefaultCompactThreshold(unit)\n\n if (abs.gte(threshold)) {\n\n const suffix = options.compactSuffixes?.[unit] ?? getDefaultCompactSuffix(unit)\n const scaled = threshold.eq(0) ? value : value.div(threshold)\n\n return { value: scaled, suffix }\n }\n }\n\n return { value }\n}\n\nconst getDefaultCompactThreshold = (unit: CompactUnit): Big => {\n\n return defaultCompactThresholds[unit as keyof typeof defaultCompactThresholds]\n}\n\nconst getDefaultCompactSuffix = (unit: CompactUnit): string => {\n\n return defaultCompactSuffixes[unit as keyof typeof defaultCompactSuffixes]\n}\n\nconst buildNumberFormatOptions = (options: DisplayNumberOptions,\n style: NumberStyle): Intl.NumberFormatOptions => {\n\n const nfOptions: Intl.NumberFormatOptions = {\n style,\n useGrouping: options.useGrouping !== false\n }\n\n if (options.signDisplay && options.signDisplay !== SIGN_DISPLAYS.negative) {\n\n nfOptions.signDisplay = options.signDisplay\n\n } else if (!options.signDisplay && options.forceSign) {\n\n nfOptions.signDisplay = SIGN_DISPLAYS.always\n }\n\n if (options.minDecimals !== undefined) {\n\n nfOptions.minimumFractionDigits = options.minDecimals\n }\n\n if (options.maxDecimals !== undefined) {\n\n nfOptions.maximumFractionDigits = options.maxDecimals\n }\n\n if (style === STYLE_CURRENCY && options.currencyCode) {\n\n nfOptions.currency = options.currencyCode\n nfOptions.currencyDisplay = options.useSymbol === false ? 'code' : 'symbol'\n }\n\n return nfOptions\n}\n\nconst formatFromPattern = (options: DisplayNumberOptions,\n style: NumberStyle,\n integerPart: string,\n fractionPart: string,\n sign: typeof DISPLAY_SIGN_MINUS | typeof DISPLAY_SIGN_PLUS | typeof DISPLAY_SIGN_NONE,\n pattern: FormatPattern,\n suffix?: string,\n currencyOverride?: string,\n currencyOverrideIsCustom?: boolean): string => {\n const parts = sign === DISPLAY_SIGN_MINUS ? pattern.negative : pattern.positive\n const useGrouping = options.useGrouping !== false\n const groupedInteger = applyGrouping(integerPart, {\n separator: pattern.groupSeparator,\n primary: pattern.grouping.primary,\n secondary: pattern.grouping.secondary\n }, useGrouping)\n\n const hasFraction = fractionPart.length > 0\n let result = ''\n let integerInjected = false\n let currencyMeta: CurrencyResolution | undefined\n let previousType: Intl.NumberFormatPart['type'] | undefined\n let suffixInjected = false\n\n const appendSuffix = (): void => {\n\n if (!suffix || suffixInjected) {\n\n return\n }\n\n result += suffix\n suffixInjected = true\n }\n\n const stripTrailingWhitespace = (): void => {\n\n if (!result) {\n\n return\n }\n\n const trimmed = result.replace(/\\s+$/gu, '')\n\n if (trimmed !== result) {\n\n result = trimmed\n }\n }\n\n for (const part of parts) {\n\n switch (part.type) {\n\n case 'integer': {\n\n if (!integerInjected) {\n\n result += groupedInteger\n integerInjected = true\n\n if (!hasFraction) {\n\n appendSuffix()\n }\n }\n break\n }\n case 'group':\n break\n case 'decimal': {\n\n if (hasFraction) {\n\n result += pattern.decimalSeparator\n }\n break\n }\n case 'fraction': {\n\n if (hasFraction) {\n\n result += fractionPart\n appendSuffix()\n }\n break\n }\n case 'minusSign': {\n\n if (sign === DISPLAY_SIGN_MINUS) {\n\n result += pattern.minusSign ?? part.value ?? DEFAULT_SIGN_MINUS\n }\n break\n }\n case 'plusSign': {\n\n if (sign === DISPLAY_SIGN_PLUS) {\n\n result += pattern.plusSign ?? part.value ?? DEFAULT_SIGN_PLUS\n }\n break\n }\n case 'currency': {\n\n if (integerInjected) {\n\n appendSuffix()\n }\n if (currencyOverride !== undefined) {\n\n currencyMeta = {\n value: currencyOverride,\n fromCustom: currencyOverrideIsCustom ?? false\n }\n\n } else {\n\n currencyMeta = currencyMeta ?? resolveCurrencyToken(part.value, options)\n }\n result += currencyMeta.value\n break\n }\n case 'percentSign': {\n\n stripTrailingWhitespace()\n result += part.value\n break\n }\n case 'literal': {\n\n if (previousType === 'currency' && currencyMeta?.fromCustom && /^\\s+$/.test(part.value)) {\n\n break\n }\n result += part.value\n break\n }\n default: {\n result += part.value\n break\n }\n }\n\n previousType = part.type\n }\n\n appendSuffix()\n\n return result\n}\n\nconst resolveDisplayStyle = (options: DisplayNumberOptions,\n overrideStyle?: NumberStyle): NumberStyle => {\n\n const style = overrideStyle ?? options.style ?? STYLE_DECIMAL\n\n if (style === STYLE_CURRENCY && !options.currencyCode) {\n\n throw toError(FormatError.MissingCurrencyCode)\n }\n\n return style\n}\n\nconst formatDisplayInternal = (value: NumericLike,\n options: DisplayNumberOptions,\n styleOverride?: NumberStyle,\n forceCompact?: boolean): string => {\n\n const style = resolveDisplayStyle(options, styleOverride)\n const base = normalizeNumeric(value)\n const percentAdjusted = style === STYLE_PERCENT ? base.times(100) : base\n const {\n value: scaled,\n suffix\n } = resolveCompact(percentAdjusted, options, forceCompact ?? options.compact === true)\n const numericParts = computeNumericParts(scaled, options)\n const sign = resolveSignKind(numericParts.isNegative, numericParts.isZero, options.signDisplay, options.forceSign)\n let integerPart = numericParts.integer\n let fractionPart = numericParts.fraction\n const locale = resolveLocale(options.locale)\n let pattern: FormatPattern\n let currencyOverride: string | undefined\n let currencyOverrideIsCustom = false\n\n if (options.compactDecimalZeros && !options.isHidden) {\n\n const baseMatch = /^(0{2,})(.+)$/.exec(fractionPart)\n const baseRemainder = baseMatch?.[2]\n const hasBaseDigits = baseMatch && baseRemainder && !/^0+$/.test(baseRemainder)\n\n if (hasBaseDigits) {\n\n fractionPart = compactFractionLeadingZeros(fractionPart)\n\n } else {\n\n const extendedMax = options.maxDecimals !== undefined ? options.maxDecimals + COMPACT_DECIMAL_BUFFER : undefined\n\n const extendedOptions: DisplayNumberOptions = {\n ...options,\n maxDecimals: extendedMax,\n trimTrailingZeros: false\n }\n\n const extendedParts = computeNumericParts(scaled, extendedOptions)\n const extendedFraction = extendedParts.fraction\n const match = /^(0{2,})(.+)$/.exec(extendedFraction)\n\n if (match) {\n\n const zerosPortion = match[1]\n let remainder = match[2]\n\n if (!/^0+$/.test(remainder)) {\n\n const targetMax = options.maxDecimals\n const targetMin = options.minDecimals ?? 0\n\n if (targetMax === 0) {\n\n fractionPart = ''\n\n } else {\n\n let digits = zerosPortion\n const remainderNeeded = targetMax !== undefined ? Math.max(targetMax - 1, 0) : remainder.length\n\n if (remainderNeeded > 0) {\n\n if (remainder.length < remainderNeeded) {\n\n remainder = remainder.padEnd(remainderNeeded, '0')\n }\n\n digits += remainder.slice(0, remainderNeeded)\n }\n\n if (targetMax === undefined && digits.length < targetMin) {\n\n const extraNeeded = targetMin - digits.length\n let extraSource = remainder.slice(remainderNeeded)\n\n if (extraSource.length < extraNeeded) {\n\n extraSource = extraSource.padEnd(extraNeeded, '0')\n }\n\n digits += extraSource.slice(0, extraNeeded)\n }\n\n if (targetMax !== undefined && digits.length < targetMin) {\n\n digits = digits.padEnd(targetMin, '0')\n }\n\n if (options.trimTrailingZeros) {\n\n const minKeep = Math.max(targetMin, zerosPortion ? 1 : 0)\n\n while (digits.length > Math.max(minKeep, zerosPortion.length) && digits.endsWith('0')) {\n\n digits = digits.slice(0, -1)\n }\n }\n\n fractionPart = compactFractionLeadingZeros(digits)\n integerPart = extendedParts.integer\n }\n }\n }\n }\n }\n\n if (options.isHidden) {\n\n const maskChar = options.hiddenCharacter && options.hiddenCharacter.length > 0\n ? options.hiddenCharacter[0]\n : '*'\n integerPart = maskChar\n fractionPart = fractionPart.length > 0 ? maskChar.repeat(fractionPart.length) : fractionPart\n }\n try {\n\n const nfOptions = buildNumberFormatOptions(options, style)\n pattern = getNumberFormatPattern(locale, nfOptions)\n\n } catch (error) {\n\n if (!(error instanceof RangeError) || style !== STYLE_CURRENCY || !options.currencyCode) {\n\n throw error\n }\n\n const placeholderOptions: DisplayNumberOptions = {\n ...options,\n currencyCode: 'USD'\n }\n const nfOptionsFallback = buildNumberFormatOptions(placeholderOptions, STYLE_CURRENCY)\n pattern = getNumberFormatPattern(locale, nfOptionsFallback)\n\n const rawCode = options.currencyCode\n const code = rawCode.toUpperCase()\n\n if (options.useSymbol === false) {\n\n currencyOverride = rawCode\n\n } else {\n\n const customSymbol = options.customSymbols?.[code] ?? options.customSymbols?.[rawCode]\n\n if (customSymbol) {\n\n currencyOverride = customSymbol\n currencyOverrideIsCustom = true\n\n } else {\n\n currencyOverride = rawCode\n }\n }\n }\n\n return formatFromPattern(options, style, integerPart, fractionPart, sign, pattern, suffix, currencyOverride, currencyOverrideIsCustom)\n}\n\nexport const formatDisplayNumber = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options)\nexport const formatDisplayCurrency = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, STYLE_CURRENCY)\nexport const formatDisplayPercent = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, STYLE_PERCENT)\nexport const formatDisplayCompact = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, undefined, true)\n\nconst stripGroupSeparators = (value: string,\n separator: string): string => {\n\n if (!separator) { return value }\n\n return value.split(separator).join('')\n}\n\nconst normalizeNumericCore = (core: string,\n pattern: FormatPattern): string => {\n\n let normalized = expandSubscriptDigits(core)\n\n if (pattern.groupSeparator) {\n\n normalized = stripGroupSeparators(normalized, pattern.groupSeparator)\n }\n\n normalized = normalized.replace(/\\s+/gu, '')\n\n if (pattern.decimalSeparator && pattern.decimalSeparator !== '.') {\n\n normalized = normalized.replace(pattern.decimalSeparator, '.')\n }\n\n if (pattern.minusSign && pattern.minusSign !== DEFAULT_SIGN_MINUS) {\n\n normalized = normalized.split(pattern.minusSign).join(DEFAULT_SIGN_MINUS)\n }\n\n if (pattern.plusSign && pattern.plusSign !== DEFAULT_SIGN_PLUS) {\n\n normalized = normalized.split(pattern.plusSign).join(DEFAULT_SIGN_PLUS)\n }\n\n return normalized\n}\n\nconst parseDisplayInternal = (formatted: string,\n options?: DisplayNumberOptions): number => {\n\n const numericCore = extractNumberCore(formatted)\n\n if (!numericCore) { return Number.NaN }\n\n const locale = options?.locale\n\n if (locale) {\n\n const resolvedLocale = resolveLocale(locale)\n const nfOptions = buildNumberFormatOptions(options ?? {}, STYLE_DECIMAL)\n const pattern = getNumberFormatPattern(resolvedLocale, nfOptions)\n const normalizedCore = normalizeNumericCore(numericCore, pattern)\n\n if (!normalizedCore || normalizedCore === DEFAULT_SIGN_MINUS || normalizedCore === DEFAULT_SIGN_PLUS) {\n\n return Number.NaN\n }\n\n try {\n\n return Big(normalizedCore).toNumber()\n\n } catch (error) {\n\n // fall back to locale-agnostic heuristics below when locale pattern parsing fails\n }\n }\n\n let normalized = expandSubscriptDigits(numericCore)\n normalized = normalized.replace(/['’`_\\s\\u00A0]/gu, '')\n\n const lastDot = normalized.lastIndexOf('.')\n const lastComma = normalized.lastIndexOf(',')\n\n if (lastDot !== -1 || lastComma !== -1) {\n\n let decimalIndex = Math.max(lastDot, lastComma)\n let decimalChar = decimalIndex === lastDot ? '.' : ','\n\n if (lastDot !== -1 && lastComma !== -1) {\n\n decimalChar = decimalIndex === lastDot ? '.' : ','\n const thousandsChar = decimalChar === '.' ? ',' : '.'\n normalized = normalized.split(thousandsChar).join('')\n\n } else if (lastComma !== -1) {\n\n const fractionalPart = normalized.slice(lastComma + 1)\n\n if (fractionalPart.length === 3 && normalized.slice(0, lastComma).replace(/[^0-9]/g, '').length > 3) {\n\n normalized = normalized.replace(/,/g, '')\n decimalChar = '.'\n\n } else {\n\n decimalChar = ','\n }\n\n } else if (lastDot !== -1) {\n\n const fractionalPart = normalized.slice(lastDot + 1)\n\n if (fractionalPart.length === 3 && normalized.slice(0, lastDot).replace(/[^0-9]/g, '').length > 3) {\n\n decimalChar = ','\n normalized = normalized.replace(/\\./g, '')\n\n } else {\n\n decimalChar = '.'\n }\n }\n\n if (decimalChar !== '.') {\n\n normalized = normalized.split(decimalChar).join('.')\n }\n }\n\n normalized = normalized.replace(/,/g, '')\n\n if (!normalized || normalized === DEFAULT_SIGN_MINUS || normalized === DEFAULT_SIGN_PLUS) {\n\n return Number.NaN\n }\n\n try {\n\n return Big(normalized).toNumber()\n\n } catch (error) {\n\n return Number.NaN\n }\n}\nexport const parseDisplayValue = (formatted: string, options?: DisplayNumberOptions): number => parseDisplayInternal(formatted, options)\n\nconst NUMERIC_OR_SUBSCRIPT = /[0-9₀-₉]/\nconst MINUS_SIGNS = new Set(['-', '−', '﹣', '-'])\nconst isWhitespace = (char: string): boolean => /\\s/.test(char)\n\nexport const extractNumberCore = (formatted: string): string => {\n\n let startIndex = -1\n let endIndex = -1\n\n for (let i = 0; i < formatted.length; i += 1) {\n\n if (NUMERIC_OR_SUBSCRIPT.test(formatted[i]!)) {\n\n startIndex = i\n break\n }\n }\n\n if (startIndex === -1) {\n\n return ''\n }\n\n for (let i = formatted.length - 1; i >= startIndex; i -= 1) {\n\n if (NUMERIC_OR_SUBSCRIPT.test(formatted[i]!)) {\n\n endIndex = i\n break\n }\n }\n\n if (endIndex === -1) {\n\n return ''\n }\n\n let signPrefix = ''\n\n for (let idx = startIndex - 1; idx >= 0; idx -= 1) {\n\n const candidate = formatted[idx]!\n\n if (isWhitespace(candidate)) {\n\n continue\n }\n\n if (MINUS_SIGNS.has(candidate)) {\n\n signPrefix = candidate\n break\n }\n\n if (NUMERIC_OR_SUBSCRIPT.test(candidate)) {\n\n break\n }\n }\n\n if (!signPrefix) {\n\n for (let idx = endIndex + 1; idx < formatted.length; idx += 1) {\n\n const candidate = formatted[idx]!\n\n if (isWhitespace(candidate)) {\n\n continue\n }\n\n if (MINUS_SIGNS.has(candidate)) {\n\n signPrefix = candidate\n break\n }\n\n if (NUMERIC_OR_SUBSCRIPT.test(candidate)) {\n\n break\n }\n }\n }\n\n return `${signPrefix}${formatted.slice(startIndex, endIndex + 1)}`\n}\n","import {\n FormatError,\n toRangeError,\n toTypeError,\n} from './errors'\nimport { getDateFormat } from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport { CsvDateOptions } from './types'\n\nconst toDate = (value: Date | number | string): Date => {\n\n if (value instanceof Date) {\n\n const timestamp = value.getTime()\n\n if (Number.isNaN(timestamp)) {\n\n throw toRangeError(FormatError.DateValueInvalid)\n }\n\n return new Date(timestamp)\n }\n\n if (typeof value === 'number') {\n\n if (!Number.isFinite(value)) {\n\n throw toRangeError(FormatError.DateNumberNonFinite)\n }\n\n const date = new Date(value)\n\n if (Number.isNaN(date.getTime())) {\n\n throw toRangeError(FormatError.DateValueInvalid)\n }\n\n return date\n }\n\n if (typeof value === 'string') {\n\n const trimmed = value.trim()\n\n if (!trimmed) {\n\n throw toRangeError(FormatError.DateStringEmpty)\n }\n\n const date = new Date(trimmed)\n\n if (Number.isNaN(date.getTime())) {\n\n throw toRangeError(FormatError.InvalidDateString)\n }\n\n return date\n }\n\n throw toTypeError(FormatError.UnsupportedDateInput)\n}\n\nexport const formatDisplayDate = (date: Date | number | string,\n locale?: string,\n options?: Intl.DateTimeFormatOptions): string => {\n\n const resolvedLocale = resolveLocale(locale)\n const parsed = toDate(date)\n const formatter = getDateFormat(resolvedLocale, options)\n\n return formatter.format(parsed)\n}\n\nexport const formatCsvDate = (date: Date | number | string,\n options?: CsvDateOptions): string => {\n\n const parsed = toDate(date)\n const format = options?.format ?? 'iso'\n\n if (format === 'utc-datetime') {\n\n const year = parsed.getUTCFullYear()\n const month = String(parsed.getUTCMonth() + 1).padStart(2, '0')\n const day = String(parsed.getUTCDate() ).padStart(2, '0')\n const hours = String(parsed.getUTCHours() ).padStart(2, '0')\n const minutes = String(parsed.getUTCMinutes() ).padStart(2, '0')\n const seconds = String(parsed.getUTCSeconds() ).padStart(2, '0')\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`\n }\n\n const iso = parsed.toISOString()\n const datePart = iso.slice(0, 10)\n const hasTime = parsed.getUTCHours() !== 0\n || parsed.getUTCMinutes() !== 0\n || parsed.getUTCSeconds() !== 0\n || parsed.getUTCMilliseconds() !== 0\n\n if (!hasTime) { return datePart }\n\n const timePart = iso.slice(11)\n const withoutMillis = timePart.replace(/\\.\\d+Z$/, 'Z')\n\n return `${datePart}T${withoutMillis}`\n}\n","import {\n DECIMAL_DOT,\n DECIMAL_EMPTY,\n DECIMAL_ZERO,\n DEFAULT_SIGN_MINUS,\n STYLE_DECIMAL,\n} from './constants'\nimport { formatCsvDate } from './date'\nimport {\n getNumberFormatPattern,\n} from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport {\n computeNumericParts,\n normalizeNumeric,\n} from './internal/numeric'\nimport {\n CsvColumnSpec,\n CsvNumberOptions,\n NumericLike,\n} from './types'\n\nconst resolveDecimalDelimiter = (options: CsvNumberOptions): string => {\n\n if (options.decimalDelimiter !== undefined) {\n\n return options.decimalDelimiter\n }\n\n if (options.locale) {\n\n const locale = resolveLocale(options.locale)\n const pattern = getNumberFormatPattern(locale, { style: STYLE_DECIMAL })\n\n return pattern.decimalSeparator\n }\n\n return DECIMAL_DOT\n}\n\nconst stringifyNumericParts = (parts: ReturnType<typeof computeNumericParts>,\n decimalDelimiter: string = DECIMAL_DOT): string => {\n\n const fraction = parts.fraction.length > 0 ? `${decimalDelimiter}${parts.fraction}` : DECIMAL_EMPTY\n const integer = parts.integer || DECIMAL_ZERO\n const prefix = parts.isNegative ? DEFAULT_SIGN_MINUS : DECIMAL_EMPTY\n const value = `${prefix}${integer}${fraction}`\n\n return value\n}\n\nexport const formatCsvNumber = (value: NumericLike,\n options: CsvNumberOptions = {}): string => {\n\n const parts = computeNumericParts(value, options)\n const delimiter = resolveDecimalDelimiter(options)\n\n return stringifyNumericParts(parts, delimiter)\n}\n\nexport const formatCsvPercent = (value: NumericLike,\n options: CsvNumberOptions = {}): string => {\n\n const scaled = normalizeNumeric(value).times(100)\n const parts = computeNumericParts(scaled, options)\n const delimiter = resolveDecimalDelimiter(options)\n\n return stringifyNumericParts(parts, delimiter)\n}\n\nexport const csvCurrencyCode = (code: string,\n customSymbols?: Record<string, string>,\n useSymbol?: boolean): string => {\n\n const trimmed = code.trim()\n\n if (!trimmed) { return DECIMAL_EMPTY }\n\n const normalized = trimmed.toUpperCase()\n\n if (useSymbol) {\n\n const symbol = customSymbols?.[normalized]\n\n if (symbol) { return symbol }\n }\n\n return normalized\n}\n\nconst escapeCsvField = (value: string,\n delimiter: string): string => {\n\n const needsQuoting = value.includes(delimiter)\n || value.includes('\\n')\n || value.includes('\\r')\n || value.includes('\"')\n\n if (!needsQuoting) { return value }\n\n const escaped = value.replace(/\"/g, '\"\"')\n\n return `\"${escaped}\"`\n}\n\nconst defaultFormatter = (value: unknown): string => {\n\n if (value === null || value === undefined) {\n\n return DECIMAL_EMPTY\n }\n\n if (value instanceof Date) {\n\n return formatCsvDate(value)\n }\n\n if (typeof value === 'number') {\n\n return formatCsvNumber(value)\n }\n\n if (typeof value === 'string') {\n\n return value\n }\n\n if (typeof value === 'boolean') {\n\n return value ? 'true' : 'false'\n }\n\n return String(value)\n}\n\nexport const buildCsv = <T>(rows: T[],\n columns: CsvColumnSpec<T>[],\n delimiter: string = ',',\n lineEnding: string = '\\n'): string => {\n\n const headerLine = columns.map((col) => escapeCsvField(col.header, delimiter)).join(delimiter)\n const lines = [headerLine]\n\n for (const row of rows) {\n\n const fields = columns.map((col) => {\n\n const raw = col.accessor(row)\n const formatted = col.formatter ? col.formatter(raw) : defaultFormatter(raw)\n const stringValue = formatted ?? DECIMAL_EMPTY\n\n return escapeCsvField(stringValue, delimiter)\n })\n\n lines.push(fields.join(delimiter))\n }\n\n return `${lines.join(lineEnding)}${lineEnding}`\n}\n","import { Big } from 'big.js'\n\nimport {\n BIG_ZERO,\n DECIMALS_CARDANO,\n} from './constants'\nimport { NumericLike } from './types'\n\nexport const bigQuantityFromAmount = ( amount?: NumericLike, decimals?: number): Big => {\n\n if (!amount || amount === '0' || amount === 0) { return BIG_ZERO }\n if (!decimals || decimals <= 0) { return Big(amount) } // Don't round to 0 decimals\n\n return Big(amount).mul(Math.pow(10, decimals)).round(0)\n}\nexport const bigAmountFromQuantity = (quantity?: NumericLike, decimals?: number): Big => {\n\n if (!quantity || quantity === '0' || quantity === 0) { return BIG_ZERO }\n if (!decimals || decimals <= 0) { return Big(quantity) } // Don't round to 0 decimals\n\n return Big(quantity).div(Math.pow(10, decimals)).round(decimals)\n}\nexport const bigLovelaceFromAda = ( ada?: NumericLike, decimals: number = DECIMALS_CARDANO): Big => bigQuantityFromAmount( ada, decimals)\nexport const bigAdaFromLovelace = (lovelace?: NumericLike, decimals: number = DECIMALS_CARDANO): Big => bigAmountFromQuantity(lovelace, decimals)\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["Big","Big"],"sources":["../src/types.ts","../src/constants.ts","../src/errors.ts","../src/internal/intl-cache.ts","../src/internal/locale.ts","../src/internal/numeric.ts","../src/display.ts","../src/date.ts","../src/csv.ts","../src/time.ts","../src/big.ts"],"sourcesContent":["import { BigSource } from '@eternl/big'\n\nexport type NumericLike = BigSource\nexport type RoundingMode = 'roundDown' | 'roundHalfUp' | 'roundHalfEven' | 'roundUp'\n\nexport const NUMBER_STYLES = {\n\n decimal: 'decimal',\n currency: 'currency',\n percent: 'percent'\n\n} as const\n\nexport type NumberStyle = typeof NUMBER_STYLES[keyof typeof NUMBER_STYLES]\n\nexport const SIGN_DISPLAYS = {\n\n auto: 'auto',\n always: 'always',\n exceptZero: 'exceptZero',\n never: 'never',\n negative: 'negative'\n\n} as const\n\nexport type SignDisplay = typeof SIGN_DISPLAYS[keyof typeof SIGN_DISPLAYS]\n\nexport const COMPACT_UNITS = ['K', 'M', 'B', 'T'] as const\n\nexport type CompactUnit = typeof COMPACT_UNITS[number]\n\nexport interface CommonNumberOptions {\n\n minDecimals?: number\n maxDecimals?: number\n precision?: number\n roundingMode?: RoundingMode\n trimTrailingZeros?: boolean\n}\n\nexport interface DisplayNumberOptions extends CommonNumberOptions {\n\n locale?: string\n style?: NumberStyle\n currencyCode?: string\n useSymbol?: boolean\n customSymbols?: Record<string, string>\n compact?: boolean\n compactThresholds?: Partial<Record<CompactUnit, BigSource>>\n compactSuffixes?: Partial<Record<CompactUnit, string>>\n signDisplay?: SignDisplay\n useGrouping?: boolean\n isHidden?: boolean\n hiddenCharacter?: string\n compactDecimalZeros?: boolean\n forceSign?: boolean\n}\n\nexport interface CsvNumberOptions extends CommonNumberOptions {\n\n locale?: string\n decimalDelimiter?: string\n}\n\nexport interface CsvDateOptions {\n\n format?: 'iso' | 'utc-datetime'\n}\n\nexport type CsvRow = Record<string, unknown> | unknown[]\n\nexport interface CsvColumnSpec<T = any> {\n\n header: string\n accessor: (row: T) => unknown\n formatter?: (value: unknown) => string\n}\n\nexport interface FormatDisplayParams {\n\n locale?: string\n options: Intl.NumberFormatOptions\n}\n","import { Big } from '@eternl/big'\n\nimport {\n COMPACT_UNITS,\n CompactUnit,\n NUMBER_STYLES,\n NumberStyle,\n} from './types'\n\nexport const STYLE_DECIMAL: NumberStyle = NUMBER_STYLES.decimal\nexport const STYLE_CURRENCY: NumberStyle = NUMBER_STYLES.currency\nexport const STYLE_PERCENT: NumberStyle = NUMBER_STYLES.percent\n\nexport const DEFAULT_LOCALE = 'en-US'\n\nexport const DISPLAY_SIGNS = {\n\n minus: 'minus',\n plus: 'plus',\n none: 'none'\n\n} as const\n\nexport type DisplaySignValue = typeof DISPLAY_SIGNS[keyof typeof DISPLAY_SIGNS]\n\nexport const DISPLAY_SIGN_MINUS = DISPLAY_SIGNS.minus\nexport const DISPLAY_SIGN_PLUS = DISPLAY_SIGNS.plus\nexport const DISPLAY_SIGN_NONE = DISPLAY_SIGNS.none\n\nexport const COMPACT_ORDER: CompactUnit[] = [...COMPACT_UNITS].reverse() as CompactUnit[]\n\nexport const DEFAULT_SIGN_MINUS = '-'\nexport const DEFAULT_SIGN_PLUS = '+'\n\nexport const DECIMAL_ZERO = '0'\nexport const DECIMAL_EMPTY = ''\nexport const DECIMAL_DOT = '.'\n\nexport const BIG_ZERO = Big(0)\n\n// This is a shortcut to avoid @eternl/network-id dependency in this package.\nexport const DECIMALS_CARDANO = 6\n","export enum FormatError {\n\n NonNegativeIntegerRequired = 'nonNegativeIntegerRequired',\n PositiveIntegerRequired = 'positiveIntegerRequired',\n NumericValueNonFinite = 'numericValueNonFinite',\n NumericStringEmpty = 'numericStringEmpty',\n UnsupportedNumericInput = 'unsupportedNumericInput',\n MaxDecimalsLessThanMinimum = 'maxDecimalsLessThanMinimum',\n MissingLocale = 'missingLocale',\n MissingCurrencyCode = 'missingCurrencyCode',\n DateValueInvalid = 'dateValueInvalid',\n DateStringEmpty = 'dateStringEmpty',\n DateNumberNonFinite = 'dateNumberNonFinite',\n InvalidDateString = 'invalidDateString',\n UnsupportedDateInput = 'unsupportedDateInput'\n}\n\ntype ErrorDetails = Record<string, string>\n\ntype ErrorMessageMap = Record<FormatError, string>\n\nconst FORMAT_ERROR_MESSAGES = {\n\n [FormatError.NonNegativeIntegerRequired]: '%label% must be a non-negative integer',\n [FormatError.PositiveIntegerRequired]: '%label% must be a positive integer',\n [FormatError.NumericValueNonFinite]: 'Numeric value must be a finite number',\n [FormatError.NumericStringEmpty]: 'Numeric string cannot be empty',\n [FormatError.UnsupportedNumericInput]: 'Unsupported numeric input type',\n [FormatError.MaxDecimalsLessThanMinimum]: 'maxDecimals cannot be less than minDecimals',\n [FormatError.MissingLocale]: 'Display formatting requires a locale',\n [FormatError.MissingCurrencyCode]: 'Currency formatting requires a currencyCode',\n [FormatError.DateValueInvalid]: 'Invalid date value',\n [FormatError.DateStringEmpty]: 'Date string cannot be empty',\n [FormatError.DateNumberNonFinite]: 'Date number must be finite',\n [FormatError.InvalidDateString]: 'Invalid date string',\n [FormatError.UnsupportedDateInput]: 'Unsupported date input type'\n\n} satisfies ErrorMessageMap\n\nconst applyDetails = (template: string,\n details?: ErrorDetails): string => {\n\n if (!details) { return template }\n\n return Object.keys(details).reduce((message, key) => message.replace(new RegExp(`%${key}%`, 'g'), details[key]), template)\n}\n\nexport const getFormatErrorMessage = (code: FormatError,\n details?: ErrorDetails): string => applyDetails(FORMAT_ERROR_MESSAGES[code], details)\n\nexport const toRangeError = (code: FormatError, details?: ErrorDetails): RangeError => new RangeError(getFormatErrorMessage(code, details))\nexport const toTypeError = (code: FormatError, details?: ErrorDetails): TypeError => new TypeError(getFormatErrorMessage(code, details))\nexport const toError = (code: FormatError, details?: ErrorDetails): Error => new Error(getFormatErrorMessage(code, details))\n","interface GroupingMetadata {\n\n primary: number\n secondary?: number\n}\n\nexport interface FormatPattern {\n\n positive: Intl.NumberFormatPart[]\n negative: Intl.NumberFormatPart[]\n groupSeparator: string\n decimalSeparator: string\n grouping: GroupingMetadata\n minusSign?: string\n plusSign?: string\n}\n\nconst numberFormatCache = new Map<string, Intl.NumberFormat>()\nconst numberFormatMetaCache = new Map<string, FormatPattern>()\nconst dateFormatCache = new Map<string, Intl.DateTimeFormat>()\n\nconst serializeOptions = (options: Intl.NumberFormatOptions | Intl.DateTimeFormatOptions): string => {\n\n const entries = Object.entries(options)\n .filter( ([, value]) => value !== undefined )\n .sort( ([a], [b]) => (a < b ? -1 : a > b ? 1 : 0) )\n .map( ([key, value]) => {\n\n if (value\n && typeof value === 'object'\n && !Array.isArray(value)) { return `${key}:{${serializeOptions(value as Intl.NumberFormatOptions)}}` }\n if (Array.isArray(value)) { return `${key}:[${value.join('|')}]` }\n\n return `${key}:${String(value)}`\n } )\n\n return entries.join(',')\n}\n\nconst buildNumberFormatKey = (locale: string, options: Intl.NumberFormatOptions): string => `${locale}|${serializeOptions(options)}`\nconst buildDateFormatKey = (locale: string, options?: Intl.DateTimeFormatOptions): string => `${locale}|${options ? serializeOptions(options) : ''}`\n\nexport const getNumberFormat = (locale: string, options: Intl.NumberFormatOptions): Intl.NumberFormat => {\n\n const key = buildNumberFormatKey(locale, options)\n const cached = numberFormatCache.get(key)\n\n if (cached) { return cached }\n\n const nf = new Intl.NumberFormat(locale, options)\n\n numberFormatCache.set(key, nf)\n\n return nf\n}\n\nconst deriveGrouping = (parts: Intl.NumberFormatPart[]): GroupingMetadata => {\n\n const integerParts = parts.filter((part) => part.type === 'integer')\n\n if (integerParts.length <= 1) { return { primary: 0 } }\n\n const lengths = integerParts.map((part) => part.value.length)\n const primary = lengths[lengths.length - 1]\n const secondary = lengths.length > 1 ? lengths[lengths.length - 2] : undefined\n\n if (secondary === primary) { return { primary } }\n\n return { primary, secondary }\n}\n\nconst analyzePattern = (nf: Intl.NumberFormat): FormatPattern => {\n\n const sampleValue = 1234567.89123456\n const positiveParts = nf.formatToParts(sampleValue)\n const negativeParts = nf.formatToParts(-sampleValue)\n const plusProbe = nf.formatToParts(1)\n\n const groupSeparator = positiveParts.find((part) => part.type === 'group')?.value ?? ''\n const decimalSeparator = positiveParts.find((part) => part.type === 'decimal')?.value ?? '.'\n const grouping = deriveGrouping(positiveParts)\n const minusSign = negativeParts.find((part) => part.type === 'minusSign')?.value\n const plusSign = plusProbe.find((part) => part.type === 'plusSign')?.value\n\n return {\n\n positive: positiveParts,\n negative: negativeParts,\n groupSeparator,\n decimalSeparator,\n grouping,\n minusSign,\n plusSign\n }\n}\n\nexport const getNumberFormatPattern = (locale: string, options: Intl.NumberFormatOptions): FormatPattern => {\n\n const key = buildNumberFormatKey(locale, options)\n const cached = numberFormatMetaCache.get(key)\n\n if (cached) { return cached }\n\n const nf = getNumberFormat(locale, options)\n const pattern = analyzePattern(nf)\n\n numberFormatMetaCache.set(key, pattern)\n\n return pattern\n}\n\nexport const getDateFormat = (locale: string, options?: Intl.DateTimeFormatOptions): Intl.DateTimeFormat => {\n\n const key = buildDateFormatKey(locale, options)\n const cached = dateFormatCache.get(key)\n\n if (cached) { return cached }\n\n const df = new Intl.DateTimeFormat(locale, options)\n\n dateFormatCache.set(key, df)\n\n return df\n}\n","import { DEFAULT_LOCALE } from '../constants'\n\nexport const resolveLocale = (value?: string): string => {\n\n const candidate = value?.trim()\n\n return candidate && candidate.length > 0 ? candidate : DEFAULT_LOCALE\n}\n","import { Big } from '@eternl/big'\n\nimport {\n BIG_ZERO,\n DECIMAL_DOT,\n DECIMAL_EMPTY,\n DECIMAL_ZERO,\n DEFAULT_SIGN_MINUS,\n} from '../constants'\nimport {\n FormatError,\n toRangeError,\n toTypeError,\n} from '../errors'\nimport {\n CommonNumberOptions,\n NumericLike,\n RoundingMode,\n} from '../types'\n\nconst ROUNDING_MODE_MAP = {\n roundDown: Big.roundDown,\n roundHalfUp: Big.roundHalfUp,\n roundHalfEven: Big.roundHalfEven,\n roundUp: Big.roundUp\n} satisfies Record<RoundingMode, Big.RoundingMode>\n\nexport interface NumericParts {\n\n big: Big\n integer: string\n fraction: string\n isNegative: boolean\n isZero: boolean\n}\n\nexport interface GroupingConfig {\n\n separator: string\n primary: number\n secondary?: number\n}\n\nconst assertNonNegativeInteger = (value: number | undefined,\n label: string): number | undefined => {\n\n if (value === undefined) {\n\n return undefined\n }\n\n if (!Number.isInteger(value) || value < 0) {\n\n throw toRangeError(FormatError.NonNegativeIntegerRequired, { label })\n }\n\n return value\n}\n\nconst assertPositiveInteger = (value: number | undefined,\n label: string): number | undefined => {\n\n if (value === undefined) {\n\n return undefined\n }\n\n if (!Number.isInteger(value) || value <= 0) {\n\n throw toRangeError(FormatError.PositiveIntegerRequired, { label })\n }\n\n return value\n}\n\nconst isZeroString = (input: string): boolean => {\n\n return /^[-+]?0+(?:\\.0+)?$/.test(input)\n}\n\nexport const normalizeNumeric = (value: NumericLike,\n clone: boolean = false): Big => {\n\n if (value instanceof Big) {\n\n return clone ? new Big(value) : value\n }\n\n if (typeof value === 'number') {\n\n if (!Number.isFinite(value)) {\n\n throw toRangeError(FormatError.NumericValueNonFinite)\n }\n\n return value === 0 ? BIG_ZERO : new Big(value)\n }\n\n if (typeof value === 'string') {\n\n const trimmed = value.trim()\n\n if (!trimmed) {\n\n throw toRangeError(FormatError.NumericStringEmpty)\n }\n\n if (isZeroString(trimmed)) {\n\n return BIG_ZERO\n }\n\n return new Big(trimmed)\n }\n\n throw toTypeError(FormatError.UnsupportedNumericInput)\n}\n\nconst mapRoundingMode = (mode?: RoundingMode): Big.RoundingMode => {\n\n if (!mode) {\n\n return Big.roundHalfUp\n }\n\n return ROUNDING_MODE_MAP[mode]\n}\n\nexport const toFixedNoSci = (value: Big,\n fractionDigits?: number,\n roundingMode?: RoundingMode): string => {\n\n const rm = mapRoundingMode(roundingMode)\n let working = value\n\n if (fractionDigits !== undefined) {\n\n working = working.round(fractionDigits, rm)\n }\n\n return bigToDecimalString(working)\n}\n\nexport const computeNumericParts = (value: NumericLike,\n options: CommonNumberOptions = {}): NumericParts => {\n\n const minDecimals = assertNonNegativeInteger(options.minDecimals, 'minDecimals') ?? 0\n const maxDecimals = assertNonNegativeInteger(options.maxDecimals, 'maxDecimals')\n const precision = assertPositiveInteger(options.precision, 'precision')\n const roundingMode = mapRoundingMode(options.roundingMode)\n\n if (maxDecimals !== undefined && maxDecimals < minDecimals) {\n\n throw toRangeError(FormatError.MaxDecimalsLessThanMinimum)\n }\n\n let bigValue = normalizeNumeric(value)\n\n if (precision !== undefined) {\n\n bigValue = bigValue.prec(precision, roundingMode)\n }\n\n if (maxDecimals !== undefined) {\n\n bigValue = bigValue.round(maxDecimals, roundingMode)\n }\n\n const isZero = bigValue.eq(0)\n const isNegative = !isZero && bigValue.s < 0\n const canonical = bigToDecimalString(bigValue.abs())\n let [integerPart,\n fractionPart = DECIMAL_EMPTY] = canonical.split(DECIMAL_DOT)\n\n integerPart = integerPart.replace(/^(0+)(\\d)/, '$2')\n\n if (!integerPart) {\n\n integerPart = DECIMAL_ZERO\n }\n\n if (!options.trimTrailingZeros && fractionPart.length < minDecimals) {\n\n fractionPart = fractionPart.padEnd(minDecimals, DECIMAL_ZERO)\n }\n\n if (maxDecimals !== undefined && fractionPart.length > maxDecimals) {\n\n fractionPart = fractionPart.slice(0, maxDecimals)\n }\n\n if (options.trimTrailingZeros) {\n\n const minKeep = minDecimals\n\n while (fractionPart.length > minKeep && fractionPart.endsWith(DECIMAL_ZERO)) {\n\n fractionPart = fractionPart.slice(0, -1)\n }\n }\n\n return {\n big: bigValue,\n integer: integerPart,\n fraction: fractionPart,\n isNegative,\n isZero\n }\n}\n\nexport const bigToDecimalString = (value: Big): string => {\n\n const coefficient = (value.c ?? [0]) as number[]\n const exponent = value.e ?? 0\n const sign = value.s < 0 ? DEFAULT_SIGN_MINUS : DECIMAL_EMPTY\n\n if (coefficient.every((digit) => digit === 0)) {\n\n return DECIMAL_ZERO\n }\n\n const digits = coefficient.join('')\n const decimalIndex = exponent + 1\n\n if (decimalIndex <= 0) {\n\n const zeros = DECIMAL_ZERO.repeat(Math.abs(decimalIndex))\n\n return `${sign}${DECIMAL_ZERO}${DECIMAL_DOT}${zeros}${digits}`.replace(/\\.$/, DECIMAL_EMPTY)\n }\n\n if (decimalIndex >= digits.length) {\n\n const zeros = DECIMAL_ZERO.repeat(decimalIndex - digits.length)\n\n return `${sign}${digits}${zeros}`\n }\n\n const integerPart = digits.slice(0, decimalIndex)\n const fractionPart = digits.slice(decimalIndex)\n\n return `${sign}${integerPart}${DECIMAL_DOT}${fractionPart}`\n}\n\nexport const applyGrouping = (integer: string,\n grouping: GroupingConfig,\n enableGrouping: boolean): string => {\n\n if (!enableGrouping || grouping.primary === 0 || integer.length <= grouping.primary) {\n\n return integer\n }\n\n const groups = [] as string[]\n const primary = grouping.primary\n const secondary = grouping.secondary ?? primary\n let index = integer.length\n let usePrimary = true\n\n while (index > 0) {\n\n const size = usePrimary ? primary : secondary\n\n if (size <= 0) {\n\n groups.unshift(integer.slice(0, index))\n break\n }\n\n const start = Math.max(index - size, 0)\n\n groups.unshift(integer.slice(start, index))\n index = start\n\n if (index <= 0) {\n\n break\n }\n\n usePrimary = false\n }\n\n return groups.join(grouping.separator)\n}\n","import { Big } from '@eternl/big'\n\nimport {\n COMPACT_ORDER,\n DEFAULT_SIGN_MINUS,\n DEFAULT_SIGN_PLUS,\n DISPLAY_SIGN_MINUS,\n DISPLAY_SIGN_NONE,\n DISPLAY_SIGN_PLUS,\n STYLE_CURRENCY,\n STYLE_DECIMAL,\n STYLE_PERCENT,\n} from './constants'\nimport {\n FormatError,\n toError,\n} from './errors'\nimport {\n FormatPattern,\n getNumberFormatPattern,\n} from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport {\n applyGrouping,\n computeNumericParts,\n normalizeNumeric,\n} from './internal/numeric'\nimport {\n CompactUnit,\n DisplayNumberOptions,\n NumberStyle,\n NumericLike,\n SIGN_DISPLAYS,\n SignDisplay,\n} from './types'\n\ninterface CompactResult {\n value: Big\n suffix?: string\n}\n\ninterface CurrencyResolution {\n value: string\n fromCustom: boolean\n}\n\nconst defaultCompactThresholds: Record<CompactUnit, Big> = {\n\n K: new Big(1_000),\n M: new Big(1_000_000),\n B: new Big(1_000_000_000),\n T: new Big(1_000_000_000_000)\n}\n\nconst defaultCompactSuffixes: Record<CompactUnit, string> = {\n\n K: 'K',\n M: 'M',\n B: 'B',\n T: 'T'\n}\n\nconst compactThresholdCache = new WeakMap<DisplayNumberOptions, Map<string, Big>>()\nconst COMPACT_DECIMAL_BUFFER = 12\n\nconst SUBSCRIPT_DIGITS = [\n\n '₀',\n '₁',\n '₂',\n '₃',\n '₄',\n '₅',\n '₆',\n '₇',\n '₈',\n '₉'\n\n] as const\n\nconst SUBSCRIPT_TO_DIGIT = SUBSCRIPT_DIGITS.reduce<Record<string, string>>((acc, digit, index) => {\n\n acc[digit] = index.toString()\n return acc\n}, {})\n\nconst toSubscriptNumber = (value: number): string => value\n .toString()\n .split('')\n .map((digit) => SUBSCRIPT_DIGITS[digit.charCodeAt(0) - 48])\n .join('')\n\nconst expandSubscriptDigits = (value: string): string => {\n\n let result = ''\n\n for (let index = 0; index < value.length; index += 1) {\n\n const char = value[index]!\n const mapped = SUBSCRIPT_TO_DIGIT[char]\n\n if (mapped === undefined) {\n\n result += char\n continue\n }\n\n let subscriptBuffer = mapped\n\n while (index + 1 < value.length) {\n\n const nextChar = value[index + 1]!\n const nextMapped = SUBSCRIPT_TO_DIGIT[nextChar]\n\n if (nextMapped === undefined) {\n\n break\n }\n\n subscriptBuffer += nextMapped\n index += 1\n }\n\n const zeroCount = Number(subscriptBuffer)\n\n if (Number.isNaN(zeroCount) || zeroCount <= 0) {\n\n continue\n }\n\n result += '0'.repeat(zeroCount)\n }\n\n return result\n}\n\nconst compactFractionLeadingZeros = (fraction: string): string => {\n\n const match = /^(0{2,})(.+)$/.exec(fraction)\n\n if (!match) {\n\n return fraction\n }\n\n const [, zeros, remainder] = match\n\n if (!remainder || /^0+$/.test(remainder)) {\n\n return fraction\n }\n\n const annotation = toSubscriptNumber(zeros.length - 1)\n\n return `${zeros[0]}${annotation}${remainder}`\n}\n\nconst resolveSignKind = (isNegative: boolean,\n isZero: boolean,\n signDisplay?: SignDisplay,\n forceSign?: boolean): typeof DISPLAY_SIGN_MINUS | typeof DISPLAY_SIGN_PLUS | typeof DISPLAY_SIGN_NONE => {\n\n const mode = signDisplay ?? (forceSign ? SIGN_DISPLAYS.always : SIGN_DISPLAYS.auto)\n\n switch (mode) {\n\n case SIGN_DISPLAYS.always: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_PLUS\n case SIGN_DISPLAYS.exceptZero: return isNegative ? DISPLAY_SIGN_MINUS : (isZero ? DISPLAY_SIGN_NONE : DISPLAY_SIGN_PLUS)\n case SIGN_DISPLAYS.never: return DISPLAY_SIGN_NONE\n case SIGN_DISPLAYS.negative: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_NONE\n case SIGN_DISPLAYS.auto:\n default: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_NONE\n }\n}\n\nconst resolveCurrencyToken = (template: string,\n options: DisplayNumberOptions): CurrencyResolution => {\n\n const code = options.currencyCode?.toUpperCase() ?? ''\n\n if (options.useSymbol === false) {\n\n return { value: code, fromCustom: false }\n }\n\n const custom = code ? options.customSymbols?.[code] : undefined\n\n if (custom) {\n\n return { value: custom, fromCustom: true }\n }\n\n if (template && template !== code) {\n\n return { value: template, fromCustom: false }\n }\n\n return { value: code, fromCustom: false }\n}\n\nconst getNormalizedThreshold = (options: DisplayNumberOptions,\n unit: CompactUnit): Big | undefined => {\n\n const overrides = options.compactThresholds\n\n if (!overrides || overrides[unit] === undefined) {\n\n return undefined\n }\n\n let cache = compactThresholdCache.get(options)\n\n if (!cache) {\n\n cache = new Map()\n compactThresholdCache.set(options, cache)\n }\n\n let normalized = cache.get(unit)\n\n if (!normalized) {\n\n normalized = normalizeNumeric(overrides[unit]!, true)\n cache.set(unit, normalized)\n }\n\n return normalized\n}\n\nconst resolveCompact = (value: Big,\n options: DisplayNumberOptions,\n enabled: boolean): CompactResult => {\n\n if (!enabled) {\n\n return { value }\n }\n\n const abs = value.abs()\n\n for (const unit of COMPACT_ORDER) {\n\n const overrideThreshold = getNormalizedThreshold(options, unit)\n const threshold = overrideThreshold ?? getDefaultCompactThreshold(unit)\n\n if (abs.gte(threshold)) {\n\n const suffix = options.compactSuffixes?.[unit] ?? getDefaultCompactSuffix(unit)\n const scaled = threshold.eq(0) ? value : value.div(threshold)\n\n return { value: scaled, suffix }\n }\n }\n\n return { value }\n}\n\nconst getDefaultCompactThreshold = (unit: CompactUnit): Big => {\n\n return defaultCompactThresholds[unit as keyof typeof defaultCompactThresholds]\n}\n\nconst getDefaultCompactSuffix = (unit: CompactUnit): string => {\n\n return defaultCompactSuffixes[unit as keyof typeof defaultCompactSuffixes]\n}\n\nconst buildNumberFormatOptions = (options: DisplayNumberOptions,\n style: NumberStyle): Intl.NumberFormatOptions => {\n\n const nfOptions: Intl.NumberFormatOptions = {\n style,\n useGrouping: options.useGrouping !== false\n }\n\n if (options.signDisplay && options.signDisplay !== SIGN_DISPLAYS.negative) {\n\n nfOptions.signDisplay = options.signDisplay\n\n } else if (!options.signDisplay && options.forceSign) {\n\n nfOptions.signDisplay = SIGN_DISPLAYS.always\n }\n\n if (options.minDecimals !== undefined) {\n\n nfOptions.minimumFractionDigits = options.minDecimals\n }\n\n if (options.maxDecimals !== undefined) {\n\n nfOptions.maximumFractionDigits = options.maxDecimals\n }\n\n if (style === STYLE_CURRENCY && options.currencyCode) {\n\n nfOptions.currency = options.currencyCode\n nfOptions.currencyDisplay = options.useSymbol === false ? 'code' : 'symbol'\n }\n\n return nfOptions\n}\n\nconst formatFromPattern = (options: DisplayNumberOptions,\n style: NumberStyle,\n integerPart: string,\n fractionPart: string,\n sign: typeof DISPLAY_SIGN_MINUS | typeof DISPLAY_SIGN_PLUS | typeof DISPLAY_SIGN_NONE,\n pattern: FormatPattern,\n suffix?: string,\n currencyOverride?: string,\n currencyOverrideIsCustom?: boolean): string => {\n const parts = sign === DISPLAY_SIGN_MINUS ? pattern.negative : pattern.positive\n const useGrouping = options.useGrouping !== false\n const groupedInteger = applyGrouping(integerPart, {\n separator: pattern.groupSeparator,\n primary: pattern.grouping.primary,\n secondary: pattern.grouping.secondary\n }, useGrouping)\n\n const hasFraction = fractionPart.length > 0\n let result = ''\n let integerInjected = false\n let currencyMeta: CurrencyResolution | undefined\n let previousType: Intl.NumberFormatPart['type'] | undefined\n let suffixInjected = false\n\n const appendSuffix = (): void => {\n\n if (!suffix || suffixInjected) {\n\n return\n }\n\n result += suffix\n suffixInjected = true\n }\n\n const stripTrailingWhitespace = (): void => {\n\n if (!result) {\n\n return\n }\n\n const trimmed = result.replace(/\\s+$/gu, '')\n\n if (trimmed !== result) {\n\n result = trimmed\n }\n }\n\n for (const part of parts) {\n\n switch (part.type) {\n\n case 'integer': {\n\n if (!integerInjected) {\n\n result += groupedInteger\n integerInjected = true\n\n if (!hasFraction) {\n\n appendSuffix()\n }\n }\n break\n }\n case 'group':\n break\n case 'decimal': {\n\n if (hasFraction) {\n\n result += pattern.decimalSeparator\n }\n break\n }\n case 'fraction': {\n\n if (hasFraction) {\n\n result += fractionPart\n appendSuffix()\n }\n break\n }\n case 'minusSign': {\n\n if (sign === DISPLAY_SIGN_MINUS) {\n\n result += pattern.minusSign ?? part.value ?? DEFAULT_SIGN_MINUS\n }\n break\n }\n case 'plusSign': {\n\n if (sign === DISPLAY_SIGN_PLUS) {\n\n result += pattern.plusSign ?? part.value ?? DEFAULT_SIGN_PLUS\n }\n break\n }\n case 'currency': {\n\n if (integerInjected) {\n\n appendSuffix()\n }\n if (currencyOverride !== undefined) {\n\n currencyMeta = {\n value: currencyOverride,\n fromCustom: currencyOverrideIsCustom ?? false\n }\n\n } else {\n\n currencyMeta = currencyMeta ?? resolveCurrencyToken(part.value, options)\n }\n result += currencyMeta.value\n break\n }\n case 'percentSign': {\n\n stripTrailingWhitespace()\n result += part.value\n break\n }\n case 'literal': {\n\n if (previousType === 'currency' && currencyMeta?.fromCustom && /^\\s+$/.test(part.value)) {\n\n break\n }\n result += part.value\n break\n }\n default: {\n result += part.value\n break\n }\n }\n\n previousType = part.type\n }\n\n appendSuffix()\n\n return result\n}\n\nconst resolveDisplayStyle = (options: DisplayNumberOptions,\n overrideStyle?: NumberStyle): NumberStyle => {\n\n const style = overrideStyle ?? options.style ?? STYLE_DECIMAL\n\n if (style === STYLE_CURRENCY && !options.currencyCode) {\n\n throw toError(FormatError.MissingCurrencyCode)\n }\n\n return style\n}\n\nconst formatDisplayInternal = (value: NumericLike,\n options: DisplayNumberOptions,\n styleOverride?: NumberStyle,\n forceCompact?: boolean): string => {\n\n const style = resolveDisplayStyle(options, styleOverride)\n const base = normalizeNumeric(value)\n const percentAdjusted = style === STYLE_PERCENT ? base.times(100) : base\n const {\n value: scaled,\n suffix\n } = resolveCompact(percentAdjusted, options, forceCompact ?? options.compact === true)\n const numericParts = computeNumericParts(scaled, options)\n const sign = resolveSignKind(numericParts.isNegative, numericParts.isZero, options.signDisplay, options.forceSign)\n let integerPart = numericParts.integer\n let fractionPart = numericParts.fraction\n const locale = resolveLocale(options.locale)\n let pattern: FormatPattern\n let currencyOverride: string | undefined\n let currencyOverrideIsCustom = false\n\n if (options.compactDecimalZeros && !options.isHidden) {\n\n const baseMatch = /^(0{2,})(.+)$/.exec(fractionPart)\n const baseRemainder = baseMatch?.[2]\n const hasBaseDigits = baseMatch && baseRemainder && !/^0+$/.test(baseRemainder)\n\n if (hasBaseDigits) {\n\n fractionPart = compactFractionLeadingZeros(fractionPart)\n\n } else {\n\n const extendedMax = options.maxDecimals !== undefined ? options.maxDecimals + COMPACT_DECIMAL_BUFFER : undefined\n\n const extendedOptions: DisplayNumberOptions = {\n ...options,\n maxDecimals: extendedMax,\n trimTrailingZeros: false\n }\n\n const extendedParts = computeNumericParts(scaled, extendedOptions)\n const extendedFraction = extendedParts.fraction\n const match = /^(0{2,})(.+)$/.exec(extendedFraction)\n\n if (match) {\n\n const zerosPortion = match[1]\n let remainder = match[2]\n\n if (!/^0+$/.test(remainder)) {\n\n const targetMax = options.maxDecimals\n const targetMin = options.minDecimals ?? 0\n\n if (targetMax === 0) {\n\n fractionPart = ''\n\n } else {\n\n let digits = zerosPortion\n const remainderNeeded = targetMax !== undefined ? Math.max(targetMax - 1, 0) : remainder.length\n\n if (remainderNeeded > 0) {\n\n if (remainder.length < remainderNeeded) {\n\n remainder = remainder.padEnd(remainderNeeded, '0')\n }\n\n digits += remainder.slice(0, remainderNeeded)\n }\n\n if (targetMax === undefined && digits.length < targetMin) {\n\n const extraNeeded = targetMin - digits.length\n let extraSource = remainder.slice(remainderNeeded)\n\n if (extraSource.length < extraNeeded) {\n\n extraSource = extraSource.padEnd(extraNeeded, '0')\n }\n\n digits += extraSource.slice(0, extraNeeded)\n }\n\n if (targetMax !== undefined && digits.length < targetMin) {\n\n digits = digits.padEnd(targetMin, '0')\n }\n\n if (options.trimTrailingZeros) {\n\n const minKeep = Math.max(targetMin, zerosPortion ? 1 : 0)\n\n while (digits.length > Math.max(minKeep, zerosPortion.length) && digits.endsWith('0')) {\n\n digits = digits.slice(0, -1)\n }\n }\n\n fractionPart = compactFractionLeadingZeros(digits)\n integerPart = extendedParts.integer\n }\n }\n }\n }\n }\n\n if (options.isHidden) {\n\n const maskChar = options.hiddenCharacter && options.hiddenCharacter.length > 0\n ? options.hiddenCharacter[0]\n : '*'\n integerPart = maskChar\n fractionPart = fractionPart.length > 0 ? maskChar.repeat(fractionPart.length) : fractionPart\n }\n try {\n\n const nfOptions = buildNumberFormatOptions(options, style)\n pattern = getNumberFormatPattern(locale, nfOptions)\n\n } catch (error) {\n\n if (!(error instanceof RangeError) || style !== STYLE_CURRENCY || !options.currencyCode) {\n\n throw error\n }\n\n const placeholderOptions: DisplayNumberOptions = {\n ...options,\n currencyCode: 'USD'\n }\n const nfOptionsFallback = buildNumberFormatOptions(placeholderOptions, STYLE_CURRENCY)\n pattern = getNumberFormatPattern(locale, nfOptionsFallback)\n\n const rawCode = options.currencyCode\n const code = rawCode.toUpperCase()\n\n if (options.useSymbol === false) {\n\n currencyOverride = rawCode\n\n } else {\n\n const customSymbol = options.customSymbols?.[code] ?? options.customSymbols?.[rawCode]\n\n if (customSymbol) {\n\n currencyOverride = customSymbol\n currencyOverrideIsCustom = true\n\n } else {\n\n currencyOverride = rawCode\n }\n }\n }\n\n return formatFromPattern(options, style, integerPart, fractionPart, sign, pattern, suffix, currencyOverride, currencyOverrideIsCustom)\n}\n\nexport const formatDisplayNumber = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options)\nexport const formatDisplayCurrency = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, STYLE_CURRENCY)\nexport const formatDisplayPercent = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, STYLE_PERCENT)\nexport const formatDisplayCompact = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, undefined, true)\n\nconst stripGroupSeparators = (value: string,\n separator: string): string => {\n\n if (!separator) { return value }\n\n return value.split(separator).join('')\n}\n\nconst normalizeNumericCore = (core: string,\n pattern: FormatPattern): string => {\n\n let normalized = expandSubscriptDigits(core)\n\n if (pattern.groupSeparator) {\n\n normalized = stripGroupSeparators(normalized, pattern.groupSeparator)\n }\n\n normalized = normalized.replace(/\\s+/gu, '')\n\n if (pattern.decimalSeparator && pattern.decimalSeparator !== '.') {\n\n normalized = normalized.replace(pattern.decimalSeparator, '.')\n }\n\n if (pattern.minusSign && pattern.minusSign !== DEFAULT_SIGN_MINUS) {\n\n normalized = normalized.split(pattern.minusSign).join(DEFAULT_SIGN_MINUS)\n }\n\n if (pattern.plusSign && pattern.plusSign !== DEFAULT_SIGN_PLUS) {\n\n normalized = normalized.split(pattern.plusSign).join(DEFAULT_SIGN_PLUS)\n }\n\n return normalized\n}\n\nconst parseDisplayInternal = (formatted: string,\n options?: DisplayNumberOptions): number => {\n\n const numericCore = extractNumberCore(formatted)\n\n if (!numericCore) { return Number.NaN }\n\n const locale = options?.locale\n\n if (locale) {\n\n const resolvedLocale = resolveLocale(locale)\n const nfOptions = buildNumberFormatOptions(options ?? {}, STYLE_DECIMAL)\n const pattern = getNumberFormatPattern(resolvedLocale, nfOptions)\n const normalizedCore = normalizeNumericCore(numericCore, pattern)\n\n if (!normalizedCore || normalizedCore === DEFAULT_SIGN_MINUS || normalizedCore === DEFAULT_SIGN_PLUS) {\n\n return Number.NaN\n }\n\n try {\n\n return Big(normalizedCore).toNumber()\n\n } catch (error) {\n\n // fall back to locale-agnostic heuristics below when locale pattern parsing fails\n }\n }\n\n let normalized = expandSubscriptDigits(numericCore)\n normalized = normalized.replace(/['’`_\\s\\u00A0]/gu, '')\n\n const lastDot = normalized.lastIndexOf('.')\n const lastComma = normalized.lastIndexOf(',')\n\n if (lastDot !== -1 || lastComma !== -1) {\n\n let decimalIndex = Math.max(lastDot, lastComma)\n let decimalChar = decimalIndex === lastDot ? '.' : ','\n\n if (lastDot !== -1 && lastComma !== -1) {\n\n decimalChar = decimalIndex === lastDot ? '.' : ','\n const thousandsChar = decimalChar === '.' ? ',' : '.'\n normalized = normalized.split(thousandsChar).join('')\n\n } else if (lastComma !== -1) {\n\n const fractionalPart = normalized.slice(lastComma + 1)\n\n if (fractionalPart.length === 3 && normalized.slice(0, lastComma).replace(/[^0-9]/g, '').length > 3) {\n\n normalized = normalized.replace(/,/g, '')\n decimalChar = '.'\n\n } else {\n\n decimalChar = ','\n }\n\n } else if (lastDot !== -1) {\n\n const fractionalPart = normalized.slice(lastDot + 1)\n\n if (fractionalPart.length === 3 && normalized.slice(0, lastDot).replace(/[^0-9]/g, '').length > 3) {\n\n decimalChar = ','\n normalized = normalized.replace(/\\./g, '')\n\n } else {\n\n decimalChar = '.'\n }\n }\n\n if (decimalChar !== '.') {\n\n normalized = normalized.split(decimalChar).join('.')\n }\n }\n\n normalized = normalized.replace(/,/g, '')\n\n if (!normalized || normalized === DEFAULT_SIGN_MINUS || normalized === DEFAULT_SIGN_PLUS) {\n\n return Number.NaN\n }\n\n try {\n\n return Big(normalized).toNumber()\n\n } catch (error) {\n\n return Number.NaN\n }\n}\nexport const parseDisplayValue = (formatted: string, options?: DisplayNumberOptions): number => parseDisplayInternal(formatted, options)\n\nconst NUMERIC_OR_SUBSCRIPT = /[0-9₀-₉]/\nconst MINUS_SIGNS = new Set(['-', '−', '﹣', '-'])\nconst isWhitespace = (char: string): boolean => /\\s/.test(char)\n\nexport const extractNumberCore = (formatted: string): string => {\n\n let startIndex = -1\n let endIndex = -1\n\n for (let i = 0; i < formatted.length; i += 1) {\n\n if (NUMERIC_OR_SUBSCRIPT.test(formatted[i]!)) {\n\n startIndex = i\n break\n }\n }\n\n if (startIndex === -1) {\n\n return ''\n }\n\n for (let i = formatted.length - 1; i >= startIndex; i -= 1) {\n\n if (NUMERIC_OR_SUBSCRIPT.test(formatted[i]!)) {\n\n endIndex = i\n break\n }\n }\n\n if (endIndex === -1) {\n\n return ''\n }\n\n let signPrefix = ''\n\n for (let idx = startIndex - 1; idx >= 0; idx -= 1) {\n\n const candidate = formatted[idx]!\n\n if (isWhitespace(candidate)) {\n\n continue\n }\n\n if (MINUS_SIGNS.has(candidate)) {\n\n signPrefix = candidate\n break\n }\n\n if (NUMERIC_OR_SUBSCRIPT.test(candidate)) {\n\n break\n }\n }\n\n if (!signPrefix) {\n\n for (let idx = endIndex + 1; idx < formatted.length; idx += 1) {\n\n const candidate = formatted[idx]!\n\n if (isWhitespace(candidate)) {\n\n continue\n }\n\n if (MINUS_SIGNS.has(candidate)) {\n\n signPrefix = candidate\n break\n }\n\n if (NUMERIC_OR_SUBSCRIPT.test(candidate)) {\n\n break\n }\n }\n }\n\n return `${signPrefix}${formatted.slice(startIndex, endIndex + 1)}`\n}\n","import {\n FormatError,\n toRangeError,\n toTypeError,\n} from './errors'\nimport { getDateFormat } from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport { CsvDateOptions } from './types'\n\nconst toDate = (value: Date | number | string): Date => {\n\n if (value instanceof Date) {\n\n const timestamp = value.getTime()\n\n if (Number.isNaN(timestamp)) {\n\n throw toRangeError(FormatError.DateValueInvalid)\n }\n\n return new Date(timestamp)\n }\n\n if (typeof value === 'number') {\n\n if (!Number.isFinite(value)) {\n\n throw toRangeError(FormatError.DateNumberNonFinite)\n }\n\n const date = new Date(value)\n\n if (Number.isNaN(date.getTime())) {\n\n throw toRangeError(FormatError.DateValueInvalid)\n }\n\n return date\n }\n\n if (typeof value === 'string') {\n\n const trimmed = value.trim()\n\n if (!trimmed) {\n\n throw toRangeError(FormatError.DateStringEmpty)\n }\n\n const date = new Date(trimmed)\n\n if (Number.isNaN(date.getTime())) {\n\n throw toRangeError(FormatError.InvalidDateString)\n }\n\n return date\n }\n\n throw toTypeError(FormatError.UnsupportedDateInput)\n}\n\nexport const formatDisplayDate = (date: Date | number | string,\n locale?: string,\n options?: Intl.DateTimeFormatOptions): string => {\n\n const resolvedLocale = resolveLocale(locale)\n const parsed = toDate(date)\n const formatter = getDateFormat(resolvedLocale, options)\n\n return formatter.format(parsed)\n}\n\nexport const formatCsvDate = (date: Date | number | string,\n options?: CsvDateOptions): string => {\n\n const parsed = toDate(date)\n const format = options?.format ?? 'iso'\n\n if (format === 'utc-datetime') {\n\n const year = parsed.getUTCFullYear()\n const month = String(parsed.getUTCMonth() + 1).padStart(2, '0')\n const day = String(parsed.getUTCDate() ).padStart(2, '0')\n const hours = String(parsed.getUTCHours() ).padStart(2, '0')\n const minutes = String(parsed.getUTCMinutes() ).padStart(2, '0')\n const seconds = String(parsed.getUTCSeconds() ).padStart(2, '0')\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`\n }\n\n const iso = parsed.toISOString()\n const datePart = iso.slice(0, 10)\n const hasTime = parsed.getUTCHours() !== 0\n || parsed.getUTCMinutes() !== 0\n || parsed.getUTCSeconds() !== 0\n || parsed.getUTCMilliseconds() !== 0\n\n if (!hasTime) { return datePart }\n\n const timePart = iso.slice(11)\n const withoutMillis = timePart.replace(/\\.\\d+Z$/, 'Z')\n\n return `${datePart}T${withoutMillis}`\n}\n","import {\n DECIMAL_DOT,\n DECIMAL_EMPTY,\n DECIMAL_ZERO,\n DEFAULT_SIGN_MINUS,\n STYLE_DECIMAL,\n} from './constants'\nimport { formatCsvDate } from './date'\nimport {\n getNumberFormatPattern,\n} from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport {\n computeNumericParts,\n normalizeNumeric,\n} from './internal/numeric'\nimport {\n CsvColumnSpec,\n CsvNumberOptions,\n NumericLike,\n} from './types'\n\nconst resolveDecimalDelimiter = (options: CsvNumberOptions): string => {\n\n if (options.decimalDelimiter !== undefined) {\n\n return options.decimalDelimiter\n }\n\n if (options.locale) {\n\n const locale = resolveLocale(options.locale)\n const pattern = getNumberFormatPattern(locale, { style: STYLE_DECIMAL })\n\n return pattern.decimalSeparator\n }\n\n return DECIMAL_DOT\n}\n\nconst stringifyNumericParts = (parts: ReturnType<typeof computeNumericParts>,\n decimalDelimiter: string = DECIMAL_DOT): string => {\n\n const fraction = parts.fraction.length > 0 ? `${decimalDelimiter}${parts.fraction}` : DECIMAL_EMPTY\n const integer = parts.integer || DECIMAL_ZERO\n const prefix = parts.isNegative ? DEFAULT_SIGN_MINUS : DECIMAL_EMPTY\n const value = `${prefix}${integer}${fraction}`\n\n return value\n}\n\nexport const formatCsvNumber = (value: NumericLike,\n options: CsvNumberOptions = {}): string => {\n\n const parts = computeNumericParts(value, options)\n const delimiter = resolveDecimalDelimiter(options)\n\n return stringifyNumericParts(parts, delimiter)\n}\n\nexport const formatCsvPercent = (value: NumericLike,\n options: CsvNumberOptions = {}): string => {\n\n const scaled = normalizeNumeric(value).times(100)\n const parts = computeNumericParts(scaled, options)\n const delimiter = resolveDecimalDelimiter(options)\n\n return stringifyNumericParts(parts, delimiter)\n}\n\nexport const csvCurrencyCode = (code: string,\n customSymbols?: Record<string, string>,\n useSymbol?: boolean): string => {\n\n const trimmed = code.trim()\n\n if (!trimmed) { return DECIMAL_EMPTY }\n\n const normalized = trimmed.toUpperCase()\n\n if (useSymbol) {\n\n const symbol = customSymbols?.[normalized]\n\n if (symbol) { return symbol }\n }\n\n return normalized\n}\n\nconst escapeCsvField = (value: string,\n delimiter: string): string => {\n\n const needsQuoting = value.includes(delimiter)\n || value.includes('\\n')\n || value.includes('\\r')\n || value.includes('\"')\n\n if (!needsQuoting) { return value }\n\n const escaped = value.replace(/\"/g, '\"\"')\n\n return `\"${escaped}\"`\n}\n\nconst defaultFormatter = (value: unknown): string => {\n\n if (value === null || value === undefined) {\n\n return DECIMAL_EMPTY\n }\n\n if (value instanceof Date) {\n\n return formatCsvDate(value)\n }\n\n if (typeof value === 'number') {\n\n return formatCsvNumber(value)\n }\n\n if (typeof value === 'string') {\n\n return value\n }\n\n if (typeof value === 'boolean') {\n\n return value ? 'true' : 'false'\n }\n\n return String(value)\n}\n\nexport const buildCsv = <T>(rows: T[],\n columns: CsvColumnSpec<T>[],\n delimiter: string = ',',\n lineEnding: string = '\\n'): string => {\n\n const headerLine = columns.map((col) => escapeCsvField(col.header, delimiter)).join(delimiter)\n const lines = [headerLine]\n\n for (const row of rows) {\n\n const fields = columns.map((col) => {\n\n const raw = col.accessor(row)\n const formatted = col.formatter ? col.formatter(raw) : defaultFormatter(raw)\n const stringValue = formatted ?? DECIMAL_EMPTY\n\n return escapeCsvField(stringValue, delimiter)\n })\n\n lines.push(fields.join(delimiter))\n }\n\n return `${lines.join(lineEnding)}${lineEnding}`\n}\n","const checkTime = (i: number): string => (\n i == 0 ? '00' : (\n ((i < 10) ? '0' : '') + i)\n)\n\nexport const formatRemainingTime = (seconds: number): string => {\n\n const days = Math.floor( seconds / (24 * 60 * 60) ); seconds -= days * (24 * 60 * 60)\n const hours = Math.floor( seconds / ( 60 * 60) ); seconds -= hours * ( 60 * 60)\n const mins = Math.floor( seconds / ( 60) ); seconds -= mins * ( 60)\n const secs = Math.floor( seconds )\n\n let str = ''\n\n if (days > 0) { str = days + 'd ' }\n if (hours >= 0) { str = str + checkTime(hours) + 'h ' }\n if (mins >= 0) { str = str + checkTime(mins) + 'm ' }\n if (secs >= 0) { str = str + checkTime(secs) + 's ' }\n\n return str\n}\n","import { Big } from '@eternl/big'\n\nimport {\n BIG_ZERO,\n DECIMALS_CARDANO,\n} from './constants'\nimport { NumericLike } from './types'\n\nexport const bigQuantityFromAmount = ( amount?: NumericLike, decimals?: number): Big => {\n\n if (!amount || amount === '0' || amount === 0) { return BIG_ZERO }\n if (!decimals || decimals <= 0) { return Big(amount) } // Don't round to 0 decimals\n\n return Big(amount)._mul(Math.pow(10, decimals)).round(0)\n}\nexport const bigAmountFromQuantity = (quantity?: NumericLike, decimals?: number): Big => {\n\n if (!quantity || quantity === '0' || quantity === 0) { return BIG_ZERO }\n if (!decimals || decimals <= 0) { return Big(quantity) } // Don't round to 0 decimals\n\n return Big(quantity)._div(Math.pow(10, decimals)).round(decimals)\n}\nexport const bigLovelaceFromAda = ( ada?: NumericLike, decimals: number = DECIMALS_CARDANO): Big => bigQuantityFromAmount( ada, decimals)\nexport const bigAdaFromLovelace = (lovelace?: NumericLike, decimals: number = DECIMALS_CARDANO): Big => bigAmountFromQuantity(lovelace, decimals)\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,4 @@
1
- import * as big_js0 from "big.js";
2
- import { Big, BigSource } from "big.js";
1
+ import { Big, BigSource } from "@eternl/big";
3
2
 
4
3
  //#region src/types.d.ts
5
4
  type NumericLike = BigSource;
@@ -75,6 +74,9 @@ declare const buildCsv: <T>(rows: T[], columns: CsvColumnSpec<T>[], delimiter?:
75
74
  declare const formatDisplayDate: (date: Date | number | string, locale?: string, options?: Intl.DateTimeFormatOptions) => string;
76
75
  declare const formatCsvDate: (date: Date | number | string, options?: CsvDateOptions) => string;
77
76
  //#endregion
77
+ //#region src/time.d.ts
78
+ declare const formatRemainingTime: (seconds: number) => string;
79
+ //#endregion
78
80
  //#region src/errors.d.ts
79
81
  declare enum FormatError {
80
82
  NonNegativeIntegerRequired = "nonNegativeIntegerRequired",
@@ -114,8 +116,8 @@ declare const DEFAULT_SIGN_PLUS = "+";
114
116
  declare const DECIMAL_ZERO = "0";
115
117
  declare const DECIMAL_EMPTY = "";
116
118
  declare const DECIMAL_DOT = ".";
117
- declare const BIG_ZERO: big_js0.Big;
119
+ declare const BIG_ZERO: Big.Big;
118
120
  declare const DECIMALS_CARDANO = 6;
119
121
  //#endregion
120
- export { BIG_ZERO, type CommonNumberOptions, type CompactUnit, type CsvColumnSpec, type CsvDateOptions, type CsvNumberOptions, type CsvRow, DECIMALS_CARDANO, DECIMAL_DOT, DECIMAL_EMPTY, DECIMAL_ZERO, DEFAULT_SIGN_MINUS, DEFAULT_SIGN_PLUS, DISPLAY_SIGNS, type DisplayNumberOptions, FormatError, type NumberStyle, type NumericLike, type RoundingMode, type SignDisplay, bigAdaFromLovelace, bigAmountFromQuantity, bigLovelaceFromAda, bigQuantityFromAmount, buildCsv, csvCurrencyCode, extractNumberCore, formatCsvDate, formatCsvNumber, formatCsvPercent, formatDisplayCompact, formatDisplayCurrency, formatDisplayDate, formatDisplayNumber, formatDisplayPercent, getFormatErrorMessage, parseDisplayValue, toError, toRangeError, toTypeError };
122
+ export { BIG_ZERO, type CommonNumberOptions, type CompactUnit, type CsvColumnSpec, type CsvDateOptions, type CsvNumberOptions, type CsvRow, DECIMALS_CARDANO, DECIMAL_DOT, DECIMAL_EMPTY, DECIMAL_ZERO, DEFAULT_SIGN_MINUS, DEFAULT_SIGN_PLUS, DISPLAY_SIGNS, type DisplayNumberOptions, FormatError, type NumberStyle, type NumericLike, type RoundingMode, type SignDisplay, bigAdaFromLovelace, bigAmountFromQuantity, bigLovelaceFromAda, bigQuantityFromAmount, buildCsv, csvCurrencyCode, extractNumberCore, formatCsvDate, formatCsvNumber, formatCsvPercent, formatDisplayCompact, formatDisplayCurrency, formatDisplayDate, formatDisplayNumber, formatDisplayPercent, formatRemainingTime, getFormatErrorMessage, parseDisplayValue, toError, toRangeError, toTypeError };
121
123
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/display.ts","../src/csv.ts","../src/date.ts","../src/errors.ts","../src/big.ts","../src/constants.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/display.ts","../src/csv.ts","../src/date.ts","../src/time.ts","../src/errors.ts","../src/big.ts","../src/constants.ts"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,4 @@
1
- import * as big_js0 from "big.js";
2
- import { Big, BigSource } from "big.js";
1
+ import { Big, BigSource } from "@eternl/big";
3
2
 
4
3
  //#region src/types.d.ts
5
4
  type NumericLike = BigSource;
@@ -75,6 +74,9 @@ declare const buildCsv: <T>(rows: T[], columns: CsvColumnSpec<T>[], delimiter?:
75
74
  declare const formatDisplayDate: (date: Date | number | string, locale?: string, options?: Intl.DateTimeFormatOptions) => string;
76
75
  declare const formatCsvDate: (date: Date | number | string, options?: CsvDateOptions) => string;
77
76
  //#endregion
77
+ //#region src/time.d.ts
78
+ declare const formatRemainingTime: (seconds: number) => string;
79
+ //#endregion
78
80
  //#region src/errors.d.ts
79
81
  declare enum FormatError {
80
82
  NonNegativeIntegerRequired = "nonNegativeIntegerRequired",
@@ -114,8 +116,8 @@ declare const DEFAULT_SIGN_PLUS = "+";
114
116
  declare const DECIMAL_ZERO = "0";
115
117
  declare const DECIMAL_EMPTY = "";
116
118
  declare const DECIMAL_DOT = ".";
117
- declare const BIG_ZERO: big_js0.Big;
119
+ declare const BIG_ZERO: Big.Big;
118
120
  declare const DECIMALS_CARDANO = 6;
119
121
  //#endregion
120
- export { BIG_ZERO, type CommonNumberOptions, type CompactUnit, type CsvColumnSpec, type CsvDateOptions, type CsvNumberOptions, type CsvRow, DECIMALS_CARDANO, DECIMAL_DOT, DECIMAL_EMPTY, DECIMAL_ZERO, DEFAULT_SIGN_MINUS, DEFAULT_SIGN_PLUS, DISPLAY_SIGNS, type DisplayNumberOptions, FormatError, type NumberStyle, type NumericLike, type RoundingMode, type SignDisplay, bigAdaFromLovelace, bigAmountFromQuantity, bigLovelaceFromAda, bigQuantityFromAmount, buildCsv, csvCurrencyCode, extractNumberCore, formatCsvDate, formatCsvNumber, formatCsvPercent, formatDisplayCompact, formatDisplayCurrency, formatDisplayDate, formatDisplayNumber, formatDisplayPercent, getFormatErrorMessage, parseDisplayValue, toError, toRangeError, toTypeError };
122
+ export { BIG_ZERO, type CommonNumberOptions, type CompactUnit, type CsvColumnSpec, type CsvDateOptions, type CsvNumberOptions, type CsvRow, DECIMALS_CARDANO, DECIMAL_DOT, DECIMAL_EMPTY, DECIMAL_ZERO, DEFAULT_SIGN_MINUS, DEFAULT_SIGN_PLUS, DISPLAY_SIGNS, type DisplayNumberOptions, FormatError, type NumberStyle, type NumericLike, type RoundingMode, type SignDisplay, bigAdaFromLovelace, bigAmountFromQuantity, bigLovelaceFromAda, bigQuantityFromAmount, buildCsv, csvCurrencyCode, extractNumberCore, formatCsvDate, formatCsvNumber, formatCsvPercent, formatDisplayCompact, formatDisplayCurrency, formatDisplayDate, formatDisplayNumber, formatDisplayPercent, formatRemainingTime, getFormatErrorMessage, parseDisplayValue, toError, toRangeError, toTypeError };
121
123
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/display.ts","../src/csv.ts","../src/date.ts","../src/errors.ts","../src/big.ts","../src/constants.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/display.ts","../src/csv.ts","../src/date.ts","../src/time.ts","../src/errors.ts","../src/big.ts","../src/constants.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { Big } from "big.js";
1
+ import { Big } from "@eternl/big";
2
2
 
3
3
  //#region src/types.ts
4
4
  const NUMBER_STYLES = {
@@ -755,21 +755,40 @@ const buildCsv = (rows, columns, delimiter = ",", lineEnding = "\n") => {
755
755
  return `${lines.join(lineEnding)}${lineEnding}`;
756
756
  };
757
757
 
758
+ //#endregion
759
+ //#region src/time.ts
760
+ const checkTime = (i) => i == 0 ? "00" : (i < 10 ? "0" : "") + i;
761
+ const formatRemainingTime = (seconds) => {
762
+ const days = Math.floor(seconds / (1440 * 60));
763
+ seconds -= days * (1440 * 60);
764
+ const hours = Math.floor(seconds / 3600);
765
+ seconds -= hours * 3600;
766
+ const mins = Math.floor(seconds / 60);
767
+ seconds -= mins * 60;
768
+ const secs = Math.floor(seconds);
769
+ let str = "";
770
+ if (days > 0) str = days + "d ";
771
+ if (hours >= 0) str = str + checkTime(hours) + "h ";
772
+ if (mins >= 0) str = str + checkTime(mins) + "m ";
773
+ if (secs >= 0) str = str + checkTime(secs) + "s ";
774
+ return str;
775
+ };
776
+
758
777
  //#endregion
759
778
  //#region src/big.ts
760
779
  const bigQuantityFromAmount = (amount, decimals) => {
761
780
  if (!amount || amount === "0" || amount === 0) return BIG_ZERO;
762
781
  if (!decimals || decimals <= 0) return Big(amount);
763
- return Big(amount).mul(Math.pow(10, decimals)).round(0);
782
+ return Big(amount)._mul(Math.pow(10, decimals)).round(0);
764
783
  };
765
784
  const bigAmountFromQuantity = (quantity, decimals) => {
766
785
  if (!quantity || quantity === "0" || quantity === 0) return BIG_ZERO;
767
786
  if (!decimals || decimals <= 0) return Big(quantity);
768
- return Big(quantity).div(Math.pow(10, decimals)).round(decimals);
787
+ return Big(quantity)._div(Math.pow(10, decimals)).round(decimals);
769
788
  };
770
789
  const bigLovelaceFromAda = (ada, decimals = DECIMALS_CARDANO) => bigQuantityFromAmount(ada, decimals);
771
790
  const bigAdaFromLovelace = (lovelace, decimals = DECIMALS_CARDANO) => bigAmountFromQuantity(lovelace, decimals);
772
791
 
773
792
  //#endregion
774
- export { BIG_ZERO, DECIMALS_CARDANO, DECIMAL_DOT, DECIMAL_EMPTY, DECIMAL_ZERO, DEFAULT_SIGN_MINUS, DEFAULT_SIGN_PLUS, DISPLAY_SIGNS, FormatError, bigAdaFromLovelace, bigAmountFromQuantity, bigLovelaceFromAda, bigQuantityFromAmount, buildCsv, csvCurrencyCode, extractNumberCore, formatCsvDate, formatCsvNumber, formatCsvPercent, formatDisplayCompact, formatDisplayCurrency, formatDisplayDate, formatDisplayNumber, formatDisplayPercent, getFormatErrorMessage, parseDisplayValue, toError, toRangeError, toTypeError };
793
+ export { BIG_ZERO, DECIMALS_CARDANO, DECIMAL_DOT, DECIMAL_EMPTY, DECIMAL_ZERO, DEFAULT_SIGN_MINUS, DEFAULT_SIGN_PLUS, DISPLAY_SIGNS, FormatError, bigAdaFromLovelace, bigAmountFromQuantity, bigLovelaceFromAda, bigQuantityFromAmount, buildCsv, csvCurrencyCode, extractNumberCore, formatCsvDate, formatCsvNumber, formatCsvPercent, formatDisplayCompact, formatDisplayCurrency, formatDisplayDate, formatDisplayNumber, formatDisplayPercent, formatRemainingTime, getFormatErrorMessage, parseDisplayValue, toError, toRangeError, toTypeError };
775
794
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/types.ts","../src/constants.ts","../src/errors.ts","../src/internal/intl-cache.ts","../src/internal/locale.ts","../src/internal/numeric.ts","../src/display.ts","../src/date.ts","../src/csv.ts","../src/big.ts"],"sourcesContent":["import { BigSource } from 'big.js'\n\nexport type NumericLike = BigSource\nexport type RoundingMode = 'roundDown' | 'roundHalfUp' | 'roundHalfEven' | 'roundUp'\n\nexport const NUMBER_STYLES = {\n\n decimal: 'decimal',\n currency: 'currency',\n percent: 'percent'\n\n} as const\n\nexport type NumberStyle = typeof NUMBER_STYLES[keyof typeof NUMBER_STYLES]\n\nexport const SIGN_DISPLAYS = {\n\n auto: 'auto',\n always: 'always',\n exceptZero: 'exceptZero',\n never: 'never',\n negative: 'negative'\n\n} as const\n\nexport type SignDisplay = typeof SIGN_DISPLAYS[keyof typeof SIGN_DISPLAYS]\n\nexport const COMPACT_UNITS = ['K', 'M', 'B', 'T'] as const\n\nexport type CompactUnit = typeof COMPACT_UNITS[number]\n\nexport interface CommonNumberOptions {\n\n minDecimals?: number\n maxDecimals?: number\n precision?: number\n roundingMode?: RoundingMode\n trimTrailingZeros?: boolean\n}\n\nexport interface DisplayNumberOptions extends CommonNumberOptions {\n\n locale?: string\n style?: NumberStyle\n currencyCode?: string\n useSymbol?: boolean\n customSymbols?: Record<string, string>\n compact?: boolean\n compactThresholds?: Partial<Record<CompactUnit, BigSource>>\n compactSuffixes?: Partial<Record<CompactUnit, string>>\n signDisplay?: SignDisplay\n useGrouping?: boolean\n isHidden?: boolean\n hiddenCharacter?: string\n compactDecimalZeros?: boolean\n forceSign?: boolean\n}\n\nexport interface CsvNumberOptions extends CommonNumberOptions {\n\n locale?: string\n decimalDelimiter?: string\n}\n\nexport interface CsvDateOptions {\n\n format?: 'iso' | 'utc-datetime'\n}\n\nexport type CsvRow = Record<string, unknown> | unknown[]\n\nexport interface CsvColumnSpec<T = any> {\n\n header: string\n accessor: (row: T) => unknown\n formatter?: (value: unknown) => string\n}\n\nexport interface FormatDisplayParams {\n\n locale?: string\n options: Intl.NumberFormatOptions\n}\n","import { Big } from 'big.js'\n\nimport {\n COMPACT_UNITS,\n CompactUnit,\n NUMBER_STYLES,\n NumberStyle,\n} from './types'\n\nexport const STYLE_DECIMAL: NumberStyle = NUMBER_STYLES.decimal\nexport const STYLE_CURRENCY: NumberStyle = NUMBER_STYLES.currency\nexport const STYLE_PERCENT: NumberStyle = NUMBER_STYLES.percent\n\nexport const DEFAULT_LOCALE = 'en-US'\n\nexport const DISPLAY_SIGNS = {\n\n minus: 'minus',\n plus: 'plus',\n none: 'none'\n\n} as const\n\nexport type DisplaySignValue = typeof DISPLAY_SIGNS[keyof typeof DISPLAY_SIGNS]\n\nexport const DISPLAY_SIGN_MINUS = DISPLAY_SIGNS.minus\nexport const DISPLAY_SIGN_PLUS = DISPLAY_SIGNS.plus\nexport const DISPLAY_SIGN_NONE = DISPLAY_SIGNS.none\n\nexport const COMPACT_ORDER: CompactUnit[] = [...COMPACT_UNITS].reverse() as CompactUnit[]\n\nexport const DEFAULT_SIGN_MINUS = '-'\nexport const DEFAULT_SIGN_PLUS = '+'\n\nexport const DECIMAL_ZERO = '0'\nexport const DECIMAL_EMPTY = ''\nexport const DECIMAL_DOT = '.'\n\nexport const BIG_ZERO = Big(0)\n\n// This is a shortcut to avoid @eternl/network-id dependency in this package.\nexport const DECIMALS_CARDANO = 6\n","export enum FormatError {\n\n NonNegativeIntegerRequired = 'nonNegativeIntegerRequired',\n PositiveIntegerRequired = 'positiveIntegerRequired',\n NumericValueNonFinite = 'numericValueNonFinite',\n NumericStringEmpty = 'numericStringEmpty',\n UnsupportedNumericInput = 'unsupportedNumericInput',\n MaxDecimalsLessThanMinimum = 'maxDecimalsLessThanMinimum',\n MissingLocale = 'missingLocale',\n MissingCurrencyCode = 'missingCurrencyCode',\n DateValueInvalid = 'dateValueInvalid',\n DateStringEmpty = 'dateStringEmpty',\n DateNumberNonFinite = 'dateNumberNonFinite',\n InvalidDateString = 'invalidDateString',\n UnsupportedDateInput = 'unsupportedDateInput'\n}\n\ntype ErrorDetails = Record<string, string>\n\ntype ErrorMessageMap = Record<FormatError, string>\n\nconst FORMAT_ERROR_MESSAGES = {\n\n [FormatError.NonNegativeIntegerRequired]: '%label% must be a non-negative integer',\n [FormatError.PositiveIntegerRequired]: '%label% must be a positive integer',\n [FormatError.NumericValueNonFinite]: 'Numeric value must be a finite number',\n [FormatError.NumericStringEmpty]: 'Numeric string cannot be empty',\n [FormatError.UnsupportedNumericInput]: 'Unsupported numeric input type',\n [FormatError.MaxDecimalsLessThanMinimum]: 'maxDecimals cannot be less than minDecimals',\n [FormatError.MissingLocale]: 'Display formatting requires a locale',\n [FormatError.MissingCurrencyCode]: 'Currency formatting requires a currencyCode',\n [FormatError.DateValueInvalid]: 'Invalid date value',\n [FormatError.DateStringEmpty]: 'Date string cannot be empty',\n [FormatError.DateNumberNonFinite]: 'Date number must be finite',\n [FormatError.InvalidDateString]: 'Invalid date string',\n [FormatError.UnsupportedDateInput]: 'Unsupported date input type'\n\n} satisfies ErrorMessageMap\n\nconst applyDetails = (template: string,\n details?: ErrorDetails): string => {\n\n if (!details) { return template }\n\n return Object.keys(details).reduce((message, key) => message.replace(new RegExp(`%${key}%`, 'g'), details[key]), template)\n}\n\nexport const getFormatErrorMessage = (code: FormatError,\n details?: ErrorDetails): string => applyDetails(FORMAT_ERROR_MESSAGES[code], details)\n\nexport const toRangeError = (code: FormatError, details?: ErrorDetails): RangeError => new RangeError(getFormatErrorMessage(code, details))\nexport const toTypeError = (code: FormatError, details?: ErrorDetails): TypeError => new TypeError(getFormatErrorMessage(code, details))\nexport const toError = (code: FormatError, details?: ErrorDetails): Error => new Error(getFormatErrorMessage(code, details))\n","interface GroupingMetadata {\n\n primary: number\n secondary?: number\n}\n\nexport interface FormatPattern {\n\n positive: Intl.NumberFormatPart[]\n negative: Intl.NumberFormatPart[]\n groupSeparator: string\n decimalSeparator: string\n grouping: GroupingMetadata\n minusSign?: string\n plusSign?: string\n}\n\nconst numberFormatCache = new Map<string, Intl.NumberFormat>()\nconst numberFormatMetaCache = new Map<string, FormatPattern>()\nconst dateFormatCache = new Map<string, Intl.DateTimeFormat>()\n\nconst serializeOptions = (options: Intl.NumberFormatOptions | Intl.DateTimeFormatOptions): string => {\n\n const entries = Object.entries(options)\n .filter( ([, value]) => value !== undefined )\n .sort( ([a], [b]) => (a < b ? -1 : a > b ? 1 : 0) )\n .map( ([key, value]) => {\n\n if (value\n && typeof value === 'object'\n && !Array.isArray(value)) { return `${key}:{${serializeOptions(value as Intl.NumberFormatOptions)}}` }\n if (Array.isArray(value)) { return `${key}:[${value.join('|')}]` }\n\n return `${key}:${String(value)}`\n } )\n\n return entries.join(',')\n}\n\nconst buildNumberFormatKey = (locale: string, options: Intl.NumberFormatOptions): string => `${locale}|${serializeOptions(options)}`\nconst buildDateFormatKey = (locale: string, options?: Intl.DateTimeFormatOptions): string => `${locale}|${options ? serializeOptions(options) : ''}`\n\nexport const getNumberFormat = (locale: string, options: Intl.NumberFormatOptions): Intl.NumberFormat => {\n\n const key = buildNumberFormatKey(locale, options)\n const cached = numberFormatCache.get(key)\n\n if (cached) { return cached }\n\n const nf = new Intl.NumberFormat(locale, options)\n\n numberFormatCache.set(key, nf)\n\n return nf\n}\n\nconst deriveGrouping = (parts: Intl.NumberFormatPart[]): GroupingMetadata => {\n\n const integerParts = parts.filter((part) => part.type === 'integer')\n\n if (integerParts.length <= 1) { return { primary: 0 } }\n\n const lengths = integerParts.map((part) => part.value.length)\n const primary = lengths[lengths.length - 1]\n const secondary = lengths.length > 1 ? lengths[lengths.length - 2] : undefined\n\n if (secondary === primary) { return { primary } }\n\n return { primary, secondary }\n}\n\nconst analyzePattern = (nf: Intl.NumberFormat): FormatPattern => {\n\n const sampleValue = 1234567.89123456\n const positiveParts = nf.formatToParts(sampleValue)\n const negativeParts = nf.formatToParts(-sampleValue)\n const plusProbe = nf.formatToParts(1)\n\n const groupSeparator = positiveParts.find((part) => part.type === 'group')?.value ?? ''\n const decimalSeparator = positiveParts.find((part) => part.type === 'decimal')?.value ?? '.'\n const grouping = deriveGrouping(positiveParts)\n const minusSign = negativeParts.find((part) => part.type === 'minusSign')?.value\n const plusSign = plusProbe.find((part) => part.type === 'plusSign')?.value\n\n return {\n\n positive: positiveParts,\n negative: negativeParts,\n groupSeparator,\n decimalSeparator,\n grouping,\n minusSign,\n plusSign\n }\n}\n\nexport const getNumberFormatPattern = (locale: string, options: Intl.NumberFormatOptions): FormatPattern => {\n\n const key = buildNumberFormatKey(locale, options)\n const cached = numberFormatMetaCache.get(key)\n\n if (cached) { return cached }\n\n const nf = getNumberFormat(locale, options)\n const pattern = analyzePattern(nf)\n\n numberFormatMetaCache.set(key, pattern)\n\n return pattern\n}\n\nexport const getDateFormat = (locale: string, options?: Intl.DateTimeFormatOptions): Intl.DateTimeFormat => {\n\n const key = buildDateFormatKey(locale, options)\n const cached = dateFormatCache.get(key)\n\n if (cached) { return cached }\n\n const df = new Intl.DateTimeFormat(locale, options)\n\n dateFormatCache.set(key, df)\n\n return df\n}\n","import { DEFAULT_LOCALE } from '../constants'\n\nexport const resolveLocale = (value?: string): string => {\n\n const candidate = value?.trim()\n\n return candidate && candidate.length > 0 ? candidate : DEFAULT_LOCALE\n}\n","import { Big } from 'big.js'\n\nimport {\n BIG_ZERO,\n DECIMAL_DOT,\n DECIMAL_EMPTY,\n DECIMAL_ZERO,\n DEFAULT_SIGN_MINUS,\n} from '../constants'\nimport {\n FormatError,\n toRangeError,\n toTypeError,\n} from '../errors'\nimport {\n CommonNumberOptions,\n NumericLike,\n RoundingMode,\n} from '../types'\n\nconst ROUNDING_MODE_MAP = {\n roundDown: Big.roundDown,\n roundHalfUp: Big.roundHalfUp,\n roundHalfEven: Big.roundHalfEven,\n roundUp: Big.roundUp\n} satisfies Record<RoundingMode, Big.RoundingMode>\n\nexport interface NumericParts {\n\n big: Big\n integer: string\n fraction: string\n isNegative: boolean\n isZero: boolean\n}\n\nexport interface GroupingConfig {\n\n separator: string\n primary: number\n secondary?: number\n}\n\nconst assertNonNegativeInteger = (value: number | undefined,\n label: string): number | undefined => {\n\n if (value === undefined) {\n\n return undefined\n }\n\n if (!Number.isInteger(value) || value < 0) {\n\n throw toRangeError(FormatError.NonNegativeIntegerRequired, { label })\n }\n\n return value\n}\n\nconst assertPositiveInteger = (value: number | undefined,\n label: string): number | undefined => {\n\n if (value === undefined) {\n\n return undefined\n }\n\n if (!Number.isInteger(value) || value <= 0) {\n\n throw toRangeError(FormatError.PositiveIntegerRequired, { label })\n }\n\n return value\n}\n\nconst isZeroString = (input: string): boolean => {\n\n return /^[-+]?0+(?:\\.0+)?$/.test(input)\n}\n\nexport const normalizeNumeric = (value: NumericLike,\n clone: boolean = false): Big => {\n\n if (value instanceof Big) {\n\n return clone ? new Big(value) : value\n }\n\n if (typeof value === 'number') {\n\n if (!Number.isFinite(value)) {\n\n throw toRangeError(FormatError.NumericValueNonFinite)\n }\n\n return value === 0 ? BIG_ZERO : new Big(value)\n }\n\n if (typeof value === 'string') {\n\n const trimmed = value.trim()\n\n if (!trimmed) {\n\n throw toRangeError(FormatError.NumericStringEmpty)\n }\n\n if (isZeroString(trimmed)) {\n\n return BIG_ZERO\n }\n\n return new Big(trimmed)\n }\n\n throw toTypeError(FormatError.UnsupportedNumericInput)\n}\n\nconst mapRoundingMode = (mode?: RoundingMode): Big.RoundingMode => {\n\n if (!mode) {\n\n return Big.roundHalfUp\n }\n\n return ROUNDING_MODE_MAP[mode]\n}\n\nexport const toFixedNoSci = (value: Big,\n fractionDigits?: number,\n roundingMode?: RoundingMode): string => {\n\n const rm = mapRoundingMode(roundingMode)\n let working = value\n\n if (fractionDigits !== undefined) {\n\n working = working.round(fractionDigits, rm)\n }\n\n return bigToDecimalString(working)\n}\n\nexport const computeNumericParts = (value: NumericLike,\n options: CommonNumberOptions = {}): NumericParts => {\n\n const minDecimals = assertNonNegativeInteger(options.minDecimals, 'minDecimals') ?? 0\n const maxDecimals = assertNonNegativeInteger(options.maxDecimals, 'maxDecimals')\n const precision = assertPositiveInteger(options.precision, 'precision')\n const roundingMode = mapRoundingMode(options.roundingMode)\n\n if (maxDecimals !== undefined && maxDecimals < minDecimals) {\n\n throw toRangeError(FormatError.MaxDecimalsLessThanMinimum)\n }\n\n let bigValue = normalizeNumeric(value)\n\n if (precision !== undefined) {\n\n bigValue = bigValue.prec(precision, roundingMode)\n }\n\n if (maxDecimals !== undefined) {\n\n bigValue = bigValue.round(maxDecimals, roundingMode)\n }\n\n const isZero = bigValue.eq(0)\n const isNegative = !isZero && bigValue.s < 0\n const canonical = bigToDecimalString(bigValue.abs())\n let [integerPart,\n fractionPart = DECIMAL_EMPTY] = canonical.split(DECIMAL_DOT)\n\n integerPart = integerPart.replace(/^(0+)(\\d)/, '$2')\n\n if (!integerPart) {\n\n integerPart = DECIMAL_ZERO\n }\n\n if (!options.trimTrailingZeros && fractionPart.length < minDecimals) {\n\n fractionPart = fractionPart.padEnd(minDecimals, DECIMAL_ZERO)\n }\n\n if (maxDecimals !== undefined && fractionPart.length > maxDecimals) {\n\n fractionPart = fractionPart.slice(0, maxDecimals)\n }\n\n if (options.trimTrailingZeros) {\n\n const minKeep = minDecimals\n\n while (fractionPart.length > minKeep && fractionPart.endsWith(DECIMAL_ZERO)) {\n\n fractionPart = fractionPart.slice(0, -1)\n }\n }\n\n return {\n big: bigValue,\n integer: integerPart,\n fraction: fractionPart,\n isNegative,\n isZero\n }\n}\n\nexport const bigToDecimalString = (value: Big): string => {\n\n const coefficient = (value.c ?? [0]) as number[]\n const exponent = value.e ?? 0\n const sign = value.s < 0 ? DEFAULT_SIGN_MINUS : DECIMAL_EMPTY\n\n if (coefficient.every((digit) => digit === 0)) {\n\n return DECIMAL_ZERO\n }\n\n const digits = coefficient.join('')\n const decimalIndex = exponent + 1\n\n if (decimalIndex <= 0) {\n\n const zeros = DECIMAL_ZERO.repeat(Math.abs(decimalIndex))\n\n return `${sign}${DECIMAL_ZERO}${DECIMAL_DOT}${zeros}${digits}`.replace(/\\.$/, DECIMAL_EMPTY)\n }\n\n if (decimalIndex >= digits.length) {\n\n const zeros = DECIMAL_ZERO.repeat(decimalIndex - digits.length)\n\n return `${sign}${digits}${zeros}`\n }\n\n const integerPart = digits.slice(0, decimalIndex)\n const fractionPart = digits.slice(decimalIndex)\n\n return `${sign}${integerPart}${DECIMAL_DOT}${fractionPart}`\n}\n\nexport const applyGrouping = (integer: string,\n grouping: GroupingConfig,\n enableGrouping: boolean): string => {\n\n if (!enableGrouping || grouping.primary === 0 || integer.length <= grouping.primary) {\n\n return integer\n }\n\n const groups = [] as string[]\n const primary = grouping.primary\n const secondary = grouping.secondary ?? primary\n let index = integer.length\n let usePrimary = true\n\n while (index > 0) {\n\n const size = usePrimary ? primary : secondary\n\n if (size <= 0) {\n\n groups.unshift(integer.slice(0, index))\n break\n }\n\n const start = Math.max(index - size, 0)\n\n groups.unshift(integer.slice(start, index))\n index = start\n\n if (index <= 0) {\n\n break\n }\n\n usePrimary = false\n }\n\n return groups.join(grouping.separator)\n}\n","import { Big } from 'big.js'\n\nimport {\n COMPACT_ORDER,\n DEFAULT_SIGN_MINUS,\n DEFAULT_SIGN_PLUS,\n DISPLAY_SIGN_MINUS,\n DISPLAY_SIGN_NONE,\n DISPLAY_SIGN_PLUS,\n STYLE_CURRENCY,\n STYLE_DECIMAL,\n STYLE_PERCENT,\n} from './constants'\nimport {\n FormatError,\n toError,\n} from './errors'\nimport {\n FormatPattern,\n getNumberFormatPattern,\n} from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport {\n applyGrouping,\n computeNumericParts,\n normalizeNumeric,\n} from './internal/numeric'\nimport {\n CompactUnit,\n DisplayNumberOptions,\n NumberStyle,\n NumericLike,\n SIGN_DISPLAYS,\n SignDisplay,\n} from './types'\n\ninterface CompactResult {\n value: Big\n suffix?: string\n}\n\ninterface CurrencyResolution {\n value: string\n fromCustom: boolean\n}\n\nconst defaultCompactThresholds: Record<CompactUnit, Big> = {\n\n K: new Big(1_000),\n M: new Big(1_000_000),\n B: new Big(1_000_000_000),\n T: new Big(1_000_000_000_000)\n}\n\nconst defaultCompactSuffixes: Record<CompactUnit, string> = {\n\n K: 'K',\n M: 'M',\n B: 'B',\n T: 'T'\n}\n\nconst compactThresholdCache = new WeakMap<DisplayNumberOptions, Map<string, Big>>()\nconst COMPACT_DECIMAL_BUFFER = 12\n\nconst SUBSCRIPT_DIGITS = [\n\n '₀',\n '₁',\n '₂',\n '₃',\n '₄',\n '₅',\n '₆',\n '₇',\n '₈',\n '₉'\n\n] as const\n\nconst SUBSCRIPT_TO_DIGIT = SUBSCRIPT_DIGITS.reduce<Record<string, string>>((acc, digit, index) => {\n\n acc[digit] = index.toString()\n return acc\n}, {})\n\nconst toSubscriptNumber = (value: number): string => value\n .toString()\n .split('')\n .map((digit) => SUBSCRIPT_DIGITS[digit.charCodeAt(0) - 48])\n .join('')\n\nconst expandSubscriptDigits = (value: string): string => {\n\n let result = ''\n\n for (let index = 0; index < value.length; index += 1) {\n\n const char = value[index]!\n const mapped = SUBSCRIPT_TO_DIGIT[char]\n\n if (mapped === undefined) {\n\n result += char\n continue\n }\n\n let subscriptBuffer = mapped\n\n while (index + 1 < value.length) {\n\n const nextChar = value[index + 1]!\n const nextMapped = SUBSCRIPT_TO_DIGIT[nextChar]\n\n if (nextMapped === undefined) {\n\n break\n }\n\n subscriptBuffer += nextMapped\n index += 1\n }\n\n const zeroCount = Number(subscriptBuffer)\n\n if (Number.isNaN(zeroCount) || zeroCount <= 0) {\n\n continue\n }\n\n result += '0'.repeat(zeroCount)\n }\n\n return result\n}\n\nconst compactFractionLeadingZeros = (fraction: string): string => {\n\n const match = /^(0{2,})(.+)$/.exec(fraction)\n\n if (!match) {\n\n return fraction\n }\n\n const [, zeros, remainder] = match\n\n if (!remainder || /^0+$/.test(remainder)) {\n\n return fraction\n }\n\n const annotation = toSubscriptNumber(zeros.length - 1)\n\n return `${zeros[0]}${annotation}${remainder}`\n}\n\nconst resolveSignKind = (isNegative: boolean,\n isZero: boolean,\n signDisplay?: SignDisplay,\n forceSign?: boolean): typeof DISPLAY_SIGN_MINUS | typeof DISPLAY_SIGN_PLUS | typeof DISPLAY_SIGN_NONE => {\n\n const mode = signDisplay ?? (forceSign ? SIGN_DISPLAYS.always : SIGN_DISPLAYS.auto)\n\n switch (mode) {\n\n case SIGN_DISPLAYS.always: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_PLUS\n case SIGN_DISPLAYS.exceptZero: return isNegative ? DISPLAY_SIGN_MINUS : (isZero ? DISPLAY_SIGN_NONE : DISPLAY_SIGN_PLUS)\n case SIGN_DISPLAYS.never: return DISPLAY_SIGN_NONE\n case SIGN_DISPLAYS.negative: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_NONE\n case SIGN_DISPLAYS.auto:\n default: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_NONE\n }\n}\n\nconst resolveCurrencyToken = (template: string,\n options: DisplayNumberOptions): CurrencyResolution => {\n\n const code = options.currencyCode?.toUpperCase() ?? ''\n\n if (options.useSymbol === false) {\n\n return { value: code, fromCustom: false }\n }\n\n const custom = code ? options.customSymbols?.[code] : undefined\n\n if (custom) {\n\n return { value: custom, fromCustom: true }\n }\n\n if (template && template !== code) {\n\n return { value: template, fromCustom: false }\n }\n\n return { value: code, fromCustom: false }\n}\n\nconst getNormalizedThreshold = (options: DisplayNumberOptions,\n unit: CompactUnit): Big | undefined => {\n\n const overrides = options.compactThresholds\n\n if (!overrides || overrides[unit] === undefined) {\n\n return undefined\n }\n\n let cache = compactThresholdCache.get(options)\n\n if (!cache) {\n\n cache = new Map()\n compactThresholdCache.set(options, cache)\n }\n\n let normalized = cache.get(unit)\n\n if (!normalized) {\n\n normalized = normalizeNumeric(overrides[unit]!, true)\n cache.set(unit, normalized)\n }\n\n return normalized\n}\n\nconst resolveCompact = (value: Big,\n options: DisplayNumberOptions,\n enabled: boolean): CompactResult => {\n\n if (!enabled) {\n\n return { value }\n }\n\n const abs = value.abs()\n\n for (const unit of COMPACT_ORDER) {\n\n const overrideThreshold = getNormalizedThreshold(options, unit)\n const threshold = overrideThreshold ?? getDefaultCompactThreshold(unit)\n\n if (abs.gte(threshold)) {\n\n const suffix = options.compactSuffixes?.[unit] ?? getDefaultCompactSuffix(unit)\n const scaled = threshold.eq(0) ? value : value.div(threshold)\n\n return { value: scaled, suffix }\n }\n }\n\n return { value }\n}\n\nconst getDefaultCompactThreshold = (unit: CompactUnit): Big => {\n\n return defaultCompactThresholds[unit as keyof typeof defaultCompactThresholds]\n}\n\nconst getDefaultCompactSuffix = (unit: CompactUnit): string => {\n\n return defaultCompactSuffixes[unit as keyof typeof defaultCompactSuffixes]\n}\n\nconst buildNumberFormatOptions = (options: DisplayNumberOptions,\n style: NumberStyle): Intl.NumberFormatOptions => {\n\n const nfOptions: Intl.NumberFormatOptions = {\n style,\n useGrouping: options.useGrouping !== false\n }\n\n if (options.signDisplay && options.signDisplay !== SIGN_DISPLAYS.negative) {\n\n nfOptions.signDisplay = options.signDisplay\n\n } else if (!options.signDisplay && options.forceSign) {\n\n nfOptions.signDisplay = SIGN_DISPLAYS.always\n }\n\n if (options.minDecimals !== undefined) {\n\n nfOptions.minimumFractionDigits = options.minDecimals\n }\n\n if (options.maxDecimals !== undefined) {\n\n nfOptions.maximumFractionDigits = options.maxDecimals\n }\n\n if (style === STYLE_CURRENCY && options.currencyCode) {\n\n nfOptions.currency = options.currencyCode\n nfOptions.currencyDisplay = options.useSymbol === false ? 'code' : 'symbol'\n }\n\n return nfOptions\n}\n\nconst formatFromPattern = (options: DisplayNumberOptions,\n style: NumberStyle,\n integerPart: string,\n fractionPart: string,\n sign: typeof DISPLAY_SIGN_MINUS | typeof DISPLAY_SIGN_PLUS | typeof DISPLAY_SIGN_NONE,\n pattern: FormatPattern,\n suffix?: string,\n currencyOverride?: string,\n currencyOverrideIsCustom?: boolean): string => {\n const parts = sign === DISPLAY_SIGN_MINUS ? pattern.negative : pattern.positive\n const useGrouping = options.useGrouping !== false\n const groupedInteger = applyGrouping(integerPart, {\n separator: pattern.groupSeparator,\n primary: pattern.grouping.primary,\n secondary: pattern.grouping.secondary\n }, useGrouping)\n\n const hasFraction = fractionPart.length > 0\n let result = ''\n let integerInjected = false\n let currencyMeta: CurrencyResolution | undefined\n let previousType: Intl.NumberFormatPart['type'] | undefined\n let suffixInjected = false\n\n const appendSuffix = (): void => {\n\n if (!suffix || suffixInjected) {\n\n return\n }\n\n result += suffix\n suffixInjected = true\n }\n\n const stripTrailingWhitespace = (): void => {\n\n if (!result) {\n\n return\n }\n\n const trimmed = result.replace(/\\s+$/gu, '')\n\n if (trimmed !== result) {\n\n result = trimmed\n }\n }\n\n for (const part of parts) {\n\n switch (part.type) {\n\n case 'integer': {\n\n if (!integerInjected) {\n\n result += groupedInteger\n integerInjected = true\n\n if (!hasFraction) {\n\n appendSuffix()\n }\n }\n break\n }\n case 'group':\n break\n case 'decimal': {\n\n if (hasFraction) {\n\n result += pattern.decimalSeparator\n }\n break\n }\n case 'fraction': {\n\n if (hasFraction) {\n\n result += fractionPart\n appendSuffix()\n }\n break\n }\n case 'minusSign': {\n\n if (sign === DISPLAY_SIGN_MINUS) {\n\n result += pattern.minusSign ?? part.value ?? DEFAULT_SIGN_MINUS\n }\n break\n }\n case 'plusSign': {\n\n if (sign === DISPLAY_SIGN_PLUS) {\n\n result += pattern.plusSign ?? part.value ?? DEFAULT_SIGN_PLUS\n }\n break\n }\n case 'currency': {\n\n if (integerInjected) {\n\n appendSuffix()\n }\n if (currencyOverride !== undefined) {\n\n currencyMeta = {\n value: currencyOverride,\n fromCustom: currencyOverrideIsCustom ?? false\n }\n\n } else {\n\n currencyMeta = currencyMeta ?? resolveCurrencyToken(part.value, options)\n }\n result += currencyMeta.value\n break\n }\n case 'percentSign': {\n\n stripTrailingWhitespace()\n result += part.value\n break\n }\n case 'literal': {\n\n if (previousType === 'currency' && currencyMeta?.fromCustom && /^\\s+$/.test(part.value)) {\n\n break\n }\n result += part.value\n break\n }\n default: {\n result += part.value\n break\n }\n }\n\n previousType = part.type\n }\n\n appendSuffix()\n\n return result\n}\n\nconst resolveDisplayStyle = (options: DisplayNumberOptions,\n overrideStyle?: NumberStyle): NumberStyle => {\n\n const style = overrideStyle ?? options.style ?? STYLE_DECIMAL\n\n if (style === STYLE_CURRENCY && !options.currencyCode) {\n\n throw toError(FormatError.MissingCurrencyCode)\n }\n\n return style\n}\n\nconst formatDisplayInternal = (value: NumericLike,\n options: DisplayNumberOptions,\n styleOverride?: NumberStyle,\n forceCompact?: boolean): string => {\n\n const style = resolveDisplayStyle(options, styleOverride)\n const base = normalizeNumeric(value)\n const percentAdjusted = style === STYLE_PERCENT ? base.times(100) : base\n const {\n value: scaled,\n suffix\n } = resolveCompact(percentAdjusted, options, forceCompact ?? options.compact === true)\n const numericParts = computeNumericParts(scaled, options)\n const sign = resolveSignKind(numericParts.isNegative, numericParts.isZero, options.signDisplay, options.forceSign)\n let integerPart = numericParts.integer\n let fractionPart = numericParts.fraction\n const locale = resolveLocale(options.locale)\n let pattern: FormatPattern\n let currencyOverride: string | undefined\n let currencyOverrideIsCustom = false\n\n if (options.compactDecimalZeros && !options.isHidden) {\n\n const baseMatch = /^(0{2,})(.+)$/.exec(fractionPart)\n const baseRemainder = baseMatch?.[2]\n const hasBaseDigits = baseMatch && baseRemainder && !/^0+$/.test(baseRemainder)\n\n if (hasBaseDigits) {\n\n fractionPart = compactFractionLeadingZeros(fractionPart)\n\n } else {\n\n const extendedMax = options.maxDecimals !== undefined ? options.maxDecimals + COMPACT_DECIMAL_BUFFER : undefined\n\n const extendedOptions: DisplayNumberOptions = {\n ...options,\n maxDecimals: extendedMax,\n trimTrailingZeros: false\n }\n\n const extendedParts = computeNumericParts(scaled, extendedOptions)\n const extendedFraction = extendedParts.fraction\n const match = /^(0{2,})(.+)$/.exec(extendedFraction)\n\n if (match) {\n\n const zerosPortion = match[1]\n let remainder = match[2]\n\n if (!/^0+$/.test(remainder)) {\n\n const targetMax = options.maxDecimals\n const targetMin = options.minDecimals ?? 0\n\n if (targetMax === 0) {\n\n fractionPart = ''\n\n } else {\n\n let digits = zerosPortion\n const remainderNeeded = targetMax !== undefined ? Math.max(targetMax - 1, 0) : remainder.length\n\n if (remainderNeeded > 0) {\n\n if (remainder.length < remainderNeeded) {\n\n remainder = remainder.padEnd(remainderNeeded, '0')\n }\n\n digits += remainder.slice(0, remainderNeeded)\n }\n\n if (targetMax === undefined && digits.length < targetMin) {\n\n const extraNeeded = targetMin - digits.length\n let extraSource = remainder.slice(remainderNeeded)\n\n if (extraSource.length < extraNeeded) {\n\n extraSource = extraSource.padEnd(extraNeeded, '0')\n }\n\n digits += extraSource.slice(0, extraNeeded)\n }\n\n if (targetMax !== undefined && digits.length < targetMin) {\n\n digits = digits.padEnd(targetMin, '0')\n }\n\n if (options.trimTrailingZeros) {\n\n const minKeep = Math.max(targetMin, zerosPortion ? 1 : 0)\n\n while (digits.length > Math.max(minKeep, zerosPortion.length) && digits.endsWith('0')) {\n\n digits = digits.slice(0, -1)\n }\n }\n\n fractionPart = compactFractionLeadingZeros(digits)\n integerPart = extendedParts.integer\n }\n }\n }\n }\n }\n\n if (options.isHidden) {\n\n const maskChar = options.hiddenCharacter && options.hiddenCharacter.length > 0\n ? options.hiddenCharacter[0]\n : '*'\n integerPart = maskChar\n fractionPart = fractionPart.length > 0 ? maskChar.repeat(fractionPart.length) : fractionPart\n }\n try {\n\n const nfOptions = buildNumberFormatOptions(options, style)\n pattern = getNumberFormatPattern(locale, nfOptions)\n\n } catch (error) {\n\n if (!(error instanceof RangeError) || style !== STYLE_CURRENCY || !options.currencyCode) {\n\n throw error\n }\n\n const placeholderOptions: DisplayNumberOptions = {\n ...options,\n currencyCode: 'USD'\n }\n const nfOptionsFallback = buildNumberFormatOptions(placeholderOptions, STYLE_CURRENCY)\n pattern = getNumberFormatPattern(locale, nfOptionsFallback)\n\n const rawCode = options.currencyCode\n const code = rawCode.toUpperCase()\n\n if (options.useSymbol === false) {\n\n currencyOverride = rawCode\n\n } else {\n\n const customSymbol = options.customSymbols?.[code] ?? options.customSymbols?.[rawCode]\n\n if (customSymbol) {\n\n currencyOverride = customSymbol\n currencyOverrideIsCustom = true\n\n } else {\n\n currencyOverride = rawCode\n }\n }\n }\n\n return formatFromPattern(options, style, integerPart, fractionPart, sign, pattern, suffix, currencyOverride, currencyOverrideIsCustom)\n}\n\nexport const formatDisplayNumber = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options)\nexport const formatDisplayCurrency = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, STYLE_CURRENCY)\nexport const formatDisplayPercent = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, STYLE_PERCENT)\nexport const formatDisplayCompact = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, undefined, true)\n\nconst stripGroupSeparators = (value: string,\n separator: string): string => {\n\n if (!separator) { return value }\n\n return value.split(separator).join('')\n}\n\nconst normalizeNumericCore = (core: string,\n pattern: FormatPattern): string => {\n\n let normalized = expandSubscriptDigits(core)\n\n if (pattern.groupSeparator) {\n\n normalized = stripGroupSeparators(normalized, pattern.groupSeparator)\n }\n\n normalized = normalized.replace(/\\s+/gu, '')\n\n if (pattern.decimalSeparator && pattern.decimalSeparator !== '.') {\n\n normalized = normalized.replace(pattern.decimalSeparator, '.')\n }\n\n if (pattern.minusSign && pattern.minusSign !== DEFAULT_SIGN_MINUS) {\n\n normalized = normalized.split(pattern.minusSign).join(DEFAULT_SIGN_MINUS)\n }\n\n if (pattern.plusSign && pattern.plusSign !== DEFAULT_SIGN_PLUS) {\n\n normalized = normalized.split(pattern.plusSign).join(DEFAULT_SIGN_PLUS)\n }\n\n return normalized\n}\n\nconst parseDisplayInternal = (formatted: string,\n options?: DisplayNumberOptions): number => {\n\n const numericCore = extractNumberCore(formatted)\n\n if (!numericCore) { return Number.NaN }\n\n const locale = options?.locale\n\n if (locale) {\n\n const resolvedLocale = resolveLocale(locale)\n const nfOptions = buildNumberFormatOptions(options ?? {}, STYLE_DECIMAL)\n const pattern = getNumberFormatPattern(resolvedLocale, nfOptions)\n const normalizedCore = normalizeNumericCore(numericCore, pattern)\n\n if (!normalizedCore || normalizedCore === DEFAULT_SIGN_MINUS || normalizedCore === DEFAULT_SIGN_PLUS) {\n\n return Number.NaN\n }\n\n try {\n\n return Big(normalizedCore).toNumber()\n\n } catch (error) {\n\n // fall back to locale-agnostic heuristics below when locale pattern parsing fails\n }\n }\n\n let normalized = expandSubscriptDigits(numericCore)\n normalized = normalized.replace(/['’`_\\s\\u00A0]/gu, '')\n\n const lastDot = normalized.lastIndexOf('.')\n const lastComma = normalized.lastIndexOf(',')\n\n if (lastDot !== -1 || lastComma !== -1) {\n\n let decimalIndex = Math.max(lastDot, lastComma)\n let decimalChar = decimalIndex === lastDot ? '.' : ','\n\n if (lastDot !== -1 && lastComma !== -1) {\n\n decimalChar = decimalIndex === lastDot ? '.' : ','\n const thousandsChar = decimalChar === '.' ? ',' : '.'\n normalized = normalized.split(thousandsChar).join('')\n\n } else if (lastComma !== -1) {\n\n const fractionalPart = normalized.slice(lastComma + 1)\n\n if (fractionalPart.length === 3 && normalized.slice(0, lastComma).replace(/[^0-9]/g, '').length > 3) {\n\n normalized = normalized.replace(/,/g, '')\n decimalChar = '.'\n\n } else {\n\n decimalChar = ','\n }\n\n } else if (lastDot !== -1) {\n\n const fractionalPart = normalized.slice(lastDot + 1)\n\n if (fractionalPart.length === 3 && normalized.slice(0, lastDot).replace(/[^0-9]/g, '').length > 3) {\n\n decimalChar = ','\n normalized = normalized.replace(/\\./g, '')\n\n } else {\n\n decimalChar = '.'\n }\n }\n\n if (decimalChar !== '.') {\n\n normalized = normalized.split(decimalChar).join('.')\n }\n }\n\n normalized = normalized.replace(/,/g, '')\n\n if (!normalized || normalized === DEFAULT_SIGN_MINUS || normalized === DEFAULT_SIGN_PLUS) {\n\n return Number.NaN\n }\n\n try {\n\n return Big(normalized).toNumber()\n\n } catch (error) {\n\n return Number.NaN\n }\n}\nexport const parseDisplayValue = (formatted: string, options?: DisplayNumberOptions): number => parseDisplayInternal(formatted, options)\n\nconst NUMERIC_OR_SUBSCRIPT = /[0-9₀-₉]/\nconst MINUS_SIGNS = new Set(['-', '−', '﹣', '-'])\nconst isWhitespace = (char: string): boolean => /\\s/.test(char)\n\nexport const extractNumberCore = (formatted: string): string => {\n\n let startIndex = -1\n let endIndex = -1\n\n for (let i = 0; i < formatted.length; i += 1) {\n\n if (NUMERIC_OR_SUBSCRIPT.test(formatted[i]!)) {\n\n startIndex = i\n break\n }\n }\n\n if (startIndex === -1) {\n\n return ''\n }\n\n for (let i = formatted.length - 1; i >= startIndex; i -= 1) {\n\n if (NUMERIC_OR_SUBSCRIPT.test(formatted[i]!)) {\n\n endIndex = i\n break\n }\n }\n\n if (endIndex === -1) {\n\n return ''\n }\n\n let signPrefix = ''\n\n for (let idx = startIndex - 1; idx >= 0; idx -= 1) {\n\n const candidate = formatted[idx]!\n\n if (isWhitespace(candidate)) {\n\n continue\n }\n\n if (MINUS_SIGNS.has(candidate)) {\n\n signPrefix = candidate\n break\n }\n\n if (NUMERIC_OR_SUBSCRIPT.test(candidate)) {\n\n break\n }\n }\n\n if (!signPrefix) {\n\n for (let idx = endIndex + 1; idx < formatted.length; idx += 1) {\n\n const candidate = formatted[idx]!\n\n if (isWhitespace(candidate)) {\n\n continue\n }\n\n if (MINUS_SIGNS.has(candidate)) {\n\n signPrefix = candidate\n break\n }\n\n if (NUMERIC_OR_SUBSCRIPT.test(candidate)) {\n\n break\n }\n }\n }\n\n return `${signPrefix}${formatted.slice(startIndex, endIndex + 1)}`\n}\n","import {\n FormatError,\n toRangeError,\n toTypeError,\n} from './errors'\nimport { getDateFormat } from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport { CsvDateOptions } from './types'\n\nconst toDate = (value: Date | number | string): Date => {\n\n if (value instanceof Date) {\n\n const timestamp = value.getTime()\n\n if (Number.isNaN(timestamp)) {\n\n throw toRangeError(FormatError.DateValueInvalid)\n }\n\n return new Date(timestamp)\n }\n\n if (typeof value === 'number') {\n\n if (!Number.isFinite(value)) {\n\n throw toRangeError(FormatError.DateNumberNonFinite)\n }\n\n const date = new Date(value)\n\n if (Number.isNaN(date.getTime())) {\n\n throw toRangeError(FormatError.DateValueInvalid)\n }\n\n return date\n }\n\n if (typeof value === 'string') {\n\n const trimmed = value.trim()\n\n if (!trimmed) {\n\n throw toRangeError(FormatError.DateStringEmpty)\n }\n\n const date = new Date(trimmed)\n\n if (Number.isNaN(date.getTime())) {\n\n throw toRangeError(FormatError.InvalidDateString)\n }\n\n return date\n }\n\n throw toTypeError(FormatError.UnsupportedDateInput)\n}\n\nexport const formatDisplayDate = (date: Date | number | string,\n locale?: string,\n options?: Intl.DateTimeFormatOptions): string => {\n\n const resolvedLocale = resolveLocale(locale)\n const parsed = toDate(date)\n const formatter = getDateFormat(resolvedLocale, options)\n\n return formatter.format(parsed)\n}\n\nexport const formatCsvDate = (date: Date | number | string,\n options?: CsvDateOptions): string => {\n\n const parsed = toDate(date)\n const format = options?.format ?? 'iso'\n\n if (format === 'utc-datetime') {\n\n const year = parsed.getUTCFullYear()\n const month = String(parsed.getUTCMonth() + 1).padStart(2, '0')\n const day = String(parsed.getUTCDate() ).padStart(2, '0')\n const hours = String(parsed.getUTCHours() ).padStart(2, '0')\n const minutes = String(parsed.getUTCMinutes() ).padStart(2, '0')\n const seconds = String(parsed.getUTCSeconds() ).padStart(2, '0')\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`\n }\n\n const iso = parsed.toISOString()\n const datePart = iso.slice(0, 10)\n const hasTime = parsed.getUTCHours() !== 0\n || parsed.getUTCMinutes() !== 0\n || parsed.getUTCSeconds() !== 0\n || parsed.getUTCMilliseconds() !== 0\n\n if (!hasTime) { return datePart }\n\n const timePart = iso.slice(11)\n const withoutMillis = timePart.replace(/\\.\\d+Z$/, 'Z')\n\n return `${datePart}T${withoutMillis}`\n}\n","import {\n DECIMAL_DOT,\n DECIMAL_EMPTY,\n DECIMAL_ZERO,\n DEFAULT_SIGN_MINUS,\n STYLE_DECIMAL,\n} from './constants'\nimport { formatCsvDate } from './date'\nimport {\n getNumberFormatPattern,\n} from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport {\n computeNumericParts,\n normalizeNumeric,\n} from './internal/numeric'\nimport {\n CsvColumnSpec,\n CsvNumberOptions,\n NumericLike,\n} from './types'\n\nconst resolveDecimalDelimiter = (options: CsvNumberOptions): string => {\n\n if (options.decimalDelimiter !== undefined) {\n\n return options.decimalDelimiter\n }\n\n if (options.locale) {\n\n const locale = resolveLocale(options.locale)\n const pattern = getNumberFormatPattern(locale, { style: STYLE_DECIMAL })\n\n return pattern.decimalSeparator\n }\n\n return DECIMAL_DOT\n}\n\nconst stringifyNumericParts = (parts: ReturnType<typeof computeNumericParts>,\n decimalDelimiter: string = DECIMAL_DOT): string => {\n\n const fraction = parts.fraction.length > 0 ? `${decimalDelimiter}${parts.fraction}` : DECIMAL_EMPTY\n const integer = parts.integer || DECIMAL_ZERO\n const prefix = parts.isNegative ? DEFAULT_SIGN_MINUS : DECIMAL_EMPTY\n const value = `${prefix}${integer}${fraction}`\n\n return value\n}\n\nexport const formatCsvNumber = (value: NumericLike,\n options: CsvNumberOptions = {}): string => {\n\n const parts = computeNumericParts(value, options)\n const delimiter = resolveDecimalDelimiter(options)\n\n return stringifyNumericParts(parts, delimiter)\n}\n\nexport const formatCsvPercent = (value: NumericLike,\n options: CsvNumberOptions = {}): string => {\n\n const scaled = normalizeNumeric(value).times(100)\n const parts = computeNumericParts(scaled, options)\n const delimiter = resolveDecimalDelimiter(options)\n\n return stringifyNumericParts(parts, delimiter)\n}\n\nexport const csvCurrencyCode = (code: string,\n customSymbols?: Record<string, string>,\n useSymbol?: boolean): string => {\n\n const trimmed = code.trim()\n\n if (!trimmed) { return DECIMAL_EMPTY }\n\n const normalized = trimmed.toUpperCase()\n\n if (useSymbol) {\n\n const symbol = customSymbols?.[normalized]\n\n if (symbol) { return symbol }\n }\n\n return normalized\n}\n\nconst escapeCsvField = (value: string,\n delimiter: string): string => {\n\n const needsQuoting = value.includes(delimiter)\n || value.includes('\\n')\n || value.includes('\\r')\n || value.includes('\"')\n\n if (!needsQuoting) { return value }\n\n const escaped = value.replace(/\"/g, '\"\"')\n\n return `\"${escaped}\"`\n}\n\nconst defaultFormatter = (value: unknown): string => {\n\n if (value === null || value === undefined) {\n\n return DECIMAL_EMPTY\n }\n\n if (value instanceof Date) {\n\n return formatCsvDate(value)\n }\n\n if (typeof value === 'number') {\n\n return formatCsvNumber(value)\n }\n\n if (typeof value === 'string') {\n\n return value\n }\n\n if (typeof value === 'boolean') {\n\n return value ? 'true' : 'false'\n }\n\n return String(value)\n}\n\nexport const buildCsv = <T>(rows: T[],\n columns: CsvColumnSpec<T>[],\n delimiter: string = ',',\n lineEnding: string = '\\n'): string => {\n\n const headerLine = columns.map((col) => escapeCsvField(col.header, delimiter)).join(delimiter)\n const lines = [headerLine]\n\n for (const row of rows) {\n\n const fields = columns.map((col) => {\n\n const raw = col.accessor(row)\n const formatted = col.formatter ? col.formatter(raw) : defaultFormatter(raw)\n const stringValue = formatted ?? DECIMAL_EMPTY\n\n return escapeCsvField(stringValue, delimiter)\n })\n\n lines.push(fields.join(delimiter))\n }\n\n return `${lines.join(lineEnding)}${lineEnding}`\n}\n","import { Big } from 'big.js'\n\nimport {\n BIG_ZERO,\n DECIMALS_CARDANO,\n} from './constants'\nimport { NumericLike } from './types'\n\nexport const bigQuantityFromAmount = ( amount?: NumericLike, decimals?: number): Big => {\n\n if (!amount || amount === '0' || amount === 0) { return BIG_ZERO }\n if (!decimals || decimals <= 0) { return Big(amount) } // Don't round to 0 decimals\n\n return Big(amount).mul(Math.pow(10, decimals)).round(0)\n}\nexport const bigAmountFromQuantity = (quantity?: NumericLike, decimals?: number): Big => {\n\n if (!quantity || quantity === '0' || quantity === 0) { return BIG_ZERO }\n if (!decimals || decimals <= 0) { return Big(quantity) } // Don't round to 0 decimals\n\n return Big(quantity).div(Math.pow(10, decimals)).round(decimals)\n}\nexport const bigLovelaceFromAda = ( ada?: NumericLike, decimals: number = DECIMALS_CARDANO): Big => bigQuantityFromAmount( ada, decimals)\nexport const bigAdaFromLovelace = (lovelace?: NumericLike, decimals: number = DECIMALS_CARDANO): Big => bigAmountFromQuantity(lovelace, decimals)\n"],"mappings":";;;AAKA,MAAa,gBAAmB;CAE9B,SAA4B;CAC5B,UAA4B;CAC5B,SAA4B;CAE7B;AAID,MAAa,gBAAmB;CAE9B,MAA4B;CAC5B,QAA4B;CAC5B,YAA4B;CAC5B,OAA4B;CAC5B,UAA4B;CAE7B;AAID,MAAa,gBAAmB;CAAC;CAAK;CAAK;CAAK;CAAI;;;;AClBpD,MAAa,gBAA+B,cAAc;AAC1D,MAAa,iBAA+B,cAAc;AAC1D,MAAa,gBAA+B,cAAc;AAE1D,MAAa,iBAAmB;AAEhC,MAAa,gBAAmB;CAE9B,OAA4B;CAC5B,MAA4B;CAC5B,MAA4B;CAE7B;AAID,MAAa,qBAAqB,cAAc;AAChD,MAAa,oBAAqB,cAAc;AAChD,MAAa,oBAAqB,cAAc;AAEhD,MAAa,gBAA+B,CAAC,GAAG,cAAc,CAAC,SAAS;AAExE,MAAa,qBAAqB;AAClC,MAAa,oBAAqB;AAElC,MAAa,eAAqB;AAClC,MAAa,gBAAqB;AAClC,MAAa,cAAqB;AAElC,MAAa,WAAqB,IAAI,EAAE;AAGxC,MAAa,mBAAqB;;;;ACzClC,IAAY,oDAAL;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAOF,MAAM,wBAA0B;EAE7B,YAAY,6BAAmC;EAC/C,YAAY,0BAAmC;EAC/C,YAAY,wBAAmC;EAC/C,YAAY,qBAAmC;EAC/C,YAAY,0BAAmC;EAC/C,YAAY,6BAAmC;EAC/C,YAAY,gBAAmC;EAC/C,YAAY,sBAAmC;EAC/C,YAAY,mBAAmC;EAC/C,YAAY,kBAAmC;EAC/C,YAAY,sBAAmC;EAC/C,YAAY,oBAAmC;EAC/C,YAAY,uBAAmC;CAEjD;AAED,MAAM,gBAA2B,UACA,YAA0C;AAEzE,KAAI,CAAC,QAA8B,QAAO;AAE1C,QAAO,OAAO,KAAK,QAAQ,CAAC,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,EAAE,SAAS;;AAG5H,MAAa,yBAAyB,MACA,YAAqC,aAAa,sBAAsB,OAAO,QAAQ;AAE7H,MAAa,gBAAoB,MAAmB,YAAuC,IAAI,WAAW,sBAAsB,MAAM,QAAQ,CAAC;AAC/I,MAAa,eAAoB,MAAmB,YAAuC,IAAK,UAAU,sBAAsB,MAAM,QAAQ,CAAC;AAC/I,MAAa,WAAoB,MAAmB,YAAuC,IAAS,MAAM,sBAAsB,MAAM,QAAQ,CAAC;;;;ACnC/I,MAAM,oCAA0B,IAAI,KAAgC;AACpE,MAAM,wCAA0B,IAAI,KAA4B;AAChE,MAAM,kCAA0B,IAAI,KAAkC;AAEtE,MAAM,oBAA2B,YAA2E;AAe1G,QAb8B,OAAO,QAAQ,QAAQ,CAClD,QAAS,GAAG,WAAW,UAAU,OAAW,CAC5C,MAAO,CAAC,IAAI,CAAC,OAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,EAAI,CAClD,KAAM,CAAC,KAAK,WAAW;AAEtB,MAAI,SACC,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,MAAM,CAAI,QAAO,GAAG,IAAI,IAAI,iBAAiB,MAAkC,CAAC;AACpG,MAAI,MAAM,QAAQ,MAAM,CAAM,QAAO,GAAG,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC;AAElC,SAAO,GAAG,IAAI,GAAG,OAAO,MAAM;GAC3D,CAEU,KAAK,IAAI;;AAG1B,MAAM,wBAA2B,QAAiB,YAAgD,GAAG,OAAO,GAAG,iBAAiB,QAAQ;AACxI,MAAM,sBAA2B,QAAgB,YAAiD,GAAG,OAAO,GAAG,UAAU,iBAAiB,QAAQ,GAAG;AAErJ,MAAa,mBAAoB,QAAgB,YAAyD;CAExG,MAAM,MAAwB,qBAAqB,QAAQ,QAAQ;CACnE,MAAM,SAAwB,kBAAkB,IAAI,IAAI;AAExD,KAAI,OAA0B,QAAO;CAErC,MAAM,KAAwB,IAAI,KAAK,aAAa,QAAQ,QAAQ;AAEpE,mBAAkB,IAAI,KAAK,GAAG;AAE9B,QAAO;;AAGT,MAAM,kBAA2B,UAAqD;CAEpF,MAAM,eAAwB,MAAM,QAAQ,SAAS,KAAK,SAAS,UAAU;AAE7E,KAAI,aAAa,UAAU,EAAK,QAAO,EAAE,SAAS,GAAG;CAErD,MAAM,UAAwB,aAAa,KAAK,SAAS,KAAK,MAAM,OAAO;CAC3E,MAAM,UAAwB,QAAQ,QAAQ,SAAS;CACvD,MAAM,YAAwB,QAAQ,SAAS,IAAI,QAAQ,QAAQ,SAAS,KAAK;AAEjF,KAAI,cAAc,QAAY,QAAO,EAAE,SAAS;AAEhD,QAAO;EAAE;EAAS;EAAW;;AAG/B,MAAM,kBAA2B,OAAyC;CAExE,MAAM,cAAwB;CAC9B,MAAM,gBAAwB,GAAG,cAAc,YAAY;CAC3D,MAAM,gBAAwB,GAAG,cAAc,CAAC,YAAY;CAC5D,MAAM,YAAwB,GAAG,cAAc,EAAE;AAQjD,QAAO;EAEL,UAA0B;EAC1B,UAA0B;EAC1B,gBAV4B,cAAc,MAAM,SAAS,KAAK,SAAS,QAAQ,EAAE,SAAS;EAW1F,kBAV4B,cAAc,MAAM,SAAS,KAAK,SAAS,UAAU,EAAE,SAAS;EAW5F,UAV4B,eAAe,cAAc;EAWzD,WAV4B,cAAc,MAAM,SAAS,KAAK,SAAS,YAAY,EAAE;EAWrF,UAV4B,UAAU,MAAM,SAAS,KAAK,SAAS,WAAW,EAAE;EAWjF;;AAGH,MAAa,0BAA0B,QAAgB,YAAqD;CAE1G,MAAM,MAAwB,qBAAqB,QAAQ,QAAQ;CACnE,MAAM,SAAwB,sBAAsB,IAAI,IAAI;AAE5D,KAAI,OAA0B,QAAO;CAGrC,MAAM,UAAwB,eADA,gBAAgB,QAAQ,QAAQ,CACd;AAEhD,uBAAsB,IAAI,KAAK,QAAQ;AAEvC,QAAO;;AAGT,MAAa,iBAAoB,QAAgB,YAA8D;CAE7G,MAAM,MAAwB,mBAAmB,QAAQ,QAAQ;CACjE,MAAM,SAAwB,gBAAgB,IAAI,IAAI;AAEtD,KAAI,OAA0B,QAAO;CAErC,MAAM,KAAwB,IAAI,KAAK,eAAe,QAAQ,QAAQ;AAEtE,iBAAgB,IAAI,KAAK,GAAG;AAE5B,QAAO;;;;;ACxHT,MAAa,iBAAoB,UAA2B;CAE1D,MAAM,YAAwB,OAAO,MAAM;AAE3C,QAAO,aAAa,UAAU,SAAS,IAAI,YAAY;;;;;ACczD,MAAM,oBAA0B;CAC9B,WAA6B,IAAI;CACjC,aAA6B,IAAI;CACjC,eAA6B,IAAI;CACjC,SAA6B,IAAI;CAClC;AAkBD,MAAM,4BAA4B,OACA,UAA+C;AAE/E,KAAI,UAAU,OAEZ;AAGF,KAAI,CAAC,OAAO,UAAU,MAAM,IAAI,QAAQ,EAEtC,OAAM,aAAa,YAAY,4BAA4B,EAAE,OAAO,CAAC;AAGvE,QAAO;;AAGT,MAAM,yBAA2B,OACA,UAAgD;AAE/E,KAAI,UAAU,OAEZ;AAGF,KAAI,CAAC,OAAO,UAAU,MAAM,IAAI,SAAS,EAEvC,OAAM,aAAa,YAAY,yBAAyB,EAAE,OAAO,CAAC;AAGpE,QAAO;;AAGT,MAAM,gBAA2B,UAAqC;AAEpE,QAAO,qBAAqB,KAAK,MAAM;;AAGzC,MAAa,oBAAoB,OACA,QAA2B,UAAe;AAEzE,KAAI,iBAAiB,IAEnB,QAAO,QAAQ,IAAI,IAAI,MAAM,GAAG;AAGlC,KAAI,OAAO,UAAU,UAAU;AAE7B,MAAI,CAAC,OAAO,SAAS,MAAM,CAEzB,OAAM,aAAa,YAAY,sBAAsB;AAGvD,SAAO,UAAU,IAAI,WAAW,IAAI,IAAI,MAAM;;AAGhD,KAAI,OAAO,UAAU,UAAU;EAE7B,MAAM,UAAuB,MAAM,MAAM;AAEzC,MAAI,CAAC,QAEH,OAAM,aAAa,YAAY,mBAAmB;AAGpD,MAAI,aAAa,QAAQ,CAEvB,QAAO;AAGT,SAAO,IAAI,IAAI,QAAQ;;AAGzB,OAAM,YAAY,YAAY,wBAAwB;;AAGxD,MAAM,mBAA2B,SAAoD;AAEnF,KAAI,CAAC,KAEH,QAAO,IAAI;AAGb,QAAO,kBAAkB;;AAkB3B,MAAa,uBAAuB,OACA,UAAoC,EAAE,KAAmB;CAE3F,MAAM,cAAwB,yBAAyB,QAAQ,aAAa,cAAc,IAAI;CAC9F,MAAM,cAAwB,yBAAyB,QAAQ,aAAa,cAAc;CAC1F,MAAM,YAAwB,sBAAsB,QAAQ,WAAW,YAAY;CACnF,MAAM,eAAwB,gBAAgB,QAAQ,aAAa;AAEnE,KAAI,gBAAgB,UAAa,cAAc,YAE7C,OAAM,aAAa,YAAY,2BAA2B;CAG5D,IAAI,WAA0B,iBAAiB,MAAM;AAErD,KAAI,cAAc,OAEhB,YAA4B,SAAS,KAAK,WAAW,aAAa;AAGpE,KAAI,gBAAgB,OAElB,YAA4B,SAAS,MAAM,aAAa,aAAa;CAGvE,MAAM,SAAwB,SAAS,GAAG,EAAE;CAC5C,MAAM,aAAwB,CAAC,UAAU,SAAS,IAAI;CAEtD,IAAI,CAAC,aACA,eAAe,iBAFU,mBAAmB,SAAS,KAAK,CAAC,CAEjB,MAAM,YAAY;AAEjE,eAA8B,YAAY,QAAQ,aAAa,KAAK;AAEpE,KAAI,CAAC,YAEH,eAA4B;AAG9B,KAAI,CAAC,QAAQ,qBAAqB,aAAa,SAAS,YAEtD,gBAA4B,aAAa,OAAO,aAAa,aAAa;AAG5E,KAAI,gBAAgB,UAAa,aAAa,SAAS,YAErD,gBAA4B,aAAa,MAAM,GAAG,YAAY;AAGhE,KAAI,QAAQ,mBAAmB;EAE7B,MAAM,UAAsB;AAE5B,SAAO,aAAa,SAAS,WAAW,aAAa,SAAS,aAAa,CAEzE,gBAA0B,aAAa,MAAM,GAAG,GAAG;;AAIvD,QAAO;EACL,KAA0B;EAC1B,SAA0B;EAC1B,UAA0B;EAC1B;EACA;EACD;;AAGH,MAAa,sBAAsB,UAA+B;CAEhE,MAAM,cAAyB,MAAM,KAAK,CAAC,EAAE;CAC7C,MAAM,WAAwB,MAAM,KAAK;CACzC,MAAM,OAAwB,MAAM,IAAI,IAAI,qBAAqB;AAEjE,KAAI,YAAY,OAAO,UAAU,UAAU,EAAE,CAE3C,QAAO;CAGT,MAAM,SAAwB,YAAY,KAAK,GAAG;CAClD,MAAM,eAAwB,WAAW;AAEzC,KAAI,gBAAgB,EAIlB,QAAO,GAAG,OAAO,eAAe,cAFJ,aAAa,OAAO,KAAK,IAAI,aAAa,CAAC,GAEjB,SAAS,QAAQ,OAAO,cAAc;AAG9F,KAAI,gBAAgB,OAAO,OAIzB,QAAO,GAAG,OAAO,SAFW,aAAa,OAAO,eAAe,OAAO,OAAO;AAQ/E,QAAO,GAAG,OAHoB,OAAO,MAAM,GAAG,aAAa,GAG5B,cAFD,OAAO,MAAM,aAAa;;AAK1D,MAAa,iBAAoB,SACA,UACA,mBAAqC;AAEpE,KAAI,CAAC,kBAAkB,SAAS,YAAY,KAAK,QAAQ,UAAU,SAAS,QAE1E,QAAO;CAGT,MAAM,SAAwB,EAAE;CAChC,MAAM,UAAwB,SAAS;CACvC,MAAM,YAAwB,SAAS,aAAa;CACpD,IAAI,QAA0B,QAAQ;CACtC,IAAI,aAA0B;AAE9B,QAAO,QAAQ,GAAG;EAEhB,MAAM,OAAsB,aAAa,UAAU;AAEnD,MAAI,QAAQ,GAAG;AAEb,UAAO,QAAQ,QAAQ,MAAM,GAAG,MAAM,CAAC;AACvC;;EAGF,MAAM,QAAsB,KAAK,IAAI,QAAQ,MAAM,EAAE;AAErD,SAAO,QAAQ,QAAQ,MAAM,OAAO,MAAM,CAAC;AAC3C,UAA4B;AAE5B,MAAI,SAAS,EAEX;AAGF,eAA4B;;AAG9B,QAAO,OAAO,KAAK,SAAS,UAAU;;;;;AC5OxC,MAAM,2BAAqD;CAEzD,GAA4B,IAAI,IAAI,IAAM;CAC1C,GAA4B,IAAI,IAAI,IAAU;CAC9C,GAA4B,IAAI,IAAI,IAAc;CAClD,GAA4B,IAAI,IAAI,aAAkB;CACvD;AAED,MAAM,yBAAsD;CAE1D,GAA4B;CAC5B,GAA4B;CAC5B,GAA4B;CAC5B,GAA4B;CAC7B;AAED,MAAM,wCAA0B,IAAI,SAAiD;AACrF,MAAM,yBAA0B;AAEhC,MAAM,mBAA0B;CAE9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAED;AAED,MAAM,qBAA0B,iBAAiB,QAAgC,KAAK,OAAO,UAAU;AAErG,KAAI,SAA0B,MAAM,UAAU;AAC9C,QAAO;GACN,EAAE,CAAC;AAEN,MAAM,qBAA2B,UAA0B,MACxD,UAAU,CACV,MAAM,GAAG,CACT,KAAK,UAAU,iBAAiB,MAAM,WAAW,EAAE,GAAG,IAAI,CAC1D,KAAK,GAAG;AAEX,MAAM,yBAA2B,UAA0B;CAEzD,IAAI,SAA0B;AAE9B,MAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EAEpD,MAAM,OAAsB,MAAM;EAClC,MAAM,SAAsB,mBAAmB;AAE/C,MAAI,WAAW,QAAW;AAExB,aAA2B;AAC3B;;EAGF,IAAI,kBAAwB;AAE5B,SAAO,QAAQ,IAAI,MAAM,QAAQ;GAG/B,MAAM,aAAoB,mBADA,MAAM,QAAQ;AAGxC,OAAI,eAAe,OAEjB;AAGF,sBAA2B;AAC3B,YAA2B;;EAG7B,MAAM,YAAsB,OAAO,gBAAgB;AAEnD,MAAI,OAAO,MAAM,UAAU,IAAI,aAAa,EAE1C;AAGF,YAA6B,IAAI,OAAO,UAAU;;AAGpD,QAAO;;AAGT,MAAM,+BAA+B,aAA6B;CAEhE,MAAM,QAAwB,gBAAgB,KAAK,SAAS;AAE5D,KAAI,CAAC,MAEH,QAAO;CAGT,MAAM,GAAG,OAAO,aAAc;AAE9B,KAAI,CAAC,aAAa,OAAO,KAAK,UAAU,CAEtC,QAAO;CAGT,MAAM,aAAwB,kBAAkB,MAAM,SAAS,EAAE;AAEjE,QAAO,GAAG,MAAM,KAAK,aAAa;;AAGpC,MAAM,mBAA2B,YACA,QACA,aACA,cAA8G;AAI7I,SAF8B,gBAAgB,YAAY,cAAc,SAAS,cAAc,OAE/F;EAEE,KAAK,cAAc,OAAa,QAAO,aAAa,qBAAqB;EACzE,KAAK,cAAc,WAAa,QAAO,aAAa,qBAAsB,SAAS,oBAAoB;EACvG,KAAK,cAAc,MAAa,QAAO;EACvC,KAAK,cAAc,SAAa,QAAO,aAAa,qBAAqB;EACzE,KAAK,cAAc;EACnB,QAAgC,QAAO,aAAa,qBAAqB;;;AAI7E,MAAM,wBAA2B,UACA,YAA8D;CAE7F,MAAM,OAAwB,QAAQ,cAAc,aAAa,IAAI;AAErE,KAAI,QAAQ,cAAc,MAExB,QAAO;EAAE,OAAO;EAAM,YAAY;EAAO;CAG3C,MAAM,SAAwB,OAAO,QAAQ,gBAAgB,QAAQ;AAErE,KAAI,OAEF,QAAO;EAAE,OAAO;EAAQ,YAAY;EAAM;AAG5C,KAAI,YAAY,aAAa,KAE3B,QAAO;EAAE,OAAO;EAAU,YAAY;EAAO;AAG/C,QAAO;EAAE,OAAO;EAAM,YAAY;EAAO;;AAG3C,MAAM,0BAA2B,SACA,SAAkD;CAEjF,MAAM,YAAwB,QAAQ;AAEtC,KAAI,CAAC,aAAa,UAAU,UAAU,OAEpC;CAGF,IAAI,QAA0B,sBAAsB,IAAI,QAAQ;AAEhE,KAAI,CAAC,OAAO;AAEV,0BAA4B,IAAI,KAAK;AACrC,wBAAsB,IAAI,SAAS,MAAM;;CAG3C,IAAI,aAA0B,MAAM,IAAI,KAAK;AAE7C,KAAI,CAAC,YAAY;AAEf,eAA4B,iBAAiB,UAAU,OAAQ,KAAK;AACpE,QAAM,IAAI,MAAM,WAAW;;AAG7B,QAAO;;AAGT,MAAM,kBAA2B,OACA,SACA,YAA4C;AAE3E,KAAI,CAAC,QAEH,QAAO,EAAE,OAAO;CAGlB,MAAM,MAAwB,MAAM,KAAK;AAEzC,MAAK,MAAM,QAAQ,eAAe;EAGhC,MAAM,YADsB,uBAAuB,SAAS,KAAK,IAChB,2BAA2B,KAAK;AAEjF,MAAI,IAAI,IAAI,UAAU,EAAE;GAEtB,MAAM,SAAoB,QAAQ,kBAAkB,SAAS,wBAAwB,KAAK;AAG1F,UAAO;IAAE,OAFiB,UAAU,GAAG,EAAE,GAAG,QAAQ,MAAM,IAAI,UAAU;IAEhD;IAAQ;;;AAIpC,QAAO,EAAE,OAAO;;AAGlB,MAAM,8BAA8B,SAAmC;AAErE,QAAO,yBAAyB;;AAGlC,MAAM,2BAA2B,SAAyC;AAExE,QAAO,uBAAuB;;AAGhC,MAAM,4BAA4B,SACA,UAA0D;CAE1F,MAAM,YAAsC;EAC1C;EACA,aAA0B,QAAQ,gBAAgB;EACnD;AAED,KAAI,QAAQ,eAAe,QAAQ,gBAAgB,cAAc,SAE/D,WAAU,cAAkB,QAAQ;UAE3B,CAAC,QAAQ,eAAe,QAAQ,UAEzC,WAAU,cAAkB,cAAc;AAG5C,KAAI,QAAQ,gBAAgB,OAE1B,WAAU,wBAAwB,QAAQ;AAG5C,KAAI,QAAQ,gBAAgB,OAE1B,WAAU,wBAAwB,QAAQ;AAG5C,KAAI,UAAU,kBAAkB,QAAQ,cAAc;AAEpD,YAAU,WAAkB,QAAQ;AACpC,YAAU,kBAAkB,QAAQ,cAAc,QAAQ,SAAS;;AAGrE,QAAO;;AAGT,MAAM,qBAA2B,SACA,OACA,aACA,cACA,MACA,SACA,QACA,kBACA,6BAA+C;CAC9E,MAAM,QAAwB,SAAS,qBAAqB,QAAQ,WAAW,QAAQ;CACvF,MAAM,cAAwB,QAAQ,gBAAgB;CACtD,MAAM,iBAAwB,cAAc,aAAa;EACvD,WAA0B,QAAQ;EAClC,SAA0B,QAAQ,SAAS;EAC3C,WAA0B,QAAQ,SAAS;EAC5C,EAAE,YAAY;CAEf,MAAM,cAAwB,aAAa,SAAS;CACpD,IAAI,SAA0B;CAC9B,IAAI,kBAA0B;CAC9B,IAAI;CACJ,IAAI;CACJ,IAAI,iBAA0B;CAE9B,MAAM,qBAAoC;AAExC,MAAI,CAAC,UAAU,eAEb;AAGF,YAA6B;AAC7B,mBAA4B;;CAG9B,MAAM,gCAAsC;AAE1C,MAAI,CAAC,OAEH;EAGF,MAAM,UAAsB,OAAO,QAAQ,UAAU,GAAG;AAExD,MAAI,YAAY,OAEd,UAA0B;;AAI9B,MAAK,MAAM,QAAQ,OAAO;AAExB,UAAQ,KAAK,MAAb;GAEE,KAAK;AAEH,QAAI,CAAC,iBAAiB;AAEpB,eAAuB;AACvB,uBAAsB;AAEtB,SAAI,CAAC,YAEH,eAAc;;AAGlB;GAEF,KAAK,QACH;GACF,KAAK;AAEH,QAAI,YAEF,WAAuB,QAAQ;AAEjC;GAEF,KAAK;AAEH,QAAI,aAAa;AAEf,eAAuB;AACvB,mBAAc;;AAEhB;GAEF,KAAK;AAEH,QAAI,SAAS,mBAEX,WAAuB,QAAQ,aAAa,KAAK,SAAS;AAE5D;GAEF,KAAK;AAEH,QAAI,SAAS,kBAEX,WAAuB,QAAQ,YAAY,KAAK,SAAS;AAE3D;GAEF,KAAK;AAEH,QAAI,gBAEF,eAAc;AAEhB,QAAI,qBAAqB,OAEvB,gBAAsB;KACpB,OAAkB;KAClB,YAAkB,4BAA4B;KAC/C;QAID,gBAAsB,gBAAgB,qBAAqB,KAAK,OAAO,QAAQ;AAEjF,cAAyB,aAAa;AACtC;GAEF,KAAK;AAEH,6BAAyB;AACzB,cAAyB,KAAK;AAC9B;GAEF,KAAK;AAEH,QAAI,iBAAiB,cAAc,cAAc,cAAc,QAAQ,KAAK,KAAK,MAAM,CAErF;AAEF,cAAyB,KAAK;AAC9B;GAEF;AACE,cAAyB,KAAK;AAC9B;;AAIJ,iBAA4B,KAAK;;AAGnC,eAAc;AAEd,QAAO;;AAGT,MAAM,uBAA2B,SACA,kBAA8C;CAE7E,MAAM,QAAwB,iBAAiB,QAAQ,SAAS;AAEhE,KAAI,UAAU,kBAAkB,CAAC,QAAQ,aAEvC,OAAM,QAAQ,YAAY,oBAAoB;AAGhD,QAAO;;AAGT,MAAM,yBAA2B,OACA,SACA,eACA,iBAAqC;CAEpE,MAAM,QAAwB,oBAAoB,SAAS,cAAc;CACzE,MAAM,OAAwB,iBAAiB,MAAM;CAErD,MAAM,EACJ,OAAO,QACP,WAC4B,eAJA,UAAU,gBAAgB,KAAK,MAAM,IAAI,GAAG,MAIZ,SAAS,gBAAgB,QAAQ,YAAY,KAAK;CAChH,MAAM,eAAwB,oBAAoB,QAAQ,QAAQ;CAClE,MAAM,OAAwB,gBAAgB,aAAa,YAAY,aAAa,QAAQ,QAAQ,aAAa,QAAQ,UAAU;CACnI,IAAI,cAA0B,aAAa;CAC3C,IAAI,eAA0B,aAAa;CAC3C,MAAM,SAAwB,cAAc,QAAQ,OAAO;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI,2BAA2B;AAE/B,KAAI,QAAQ,uBAAuB,CAAC,QAAQ,UAAU;EAEpD,MAAM,YAAsB,gBAAgB,KAAK,aAAa;EAC9D,MAAM,gBAAsB,YAAY;AAGxC,MAF4B,aAAa,iBAAiB,CAAC,OAAO,KAAK,cAAc,CAInF,gBAA0B,4BAA4B,aAAa;OAE9D;GAEL,MAAM,cAAoB,QAAQ,gBAAgB,SAAY,QAAQ,cAAc,yBAAyB;GAQ7G,MAAM,gBAAoB,oBAAoB,QANA;IAC5C,GAAG;IACH,aAAsB;IACtB,mBAAsB;IACvB,CAEqE;GACtE,MAAM,mBAAoB,cAAc;GACxC,MAAM,QAAoB,gBAAgB,KAAK,iBAAiB;AAEhE,OAAI,OAAO;IAET,MAAM,eAAkB,MAAM;IAC9B,IAAI,YAAoB,MAAM;AAE9B,QAAI,CAAC,OAAO,KAAK,UAAU,EAAE;KAE3B,MAAM,YAAgB,QAAQ;KAC9B,MAAM,YAAgB,QAAQ,eAAe;AAE7C,SAAI,cAAc,EAEhB,gBAAoB;UAEf;MAEL,IAAI,SAAgB;MACpB,MAAM,kBAAkB,cAAc,SAAY,KAAK,IAAI,YAAY,GAAG,EAAE,GAAG,UAAU;AAEzF,UAAI,kBAAkB,GAAG;AAEvB,WAAI,UAAU,SAAS,gBAErB,aAAgB,UAAU,OAAO,iBAAiB,IAAI;AAGxD,iBAAmB,UAAU,MAAM,GAAG,gBAAgB;;AAGxD,UAAI,cAAc,UAAa,OAAO,SAAS,WAAW;OAExD,MAAM,cAAc,YAAY,OAAO;OACvC,IAAI,cAAgB,UAAU,MAAM,gBAAgB;AAEpD,WAAI,YAAY,SAAS,YAEvB,eAAgB,YAAY,OAAO,aAAa,IAAI;AAGtD,iBAAmB,YAAY,MAAM,GAAG,YAAY;;AAGtD,UAAI,cAAc,UAAa,OAAO,SAAS,UAE7C,UAAkB,OAAO,OAAO,WAAW,IAAI;AAGjD,UAAI,QAAQ,mBAAmB;OAE7B,MAAM,UAAY,KAAK,IAAI,WAAW,eAAe,IAAI,EAAE;AAE3D,cAAO,OAAO,SAAS,KAAK,IAAI,SAAS,aAAa,OAAO,IAAI,OAAO,SAAS,IAAI,CAEnF,UAAgB,OAAO,MAAM,GAAG,GAAG;;AAIvC,qBAAoB,4BAA4B,OAAO;AACvD,oBAAoB,cAAc;;;;;;AAO5C,KAAI,QAAQ,UAAU;EAEpB,MAAM,WAAsB,QAAQ,mBAAmB,QAAQ,gBAAgB,SAAS,IACpF,QAAQ,gBAAgB,KACxB;AACJ,gBAA4B;AAC5B,iBAA4B,aAAa,SAAS,IAAI,SAAS,OAAO,aAAa,OAAO,GAAG;;AAE/F,KAAI;AAGF,YAA4B,uBAAuB,QADvB,yBAAyB,SAAS,MAAM,CACC;UAE9D,OAAO;AAEd,MAAI,EAAE,iBAAiB,eAAe,UAAU,kBAAkB,CAAC,QAAQ,aAEzE,OAAM;AAQR,YAA4B,uBAAuB,QADvB,yBAJqB;GAC/C,GAAG;GACH,cAAwB;GACzB,EACwE,eAAe,CACX;EAE7E,MAAM,UAAsB,QAAQ;EACpC,MAAM,OAAsB,QAAQ,aAAa;AAEjD,MAAI,QAAQ,cAAc,MAExB,oBAA0B;OAErB;GAEL,MAAM,eAAoB,QAAQ,gBAAgB,SAAS,QAAQ,gBAAgB;AAEnF,OAAI,cAAc;AAEhB,uBAAwB;AACxB,+BAA2B;SAI3B,oBAAwB;;;AAK9B,QAAO,kBAAkB,SAAS,OAAO,aAAa,cAAc,MAAM,SAAS,QAAQ,kBAAkB,yBAAyB;;AAGxI,MAAa,uBAAyB,OAAoB,YAA0C,sBAAsB,OAAO,QAAQ;AACzI,MAAa,yBAAyB,OAAoB,YAA0C,sBAAsB,OAAO,SAAS,eAAe;AACzJ,MAAa,wBAAyB,OAAoB,YAA0C,sBAAsB,OAAO,SAAS,cAAc;AACxJ,MAAa,wBAAyB,OAAoB,YAA0C,sBAAsB,OAAO,SAAS,QAAW,KAAK;AAE1J,MAAM,wBAA2B,OACA,cAAoC;AAEnE,KAAI,CAAC,UAAyB,QAAO;AAErC,QAAO,MAAM,MAAM,UAAU,CAAC,KAAK,GAAG;;AAGxC,MAAM,wBAA2B,MACA,YAA2C;CAE1E,IAAI,aAA0B,sBAAsB,KAAK;AAEzD,KAAI,QAAQ,eAEV,cAA4B,qBAAqB,YAAY,QAAQ,eAAe;AAGtF,cAA8B,WAAW,QAAQ,SAAS,GAAG;AAE7D,KAAI,QAAQ,oBAAoB,QAAQ,qBAAqB,IAE3D,cAA4B,WAAW,QAAQ,QAAQ,kBAAkB,IAAI;AAG/E,KAAI,QAAQ,aAAa,QAAQ,cAAc,mBAE7C,cAA4B,WAAW,MAAM,QAAQ,UAAU,CAAC,KAAK,mBAAmB;AAG1F,KAAI,QAAQ,YAAY,QAAQ,aAAa,kBAE3C,cAA4B,WAAW,MAAM,QAAQ,SAAS,CAAC,KAAK,kBAAkB;AAGxF,QAAO;;AAGT,MAAM,wBAA2B,WACA,YAAkD;CAEjF,MAAM,cAAwB,kBAAkB,UAAU;AAE1D,KAAI,CAAC,YAAyB,QAAO;CAErC,MAAM,SAAwB,SAAS;AAEvC,KAAI,QAAQ;EAKV,MAAM,iBAAsB,qBAAqB,aADrB,uBAFA,cAAc,OAAO,EACrB,yBAAyB,WAAW,EAAE,EAAE,cAAc,CACL,CACP;AAEtE,MAAI,CAAC,kBAAkB,mBAAmB,sBAAsB,mBAAmB,kBAEjF,QAAO;AAGT,MAAI;AAEF,UAAO,IAAI,eAAe,CAAC,UAAU;WAE9B,OAAO;;CAMlB,IAAI,aAA0B,sBAAsB,YAAY;AAChE,cAA8B,WAAW,QAAQ,oBAAoB,GAAG;CAExE,MAAM,UAAwB,WAAW,YAAY,IAAI;CACzD,MAAM,YAAwB,WAAW,YAAY,IAAI;AAEzD,KAAI,YAAY,MAAM,cAAc,IAAI;EAEtC,IAAI,eAAwB,KAAK,IAAI,SAAS,UAAU;EACxD,IAAI,cAAwB,iBAAiB,UAAU,MAAM;AAE7D,MAAI,YAAY,MAAM,cAAc,IAAI;AAEtC,iBAA0B,iBAAiB,UAAU,MAAM;GAC3D,MAAM,gBAAoB,gBAAqB,MAAM,MAAM;AAC3D,gBAA0B,WAAW,MAAM,cAAc,CAAC,KAAK,GAAG;aAEzD,cAAc,GAIvB,KAF0B,WAAW,MAAM,YAAY,EAAE,CAEtC,WAAW,KAAK,WAAW,MAAM,GAAG,UAAU,CAAC,QAAQ,WAAW,GAAG,CAAC,SAAS,GAAG;AAEnG,gBAAwB,WAAW,QAAQ,MAAM,GAAG;AACpD,iBAAwB;QAIxB,eAAwB;WAGjB,YAAY,GAIrB,KAF0B,WAAW,MAAM,UAAU,EAAE,CAEpC,WAAW,KAAK,WAAW,MAAM,GAAG,QAAQ,CAAC,QAAQ,WAAW,GAAG,CAAC,SAAS,GAAG;AAEjG,iBAAwB;AACxB,gBAAwB,WAAW,QAAQ,OAAO,GAAG;QAIrD,eAAwB;AAI5B,MAAI,gBAAgB,IAElB,cAA0B,WAAW,MAAM,YAAY,CAAC,KAAK,IAAI;;AAIrE,cAA8B,WAAW,QAAQ,MAAM,GAAG;AAE1D,KAAI,CAAC,cAAc,eAAe,sBAAsB,eAAe,kBAErE,QAAO;AAGT,KAAI;AAEF,SAAO,IAAI,WAAW,CAAC,UAAU;UAE1B,OAAO;AAEd,SAAO;;;AAGX,MAAa,qBAAqB,WAAmB,YAA2C,qBAAqB,WAAW,QAAQ;AAExI,MAAM,uBAA8B;AACpC,MAAM,cAA8B,IAAI,IAAI;CAAC;CAAK;CAAK;CAAK;CAAI,CAAC;AACjE,MAAM,gBAA+B,SAA0B,KAAK,KAAK,KAAK;AAE9E,MAAa,qBAAwB,cAA8B;CAEjE,IAAI,aAA0B;CAC9B,IAAI,WAA0B;AAE9B,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,EAEzC,KAAI,qBAAqB,KAAK,UAAU,GAAI,EAAE;AAE5C,eAA0B;AAC1B;;AAIJ,KAAI,eAAe,GAEjB,QAAO;AAGT,MAAK,IAAI,IAAI,UAAU,SAAS,GAAG,KAAK,YAAY,KAAK,EAEvD,KAAI,qBAAqB,KAAK,UAAU,GAAI,EAAE;AAE5C,aAA0B;AAC1B;;AAIJ,KAAI,aAAa,GAEf,QAAO;CAGT,IAAI,aAAyB;AAE7B,MAAK,IAAI,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG;EAEjD,MAAM,YAAqB,UAAU;AAErC,MAAI,aAAa,UAAU,CAEzB;AAGF,MAAI,YAAY,IAAI,UAAU,EAAE;AAE9B,gBAAyB;AACzB;;AAGF,MAAI,qBAAqB,KAAK,UAAU,CAEtC;;AAIJ,KAAI,CAAC,WAEH,MAAK,IAAI,MAAM,WAAW,GAAG,MAAM,UAAU,QAAQ,OAAO,GAAG;EAE7D,MAAM,YAAmB,UAAU;AAEnC,MAAI,aAAa,UAAU,CAEzB;AAGF,MAAI,YAAY,IAAI,UAAU,EAAE;AAE9B,gBAAuB;AACvB;;AAGF,MAAI,qBAAqB,KAAK,UAAU,CAEtC;;AAKN,QAAO,GAAG,aAAa,UAAU,MAAM,YAAY,WAAW,EAAE;;;;;ACl1BlE,MAAM,UAA2B,UAAwC;AAEvE,KAAI,iBAAiB,MAAM;EAEzB,MAAM,YAAsB,MAAM,SAAS;AAE3C,MAAI,OAAO,MAAM,UAAU,CAEzB,OAAM,aAAa,YAAY,iBAAiB;AAGlD,SAAO,IAAI,KAAK,UAAU;;AAG5B,KAAI,OAAO,UAAU,UAAU;AAE7B,MAAI,CAAC,OAAO,SAAS,MAAM,CAEzB,OAAM,aAAa,YAAY,oBAAoB;EAGrD,MAAM,OAAsB,IAAI,KAAK,MAAM;AAE3C,MAAI,OAAO,MAAM,KAAK,SAAS,CAAC,CAE9B,OAAM,aAAa,YAAY,iBAAiB;AAGlD,SAAO;;AAGT,KAAI,OAAO,UAAU,UAAU;EAE7B,MAAM,UAAsB,MAAM,MAAM;AAExC,MAAI,CAAC,QAEH,OAAM,aAAa,YAAY,gBAAgB;EAGjD,MAAM,OAAsB,IAAI,KAAK,QAAQ;AAE7C,MAAI,OAAO,MAAM,KAAK,SAAS,CAAC,CAE9B,OAAM,aAAa,YAAY,kBAAkB;AAGnD,SAAO;;AAGT,OAAM,YAAY,YAAY,qBAAqB;;AAGrD,MAAa,qBAAqB,MACA,QACA,YAAuD;CAEvF,MAAM,iBAAwB,cAAc,OAAO;CACnD,MAAM,SAAwB,OAAO,KAAK;AAG1C,QAF8B,cAAc,gBAAgB,QAAQ,CAEnD,OAAO,OAAO;;AAGjC,MAAa,iBAAoB,MACA,YAA4C;CAE3E,MAAM,SAAwB,OAAO,KAAK;AAG1C,MAF8B,SAAS,UAAU,WAElC,eASb,QAAO,GAPqB,OAAO,gBAAgB,CAOpC,GANa,OAAO,OAAO,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,CAMrD,GALI,OAAO,OAAO,YAAY,CAAM,CAAC,SAAS,GAAG,IAAI,CAK9C,GAJH,OAAO,OAAO,aAAa,CAAK,CAAC,SAAS,GAAG,IAAI,CAIrC,GAHZ,OAAO,OAAO,eAAe,CAAG,CAAC,SAAS,GAAG,IAAI,CAG1B,GAFvB,OAAO,OAAO,eAAe,CAAG,CAAC,SAAS,GAAG,IAAI;CAK/E,MAAM,MAAwB,OAAO,aAAa;CAClD,MAAM,WAAwB,IAAI,MAAM,GAAG,GAAG;AAM9C,KAAI,EAL0B,OAAO,aAAa,KAAK,KAClD,OAAO,eAAe,KAAK,KAC3B,OAAO,eAAe,KAAK,KAC3B,OAAO,oBAAoB,KAAK,GAEP,QAAO;AAKrC,QAAO,GAAG,SAAS,GAHW,IAAI,MAAM,GAAG,CACJ,QAAQ,WAAW,IAAI;;;;;AC/EhE,MAAM,2BAA2B,YAA+C;AAE9E,KAAI,QAAQ,qBAAqB,OAE/B,QAAO,QAAQ;AAGjB,KAAI,QAAQ,OAKV,QAF4B,uBADA,cAAc,QAAQ,OAAO,EACE,EAAE,OAAO,eAAe,CAAC,CAErE;AAGjB,QAAO;;AAGT,MAAM,yBAA2B,OACA,mBAA4B,gBAAwB;CAEnF,MAAM,WAAwB,MAAM,SAAS,SAAS,IAAI,GAAG,mBAAmB,MAAM,aAAa;CACnG,MAAM,UAAwB,MAAM,WAAW;AAI/C,QAF8B,GADA,MAAM,aAAa,qBAAqB,gBAC5B,UAAU;;AAKtD,MAAa,mBAAoB,OACA,UAAoC,EAAE,KAAa;AAKlF,QAAO,sBAHuB,oBAAoB,OAAO,QAAQ,EACnC,wBAAwB,QAAQ,CAEhB;;AAGhD,MAAa,oBAAoB,OACA,UAAoC,EAAE,KAAa;AAMlF,QAAO,sBAHuB,oBADA,iBAAiB,MAAM,CAAC,MAAM,IAAI,EACN,QAAQ,EACpC,wBAAwB,QAAQ,CAEhB;;AAGhD,MAAa,mBAAoB,MACA,eACA,cAAqC;CAEpE,MAAM,UAAwB,KAAK,MAAM;AAEzC,KAAI,CAAC,QAAyB,QAAO;CAErC,MAAM,aAAwB,QAAQ,aAAa;AAEnD,KAAI,WAAW;EAEb,MAAM,SAAsB,gBAAgB;AAE5C,MAAI,OAAwB,QAAO;;AAGrC,QAAO;;AAGT,MAAM,kBAA2B,OACA,cAAoC;AAOnE,KAAI,EAL0B,MAAM,SAAS,UAAU,IAClD,MAAM,SAAS,KAAK,IACpB,MAAM,SAAS,KAAK,IACpB,MAAM,SAAS,KAAI,EAEM,QAAO;AAIrC,QAAO,IAFuB,MAAM,QAAQ,MAAM,OAAK,CAEpC;;AAGrB,MAAM,oBAA2B,UAAoC;AAEnE,KAAI,UAAU,QAAQ,UAAU,OAE9B,QAAO;AAGT,KAAI,iBAAiB,KAEnB,QAAO,cAAc,MAAM;AAG7B,KAAI,OAAO,UAAU,SAEnB,QAAO,gBAAgB,MAAM;AAG/B,KAAI,OAAO,UAAU,SAEnB,QAAO;AAGT,KAAI,OAAO,UAAU,UAEnB,QAAO,QAAQ,SAAS;AAG1B,QAAO,OAAO,MAAM;;AAGtB,MAAa,YAAuB,MACA,SACA,YAAsB,KACtB,aAAsB,SAAiB;CAGzE,MAAM,QAAwB,CADA,QAAQ,KAAK,QAAQ,eAAe,IAAI,QAAQ,UAAU,CAAC,CAAC,KAAK,UAAU,CAC/D;AAE1C,MAAK,MAAM,OAAO,MAAM;EAEtB,MAAM,SAAsB,QAAQ,KAAK,QAAQ;GAE/C,MAAM,MAAoB,IAAI,SAAS,IAAI;AAI3C,UAAO,gBAHmB,IAAI,YAAY,IAAI,UAAU,IAAI,GAAG,iBAAiB,IAAI,KAC7C,eAEJ,UAAU;IAC7C;AAEF,QAAM,KAAK,OAAO,KAAK,UAAU,CAAC;;AAGpC,QAAO,GAAG,MAAM,KAAK,WAAW,GAAG;;;;;ACrJrC,MAAa,yBAA2B,QAAsB,aAA2B;AAEvF,KAAI,CAAC,UAAU,WAAW,OAAO,WAAW,EAAK,QAAO;AACxD,KAAI,CAAC,YAAY,YAAY,EAAoB,QAAO,IAAI,OAAO;AAEnE,QAAO,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,MAAM,EAAE;;AAEzD,MAAa,yBAAyB,UAAwB,aAA2B;AAEvF,KAAI,CAAC,YAAY,aAAa,OAAO,aAAa,EAAK,QAAO;AAC9D,KAAI,CAAC,YAAY,YAAY,EAA0B,QAAO,IAAI,SAAS;AAE3E,QAAO,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,CAAC,MAAM,SAAS;;AAElE,MAAa,sBAA8B,KAAmB,WAAoB,qBAA0B,sBAA2B,KAAK,SAAS;AACrJ,MAAa,sBAAyB,UAAwB,WAAoB,qBAA0B,sBAAsB,UAAU,SAAS"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/types.ts","../src/constants.ts","../src/errors.ts","../src/internal/intl-cache.ts","../src/internal/locale.ts","../src/internal/numeric.ts","../src/display.ts","../src/date.ts","../src/csv.ts","../src/time.ts","../src/big.ts"],"sourcesContent":["import { BigSource } from '@eternl/big'\n\nexport type NumericLike = BigSource\nexport type RoundingMode = 'roundDown' | 'roundHalfUp' | 'roundHalfEven' | 'roundUp'\n\nexport const NUMBER_STYLES = {\n\n decimal: 'decimal',\n currency: 'currency',\n percent: 'percent'\n\n} as const\n\nexport type NumberStyle = typeof NUMBER_STYLES[keyof typeof NUMBER_STYLES]\n\nexport const SIGN_DISPLAYS = {\n\n auto: 'auto',\n always: 'always',\n exceptZero: 'exceptZero',\n never: 'never',\n negative: 'negative'\n\n} as const\n\nexport type SignDisplay = typeof SIGN_DISPLAYS[keyof typeof SIGN_DISPLAYS]\n\nexport const COMPACT_UNITS = ['K', 'M', 'B', 'T'] as const\n\nexport type CompactUnit = typeof COMPACT_UNITS[number]\n\nexport interface CommonNumberOptions {\n\n minDecimals?: number\n maxDecimals?: number\n precision?: number\n roundingMode?: RoundingMode\n trimTrailingZeros?: boolean\n}\n\nexport interface DisplayNumberOptions extends CommonNumberOptions {\n\n locale?: string\n style?: NumberStyle\n currencyCode?: string\n useSymbol?: boolean\n customSymbols?: Record<string, string>\n compact?: boolean\n compactThresholds?: Partial<Record<CompactUnit, BigSource>>\n compactSuffixes?: Partial<Record<CompactUnit, string>>\n signDisplay?: SignDisplay\n useGrouping?: boolean\n isHidden?: boolean\n hiddenCharacter?: string\n compactDecimalZeros?: boolean\n forceSign?: boolean\n}\n\nexport interface CsvNumberOptions extends CommonNumberOptions {\n\n locale?: string\n decimalDelimiter?: string\n}\n\nexport interface CsvDateOptions {\n\n format?: 'iso' | 'utc-datetime'\n}\n\nexport type CsvRow = Record<string, unknown> | unknown[]\n\nexport interface CsvColumnSpec<T = any> {\n\n header: string\n accessor: (row: T) => unknown\n formatter?: (value: unknown) => string\n}\n\nexport interface FormatDisplayParams {\n\n locale?: string\n options: Intl.NumberFormatOptions\n}\n","import { Big } from '@eternl/big'\n\nimport {\n COMPACT_UNITS,\n CompactUnit,\n NUMBER_STYLES,\n NumberStyle,\n} from './types'\n\nexport const STYLE_DECIMAL: NumberStyle = NUMBER_STYLES.decimal\nexport const STYLE_CURRENCY: NumberStyle = NUMBER_STYLES.currency\nexport const STYLE_PERCENT: NumberStyle = NUMBER_STYLES.percent\n\nexport const DEFAULT_LOCALE = 'en-US'\n\nexport const DISPLAY_SIGNS = {\n\n minus: 'minus',\n plus: 'plus',\n none: 'none'\n\n} as const\n\nexport type DisplaySignValue = typeof DISPLAY_SIGNS[keyof typeof DISPLAY_SIGNS]\n\nexport const DISPLAY_SIGN_MINUS = DISPLAY_SIGNS.minus\nexport const DISPLAY_SIGN_PLUS = DISPLAY_SIGNS.plus\nexport const DISPLAY_SIGN_NONE = DISPLAY_SIGNS.none\n\nexport const COMPACT_ORDER: CompactUnit[] = [...COMPACT_UNITS].reverse() as CompactUnit[]\n\nexport const DEFAULT_SIGN_MINUS = '-'\nexport const DEFAULT_SIGN_PLUS = '+'\n\nexport const DECIMAL_ZERO = '0'\nexport const DECIMAL_EMPTY = ''\nexport const DECIMAL_DOT = '.'\n\nexport const BIG_ZERO = Big(0)\n\n// This is a shortcut to avoid @eternl/network-id dependency in this package.\nexport const DECIMALS_CARDANO = 6\n","export enum FormatError {\n\n NonNegativeIntegerRequired = 'nonNegativeIntegerRequired',\n PositiveIntegerRequired = 'positiveIntegerRequired',\n NumericValueNonFinite = 'numericValueNonFinite',\n NumericStringEmpty = 'numericStringEmpty',\n UnsupportedNumericInput = 'unsupportedNumericInput',\n MaxDecimalsLessThanMinimum = 'maxDecimalsLessThanMinimum',\n MissingLocale = 'missingLocale',\n MissingCurrencyCode = 'missingCurrencyCode',\n DateValueInvalid = 'dateValueInvalid',\n DateStringEmpty = 'dateStringEmpty',\n DateNumberNonFinite = 'dateNumberNonFinite',\n InvalidDateString = 'invalidDateString',\n UnsupportedDateInput = 'unsupportedDateInput'\n}\n\ntype ErrorDetails = Record<string, string>\n\ntype ErrorMessageMap = Record<FormatError, string>\n\nconst FORMAT_ERROR_MESSAGES = {\n\n [FormatError.NonNegativeIntegerRequired]: '%label% must be a non-negative integer',\n [FormatError.PositiveIntegerRequired]: '%label% must be a positive integer',\n [FormatError.NumericValueNonFinite]: 'Numeric value must be a finite number',\n [FormatError.NumericStringEmpty]: 'Numeric string cannot be empty',\n [FormatError.UnsupportedNumericInput]: 'Unsupported numeric input type',\n [FormatError.MaxDecimalsLessThanMinimum]: 'maxDecimals cannot be less than minDecimals',\n [FormatError.MissingLocale]: 'Display formatting requires a locale',\n [FormatError.MissingCurrencyCode]: 'Currency formatting requires a currencyCode',\n [FormatError.DateValueInvalid]: 'Invalid date value',\n [FormatError.DateStringEmpty]: 'Date string cannot be empty',\n [FormatError.DateNumberNonFinite]: 'Date number must be finite',\n [FormatError.InvalidDateString]: 'Invalid date string',\n [FormatError.UnsupportedDateInput]: 'Unsupported date input type'\n\n} satisfies ErrorMessageMap\n\nconst applyDetails = (template: string,\n details?: ErrorDetails): string => {\n\n if (!details) { return template }\n\n return Object.keys(details).reduce((message, key) => message.replace(new RegExp(`%${key}%`, 'g'), details[key]), template)\n}\n\nexport const getFormatErrorMessage = (code: FormatError,\n details?: ErrorDetails): string => applyDetails(FORMAT_ERROR_MESSAGES[code], details)\n\nexport const toRangeError = (code: FormatError, details?: ErrorDetails): RangeError => new RangeError(getFormatErrorMessage(code, details))\nexport const toTypeError = (code: FormatError, details?: ErrorDetails): TypeError => new TypeError(getFormatErrorMessage(code, details))\nexport const toError = (code: FormatError, details?: ErrorDetails): Error => new Error(getFormatErrorMessage(code, details))\n","interface GroupingMetadata {\n\n primary: number\n secondary?: number\n}\n\nexport interface FormatPattern {\n\n positive: Intl.NumberFormatPart[]\n negative: Intl.NumberFormatPart[]\n groupSeparator: string\n decimalSeparator: string\n grouping: GroupingMetadata\n minusSign?: string\n plusSign?: string\n}\n\nconst numberFormatCache = new Map<string, Intl.NumberFormat>()\nconst numberFormatMetaCache = new Map<string, FormatPattern>()\nconst dateFormatCache = new Map<string, Intl.DateTimeFormat>()\n\nconst serializeOptions = (options: Intl.NumberFormatOptions | Intl.DateTimeFormatOptions): string => {\n\n const entries = Object.entries(options)\n .filter( ([, value]) => value !== undefined )\n .sort( ([a], [b]) => (a < b ? -1 : a > b ? 1 : 0) )\n .map( ([key, value]) => {\n\n if (value\n && typeof value === 'object'\n && !Array.isArray(value)) { return `${key}:{${serializeOptions(value as Intl.NumberFormatOptions)}}` }\n if (Array.isArray(value)) { return `${key}:[${value.join('|')}]` }\n\n return `${key}:${String(value)}`\n } )\n\n return entries.join(',')\n}\n\nconst buildNumberFormatKey = (locale: string, options: Intl.NumberFormatOptions): string => `${locale}|${serializeOptions(options)}`\nconst buildDateFormatKey = (locale: string, options?: Intl.DateTimeFormatOptions): string => `${locale}|${options ? serializeOptions(options) : ''}`\n\nexport const getNumberFormat = (locale: string, options: Intl.NumberFormatOptions): Intl.NumberFormat => {\n\n const key = buildNumberFormatKey(locale, options)\n const cached = numberFormatCache.get(key)\n\n if (cached) { return cached }\n\n const nf = new Intl.NumberFormat(locale, options)\n\n numberFormatCache.set(key, nf)\n\n return nf\n}\n\nconst deriveGrouping = (parts: Intl.NumberFormatPart[]): GroupingMetadata => {\n\n const integerParts = parts.filter((part) => part.type === 'integer')\n\n if (integerParts.length <= 1) { return { primary: 0 } }\n\n const lengths = integerParts.map((part) => part.value.length)\n const primary = lengths[lengths.length - 1]\n const secondary = lengths.length > 1 ? lengths[lengths.length - 2] : undefined\n\n if (secondary === primary) { return { primary } }\n\n return { primary, secondary }\n}\n\nconst analyzePattern = (nf: Intl.NumberFormat): FormatPattern => {\n\n const sampleValue = 1234567.89123456\n const positiveParts = nf.formatToParts(sampleValue)\n const negativeParts = nf.formatToParts(-sampleValue)\n const plusProbe = nf.formatToParts(1)\n\n const groupSeparator = positiveParts.find((part) => part.type === 'group')?.value ?? ''\n const decimalSeparator = positiveParts.find((part) => part.type === 'decimal')?.value ?? '.'\n const grouping = deriveGrouping(positiveParts)\n const minusSign = negativeParts.find((part) => part.type === 'minusSign')?.value\n const plusSign = plusProbe.find((part) => part.type === 'plusSign')?.value\n\n return {\n\n positive: positiveParts,\n negative: negativeParts,\n groupSeparator,\n decimalSeparator,\n grouping,\n minusSign,\n plusSign\n }\n}\n\nexport const getNumberFormatPattern = (locale: string, options: Intl.NumberFormatOptions): FormatPattern => {\n\n const key = buildNumberFormatKey(locale, options)\n const cached = numberFormatMetaCache.get(key)\n\n if (cached) { return cached }\n\n const nf = getNumberFormat(locale, options)\n const pattern = analyzePattern(nf)\n\n numberFormatMetaCache.set(key, pattern)\n\n return pattern\n}\n\nexport const getDateFormat = (locale: string, options?: Intl.DateTimeFormatOptions): Intl.DateTimeFormat => {\n\n const key = buildDateFormatKey(locale, options)\n const cached = dateFormatCache.get(key)\n\n if (cached) { return cached }\n\n const df = new Intl.DateTimeFormat(locale, options)\n\n dateFormatCache.set(key, df)\n\n return df\n}\n","import { DEFAULT_LOCALE } from '../constants'\n\nexport const resolveLocale = (value?: string): string => {\n\n const candidate = value?.trim()\n\n return candidate && candidate.length > 0 ? candidate : DEFAULT_LOCALE\n}\n","import { Big } from '@eternl/big'\n\nimport {\n BIG_ZERO,\n DECIMAL_DOT,\n DECIMAL_EMPTY,\n DECIMAL_ZERO,\n DEFAULT_SIGN_MINUS,\n} from '../constants'\nimport {\n FormatError,\n toRangeError,\n toTypeError,\n} from '../errors'\nimport {\n CommonNumberOptions,\n NumericLike,\n RoundingMode,\n} from '../types'\n\nconst ROUNDING_MODE_MAP = {\n roundDown: Big.roundDown,\n roundHalfUp: Big.roundHalfUp,\n roundHalfEven: Big.roundHalfEven,\n roundUp: Big.roundUp\n} satisfies Record<RoundingMode, Big.RoundingMode>\n\nexport interface NumericParts {\n\n big: Big\n integer: string\n fraction: string\n isNegative: boolean\n isZero: boolean\n}\n\nexport interface GroupingConfig {\n\n separator: string\n primary: number\n secondary?: number\n}\n\nconst assertNonNegativeInteger = (value: number | undefined,\n label: string): number | undefined => {\n\n if (value === undefined) {\n\n return undefined\n }\n\n if (!Number.isInteger(value) || value < 0) {\n\n throw toRangeError(FormatError.NonNegativeIntegerRequired, { label })\n }\n\n return value\n}\n\nconst assertPositiveInteger = (value: number | undefined,\n label: string): number | undefined => {\n\n if (value === undefined) {\n\n return undefined\n }\n\n if (!Number.isInteger(value) || value <= 0) {\n\n throw toRangeError(FormatError.PositiveIntegerRequired, { label })\n }\n\n return value\n}\n\nconst isZeroString = (input: string): boolean => {\n\n return /^[-+]?0+(?:\\.0+)?$/.test(input)\n}\n\nexport const normalizeNumeric = (value: NumericLike,\n clone: boolean = false): Big => {\n\n if (value instanceof Big) {\n\n return clone ? new Big(value) : value\n }\n\n if (typeof value === 'number') {\n\n if (!Number.isFinite(value)) {\n\n throw toRangeError(FormatError.NumericValueNonFinite)\n }\n\n return value === 0 ? BIG_ZERO : new Big(value)\n }\n\n if (typeof value === 'string') {\n\n const trimmed = value.trim()\n\n if (!trimmed) {\n\n throw toRangeError(FormatError.NumericStringEmpty)\n }\n\n if (isZeroString(trimmed)) {\n\n return BIG_ZERO\n }\n\n return new Big(trimmed)\n }\n\n throw toTypeError(FormatError.UnsupportedNumericInput)\n}\n\nconst mapRoundingMode = (mode?: RoundingMode): Big.RoundingMode => {\n\n if (!mode) {\n\n return Big.roundHalfUp\n }\n\n return ROUNDING_MODE_MAP[mode]\n}\n\nexport const toFixedNoSci = (value: Big,\n fractionDigits?: number,\n roundingMode?: RoundingMode): string => {\n\n const rm = mapRoundingMode(roundingMode)\n let working = value\n\n if (fractionDigits !== undefined) {\n\n working = working.round(fractionDigits, rm)\n }\n\n return bigToDecimalString(working)\n}\n\nexport const computeNumericParts = (value: NumericLike,\n options: CommonNumberOptions = {}): NumericParts => {\n\n const minDecimals = assertNonNegativeInteger(options.minDecimals, 'minDecimals') ?? 0\n const maxDecimals = assertNonNegativeInteger(options.maxDecimals, 'maxDecimals')\n const precision = assertPositiveInteger(options.precision, 'precision')\n const roundingMode = mapRoundingMode(options.roundingMode)\n\n if (maxDecimals !== undefined && maxDecimals < minDecimals) {\n\n throw toRangeError(FormatError.MaxDecimalsLessThanMinimum)\n }\n\n let bigValue = normalizeNumeric(value)\n\n if (precision !== undefined) {\n\n bigValue = bigValue.prec(precision, roundingMode)\n }\n\n if (maxDecimals !== undefined) {\n\n bigValue = bigValue.round(maxDecimals, roundingMode)\n }\n\n const isZero = bigValue.eq(0)\n const isNegative = !isZero && bigValue.s < 0\n const canonical = bigToDecimalString(bigValue.abs())\n let [integerPart,\n fractionPart = DECIMAL_EMPTY] = canonical.split(DECIMAL_DOT)\n\n integerPart = integerPart.replace(/^(0+)(\\d)/, '$2')\n\n if (!integerPart) {\n\n integerPart = DECIMAL_ZERO\n }\n\n if (!options.trimTrailingZeros && fractionPart.length < minDecimals) {\n\n fractionPart = fractionPart.padEnd(minDecimals, DECIMAL_ZERO)\n }\n\n if (maxDecimals !== undefined && fractionPart.length > maxDecimals) {\n\n fractionPart = fractionPart.slice(0, maxDecimals)\n }\n\n if (options.trimTrailingZeros) {\n\n const minKeep = minDecimals\n\n while (fractionPart.length > minKeep && fractionPart.endsWith(DECIMAL_ZERO)) {\n\n fractionPart = fractionPart.slice(0, -1)\n }\n }\n\n return {\n big: bigValue,\n integer: integerPart,\n fraction: fractionPart,\n isNegative,\n isZero\n }\n}\n\nexport const bigToDecimalString = (value: Big): string => {\n\n const coefficient = (value.c ?? [0]) as number[]\n const exponent = value.e ?? 0\n const sign = value.s < 0 ? DEFAULT_SIGN_MINUS : DECIMAL_EMPTY\n\n if (coefficient.every((digit) => digit === 0)) {\n\n return DECIMAL_ZERO\n }\n\n const digits = coefficient.join('')\n const decimalIndex = exponent + 1\n\n if (decimalIndex <= 0) {\n\n const zeros = DECIMAL_ZERO.repeat(Math.abs(decimalIndex))\n\n return `${sign}${DECIMAL_ZERO}${DECIMAL_DOT}${zeros}${digits}`.replace(/\\.$/, DECIMAL_EMPTY)\n }\n\n if (decimalIndex >= digits.length) {\n\n const zeros = DECIMAL_ZERO.repeat(decimalIndex - digits.length)\n\n return `${sign}${digits}${zeros}`\n }\n\n const integerPart = digits.slice(0, decimalIndex)\n const fractionPart = digits.slice(decimalIndex)\n\n return `${sign}${integerPart}${DECIMAL_DOT}${fractionPart}`\n}\n\nexport const applyGrouping = (integer: string,\n grouping: GroupingConfig,\n enableGrouping: boolean): string => {\n\n if (!enableGrouping || grouping.primary === 0 || integer.length <= grouping.primary) {\n\n return integer\n }\n\n const groups = [] as string[]\n const primary = grouping.primary\n const secondary = grouping.secondary ?? primary\n let index = integer.length\n let usePrimary = true\n\n while (index > 0) {\n\n const size = usePrimary ? primary : secondary\n\n if (size <= 0) {\n\n groups.unshift(integer.slice(0, index))\n break\n }\n\n const start = Math.max(index - size, 0)\n\n groups.unshift(integer.slice(start, index))\n index = start\n\n if (index <= 0) {\n\n break\n }\n\n usePrimary = false\n }\n\n return groups.join(grouping.separator)\n}\n","import { Big } from '@eternl/big'\n\nimport {\n COMPACT_ORDER,\n DEFAULT_SIGN_MINUS,\n DEFAULT_SIGN_PLUS,\n DISPLAY_SIGN_MINUS,\n DISPLAY_SIGN_NONE,\n DISPLAY_SIGN_PLUS,\n STYLE_CURRENCY,\n STYLE_DECIMAL,\n STYLE_PERCENT,\n} from './constants'\nimport {\n FormatError,\n toError,\n} from './errors'\nimport {\n FormatPattern,\n getNumberFormatPattern,\n} from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport {\n applyGrouping,\n computeNumericParts,\n normalizeNumeric,\n} from './internal/numeric'\nimport {\n CompactUnit,\n DisplayNumberOptions,\n NumberStyle,\n NumericLike,\n SIGN_DISPLAYS,\n SignDisplay,\n} from './types'\n\ninterface CompactResult {\n value: Big\n suffix?: string\n}\n\ninterface CurrencyResolution {\n value: string\n fromCustom: boolean\n}\n\nconst defaultCompactThresholds: Record<CompactUnit, Big> = {\n\n K: new Big(1_000),\n M: new Big(1_000_000),\n B: new Big(1_000_000_000),\n T: new Big(1_000_000_000_000)\n}\n\nconst defaultCompactSuffixes: Record<CompactUnit, string> = {\n\n K: 'K',\n M: 'M',\n B: 'B',\n T: 'T'\n}\n\nconst compactThresholdCache = new WeakMap<DisplayNumberOptions, Map<string, Big>>()\nconst COMPACT_DECIMAL_BUFFER = 12\n\nconst SUBSCRIPT_DIGITS = [\n\n '₀',\n '₁',\n '₂',\n '₃',\n '₄',\n '₅',\n '₆',\n '₇',\n '₈',\n '₉'\n\n] as const\n\nconst SUBSCRIPT_TO_DIGIT = SUBSCRIPT_DIGITS.reduce<Record<string, string>>((acc, digit, index) => {\n\n acc[digit] = index.toString()\n return acc\n}, {})\n\nconst toSubscriptNumber = (value: number): string => value\n .toString()\n .split('')\n .map((digit) => SUBSCRIPT_DIGITS[digit.charCodeAt(0) - 48])\n .join('')\n\nconst expandSubscriptDigits = (value: string): string => {\n\n let result = ''\n\n for (let index = 0; index < value.length; index += 1) {\n\n const char = value[index]!\n const mapped = SUBSCRIPT_TO_DIGIT[char]\n\n if (mapped === undefined) {\n\n result += char\n continue\n }\n\n let subscriptBuffer = mapped\n\n while (index + 1 < value.length) {\n\n const nextChar = value[index + 1]!\n const nextMapped = SUBSCRIPT_TO_DIGIT[nextChar]\n\n if (nextMapped === undefined) {\n\n break\n }\n\n subscriptBuffer += nextMapped\n index += 1\n }\n\n const zeroCount = Number(subscriptBuffer)\n\n if (Number.isNaN(zeroCount) || zeroCount <= 0) {\n\n continue\n }\n\n result += '0'.repeat(zeroCount)\n }\n\n return result\n}\n\nconst compactFractionLeadingZeros = (fraction: string): string => {\n\n const match = /^(0{2,})(.+)$/.exec(fraction)\n\n if (!match) {\n\n return fraction\n }\n\n const [, zeros, remainder] = match\n\n if (!remainder || /^0+$/.test(remainder)) {\n\n return fraction\n }\n\n const annotation = toSubscriptNumber(zeros.length - 1)\n\n return `${zeros[0]}${annotation}${remainder}`\n}\n\nconst resolveSignKind = (isNegative: boolean,\n isZero: boolean,\n signDisplay?: SignDisplay,\n forceSign?: boolean): typeof DISPLAY_SIGN_MINUS | typeof DISPLAY_SIGN_PLUS | typeof DISPLAY_SIGN_NONE => {\n\n const mode = signDisplay ?? (forceSign ? SIGN_DISPLAYS.always : SIGN_DISPLAYS.auto)\n\n switch (mode) {\n\n case SIGN_DISPLAYS.always: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_PLUS\n case SIGN_DISPLAYS.exceptZero: return isNegative ? DISPLAY_SIGN_MINUS : (isZero ? DISPLAY_SIGN_NONE : DISPLAY_SIGN_PLUS)\n case SIGN_DISPLAYS.never: return DISPLAY_SIGN_NONE\n case SIGN_DISPLAYS.negative: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_NONE\n case SIGN_DISPLAYS.auto:\n default: return isNegative ? DISPLAY_SIGN_MINUS : DISPLAY_SIGN_NONE\n }\n}\n\nconst resolveCurrencyToken = (template: string,\n options: DisplayNumberOptions): CurrencyResolution => {\n\n const code = options.currencyCode?.toUpperCase() ?? ''\n\n if (options.useSymbol === false) {\n\n return { value: code, fromCustom: false }\n }\n\n const custom = code ? options.customSymbols?.[code] : undefined\n\n if (custom) {\n\n return { value: custom, fromCustom: true }\n }\n\n if (template && template !== code) {\n\n return { value: template, fromCustom: false }\n }\n\n return { value: code, fromCustom: false }\n}\n\nconst getNormalizedThreshold = (options: DisplayNumberOptions,\n unit: CompactUnit): Big | undefined => {\n\n const overrides = options.compactThresholds\n\n if (!overrides || overrides[unit] === undefined) {\n\n return undefined\n }\n\n let cache = compactThresholdCache.get(options)\n\n if (!cache) {\n\n cache = new Map()\n compactThresholdCache.set(options, cache)\n }\n\n let normalized = cache.get(unit)\n\n if (!normalized) {\n\n normalized = normalizeNumeric(overrides[unit]!, true)\n cache.set(unit, normalized)\n }\n\n return normalized\n}\n\nconst resolveCompact = (value: Big,\n options: DisplayNumberOptions,\n enabled: boolean): CompactResult => {\n\n if (!enabled) {\n\n return { value }\n }\n\n const abs = value.abs()\n\n for (const unit of COMPACT_ORDER) {\n\n const overrideThreshold = getNormalizedThreshold(options, unit)\n const threshold = overrideThreshold ?? getDefaultCompactThreshold(unit)\n\n if (abs.gte(threshold)) {\n\n const suffix = options.compactSuffixes?.[unit] ?? getDefaultCompactSuffix(unit)\n const scaled = threshold.eq(0) ? value : value.div(threshold)\n\n return { value: scaled, suffix }\n }\n }\n\n return { value }\n}\n\nconst getDefaultCompactThreshold = (unit: CompactUnit): Big => {\n\n return defaultCompactThresholds[unit as keyof typeof defaultCompactThresholds]\n}\n\nconst getDefaultCompactSuffix = (unit: CompactUnit): string => {\n\n return defaultCompactSuffixes[unit as keyof typeof defaultCompactSuffixes]\n}\n\nconst buildNumberFormatOptions = (options: DisplayNumberOptions,\n style: NumberStyle): Intl.NumberFormatOptions => {\n\n const nfOptions: Intl.NumberFormatOptions = {\n style,\n useGrouping: options.useGrouping !== false\n }\n\n if (options.signDisplay && options.signDisplay !== SIGN_DISPLAYS.negative) {\n\n nfOptions.signDisplay = options.signDisplay\n\n } else if (!options.signDisplay && options.forceSign) {\n\n nfOptions.signDisplay = SIGN_DISPLAYS.always\n }\n\n if (options.minDecimals !== undefined) {\n\n nfOptions.minimumFractionDigits = options.minDecimals\n }\n\n if (options.maxDecimals !== undefined) {\n\n nfOptions.maximumFractionDigits = options.maxDecimals\n }\n\n if (style === STYLE_CURRENCY && options.currencyCode) {\n\n nfOptions.currency = options.currencyCode\n nfOptions.currencyDisplay = options.useSymbol === false ? 'code' : 'symbol'\n }\n\n return nfOptions\n}\n\nconst formatFromPattern = (options: DisplayNumberOptions,\n style: NumberStyle,\n integerPart: string,\n fractionPart: string,\n sign: typeof DISPLAY_SIGN_MINUS | typeof DISPLAY_SIGN_PLUS | typeof DISPLAY_SIGN_NONE,\n pattern: FormatPattern,\n suffix?: string,\n currencyOverride?: string,\n currencyOverrideIsCustom?: boolean): string => {\n const parts = sign === DISPLAY_SIGN_MINUS ? pattern.negative : pattern.positive\n const useGrouping = options.useGrouping !== false\n const groupedInteger = applyGrouping(integerPart, {\n separator: pattern.groupSeparator,\n primary: pattern.grouping.primary,\n secondary: pattern.grouping.secondary\n }, useGrouping)\n\n const hasFraction = fractionPart.length > 0\n let result = ''\n let integerInjected = false\n let currencyMeta: CurrencyResolution | undefined\n let previousType: Intl.NumberFormatPart['type'] | undefined\n let suffixInjected = false\n\n const appendSuffix = (): void => {\n\n if (!suffix || suffixInjected) {\n\n return\n }\n\n result += suffix\n suffixInjected = true\n }\n\n const stripTrailingWhitespace = (): void => {\n\n if (!result) {\n\n return\n }\n\n const trimmed = result.replace(/\\s+$/gu, '')\n\n if (trimmed !== result) {\n\n result = trimmed\n }\n }\n\n for (const part of parts) {\n\n switch (part.type) {\n\n case 'integer': {\n\n if (!integerInjected) {\n\n result += groupedInteger\n integerInjected = true\n\n if (!hasFraction) {\n\n appendSuffix()\n }\n }\n break\n }\n case 'group':\n break\n case 'decimal': {\n\n if (hasFraction) {\n\n result += pattern.decimalSeparator\n }\n break\n }\n case 'fraction': {\n\n if (hasFraction) {\n\n result += fractionPart\n appendSuffix()\n }\n break\n }\n case 'minusSign': {\n\n if (sign === DISPLAY_SIGN_MINUS) {\n\n result += pattern.minusSign ?? part.value ?? DEFAULT_SIGN_MINUS\n }\n break\n }\n case 'plusSign': {\n\n if (sign === DISPLAY_SIGN_PLUS) {\n\n result += pattern.plusSign ?? part.value ?? DEFAULT_SIGN_PLUS\n }\n break\n }\n case 'currency': {\n\n if (integerInjected) {\n\n appendSuffix()\n }\n if (currencyOverride !== undefined) {\n\n currencyMeta = {\n value: currencyOverride,\n fromCustom: currencyOverrideIsCustom ?? false\n }\n\n } else {\n\n currencyMeta = currencyMeta ?? resolveCurrencyToken(part.value, options)\n }\n result += currencyMeta.value\n break\n }\n case 'percentSign': {\n\n stripTrailingWhitespace()\n result += part.value\n break\n }\n case 'literal': {\n\n if (previousType === 'currency' && currencyMeta?.fromCustom && /^\\s+$/.test(part.value)) {\n\n break\n }\n result += part.value\n break\n }\n default: {\n result += part.value\n break\n }\n }\n\n previousType = part.type\n }\n\n appendSuffix()\n\n return result\n}\n\nconst resolveDisplayStyle = (options: DisplayNumberOptions,\n overrideStyle?: NumberStyle): NumberStyle => {\n\n const style = overrideStyle ?? options.style ?? STYLE_DECIMAL\n\n if (style === STYLE_CURRENCY && !options.currencyCode) {\n\n throw toError(FormatError.MissingCurrencyCode)\n }\n\n return style\n}\n\nconst formatDisplayInternal = (value: NumericLike,\n options: DisplayNumberOptions,\n styleOverride?: NumberStyle,\n forceCompact?: boolean): string => {\n\n const style = resolveDisplayStyle(options, styleOverride)\n const base = normalizeNumeric(value)\n const percentAdjusted = style === STYLE_PERCENT ? base.times(100) : base\n const {\n value: scaled,\n suffix\n } = resolveCompact(percentAdjusted, options, forceCompact ?? options.compact === true)\n const numericParts = computeNumericParts(scaled, options)\n const sign = resolveSignKind(numericParts.isNegative, numericParts.isZero, options.signDisplay, options.forceSign)\n let integerPart = numericParts.integer\n let fractionPart = numericParts.fraction\n const locale = resolveLocale(options.locale)\n let pattern: FormatPattern\n let currencyOverride: string | undefined\n let currencyOverrideIsCustom = false\n\n if (options.compactDecimalZeros && !options.isHidden) {\n\n const baseMatch = /^(0{2,})(.+)$/.exec(fractionPart)\n const baseRemainder = baseMatch?.[2]\n const hasBaseDigits = baseMatch && baseRemainder && !/^0+$/.test(baseRemainder)\n\n if (hasBaseDigits) {\n\n fractionPart = compactFractionLeadingZeros(fractionPart)\n\n } else {\n\n const extendedMax = options.maxDecimals !== undefined ? options.maxDecimals + COMPACT_DECIMAL_BUFFER : undefined\n\n const extendedOptions: DisplayNumberOptions = {\n ...options,\n maxDecimals: extendedMax,\n trimTrailingZeros: false\n }\n\n const extendedParts = computeNumericParts(scaled, extendedOptions)\n const extendedFraction = extendedParts.fraction\n const match = /^(0{2,})(.+)$/.exec(extendedFraction)\n\n if (match) {\n\n const zerosPortion = match[1]\n let remainder = match[2]\n\n if (!/^0+$/.test(remainder)) {\n\n const targetMax = options.maxDecimals\n const targetMin = options.minDecimals ?? 0\n\n if (targetMax === 0) {\n\n fractionPart = ''\n\n } else {\n\n let digits = zerosPortion\n const remainderNeeded = targetMax !== undefined ? Math.max(targetMax - 1, 0) : remainder.length\n\n if (remainderNeeded > 0) {\n\n if (remainder.length < remainderNeeded) {\n\n remainder = remainder.padEnd(remainderNeeded, '0')\n }\n\n digits += remainder.slice(0, remainderNeeded)\n }\n\n if (targetMax === undefined && digits.length < targetMin) {\n\n const extraNeeded = targetMin - digits.length\n let extraSource = remainder.slice(remainderNeeded)\n\n if (extraSource.length < extraNeeded) {\n\n extraSource = extraSource.padEnd(extraNeeded, '0')\n }\n\n digits += extraSource.slice(0, extraNeeded)\n }\n\n if (targetMax !== undefined && digits.length < targetMin) {\n\n digits = digits.padEnd(targetMin, '0')\n }\n\n if (options.trimTrailingZeros) {\n\n const minKeep = Math.max(targetMin, zerosPortion ? 1 : 0)\n\n while (digits.length > Math.max(minKeep, zerosPortion.length) && digits.endsWith('0')) {\n\n digits = digits.slice(0, -1)\n }\n }\n\n fractionPart = compactFractionLeadingZeros(digits)\n integerPart = extendedParts.integer\n }\n }\n }\n }\n }\n\n if (options.isHidden) {\n\n const maskChar = options.hiddenCharacter && options.hiddenCharacter.length > 0\n ? options.hiddenCharacter[0]\n : '*'\n integerPart = maskChar\n fractionPart = fractionPart.length > 0 ? maskChar.repeat(fractionPart.length) : fractionPart\n }\n try {\n\n const nfOptions = buildNumberFormatOptions(options, style)\n pattern = getNumberFormatPattern(locale, nfOptions)\n\n } catch (error) {\n\n if (!(error instanceof RangeError) || style !== STYLE_CURRENCY || !options.currencyCode) {\n\n throw error\n }\n\n const placeholderOptions: DisplayNumberOptions = {\n ...options,\n currencyCode: 'USD'\n }\n const nfOptionsFallback = buildNumberFormatOptions(placeholderOptions, STYLE_CURRENCY)\n pattern = getNumberFormatPattern(locale, nfOptionsFallback)\n\n const rawCode = options.currencyCode\n const code = rawCode.toUpperCase()\n\n if (options.useSymbol === false) {\n\n currencyOverride = rawCode\n\n } else {\n\n const customSymbol = options.customSymbols?.[code] ?? options.customSymbols?.[rawCode]\n\n if (customSymbol) {\n\n currencyOverride = customSymbol\n currencyOverrideIsCustom = true\n\n } else {\n\n currencyOverride = rawCode\n }\n }\n }\n\n return formatFromPattern(options, style, integerPart, fractionPart, sign, pattern, suffix, currencyOverride, currencyOverrideIsCustom)\n}\n\nexport const formatDisplayNumber = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options)\nexport const formatDisplayCurrency = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, STYLE_CURRENCY)\nexport const formatDisplayPercent = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, STYLE_PERCENT)\nexport const formatDisplayCompact = (value: NumericLike, options: DisplayNumberOptions): string => formatDisplayInternal(value, options, undefined, true)\n\nconst stripGroupSeparators = (value: string,\n separator: string): string => {\n\n if (!separator) { return value }\n\n return value.split(separator).join('')\n}\n\nconst normalizeNumericCore = (core: string,\n pattern: FormatPattern): string => {\n\n let normalized = expandSubscriptDigits(core)\n\n if (pattern.groupSeparator) {\n\n normalized = stripGroupSeparators(normalized, pattern.groupSeparator)\n }\n\n normalized = normalized.replace(/\\s+/gu, '')\n\n if (pattern.decimalSeparator && pattern.decimalSeparator !== '.') {\n\n normalized = normalized.replace(pattern.decimalSeparator, '.')\n }\n\n if (pattern.minusSign && pattern.minusSign !== DEFAULT_SIGN_MINUS) {\n\n normalized = normalized.split(pattern.minusSign).join(DEFAULT_SIGN_MINUS)\n }\n\n if (pattern.plusSign && pattern.plusSign !== DEFAULT_SIGN_PLUS) {\n\n normalized = normalized.split(pattern.plusSign).join(DEFAULT_SIGN_PLUS)\n }\n\n return normalized\n}\n\nconst parseDisplayInternal = (formatted: string,\n options?: DisplayNumberOptions): number => {\n\n const numericCore = extractNumberCore(formatted)\n\n if (!numericCore) { return Number.NaN }\n\n const locale = options?.locale\n\n if (locale) {\n\n const resolvedLocale = resolveLocale(locale)\n const nfOptions = buildNumberFormatOptions(options ?? {}, STYLE_DECIMAL)\n const pattern = getNumberFormatPattern(resolvedLocale, nfOptions)\n const normalizedCore = normalizeNumericCore(numericCore, pattern)\n\n if (!normalizedCore || normalizedCore === DEFAULT_SIGN_MINUS || normalizedCore === DEFAULT_SIGN_PLUS) {\n\n return Number.NaN\n }\n\n try {\n\n return Big(normalizedCore).toNumber()\n\n } catch (error) {\n\n // fall back to locale-agnostic heuristics below when locale pattern parsing fails\n }\n }\n\n let normalized = expandSubscriptDigits(numericCore)\n normalized = normalized.replace(/['’`_\\s\\u00A0]/gu, '')\n\n const lastDot = normalized.lastIndexOf('.')\n const lastComma = normalized.lastIndexOf(',')\n\n if (lastDot !== -1 || lastComma !== -1) {\n\n let decimalIndex = Math.max(lastDot, lastComma)\n let decimalChar = decimalIndex === lastDot ? '.' : ','\n\n if (lastDot !== -1 && lastComma !== -1) {\n\n decimalChar = decimalIndex === lastDot ? '.' : ','\n const thousandsChar = decimalChar === '.' ? ',' : '.'\n normalized = normalized.split(thousandsChar).join('')\n\n } else if (lastComma !== -1) {\n\n const fractionalPart = normalized.slice(lastComma + 1)\n\n if (fractionalPart.length === 3 && normalized.slice(0, lastComma).replace(/[^0-9]/g, '').length > 3) {\n\n normalized = normalized.replace(/,/g, '')\n decimalChar = '.'\n\n } else {\n\n decimalChar = ','\n }\n\n } else if (lastDot !== -1) {\n\n const fractionalPart = normalized.slice(lastDot + 1)\n\n if (fractionalPart.length === 3 && normalized.slice(0, lastDot).replace(/[^0-9]/g, '').length > 3) {\n\n decimalChar = ','\n normalized = normalized.replace(/\\./g, '')\n\n } else {\n\n decimalChar = '.'\n }\n }\n\n if (decimalChar !== '.') {\n\n normalized = normalized.split(decimalChar).join('.')\n }\n }\n\n normalized = normalized.replace(/,/g, '')\n\n if (!normalized || normalized === DEFAULT_SIGN_MINUS || normalized === DEFAULT_SIGN_PLUS) {\n\n return Number.NaN\n }\n\n try {\n\n return Big(normalized).toNumber()\n\n } catch (error) {\n\n return Number.NaN\n }\n}\nexport const parseDisplayValue = (formatted: string, options?: DisplayNumberOptions): number => parseDisplayInternal(formatted, options)\n\nconst NUMERIC_OR_SUBSCRIPT = /[0-9₀-₉]/\nconst MINUS_SIGNS = new Set(['-', '−', '﹣', '-'])\nconst isWhitespace = (char: string): boolean => /\\s/.test(char)\n\nexport const extractNumberCore = (formatted: string): string => {\n\n let startIndex = -1\n let endIndex = -1\n\n for (let i = 0; i < formatted.length; i += 1) {\n\n if (NUMERIC_OR_SUBSCRIPT.test(formatted[i]!)) {\n\n startIndex = i\n break\n }\n }\n\n if (startIndex === -1) {\n\n return ''\n }\n\n for (let i = formatted.length - 1; i >= startIndex; i -= 1) {\n\n if (NUMERIC_OR_SUBSCRIPT.test(formatted[i]!)) {\n\n endIndex = i\n break\n }\n }\n\n if (endIndex === -1) {\n\n return ''\n }\n\n let signPrefix = ''\n\n for (let idx = startIndex - 1; idx >= 0; idx -= 1) {\n\n const candidate = formatted[idx]!\n\n if (isWhitespace(candidate)) {\n\n continue\n }\n\n if (MINUS_SIGNS.has(candidate)) {\n\n signPrefix = candidate\n break\n }\n\n if (NUMERIC_OR_SUBSCRIPT.test(candidate)) {\n\n break\n }\n }\n\n if (!signPrefix) {\n\n for (let idx = endIndex + 1; idx < formatted.length; idx += 1) {\n\n const candidate = formatted[idx]!\n\n if (isWhitespace(candidate)) {\n\n continue\n }\n\n if (MINUS_SIGNS.has(candidate)) {\n\n signPrefix = candidate\n break\n }\n\n if (NUMERIC_OR_SUBSCRIPT.test(candidate)) {\n\n break\n }\n }\n }\n\n return `${signPrefix}${formatted.slice(startIndex, endIndex + 1)}`\n}\n","import {\n FormatError,\n toRangeError,\n toTypeError,\n} from './errors'\nimport { getDateFormat } from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport { CsvDateOptions } from './types'\n\nconst toDate = (value: Date | number | string): Date => {\n\n if (value instanceof Date) {\n\n const timestamp = value.getTime()\n\n if (Number.isNaN(timestamp)) {\n\n throw toRangeError(FormatError.DateValueInvalid)\n }\n\n return new Date(timestamp)\n }\n\n if (typeof value === 'number') {\n\n if (!Number.isFinite(value)) {\n\n throw toRangeError(FormatError.DateNumberNonFinite)\n }\n\n const date = new Date(value)\n\n if (Number.isNaN(date.getTime())) {\n\n throw toRangeError(FormatError.DateValueInvalid)\n }\n\n return date\n }\n\n if (typeof value === 'string') {\n\n const trimmed = value.trim()\n\n if (!trimmed) {\n\n throw toRangeError(FormatError.DateStringEmpty)\n }\n\n const date = new Date(trimmed)\n\n if (Number.isNaN(date.getTime())) {\n\n throw toRangeError(FormatError.InvalidDateString)\n }\n\n return date\n }\n\n throw toTypeError(FormatError.UnsupportedDateInput)\n}\n\nexport const formatDisplayDate = (date: Date | number | string,\n locale?: string,\n options?: Intl.DateTimeFormatOptions): string => {\n\n const resolvedLocale = resolveLocale(locale)\n const parsed = toDate(date)\n const formatter = getDateFormat(resolvedLocale, options)\n\n return formatter.format(parsed)\n}\n\nexport const formatCsvDate = (date: Date | number | string,\n options?: CsvDateOptions): string => {\n\n const parsed = toDate(date)\n const format = options?.format ?? 'iso'\n\n if (format === 'utc-datetime') {\n\n const year = parsed.getUTCFullYear()\n const month = String(parsed.getUTCMonth() + 1).padStart(2, '0')\n const day = String(parsed.getUTCDate() ).padStart(2, '0')\n const hours = String(parsed.getUTCHours() ).padStart(2, '0')\n const minutes = String(parsed.getUTCMinutes() ).padStart(2, '0')\n const seconds = String(parsed.getUTCSeconds() ).padStart(2, '0')\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`\n }\n\n const iso = parsed.toISOString()\n const datePart = iso.slice(0, 10)\n const hasTime = parsed.getUTCHours() !== 0\n || parsed.getUTCMinutes() !== 0\n || parsed.getUTCSeconds() !== 0\n || parsed.getUTCMilliseconds() !== 0\n\n if (!hasTime) { return datePart }\n\n const timePart = iso.slice(11)\n const withoutMillis = timePart.replace(/\\.\\d+Z$/, 'Z')\n\n return `${datePart}T${withoutMillis}`\n}\n","import {\n DECIMAL_DOT,\n DECIMAL_EMPTY,\n DECIMAL_ZERO,\n DEFAULT_SIGN_MINUS,\n STYLE_DECIMAL,\n} from './constants'\nimport { formatCsvDate } from './date'\nimport {\n getNumberFormatPattern,\n} from './internal/intl-cache'\nimport { resolveLocale } from './internal/locale'\nimport {\n computeNumericParts,\n normalizeNumeric,\n} from './internal/numeric'\nimport {\n CsvColumnSpec,\n CsvNumberOptions,\n NumericLike,\n} from './types'\n\nconst resolveDecimalDelimiter = (options: CsvNumberOptions): string => {\n\n if (options.decimalDelimiter !== undefined) {\n\n return options.decimalDelimiter\n }\n\n if (options.locale) {\n\n const locale = resolveLocale(options.locale)\n const pattern = getNumberFormatPattern(locale, { style: STYLE_DECIMAL })\n\n return pattern.decimalSeparator\n }\n\n return DECIMAL_DOT\n}\n\nconst stringifyNumericParts = (parts: ReturnType<typeof computeNumericParts>,\n decimalDelimiter: string = DECIMAL_DOT): string => {\n\n const fraction = parts.fraction.length > 0 ? `${decimalDelimiter}${parts.fraction}` : DECIMAL_EMPTY\n const integer = parts.integer || DECIMAL_ZERO\n const prefix = parts.isNegative ? DEFAULT_SIGN_MINUS : DECIMAL_EMPTY\n const value = `${prefix}${integer}${fraction}`\n\n return value\n}\n\nexport const formatCsvNumber = (value: NumericLike,\n options: CsvNumberOptions = {}): string => {\n\n const parts = computeNumericParts(value, options)\n const delimiter = resolveDecimalDelimiter(options)\n\n return stringifyNumericParts(parts, delimiter)\n}\n\nexport const formatCsvPercent = (value: NumericLike,\n options: CsvNumberOptions = {}): string => {\n\n const scaled = normalizeNumeric(value).times(100)\n const parts = computeNumericParts(scaled, options)\n const delimiter = resolveDecimalDelimiter(options)\n\n return stringifyNumericParts(parts, delimiter)\n}\n\nexport const csvCurrencyCode = (code: string,\n customSymbols?: Record<string, string>,\n useSymbol?: boolean): string => {\n\n const trimmed = code.trim()\n\n if (!trimmed) { return DECIMAL_EMPTY }\n\n const normalized = trimmed.toUpperCase()\n\n if (useSymbol) {\n\n const symbol = customSymbols?.[normalized]\n\n if (symbol) { return symbol }\n }\n\n return normalized\n}\n\nconst escapeCsvField = (value: string,\n delimiter: string): string => {\n\n const needsQuoting = value.includes(delimiter)\n || value.includes('\\n')\n || value.includes('\\r')\n || value.includes('\"')\n\n if (!needsQuoting) { return value }\n\n const escaped = value.replace(/\"/g, '\"\"')\n\n return `\"${escaped}\"`\n}\n\nconst defaultFormatter = (value: unknown): string => {\n\n if (value === null || value === undefined) {\n\n return DECIMAL_EMPTY\n }\n\n if (value instanceof Date) {\n\n return formatCsvDate(value)\n }\n\n if (typeof value === 'number') {\n\n return formatCsvNumber(value)\n }\n\n if (typeof value === 'string') {\n\n return value\n }\n\n if (typeof value === 'boolean') {\n\n return value ? 'true' : 'false'\n }\n\n return String(value)\n}\n\nexport const buildCsv = <T>(rows: T[],\n columns: CsvColumnSpec<T>[],\n delimiter: string = ',',\n lineEnding: string = '\\n'): string => {\n\n const headerLine = columns.map((col) => escapeCsvField(col.header, delimiter)).join(delimiter)\n const lines = [headerLine]\n\n for (const row of rows) {\n\n const fields = columns.map((col) => {\n\n const raw = col.accessor(row)\n const formatted = col.formatter ? col.formatter(raw) : defaultFormatter(raw)\n const stringValue = formatted ?? DECIMAL_EMPTY\n\n return escapeCsvField(stringValue, delimiter)\n })\n\n lines.push(fields.join(delimiter))\n }\n\n return `${lines.join(lineEnding)}${lineEnding}`\n}\n","const checkTime = (i: number): string => (\n i == 0 ? '00' : (\n ((i < 10) ? '0' : '') + i)\n)\n\nexport const formatRemainingTime = (seconds: number): string => {\n\n const days = Math.floor( seconds / (24 * 60 * 60) ); seconds -= days * (24 * 60 * 60)\n const hours = Math.floor( seconds / ( 60 * 60) ); seconds -= hours * ( 60 * 60)\n const mins = Math.floor( seconds / ( 60) ); seconds -= mins * ( 60)\n const secs = Math.floor( seconds )\n\n let str = ''\n\n if (days > 0) { str = days + 'd ' }\n if (hours >= 0) { str = str + checkTime(hours) + 'h ' }\n if (mins >= 0) { str = str + checkTime(mins) + 'm ' }\n if (secs >= 0) { str = str + checkTime(secs) + 's ' }\n\n return str\n}\n","import { Big } from '@eternl/big'\n\nimport {\n BIG_ZERO,\n DECIMALS_CARDANO,\n} from './constants'\nimport { NumericLike } from './types'\n\nexport const bigQuantityFromAmount = ( amount?: NumericLike, decimals?: number): Big => {\n\n if (!amount || amount === '0' || amount === 0) { return BIG_ZERO }\n if (!decimals || decimals <= 0) { return Big(amount) } // Don't round to 0 decimals\n\n return Big(amount)._mul(Math.pow(10, decimals)).round(0)\n}\nexport const bigAmountFromQuantity = (quantity?: NumericLike, decimals?: number): Big => {\n\n if (!quantity || quantity === '0' || quantity === 0) { return BIG_ZERO }\n if (!decimals || decimals <= 0) { return Big(quantity) } // Don't round to 0 decimals\n\n return Big(quantity)._div(Math.pow(10, decimals)).round(decimals)\n}\nexport const bigLovelaceFromAda = ( ada?: NumericLike, decimals: number = DECIMALS_CARDANO): Big => bigQuantityFromAmount( ada, decimals)\nexport const bigAdaFromLovelace = (lovelace?: NumericLike, decimals: number = DECIMALS_CARDANO): Big => bigAmountFromQuantity(lovelace, decimals)\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eternl/formats",
3
- "version": "0.10.17",
3
+ "version": "0.10.19",
4
4
  "description": "Locale-aware display and CSV formatting helpers for numeric data.",
5
5
  "license": "BUSL-1.1",
6
6
  "type": "module",
@@ -27,10 +27,7 @@
27
27
  "browser"
28
28
  ],
29
29
  "dependencies": {
30
- "big.js": "7.0.1"
31
- },
32
- "devDependencies": {
33
- "@types/big.js": "6.2.2"
30
+ "@eternl/big": "0.10.19"
34
31
  },
35
32
  "publishConfig": {
36
33
  "access": "public"