@ducatjs/money 0.0.0 → 0.2.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 (398) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +51 -0
  3. package/README.md +1034 -3
  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 +520 -0
  9. package/data/checkout.json +230 -0
  10. package/data/cldr-cash.json +101 -0
  11. package/data/historic.json +78 -0
  12. package/data/iso4217-list-one.xml +1956 -0
  13. package/data/iso4217-list-three.xml +1185 -0
  14. package/data/klarna.json +95 -0
  15. package/data/paypal.json +65 -0
  16. package/data/stripe-fx.json +17 -0
  17. package/data/stripe.json +285 -0
  18. package/dist/adyen-fx.d.ts +25 -0
  19. package/dist/adyen-fx.d.ts.map +1 -0
  20. package/dist/adyen-fx.js +140 -0
  21. package/dist/adyen-fx.js.map +1 -0
  22. package/dist/adyen.d.ts +25 -0
  23. package/dist/adyen.d.ts.map +1 -0
  24. package/dist/adyen.js +34 -0
  25. package/dist/adyen.js.map +1 -0
  26. package/dist/allocate.d.ts +72 -0
  27. package/dist/allocate.d.ts.map +1 -0
  28. package/dist/allocate.js +314 -0
  29. package/dist/allocate.js.map +1 -0
  30. package/dist/bag.d.ts +58 -0
  31. package/dist/bag.d.ts.map +1 -0
  32. package/dist/bag.js +122 -0
  33. package/dist/bag.js.map +1 -0
  34. package/dist/boc.d.ts +31 -0
  35. package/dist/boc.d.ts.map +1 -0
  36. package/dist/boc.js +114 -0
  37. package/dist/boc.js.map +1 -0
  38. package/dist/boe.d.ts +33 -0
  39. package/dist/boe.d.ts.map +1 -0
  40. package/dist/boe.js +114 -0
  41. package/dist/boe.js.map +1 -0
  42. package/dist/braintree.d.ts +34 -0
  43. package/dist/braintree.d.ts.map +1 -0
  44. package/dist/braintree.js +45 -0
  45. package/dist/braintree.js.map +1 -0
  46. package/dist/cash.d.ts +64 -0
  47. package/dist/cash.d.ts.map +1 -0
  48. package/dist/cash.js +134 -0
  49. package/dist/cash.js.map +1 -0
  50. package/dist/checkout.d.ts +42 -0
  51. package/dist/checkout.d.ts.map +1 -0
  52. package/dist/checkout.js +52 -0
  53. package/dist/checkout.js.map +1 -0
  54. package/dist/convert.d.ts +52 -0
  55. package/dist/convert.d.ts.map +1 -0
  56. package/dist/convert.js +65 -0
  57. package/dist/convert.js.map +1 -0
  58. package/dist/currency.d.ts +22 -0
  59. package/dist/currency.d.ts.map +1 -0
  60. package/dist/currency.js +38 -0
  61. package/dist/currency.js.map +1 -0
  62. package/dist/decimal.d.ts +52 -0
  63. package/dist/decimal.d.ts.map +1 -0
  64. package/dist/decimal.js +251 -0
  65. package/dist/decimal.js.map +1 -0
  66. package/dist/drizzle/mysql.d.ts +105 -0
  67. package/dist/drizzle/mysql.d.ts.map +1 -0
  68. package/dist/drizzle/mysql.js +60 -0
  69. package/dist/drizzle/mysql.js.map +1 -0
  70. package/dist/drizzle/pg.d.ts +103 -0
  71. package/dist/drizzle/pg.d.ts.map +1 -0
  72. package/dist/drizzle/pg.js +60 -0
  73. package/dist/drizzle/pg.js.map +1 -0
  74. package/dist/drizzle/sqlite.d.ts +102 -0
  75. package/dist/drizzle/sqlite.d.ts.map +1 -0
  76. package/dist/drizzle/sqlite.js +59 -0
  77. package/dist/drizzle/sqlite.js.map +1 -0
  78. package/dist/ecb.d.ts +52 -0
  79. package/dist/ecb.d.ts.map +1 -0
  80. package/dist/ecb.js +285 -0
  81. package/dist/ecb.js.map +1 -0
  82. package/dist/exact.d.ts +62 -0
  83. package/dist/exact.d.ts.map +1 -0
  84. package/dist/exact.js +147 -0
  85. package/dist/exact.js.map +1 -0
  86. package/dist/fed.d.ts +35 -0
  87. package/dist/fed.d.ts.map +1 -0
  88. package/dist/fed.js +134 -0
  89. package/dist/fed.js.map +1 -0
  90. package/dist/fetch.d.ts +103 -0
  91. package/dist/fetch.d.ts.map +1 -0
  92. package/dist/fetch.js +222 -0
  93. package/dist/fetch.js.map +1 -0
  94. package/dist/fixed.d.ts +121 -0
  95. package/dist/fixed.d.ts.map +1 -0
  96. package/dist/fixed.js +420 -0
  97. package/dist/fixed.js.map +1 -0
  98. package/dist/fn.d.ts +34 -0
  99. package/dist/fn.d.ts.map +1 -0
  100. package/dist/fn.js +37 -0
  101. package/dist/fn.js.map +1 -0
  102. package/dist/format.d.ts +13 -0
  103. package/dist/format.d.ts.map +1 -0
  104. package/dist/format.js +90 -0
  105. package/dist/format.js.map +1 -0
  106. package/dist/generated/adyen.d.ts +3 -0
  107. package/dist/generated/adyen.d.ts.map +1 -0
  108. package/dist/generated/adyen.js +144 -0
  109. package/dist/generated/adyen.js.map +1 -0
  110. package/dist/generated/braintree.d.ts +3 -0
  111. package/dist/generated/braintree.d.ts.map +1 -0
  112. package/dist/generated/braintree.js +140 -0
  113. package/dist/generated/braintree.js.map +1 -0
  114. package/dist/generated/cash.d.ts +14 -0
  115. package/dist/generated/cash.d.ts.map +1 -0
  116. package/dist/generated/cash.js +465 -0
  117. package/dist/generated/cash.js.map +1 -0
  118. package/dist/generated/checkout.d.ts +3 -0
  119. package/dist/generated/checkout.d.ts.map +1 -0
  120. package/dist/generated/checkout.js +151 -0
  121. package/dist/generated/checkout.js.map +1 -0
  122. package/dist/generated/historic.d.ts +337 -0
  123. package/dist/generated/historic.d.ts.map +1 -0
  124. package/dist/generated/historic.js +66 -0
  125. package/dist/generated/historic.js.map +1 -0
  126. package/dist/generated/iso4217.d.ts +174 -0
  127. package/dist/generated/iso4217.d.ts.map +1 -0
  128. package/dist/generated/iso4217.js +175 -0
  129. package/dist/generated/iso4217.js.map +1 -0
  130. package/dist/generated/kernel.d.ts +17 -0
  131. package/dist/generated/kernel.d.ts.map +1 -0
  132. package/dist/generated/kernel.js +208 -0
  133. package/dist/generated/kernel.js.map +1 -0
  134. package/dist/generated/klarna.d.ts +3 -0
  135. package/dist/generated/klarna.d.ts.map +1 -0
  136. package/dist/generated/klarna.js +21 -0
  137. package/dist/generated/klarna.js.map +1 -0
  138. package/dist/generated/paypal.d.ts +3 -0
  139. package/dist/generated/paypal.d.ts.map +1 -0
  140. package/dist/generated/paypal.js +31 -0
  141. package/dist/generated/paypal.js.map +1 -0
  142. package/dist/generated/stripe.d.ts +8 -0
  143. package/dist/generated/stripe.d.ts.map +1 -0
  144. package/dist/generated/stripe.js +150 -0
  145. package/dist/generated/stripe.js.map +1 -0
  146. package/dist/historic.d.ts +40 -0
  147. package/dist/historic.d.ts.map +1 -0
  148. package/dist/historic.js +43 -0
  149. package/dist/historic.js.map +1 -0
  150. package/dist/history.d.ts +96 -0
  151. package/dist/history.d.ts.map +1 -0
  152. package/dist/history.js +213 -0
  153. package/dist/history.js.map +1 -0
  154. package/dist/hmrc.d.ts +28 -0
  155. package/dist/hmrc.d.ts.map +1 -0
  156. package/dist/hmrc.js +108 -0
  157. package/dist/hmrc.js.map +1 -0
  158. package/dist/index.d.ts +11 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +11 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/klarna.d.ts +31 -0
  163. package/dist/klarna.d.ts.map +1 -0
  164. package/dist/klarna.js +38 -0
  165. package/dist/klarna.js.map +1 -0
  166. package/dist/kysely.d.ts +120 -0
  167. package/dist/kysely.d.ts.map +1 -0
  168. package/dist/kysely.js +309 -0
  169. package/dist/kysely.js.map +1 -0
  170. package/dist/money.d.ts +302 -0
  171. package/dist/money.d.ts.map +1 -0
  172. package/dist/money.js +703 -0
  173. package/dist/money.js.map +1 -0
  174. package/dist/parse.d.ts +55 -0
  175. package/dist/parse.d.ts.map +1 -0
  176. package/dist/parse.js +419 -0
  177. package/dist/parse.js.map +1 -0
  178. package/dist/paypal.d.ts +41 -0
  179. package/dist/paypal.d.ts.map +1 -0
  180. package/dist/paypal.js +58 -0
  181. package/dist/paypal.js.map +1 -0
  182. package/dist/pg.d.ts +100 -0
  183. package/dist/pg.d.ts.map +1 -0
  184. package/dist/pg.js +343 -0
  185. package/dist/pg.js.map +1 -0
  186. package/dist/plugins/adyen.d.ts +15 -0
  187. package/dist/plugins/adyen.d.ts.map +1 -0
  188. package/dist/plugins/adyen.js +10 -0
  189. package/dist/plugins/adyen.js.map +1 -0
  190. package/dist/plugins/all.d.ts +29 -0
  191. package/dist/plugins/all.d.ts.map +1 -0
  192. package/dist/plugins/all.js +30 -0
  193. package/dist/plugins/all.js.map +1 -0
  194. package/dist/plugins/allocate.d.ts +20 -0
  195. package/dist/plugins/allocate.d.ts.map +1 -0
  196. package/dist/plugins/allocate.js +26 -0
  197. package/dist/plugins/allocate.js.map +1 -0
  198. package/dist/plugins/braintree.d.ts +12 -0
  199. package/dist/plugins/braintree.d.ts.map +1 -0
  200. package/dist/plugins/braintree.js +12 -0
  201. package/dist/plugins/braintree.js.map +1 -0
  202. package/dist/plugins/cash.d.ts +19 -0
  203. package/dist/plugins/cash.d.ts.map +1 -0
  204. package/dist/plugins/cash.js +16 -0
  205. package/dist/plugins/cash.js.map +1 -0
  206. package/dist/plugins/checkout.d.ts +21 -0
  207. package/dist/plugins/checkout.d.ts.map +1 -0
  208. package/dist/plugins/checkout.js +16 -0
  209. package/dist/plugins/checkout.js.map +1 -0
  210. package/dist/plugins/convert.d.ts +19 -0
  211. package/dist/plugins/convert.d.ts.map +1 -0
  212. package/dist/plugins/convert.js +13 -0
  213. package/dist/plugins/convert.js.map +1 -0
  214. package/dist/plugins/exact.d.ts +15 -0
  215. package/dist/plugins/exact.d.ts.map +1 -0
  216. package/dist/plugins/exact.js +13 -0
  217. package/dist/plugins/exact.js.map +1 -0
  218. package/dist/plugins/fixed.d.ts +17 -0
  219. package/dist/plugins/fixed.d.ts.map +1 -0
  220. package/dist/plugins/fixed.js +13 -0
  221. package/dist/plugins/fixed.js.map +1 -0
  222. package/dist/plugins/format.d.ts +9 -0
  223. package/dist/plugins/format.d.ts.map +1 -0
  224. package/dist/plugins/format.js +16 -0
  225. package/dist/plugins/format.js.map +1 -0
  226. package/dist/plugins/klarna.d.ts +10 -0
  227. package/dist/plugins/klarna.d.ts.map +1 -0
  228. package/dist/plugins/klarna.js +10 -0
  229. package/dist/plugins/klarna.js.map +1 -0
  230. package/dist/plugins/paypal.d.ts +14 -0
  231. package/dist/plugins/paypal.d.ts.map +1 -0
  232. package/dist/plugins/paypal.js +16 -0
  233. package/dist/plugins/paypal.js.map +1 -0
  234. package/dist/plugins/prisma.d.ts +8 -0
  235. package/dist/plugins/prisma.d.ts.map +1 -0
  236. package/dist/plugins/prisma.js +13 -0
  237. package/dist/plugins/prisma.js.map +1 -0
  238. package/dist/plugins/stripe.d.ts +14 -0
  239. package/dist/plugins/stripe.d.ts.map +1 -0
  240. package/dist/plugins/stripe.js +16 -0
  241. package/dist/plugins/stripe.js.map +1 -0
  242. package/dist/plugins/tax.d.ts +20 -0
  243. package/dist/plugins/tax.d.ts.map +1 -0
  244. package/dist/plugins/tax.js +18 -0
  245. package/dist/plugins/tax.js.map +1 -0
  246. package/dist/policy.d.ts +34 -0
  247. package/dist/policy.d.ts.map +1 -0
  248. package/dist/policy.js +90 -0
  249. package/dist/policy.js.map +1 -0
  250. package/dist/prisma.d.ts +77 -0
  251. package/dist/prisma.d.ts.map +1 -0
  252. package/dist/prisma.js +76 -0
  253. package/dist/prisma.js.map +1 -0
  254. package/dist/processor.d.ts +28 -0
  255. package/dist/processor.d.ts.map +1 -0
  256. package/dist/processor.js +118 -0
  257. package/dist/processor.js.map +1 -0
  258. package/dist/provider.d.ts +103 -0
  259. package/dist/provider.d.ts.map +1 -0
  260. package/dist/provider.js +280 -0
  261. package/dist/provider.js.map +1 -0
  262. package/dist/rate-text.d.ts +38 -0
  263. package/dist/rate-text.d.ts.map +1 -0
  264. package/dist/rate-text.js +143 -0
  265. package/dist/rate-text.js.map +1 -0
  266. package/dist/rate.d.ts +175 -0
  267. package/dist/rate.d.ts.map +1 -0
  268. package/dist/rate.js +371 -0
  269. package/dist/rate.js.map +1 -0
  270. package/dist/rounding-error.d.ts +9 -0
  271. package/dist/rounding-error.d.ts.map +1 -0
  272. package/dist/rounding-error.js +9 -0
  273. package/dist/rounding-error.js.map +1 -0
  274. package/dist/rounding.d.ts +50 -0
  275. package/dist/rounding.d.ts.map +1 -0
  276. package/dist/rounding.js +87 -0
  277. package/dist/rounding.js.map +1 -0
  278. package/dist/schema.d.ts +43 -0
  279. package/dist/schema.d.ts.map +1 -0
  280. package/dist/schema.js +77 -0
  281. package/dist/schema.js.map +1 -0
  282. package/dist/sql.d.ts +54 -0
  283. package/dist/sql.d.ts.map +1 -0
  284. package/dist/sql.js +131 -0
  285. package/dist/sql.js.map +1 -0
  286. package/dist/stripe-fx.d.ts +22 -0
  287. package/dist/stripe-fx.d.ts.map +1 -0
  288. package/dist/stripe-fx.js +30 -0
  289. package/dist/stripe-fx.js.map +1 -0
  290. package/dist/stripe.d.ts +36 -0
  291. package/dist/stripe.d.ts.map +1 -0
  292. package/dist/stripe.js +39 -0
  293. package/dist/stripe.js.map +1 -0
  294. package/dist/tax.d.ts +33 -0
  295. package/dist/tax.d.ts.map +1 -0
  296. package/dist/tax.js +55 -0
  297. package/dist/tax.js.map +1 -0
  298. package/dist/testing/arbitraries.d.ts +43 -0
  299. package/dist/testing/arbitraries.d.ts.map +1 -0
  300. package/dist/testing/arbitraries.js +98 -0
  301. package/dist/testing/arbitraries.js.map +1 -0
  302. package/dist/testing/index.d.ts +67 -0
  303. package/dist/testing/index.d.ts.map +1 -0
  304. package/dist/testing/index.js +159 -0
  305. package/dist/testing/index.js.map +1 -0
  306. package/dist/testing/jest.d.ts +2 -0
  307. package/dist/testing/jest.d.ts.map +1 -0
  308. package/dist/testing/jest.js +15 -0
  309. package/dist/testing/jest.js.map +1 -0
  310. package/dist/testing/vitest.d.ts +7 -0
  311. package/dist/testing/vitest.d.ts.map +1 -0
  312. package/dist/testing/vitest.js +12 -0
  313. package/dist/testing/vitest.js.map +1 -0
  314. package/dist/valibot.d.ts +33 -0
  315. package/dist/valibot.d.ts.map +1 -0
  316. package/dist/valibot.js +61 -0
  317. package/dist/valibot.js.map +1 -0
  318. package/dist/zod.d.ts +36 -0
  319. package/dist/zod.d.ts.map +1 -0
  320. package/dist/zod.js +58 -0
  321. package/dist/zod.js.map +1 -0
  322. package/package.json +280 -5
  323. package/src/adyen-fx.ts +175 -0
  324. package/src/adyen.ts +46 -0
  325. package/src/allocate.ts +393 -0
  326. package/src/bag.ts +170 -0
  327. package/src/boc.ts +136 -0
  328. package/src/boe.ts +131 -0
  329. package/src/braintree.ts +71 -0
  330. package/src/cash.ts +183 -0
  331. package/src/checkout.ts +77 -0
  332. package/src/convert.ts +177 -0
  333. package/src/currency.ts +61 -0
  334. package/src/decimal.ts +283 -0
  335. package/src/drizzle/mysql.ts +78 -0
  336. package/src/drizzle/pg.ts +78 -0
  337. package/src/drizzle/sqlite.ts +70 -0
  338. package/src/ecb.ts +328 -0
  339. package/src/exact.ts +182 -0
  340. package/src/fed.ts +146 -0
  341. package/src/fetch.ts +306 -0
  342. package/src/fixed.ts +558 -0
  343. package/src/fn.ts +94 -0
  344. package/src/format.ts +106 -0
  345. package/src/generated/adyen.ts +144 -0
  346. package/src/generated/braintree.ts +140 -0
  347. package/src/generated/cash.ts +478 -0
  348. package/src/generated/checkout.ts +151 -0
  349. package/src/generated/historic.ts +67 -0
  350. package/src/generated/iso4217.ts +179 -0
  351. package/src/generated/kernel.ts +230 -0
  352. package/src/generated/klarna.ts +21 -0
  353. package/src/generated/paypal.ts +31 -0
  354. package/src/generated/stripe.ts +150 -0
  355. package/src/historic.ts +77 -0
  356. package/src/history.ts +333 -0
  357. package/src/hmrc.ts +125 -0
  358. package/src/index.ts +41 -0
  359. package/src/klarna.ts +54 -0
  360. package/src/kysely.ts +588 -0
  361. package/src/money.ts +979 -0
  362. package/src/parse.ts +511 -0
  363. package/src/paypal.ts +93 -0
  364. package/src/pg.ts +410 -0
  365. package/src/plugins/adyen.ts +25 -0
  366. package/src/plugins/all.ts +57 -0
  367. package/src/plugins/allocate.ts +53 -0
  368. package/src/plugins/braintree.ts +23 -0
  369. package/src/plugins/cash.ts +33 -0
  370. package/src/plugins/checkout.ts +32 -0
  371. package/src/plugins/convert.ts +49 -0
  372. package/src/plugins/exact.ts +23 -0
  373. package/src/plugins/fixed.ts +28 -0
  374. package/src/plugins/format.ts +28 -0
  375. package/src/plugins/klarna.ts +21 -0
  376. package/src/plugins/paypal.ts +29 -0
  377. package/src/plugins/prisma.ts +24 -0
  378. package/src/plugins/stripe.ts +29 -0
  379. package/src/plugins/tax.ts +40 -0
  380. package/src/policy.ts +124 -0
  381. package/src/prisma.ts +199 -0
  382. package/src/processor.ts +181 -0
  383. package/src/provider.ts +389 -0
  384. package/src/rate-text.ts +151 -0
  385. package/src/rate.ts +546 -0
  386. package/src/rounding-error.ts +8 -0
  387. package/src/rounding.ts +122 -0
  388. package/src/schema.ts +119 -0
  389. package/src/sql.ts +178 -0
  390. package/src/stripe-fx.ts +49 -0
  391. package/src/stripe.ts +69 -0
  392. package/src/tax.ts +102 -0
  393. package/src/testing/arbitraries.ts +134 -0
  394. package/src/testing/index.ts +247 -0
  395. package/src/testing/jest.ts +18 -0
  396. package/src/testing/vitest.ts +18 -0
  397. package/src/valibot.ts +87 -0
  398. package/src/zod.ts +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate.d.ts","sourceRoot":"","sources":["../src/rate.ts"],"names":[],"mappings":"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"}
package/dist/rate.js ADDED
@@ -0,0 +1,371 @@
1
+ // Exchange rates as exact rationals with metadata. A Rate never loses digits: inverses,
2
+ // compositions and margins are exact products of ratios, and rounding happens once, when an amount
3
+ // is converted.
4
+ import { currencyExponent } from './currency.js';
5
+ import { formatScaled, POW10, pow10n, ratio, ratioToDecimal, normalizeMinor, } from './decimal.js';
6
+ import { CurrencyMismatchError, make, roundWithPolicy, } from './money.js';
7
+ import { DEFAULT_ROUNDING, divideAndRound, divideAndRoundBigint, } from './rounding.js';
8
+ const MAX_SAFE_MINOR = Number.MAX_SAFE_INTEGER;
9
+ /** Thrown by a strict-validity conversion with a rate past its `validUntil`. */
10
+ export class RateExpiredError extends RangeError {
11
+ validUntil;
12
+ constructor(from, to, validUntil) {
13
+ super(`Exchange rate ${from}→${to} expired at ${validUntil}`);
14
+ this.name = 'RateExpiredError';
15
+ this.validUntil = validUntil;
16
+ }
17
+ }
18
+ const OPPOSITE_SIDE = { bid: 'ask', ask: 'bid' };
19
+ const ISO_DATE = /^\d{4}-\d\d-\d\d$/;
20
+ /**
21
+ * @internal
22
+ * A date stays as given ('2026-11-06'); an instant becomes UTC ISO ('2026-11-06T15:00:00.000Z'), so
23
+ * that times with different offsets compare correctly as strings.
24
+ */
25
+ export function toIsoString(time) {
26
+ if (typeof time === 'string' && ISO_DATE.test(time)) {
27
+ return time;
28
+ }
29
+ const date = time instanceof Date ? time : new Date(time);
30
+ if (Number.isNaN(date.getTime())) {
31
+ throw new RangeError(`Invalid date or time ${String(time)}`);
32
+ }
33
+ return date.toISOString();
34
+ }
35
+ /** A date as the first instant of its UTC day; an instant as it is. */
36
+ function asInstant(time) {
37
+ return ISO_DATE.test(time) ? `${time}T00:00:00.000Z` : time;
38
+ }
39
+ /**
40
+ * @internal
41
+ * Whether `time` has come by `at`. A date `at` means the whole of that UTC day, so anything on or
42
+ * before that day counts; a date `time` means the start of its day.
43
+ */
44
+ export function hasStarted(time, at) {
45
+ const instant = toIsoString(at);
46
+ if (ISO_DATE.test(instant)) {
47
+ return time.slice(0, 10) <= instant;
48
+ }
49
+ return asInstant(time) <= instant;
50
+ }
51
+ /** @internal Whether `validUntil` (a date: valid all day, UTC) has passed at `at`. */
52
+ export function hasEnded(validUntil, at) {
53
+ const instant = asInstant(toIsoString(at));
54
+ if (ISO_DATE.test(validUntil)) {
55
+ return instant.slice(0, 10) > validUntil;
56
+ }
57
+ return instant > validUntil;
58
+ }
59
+ /**
60
+ * The earlier of two ISO-8601 strings (one format compares lexicographically), or the later one
61
+ * with `later`; undefined = no limit.
62
+ */
63
+ function earlier(first, second, later) {
64
+ if (first === undefined) {
65
+ return second;
66
+ }
67
+ if (second === undefined) {
68
+ return first;
69
+ }
70
+ if (later === true) {
71
+ return first >= second ? first : second;
72
+ }
73
+ return first <= second ? first : second;
74
+ }
75
+ /**
76
+ * minor × rate × 10^scaleShift, rounded once with `rounding`. This is the kernel of every
77
+ * conversion: `scaleShift` is the result scale minus the input scale. Pure, and `rate.den > 0` by
78
+ * construction.
79
+ */
80
+ export function multiplyByRatioAtScale(minor, rate, scaleShift, rounding) {
81
+ // Fast path: all factors are safe integers, so a product that stays in the safe range is exact.
82
+ // `rate.n === rate.n` is false only for NaN, which marks a numerator that isn't a safe integer.
83
+ const rateIsSafe = rate.n === rate.n && rate.d === rate.d;
84
+ if (typeof minor === 'number' && rateIsSafe && scaleShift >= -15 && scaleShift <= 15) {
85
+ let numerator = rate.n;
86
+ let denominator = rate.d;
87
+ if (scaleShift > 0) {
88
+ numerator *= POW10[scaleShift];
89
+ }
90
+ else if (scaleShift < 0) {
91
+ denominator *= POW10[-scaleShift];
92
+ }
93
+ if (numerator <= MAX_SAFE_MINOR && denominator <= MAX_SAFE_MINOR) {
94
+ const product = minor * numerator;
95
+ if (product <= MAX_SAFE_MINOR && product >= -MAX_SAFE_MINOR) {
96
+ return divideAndRound(product, denominator, rounding);
97
+ }
98
+ }
99
+ }
100
+ // Slow path: the same single division, in bigint.
101
+ let numerator = BigInt(minor) * rate.num;
102
+ let denominator = rate.den;
103
+ if (scaleShift > 0) {
104
+ numerator *= pow10n(scaleShift);
105
+ }
106
+ else if (scaleShift < 0) {
107
+ denominator *= pow10n(-scaleShift);
108
+ }
109
+ return normalizeMinor(divideAndRoundBigint(numerator, denominator, rounding));
110
+ }
111
+ /**
112
+ * An exact exchange rate: one unit of `from` is worth `ratio` units of `to`. Build it with
113
+ * `exchangeRate()`. Derived rates (`inverse`, `andThen`, `withMargin`, `round`) keep their inputs
114
+ * in `derivedFrom`, the audit chain. Their `asOf` is the oldest input's, so staleness can't hide,
115
+ * and their `validUntil` is the earliest.
116
+ */
117
+ export class Rate {
118
+ from;
119
+ to;
120
+ ratio;
121
+ /** @internal use exchangeRate() */
122
+ constructor(from, to, rate, info, derivedFrom) {
123
+ // Rebuilt so that a hand-made Ratio object is reduced, has a positive denominator, and has
124
+ // number fields that match its bigints (the fast path relies on them).
125
+ const normalized = ratio(rate.num, rate.den);
126
+ if (normalized.num <= 0n) {
127
+ throw new RangeError('Exchange rate must be positive');
128
+ }
129
+ this.from = from;
130
+ this.to = to;
131
+ this.ratio = normalized;
132
+ // Only defined fields are assigned, so rates compare and serialise without undefined keys.
133
+ const writable = this;
134
+ const quote = info?.quote;
135
+ if (quote !== undefined) {
136
+ // toString prints a one-for-one quote, so it must be this rate. (rateFromQuote derives a
137
+ // scaled or inverted rate from its quote, so that one can't disagree.)
138
+ const direct = quote.per === undefined && quote.inverted !== true;
139
+ // ratio() caches strings, so for a rate built from the same text this is two lookups.
140
+ const quoted = direct ? ratio(quote.rate) : normalized;
141
+ if (quoted.num !== normalized.num || quoted.den !== normalized.den) {
142
+ throw new RangeError(`Quote ${quote.rate} isn't the rate ${from}→${to}`);
143
+ }
144
+ }
145
+ if (info !== undefined) {
146
+ Object.assign(this, infoOf(info));
147
+ }
148
+ if (derivedFrom !== undefined) {
149
+ writable.derivedFrom = derivedFrom;
150
+ }
151
+ }
152
+ /** The exact reciprocal, `to` → `from`. A bid becomes an ask and vice versa. */
153
+ inverse() {
154
+ let type = this.type;
155
+ if (type !== undefined) {
156
+ type = OPPOSITE_SIDE[type] ?? type;
157
+ }
158
+ const reciprocal = ratio(this.ratio.den, this.ratio.num);
159
+ let info = timingOf(this, type);
160
+ // The published number reads the other way round now, so the inverse of a quoted rate keeps
161
+ // its digits too: the inverse of CAD→USD quoted as 1.3650 inverted prints '1.3650'.
162
+ const quote = this.quote;
163
+ if (quote !== undefined) {
164
+ const { inverted, ...rest } = quote;
165
+ info = { ...info, quote: inverted === true ? rest : { ...rest, inverted: true } };
166
+ }
167
+ return new Rate(this.to, this.from, reciprocal, info, [this]);
168
+ }
169
+ /**
170
+ * The exact composite `from` → `next.to`. Nothing is rounded: converting with it rounds once.
171
+ * (Named `andThen`, not `then`, so that a Rate is never mistaken for a promise.)
172
+ */
173
+ andThen(next) {
174
+ if (next.from !== this.to) {
175
+ throw new CurrencyMismatchError(this.to, next.from);
176
+ }
177
+ const product = ratio(this.ratio.num * next.ratio.num, this.ratio.den * next.ratio.den);
178
+ // A composite keeps a type only when both legs agree, so it can't be mislabelled.
179
+ let type;
180
+ if (this.type === next.type) {
181
+ type = this.type;
182
+ }
183
+ // A composite is known only once both legs are, and is valid only while both are.
184
+ const asOf = earlier(this.asOf, next.asOf);
185
+ const availableAt = earlier(this.availableAt, next.availableAt, true);
186
+ const validUntil = earlier(this.validUntil, next.validUntil);
187
+ const info = timing(asOf, availableAt, validUntil, type);
188
+ return new Rate(this.from, next.to, product, info, [this, next]);
189
+ }
190
+ /** This rate × (1 + margin), exactly: `withMargin('-0.02')` gives 2% less `to` per `from`. */
191
+ withMargin(margin) {
192
+ const marginRatio = ratio(margin);
193
+ const numerator = this.ratio.num * (marginRatio.den + marginRatio.num);
194
+ const denominator = this.ratio.den * marginRatio.den;
195
+ return new Rate(this.from, this.to, ratio(numerator, denominator), timingOf(this), [this]);
196
+ }
197
+ /**
198
+ * A new Rate rounded to `places` decimals, for businesses that quote rounded (e.g. inverse)
199
+ * rates.
200
+ */
201
+ round(places, rounding = 'halfEven') {
202
+ const rounded = ratio(this.toDecimal(places, rounding));
203
+ return new Rate(this.from, this.to, rounded, timingOf(this, this.type), [this]);
204
+ }
205
+ /** The rate with exactly `places` decimals, for display. The Rate itself keeps every digit. */
206
+ toDecimal(places, rounding = 'halfEven') {
207
+ const scaled = divideAndRoundBigint(this.ratio.num * pow10n(places), this.ratio.den, rounding);
208
+ return formatScaled(scaled, places);
209
+ }
210
+ /**
211
+ * The exact rate: '1.1165', or '2000/2233' when its decimal expansion doesn't terminate. A rate
212
+ * published one unit for one unit keeps the published digits ('136.80').
213
+ */
214
+ toString() {
215
+ const quote = this.quote;
216
+ if (quote !== undefined && quote.per === undefined && quote.inverted !== true) {
217
+ return quote.rate;
218
+ }
219
+ return ratioToDecimal(this.ratio) ?? `${this.ratio.num}/${this.ratio.den}`;
220
+ }
221
+ /** The rate, its metadata and its audit chain as JSON. `rateFromJSON` reverses it. */
222
+ toJSON() {
223
+ const { quote, ...info } = infoOf(this);
224
+ const json = { from: this.from, to: this.to, rate: this.toString(), ...info };
225
+ // A direct quote is the `rate` string itself, so only a scaled or inverted one is written.
226
+ if (quote !== undefined && (quote.per !== undefined || quote.inverted === true)) {
227
+ json.quote = quote;
228
+ }
229
+ if (this.derivedFrom !== undefined) {
230
+ json.derivedFrom = this.derivedFrom.map((input) => input.toJSON());
231
+ }
232
+ return json;
233
+ }
234
+ /**
235
+ * Whether `validUntil` has passed at `now` (default: the system clock). A date is valid all day
236
+ * (UTC).
237
+ */
238
+ isExpired(now = new Date()) {
239
+ if (this.validUntil === undefined) {
240
+ return false;
241
+ }
242
+ return hasEnded(this.validUntil, now);
243
+ }
244
+ /**
245
+ * Whether the rate had been published by `at`: always, without an `availableAt`. A date `at`
246
+ * means by the end of that UTC day.
247
+ */
248
+ isAvailable(at) {
249
+ if (this.availableAt === undefined) {
250
+ return true;
251
+ }
252
+ return hasStarted(this.availableAt, at);
253
+ }
254
+ /**
255
+ * Converts `money`, rounding once: with a mode, to the target currency's exponent (or
256
+ * `options.scale`); with a rounding policy, to the policy's scale and increment.
257
+ */
258
+ convert(money, rounding = DEFAULT_ROUNDING, options) {
259
+ if (money.currency !== this.from) {
260
+ throw new CurrencyMismatchError(this.from, money.currency);
261
+ }
262
+ if (options?.strictValidity === true && this.validUntil !== undefined && this.isExpired()) {
263
+ throw new RateExpiredError(this.from, this.to, this.validUntil);
264
+ }
265
+ if (typeof rounding === 'function') {
266
+ return convertWithPolicy(money, this.to, this.ratio, rounding, options);
267
+ }
268
+ const scale = options?.scale ?? currencyExponent(this.to);
269
+ const minor = multiplyByRatioAtScale(money.minor, this.ratio, scale - money.scale, rounding);
270
+ return make(this.to, minor, scale);
271
+ }
272
+ }
273
+ /**
274
+ * @internal
275
+ * money × rate in `to`, rounded once by a policy. The amount is relabelled `to` at its own scale,
276
+ * so the policy rounds the product exactly as it would a multiplication in `to`: to its scale
277
+ * (default `to`'s exponent) and increment, checking its currency against `to`.
278
+ */
279
+ export function convertWithPolicy(money, to, rate, policy, options) {
280
+ // Two scales would leave it unclear which one the result has.
281
+ if (options?.scale !== undefined) {
282
+ throw new TypeError('options.scale with a rounding policy');
283
+ }
284
+ return roundWithPolicy(make(to, money.minor, money.scale), rate, policy);
285
+ }
286
+ /** The metadata fields of `info` that are defined (no undefined keys). */
287
+ function infoOf(info) {
288
+ const defined = {};
289
+ if (info.source !== undefined) {
290
+ defined.source = info.source;
291
+ }
292
+ if (info.asOf !== undefined) {
293
+ defined.asOf = toIsoString(info.asOf);
294
+ }
295
+ if (info.availableAt !== undefined) {
296
+ defined.availableAt = toIsoString(info.availableAt);
297
+ }
298
+ if (info.validUntil !== undefined) {
299
+ defined.validUntil = toIsoString(info.validUntil);
300
+ }
301
+ if (info.type !== undefined) {
302
+ defined.type = info.type;
303
+ }
304
+ if (info.quote !== undefined) {
305
+ defined.quote = info.quote;
306
+ }
307
+ return defined;
308
+ }
309
+ function timing(asOf, availableAt, validUntil, type) {
310
+ return infoOf({ asOf, availableAt, validUntil, type });
311
+ }
312
+ /**
313
+ * A derived rate keeps the timing of its input; the input's source stays with it, in derivedFrom.
314
+ */
315
+ function timingOf(input, type) {
316
+ return timing(input.asOf, input.availableAt, input.validUntil, type);
317
+ }
318
+ // A published decimal whose canonical form drops digits: trailing fraction zeros only. Leading
319
+ // zeros ('01.50') aren't published digits, so those are left to the canonical form.
320
+ const PUBLISHED_DECIMAL = /^(?:0|[1-9]\d*)\.\d*0$/;
321
+ /**
322
+ * Keeps the published digits of `text` on a Rate just built from it, when its canonical form would
323
+ * drop some ('1.1650' prints as '1.165'). Assigned directly: the quote is the rate's own text, so
324
+ * there is nothing to check, and building a rate inline stays cheap.
325
+ */
326
+ function keepDigits(rate, text) {
327
+ // Only a last character of '0' can be dropped, so most rates are settled by one comparison.
328
+ const dropsDigits = typeof text === 'string' &&
329
+ text.charCodeAt(text.length - 1) === 48 &&
330
+ rate.quote === undefined &&
331
+ PUBLISHED_DECIMAL.test(text);
332
+ if (dropsDigits) {
333
+ rate.quote = { rate: text };
334
+ }
335
+ return rate;
336
+ }
337
+ /**
338
+ * An exact rate pinned to a currency pair, so converting the wrong currency is a type error. Give
339
+ * the rate as a decimal string ('1.1165', every digit kept), a "num/den" string, a bigint or a
340
+ * Ratio. Numbers are read at their shortest decimal form (1.234 is exactly 1234/1000).
341
+ *
342
+ * const eurUsd = exchangeRate('EUR', 'USD', '1.1165', { source: 'ECB', asOf: '2026-11-06' });
343
+ * eurUsd.convert(money('100', 'EUR'), 'halfEven'); // 111.65 USD
344
+ * eurUsd.inverse().ratio // 2000/2233, exactly
345
+ */
346
+ export function exchangeRate(from, to, rate, info) {
347
+ return keepDigits(new Rate(from, to, ratio(rate), info), rate);
348
+ }
349
+ /** Rebuilds a Rate, with its audit chain, from `rate.toJSON()`. */
350
+ export function rateFromJSON(json) {
351
+ const derivedFrom = json.derivedFrom?.map(rateFromJSON);
352
+ const rate = new Rate(json.from, json.to, ratio(json.rate), infoOf(json), derivedFrom);
353
+ return keepDigits(rate, json.rate);
354
+ }
355
+ /** Whether `value` is a Rate. */
356
+ export function isRate(value) {
357
+ return value instanceof Rate;
358
+ }
359
+ /**
360
+ * The exact rate a processor actually applied: settled ÷ presented. Use it to audit a quoted rate,
361
+ * which after the processor's own rounding often doesn't reproduce the settled amount.
362
+ *
363
+ * impliedRate(money('10.00', 'EUR'), money('12.34', 'USD')) // EUR→USD 1.234
364
+ */
365
+ export function impliedRate(presented, settled, info) {
366
+ // (settled.minor / 10^settled.scale) ÷ (presented.minor / 10^presented.scale)
367
+ const numerator = BigInt(settled.minor) * pow10n(presented.scale);
368
+ const denominator = BigInt(presented.minor) * pow10n(settled.scale);
369
+ return new Rate(presented.currency, settled.currency, ratio(numerator, denominator), info);
370
+ }
371
+ //# sourceMappingURL=rate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate.js","sourceRoot":"","sources":["../src/rate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Thrown when an operation would have to round but the rounding mode is `'unnecessary'`. It lives
3
+ * in its own module so the generated kernels can throw it without importing `rounding.ts`, which
4
+ * imports them.
5
+ */
6
+ export declare class RoundingError extends RangeError {
7
+ name: string;
8
+ }
9
+ //# sourceMappingURL=rounding-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rounding-error.d.ts","sourceRoot":"","sources":["../src/rounding-error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAClC,IAAI,SAAmB;CACjC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Thrown when an operation would have to round but the rounding mode is `'unnecessary'`. It lives
3
+ * in its own module so the generated kernels can throw it without importing `rounding.ts`, which
4
+ * imports them.
5
+ */
6
+ export class RoundingError extends RangeError {
7
+ name = 'RoundingError';
8
+ }
9
+ //# sourceMappingURL=rounding-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rounding-error.js","sourceRoot":"","sources":["../src/rounding-error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,aAAc,SAAQ,UAAU;IAClC,IAAI,GAAG,eAAe,CAAC;CACjC"}
@@ -0,0 +1,50 @@
1
+ import { RoundingError } from './rounding-error.js';
2
+ /**
3
+ * Rounding modes. The string values are the ones `Intl.NumberFormat` uses for its `roundingMode`
4
+ * option (ES2023), so a mode can be passed straight through to formatting. `Rounding` gives the
5
+ * familiar names (HalfUp, HalfEven, ...) for the same strings.
6
+ *
7
+ * An invalid mode (possible only from untyped code) is reported, with a RangeError, only when
8
+ * rounding is actually needed: an exact result is returned without looking at the mode, which keeps
9
+ * the exact path as fast as it can be.
10
+ */
11
+ export type RoundingMode = 'halfEven' | 'halfExpand' | 'halfTrunc' | 'halfCeil' | 'halfFloor' | 'expand' | 'trunc' | 'ceil' | 'floor' | 'unnecessary';
12
+ /**
13
+ * Familiar names for the rounding modes (HalfUp, HalfEven, Bankers, ...), mapped to the mode
14
+ * strings.
15
+ */
16
+ export declare const Rounding: {
17
+ readonly HalfEven: "halfEven";
18
+ readonly Bankers: "halfEven";
19
+ readonly HalfUp: "halfExpand";
20
+ readonly HalfDown: "halfTrunc";
21
+ readonly HalfCeil: "halfCeil";
22
+ readonly HalfFloor: "halfFloor";
23
+ readonly Up: "expand";
24
+ readonly Down: "trunc";
25
+ readonly Ceil: "ceil";
26
+ readonly Floor: "floor";
27
+ readonly Unnecessary: "unnecessary";
28
+ };
29
+ /**
30
+ * The rounding mode arithmetic uses when none is given: ties away from zero ('half up'). It is the
31
+ * default of decimal.js, big.js, bignumber.js, Prisma.Decimal and Intl.NumberFormat, and what
32
+ * Math.round-based money libraries (currency.js, js-money, ts-money) intend. Parsing
33
+ * (`money('1.005', 'EUR')`, `fromDecimal`) and processor amounts (`toStripeAmount`, `toAdyen`) stay
34
+ * strict: they throw unless a mode is passed.
35
+ */
36
+ export declare const DEFAULT_ROUNDING: RoundingMode;
37
+ export { RoundingError };
38
+ /**
39
+ * dividend / divisor rounded with `mode`, for safe-integer dividends and divisor > 0. Exact: the
40
+ * float quotient is only a first guess, corrected until the remainder has the dividend's sign and
41
+ * is smaller than the divisor.
42
+ */
43
+ export declare function divideAndRound(dividend: number, divisor: number, mode: RoundingMode): number;
44
+ /**
45
+ * dividend / divisor rounded with `mode`, for divisor > 0n. The bigint kernel is generated from the
46
+ * Lean proofs in proofs/Ducat/Rounding.lean (`src/generated/kernel.ts`), and so is the mode switch
47
+ * `divideAndRound` uses.
48
+ */
49
+ export declare function divideAndRoundBigint(dividend: bigint, divisor: bigint, mode: RoundingMode): bigint;
50
+ //# sourceMappingURL=rounding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rounding.d.ts","sourceRoot":"","sources":["../src/rounding.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAEpB,UAAU,GACV,YAAY,GACZ,WAAW,GACX,UAAU,GACV,WAAW,GACX,QAAQ,GACR,OAAO,GACP,MAAM,GACN,OAAO,GAEP,aAAa,CAAC;AAElB;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;CAY4B,CAAC;AAElD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,YAA2B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,CAAC;AAIzB;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAwC5F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY,GACjB,MAAM,CAKR"}
@@ -0,0 +1,87 @@
1
+ import { divideAndRoundBigint as provedDivideAndRoundBigint, roundTruncatedQuotient, } from './generated/kernel.js';
2
+ import { RoundingError } from './rounding-error.js';
3
+ /**
4
+ * Familiar names for the rounding modes (HalfUp, HalfEven, Bankers, ...), mapped to the mode
5
+ * strings.
6
+ */
7
+ export const Rounding = {
8
+ HalfEven: 'halfEven',
9
+ Bankers: 'halfEven',
10
+ HalfUp: 'halfExpand',
11
+ HalfDown: 'halfTrunc',
12
+ HalfCeil: 'halfCeil',
13
+ HalfFloor: 'halfFloor',
14
+ Up: 'expand',
15
+ Down: 'trunc',
16
+ Ceil: 'ceil',
17
+ Floor: 'floor',
18
+ Unnecessary: 'unnecessary',
19
+ };
20
+ /**
21
+ * The rounding mode arithmetic uses when none is given: ties away from zero ('half up'). It is the
22
+ * default of decimal.js, big.js, bignumber.js, Prisma.Decimal and Intl.NumberFormat, and what
23
+ * Math.round-based money libraries (currency.js, js-money, ts-money) intend. Parsing
24
+ * (`money('1.005', 'EUR')`, `fromDecimal`) and processor amounts (`toStripeAmount`, `toAdyen`) stay
25
+ * strict: they throw unless a mode is passed.
26
+ */
27
+ export const DEFAULT_ROUNDING = 'halfExpand';
28
+ export { RoundingError };
29
+ const MAX_SAFE_MINOR = Number.MAX_SAFE_INTEGER;
30
+ /**
31
+ * dividend / divisor rounded with `mode`, for safe-integer dividends and divisor > 0. Exact: the
32
+ * float quotient is only a first guess, corrected until the remainder has the dividend's sign and
33
+ * is smaller than the divisor.
34
+ */
35
+ export function divideAndRound(dividend, divisor, mode) {
36
+ if (divisor === 1) {
37
+ return dividend + 0; // + 0 normalises -0 (0 * -1 from a caller)
38
+ }
39
+ // Beyond MAX_SAFE_MINOR the product quotient * divisor below could round, so take the bigint
40
+ // path.
41
+ if (!(Math.abs(dividend) + divisor <= MAX_SAFE_MINOR)) {
42
+ return Number(divideAndRoundBigint(BigInt(dividend), BigInt(divisor), mode));
43
+ }
44
+ let quotient = Math.trunc(dividend / divisor);
45
+ // exact: |quotient * divisor| <= |dividend| + divisor <= MAX_SAFE_MINOR
46
+ let remainder = dividend - quotient * divisor;
47
+ // The float quotient can be off by one ulp; fix it so the remainder has the dividend's sign and
48
+ // is smaller than the divisor in magnitude.
49
+ if (dividend >= 0) {
50
+ if (remainder < 0) {
51
+ quotient -= 1;
52
+ remainder += divisor;
53
+ }
54
+ else if (remainder >= divisor) {
55
+ quotient += 1;
56
+ remainder -= divisor;
57
+ }
58
+ }
59
+ else if (remainder > 0) {
60
+ quotient += 1;
61
+ remainder -= divisor;
62
+ }
63
+ else if (remainder <= -divisor) {
64
+ quotient -= 1;
65
+ remainder += divisor;
66
+ }
67
+ // The generated switch handles a zero remainder too; returning here saves the call on the hottest
68
+ // path.
69
+ if (remainder === 0) {
70
+ return quotient + 0; // + 0 normalises -0
71
+ }
72
+ // quotient and remainder are now the exact truncated quotient and remainder, as the generated
73
+ // switch expects
74
+ return roundTruncatedQuotient(dividend, divisor, quotient, remainder, mode) + 0;
75
+ }
76
+ /**
77
+ * dividend / divisor rounded with `mode`, for divisor > 0n. The bigint kernel is generated from the
78
+ * Lean proofs in proofs/Ducat/Rounding.lean (`src/generated/kernel.ts`), and so is the mode switch
79
+ * `divideAndRound` uses.
80
+ */
81
+ export function divideAndRoundBigint(dividend, divisor, mode) {
82
+ if (divisor === 1n) {
83
+ return dividend;
84
+ }
85
+ return provedDivideAndRoundBigint(dividend, divisor, mode);
86
+ }
87
+ //# sourceMappingURL=rounding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rounding.js","sourceRoot":"","sources":["../src/rounding.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,IAAI,0BAA0B,EAClD,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAyBpD;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,YAAY;IACpB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,aAAa;CACqB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAiB,YAAY,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAe,EAAE,IAAkB;IAClF,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,QAAQ,GAAG,CAAC,CAAC,CAAC,2CAA2C;IAClE,CAAC;IACD,6FAA6F;IAC7F,QAAQ;IACR,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;IAC9C,wEAAwE;IACxE,IAAI,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IAE9C,gGAAgG;IAChG,4CAA4C;IAC5C,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,QAAQ,IAAI,CAAC,CAAC;YACd,SAAS,IAAI,OAAO,CAAC;QACvB,CAAC;aAAM,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,QAAQ,IAAI,CAAC,CAAC;YACd,SAAS,IAAI,OAAO,CAAC;QACvB,CAAC;IACH,CAAC;SAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACzB,QAAQ,IAAI,CAAC,CAAC;QACd,SAAS,IAAI,OAAO,CAAC;IACvB,CAAC;SAAM,IAAI,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,QAAQ,IAAI,CAAC,CAAC;QACd,SAAS,IAAI,OAAO,CAAC;IACvB,CAAC;IAED,kGAAkG;IAClG,QAAQ;IACR,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,QAAQ,GAAG,CAAC,CAAC,CAAC,oBAAoB;IAC3C,CAAC;IACD,8FAA8F;IAC9F,iBAAiB;IACjB,OAAO,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,OAAe,EACf,IAAkB;IAElB,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type Money, type MoneyJSON } from './money.js';
2
+ import { type RoundingMode } from './rounding.js';
3
+ /** Options for the Zod and Valibot money schemas. */
4
+ export interface MoneySchemaOptions<C extends string = string> {
5
+ /**
6
+ * The currency, or the currencies, to accept. Without it, any ISO 4217 code or code registered
7
+ * with `defineCurrency` is accepted, and nothing else.
8
+ */
9
+ readonly currency?: C | readonly C[];
10
+ /** Decimal places to keep (default: the currency's exponent), as in `money()`. */
11
+ readonly scale?: number;
12
+ /**
13
+ * How to round an amount with more decimals than the scale. The default, 'unnecessary', rejects
14
+ * such amounts, as `fromJSON` does.
15
+ */
16
+ readonly rounding?: RoundingMode;
17
+ /**
18
+ * The most digits the amount may have, not counting the sign and the decimal point (default
19
+ * 50). It keeps an oversized request body from building a huge bigint.
20
+ */
21
+ readonly maxDigits?: number;
22
+ }
23
+ /** The default `maxDigits`: far beyond any real amount, small enough to be cheap to reject. */
24
+ export declare const DEFAULT_MAX_DIGITS = 50;
25
+ /**
26
+ * @internal Checks the options when the schema is built, so a mistake there throws at once
27
+ * instead of turning every input into a validation error.
28
+ */
29
+ export declare function checkSchemaOptions(options: MoneySchemaOptions | undefined): void;
30
+ /** The Money type a schema produces: one Money per allowed currency, not a mixed-currency Money. */
31
+ export type MoneyFor<C extends string> = C extends string ? Money<C> : never;
32
+ /** @internal A problem with one field of the input, for the schema libraries' issue paths. */
33
+ export interface MoneyIssue {
34
+ readonly field: 'amount' | 'currency';
35
+ readonly message: string;
36
+ }
37
+ /**
38
+ * @internal Reads `{ amount, currency }` (already known to have two string fields) into Money, or
39
+ * says what is wrong with it. Shared by the Zod and Valibot entries, so both accept exactly the
40
+ * same inputs.
41
+ */
42
+ export declare function readMoneyJSON<C extends string>(json: MoneyJSON, options: MoneySchemaOptions<C> | undefined): Money | MoneyIssue;
43
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAE5D,qDAAqD;AACrD,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3D;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;IACrC,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,+FAA+F;AAC/F,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAIrC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI,CAyBhF;AAED,oGAAoG;AACpG,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAE7E,8FAA8F;AAC9F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAC5C,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,SAAS,GACzC,KAAK,GAAG,UAAU,CAmCpB"}