@ducatjs/money 0.0.0-stage → 0.1.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 (285) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +51 -0
  3. package/README.md +617 -2
  4. package/assets/CREDITS.md +12 -0
  5. package/data/adyen-fx.json +19 -0
  6. package/data/adyen.json +171 -0
  7. package/data/braintree.json +223 -0
  8. package/data/cash-rounding.json +399 -0
  9. package/data/checkout.json +230 -0
  10. package/data/iso4217-list-one.xml +1956 -0
  11. package/data/klarna.json +95 -0
  12. package/data/paypal.json +65 -0
  13. package/data/stripe-fx.json +17 -0
  14. package/data/stripe.json +285 -0
  15. package/dist/adyen-fx.d.ts +25 -0
  16. package/dist/adyen-fx.d.ts.map +1 -0
  17. package/dist/adyen-fx.js +122 -0
  18. package/dist/adyen-fx.js.map +1 -0
  19. package/dist/adyen.d.ts +25 -0
  20. package/dist/adyen.d.ts.map +1 -0
  21. package/dist/adyen.js +34 -0
  22. package/dist/adyen.js.map +1 -0
  23. package/dist/allocate.d.ts +72 -0
  24. package/dist/allocate.d.ts.map +1 -0
  25. package/dist/allocate.js +314 -0
  26. package/dist/allocate.js.map +1 -0
  27. package/dist/bag.d.ts +58 -0
  28. package/dist/bag.d.ts.map +1 -0
  29. package/dist/bag.js +122 -0
  30. package/dist/bag.js.map +1 -0
  31. package/dist/braintree.d.ts +34 -0
  32. package/dist/braintree.d.ts.map +1 -0
  33. package/dist/braintree.js +45 -0
  34. package/dist/braintree.js.map +1 -0
  35. package/dist/cash.d.ts +35 -0
  36. package/dist/cash.d.ts.map +1 -0
  37. package/dist/cash.js +86 -0
  38. package/dist/cash.js.map +1 -0
  39. package/dist/checkout.d.ts +42 -0
  40. package/dist/checkout.d.ts.map +1 -0
  41. package/dist/checkout.js +52 -0
  42. package/dist/checkout.js.map +1 -0
  43. package/dist/convert.d.ts +51 -0
  44. package/dist/convert.d.ts.map +1 -0
  45. package/dist/convert.js +55 -0
  46. package/dist/convert.js.map +1 -0
  47. package/dist/currency.d.ts +22 -0
  48. package/dist/currency.d.ts.map +1 -0
  49. package/dist/currency.js +38 -0
  50. package/dist/currency.js.map +1 -0
  51. package/dist/decimal.d.ts +52 -0
  52. package/dist/decimal.d.ts.map +1 -0
  53. package/dist/decimal.js +251 -0
  54. package/dist/decimal.js.map +1 -0
  55. package/dist/ecb.d.ts +17 -0
  56. package/dist/ecb.d.ts.map +1 -0
  57. package/dist/ecb.js +147 -0
  58. package/dist/ecb.js.map +1 -0
  59. package/dist/exact.d.ts +62 -0
  60. package/dist/exact.d.ts.map +1 -0
  61. package/dist/exact.js +147 -0
  62. package/dist/exact.js.map +1 -0
  63. package/dist/fetch.d.ts +58 -0
  64. package/dist/fetch.d.ts.map +1 -0
  65. package/dist/fetch.js +79 -0
  66. package/dist/fetch.js.map +1 -0
  67. package/dist/fixed.d.ts +121 -0
  68. package/dist/fixed.d.ts.map +1 -0
  69. package/dist/fixed.js +420 -0
  70. package/dist/fixed.js.map +1 -0
  71. package/dist/fn.d.ts +27 -0
  72. package/dist/fn.d.ts.map +1 -0
  73. package/dist/fn.js +30 -0
  74. package/dist/fn.js.map +1 -0
  75. package/dist/format.d.ts +13 -0
  76. package/dist/format.d.ts.map +1 -0
  77. package/dist/format.js +90 -0
  78. package/dist/format.js.map +1 -0
  79. package/dist/generated/adyen.d.ts +3 -0
  80. package/dist/generated/adyen.d.ts.map +1 -0
  81. package/dist/generated/adyen.js +144 -0
  82. package/dist/generated/adyen.js.map +1 -0
  83. package/dist/generated/braintree.d.ts +3 -0
  84. package/dist/generated/braintree.d.ts.map +1 -0
  85. package/dist/generated/braintree.js +140 -0
  86. package/dist/generated/braintree.js.map +1 -0
  87. package/dist/generated/cash.d.ts +12 -0
  88. package/dist/generated/cash.d.ts.map +1 -0
  89. package/dist/generated/cash.js +364 -0
  90. package/dist/generated/cash.js.map +1 -0
  91. package/dist/generated/checkout.d.ts +3 -0
  92. package/dist/generated/checkout.d.ts.map +1 -0
  93. package/dist/generated/checkout.js +151 -0
  94. package/dist/generated/checkout.js.map +1 -0
  95. package/dist/generated/iso4217.d.ts +174 -0
  96. package/dist/generated/iso4217.d.ts.map +1 -0
  97. package/dist/generated/iso4217.js +175 -0
  98. package/dist/generated/iso4217.js.map +1 -0
  99. package/dist/generated/kernel.d.ts +17 -0
  100. package/dist/generated/kernel.d.ts.map +1 -0
  101. package/dist/generated/kernel.js +208 -0
  102. package/dist/generated/kernel.js.map +1 -0
  103. package/dist/generated/klarna.d.ts +3 -0
  104. package/dist/generated/klarna.d.ts.map +1 -0
  105. package/dist/generated/klarna.js +21 -0
  106. package/dist/generated/klarna.js.map +1 -0
  107. package/dist/generated/paypal.d.ts +3 -0
  108. package/dist/generated/paypal.d.ts.map +1 -0
  109. package/dist/generated/paypal.js +31 -0
  110. package/dist/generated/paypal.js.map +1 -0
  111. package/dist/generated/stripe.d.ts +8 -0
  112. package/dist/generated/stripe.d.ts.map +1 -0
  113. package/dist/generated/stripe.js +150 -0
  114. package/dist/generated/stripe.js.map +1 -0
  115. package/dist/index.d.ts +11 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +11 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/klarna.d.ts +31 -0
  120. package/dist/klarna.d.ts.map +1 -0
  121. package/dist/klarna.js +38 -0
  122. package/dist/klarna.js.map +1 -0
  123. package/dist/money.d.ts +218 -0
  124. package/dist/money.d.ts.map +1 -0
  125. package/dist/money.js +577 -0
  126. package/dist/money.js.map +1 -0
  127. package/dist/parse.d.ts +11 -0
  128. package/dist/parse.d.ts.map +1 -0
  129. package/dist/parse.js +132 -0
  130. package/dist/parse.js.map +1 -0
  131. package/dist/paypal.d.ts +41 -0
  132. package/dist/paypal.d.ts.map +1 -0
  133. package/dist/paypal.js +58 -0
  134. package/dist/paypal.js.map +1 -0
  135. package/dist/plugins/adyen.d.ts +15 -0
  136. package/dist/plugins/adyen.d.ts.map +1 -0
  137. package/dist/plugins/adyen.js +10 -0
  138. package/dist/plugins/adyen.js.map +1 -0
  139. package/dist/plugins/all.d.ts +22 -0
  140. package/dist/plugins/all.d.ts.map +1 -0
  141. package/dist/plugins/all.js +23 -0
  142. package/dist/plugins/all.js.map +1 -0
  143. package/dist/plugins/allocate.d.ts +20 -0
  144. package/dist/plugins/allocate.d.ts.map +1 -0
  145. package/dist/plugins/allocate.js +26 -0
  146. package/dist/plugins/allocate.js.map +1 -0
  147. package/dist/plugins/braintree.d.ts +12 -0
  148. package/dist/plugins/braintree.d.ts.map +1 -0
  149. package/dist/plugins/braintree.js +12 -0
  150. package/dist/plugins/braintree.js.map +1 -0
  151. package/dist/plugins/cash.d.ts +19 -0
  152. package/dist/plugins/cash.d.ts.map +1 -0
  153. package/dist/plugins/cash.js +16 -0
  154. package/dist/plugins/cash.js.map +1 -0
  155. package/dist/plugins/checkout.d.ts +21 -0
  156. package/dist/plugins/checkout.d.ts.map +1 -0
  157. package/dist/plugins/checkout.js +16 -0
  158. package/dist/plugins/checkout.js.map +1 -0
  159. package/dist/plugins/convert.d.ts +20 -0
  160. package/dist/plugins/convert.d.ts.map +1 -0
  161. package/dist/plugins/convert.js +13 -0
  162. package/dist/plugins/convert.js.map +1 -0
  163. package/dist/plugins/exact.d.ts +15 -0
  164. package/dist/plugins/exact.d.ts.map +1 -0
  165. package/dist/plugins/exact.js +13 -0
  166. package/dist/plugins/exact.js.map +1 -0
  167. package/dist/plugins/fixed.d.ts +17 -0
  168. package/dist/plugins/fixed.d.ts.map +1 -0
  169. package/dist/plugins/fixed.js +13 -0
  170. package/dist/plugins/fixed.js.map +1 -0
  171. package/dist/plugins/format.d.ts +9 -0
  172. package/dist/plugins/format.d.ts.map +1 -0
  173. package/dist/plugins/format.js +16 -0
  174. package/dist/plugins/format.js.map +1 -0
  175. package/dist/plugins/klarna.d.ts +10 -0
  176. package/dist/plugins/klarna.d.ts.map +1 -0
  177. package/dist/plugins/klarna.js +10 -0
  178. package/dist/plugins/klarna.js.map +1 -0
  179. package/dist/plugins/paypal.d.ts +14 -0
  180. package/dist/plugins/paypal.d.ts.map +1 -0
  181. package/dist/plugins/paypal.js +16 -0
  182. package/dist/plugins/paypal.js.map +1 -0
  183. package/dist/plugins/prisma.d.ts +8 -0
  184. package/dist/plugins/prisma.d.ts.map +1 -0
  185. package/dist/plugins/prisma.js +13 -0
  186. package/dist/plugins/prisma.js.map +1 -0
  187. package/dist/plugins/stripe.d.ts +14 -0
  188. package/dist/plugins/stripe.d.ts.map +1 -0
  189. package/dist/plugins/stripe.js +16 -0
  190. package/dist/plugins/stripe.js.map +1 -0
  191. package/dist/plugins/tax.d.ts +21 -0
  192. package/dist/plugins/tax.d.ts.map +1 -0
  193. package/dist/plugins/tax.js +18 -0
  194. package/dist/plugins/tax.js.map +1 -0
  195. package/dist/prisma.d.ts +66 -0
  196. package/dist/prisma.d.ts.map +1 -0
  197. package/dist/prisma.js +66 -0
  198. package/dist/prisma.js.map +1 -0
  199. package/dist/processor.d.ts +28 -0
  200. package/dist/processor.d.ts.map +1 -0
  201. package/dist/processor.js +118 -0
  202. package/dist/processor.js.map +1 -0
  203. package/dist/provider.d.ts +89 -0
  204. package/dist/provider.d.ts.map +1 -0
  205. package/dist/provider.js +240 -0
  206. package/dist/provider.js.map +1 -0
  207. package/dist/rate.d.ts +119 -0
  208. package/dist/rate.d.ts.map +1 -0
  209. package/dist/rate.js +271 -0
  210. package/dist/rate.js.map +1 -0
  211. package/dist/rounding-error.d.ts +9 -0
  212. package/dist/rounding-error.d.ts.map +1 -0
  213. package/dist/rounding-error.js +9 -0
  214. package/dist/rounding-error.js.map +1 -0
  215. package/dist/rounding.d.ts +50 -0
  216. package/dist/rounding.d.ts.map +1 -0
  217. package/dist/rounding.js +87 -0
  218. package/dist/rounding.js.map +1 -0
  219. package/dist/stripe-fx.d.ts +22 -0
  220. package/dist/stripe-fx.d.ts.map +1 -0
  221. package/dist/stripe-fx.js +30 -0
  222. package/dist/stripe-fx.js.map +1 -0
  223. package/dist/stripe.d.ts +36 -0
  224. package/dist/stripe.d.ts.map +1 -0
  225. package/dist/stripe.js +39 -0
  226. package/dist/stripe.js.map +1 -0
  227. package/dist/tax.d.ts +29 -0
  228. package/dist/tax.d.ts.map +1 -0
  229. package/dist/tax.js +39 -0
  230. package/dist/tax.js.map +1 -0
  231. package/package.json +171 -4
  232. package/src/adyen-fx.ts +154 -0
  233. package/src/adyen.ts +46 -0
  234. package/src/allocate.ts +393 -0
  235. package/src/bag.ts +170 -0
  236. package/src/braintree.ts +71 -0
  237. package/src/cash.ts +115 -0
  238. package/src/checkout.ts +77 -0
  239. package/src/convert.ts +159 -0
  240. package/src/currency.ts +61 -0
  241. package/src/decimal.ts +283 -0
  242. package/src/ecb.ts +162 -0
  243. package/src/exact.ts +182 -0
  244. package/src/fetch.ts +127 -0
  245. package/src/fixed.ts +558 -0
  246. package/src/fn.ts +80 -0
  247. package/src/format.ts +106 -0
  248. package/src/generated/adyen.ts +144 -0
  249. package/src/generated/braintree.ts +140 -0
  250. package/src/generated/cash.ts +375 -0
  251. package/src/generated/checkout.ts +151 -0
  252. package/src/generated/iso4217.ts +179 -0
  253. package/src/generated/kernel.ts +230 -0
  254. package/src/generated/klarna.ts +21 -0
  255. package/src/generated/paypal.ts +31 -0
  256. package/src/generated/stripe.ts +150 -0
  257. package/src/index.ts +37 -0
  258. package/src/klarna.ts +54 -0
  259. package/src/money.ts +781 -0
  260. package/src/parse.ts +144 -0
  261. package/src/paypal.ts +93 -0
  262. package/src/plugins/adyen.ts +25 -0
  263. package/src/plugins/all.ts +47 -0
  264. package/src/plugins/allocate.ts +53 -0
  265. package/src/plugins/braintree.ts +23 -0
  266. package/src/plugins/cash.ts +33 -0
  267. package/src/plugins/checkout.ts +32 -0
  268. package/src/plugins/convert.ts +50 -0
  269. package/src/plugins/exact.ts +23 -0
  270. package/src/plugins/fixed.ts +28 -0
  271. package/src/plugins/format.ts +28 -0
  272. package/src/plugins/klarna.ts +21 -0
  273. package/src/plugins/paypal.ts +29 -0
  274. package/src/plugins/prisma.ts +24 -0
  275. package/src/plugins/stripe.ts +29 -0
  276. package/src/plugins/tax.ts +41 -0
  277. package/src/prisma.ts +118 -0
  278. package/src/processor.ts +181 -0
  279. package/src/provider.ts +324 -0
  280. package/src/rate.ts +377 -0
  281. package/src/rounding-error.ts +8 -0
  282. package/src/rounding.ts +122 -0
  283. package/src/stripe-fx.ts +49 -0
  284. package/src/stripe.ts +69 -0
  285. package/src/tax.ts +71 -0
package/src/format.ts ADDED
@@ -0,0 +1,106 @@
1
+ import { POW10 } from './decimal.js';
2
+ import { toDecimal, type Money } from './money.js';
3
+
4
+ const cache = new Map<string, Intl.NumberFormat>();
5
+ // one-entry memo in front of the Map: formatting in a loop is almost always the same
6
+ // locale/currency
7
+ let lastLocale: string | undefined;
8
+ let lastCurrency = '';
9
+ let lastScale = -1;
10
+ let lastFormatter: Intl.NumberFormat | undefined;
11
+
12
+ let stringInput: boolean | undefined;
13
+ /** ES2023 Intl.NumberFormat v3 formats decimal strings exactly; older engines convert to Number. */
14
+ function supportsStringInput(): boolean {
15
+ if (stringInput === undefined) {
16
+ try {
17
+ stringInput =
18
+ new Intl.NumberFormat('en', { useGrouping: false }).format(
19
+ '9007199254740993' as unknown as number,
20
+ ) === '9007199254740993';
21
+ } catch {
22
+ stringInput = false;
23
+ }
24
+ }
25
+ return stringInput;
26
+ }
27
+
28
+ function formatter(
29
+ money: Money,
30
+ locale: string | undefined,
31
+ options: Intl.NumberFormatOptions | undefined,
32
+ ): Intl.NumberFormat {
33
+ if (
34
+ options === undefined &&
35
+ lastFormatter !== undefined &&
36
+ locale === lastLocale &&
37
+ money.currency === lastCurrency &&
38
+ money.scale === lastScale
39
+ ) {
40
+ return lastFormatter;
41
+ }
42
+ const key = options === undefined ? `${locale}|${money.currency}|${money.scale}` : null;
43
+ let numberFormat = key === null ? undefined : cache.get(key);
44
+ if (numberFormat === undefined) {
45
+ numberFormat = new Intl.NumberFormat(locale, {
46
+ style: 'currency',
47
+ currency: money.currency,
48
+ // ISO exponent (or the value's scale), not the engine's default digits: V8 (CLDR) shows ALL,
49
+ // IQD, RSD ... with 0 decimals and JSC with ISO's; we always show what the value holds.
50
+ minimumFractionDigits: money.scale,
51
+ maximumFractionDigits: money.scale,
52
+ ...options,
53
+ });
54
+ if (key !== null) {
55
+ if (cache.size > 256) {
56
+ cache.clear();
57
+ }
58
+ cache.set(key, numberFormat);
59
+ }
60
+ }
61
+ if (key !== null) {
62
+ lastLocale = locale;
63
+ lastCurrency = money.currency;
64
+ lastScale = money.scale;
65
+ lastFormatter = numberFormat;
66
+ }
67
+ return numberFormat;
68
+ }
69
+
70
+ /**
71
+ * Locale-aware formatting with Intl.NumberFormat (formatters are cached). The exact decimal string
72
+ * is passed to Intl, so amounts beyond 2^53 format exactly on engines with Intl.NumberFormat v3
73
+ * (Node 19+, Bun, Deno, Chrome 106+, Safari 15.4+, Firefox 116+).
74
+ *
75
+ * format(money('1234.5', 'EUR'), 'de-DE') // "1.234,50 €"
76
+ * format(money('1234.5', 'EUR'), 'en-GB', { currencyDisplay: 'code' })
77
+ */
78
+ export function format(money: Money, locale?: string, options?: Intl.NumberFormatOptions): string {
79
+ return formatter(money, locale, options).format(intlValue(money));
80
+ }
81
+
82
+ /**
83
+ * What to hand to Intl (which only accepts doubles or strings). Below 10^15 minor units the value
84
+ * has at most 15 significant digits, so the double nearest to it formats back to exactly the same
85
+ * digits. `minor / 10^scale` is a single correctly rounded IEEE division of two exactly
86
+ * representable integers, i.e. bit-identical to Number(toDecimal(m)) (asserted in
87
+ * test/format.test.ts), and 2-3x cheaper; this display hand-off is the only place a double ever
88
+ * touches an amount. Larger values go to Intl as the exact decimal string (Intl.NumberFormat v3).
89
+ */
90
+ function intlValue(money: Money): number {
91
+ const minor = money.minor;
92
+ if (typeof minor === 'number' && minor < 1e15 && minor > -1e15 && money.scale <= 15) {
93
+ return minor / POW10[money.scale]!;
94
+ }
95
+ const decimal = toDecimal(money);
96
+ return (supportsStringInput() ? decimal : Number(decimal)) as number;
97
+ }
98
+
99
+ /** Like format(), but returns Intl parts (for styling the currency symbol separately, etc.). */
100
+ export function formatToParts(
101
+ money: Money,
102
+ locale?: string,
103
+ options?: Intl.NumberFormatOptions,
104
+ ): Intl.NumberFormatPart[] {
105
+ return formatter(money, locale, options).formatToParts(intlValue(money));
106
+ }
@@ -0,0 +1,144 @@
1
+ // GENERATED by scripts/gen-currencies.mjs from data/adyen.json (https://docs.adyen.com/development-resources/currency-codes, retrieved 2026-11-07). Do not edit by hand.
2
+ /* eslint-disable */
3
+
4
+ /** Adyen minor-unit exponents (Adyen's table is authoritative where it differs from ISO: CLP, CVE, IDR, ISK). */
5
+ export const ADYEN_EXPONENTS: Readonly<Record<string, number>> = {
6
+ AED: 2,
7
+ ALL: 2,
8
+ AMD: 2,
9
+ AOA: 2,
10
+ ARS: 2,
11
+ AUD: 2,
12
+ AWG: 2,
13
+ AZN: 2,
14
+ BAM: 2,
15
+ BBD: 2,
16
+ BDT: 2,
17
+ BHD: 3,
18
+ BMD: 2,
19
+ BND: 2,
20
+ BOB: 2,
21
+ BRL: 2,
22
+ BSD: 2,
23
+ BWP: 2,
24
+ BYN: 2,
25
+ BZD: 2,
26
+ CAD: 2,
27
+ CHF: 2,
28
+ CLP: 2,
29
+ CNH: 2,
30
+ CNY: 2,
31
+ COP: 2,
32
+ CRC: 2,
33
+ CUP: 2,
34
+ CVE: 0,
35
+ CZK: 2,
36
+ DJF: 0,
37
+ DKK: 2,
38
+ DOP: 2,
39
+ DZD: 2,
40
+ EGP: 2,
41
+ ETB: 2,
42
+ EUR: 2,
43
+ FJD: 2,
44
+ FKP: 2,
45
+ GBP: 2,
46
+ GEL: 2,
47
+ GHS: 2,
48
+ GIP: 2,
49
+ GMD: 2,
50
+ GNF: 0,
51
+ GTQ: 2,
52
+ GYD: 2,
53
+ HKD: 2,
54
+ HNL: 2,
55
+ HTG: 2,
56
+ HUF: 2,
57
+ IDR: 0,
58
+ ILS: 2,
59
+ INR: 2,
60
+ IQD: 3,
61
+ ISK: 2,
62
+ JMD: 2,
63
+ JOD: 3,
64
+ JPY: 0,
65
+ KES: 2,
66
+ KGS: 2,
67
+ KHR: 2,
68
+ KMF: 0,
69
+ KRW: 0,
70
+ KWD: 3,
71
+ KYD: 2,
72
+ KZT: 2,
73
+ LAK: 2,
74
+ LKR: 2,
75
+ LYD: 3,
76
+ MAD: 2,
77
+ MDL: 2,
78
+ MKD: 2,
79
+ MMK: 2,
80
+ MNT: 2,
81
+ MOP: 2,
82
+ MRU: 2,
83
+ MUR: 2,
84
+ MVR: 2,
85
+ MWK: 2,
86
+ MXN: 2,
87
+ MYR: 2,
88
+ MZN: 2,
89
+ NAD: 2,
90
+ NGN: 2,
91
+ NIO: 2,
92
+ NOK: 2,
93
+ NPR: 2,
94
+ NZD: 2,
95
+ OMR: 3,
96
+ PAB: 2,
97
+ PEN: 2,
98
+ PGK: 2,
99
+ PHP: 2,
100
+ PKR: 2,
101
+ PLN: 2,
102
+ PYG: 0,
103
+ QAR: 2,
104
+ RON: 2,
105
+ RSD: 2,
106
+ RUB: 2,
107
+ RWF: 0,
108
+ SAR: 2,
109
+ SBD: 2,
110
+ SCR: 2,
111
+ SEK: 2,
112
+ SGD: 2,
113
+ SHP: 2,
114
+ SLE: 2,
115
+ SOS: 2,
116
+ SRD: 2,
117
+ STN: 2,
118
+ SVC: 2,
119
+ SZL: 2,
120
+ THB: 2,
121
+ TND: 3,
122
+ TOP: 2,
123
+ TRY: 2,
124
+ TTD: 2,
125
+ TWD: 2,
126
+ TZS: 2,
127
+ UAH: 2,
128
+ UGX: 0,
129
+ USD: 2,
130
+ UYU: 2,
131
+ UZS: 2,
132
+ VEF: 2,
133
+ VND: 0,
134
+ VUV: 0,
135
+ WST: 2,
136
+ XAF: 0,
137
+ XCD: 2,
138
+ XCG: 2,
139
+ XOF: 0,
140
+ XPF: 0,
141
+ YER: 2,
142
+ ZAR: 2,
143
+ ZMW: 2,
144
+ };
@@ -0,0 +1,140 @@
1
+ // GENERATED by scripts/gen-currencies.mjs from data/braintree.json (https://developer.paypal.com/braintree/docs/reference/general/currencies, retrieved 2026-11-07). Do not edit by hand.
2
+ /* eslint-disable */
3
+
4
+ /** Braintree decimals per currency (`amount` is a decimal string). The zero-decimal list includes LAK (ISO 2). */
5
+ export const BRAINTREE_EXPONENTS: Readonly<Record<string, number>> = {
6
+ AED: 2,
7
+ AMD: 2,
8
+ AOA: 2,
9
+ ARS: 2,
10
+ AUD: 2,
11
+ AWG: 2,
12
+ AZN: 2,
13
+ BAM: 2,
14
+ BBD: 2,
15
+ BDT: 2,
16
+ BIF: 0,
17
+ BMD: 2,
18
+ BND: 2,
19
+ BOB: 2,
20
+ BRL: 2,
21
+ BSD: 2,
22
+ BWP: 2,
23
+ BYN: 2,
24
+ BZD: 2,
25
+ CAD: 2,
26
+ CHF: 2,
27
+ CLP: 0,
28
+ CNY: 2,
29
+ COP: 2,
30
+ CRC: 2,
31
+ CVE: 2,
32
+ CZK: 2,
33
+ DJF: 0,
34
+ DKK: 2,
35
+ DOP: 2,
36
+ DZD: 2,
37
+ EGP: 2,
38
+ ETB: 2,
39
+ EUR: 2,
40
+ FJD: 2,
41
+ FKP: 2,
42
+ GBP: 2,
43
+ GEL: 2,
44
+ GHS: 2,
45
+ GIP: 2,
46
+ GMD: 2,
47
+ GNF: 0,
48
+ GTQ: 2,
49
+ GYD: 2,
50
+ HKD: 2,
51
+ HNL: 2,
52
+ HRK: 2,
53
+ HTG: 2,
54
+ HUF: 2,
55
+ IDR: 2,
56
+ ILS: 2,
57
+ INR: 2,
58
+ ISK: 0,
59
+ JMD: 2,
60
+ JPY: 0,
61
+ KES: 2,
62
+ KGS: 2,
63
+ KHR: 2,
64
+ KMF: 0,
65
+ KRW: 0,
66
+ KYD: 2,
67
+ KZT: 2,
68
+ LAK: 0,
69
+ LBP: 2,
70
+ LKR: 2,
71
+ LRD: 2,
72
+ LSL: 2,
73
+ LTL: 2,
74
+ MAD: 2,
75
+ MDL: 2,
76
+ MKD: 2,
77
+ MNT: 2,
78
+ MOP: 2,
79
+ MUR: 2,
80
+ MVR: 2,
81
+ MWK: 2,
82
+ MXN: 2,
83
+ MYR: 2,
84
+ MZN: 2,
85
+ NAD: 2,
86
+ NGN: 2,
87
+ NIO: 2,
88
+ NOK: 2,
89
+ NPR: 2,
90
+ NZD: 2,
91
+ PAB: 2,
92
+ PEN: 2,
93
+ PGK: 2,
94
+ PHP: 2,
95
+ PKR: 2,
96
+ PLN: 2,
97
+ PYG: 0,
98
+ QAR: 2,
99
+ RON: 2,
100
+ RSD: 2,
101
+ RUB: 2,
102
+ RWF: 0,
103
+ SAR: 2,
104
+ SBD: 2,
105
+ SCR: 2,
106
+ SEK: 2,
107
+ SGD: 2,
108
+ SHP: 2,
109
+ SLL: 2,
110
+ SOS: 2,
111
+ SRD: 2,
112
+ STD: 2,
113
+ SVC: 2,
114
+ SYP: 2,
115
+ SZL: 2,
116
+ THB: 2,
117
+ TJS: 2,
118
+ TOP: 2,
119
+ TRY: 2,
120
+ TTD: 2,
121
+ TWD: 2,
122
+ TZS: 2,
123
+ UAH: 2,
124
+ UGX: 0,
125
+ USD: 2,
126
+ UYU: 2,
127
+ UZS: 2,
128
+ VES: 2,
129
+ VND: 0,
130
+ VUV: 0,
131
+ WST: 2,
132
+ XAF: 0,
133
+ XCD: 2,
134
+ XOF: 0,
135
+ XPF: 0,
136
+ YER: 2,
137
+ ZAR: 2,
138
+ ZMK: 2,
139
+ ZWD: 2,
140
+ };