@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/dist/fixed.js ADDED
@@ -0,0 +1,420 @@
1
+ // Fixed-point decimals without a currency: the engine under Money, exposed on its own. A Fixed is
2
+ // an integer (a JS number while it is a safe integer, a bigint beyond) and a scale, the count of
3
+ // decimal places: `fixed('12.345')` is 12345 at scale 3. Arithmetic is exact, and every operation
4
+ // that has to drop digits rounds once, with an explicit or the default mode.
5
+ import { currencyExponent } from './currency.js';
6
+ import { formatScaled, parseDecimal, parsePlainDecimal, pow10n, ratio, normalizeMinor, } from './decimal.js';
7
+ import { fromMinor, scaleDown, scaleUp, toScale as moneyToScale, } from './money.js';
8
+ import { DEFAULT_ROUNDING, divideAndRound, divideAndRoundBigint, RoundingError, } from './rounding.js';
9
+ const MAX_SAFE_MINOR = Number.MAX_SAFE_INTEGER;
10
+ // A double carries 15 significant decimal digits faithfully (DBL_DIG): a number with no more than
11
+ // that is the decimal its author wrote. 0.1 + 0.2 reads back as 0.30000000000000004 (17 digits), so
12
+ // it is refused unless a scale and a rounding mode say what to do with it.
13
+ const MAX_FAITHFUL_DIGITS = 15;
14
+ // The largest scale accepted. Scales cost memory and time in proportion (10^scale is a bigint with
15
+ // `scale` digits), so an untrusted '1e-999999999' must be refused before any work is done. toJSON
16
+ // never writes an exponent, so real data stays far below this.
17
+ const MAX_SCALE = 1000;
18
+ const EXPONENT = /[eE]([+-]?\d+)\s*$/;
19
+ // Passed to the constructor by this module only, so `new Fixed(1.5, 2)` from outside can't break
20
+ // the representation invariant. Values come from fixed(), fromScaled() and the methods.
21
+ const INTERNAL = Symbol('Fixed');
22
+ /** A number stays; a bigint becomes a number when it is safe (the representation invariant). */
23
+ function normalize(value) {
24
+ return typeof value === 'bigint' ? normalizeMinor(value) : value;
25
+ }
26
+ function toBigInt(value) {
27
+ return typeof value === 'bigint' ? value : BigInt(value);
28
+ }
29
+ function checkScale(scale) {
30
+ if (!Number.isSafeInteger(scale) || scale < 0 || scale > MAX_SCALE) {
31
+ throw new RangeError(`Invalid scale ${scale}: use an integer from 0 to ${MAX_SCALE}`);
32
+ }
33
+ }
34
+ /** A Fixed from a value that already holds the invariant (an integer, safe when a number). */
35
+ function make(value, scale) {
36
+ return new Fixed(INTERNAL, value, scale);
37
+ }
38
+ function resultScale(value, options) {
39
+ const scale = options?.scale;
40
+ if (scale === undefined) {
41
+ return value.scale;
42
+ }
43
+ checkScale(scale);
44
+ return scale;
45
+ }
46
+ /**
47
+ * An exact fixed-point decimal: `value / 10^scale`. Immutable. Create one with `fixed()` or
48
+ * `fromScaled()`. Mixed scales work as for Money: add, subtract and compare align to the larger
49
+ * scale exactly, and multiply and divide keep this value's scale.
50
+ */
51
+ export class Fixed {
52
+ /** The scaled integer: a number while it is a safe integer, a bigint beyond. */
53
+ value;
54
+ /** Decimal places. */
55
+ scale;
56
+ /** @internal use fixed() or fromScaled() */
57
+ constructor(token, value, scale) {
58
+ if (token !== INTERNAL) {
59
+ throw new TypeError('Use fixed() or fromScaled() to create a Fixed');
60
+ }
61
+ // `+ 0` turns -0 into 0, so no operation can leak a negative zero.
62
+ this.value = typeof value === 'bigint' ? normalizeMinor(value) : value + 0;
63
+ this.scale = scale;
64
+ }
65
+ // Arithmetic
66
+ /** this + other, exactly, at the larger of the two scales. */
67
+ add(other) {
68
+ return addAligned(this, toFixed(other), 1);
69
+ }
70
+ /** this − other, exactly, at the larger of the two scales. */
71
+ subtract(other) {
72
+ return addAligned(this, toFixed(other), -1);
73
+ }
74
+ /**
75
+ * this × factor, rounded once to this value's scale or `options.scale` (default 'halfExpand').
76
+ * The factor is exact: an integer, a decimal string ('1.075'), a bigint, a `ratio()` or another
77
+ * Fixed. Give `scale` rather than calling toScale afterwards, which would round twice.
78
+ */
79
+ multiply(factor, rounding = DEFAULT_ROUNDING, options) {
80
+ const value = this.value;
81
+ const scale = resultScale(this, options);
82
+ // An integer factor keeps the scale and can't need rounding, so a safe product is the answer.
83
+ if (scale === this.scale &&
84
+ typeof factor === 'number' &&
85
+ Number.isSafeInteger(factor) &&
86
+ typeof value === 'number') {
87
+ const product = value * factor;
88
+ if (product <= MAX_SAFE_MINOR && product >= -MAX_SAFE_MINOR) {
89
+ return make(product + 0, this.scale);
90
+ }
91
+ }
92
+ return multiplyByRatio(this, factorRatio(factor), rounding, scale);
93
+ }
94
+ /**
95
+ * this ÷ divisor, rounded once to this value's scale or `options.scale` (default 'halfExpand'):
96
+ * `fixed('9.990').divide('1.2', 'halfEven', { scale: 2 })` is 8.32.
97
+ */
98
+ divide(divisor, rounding = DEFAULT_ROUNDING, options) {
99
+ const scale = resultScale(this, options);
100
+ const divisorRatio = factorRatio(divisor);
101
+ if (divisorRatio.num === 0n) {
102
+ throw new RangeError('Division by zero');
103
+ }
104
+ return multiplyByRatio(this, ratio(divisorRatio.den, divisorRatio.num), rounding, scale);
105
+ }
106
+ /** −this */
107
+ negate() {
108
+ const value = this.value;
109
+ if (typeof value === 'number') {
110
+ return make(0 - value, this.scale);
111
+ }
112
+ return make(-value, this.scale);
113
+ }
114
+ /** |this| */
115
+ abs() {
116
+ return this.value < 0 ? this.negate() : this;
117
+ }
118
+ /**
119
+ * Rounds to `scale` decimal places (default 0, an integer): `fixed('2.5').round('halfEven')` is
120
+ * 2. Money's round() defaults to the currency's exponent; a Fixed has none, so the default is 0.
121
+ */
122
+ round(rounding, scale = 0) {
123
+ return this.toScale(scale, rounding);
124
+ }
125
+ /**
126
+ * Changes the scale: increasing it is always exact, decreasing it rounds (default 'halfExpand').
127
+ */
128
+ toScale(scale, rounding = DEFAULT_ROUNDING) {
129
+ checkScale(scale);
130
+ if (scale === this.scale) {
131
+ return this;
132
+ }
133
+ if (scale > this.scale) {
134
+ return make(scaleUp(this.value, scale - this.scale), scale);
135
+ }
136
+ return make(scaleDown(this.value, this.scale - scale, rounding), scale);
137
+ }
138
+ // Comparison
139
+ /** −1, 0 or 1, exactly, across scales and number/bigint. */
140
+ compare(other) {
141
+ const operand = toFixed(other);
142
+ let first = this.value;
143
+ let second = operand.value;
144
+ if (this.scale !== operand.scale) {
145
+ const scale = Math.max(this.scale, operand.scale);
146
+ first = scaleUp(first, scale - this.scale);
147
+ second = scaleUp(second, scale - operand.scale);
148
+ }
149
+ // Comparisons between a number and a bigint are exact in JS.
150
+ if (first < second) {
151
+ return -1;
152
+ }
153
+ if (first > second) {
154
+ return 1;
155
+ }
156
+ return 0;
157
+ }
158
+ /** The same value, at any scale: 1.0 equals 1.00. */
159
+ equals(other) {
160
+ const operand = toFixed(other);
161
+ if (this.scale === operand.scale) {
162
+ // == compares a number and a bigint exactly.
163
+ return this.value == operand.value;
164
+ }
165
+ return this.compare(operand) === 0;
166
+ }
167
+ /** this < other */
168
+ lessThan(other) {
169
+ return this.compare(other) < 0;
170
+ }
171
+ /** this ≤ other */
172
+ lessThanOrEqual(other) {
173
+ return this.compare(other) <= 0;
174
+ }
175
+ /** this > other */
176
+ greaterThan(other) {
177
+ return this.compare(other) > 0;
178
+ }
179
+ /** this ≥ other */
180
+ greaterThanOrEqual(other) {
181
+ return this.compare(other) >= 0;
182
+ }
183
+ /** this = 0 */
184
+ isZero() {
185
+ return this.value == 0;
186
+ }
187
+ /** this > 0 */
188
+ isPositive() {
189
+ return this.value > 0;
190
+ }
191
+ /** this < 0 */
192
+ isNegative() {
193
+ return this.value < 0;
194
+ }
195
+ /** −1, 0 or 1 */
196
+ sign() {
197
+ if (this.value > 0) {
198
+ return 1;
199
+ }
200
+ if (this.value < 0) {
201
+ return -1;
202
+ }
203
+ return 0;
204
+ }
205
+ // Conversion
206
+ /** The plain decimal string, with every decimal place of the scale: '12.340'. */
207
+ toString() {
208
+ return formatScaled(this.value, this.scale);
209
+ }
210
+ /** The decimal string, as toString(), so JSON round-trips exactly through `fixed()`. */
211
+ toJSON() {
212
+ return this.toString();
213
+ }
214
+ /** `{ value, scale }`, the exact integer form: value / 10^scale. */
215
+ toScaled() {
216
+ return { value: this.value, scale: this.scale };
217
+ }
218
+ /**
219
+ * Money in `currency`, at its exponent. Throws RoundingError when that would drop digits, unless
220
+ * `rounding` is given: `fixed('1.005').toMoney('EUR', 'halfEven')` is 1.00 EUR.
221
+ */
222
+ toMoney(currency, rounding = 'unnecessary') {
223
+ const exact = fromMinor(this.value, currency, this.scale);
224
+ const target = currencyExponent(currency);
225
+ if (target === this.scale) {
226
+ return exact;
227
+ }
228
+ try {
229
+ return moneyToScale(exact, target, rounding);
230
+ }
231
+ catch (error) {
232
+ if (error instanceof RoundingError) {
233
+ throw new RoundingError(`${this.toString()} has more than ${target} decimal places for ${currency}; pass a rounding mode`);
234
+ }
235
+ throw error;
236
+ }
237
+ }
238
+ /** Blocks `a + b`, `a > b` and `+a`: arithmetic and comparison go through the methods. */
239
+ [Symbol.toPrimitive](hint) {
240
+ if (hint === 'string') {
241
+ return this.toString();
242
+ }
243
+ throw new TypeError('Fixed cannot be converted to a number; use add(), compare(), toString() etc.');
244
+ }
245
+ }
246
+ /** value × rate at `scale`, rounded once: the kernel of multiply and divide. */
247
+ function multiplyByRatio(fixedValue, rate, rounding, scale) {
248
+ const value = fixedValue.value;
249
+ // Fast path: both factors are safe integers, so a product within the safe range is exact, and
250
+ // divideAndRound then rounds the exact quotient.
251
+ if (typeof value === 'number' &&
252
+ scale === fixedValue.scale &&
253
+ rate.n === rate.n &&
254
+ rate.d === rate.d) {
255
+ const product = value * rate.n;
256
+ if (product <= MAX_SAFE_MINOR && product >= -MAX_SAFE_MINOR) {
257
+ return make(divideAndRound(product, rate.d, rounding), scale);
258
+ }
259
+ }
260
+ // Slow path: the same single division, in bigint.
261
+ let numerator = toBigInt(value) * rate.num;
262
+ let denominator = rate.den;
263
+ if (scale > fixedValue.scale) {
264
+ numerator *= pow10n(scale - fixedValue.scale);
265
+ }
266
+ else if (scale < fixedValue.scale) {
267
+ denominator *= pow10n(fixedValue.scale - scale);
268
+ }
269
+ return make(divideAndRoundBigint(numerator, denominator, rounding), scale);
270
+ }
271
+ /** first + sign × second, exactly, at the larger scale. */
272
+ function addAligned(first, second, sign) {
273
+ const firstValue = first.value;
274
+ const secondValue = second.value;
275
+ // Fast path: two safe integers at one scale have an exact sum whenever it is itself safe.
276
+ if (typeof firstValue === 'number' &&
277
+ typeof secondValue === 'number' &&
278
+ first.scale === second.scale) {
279
+ const sum = sign === 1 ? firstValue + secondValue : firstValue - secondValue;
280
+ if (sum <= MAX_SAFE_MINOR && sum >= -MAX_SAFE_MINOR) {
281
+ return make(sum + 0, first.scale);
282
+ }
283
+ }
284
+ const scale = Math.max(first.scale, second.scale);
285
+ const aligned = toBigInt(scaleUp(firstValue, scale - first.scale));
286
+ const alignedOther = toBigInt(scaleUp(secondValue, scale - second.scale));
287
+ if (sign === 1) {
288
+ return make(aligned + alignedOther, scale);
289
+ }
290
+ return make(aligned - alignedOther, scale);
291
+ }
292
+ /** A factor as an exact ratio; a Fixed is value / 10^scale. */
293
+ function factorRatio(factor) {
294
+ if (factor instanceof Fixed) {
295
+ return ratio(toBigInt(factor.value), pow10n(factor.scale));
296
+ }
297
+ // A Ratio object is trusted as it is, as Money trusts it: build it with ratio(), once, for hot
298
+ // loops.
299
+ return ratio(factor);
300
+ }
301
+ function toFixed(input) {
302
+ if (input instanceof Fixed) {
303
+ return input;
304
+ }
305
+ return fixed(input);
306
+ }
307
+ /** Digits at `fromScale` as a Fixed at `targetScale`, rounding when decimals are dropped. */
308
+ function rescale(digits, fromScale, targetScale, rounding, input) {
309
+ if (fromScale === targetScale) {
310
+ return make(digits, targetScale);
311
+ }
312
+ if (fromScale < targetScale) {
313
+ return make(scaleUp(normalize(digits), targetScale - fromScale), targetScale);
314
+ }
315
+ try {
316
+ return make(scaleDown(normalize(digits), fromScale - targetScale, rounding), targetScale);
317
+ }
318
+ catch (error) {
319
+ if (error instanceof RoundingError) {
320
+ throw new RoundingError(`${String(input)} has more than ${targetScale} decimal places; pass { rounding }`);
321
+ }
322
+ throw error;
323
+ }
324
+ }
325
+ /**
326
+ * parseDecimal, refusing exponents that would make a scale (or a power of ten) beyond MAX_SCALE.
327
+ */
328
+ function parseBoundedDecimal(text) {
329
+ const exponent = EXPONENT.exec(text);
330
+ if (exponent !== null && Math.abs(Number(exponent[1])) > MAX_SCALE) {
331
+ throw new RangeError(`${text}: the exponent is beyond ±${MAX_SCALE}`);
332
+ }
333
+ const parsed = parseDecimal(text);
334
+ if (parsed.scale > MAX_SCALE) {
335
+ throw new RangeError(`${text} has more than ${MAX_SCALE} decimal places`);
336
+ }
337
+ return parsed;
338
+ }
339
+ /** The count of significant digits in a plain decimal string ('0.0012300' has 3). */
340
+ function significantDigits(text) {
341
+ const digits = text.replace(/^[-+]/, '').replace('.', '').replace(/^0+/, '').replace(/0+$/, '');
342
+ return digits.length;
343
+ }
344
+ /**
345
+ * Creates an exact fixed-point decimal.
346
+ *
347
+ * fixed('12.340') // 12.340: a string keeps its scale (3)
348
+ * fixed('1.005', { scale: 2, rounding: 'halfEven' }) // 1.00
349
+ * fixed(12) // 12, scale 0
350
+ * fixed(0.25) // 0.25: read at its shortest decimal form
351
+ * fixed(10n ** 30n)
352
+ *
353
+ * Numbers are taken at their shortest decimal form, and only when that has at most 15 significant
354
+ * digits, which a double always holds faithfully. So `fixed(0.1 + 0.2)` throws rather than becoming
355
+ * 0.30000000000000004; pass the decimal as a string, or give `scale` and `rounding`. Input with
356
+ * more decimals than `scale` throws unless `rounding` is given, and `rounding` needs a `scale`.
357
+ * Scales run from 0 to 1000.
358
+ */
359
+ export function fixed(value, options) {
360
+ const scale = options?.scale;
361
+ if (scale !== undefined) {
362
+ checkScale(scale);
363
+ }
364
+ else if (options?.rounding !== undefined) {
365
+ throw new RangeError('fixed(): `rounding` needs a `scale` to round to');
366
+ }
367
+ const rounding = options?.rounding ?? 'unnecessary';
368
+ if (value instanceof Fixed) {
369
+ return scale === undefined ? value : rescale(value.value, value.scale, scale, rounding, value);
370
+ }
371
+ if (typeof value === 'string') {
372
+ const parsed = parsePlainDecimal(value) ?? parseBoundedDecimal(value);
373
+ if (parsed.scale > MAX_SCALE) {
374
+ throw new RangeError(`${value.slice(0, 40)}… has more than ${MAX_SCALE} decimal places`);
375
+ }
376
+ return rescale(parsed.digits, parsed.scale, scale ?? parsed.scale, rounding, value);
377
+ }
378
+ if (typeof value === 'number') {
379
+ if (Number.isSafeInteger(value)) {
380
+ return scale === undefined ? make(value + 0, 0) : make(scaleUp(value + 0, scale), scale);
381
+ }
382
+ if (!Number.isFinite(value)) {
383
+ throw new RangeError(`Invalid number ${value}`);
384
+ }
385
+ const parsed = parseDecimal(String(value));
386
+ // Only an explicit rounding mode says the float's extra digits may be dropped.
387
+ if (options?.rounding === undefined &&
388
+ significantDigits(formatScaled(normalize(parsed.digits), parsed.scale)) > MAX_FAITHFUL_DIGITS) {
389
+ throw new RangeError(`${value} is not an exact decimal; pass a string, or { scale, rounding }`);
390
+ }
391
+ return rescale(parsed.digits, parsed.scale, scale ?? parsed.scale, rounding, value);
392
+ }
393
+ if (typeof value === 'bigint') {
394
+ return scale === undefined ? make(value, 0) : make(scaleUp(normalize(value), scale), scale);
395
+ }
396
+ throw new TypeError(`Invalid fixed-point value ${String(value)}`);
397
+ }
398
+ /** The Fixed `value / 10^scale`: `fromScaled(12345, 3)` is 12.345. `value` must be an integer. */
399
+ export function fromScaled(value, scale) {
400
+ checkScale(scale);
401
+ if (typeof value === 'number') {
402
+ if (!Number.isSafeInteger(value)) {
403
+ throw new RangeError(`The scaled value must be a safe integer, got ${value}; pass a bigint`);
404
+ }
405
+ return make(value + 0, scale);
406
+ }
407
+ if (typeof value !== 'bigint') {
408
+ throw new TypeError(`Invalid scaled value ${String(value)}`);
409
+ }
410
+ return make(value, scale);
411
+ }
412
+ /** Whether `value` is a Fixed. */
413
+ export function isFixed(value) {
414
+ return value instanceof Fixed;
415
+ }
416
+ /** The exact Fixed of a Money amount, at the money's scale: `money('12.34', 'EUR')` → 12.34. */
417
+ export function moneyToFixed(money) {
418
+ return make(money.minor, money.scale);
419
+ }
420
+ //# sourceMappingURL=fixed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed.js","sourceRoot":"","sources":["../src/fixed.ts"],"names":[],"mappings":"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"}
package/dist/fn.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `@ducatjs/money/fn`: every operation of ducat and its opt-in modules as a plain function
3
+ * (`add(price, fee)`, `allocate(total, [1, 1])`), for code that prefers that style or must not
4
+ * install methods on Money (importing it changes no prototype).
5
+ */
6
+ export { money, fromMinor, zero, fromJSON, isMoney, extendMoney, type ExtendMoneyOptions, sum, ratio, add, subtract, negate, abs, multiply, divide, round, toScale, compare, equals, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual, isZero, isPositive, isNegative, sign, min, max, clamp, toDecimal, toMinor, toMinorNumber, CurrencyMismatchError, type Money, type MoneyJSON, type MoneyOptions, type CurrencyInput, type Factor, type Ratio, } from './money.js';
7
+ export { DEFAULT_ROUNDING, Rounding, RoundingError, type RoundingMode } from './rounding.js';
8
+ export { currencyExponent, defineCurrency, isCurrency, ISO_EXPONENTS, ISO_4217_PUBLISHED, ISO_NON_MONETARY, type CurrencyCode, type IsoCurrencyCode, type CustomCurrencies, } from './currency.js';
9
+ export * from './allocate.js';
10
+ export * from './tax.js';
11
+ export * from './convert.js';
12
+ export * from './exact.js';
13
+ export * from './ecb.js';
14
+ export * from './stripe-fx.js';
15
+ export * from './adyen-fx.js';
16
+ export * from './cash.js';
17
+ export * from './format.js';
18
+ export * from './parse.js';
19
+ export * from './stripe.js';
20
+ export * from './adyen.js';
21
+ export * from './checkout.js';
22
+ export * from './paypal.js';
23
+ export * from './braintree.js';
24
+ export * from './klarna.js';
25
+ export * from './prisma.js';
26
+ export * from './fixed.js';
27
+ //# sourceMappingURL=fn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn.d.ts","sourceRoot":"","sources":["../src/fn.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,WAAW,EACX,KAAK,kBAAkB,EACvB,GAAG,EACH,KAAK,EACL,GAAG,EACH,QAAQ,EACR,MAAM,EACN,GAAG,EACH,QAAQ,EACR,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,MAAM,EACN,UAAU,EACV,UAAU,EACV,IAAI,EACJ,GAAG,EACH,GAAG,EACH,KAAK,EACL,SAAS,EACT,OAAO,EACP,aAAa,EACb,qBAAqB,EACrB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,KAAK,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7F,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
package/dist/fn.js ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `@ducatjs/money/fn`: every operation of ducat and its opt-in modules as a plain function
3
+ * (`add(price, fee)`, `allocate(total, [1, 1])`), for code that prefers that style or must not
4
+ * install methods on Money (importing it changes no prototype).
5
+ */
6
+ // Everything the root entry exports, plus the core Money methods as plain functions. Each is
7
+ // re-exported straight from its own module, so every name is one re-export away from its definition
8
+ // (under vitest each hop is a getter call, which shows in the CodSpeed benchmarks).
9
+ export { money, fromMinor, zero, fromJSON, isMoney, extendMoney, sum, ratio, add, subtract, negate, abs, multiply, divide, round, toScale, compare, equals, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual, isZero, isPositive, isNegative, sign, min, max, clamp, toDecimal, toMinor, toMinorNumber, CurrencyMismatchError, } from './money.js';
10
+ export { DEFAULT_ROUNDING, Rounding, RoundingError } from './rounding.js';
11
+ export { currencyExponent, defineCurrency, isCurrency, ISO_EXPONENTS, ISO_4217_PUBLISHED, ISO_NON_MONETARY, } from './currency.js';
12
+ export * from './allocate.js';
13
+ export * from './tax.js';
14
+ export * from './convert.js';
15
+ export * from './exact.js';
16
+ export * from './ecb.js';
17
+ export * from './stripe-fx.js';
18
+ export * from './adyen-fx.js';
19
+ export * from './cash.js';
20
+ export * from './format.js';
21
+ export * from './parse.js';
22
+ export * from './stripe.js';
23
+ export * from './adyen.js';
24
+ export * from './checkout.js';
25
+ export * from './paypal.js';
26
+ export * from './braintree.js';
27
+ export * from './klarna.js';
28
+ export * from './prisma.js';
29
+ export * from './fixed.js';
30
+ //# sourceMappingURL=fn.js.map
package/dist/fn.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn.js","sourceRoot":"","sources":["../src/fn.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,6FAA6F;AAC7F,oGAAoG;AACpG,oFAAoF;AACpF,OAAO,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,WAAW,EAEX,GAAG,EACH,KAAK,EACL,GAAG,EACH,QAAQ,EACR,MAAM,EACN,GAAG,EACH,QAAQ,EACR,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,MAAM,EACN,UAAU,EACV,UAAU,EACV,IAAI,EACJ,GAAG,EACH,GAAG,EACH,KAAK,EACL,SAAS,EACT,OAAO,EACP,aAAa,EACb,qBAAqB,GAOtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAqB,MAAM,eAAe,CAAC;AAC7F,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,GAIjB,MAAM,eAAe,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type Money } from './money.js';
2
+ /**
3
+ * Locale-aware formatting with Intl.NumberFormat (formatters are cached). The exact decimal string
4
+ * is passed to Intl, so amounts beyond 2^53 format exactly on engines with Intl.NumberFormat v3
5
+ * (Node 19+, Bun, Deno, Chrome 106+, Safari 15.4+, Firefox 116+).
6
+ *
7
+ * format(money('1234.5', 'EUR'), 'de-DE') // "1.234,50 €"
8
+ * format(money('1234.5', 'EUR'), 'en-GB', { currencyDisplay: 'code' })
9
+ */
10
+ export declare function format(money: Money, locale?: string, options?: Intl.NumberFormatOptions): string;
11
+ /** Like format(), but returns Intl parts (for styling the currency symbol separately, etc.). */
12
+ export declare function formatToParts(money: Money, locale?: string, options?: Intl.NumberFormatOptions): Intl.NumberFormatPart[];
13
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAoEnD;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAEhG;AAmBD,gGAAgG;AAChG,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,GACjC,IAAI,CAAC,gBAAgB,EAAE,CAEzB"}
package/dist/format.js ADDED
@@ -0,0 +1,90 @@
1
+ import { POW10 } from './decimal.js';
2
+ import { toDecimal } from './money.js';
3
+ const cache = new Map();
4
+ // one-entry memo in front of the Map: formatting in a loop is almost always the same
5
+ // locale/currency
6
+ let lastLocale;
7
+ let lastCurrency = '';
8
+ let lastScale = -1;
9
+ let lastFormatter;
10
+ let stringInput;
11
+ /** ES2023 Intl.NumberFormat v3 formats decimal strings exactly; older engines convert to Number. */
12
+ function supportsStringInput() {
13
+ if (stringInput === undefined) {
14
+ try {
15
+ stringInput =
16
+ new Intl.NumberFormat('en', { useGrouping: false }).format('9007199254740993') === '9007199254740993';
17
+ }
18
+ catch {
19
+ stringInput = false;
20
+ }
21
+ }
22
+ return stringInput;
23
+ }
24
+ function formatter(money, locale, options) {
25
+ if (options === undefined &&
26
+ lastFormatter !== undefined &&
27
+ locale === lastLocale &&
28
+ money.currency === lastCurrency &&
29
+ money.scale === lastScale) {
30
+ return lastFormatter;
31
+ }
32
+ const key = options === undefined ? `${locale}|${money.currency}|${money.scale}` : null;
33
+ let numberFormat = key === null ? undefined : cache.get(key);
34
+ if (numberFormat === undefined) {
35
+ numberFormat = new Intl.NumberFormat(locale, {
36
+ style: 'currency',
37
+ currency: money.currency,
38
+ // ISO exponent (or the value's scale), not the engine's default digits: V8 (CLDR) shows ALL,
39
+ // IQD, RSD ... with 0 decimals and JSC with ISO's; we always show what the value holds.
40
+ minimumFractionDigits: money.scale,
41
+ maximumFractionDigits: money.scale,
42
+ ...options,
43
+ });
44
+ if (key !== null) {
45
+ if (cache.size > 256) {
46
+ cache.clear();
47
+ }
48
+ cache.set(key, numberFormat);
49
+ }
50
+ }
51
+ if (key !== null) {
52
+ lastLocale = locale;
53
+ lastCurrency = money.currency;
54
+ lastScale = money.scale;
55
+ lastFormatter = numberFormat;
56
+ }
57
+ return numberFormat;
58
+ }
59
+ /**
60
+ * Locale-aware formatting with Intl.NumberFormat (formatters are cached). The exact decimal string
61
+ * is passed to Intl, so amounts beyond 2^53 format exactly on engines with Intl.NumberFormat v3
62
+ * (Node 19+, Bun, Deno, Chrome 106+, Safari 15.4+, Firefox 116+).
63
+ *
64
+ * format(money('1234.5', 'EUR'), 'de-DE') // "1.234,50 €"
65
+ * format(money('1234.5', 'EUR'), 'en-GB', { currencyDisplay: 'code' })
66
+ */
67
+ export function format(money, locale, options) {
68
+ return formatter(money, locale, options).format(intlValue(money));
69
+ }
70
+ /**
71
+ * What to hand to Intl (which only accepts doubles or strings). Below 10^15 minor units the value
72
+ * has at most 15 significant digits, so the double nearest to it formats back to exactly the same
73
+ * digits. `minor / 10^scale` is a single correctly rounded IEEE division of two exactly
74
+ * representable integers, i.e. bit-identical to Number(toDecimal(m)) (asserted in
75
+ * test/format.test.ts), and 2-3x cheaper; this display hand-off is the only place a double ever
76
+ * touches an amount. Larger values go to Intl as the exact decimal string (Intl.NumberFormat v3).
77
+ */
78
+ function intlValue(money) {
79
+ const minor = money.minor;
80
+ if (typeof minor === 'number' && minor < 1e15 && minor > -1e15 && money.scale <= 15) {
81
+ return minor / POW10[money.scale];
82
+ }
83
+ const decimal = toDecimal(money);
84
+ return (supportsStringInput() ? decimal : Number(decimal));
85
+ }
86
+ /** Like format(), but returns Intl parts (for styling the currency symbol separately, etc.). */
87
+ export function formatToParts(money, locale, options) {
88
+ return formatter(money, locale, options).formatToParts(intlValue(money));
89
+ }
90
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,SAAS,EAAc,MAAM,YAAY,CAAC;AAEnD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;AACnD,qFAAqF;AACrF,kBAAkB;AAClB,IAAI,UAA8B,CAAC;AACnC,IAAI,YAAY,GAAG,EAAE,CAAC;AACtB,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;AACnB,IAAI,aAA4C,CAAC;AAEjD,IAAI,WAAgC,CAAC;AACrC,oGAAoG;AACpG,SAAS,mBAAmB;IAC1B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,WAAW;gBACT,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CACxD,kBAAuC,CACxC,KAAK,kBAAkB,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,SAAS,CAChB,KAAY,EACZ,MAA0B,EAC1B,OAA6C;IAE7C,IACE,OAAO,KAAK,SAAS;QACrB,aAAa,KAAK,SAAS;QAC3B,MAAM,KAAK,UAAU;QACrB,KAAK,CAAC,QAAQ,KAAK,YAAY;QAC/B,KAAK,CAAC,KAAK,KAAK,SAAS,EACzB,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,IAAI,YAAY,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAC3C,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,6FAA6F;YAC7F,wFAAwF;YACxF,qBAAqB,EAAE,KAAK,CAAC,KAAK;YAClC,qBAAqB,EAAE,KAAK,CAAC,KAAK;YAClC,GAAG,OAAO;SACX,CAAC,CAAC;QACH,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;gBACrB,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,UAAU,GAAG,MAAM,CAAC;QACpB,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC9B,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,aAAa,GAAG,YAAY,CAAC;IAC/B,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,KAAY,EAAE,MAAe,EAAE,OAAkC;IACtF,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,KAAY;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACpF,OAAO,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC;IACrC,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAW,CAAC;AACvE,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,aAAa,CAC3B,KAAY,EACZ,MAAe,EACf,OAAkC;IAElC,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Adyen minor-unit exponents (Adyen's table is authoritative where it differs from ISO: CLP, CVE, IDR, ISK). */
2
+ export declare const ADYEN_EXPONENTS: Readonly<Record<string, number>>;
3
+ //# sourceMappingURL=adyen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adyen.d.ts","sourceRoot":"","sources":["../../src/generated/adyen.ts"],"names":[],"mappings":"AAGA,iHAAiH;AACjH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2I5D,CAAC"}