@ledgerhq/coin-module-framework 1.1.0 → 2.0.1

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.
Files changed (53) hide show
  1. package/.unimportedrc.json +0 -1
  2. package/CHANGELOG.md +12 -0
  3. package/lib/config.d.ts +3 -4
  4. package/lib/config.d.ts.map +1 -1
  5. package/lib/config.js +2 -2
  6. package/lib/config.js.map +1 -1
  7. package/lib/currencies/BigNumberToLocaleString.d.ts +7 -0
  8. package/lib/currencies/BigNumberToLocaleString.d.ts.map +1 -0
  9. package/lib/currencies/BigNumberToLocaleString.js +58 -0
  10. package/lib/currencies/BigNumberToLocaleString.js.map +1 -0
  11. package/lib/currencies/formatCurrencyUnit.d.ts +25 -1
  12. package/lib/currencies/formatCurrencyUnit.d.ts.map +1 -1
  13. package/lib/currencies/formatCurrencyUnit.js +130 -4
  14. package/lib/currencies/formatCurrencyUnit.js.map +1 -1
  15. package/lib/currencies/localeUtility.d.ts +8 -0
  16. package/lib/currencies/localeUtility.d.ts.map +1 -0
  17. package/lib/currencies/localeUtility.js +51 -0
  18. package/lib/currencies/localeUtility.js.map +1 -0
  19. package/lib/currencies/parseCurrencyUnit.d.ts +2 -1
  20. package/lib/currencies/parseCurrencyUnit.d.ts.map +1 -1
  21. package/lib/currencies/parseCurrencyUnit.js +9 -2
  22. package/lib/currencies/parseCurrencyUnit.js.map +1 -1
  23. package/lib-es/config.d.ts +3 -4
  24. package/lib-es/config.d.ts.map +1 -1
  25. package/lib-es/config.js +2 -2
  26. package/lib-es/config.js.map +1 -1
  27. package/lib-es/currencies/BigNumberToLocaleString.d.ts +7 -0
  28. package/lib-es/currencies/BigNumberToLocaleString.d.ts.map +1 -0
  29. package/lib-es/currencies/BigNumberToLocaleString.js +54 -0
  30. package/lib-es/currencies/BigNumberToLocaleString.js.map +1 -0
  31. package/lib-es/currencies/formatCurrencyUnit.d.ts +25 -1
  32. package/lib-es/currencies/formatCurrencyUnit.d.ts.map +1 -1
  33. package/lib-es/currencies/formatCurrencyUnit.js +127 -1
  34. package/lib-es/currencies/formatCurrencyUnit.js.map +1 -1
  35. package/lib-es/currencies/localeUtility.d.ts +8 -0
  36. package/lib-es/currencies/localeUtility.d.ts.map +1 -0
  37. package/lib-es/currencies/localeUtility.js +48 -0
  38. package/lib-es/currencies/localeUtility.js.map +1 -0
  39. package/lib-es/currencies/parseCurrencyUnit.d.ts +2 -1
  40. package/lib-es/currencies/parseCurrencyUnit.d.ts.map +1 -1
  41. package/lib-es/currencies/parseCurrencyUnit.js +8 -1
  42. package/lib-es/currencies/parseCurrencyUnit.js.map +1 -1
  43. package/package.json +5 -5
  44. package/src/api/types.ts +1 -1
  45. package/src/config.ts +4 -5
  46. package/src/currencies/BigNumberToLocaleString.test.ts +164 -0
  47. package/src/currencies/BigNumberToLocaleString.ts +70 -0
  48. package/src/currencies/formatCurrencyUnit.test.ts +215 -0
  49. package/src/currencies/formatCurrencyUnit.ts +200 -6
  50. package/src/currencies/localeUtility.test.ts +22 -0
  51. package/src/currencies/localeUtility.ts +59 -0
  52. package/src/currencies/parseCurrencyUnit.test.ts +26 -0
  53. package/src/currencies/parseCurrencyUnit.ts +10 -1
@@ -1,2 +1,128 @@
1
- export { formatCurrencyUnit, formatCurrencyUnitFragment, } from '@ledgerhq/live-currency-format';
1
+ // Forked from @ledgerhq/live-currency-format/src/formatCurrencyUnit.ts
2
+ import { BigNumber } from 'bignumber.js';
3
+ import { getSeparators } from './localeUtility';
4
+ import { toLocaleString } from './BigNumberToLocaleString';
5
+ const nonBreakableSpace = '\u00A0';
6
+ const defaultFormatOptions = {
7
+ locale: 'en-EN',
8
+ showCode: false,
9
+ alwaysShowSign: false,
10
+ showAllDigits: false,
11
+ disableRounding: false,
12
+ useGrouping: true,
13
+ subMagnitude: 0,
14
+ discreet: false,
15
+ joinFragmentsSeparator: '',
16
+ dynamicSignificantDigits: 6,
17
+ staticSignificantDigits: 8,
18
+ };
19
+ const buildFormatState = (unit, value, _options) => {
20
+ const emptyState = () => ({
21
+ value: '',
22
+ sign: null,
23
+ code: null,
24
+ decimalSeparator: '.',
25
+ currencyPosition: unit.prefixCode ? 'start' : 'end',
26
+ });
27
+ if (!BigNumber.isBigNumber(value)) {
28
+ console.warn('formatCurrencyUnit called with value=', value);
29
+ return emptyState();
30
+ }
31
+ if (value.isNaN()) {
32
+ console.warn('formatCurrencyUnit called with NaN value!');
33
+ return emptyState();
34
+ }
35
+ if (!value.isFinite()) {
36
+ console.warn('formatCurrencyUnit called with infinite value=', value);
37
+ return emptyState();
38
+ }
39
+ const options = {};
40
+ if (_options) {
41
+ let k;
42
+ for (k in _options) {
43
+ const optionValue = _options[k];
44
+ if (optionValue !== undefined) {
45
+ options[k] = optionValue;
46
+ }
47
+ }
48
+ }
49
+ const resolvedOptions = {
50
+ ...defaultFormatOptions,
51
+ ...unit,
52
+ ...options,
53
+ };
54
+ const { showCode, alwaysShowSign, showAllDigits, locale, disableRounding, useGrouping, subMagnitude, discreet, dynamicSignificantDigits, staticSignificantDigits, } = resolvedOptions;
55
+ const { magnitude, code } = unit;
56
+ const floatValue = value.div(new BigNumber(10).pow(magnitude));
57
+ const floatValueAbs = floatValue.abs();
58
+ const minimumFractionDigits = showAllDigits ? magnitude : 0;
59
+ const maximumFractionDigits = disableRounding
60
+ ? magnitude + subMagnitude
61
+ : Math.max(minimumFractionDigits, Math.max(0, Math.min(dynamicSignificantDigits - Math.ceil(Math.log(floatValueAbs.toNumber()) / Math.log(10)), magnitude + subMagnitude, staticSignificantDigits)));
62
+ const sign = alwaysShowSign || floatValue.isNegative() ? (floatValue.isNegative() ? '-' : '+') : null;
63
+ const formattedValue = discreet
64
+ ? '***'
65
+ : toLocaleString(floatValueAbs, locale, {
66
+ maximumFractionDigits,
67
+ minimumFractionDigits,
68
+ useGrouping,
69
+ });
70
+ const separators = getSeparators(locale);
71
+ const decimalSeparator = separators.decimal === ',' ? ',' : '.';
72
+ const currencyPosition = unit.prefixCode ? 'start' : 'end';
73
+ return {
74
+ value: formattedValue,
75
+ sign,
76
+ code: showCode ? code : null,
77
+ decimalSeparator,
78
+ currencyPosition,
79
+ };
80
+ };
81
+ export const formatCurrencyUnitFragment = (unit, value, options) => {
82
+ const { value: formattedValue, sign, code, decimalSeparator, currencyPosition, } = buildFormatState(unit, value, options);
83
+ const hasDecimals = formattedValue.indexOf(decimalSeparator) !== -1;
84
+ const [integerPartRaw, decimalPartRaw] = hasDecimals
85
+ ? formattedValue.split(decimalSeparator)
86
+ : [formattedValue, ''];
87
+ let integerPart = integerPartRaw;
88
+ const decimalPart = decimalPartRaw || '';
89
+ let currencyText = code || '';
90
+ if (sign) {
91
+ if (currencyPosition === 'start' && currencyText) {
92
+ currencyText = `${sign}${currencyText}`;
93
+ }
94
+ else {
95
+ integerPart = `${sign}${integerPart}`;
96
+ }
97
+ }
98
+ return {
99
+ integerPart,
100
+ decimalPart,
101
+ decimalSeparator,
102
+ currencyText,
103
+ currencyPosition,
104
+ };
105
+ };
106
+ export const formatCurrencyUnit = (unit, value, options) => {
107
+ const joinFragmentsSeparator = (options && options.joinFragmentsSeparator) || defaultFormatOptions.joinFragmentsSeparator;
108
+ const { value: formattedValue, sign, code } = buildFormatState(unit, value, options);
109
+ const parts = [];
110
+ if (unit.prefixCode) {
111
+ if (sign)
112
+ parts.push(sign);
113
+ if (code)
114
+ parts.push(code);
115
+ parts.push(formattedValue);
116
+ }
117
+ else {
118
+ if (sign)
119
+ parts.push(sign);
120
+ parts.push(formattedValue);
121
+ if (code) {
122
+ parts.push(nonBreakableSpace);
123
+ parts.push(code);
124
+ }
125
+ }
126
+ return parts.join(joinFragmentsSeparator);
127
+ };
2
128
  //# sourceMappingURL=formatCurrencyUnit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatCurrencyUnit.js","sourceRoot":"","sources":["../../src/currencies/formatCurrencyUnit.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAG3B,MAAM,gCAAgC,CAAA"}
1
+ {"version":3,"file":"formatCurrencyUnit.js","sourceRoot":"","sources":["../../src/currencies/formatCurrencyUnit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const prefixFormat: readonly ["sign", "code", "value"];
2
+ export declare const suffixFormat: readonly ["sign", "value", "separator", "code"];
3
+ export type GetSeparators = (locale: string) => {
4
+ decimal: string | null | undefined;
5
+ thousands: string | null | undefined;
6
+ };
7
+ export declare const getSeparators: GetSeparators;
8
+ //# sourceMappingURL=localeUtility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localeUtility.d.ts","sourceRoot":"","sources":["../../src/currencies/localeUtility.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,YAAY,oCAAqC,CAAA;AAC9D,eAAO,MAAM,YAAY,iDAAkD,CAAA;AAE3E,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAClC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CACrC,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,aAoB1B,CAAA"}
@@ -0,0 +1,48 @@
1
+ // Forked from @ledgerhq/live-currency-format/src/localeUtility.ts
2
+ const memoize = (fn) => {
3
+ const cache = {};
4
+ return ((arg) => {
5
+ if (!(arg in cache)) {
6
+ cache[arg] = fn(arg);
7
+ }
8
+ return cache[arg];
9
+ });
10
+ };
11
+ const options = {
12
+ style: 'currency',
13
+ currency: 'USD',
14
+ };
15
+ const localeNotAvailable = (1.2).toLocaleString('en', options) !== '$1.20';
16
+ const getFallback = (locale) => staticFallback[Object.prototype.hasOwnProperty.call(staticFallback, locale) ? locale : 'en'];
17
+ const staticFallback = {
18
+ en: ['-$1.00', '10,000.2'],
19
+ es: ['-1,00 US$', '10.000,2'],
20
+ fr: ['-1,00 $US', '10 000,2'],
21
+ ja: ['-US$1.00', '10,000.2'],
22
+ ko: ['-US$1.00', '10,000.2'],
23
+ ru: ['-1,00 $', '10 000,2'],
24
+ zh: ['-US$1.00', '10,000.2'],
25
+ };
26
+ export const prefixFormat = ['sign', 'code', 'value'];
27
+ export const suffixFormat = ['sign', 'value', 'separator', 'code'];
28
+ export const getSeparators = memoize((locale) => {
29
+ const res = localeNotAvailable ? getFallback(locale)[1] : (10000.2).toLocaleString(locale);
30
+ let decimal;
31
+ let thousands;
32
+ for (let i = 0; i < res.length; i++) {
33
+ const c = res[i];
34
+ if (/[0-9]/.test(c))
35
+ continue;
36
+ if (!thousands) {
37
+ thousands = c;
38
+ }
39
+ else {
40
+ decimal = c;
41
+ }
42
+ }
43
+ return {
44
+ decimal,
45
+ thousands,
46
+ };
47
+ });
48
+ //# sourceMappingURL=localeUtility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localeUtility.js","sourceRoot":"","sources":["../../src/currencies/localeUtility.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,OAAO,GAAG,CAA2C,EAAK,EAAK,EAAE;IACrE,MAAM,KAAK,GAAkC,EAAE,CAAA;IAC/C,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC,CAAM,CAAA;AACT,CAAC,CAAA;AAED,MAAM,OAAO,GAAG;IACd,KAAK,EAAE,UAAmB;IAC1B,QAAQ,EAAE,KAAK;CAChB,CAAA;AACD,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;AAE1E,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CACrC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAE9F,MAAM,cAAc,GAA6B;IAC/C,EAAE,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC1B,EAAE,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;IAC7B,EAAE,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;IAC7B,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5B,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5B,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC3B,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;CAC7B,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAA;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAU,CAAA;AAO3E,MAAM,CAAC,MAAM,aAAa,GAAkB,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;IAC7D,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IAC1F,IAAI,OAAO,CAAA;IACX,IAAI,SAAS,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,SAAQ;QAE7B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,CAAC,CAAA;QACf,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS;KACV,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,2 +1,3 @@
1
- export { parseCurrencyUnit } from '@ledgerhq/live-currency-format';
1
+ import type { Unit } from '../api/types';
2
+ export declare const parseCurrencyUnit: (unit: Unit, valueString: string) => BigNumber;
2
3
  //# sourceMappingURL=parseCurrencyUnit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseCurrencyUnit.d.ts","sourceRoot":"","sources":["../../src/currencies/parseCurrencyUnit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA"}
1
+ {"version":3,"file":"parseCurrencyUnit.d.ts","sourceRoot":"","sources":["../../src/currencies/parseCurrencyUnit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAGxC,eAAO,MAAM,iBAAiB,GAAI,MAAM,IAAI,EAAE,aAAa,MAAM,KAAG,SAKnE,CAAA"}
@@ -1,2 +1,9 @@
1
- export { parseCurrencyUnit } from '@ledgerhq/live-currency-format';
1
+ import { BigNumber } from 'bignumber.js';
2
+ export const parseCurrencyUnit = (unit, valueString) => {
3
+ const str = valueString.replace(/,/g, '.');
4
+ const value = new BigNumber(str);
5
+ if (value.isNaN())
6
+ return new BigNumber(0);
7
+ return value.times(new BigNumber(10).pow(unit.magnitude)).integerValue();
8
+ };
2
9
  //# sourceMappingURL=parseCurrencyUnit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseCurrencyUnit.js","sourceRoot":"","sources":["../../src/currencies/parseCurrencyUnit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA"}
1
+ {"version":3,"file":"parseCurrencyUnit.js","sourceRoot":"","sources":["../../src/currencies/parseCurrencyUnit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAU,EAAE,WAAmB,EAAa,EAAE;IAC9E,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,KAAK,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,CAAA;AAC1E,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-module-framework",
3
- "version": "1.1.0",
3
+ "version": "2.0.1",
4
4
  "description": "Ledger framework for Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -51,12 +51,12 @@
51
51
  },
52
52
  "license": "Apache-2.0",
53
53
  "dependencies": {
54
- "@ledgerhq/errors": "6.31.0-nightly.20260317030141",
55
- "@ledgerhq/live-env": "2.30.0-nightly.20260317030141",
56
- "@ledgerhq/live-currency-format": "0.6.0-nightly.20260317030141",
57
- "@ledgerhq/types-cryptoassets": "7.35.0-nightly.20260317030141",
58
54
  "bignumber.js": "^9.1.2"
59
55
  },
56
+ "peerDependencies": {
57
+ "@ledgerhq/errors": "^6.33.0",
58
+ "@ledgerhq/live-env": "^2.31.0"
59
+ },
60
60
  "devDependencies": {
61
61
  "@types/node": "^24.0.0",
62
62
  "@types/jest": "^30.0.0",
package/src/api/types.ts CHANGED
@@ -181,7 +181,7 @@ export type Account = {
181
181
  address: string
182
182
  balance: bigint
183
183
  currencyUnit: Unit
184
- spendableBalance: bigint // NOTE:: check if we can get rid of this one
184
+ spendableBalance: bigint // NOTE: check if we can get rid of this one
185
185
  }
186
186
 
187
187
  /**
package/src/config.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { CryptoCurrency, CryptoCurrencyId } from '@ledgerhq/types-cryptoassets'
2
1
  import { MissingCoinConfig } from './errors'
3
2
  import type { FeatureConfig } from './features/types'
4
3
 
@@ -13,7 +12,7 @@ type ConfigStatus =
13
12
  }
14
13
  | {
15
14
  type: 'migration'
16
- chain: CryptoCurrencyId
15
+ chain: string
17
16
  from: string
18
17
  to: string
19
18
  link: string
@@ -55,7 +54,7 @@ export type CurrencyConfig = {
55
54
  [key: string]: unknown
56
55
  }
57
56
 
58
- export type CoinConfig<T extends CurrencyConfig> = (currency?: CryptoCurrency) => T
57
+ export type CoinConfig<T extends CurrencyConfig> = (currencyId?: string) => T
59
58
 
60
59
  function buildCoinConfig<T extends CurrencyConfig>() {
61
60
  let coinConfig: CoinConfig<T> | undefined
@@ -64,12 +63,12 @@ function buildCoinConfig<T extends CurrencyConfig>() {
64
63
  coinConfig = config
65
64
  }
66
65
 
67
- const getCoinConfig = (currency?: CryptoCurrency): T => {
66
+ const getCoinConfig = (currencyId?: string): T => {
68
67
  if (!coinConfig) {
69
68
  throw new MissingCoinConfig()
70
69
  }
71
70
 
72
- return coinConfig(currency)
71
+ return coinConfig(currencyId)
73
72
  }
74
73
 
75
74
  return {
@@ -0,0 +1,164 @@
1
+ // Forked from @ledgerhq/live-currency-format/src/BigNumberToLocaleString.test.ts
2
+ import { BigNumber } from 'bignumber.js'
3
+ import { toLocaleString } from './BigNumberToLocaleString'
4
+
5
+ test('basic toLocaleString usage', () => {
6
+ expect(toLocaleString(new BigNumber(0))).toBe('0')
7
+ expect(toLocaleString(new BigNumber(8))).toBe('8')
8
+ expect(toLocaleString(new BigNumber(123))).toBe('123')
9
+ expect(toLocaleString(new BigNumber(0.001))).toBe('0.001')
10
+ expect(toLocaleString(new BigNumber(13.1))).toBe('13.1')
11
+ expect(toLocaleString(new BigNumber(123.01))).toBe('123.01')
12
+ expect(toLocaleString(new BigNumber(123.012))).toBe('123.012')
13
+ expect(toLocaleString(new BigNumber(1123))).toBe('1,123')
14
+ expect(toLocaleString(new BigNumber('9999999999999999'))).toBe('9,999,999,999,999,999')
15
+ expect(toLocaleString(new BigNumber('9999999999999.99'))).toBe('9,999,999,999,999.99')
16
+ })
17
+
18
+ test('toLocaleString to default maximumFractionDigits to 3', () => {
19
+ expect(toLocaleString(new BigNumber(4.44444))).toBe('4.444')
20
+ expect(toLocaleString(new BigNumber(444444.444444444))).toBe('444,444.444')
21
+ expect(toLocaleString(new BigNumber(0.444444444))).toBe('0.444')
22
+ expect(toLocaleString(new BigNumber(9.99999))).toBe('9.999')
23
+ expect(toLocaleString(new BigNumber(111111.111111111))).toBe('111,111.111')
24
+ expect(toLocaleString(new BigNumber(0.999999999))).toBe('0.999')
25
+ expect(toLocaleString(new BigNumber(9.5))).toBe('9.5')
26
+ expect(toLocaleString(new BigNumber(9.9))).toBe('9.9')
27
+ expect(toLocaleString(new BigNumber(99.6))).toBe('99.6')
28
+ expect(toLocaleString(new BigNumber(99.8))).toBe('99.8')
29
+ expect(toLocaleString(new BigNumber(999.7))).toBe('999.7')
30
+ expect(toLocaleString(new BigNumber(999.9))).toBe('999.9')
31
+ expect(toLocaleString(new BigNumber(999999.7))).toBe('999,999.7')
32
+ expect(toLocaleString(new BigNumber(999999.9))).toBe('999,999.9')
33
+ })
34
+
35
+ test('toLocaleString minimumFractionDigits', () => {
36
+ expect(
37
+ toLocaleString(new BigNumber(0), 'en', {
38
+ minimumFractionDigits: 1,
39
+ })
40
+ ).toBe('0.0')
41
+ expect(
42
+ toLocaleString(new BigNumber(8), 'en', {
43
+ minimumFractionDigits: 1,
44
+ })
45
+ ).toBe('8.0')
46
+ expect(
47
+ toLocaleString(new BigNumber(123), 'en', {
48
+ minimumFractionDigits: 1,
49
+ })
50
+ ).toBe('123.0')
51
+ expect(
52
+ toLocaleString(new BigNumber(0.001), 'en', {
53
+ minimumFractionDigits: 1,
54
+ })
55
+ ).toBe('0.001')
56
+ expect(
57
+ toLocaleString(new BigNumber(9.5), 'en', {
58
+ minimumFractionDigits: 1,
59
+ })
60
+ ).toBe('9.5')
61
+ expect(
62
+ toLocaleString(new BigNumber(9.6), 'en', {
63
+ minimumFractionDigits: 2,
64
+ })
65
+ ).toBe('9.60')
66
+ expect(
67
+ toLocaleString(new BigNumber(13.1), 'en', {
68
+ minimumFractionDigits: 3,
69
+ })
70
+ ).toBe('13.100')
71
+ expect(
72
+ toLocaleString(new BigNumber(123.01), 'en', {
73
+ minimumFractionDigits: 5,
74
+ })
75
+ ).toBe('123.01000')
76
+ expect(
77
+ toLocaleString(new BigNumber(123.012), 'en', {
78
+ minimumFractionDigits: 10,
79
+ })
80
+ ).toBe('123.0120000000')
81
+ expect(
82
+ toLocaleString(new BigNumber(1123), 'en', {
83
+ minimumFractionDigits: 1,
84
+ })
85
+ ).toBe('1,123.0')
86
+ expect(
87
+ toLocaleString(new BigNumber('9999999999999999'), 'en', {
88
+ minimumFractionDigits: 1,
89
+ })
90
+ ).toBe('9,999,999,999,999,999.0')
91
+ expect(
92
+ toLocaleString(new BigNumber('9999999999999.999'), 'en', {
93
+ minimumFractionDigits: 5,
94
+ })
95
+ ).toBe('9,999,999,999,999.99900')
96
+ })
97
+
98
+ test('toLocaleString minimumFractionDigits and maximumFractionDigits', () => {
99
+ expect(
100
+ toLocaleString(new BigNumber(1), 'en', {
101
+ minimumFractionDigits: 1,
102
+ maximumFractionDigits: 5,
103
+ })
104
+ ).toBe('1.0')
105
+ expect(
106
+ toLocaleString(new BigNumber(1.003), 'en', {
107
+ minimumFractionDigits: 1,
108
+ maximumFractionDigits: 5,
109
+ })
110
+ ).toBe('1.003')
111
+ expect(
112
+ toLocaleString(new BigNumber(1.000003), 'en', {
113
+ minimumFractionDigits: 1,
114
+ maximumFractionDigits: 5,
115
+ })
116
+ ).toBe('1.0')
117
+ expect(
118
+ toLocaleString(new BigNumber(1.333333333333), 'en', {
119
+ minimumFractionDigits: 1,
120
+ maximumFractionDigits: 5,
121
+ })
122
+ ).toBe('1.33333')
123
+ expect(
124
+ toLocaleString(new BigNumber(0), 'en', {
125
+ minimumFractionDigits: 1,
126
+ maximumFractionDigits: 5,
127
+ })
128
+ ).toBe('0.0')
129
+ expect(
130
+ toLocaleString(new BigNumber(0.003), 'en', {
131
+ minimumFractionDigits: 1,
132
+ maximumFractionDigits: 5,
133
+ })
134
+ ).toBe('0.003')
135
+ expect(
136
+ toLocaleString(new BigNumber(0.000003), 'en', {
137
+ minimumFractionDigits: 1,
138
+ maximumFractionDigits: 5,
139
+ })
140
+ ).toBe('0.0')
141
+ expect(
142
+ toLocaleString(new BigNumber(9.7), 'en', {
143
+ minimumFractionDigits: 1,
144
+ maximumFractionDigits: 1,
145
+ })
146
+ ).toBe('9.7')
147
+ expect(
148
+ toLocaleString(new BigNumber('4.4444444444444444444411111111111111'), 'en', {
149
+ maximumFractionDigits: 20,
150
+ })
151
+ ).toBe('4.44444444444444444444')
152
+ })
153
+
154
+ test('toLocaleString with different locales', () => {
155
+ const resultEn = toLocaleString(new BigNumber('1234.56'), 'en')
156
+ expect(resultEn).toBe('1,234.56')
157
+ const resultFr = toLocaleString(new BigNumber('1234.56'), 'fr')
158
+ expect(resultFr).toBeDefined()
159
+ })
160
+
161
+ test('toLocaleString handles separator types', () => {
162
+ const result = toLocaleString(new BigNumber('1234.56'), 'en')
163
+ expect(result).toBe('1,234.56')
164
+ })
@@ -0,0 +1,70 @@
1
+ // Forked from @ledgerhq/live-currency-format/src/BigNumberToLocaleString.ts
2
+ import { BigNumber } from 'bignumber.js'
3
+ import { getSeparators } from './localeUtility'
4
+
5
+ export type SupportedOptions = {
6
+ minimumFractionDigits: number
7
+ maximumFractionDigits: number
8
+ useGrouping: boolean
9
+ }
10
+
11
+ const getFormatForLocale = (locale: string) => {
12
+ const { decimal, thousands } = getSeparators(locale)
13
+ const opts = {
14
+ decimalSeparator: '.',
15
+ groupSeparator: ',',
16
+ groupSize: 3,
17
+ secondaryGroupSize: 0,
18
+ fractionGroupSeparator: '\xA0', // non-breaking space
19
+ fractionGroupSize: 0,
20
+ }
21
+ if (typeof decimal === 'string') opts.decimalSeparator = decimal
22
+ if (typeof thousands === 'string') opts.groupSeparator = thousands
23
+ return opts
24
+ }
25
+
26
+ export const toLocaleString = (
27
+ n: BigNumber,
28
+ localeInput?: string,
29
+ options: Partial<SupportedOptions> = {}
30
+ ): string => {
31
+ let locale = localeInput
32
+ if (!locale) locale = 'en'
33
+ const minimumFractionDigits =
34
+ typeof options.minimumFractionDigits === 'number' ? options.minimumFractionDigits : 0
35
+ const maximumFractionDigits =
36
+ typeof options.maximumFractionDigits === 'number'
37
+ ? options.maximumFractionDigits
38
+ : Math.max(minimumFractionDigits, 3)
39
+ const useGrouping = 'useGrouping' in options ? options.useGrouping : true
40
+ const format = getFormatForLocale(locale)
41
+
42
+ if (!useGrouping) {
43
+ format.groupSeparator = ''
44
+ }
45
+
46
+ const BN = BigNumber.clone({
47
+ FORMAT: format,
48
+ })
49
+ const bn = new BN(n)
50
+ const maxDecimals = bn.toFormat(maximumFractionDigits, BigNumber.ROUND_FLOOR)
51
+
52
+ if (maximumFractionDigits !== minimumFractionDigits) {
53
+ const minDecimals = bn.toFormat(minimumFractionDigits, BigNumber.ROUND_FLOOR)
54
+ let i = maxDecimals.length
55
+
56
+ while (i > minDecimals.length) {
57
+ if (maxDecimals[i - 1] !== '0') {
58
+ if (maxDecimals[i - 1] === format.decimalSeparator) {
59
+ i--
60
+ }
61
+ break
62
+ }
63
+ i--
64
+ }
65
+
66
+ return maxDecimals.slice(0, i)
67
+ }
68
+
69
+ return maxDecimals
70
+ }