@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":"stripe.js","sourceRoot":"","sources":["../../src/generated/stripe.ts"],"names":[],"mappings":"AAAA,iJAAiJ;AACjJ,oBAAoB;AAEpB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0G;IACjI,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,CAAC;IACd,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,GAAG,CAAC;IACd,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,GAAG,EAAC,GAAG,CAAC;IAChB,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,CAAC;IACd,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,CAAC;IACd,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,CAAC;IACd,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,EAAE,EAAC,EAAE,CAAC;IACd,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,GAAG,CAAC;IACd,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,GAAG,EAAC,GAAG,CAAC;IAChB,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;IACZ,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;CACb,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { HISTORIC_CURRENCY_TABLE, ISO_4217_LIST_THREE_PUBLISHED } from './generated/historic.js';
2
+ export { ISO_4217_LIST_THREE_PUBLISHED };
3
+ /** A code in the historic table. */
4
+ export type HistoricCurrencyCode = keyof typeof HISTORIC_CURRENCY_TABLE;
5
+ /**
6
+ * Every historic code, for the `CurrencyCode` type:
7
+ *
8
+ * declare module '@ducatjs/money' {
9
+ * interface CustomCurrencies extends HistoricCurrencies {}
10
+ * }
11
+ */
12
+ export type HistoricCurrencies = {
13
+ readonly [Code in HistoricCurrencyCode]: true;
14
+ };
15
+ /** One entry of the historic table. */
16
+ export interface HistoricCurrency {
17
+ readonly code: HistoricCurrencyCode;
18
+ /** The name ISO 4217 List Three gives it (for non-ISO codes, a descriptive name). */
19
+ readonly name: string;
20
+ /** Its minor-unit exponent while it was current: what stored minor units of it mean. */
21
+ readonly exponent: number;
22
+ /** The ISO 4217 numeric code; absent for codes that were never ISO (CNH). */
23
+ readonly numeric?: string;
24
+ /**
25
+ * The year and month ISO 4217 withdrew it ('2023-01'), from List Three. A code withdrawn
26
+ * country by country has the last date. Absent for codes that were never ISO.
27
+ */
28
+ readonly withdrawn?: string;
29
+ }
30
+ /** The table entry for a code, or undefined for a code that isn't in it. */
31
+ export declare function historicCurrency(code: string): HistoricCurrency | undefined;
32
+ /** Every entry of the table, by code. */
33
+ export declare function historicCurrencies(): HistoricCurrency[];
34
+ /**
35
+ * Registers historic codes with `defineCurrency`, so Money can hold them: all of them, or only
36
+ * `codes`. Registering one again is harmless; a code already defined with another exponent throws,
37
+ * as `defineCurrency` does.
38
+ */
39
+ export declare function defineHistoricCurrencies(codes?: readonly HistoricCurrencyCode[]): void;
40
+ //# sourceMappingURL=historic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historic.d.ts","sourceRoot":"","sources":["../src/historic.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAEjG,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAEzC,oCAAoC;AACpC,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,uBAAuB,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,EAAE,IAAI,IAAI,oBAAoB,GAAG,IAAI;CAAE,CAAC;AAEnF,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAM3E;AAED,yCAAyC;AACzC,wBAAgB,kBAAkB,IAAI,gBAAgB,EAAE,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,CAAC,EAAE,SAAS,oBAAoB,EAAE,GAAG,IAAI,CAatF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `@ducatjs/money/historic`: withdrawn ISO 4217 codes and a few non-ISO ones, with the exponent
3
+ * each had and, for ISO codes, the month ISO withdrew it. Nothing is registered until you ask, so
4
+ * the core registry stays ISO 4217 as currently published:
5
+ *
6
+ * defineHistoricCurrencies(['HRK', 'BGN']);
7
+ * money('100', 'HRK'); // 100.00 HRK
8
+ * historicCurrency('HRK')?.withdrawn; // '2023-01'
9
+ */
10
+ import { defineCurrency } from './currency.js';
11
+ import { HISTORIC_CURRENCY_TABLE, ISO_4217_LIST_THREE_PUBLISHED } from './generated/historic.js';
12
+ export { ISO_4217_LIST_THREE_PUBLISHED };
13
+ const table = HISTORIC_CURRENCY_TABLE;
14
+ /** The table entry for a code, or undefined for a code that isn't in it. */
15
+ export function historicCurrency(code) {
16
+ // own properties only, so 'toString' and friends are not currencies
17
+ if (!Object.hasOwn(table, code)) {
18
+ return undefined;
19
+ }
20
+ return { code: code, ...table[code] };
21
+ }
22
+ /** Every entry of the table, by code. */
23
+ export function historicCurrencies() {
24
+ return Object.keys(table).map((code) => historicCurrency(code));
25
+ }
26
+ /**
27
+ * Registers historic codes with `defineCurrency`, so Money can hold them: all of them, or only
28
+ * `codes`. Registering one again is harmless; a code already defined with another exponent throws,
29
+ * as `defineCurrency` does.
30
+ */
31
+ export function defineHistoricCurrencies(codes) {
32
+ const selected = codes ?? Object.keys(table);
33
+ // check every code first, so a typo registers nothing
34
+ for (const code of selected) {
35
+ if (!Object.hasOwn(table, code)) {
36
+ throw new RangeError(`${code} is not in the historic currency table`);
37
+ }
38
+ }
39
+ for (const code of selected) {
40
+ defineCurrency(code, table[code].exponent);
41
+ }
42
+ }
43
+ //# sourceMappingURL=historic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historic.js","sourceRoot":"","sources":["../src/historic.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAEjG,OAAO,EAAE,6BAA6B,EAAE,CAAC;AA8BzC,MAAM,KAAK,GAA6D,uBAAuB,CAAC;AAEhG,4EAA4E;AAC5E,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,oEAAoE;IACpE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAA4B,EAAE,GAAG,KAAK,CAAC,IAAI,CAAE,EAAE,CAAC;AACjE,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,kBAAkB;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAuC;IAC9E,MAAM,QAAQ,GAAsB,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEhE,sDAAsD;IACtD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,wCAAwC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAE,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -0,0 +1,96 @@
1
+ import type { CurrencyInput } from './money.js';
2
+ import { type RateProvider, type RateQuery, type RateTable, type RateTableSpec } from './provider.js';
3
+ import { Rate } from './rate.js';
4
+ import type { RateInfo, RateQuote } from './rate.js';
5
+ /**
6
+ * Why a lookup passed over a day: no table that day (a weekend or holiday), the table not yet
7
+ * published at the time asked for, its period over, or the pair not in it (`missing` when the
8
+ * source listed the currency without a value, `notQuoted` when it isn't listed at all).
9
+ */
10
+ export type FallbackReason = 'noTable' | 'notYetAvailable' | 'expired' | 'missing' | 'notQuoted';
11
+ /** A day a lookup passed over, and why. */
12
+ export interface Fallback {
13
+ readonly day: string;
14
+ readonly reason: FallbackReason;
15
+ }
16
+ /**
17
+ * A Rate from a published quote: `per` units and the direction are applied exactly, and the quote
18
+ * is kept on the Rate.
19
+ *
20
+ * rateFromQuote('JPY', 'NOK', { rate: '6.50', per: 100 }) // JPY→NOK 0.065
21
+ * rateFromQuote('USD', 'EUR', { rate: '1.1650', inverted: true }) // USD→EUR 200/233
22
+ */
23
+ export declare function rateFromQuote<From extends CurrencyInput, To extends CurrencyInput>(from: From, to: To, quote: RateQuote, info?: Omit<RateInfo, 'quote'>): Rate<From, To>;
24
+ /** One published rate in a quoted table. */
25
+ export interface QuotedRate {
26
+ /** The rate as published, a decimal string. */
27
+ readonly rate: string;
28
+ /**
29
+ * How many units the published number is for: of `base`, or of the currency when the rate is
30
+ * `inverted` ("NOK per 100 JPY" is `{ rate: '6.50', per: 100, inverted: true }` in a NOK table).
31
+ */
32
+ readonly per?: number;
33
+ /** Published as base per unit of the currency, the other way round from the table. */
34
+ readonly inverted?: boolean;
35
+ /**
36
+ * The decimals the source publishes, for feeds that strip trailing zeros: '1.175' with 4 is
37
+ * kept as '1.1750'.
38
+ */
39
+ readonly decimals?: number;
40
+ }
41
+ /** A one-base table of published quotes: a decimal string, a QuotedRate, or null (no value). */
42
+ export interface QuotedTableSpec extends Omit<RateTableSpec, 'rates'> {
43
+ readonly rates: Readonly<Record<string, string | QuotedRate | null>>;
44
+ /**
45
+ * Every rate is published as base per unit of the currency (CAD per USD, as the Bank of Canada
46
+ * quotes), unless its entry says otherwise.
47
+ */
48
+ readonly inverted?: boolean;
49
+ /** The decimals every rate is published with, unless its entry says otherwise. */
50
+ readonly decimals?: number;
51
+ }
52
+ /**
53
+ * A rateTable from rates as a source published them: each is stored exactly in the table's
54
+ * direction, base → currency, and keeps its quote (`rate.quote`).
55
+ *
56
+ * const boc = quotedTable({ base: 'CAD', inverted: true, asOf: '2026-11-06', rates: { USD: '1.3654' } });
57
+ * boc.rate('CAD', 'USD')?.inverse().toString(); // '1.3654'
58
+ */
59
+ export declare function quotedTable(spec: QuotedTableSpec): RateTable;
60
+ /** Options for rateHistory(). */
61
+ export interface RateHistoryOptions {
62
+ /**
63
+ * How many days before the day asked for to look back for a daily table (weekends, holidays,
64
+ * currencies missing that day). Default 4, which covers Good Friday to Easter Monday. A table
65
+ * valid for a period (`validUntil`) answers for its whole period instead.
66
+ */
67
+ readonly lookback?: number;
68
+ }
69
+ /** A rate lookup with its reasons: the rate, or undefined, and the days passed over. */
70
+ export interface RateLookup<From extends string = string, To extends string = string> {
71
+ readonly rate: Rate<From, To> | undefined;
72
+ /** Days passed over before the answer (or before giving up), newest first. */
73
+ readonly skipped: readonly Fallback[];
74
+ }
75
+ /** Dated tables held in memory, answering any day synchronously. */
76
+ export interface RateHistory extends RateProvider {
77
+ /** The dated tables, newest first. */
78
+ readonly tables: readonly RateTable[];
79
+ /** The same lookup as `rate`, reporting the days it passed over and why. */
80
+ lookup<From extends string, To extends string>(from: From, to: To, query?: RateQuery): RateLookup<From, To>;
81
+ }
82
+ /**
83
+ * A provider over many dated tables, such as a date range loaded in one call: for each lookup it
84
+ * takes the latest table at or before `asOf` that has the pair, published by then and still
85
+ * valid, looking back up to `lookback` days. Each currency pair falls back on its own, so a
86
+ * currency missing on a holiday comes from the day before while the others stay current; the
87
+ * Rate's `asOf` says which day it is from. Without an `asOf`, the newest table with the pair
88
+ * answers. `lookup` reports why a lookup fell back.
89
+ *
90
+ * const history = rateHistory(parseEcbXml(xml90Days));
91
+ * history.rate('EUR', 'USD', { asOf: '2026-11-08' }); // Sunday: Friday's rate
92
+ * history.lookup('EUR', 'USD', { asOf: '2026-11-08' }).skipped;
93
+ * // [{ day: '2026-11-08', reason: 'noTable' }, { day: '2026-11-07', reason: 'noTable' }]
94
+ */
95
+ export declare function rateHistory(tables: readonly RateTable[], options?: RateHistoryOptions): RateHistory;
96
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAwB,IAAI,EAAe,MAAM,WAAW,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAKrD;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAEjG,2CAA2C;AAC3C,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAoBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,SAAS,aAAa,EAAE,EAAE,SAAS,aAAa,EAChF,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,GAC7B,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAYhB;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,gGAAgG;AAChG,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;IACnE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC;IACrE;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,CA6B5D;AAOD,iCAAiC;AACjC,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wFAAwF;AACxF,MAAM,WAAW,UAAU,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM;IAClF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC;IAC1C,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;CACvC;AAED,oEAAoE;AACpE,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,sCAAsC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,4EAA4E;IAC5E,MAAM,CAAC,IAAI,SAAS,MAAM,EAAE,EAAE,SAAS,MAAM,EAC3C,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,EAAE,EACN,KAAK,CAAC,EAAE,SAAS,GAChB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;CACzB;AAgDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,WAAW,CA4Fb"}
@@ -0,0 +1,213 @@
1
+ import { rateTable, } from './provider.js';
2
+ import { ratio } from './decimal.js';
3
+ import { hasEnded, hasStarted, Rate, toIsoString } from './rate.js';
4
+ import { withDecimals } from './rate-text.js';
5
+ const DAY_MS = 86_400_000;
6
+ const PLAIN_DECIMAL = /^\d+(?:\.\d+)?$/;
7
+ /** The exact rate a quote stands for, in the Rate's own direction. */
8
+ function quoteRatio(quote) {
9
+ if (!PLAIN_DECIMAL.test(quote.rate)) {
10
+ throw new RangeError(`A quote is a plain decimal string, got ${quote.rate}`);
11
+ }
12
+ const per = quote.per ?? 1;
13
+ if (!Number.isSafeInteger(per) || per < 1) {
14
+ throw new RangeError(`A quote's per is a positive integer, got ${per}`);
15
+ }
16
+ const published = ratio(quote.rate);
17
+ if (quote.inverted === true) {
18
+ return ratio(published.den * BigInt(per), published.num);
19
+ }
20
+ return ratio(published.num, published.den * BigInt(per));
21
+ }
22
+ /**
23
+ * A Rate from a published quote: `per` units and the direction are applied exactly, and the quote
24
+ * is kept on the Rate.
25
+ *
26
+ * rateFromQuote('JPY', 'NOK', { rate: '6.50', per: 100 }) // JPY→NOK 0.065
27
+ * rateFromQuote('USD', 'EUR', { rate: '1.1650', inverted: true }) // USD→EUR 200/233
28
+ */
29
+ export function rateFromQuote(from, to, quote, info) {
30
+ const exact = quoteRatio(quote);
31
+ // Stored in one form: per 1 and inverted false are the same as leaving them out, and a quote
32
+ // without them prints its own digits.
33
+ const kept = { rate: quote.rate };
34
+ if (quote.per !== undefined && quote.per !== 1) {
35
+ kept.per = quote.per;
36
+ }
37
+ if (quote.inverted === true) {
38
+ kept.inverted = true;
39
+ }
40
+ return new Rate(from, to, exact, { ...info, quote: kept });
41
+ }
42
+ /**
43
+ * A rateTable from rates as a source published them: each is stored exactly in the table's
44
+ * direction, base → currency, and keeps its quote (`rate.quote`).
45
+ *
46
+ * const boc = quotedTable({ base: 'CAD', inverted: true, asOf: '2026-11-06', rates: { USD: '1.3654' } });
47
+ * boc.rate('CAD', 'USD')?.inverse().toString(); // '1.3654'
48
+ */
49
+ export function quotedTable(spec) {
50
+ const rates = {};
51
+ for (const [currency, entry] of Object.entries(spec.rates)) {
52
+ if (entry === null) {
53
+ rates[currency] = null;
54
+ continue;
55
+ }
56
+ let quoted;
57
+ if (typeof entry === 'string') {
58
+ quoted = { rate: entry };
59
+ }
60
+ else {
61
+ quoted = entry;
62
+ }
63
+ let text = quoted.rate.trim();
64
+ const decimals = quoted.decimals ?? spec.decimals;
65
+ if (decimals !== undefined) {
66
+ text = withDecimals(text, decimals);
67
+ }
68
+ const quote = { rate: text };
69
+ if (quoted.per !== undefined) {
70
+ quote.per = quoted.per;
71
+ }
72
+ if (quoted.inverted ?? spec.inverted ?? false) {
73
+ quote.inverted = true;
74
+ }
75
+ rates[currency] = rateFromQuote(spec.base, currency, quote, spec);
76
+ }
77
+ return rateTable({ ...spec, rates });
78
+ }
79
+ /** The UTC date ('2026-11-06') of a date, an instant (any offset) or a Date. */
80
+ function dayOf(time) {
81
+ return toIsoString(time).slice(0, 10);
82
+ }
83
+ /**
84
+ * Why a table can't answer the pair at the time asked for, or undefined when it can. The table's
85
+ * own dates are checked first; a table built from a list of Rates has none, so its rate's are.
86
+ */
87
+ function passOver(table, from, to, query, periodEnded) {
88
+ const asOf = query?.asOf;
89
+ if (periodEnded) {
90
+ return 'expired';
91
+ }
92
+ if (asOf !== undefined &&
93
+ table.availableAt !== undefined &&
94
+ !hasStarted(table.availableAt, asOf)) {
95
+ return 'notYetAvailable';
96
+ }
97
+ if (table.rate(from, to, query) !== undefined) {
98
+ return undefined;
99
+ }
100
+ if (table.missing?.includes(from) === true || table.missing?.includes(to) === true) {
101
+ return 'missing';
102
+ }
103
+ const held = table.rates.find((rate) => rate.from === from && rate.to === to);
104
+ if (held !== undefined && asOf !== undefined) {
105
+ if (held.isExpired(asOf)) {
106
+ return 'expired';
107
+ }
108
+ if (!held.isAvailable(asOf)) {
109
+ return 'notYetAvailable';
110
+ }
111
+ }
112
+ return 'notQuoted';
113
+ }
114
+ /** The ISO date `count` days before `day`. */
115
+ function daysBefore(day, count) {
116
+ return new Date(Date.parse(`${day}T00:00:00Z`) - count * DAY_MS).toISOString().slice(0, 10);
117
+ }
118
+ /**
119
+ * A provider over many dated tables, such as a date range loaded in one call: for each lookup it
120
+ * takes the latest table at or before `asOf` that has the pair, published by then and still
121
+ * valid, looking back up to `lookback` days. Each currency pair falls back on its own, so a
122
+ * currency missing on a holiday comes from the day before while the others stay current; the
123
+ * Rate's `asOf` says which day it is from. Without an `asOf`, the newest table with the pair
124
+ * answers. `lookup` reports why a lookup fell back.
125
+ *
126
+ * const history = rateHistory(parseEcbXml(xml90Days));
127
+ * history.rate('EUR', 'USD', { asOf: '2026-11-08' }); // Sunday: Friday's rate
128
+ * history.lookup('EUR', 'USD', { asOf: '2026-11-08' }).skipped;
129
+ * // [{ day: '2026-11-08', reason: 'noTable' }, { day: '2026-11-07', reason: 'noTable' }]
130
+ */
131
+ export function rateHistory(tables, options) {
132
+ const lookback = options?.lookback ?? 4;
133
+ if (!Number.isSafeInteger(lookback) || lookback < 0) {
134
+ throw new RangeError(`lookback must be a non-negative integer, got ${lookback}`);
135
+ }
136
+ const dated = [];
137
+ for (const table of tables) {
138
+ if (table.asOf === undefined) {
139
+ throw new RangeError('rateHistory needs tables with an asOf');
140
+ }
141
+ dated.push({ day: dayOf(table.asOf), table });
142
+ }
143
+ // Newest first; a stable sort keeps the caller's order within a day.
144
+ dated.sort((entry, other) => (other.day < entry.day ? -1 : Number(other.day > entry.day)));
145
+ const hasPeriods = dated.some((entry) => entry.table.validUntil !== undefined);
146
+ function lookup(from, to, query) {
147
+ const asOf = query?.asOf;
148
+ const skipped = [];
149
+ let firstDay;
150
+ if (asOf !== undefined) {
151
+ firstDay = dayOf(asOf);
152
+ }
153
+ else {
154
+ firstDay = dated[0]?.day;
155
+ }
156
+ if (firstDay === undefined) {
157
+ return { rate: undefined, skipped };
158
+ }
159
+ const lastDay = daysBefore(firstDay, lookback);
160
+ // The newest day of the lookback window not yet accounted for by a daily table.
161
+ let expectedDay = firstDay;
162
+ for (const { day, table } of dated) {
163
+ if (day > firstDay) {
164
+ continue;
165
+ }
166
+ const periodEnded = asOf !== undefined && table.validUntil !== undefined && hasEnded(table.validUntil, asOf);
167
+ const coversPeriod = table.validUntil !== undefined && !periodEnded;
168
+ if (day < lastDay && !coversPeriod) {
169
+ // Older daily tables are out of the window; an older period table may still cover it.
170
+ if (!hasPeriods) {
171
+ break;
172
+ }
173
+ continue;
174
+ }
175
+ // Days between the last table and this one had no table. A period table that answers
176
+ // covers them, so for one they count only once it turns out not to answer.
177
+ // An older period table comes after every day of the window, so all of them are gaps.
178
+ const inWindow = day >= lastDay;
179
+ const accountedTo = inWindow ? day : daysBefore(lastDay, 1);
180
+ const gaps = [];
181
+ for (let gap = expectedDay; gap > accountedTo; gap = daysBefore(gap, 1)) {
182
+ gaps.push({ day: gap, reason: 'noTable' });
183
+ }
184
+ if (!coversPeriod) {
185
+ skipped.push(...gaps);
186
+ }
187
+ const reason = passOver(table, from, to, query, periodEnded);
188
+ if (reason === undefined) {
189
+ return { rate: table.rate(from, to, query), skipped };
190
+ }
191
+ if (coversPeriod) {
192
+ skipped.push(...gaps);
193
+ }
194
+ skipped.push({ day, reason });
195
+ if (accountedTo <= expectedDay) {
196
+ expectedDay = inWindow ? daysBefore(day, 1) : accountedTo;
197
+ }
198
+ }
199
+ // Days left in the window without any table at all.
200
+ for (let gap = expectedDay; gap >= lastDay; gap = daysBefore(gap, 1)) {
201
+ skipped.push({ day: gap, reason: 'noTable' });
202
+ }
203
+ return { rate: undefined, skipped };
204
+ }
205
+ return {
206
+ tables: dated.map((entry) => entry.table),
207
+ rate(from, to, query) {
208
+ return lookup(from, to, query).rate;
209
+ },
210
+ lookup,
211
+ };
212
+ }
213
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
package/dist/hmrc.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { type RateTable } from './provider.js';
2
+ /** Options for parseHmrcMonthlyCsv. */
3
+ export interface HmrcOptions {
4
+ /**
5
+ * When each period's rates were published, or false for none. Default: the end (UTC) of the
6
+ * Wednesday before the penultimate Thursday of the month before, when HMRC publishes them.
7
+ */
8
+ readonly availableAt?: false | ((start: string) => string | Date);
9
+ }
10
+ /**
11
+ * Parses HMRC's monthly exchange rates CSV (trade-tariff.service.gov.uk, under the Open
12
+ * Government Licence) into one GBP-based table per period, newest first. Each is valid for its
13
+ * calendar month: `asOf` is the start date and `validUntil` the end date, so a `rateHistory` of
14
+ * them answers any day of the month (see @ducatjs/money/convert/history). Rates are currency units
15
+ * per £1, with `source: 'HMRC'` and `type: 'customs'`, four decimals as published. HMRC publishes
16
+ * each month's file in the month before, on the Wednesday before its penultimate Thursday (the
17
+ * `publication_date` that https://www.trade-tariff.service.gov.uk/api/v2/exchange_rates/
18
+ * period_lists/2026?filter[type]=monthly gives for each file); `availableAt` is the end of that
19
+ * UTC day. Several countries share a code (the CFA francs, AED, XCD): their rows must agree.
20
+ * HMRC never leaves a rate blank, so a blank or missing-value cell throws SyntaxError, as does any
21
+ * other row that can't be read. A file may hold several periods; they may overlap (a mid-month
22
+ * amendment, say), and `rateHistory` then uses the one that started last.
23
+ *
24
+ * const [november] = parseHmrcMonthlyCsv(await readFile('monthly_csv_2026-11.csv', 'utf8'));
25
+ * november.rate('GBP', 'EUR', { asOf: '2026-11-15' })?.toString(); // '1.1930'
26
+ */
27
+ export declare function parseHmrcMonthlyCsv(csv: string, options?: HmrcOptions): RateTable[];
28
+ //# sourceMappingURL=hmrc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmrc.d.ts","sourceRoot":"","sources":["../src/hmrc.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAmC1D,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC;CACnE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CA6DnF"}
package/dist/hmrc.js ADDED
@@ -0,0 +1,108 @@
1
+ // `@ducatjs/money/convert/hmrc`: an offline parser for HMRC's monthly exchange rates, the UK's
2
+ // rates for customs and VAT. No I/O: download the CSV yourself.
3
+ import { rateTable } from './provider.js';
4
+ import { addDayRate, csvRows, isCalendarDay, newestFirst, readRateCell } from './rate-text.js';
5
+ const UK_DATE = /^(\d\d)\/(\d\d)\/(\d{4})$/;
6
+ const COLUMNS = ['Currency Code', 'Currency Units per £1', 'Start date', 'End date'];
7
+ function notHmrc(why) {
8
+ throw new SyntaxError(`Not an HMRC monthly exchange rates CSV file: ${why}`);
9
+ }
10
+ /** 'DD/MM/YYYY' as an ISO date, or SyntaxError. */
11
+ function isoDate(text) {
12
+ const match = UK_DATE.exec(text.trim());
13
+ const day = match === null ? '' : `${match[3]}-${match[2]}-${match[1]}`;
14
+ if (!isCalendarDay(day)) {
15
+ notHmrc(`bad date ${JSON.stringify(text)}`);
16
+ }
17
+ return day;
18
+ }
19
+ /**
20
+ * When a month's rates are public: the end of the day HMRC publishes them, the Wednesday before the
21
+ * penultimate Thursday of the month before. The trade tariff service's API gives that Wednesday as
22
+ * the `publication_date` of every monthly file from January 2024 to November 2026; it gives no
23
+ * time of day, so the end of that UTC day is the earliest moment that is never too early. That
24
+ * instant is the start of the penultimate Thursday.
25
+ */
26
+ function publishedBy(start) {
27
+ // The last day of the previous month, then back to its last Thursday, then a week before that.
28
+ const lastDay = new Date(Date.UTC(Number(start.slice(0, 4)), Number(start.slice(5, 7)) - 1, 0));
29
+ const backToThursday = (lastDay.getUTCDay() - 4 + 7) % 7;
30
+ lastDay.setUTCDate(lastDay.getUTCDate() - backToThursday - 7);
31
+ return lastDay.toISOString();
32
+ }
33
+ /**
34
+ * Parses HMRC's monthly exchange rates CSV (trade-tariff.service.gov.uk, under the Open
35
+ * Government Licence) into one GBP-based table per period, newest first. Each is valid for its
36
+ * calendar month: `asOf` is the start date and `validUntil` the end date, so a `rateHistory` of
37
+ * them answers any day of the month (see @ducatjs/money/convert/history). Rates are currency units
38
+ * per £1, with `source: 'HMRC'` and `type: 'customs'`, four decimals as published. HMRC publishes
39
+ * each month's file in the month before, on the Wednesday before its penultimate Thursday (the
40
+ * `publication_date` that https://www.trade-tariff.service.gov.uk/api/v2/exchange_rates/
41
+ * period_lists/2026?filter[type]=monthly gives for each file); `availableAt` is the end of that
42
+ * UTC day. Several countries share a code (the CFA francs, AED, XCD): their rows must agree.
43
+ * HMRC never leaves a rate blank, so a blank or missing-value cell throws SyntaxError, as does any
44
+ * other row that can't be read. A file may hold several periods; they may overlap (a mid-month
45
+ * amendment, say), and `rateHistory` then uses the one that started last.
46
+ *
47
+ * const [november] = parseHmrcMonthlyCsv(await readFile('monthly_csv_2026-11.csv', 'utf8'));
48
+ * november.rate('GBP', 'EUR', { asOf: '2026-11-15' })?.toString(); // '1.1930'
49
+ */
50
+ export function parseHmrcMonthlyCsv(csv, options) {
51
+ const [header, ...rows] = csvRows(csv.charCodeAt(0) === 0xfeff ? csv.slice(1) : csv);
52
+ const names = (header ?? []).map((name) => name.trim());
53
+ const index = COLUMNS.map((name) => names.indexOf(name));
54
+ if (index.some((i) => i === -1)) {
55
+ notHmrc(`the columns are ${names.join(', ')}`);
56
+ }
57
+ const [codeAt, rateAt, startAt, endAt] = index;
58
+ if (rows.length === 0) {
59
+ notHmrc('no rates');
60
+ }
61
+ // Periods by their start and end; within one, rates by code.
62
+ const periods = new Map();
63
+ for (const cells of rows) {
64
+ if (cells.length !== names.length) {
65
+ notHmrc(`a row has ${cells.length} cells, the header ${names.length}`);
66
+ }
67
+ const code = cells[codeAt].trim();
68
+ if (!/^[A-Z]{3}$/.test(code) || code === 'GBP') {
69
+ notHmrc(`bad currency code ${JSON.stringify(code)}`);
70
+ }
71
+ const start = isoDate(cells[startAt]);
72
+ const end = isoDate(cells[endAt]);
73
+ if (end < start) {
74
+ notHmrc(`${code} ends on ${end}, before it starts on ${start}`);
75
+ }
76
+ const key = `${start}/${end}`;
77
+ let codes = periods.get(key);
78
+ if (codes === undefined) {
79
+ codes = new Map();
80
+ periods.set(key, codes);
81
+ }
82
+ const where = `${code} from ${start}`;
83
+ const rate = readRateCell(cells[rateAt], where);
84
+ if (rate === null) {
85
+ notHmrc(`no rate for ${where}`);
86
+ }
87
+ addDayRate(codes, start, code, rate);
88
+ }
89
+ const tables = [];
90
+ for (const [key, codes] of periods) {
91
+ const [start, end] = key.split('/');
92
+ const rates = codes.get(start);
93
+ if (!Object.values(rates).some((rate) => rate !== null)) {
94
+ continue;
95
+ }
96
+ let availableAt;
97
+ if (options?.availableAt === undefined) {
98
+ availableAt = publishedBy(start);
99
+ }
100
+ else if (options.availableAt !== false) {
101
+ availableAt = options.availableAt(start);
102
+ }
103
+ const info = { base: 'GBP', source: 'HMRC', type: 'customs', asOf: start, validUntil: end };
104
+ tables.push(rateTable({ ...info, ...(availableAt === undefined ? {} : { availableAt }), rates }));
105
+ }
106
+ return newestFirst(tables);
107
+ }
108
+ //# sourceMappingURL=hmrc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmrc.js","sourceRoot":"","sources":["../src/hmrc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `@ducatjs/money`: the core. Money with construction, arithmetic, rounding, comparison and
3
+ * serialisation as methods (`price.add(fee).multiply('1.075')`), plus the ISO 4217 exponents.
4
+ * The same operations as plain functions (`add(price, fee)`) are in `@ducatjs/money/fn`. Allocation, tax, conversion, cash rounding,
5
+ * formatting, parsing and the processor and database views are opt-in modules
6
+ * (`@ducatjs/money/allocate`, `@ducatjs/money/tax`, ...; `@ducatjs/money/all` for everything).
7
+ */
8
+ export { money, fromMinor, zero, fromJSON, isMoney, isMoneyIn, assertCurrency, extendMoney, type ExtendMoneyOptions, sum, ratio, CurrencyMismatchError, type RoundingPolicy, type RoundingInput, type Money, type MoneyJSON, type MoneyOptions, type CurrencyInput, type Factor, type Ratio, } from './money.js';
9
+ export { DEFAULT_ROUNDING, Rounding, RoundingError, type RoundingMode } from './rounding.js';
10
+ export { currencyExponent, defineCurrency, isCurrency, ISO_EXPONENTS, ISO_4217_PUBLISHED, ISO_NON_MONETARY, type CurrencyCode, type IsoCurrencyCode, type CustomCurrencies, } from './currency.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,EACT,cAAc,EACd,WAAW,EACX,KAAK,kBAAkB,EACvB,GAAG,EACH,KAAK,EACL,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,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"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `@ducatjs/money`: the core. Money with construction, arithmetic, rounding, comparison and
3
+ * serialisation as methods (`price.add(fee).multiply('1.075')`), plus the ISO 4217 exponents.
4
+ * The same operations as plain functions (`add(price, fee)`) are in `@ducatjs/money/fn`. Allocation, tax, conversion, cash rounding,
5
+ * formatting, parsing and the processor and database views are opt-in modules
6
+ * (`@ducatjs/money/allocate`, `@ducatjs/money/tax`, ...; `@ducatjs/money/all` for everything).
7
+ */
8
+ export { money, fromMinor, zero, fromJSON, isMoney, isMoneyIn, assertCurrency, extendMoney, sum, ratio, CurrencyMismatchError, } from './money.js';
9
+ export { DEFAULT_ROUNDING, Rounding, RoundingError } from './rounding.js';
10
+ export { currencyExponent, defineCurrency, isCurrency, ISO_EXPONENTS, ISO_4217_PUBLISHED, ISO_NON_MONETARY, } from './currency.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,EACT,cAAc,EACd,WAAW,EAEX,GAAG,EACH,KAAK,EACL,qBAAqB,GAStB,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"}