@adriangalilea/utils 2.25.1 → 2.26.0

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 (34) hide show
  1. package/README.md +17 -12
  2. package/dist/universal/currency/classify.d.ts +7 -0
  3. package/dist/universal/currency/classify.d.ts.map +1 -0
  4. package/dist/universal/currency/classify.js +147 -0
  5. package/dist/universal/currency/classify.js.map +1 -0
  6. package/dist/universal/currency/decimals.d.ts +2 -0
  7. package/dist/universal/currency/decimals.d.ts.map +1 -0
  8. package/dist/universal/currency/decimals.js +93 -0
  9. package/dist/universal/currency/decimals.js.map +1 -0
  10. package/dist/universal/currency/index.d.ts +12 -57
  11. package/dist/universal/currency/index.d.ts.map +1 -1
  12. package/dist/universal/currency/index.js +27 -317
  13. package/dist/universal/currency/index.js.map +1 -1
  14. package/dist/universal/currency/money.d.ts +12 -0
  15. package/dist/universal/currency/money.d.ts.map +1 -0
  16. package/dist/universal/currency/money.js +40 -0
  17. package/dist/universal/currency/money.js.map +1 -0
  18. package/dist/universal/currency/percent.d.ts +7 -0
  19. package/dist/universal/currency/percent.d.ts.map +1 -0
  20. package/dist/universal/currency/percent.js +32 -0
  21. package/dist/universal/currency/percent.js.map +1 -0
  22. package/dist/universal/currency/symbols.d.ts +32 -0
  23. package/dist/universal/currency/symbols.d.ts.map +1 -0
  24. package/dist/universal/currency/symbols.js +36 -0
  25. package/dist/universal/currency/symbols.js.map +1 -0
  26. package/dist/universal/currency/usd.d.ts +23 -0
  27. package/dist/universal/currency/usd.d.ts.map +1 -0
  28. package/dist/universal/currency/usd.js +54 -0
  29. package/dist/universal/currency/usd.js.map +1 -0
  30. package/dist/universal/format.d.ts +17 -29
  31. package/dist/universal/format.d.ts.map +1 -1
  32. package/dist/universal/format.js +28 -54
  33. package/dist/universal/format.js.map +1 -1
  34. package/package.json +1 -1
package/README.md CHANGED
@@ -82,12 +82,13 @@ Pure number formatting — named exports, tree-shakeable, zero currency baggage
82
82
  knowledge and its crypto-symbol dataset):
83
83
 
84
84
  Every Intl call pins `en` — SSR apps hydrate identically on server and client
85
- (no React #418 from a runtime-default locale).
85
+ (no React #418 from a runtime-default locale). Every formatter accepts
86
+ `null | undefined` and renders `"—"`, so DB fields pass straight through.
86
87
 
87
88
  ```typescript
88
- import { compact, percentage, withCommas, bytes, bitsPerSec } from '@adriangalilea/utils/format'
89
+ import { compact, percentage, fixed, withCommas, bytes, bitsPerSec } from '@adriangalilea/utils/format'
89
90
 
90
- withCommas(1234567) // "1,234,567"
91
+ withCommas(1234567) // "1,234,567" (bigint-safe)
91
92
  withCommas(1234.567, 2) // "1,234.57"
92
93
  compact(1234567) // "1.2M"
93
94
  compact(1234) // "1.2K"
@@ -96,21 +97,25 @@ percentage(0.05) // "0.05%"
96
97
  percentage(123.456) // "123%"
97
98
  percentage(2.41, { sign: true }) // "+2.4%" (deltas: 24h change, diffs)
98
99
  percentage(2.4126, { decimals: 2 }) // "2.41%" (fixed decimals)
100
+ fixed(1.234) // "1.23" (plain toFixed, no grouping)
99
101
  bytes(12.7e12) // "12.7 TB" (decimal SI, like drive specs / df -h)
100
102
  bitsPerSec(2.5e9) // "2.5 Gbps"
103
+ percentage(null) // "—" (every formatter)
104
+ ```
105
+
106
+ Money lives in `currency`, which is split by dependency weight so the barrel
107
+ tree-shakes at file granularity: the 133KB crypto-symbol dataset is imported
108
+ only by its classify module, so `import { usd } from '…/currency'` ships
109
+ dollars, not 13k tickers.
101
110
 
102
- // USD — lives in format (dataset-free): printing dollars must not drag the
103
- // 133KB crypto-symbol dataset into a client bundle. Also re-exported from
104
- // currency for the namespace.
105
- import { usd, usdIntlOptions } from '@adriangalilea/utils/format'
106
- usd(1234.56) // "$1,234.56" (grouped)
111
+ ```typescript
112
+ import { usd, usdIntlOptions, btc, money } from '@adriangalilea/utils/currency'
113
+
114
+ usd(1234.56) // "$1,234.56" (grouped; dataset-free import)
107
115
  usd(4.3387e-7) // "$0.00000043" (sub-cent keeps 2 significant digits)
108
116
  usd(0.43387, { decimals: 4 }) // "$0.4339" (policy override)
109
117
  usd(60892283, { compact: true }) // "$60.9M" (market-cap scale)
110
-
111
- // Symbol-aware money — from currency (owns the symbol/decimals knowledge):
112
- import { btc, money } from '@adriangalilea/utils/currency'
113
- btc(0.00001234) // "0.00001234 ₿"
118
+ btc(0.00001234) // "0.000012340 ₿" (dataset via optimal decimals)
114
119
  money(100, 'EUR') // "€100.00"
115
120
 
116
121
  // The decimals policy as Intl.NumberFormatOptions — for consumers that format
@@ -0,0 +1,7 @@
1
+ export declare function normalize(symbol: string): string;
2
+ export declare function areEquivalent(symbol1: string, symbol2: string): boolean;
3
+ export declare function getVariations(symbol: string): string[];
4
+ export declare function isCrypto(code: string): boolean;
5
+ export declare function isStablecoin(code: string): boolean;
6
+ export declare function isFiat(code: string): boolean;
7
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/universal/currency/classify.ts"],"names":[],"mappings":"AA+CA,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BhD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAatD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmB9C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAclD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkC5C"}
@@ -0,0 +1,147 @@
1
+ // Ticker classification + normalization. This is the ONLY module that
2
+ // imports the crypto-symbol dataset (133KB, 13k tickers) — keeping the
3
+ // import here is what lets a bundler drop the dataset for consumers that
4
+ // only format money (./usd.ts, ./money.ts via the majors' switch cases).
5
+ import { isCryptoSymbol } from "./crypto-symbols.js";
6
+ // Alternative ticker mappings (some exchanges use different symbols)
7
+ const cryptoAlternatives = {
8
+ XBT: "BTC", // BitMEX and some others use XBT for Bitcoin
9
+ IOTA: "MIOTA", // IOTA vs MIOTA
10
+ STR: "XLM", // Stellar old ticker
11
+ BCHABC: "BCH", // Bitcoin Cash ABC
12
+ BCHSV: "BSV", // Bitcoin SV
13
+ DRK: "DASH", // Darkcoin old name
14
+ XRB: "NANO", // RaiBlocks old name
15
+ ANT: "ANT", // Could be Aragon
16
+ BCC: "BCH", // Bittrex used BCC for Bitcoin Cash
17
+ MIOTA: "IOTA", // Some use MIOTA
18
+ YOYOW: "YOYOW", // Various formats
19
+ IOTX: "IOTX", // IoTeX
20
+ QSH: "QASH", // QASH variations
21
+ YOYO: "YOYOW", // YOYOW variations
22
+ ETHOS: "BQX", // Ethos old ticker
23
+ REP: "REP", // Augur variations
24
+ REPV2: "REP", // Augur v2
25
+ USDt: "USDT", // Case variations
26
+ "USDT.e": "USDT", // Avalanche USDT
27
+ "USDC.e": "USDC", // Avalanche USDC
28
+ "WBTC.e": "WBTC", // Avalanche WBTC
29
+ "DAI.e": "DAI", // Avalanche DAI
30
+ "BTC.b": "BTC", // Avalanche BTC
31
+ BETH: "WBETH", // Binance ETH
32
+ STETH: "STETH", // Lido staked ETH
33
+ WSTETH: "WSTETH", // Wrapped stETH
34
+ };
35
+ // Build reverse mapping for normalization (alternative -> normalized)
36
+ const symbolReverseMap = new Map();
37
+ for (const [alternative, normalized] of Object.entries(cryptoAlternatives)) {
38
+ // Only map if it's actually an alternative, not the same
39
+ if (alternative !== normalized) {
40
+ symbolReverseMap.set(alternative.toUpperCase(), normalized);
41
+ symbolReverseMap.set(alternative.toLowerCase(), normalized);
42
+ }
43
+ }
44
+ export function normalize(symbol) {
45
+ const upperSymbol = symbol.toUpperCase();
46
+ // Check if it's a known alternative
47
+ if (cryptoAlternatives[upperSymbol]) {
48
+ return cryptoAlternatives[upperSymbol];
49
+ }
50
+ // Check reverse mapping
51
+ const normalized = symbolReverseMap.get(upperSymbol) ||
52
+ symbolReverseMap.get(symbol.toLowerCase());
53
+ if (normalized) {
54
+ return normalized;
55
+ }
56
+ // Handle wrapped/bridged tokens
57
+ const unwrapped = upperSymbol
58
+ .replace(/^W/, "") // Remove W prefix (WBTC -> BTC)
59
+ .replace(/\.E$/, "") // Remove .e suffix (USDT.e -> USDT)
60
+ .replace(/\.B$/, ""); // Remove .b suffix (BTC.b -> BTC)
61
+ if (unwrapped !== upperSymbol && cryptoAlternatives[unwrapped]) {
62
+ return cryptoAlternatives[unwrapped];
63
+ }
64
+ return upperSymbol;
65
+ }
66
+ export function areEquivalent(symbol1, symbol2) {
67
+ return normalize(symbol1) === normalize(symbol2);
68
+ }
69
+ export function getVariations(symbol) {
70
+ const normalized = normalize(symbol);
71
+ const variations = new Set([normalized]);
72
+ // Add all known alternatives
73
+ for (const [key, value] of Object.entries(cryptoAlternatives)) {
74
+ if (value === normalized || key === normalized) {
75
+ variations.add(key);
76
+ variations.add(value);
77
+ }
78
+ }
79
+ return Array.from(variations);
80
+ }
81
+ export function isCrypto(code) {
82
+ const upperCode = code.toUpperCase();
83
+ // Check if it's a known alternative
84
+ if (cryptoAlternatives[upperCode]) {
85
+ return isCryptoSymbol(cryptoAlternatives[upperCode]);
86
+ }
87
+ // Check if it's a wrapped or bridged token (common patterns)
88
+ const unwrappedCode = upperCode
89
+ .replace(/^W/, "") // Remove W prefix (WBTC -> BTC)
90
+ .replace(/\.E$/, "") // Remove .e suffix (USDT.e -> USDT)
91
+ .replace(/\.B$/, ""); // Remove .b suffix (BTC.b -> BTC)
92
+ if (unwrappedCode !== upperCode) {
93
+ return isCryptoSymbol(unwrappedCode);
94
+ }
95
+ return isCryptoSymbol(upperCode);
96
+ }
97
+ export function isStablecoin(code) {
98
+ const stablecoins = new Set([
99
+ "USDT",
100
+ "USDC",
101
+ "DAI",
102
+ "BUSD",
103
+ "UST",
104
+ "TUSD",
105
+ "USDP",
106
+ "GUSD",
107
+ "FRAX",
108
+ "LUSD",
109
+ ]);
110
+ return stablecoins.has(code);
111
+ }
112
+ export function isFiat(code) {
113
+ const fiats = new Set([
114
+ "USD",
115
+ "EUR",
116
+ "GBP",
117
+ "JPY",
118
+ "CNY",
119
+ "CAD",
120
+ "AUD",
121
+ "CHF",
122
+ "HKD",
123
+ "SGD",
124
+ "NZD",
125
+ "KRW",
126
+ "SEK",
127
+ "NOK",
128
+ "DKK",
129
+ "PLN",
130
+ "THB",
131
+ "INR",
132
+ "RUB",
133
+ "TRY",
134
+ "BRL",
135
+ "MXN",
136
+ "ARS",
137
+ "CLP",
138
+ "COP",
139
+ "PEN",
140
+ "UYU",
141
+ "ZAR",
142
+ "NGN",
143
+ "KES",
144
+ ]);
145
+ return fiats.has(code);
146
+ }
147
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/universal/currency/classify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getOptimalDecimals(value: number, currencyCode: string): number;
2
+ //# sourceMappingURL=decimals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimals.d.ts","sourceRoot":"","sources":["../../../src/universal/currency/decimals.ts"],"names":[],"mappings":"AAUA,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GAClB,MAAM,CA6DR"}
@@ -0,0 +1,93 @@
1
+ // Per-currency optimal-decimals policy. Depends on ./classify.ts (the
2
+ // dataset) ONLY for the unknown-ticker fallback — the majors resolve in the
3
+ // switch. Consumers that call this with arbitrary codes accept the dataset;
4
+ // USD-only consumers should use usdDecimals/usd from ./usd.ts, which never
5
+ // touch it.
6
+ import { sigDecimals } from "../format.js";
7
+ import { isCrypto } from "./classify.js";
8
+ import { usdDecimals } from "./usd.js";
9
+ export function getOptimalDecimals(value, currencyCode) {
10
+ if (value === 0) {
11
+ return isCrypto(currencyCode) ? 8 : 2;
12
+ }
13
+ const absValue = Math.abs(value);
14
+ switch (currencyCode) {
15
+ case "BTC":
16
+ case "XBT":
17
+ if (absValue < 0.00001)
18
+ return 10;
19
+ else if (absValue < 0.0001)
20
+ return 9;
21
+ else if (absValue < 0.001)
22
+ return 8;
23
+ else if (absValue < 0.01)
24
+ return 7;
25
+ else if (absValue < 0.1)
26
+ return 6;
27
+ else if (absValue < 1)
28
+ return 5;
29
+ else
30
+ return 4;
31
+ case "ETH":
32
+ if (absValue < 0.001)
33
+ return 8;
34
+ else if (absValue < 0.01)
35
+ return 7;
36
+ else if (absValue < 0.1)
37
+ return 6;
38
+ else if (absValue < 1)
39
+ return 5;
40
+ else
41
+ return 4;
42
+ case "USD":
43
+ case "USDT":
44
+ case "USDC":
45
+ case "DAI":
46
+ case "BUSD":
47
+ return usdDecimals(value);
48
+ case "EUR":
49
+ case "GBP":
50
+ case "CAD":
51
+ case "AUD":
52
+ case "CHF":
53
+ if (absValue < 0.01)
54
+ return 4;
55
+ else if (absValue < 1000)
56
+ return 2;
57
+ else
58
+ return 0;
59
+ case "JPY":
60
+ case "KRW":
61
+ if (absValue < 1)
62
+ return 2;
63
+ else
64
+ return 0;
65
+ }
66
+ if (isCrypto(currencyCode)) {
67
+ if (absValue < 0.00001)
68
+ return sigDecimals(absValue);
69
+ else if (absValue < 0.0001)
70
+ return 6;
71
+ else if (absValue < 0.001)
72
+ return 5;
73
+ else if (absValue < 0.01)
74
+ return 4;
75
+ else if (absValue < 0.1)
76
+ return 3;
77
+ else if (absValue < 1)
78
+ return 3;
79
+ else
80
+ return 2;
81
+ }
82
+ else {
83
+ if (absValue < 0.01)
84
+ return sigDecimals(absValue);
85
+ else if (absValue < 0.1)
86
+ return 3;
87
+ else if (absValue < 1000)
88
+ return 2;
89
+ else
90
+ return 0;
91
+ }
92
+ }
93
+ //# sourceMappingURL=decimals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimals.js","sourceRoot":"","sources":["../../../src/universal/currency/decimals.ts"],"names":[],"mappings":"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"}
@@ -1,60 +1,15 @@
1
- export declare const CurrencySymbols: {
2
- readonly BTC: "₿";
3
- readonly XBT: "₿";
4
- readonly ETH: "Ξ";
5
- readonly USD: "$";
6
- readonly EUR: "€";
7
- readonly GBP: "£";
8
- readonly JPY: "¥";
9
- readonly CNY: "¥";
10
- readonly KRW: "₩";
11
- readonly INR: "₹";
12
- readonly RUB: "₽";
13
- readonly TRY: "₺";
14
- readonly AUD: "A$";
15
- readonly CAD: "C$";
16
- readonly CHF: "Fr";
17
- readonly HKD: "HK$";
18
- readonly SGD: "S$";
19
- readonly NZD: "NZ$";
20
- readonly SEK: "kr";
21
- readonly NOK: "kr";
22
- readonly DKK: "kr";
23
- readonly PLN: "zł";
24
- readonly THB: "฿";
25
- readonly USDT: "₮";
26
- readonly USDC: "$";
27
- readonly DAI: "$";
28
- readonly BUSD: "$";
29
- };
30
- export type CurrencyCode = keyof typeof CurrencySymbols | string;
31
- export declare function getSymbol(code: string): string;
32
- export declare function getOptimalDecimals(value: number, currencyCode: string): number;
33
- import { usd, usdIntlOptions } from "../format.js";
34
- export declare function normalize(symbol: string): string;
35
- export declare function areEquivalent(symbol1: string, symbol2: string): boolean;
36
- export declare function getVariations(symbol: string): string[];
37
- export declare function isCrypto(code: string): boolean;
38
- export declare function isStablecoin(code: string): boolean;
39
- export declare function isFiat(code: string): boolean;
40
- export declare function percentageOf(value: number, total: number): number;
41
- export declare function percentageChange(oldValue: number, newValue: number): number;
42
- export declare function percentageDiff(a: number, b: number): number;
43
- export declare function basisPointsToPercent(bps: number): number;
44
- export declare function percentToBasisPoints(percent: number): number;
45
- export declare function formatBasisPoints(bps: number): string;
46
- export type { UsdOptions } from "../format.js";
47
- export { usd, usdIntlOptions };
48
- /** Bitcoin with optimal decimals: 0.00001234 ₿ */
49
- export declare function btc(value: number): string;
50
- /** Ethereum with optimal decimals: 0.123 Ξ */
51
- export declare function eth(value: number): string;
52
- /**
53
- * Format a value in any currency: symbol before for fiat/stablecoins
54
- * (`$12.34`), after for crypto (`0.5 ₿`), optimal decimals + thousands
55
- * grouping either way (en-pinned — SSR-hydration-safe).
56
- */
57
- export declare function money(value: number, currencyCode: string): string;
1
+ export * from "./classify.js";
2
+ export * from "./decimals.js";
3
+ export * from "./money.js";
4
+ export * from "./percent.js";
5
+ export * from "./symbols.js";
6
+ export * from "./usd.js";
7
+ import { areEquivalent, getVariations, isCrypto, isFiat, isStablecoin, normalize } from "./classify.js";
8
+ import { getOptimalDecimals } from "./decimals.js";
9
+ import { btc, eth, money } from "./money.js";
10
+ import { basisPointsToPercent, formatBasisPoints, percentageChange, percentageDiff, percentageOf, percentToBasisPoints } from "./percent.js";
11
+ import { getSymbol } from "./symbols.js";
12
+ import { usd, usdIntlOptions } from "./usd.js";
58
13
  export declare const currency: {
59
14
  getSymbol: typeof getSymbol;
60
15
  getOptimalDecimals: typeof getOptimalDecimals;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/universal/currency/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BlB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,eAAe,GAAG,MAAM,CAAC;AAEjE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GAClB,MAAM,CA6DR;AAED,OAAO,EAAe,GAAG,EAAe,cAAc,EAAE,MAAM,cAAc,CAAC;AA2C7E,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BhD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAatD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmB9C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAclD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkC5C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM3E;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAOD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC;AAE/B,kDAAkD;AAClD,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,8CAA8C;AAC9C,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAWjE;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/universal/currency/index.ts"],"names":[],"mappings":"AAcA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AAEzB,OAAO,EACN,aAAa,EACb,aAAa,EACb,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,SAAS,EACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EACN,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAmB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBpB,CAAC"}