@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.
- package/LICENSE +21 -0
- package/NOTICE +51 -0
- package/README.md +1034 -3
- package/assets/CREDITS.md +12 -0
- package/data/adyen-fx.json +19 -0
- package/data/adyen.json +171 -0
- package/data/braintree.json +223 -0
- package/data/cash-rounding.json +520 -0
- package/data/checkout.json +230 -0
- package/data/cldr-cash.json +101 -0
- package/data/historic.json +78 -0
- package/data/iso4217-list-one.xml +1956 -0
- package/data/iso4217-list-three.xml +1185 -0
- package/data/klarna.json +95 -0
- package/data/paypal.json +65 -0
- package/data/stripe-fx.json +17 -0
- package/data/stripe.json +285 -0
- package/dist/adyen-fx.d.ts +25 -0
- package/dist/adyen-fx.d.ts.map +1 -0
- package/dist/adyen-fx.js +140 -0
- package/dist/adyen-fx.js.map +1 -0
- package/dist/adyen.d.ts +25 -0
- package/dist/adyen.d.ts.map +1 -0
- package/dist/adyen.js +34 -0
- package/dist/adyen.js.map +1 -0
- package/dist/allocate.d.ts +72 -0
- package/dist/allocate.d.ts.map +1 -0
- package/dist/allocate.js +314 -0
- package/dist/allocate.js.map +1 -0
- package/dist/bag.d.ts +58 -0
- package/dist/bag.d.ts.map +1 -0
- package/dist/bag.js +122 -0
- package/dist/bag.js.map +1 -0
- package/dist/boc.d.ts +31 -0
- package/dist/boc.d.ts.map +1 -0
- package/dist/boc.js +114 -0
- package/dist/boc.js.map +1 -0
- package/dist/boe.d.ts +33 -0
- package/dist/boe.d.ts.map +1 -0
- package/dist/boe.js +114 -0
- package/dist/boe.js.map +1 -0
- package/dist/braintree.d.ts +34 -0
- package/dist/braintree.d.ts.map +1 -0
- package/dist/braintree.js +45 -0
- package/dist/braintree.js.map +1 -0
- package/dist/cash.d.ts +64 -0
- package/dist/cash.d.ts.map +1 -0
- package/dist/cash.js +134 -0
- package/dist/cash.js.map +1 -0
- package/dist/checkout.d.ts +42 -0
- package/dist/checkout.d.ts.map +1 -0
- package/dist/checkout.js +52 -0
- package/dist/checkout.js.map +1 -0
- package/dist/convert.d.ts +52 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +65 -0
- package/dist/convert.js.map +1 -0
- package/dist/currency.d.ts +22 -0
- package/dist/currency.d.ts.map +1 -0
- package/dist/currency.js +38 -0
- package/dist/currency.js.map +1 -0
- package/dist/decimal.d.ts +52 -0
- package/dist/decimal.d.ts.map +1 -0
- package/dist/decimal.js +251 -0
- package/dist/decimal.js.map +1 -0
- package/dist/drizzle/mysql.d.ts +105 -0
- package/dist/drizzle/mysql.d.ts.map +1 -0
- package/dist/drizzle/mysql.js +60 -0
- package/dist/drizzle/mysql.js.map +1 -0
- package/dist/drizzle/pg.d.ts +103 -0
- package/dist/drizzle/pg.d.ts.map +1 -0
- package/dist/drizzle/pg.js +60 -0
- package/dist/drizzle/pg.js.map +1 -0
- package/dist/drizzle/sqlite.d.ts +102 -0
- package/dist/drizzle/sqlite.d.ts.map +1 -0
- package/dist/drizzle/sqlite.js +59 -0
- package/dist/drizzle/sqlite.js.map +1 -0
- package/dist/ecb.d.ts +52 -0
- package/dist/ecb.d.ts.map +1 -0
- package/dist/ecb.js +285 -0
- package/dist/ecb.js.map +1 -0
- package/dist/exact.d.ts +62 -0
- package/dist/exact.d.ts.map +1 -0
- package/dist/exact.js +147 -0
- package/dist/exact.js.map +1 -0
- package/dist/fed.d.ts +35 -0
- package/dist/fed.d.ts.map +1 -0
- package/dist/fed.js +134 -0
- package/dist/fed.js.map +1 -0
- package/dist/fetch.d.ts +103 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +222 -0
- package/dist/fetch.js.map +1 -0
- package/dist/fixed.d.ts +121 -0
- package/dist/fixed.d.ts.map +1 -0
- package/dist/fixed.js +420 -0
- package/dist/fixed.js.map +1 -0
- package/dist/fn.d.ts +34 -0
- package/dist/fn.d.ts.map +1 -0
- package/dist/fn.js +37 -0
- package/dist/fn.js.map +1 -0
- package/dist/format.d.ts +13 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +90 -0
- package/dist/format.js.map +1 -0
- package/dist/generated/adyen.d.ts +3 -0
- package/dist/generated/adyen.d.ts.map +1 -0
- package/dist/generated/adyen.js +144 -0
- package/dist/generated/adyen.js.map +1 -0
- package/dist/generated/braintree.d.ts +3 -0
- package/dist/generated/braintree.d.ts.map +1 -0
- package/dist/generated/braintree.js +140 -0
- package/dist/generated/braintree.js.map +1 -0
- package/dist/generated/cash.d.ts +14 -0
- package/dist/generated/cash.d.ts.map +1 -0
- package/dist/generated/cash.js +465 -0
- package/dist/generated/cash.js.map +1 -0
- package/dist/generated/checkout.d.ts +3 -0
- package/dist/generated/checkout.d.ts.map +1 -0
- package/dist/generated/checkout.js +151 -0
- package/dist/generated/checkout.js.map +1 -0
- package/dist/generated/historic.d.ts +337 -0
- package/dist/generated/historic.d.ts.map +1 -0
- package/dist/generated/historic.js +66 -0
- package/dist/generated/historic.js.map +1 -0
- package/dist/generated/iso4217.d.ts +174 -0
- package/dist/generated/iso4217.d.ts.map +1 -0
- package/dist/generated/iso4217.js +175 -0
- package/dist/generated/iso4217.js.map +1 -0
- package/dist/generated/kernel.d.ts +17 -0
- package/dist/generated/kernel.d.ts.map +1 -0
- package/dist/generated/kernel.js +208 -0
- package/dist/generated/kernel.js.map +1 -0
- package/dist/generated/klarna.d.ts +3 -0
- package/dist/generated/klarna.d.ts.map +1 -0
- package/dist/generated/klarna.js +21 -0
- package/dist/generated/klarna.js.map +1 -0
- package/dist/generated/paypal.d.ts +3 -0
- package/dist/generated/paypal.d.ts.map +1 -0
- package/dist/generated/paypal.js +31 -0
- package/dist/generated/paypal.js.map +1 -0
- package/dist/generated/stripe.d.ts +8 -0
- package/dist/generated/stripe.d.ts.map +1 -0
- package/dist/generated/stripe.js +150 -0
- package/dist/generated/stripe.js.map +1 -0
- package/dist/historic.d.ts +40 -0
- package/dist/historic.d.ts.map +1 -0
- package/dist/historic.js +43 -0
- package/dist/historic.js.map +1 -0
- package/dist/history.d.ts +96 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +213 -0
- package/dist/history.js.map +1 -0
- package/dist/hmrc.d.ts +28 -0
- package/dist/hmrc.d.ts.map +1 -0
- package/dist/hmrc.js +108 -0
- package/dist/hmrc.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/klarna.d.ts +31 -0
- package/dist/klarna.d.ts.map +1 -0
- package/dist/klarna.js +38 -0
- package/dist/klarna.js.map +1 -0
- package/dist/kysely.d.ts +120 -0
- package/dist/kysely.d.ts.map +1 -0
- package/dist/kysely.js +309 -0
- package/dist/kysely.js.map +1 -0
- package/dist/money.d.ts +302 -0
- package/dist/money.d.ts.map +1 -0
- package/dist/money.js +703 -0
- package/dist/money.js.map +1 -0
- package/dist/parse.d.ts +55 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +419 -0
- package/dist/parse.js.map +1 -0
- package/dist/paypal.d.ts +41 -0
- package/dist/paypal.d.ts.map +1 -0
- package/dist/paypal.js +58 -0
- package/dist/paypal.js.map +1 -0
- package/dist/pg.d.ts +100 -0
- package/dist/pg.d.ts.map +1 -0
- package/dist/pg.js +343 -0
- package/dist/pg.js.map +1 -0
- package/dist/plugins/adyen.d.ts +15 -0
- package/dist/plugins/adyen.d.ts.map +1 -0
- package/dist/plugins/adyen.js +10 -0
- package/dist/plugins/adyen.js.map +1 -0
- package/dist/plugins/all.d.ts +29 -0
- package/dist/plugins/all.d.ts.map +1 -0
- package/dist/plugins/all.js +30 -0
- package/dist/plugins/all.js.map +1 -0
- package/dist/plugins/allocate.d.ts +20 -0
- package/dist/plugins/allocate.d.ts.map +1 -0
- package/dist/plugins/allocate.js +26 -0
- package/dist/plugins/allocate.js.map +1 -0
- package/dist/plugins/braintree.d.ts +12 -0
- package/dist/plugins/braintree.d.ts.map +1 -0
- package/dist/plugins/braintree.js +12 -0
- package/dist/plugins/braintree.js.map +1 -0
- package/dist/plugins/cash.d.ts +19 -0
- package/dist/plugins/cash.d.ts.map +1 -0
- package/dist/plugins/cash.js +16 -0
- package/dist/plugins/cash.js.map +1 -0
- package/dist/plugins/checkout.d.ts +21 -0
- package/dist/plugins/checkout.d.ts.map +1 -0
- package/dist/plugins/checkout.js +16 -0
- package/dist/plugins/checkout.js.map +1 -0
- package/dist/plugins/convert.d.ts +19 -0
- package/dist/plugins/convert.d.ts.map +1 -0
- package/dist/plugins/convert.js +13 -0
- package/dist/plugins/convert.js.map +1 -0
- package/dist/plugins/exact.d.ts +15 -0
- package/dist/plugins/exact.d.ts.map +1 -0
- package/dist/plugins/exact.js +13 -0
- package/dist/plugins/exact.js.map +1 -0
- package/dist/plugins/fixed.d.ts +17 -0
- package/dist/plugins/fixed.d.ts.map +1 -0
- package/dist/plugins/fixed.js +13 -0
- package/dist/plugins/fixed.js.map +1 -0
- package/dist/plugins/format.d.ts +9 -0
- package/dist/plugins/format.d.ts.map +1 -0
- package/dist/plugins/format.js +16 -0
- package/dist/plugins/format.js.map +1 -0
- package/dist/plugins/klarna.d.ts +10 -0
- package/dist/plugins/klarna.d.ts.map +1 -0
- package/dist/plugins/klarna.js +10 -0
- package/dist/plugins/klarna.js.map +1 -0
- package/dist/plugins/paypal.d.ts +14 -0
- package/dist/plugins/paypal.d.ts.map +1 -0
- package/dist/plugins/paypal.js +16 -0
- package/dist/plugins/paypal.js.map +1 -0
- package/dist/plugins/prisma.d.ts +8 -0
- package/dist/plugins/prisma.d.ts.map +1 -0
- package/dist/plugins/prisma.js +13 -0
- package/dist/plugins/prisma.js.map +1 -0
- package/dist/plugins/stripe.d.ts +14 -0
- package/dist/plugins/stripe.d.ts.map +1 -0
- package/dist/plugins/stripe.js +16 -0
- package/dist/plugins/stripe.js.map +1 -0
- package/dist/plugins/tax.d.ts +20 -0
- package/dist/plugins/tax.d.ts.map +1 -0
- package/dist/plugins/tax.js +18 -0
- package/dist/plugins/tax.js.map +1 -0
- package/dist/policy.d.ts +34 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +90 -0
- package/dist/policy.js.map +1 -0
- package/dist/prisma.d.ts +77 -0
- package/dist/prisma.d.ts.map +1 -0
- package/dist/prisma.js +76 -0
- package/dist/prisma.js.map +1 -0
- package/dist/processor.d.ts +28 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +118 -0
- package/dist/processor.js.map +1 -0
- package/dist/provider.d.ts +103 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +280 -0
- package/dist/provider.js.map +1 -0
- package/dist/rate-text.d.ts +38 -0
- package/dist/rate-text.d.ts.map +1 -0
- package/dist/rate-text.js +143 -0
- package/dist/rate-text.js.map +1 -0
- package/dist/rate.d.ts +175 -0
- package/dist/rate.d.ts.map +1 -0
- package/dist/rate.js +371 -0
- package/dist/rate.js.map +1 -0
- package/dist/rounding-error.d.ts +9 -0
- package/dist/rounding-error.d.ts.map +1 -0
- package/dist/rounding-error.js +9 -0
- package/dist/rounding-error.js.map +1 -0
- package/dist/rounding.d.ts +50 -0
- package/dist/rounding.d.ts.map +1 -0
- package/dist/rounding.js +87 -0
- package/dist/rounding.js.map +1 -0
- package/dist/schema.d.ts +43 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +77 -0
- package/dist/schema.js.map +1 -0
- package/dist/sql.d.ts +54 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +131 -0
- package/dist/sql.js.map +1 -0
- package/dist/stripe-fx.d.ts +22 -0
- package/dist/stripe-fx.d.ts.map +1 -0
- package/dist/stripe-fx.js +30 -0
- package/dist/stripe-fx.js.map +1 -0
- package/dist/stripe.d.ts +36 -0
- package/dist/stripe.d.ts.map +1 -0
- package/dist/stripe.js +39 -0
- package/dist/stripe.js.map +1 -0
- package/dist/tax.d.ts +33 -0
- package/dist/tax.d.ts.map +1 -0
- package/dist/tax.js +55 -0
- package/dist/tax.js.map +1 -0
- package/dist/testing/arbitraries.d.ts +43 -0
- package/dist/testing/arbitraries.d.ts.map +1 -0
- package/dist/testing/arbitraries.js +98 -0
- package/dist/testing/arbitraries.js.map +1 -0
- package/dist/testing/index.d.ts +67 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +159 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/jest.d.ts +2 -0
- package/dist/testing/jest.d.ts.map +1 -0
- package/dist/testing/jest.js +15 -0
- package/dist/testing/jest.js.map +1 -0
- package/dist/testing/vitest.d.ts +7 -0
- package/dist/testing/vitest.d.ts.map +1 -0
- package/dist/testing/vitest.js +12 -0
- package/dist/testing/vitest.js.map +1 -0
- package/dist/valibot.d.ts +33 -0
- package/dist/valibot.d.ts.map +1 -0
- package/dist/valibot.js +61 -0
- package/dist/valibot.js.map +1 -0
- package/dist/zod.d.ts +36 -0
- package/dist/zod.d.ts.map +1 -0
- package/dist/zod.js +58 -0
- package/dist/zod.js.map +1 -0
- package/package.json +280 -5
- package/src/adyen-fx.ts +175 -0
- package/src/adyen.ts +46 -0
- package/src/allocate.ts +393 -0
- package/src/bag.ts +170 -0
- package/src/boc.ts +136 -0
- package/src/boe.ts +131 -0
- package/src/braintree.ts +71 -0
- package/src/cash.ts +183 -0
- package/src/checkout.ts +77 -0
- package/src/convert.ts +177 -0
- package/src/currency.ts +61 -0
- package/src/decimal.ts +283 -0
- package/src/drizzle/mysql.ts +78 -0
- package/src/drizzle/pg.ts +78 -0
- package/src/drizzle/sqlite.ts +70 -0
- package/src/ecb.ts +328 -0
- package/src/exact.ts +182 -0
- package/src/fed.ts +146 -0
- package/src/fetch.ts +306 -0
- package/src/fixed.ts +558 -0
- package/src/fn.ts +94 -0
- package/src/format.ts +106 -0
- package/src/generated/adyen.ts +144 -0
- package/src/generated/braintree.ts +140 -0
- package/src/generated/cash.ts +478 -0
- package/src/generated/checkout.ts +151 -0
- package/src/generated/historic.ts +67 -0
- package/src/generated/iso4217.ts +179 -0
- package/src/generated/kernel.ts +230 -0
- package/src/generated/klarna.ts +21 -0
- package/src/generated/paypal.ts +31 -0
- package/src/generated/stripe.ts +150 -0
- package/src/historic.ts +77 -0
- package/src/history.ts +333 -0
- package/src/hmrc.ts +125 -0
- package/src/index.ts +41 -0
- package/src/klarna.ts +54 -0
- package/src/kysely.ts +588 -0
- package/src/money.ts +979 -0
- package/src/parse.ts +511 -0
- package/src/paypal.ts +93 -0
- package/src/pg.ts +410 -0
- package/src/plugins/adyen.ts +25 -0
- package/src/plugins/all.ts +57 -0
- package/src/plugins/allocate.ts +53 -0
- package/src/plugins/braintree.ts +23 -0
- package/src/plugins/cash.ts +33 -0
- package/src/plugins/checkout.ts +32 -0
- package/src/plugins/convert.ts +49 -0
- package/src/plugins/exact.ts +23 -0
- package/src/plugins/fixed.ts +28 -0
- package/src/plugins/format.ts +28 -0
- package/src/plugins/klarna.ts +21 -0
- package/src/plugins/paypal.ts +29 -0
- package/src/plugins/prisma.ts +24 -0
- package/src/plugins/stripe.ts +29 -0
- package/src/plugins/tax.ts +40 -0
- package/src/policy.ts +124 -0
- package/src/prisma.ts +199 -0
- package/src/processor.ts +181 -0
- package/src/provider.ts +389 -0
- package/src/rate-text.ts +151 -0
- package/src/rate.ts +546 -0
- package/src/rounding-error.ts +8 -0
- package/src/rounding.ts +122 -0
- package/src/schema.ts +119 -0
- package/src/sql.ts +178 -0
- package/src/stripe-fx.ts +49 -0
- package/src/stripe.ts +69 -0
- package/src/tax.ts +102 -0
- package/src/testing/arbitraries.ts +134 -0
- package/src/testing/index.ts +247 -0
- package/src/testing/jest.ts +18 -0
- package/src/testing/vitest.ts +18 -0
- package/src/valibot.ts +87 -0
- package/src/zod.ts +78 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-currencies.mjs from data/iso4217-list-one.xml. Do not edit by hand.
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
/** Publication date of the ISO 4217 List One snapshot the table was generated from. */
|
|
5
|
+
export const ISO_4217_PUBLISHED = "2026-09-17";
|
|
6
|
+
|
|
7
|
+
/** ISO 4217 minor-unit exponent for every active code that has one (165 codes). */
|
|
8
|
+
export const ISO_EXPONENTS = {
|
|
9
|
+
AED: 2,
|
|
10
|
+
AFN: 2,
|
|
11
|
+
ALL: 2,
|
|
12
|
+
AMD: 2,
|
|
13
|
+
AOA: 2,
|
|
14
|
+
ARS: 2,
|
|
15
|
+
AUD: 2,
|
|
16
|
+
AWG: 2,
|
|
17
|
+
AZN: 2,
|
|
18
|
+
BAM: 2,
|
|
19
|
+
BBD: 2,
|
|
20
|
+
BDT: 2,
|
|
21
|
+
BHD: 3,
|
|
22
|
+
BIF: 0,
|
|
23
|
+
BMD: 2,
|
|
24
|
+
BND: 2,
|
|
25
|
+
BOB: 2,
|
|
26
|
+
BOV: 2,
|
|
27
|
+
BRL: 2,
|
|
28
|
+
BSD: 2,
|
|
29
|
+
BTN: 2,
|
|
30
|
+
BWP: 2,
|
|
31
|
+
BYN: 2,
|
|
32
|
+
BZD: 2,
|
|
33
|
+
CAD: 2,
|
|
34
|
+
CDF: 2,
|
|
35
|
+
CHE: 2,
|
|
36
|
+
CHF: 2,
|
|
37
|
+
CHW: 2,
|
|
38
|
+
CLF: 4,
|
|
39
|
+
CLP: 0,
|
|
40
|
+
CNY: 2,
|
|
41
|
+
COP: 2,
|
|
42
|
+
COU: 2,
|
|
43
|
+
CRC: 2,
|
|
44
|
+
CUP: 2,
|
|
45
|
+
CVE: 2,
|
|
46
|
+
CZK: 2,
|
|
47
|
+
DJF: 0,
|
|
48
|
+
DKK: 2,
|
|
49
|
+
DOP: 2,
|
|
50
|
+
DZD: 2,
|
|
51
|
+
EGP: 2,
|
|
52
|
+
ERN: 2,
|
|
53
|
+
ETB: 2,
|
|
54
|
+
EUR: 2,
|
|
55
|
+
FJD: 2,
|
|
56
|
+
FKP: 2,
|
|
57
|
+
GBP: 2,
|
|
58
|
+
GEL: 2,
|
|
59
|
+
GHS: 2,
|
|
60
|
+
GIP: 2,
|
|
61
|
+
GMD: 2,
|
|
62
|
+
GNF: 0,
|
|
63
|
+
GTQ: 2,
|
|
64
|
+
GYD: 2,
|
|
65
|
+
HKD: 2,
|
|
66
|
+
HNL: 2,
|
|
67
|
+
HTG: 2,
|
|
68
|
+
HUF: 2,
|
|
69
|
+
IDR: 2,
|
|
70
|
+
ILS: 2,
|
|
71
|
+
INR: 2,
|
|
72
|
+
IQD: 3,
|
|
73
|
+
IRR: 2,
|
|
74
|
+
ISK: 0,
|
|
75
|
+
JMD: 2,
|
|
76
|
+
JOD: 3,
|
|
77
|
+
JPY: 0,
|
|
78
|
+
KES: 2,
|
|
79
|
+
KGS: 2,
|
|
80
|
+
KHR: 2,
|
|
81
|
+
KMF: 0,
|
|
82
|
+
KPW: 2,
|
|
83
|
+
KRW: 0,
|
|
84
|
+
KWD: 3,
|
|
85
|
+
KYD: 2,
|
|
86
|
+
KZT: 2,
|
|
87
|
+
LAK: 2,
|
|
88
|
+
LBP: 2,
|
|
89
|
+
LKR: 2,
|
|
90
|
+
LRD: 2,
|
|
91
|
+
LSL: 2,
|
|
92
|
+
LYD: 3,
|
|
93
|
+
MAD: 2,
|
|
94
|
+
MDL: 2,
|
|
95
|
+
MGA: 2,
|
|
96
|
+
MKD: 2,
|
|
97
|
+
MMK: 2,
|
|
98
|
+
MNT: 2,
|
|
99
|
+
MOP: 2,
|
|
100
|
+
MRU: 2,
|
|
101
|
+
MUR: 2,
|
|
102
|
+
MVR: 2,
|
|
103
|
+
MWK: 2,
|
|
104
|
+
MXN: 2,
|
|
105
|
+
MXV: 2,
|
|
106
|
+
MYR: 2,
|
|
107
|
+
MZN: 2,
|
|
108
|
+
NAD: 2,
|
|
109
|
+
NGN: 2,
|
|
110
|
+
NIO: 2,
|
|
111
|
+
NOK: 2,
|
|
112
|
+
NPR: 2,
|
|
113
|
+
NZD: 2,
|
|
114
|
+
OMR: 3,
|
|
115
|
+
PAB: 2,
|
|
116
|
+
PEN: 2,
|
|
117
|
+
PGK: 2,
|
|
118
|
+
PHP: 2,
|
|
119
|
+
PKR: 2,
|
|
120
|
+
PLN: 2,
|
|
121
|
+
PYG: 0,
|
|
122
|
+
QAR: 2,
|
|
123
|
+
RON: 2,
|
|
124
|
+
RSD: 2,
|
|
125
|
+
RUB: 2,
|
|
126
|
+
RWF: 0,
|
|
127
|
+
SAR: 2,
|
|
128
|
+
SBD: 2,
|
|
129
|
+
SCR: 2,
|
|
130
|
+
SDG: 2,
|
|
131
|
+
SEK: 2,
|
|
132
|
+
SGD: 2,
|
|
133
|
+
SHP: 2,
|
|
134
|
+
SLE: 2,
|
|
135
|
+
SOS: 2,
|
|
136
|
+
SRD: 2,
|
|
137
|
+
SSP: 2,
|
|
138
|
+
STN: 2,
|
|
139
|
+
SVC: 2,
|
|
140
|
+
SYP: 2,
|
|
141
|
+
SZL: 2,
|
|
142
|
+
THB: 2,
|
|
143
|
+
TJS: 2,
|
|
144
|
+
TMT: 2,
|
|
145
|
+
TND: 3,
|
|
146
|
+
TOP: 2,
|
|
147
|
+
TRY: 2,
|
|
148
|
+
TTD: 2,
|
|
149
|
+
TWD: 2,
|
|
150
|
+
TZS: 2,
|
|
151
|
+
UAH: 2,
|
|
152
|
+
UGX: 0,
|
|
153
|
+
USD: 2,
|
|
154
|
+
USN: 2,
|
|
155
|
+
UYI: 0,
|
|
156
|
+
UYU: 2,
|
|
157
|
+
UYW: 4,
|
|
158
|
+
UZS: 2,
|
|
159
|
+
VED: 2,
|
|
160
|
+
VES: 2,
|
|
161
|
+
VND: 0,
|
|
162
|
+
VUV: 0,
|
|
163
|
+
WST: 2,
|
|
164
|
+
XAD: 2,
|
|
165
|
+
XAF: 0,
|
|
166
|
+
XCD: 2,
|
|
167
|
+
XCG: 2,
|
|
168
|
+
XOF: 0,
|
|
169
|
+
XPF: 0,
|
|
170
|
+
YER: 2,
|
|
171
|
+
ZAR: 2,
|
|
172
|
+
ZMW: 2,
|
|
173
|
+
ZWG: 2,
|
|
174
|
+
} as const;
|
|
175
|
+
|
|
176
|
+
export type IsoCurrencyCode = keyof typeof ISO_EXPONENTS;
|
|
177
|
+
|
|
178
|
+
/** Active codes whose minor unit is "N.A." (precious metals, SDR, testing): not monetary, not in ISO_EXPONENTS. */
|
|
179
|
+
export const ISO_NON_MONETARY = ["XAG","XAU","XBA","XBB","XBC","XBD","XDR","XPD","XPT","XSU","XTS","XUA","XXX"] as const;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// lean-sources sha256:69cb179d69b98bf06518e6abae249369e163ca9ac7c318064680c59920517601 content sha256:dc3d761f86eb9b865b2cfa6a6dba6e6b3853afdab3ec5c8811415f9942c6231c
|
|
2
|
+
// GENERATED from proofs/Ducat/Rounding.lean by `pnpm gen:kernel`. Do not edit.
|
|
3
|
+
import { RoundingError } from '../rounding-error.js';
|
|
4
|
+
import type { RoundingMode } from '../rounding.js';
|
|
5
|
+
|
|
6
|
+
const ROUNDING_NECESSARY = 'Rounding necessary: the result is not exact; pass a rounding mode';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* `dividend / divisor` rounded with `mode`; `divisor` must be positive.
|
|
10
|
+
*
|
|
11
|
+
* Each `case` is printed from the Lean kernel for that mode, which is proved correct in
|
|
12
|
+
* proofs/Ducat/Rounding.lean: `kernel_sound` (the result satisfies the specification `Rounds`),
|
|
13
|
+
* `rounds_unique` (only one value does) and `kernel_fails_iff` (it throws only for 'unnecessary' on an
|
|
14
|
+
* inexact division), hence `kernel_correct`. Unknown modes throw a RangeError.
|
|
15
|
+
*/
|
|
16
|
+
export function divideAndRoundBigint(
|
|
17
|
+
dividend: bigint,
|
|
18
|
+
divisor: bigint,
|
|
19
|
+
mode: RoundingMode,
|
|
20
|
+
): bigint {
|
|
21
|
+
const quotient = dividend / divisor;
|
|
22
|
+
const remainder = dividend - quotient * divisor;
|
|
23
|
+
return roundTruncatedQuotientBigint(dividend, divisor, quotient, remainder, mode);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Rounds the truncated `quotient` of `dividend / divisor` (with `remainder = dividend - quotient * divisor`)
|
|
28
|
+
* with `mode`; `divisor` must be positive.
|
|
29
|
+
*
|
|
30
|
+
* Each `case` is printed from the Lean kernel for that mode, which is proved correct in
|
|
31
|
+
* proofs/Ducat/Rounding.lean: `kernel_sound` (the result satisfies the specification `Rounds`),
|
|
32
|
+
* `rounds_unique` (only one value does) and `kernel_fails_iff` (it throws only for 'unnecessary' on an
|
|
33
|
+
* inexact division), hence `kernel_correct`. Unknown modes throw a RangeError.
|
|
34
|
+
*/
|
|
35
|
+
function roundTruncatedQuotientBigint(
|
|
36
|
+
dividend: bigint,
|
|
37
|
+
divisor: bigint,
|
|
38
|
+
quotient: bigint,
|
|
39
|
+
remainder: bigint,
|
|
40
|
+
mode: RoundingMode,
|
|
41
|
+
): bigint {
|
|
42
|
+
if (remainder === 0n) {
|
|
43
|
+
return quotient;
|
|
44
|
+
}
|
|
45
|
+
const twiceRemainder = remainder < 0n ? -2n * remainder : 2n * remainder;
|
|
46
|
+
|
|
47
|
+
switch (mode) {
|
|
48
|
+
// rounds to the nearest integer, ties away from zero
|
|
49
|
+
case 'halfExpand': {
|
|
50
|
+
if (divisor <= twiceRemainder) {
|
|
51
|
+
if (dividend < 0n) {
|
|
52
|
+
return quotient - 1n;
|
|
53
|
+
}
|
|
54
|
+
return quotient + 1n;
|
|
55
|
+
}
|
|
56
|
+
return quotient;
|
|
57
|
+
}
|
|
58
|
+
// rounds to the nearest integer, ties to the even neighbour
|
|
59
|
+
case 'halfEven': {
|
|
60
|
+
if (divisor < twiceRemainder || (twiceRemainder === divisor && quotient % 2n !== 0n)) {
|
|
61
|
+
if (dividend < 0n) {
|
|
62
|
+
return quotient - 1n;
|
|
63
|
+
}
|
|
64
|
+
return quotient + 1n;
|
|
65
|
+
}
|
|
66
|
+
return quotient;
|
|
67
|
+
}
|
|
68
|
+
// rounds to the nearest integer, ties towards zero
|
|
69
|
+
case 'halfTrunc': {
|
|
70
|
+
if (divisor < twiceRemainder) {
|
|
71
|
+
if (dividend < 0n) {
|
|
72
|
+
return quotient - 1n;
|
|
73
|
+
}
|
|
74
|
+
return quotient + 1n;
|
|
75
|
+
}
|
|
76
|
+
return quotient;
|
|
77
|
+
}
|
|
78
|
+
// rounds to the nearest integer, ties towards +infinity
|
|
79
|
+
case 'halfCeil': {
|
|
80
|
+
if (divisor < twiceRemainder || (twiceRemainder === divisor && !(dividend < 0n))) {
|
|
81
|
+
if (dividend < 0n) {
|
|
82
|
+
return quotient - 1n;
|
|
83
|
+
}
|
|
84
|
+
return quotient + 1n;
|
|
85
|
+
}
|
|
86
|
+
return quotient;
|
|
87
|
+
}
|
|
88
|
+
// rounds to the nearest integer, ties towards -infinity
|
|
89
|
+
case 'halfFloor': {
|
|
90
|
+
if (divisor < twiceRemainder || (twiceRemainder === divisor && dividend < 0n)) {
|
|
91
|
+
if (dividend < 0n) {
|
|
92
|
+
return quotient - 1n;
|
|
93
|
+
}
|
|
94
|
+
return quotient + 1n;
|
|
95
|
+
}
|
|
96
|
+
return quotient;
|
|
97
|
+
}
|
|
98
|
+
// rounds towards zero
|
|
99
|
+
case 'trunc': {
|
|
100
|
+
return quotient;
|
|
101
|
+
}
|
|
102
|
+
// rounds away from zero
|
|
103
|
+
case 'expand': {
|
|
104
|
+
if (dividend < 0n) {
|
|
105
|
+
return quotient - 1n;
|
|
106
|
+
}
|
|
107
|
+
return quotient + 1n;
|
|
108
|
+
}
|
|
109
|
+
// rounds towards +infinity
|
|
110
|
+
case 'ceil': {
|
|
111
|
+
if (dividend < 0n) {
|
|
112
|
+
return quotient;
|
|
113
|
+
}
|
|
114
|
+
return quotient + 1n;
|
|
115
|
+
}
|
|
116
|
+
// rounds towards -infinity
|
|
117
|
+
case 'floor': {
|
|
118
|
+
if (!(dividend < 0n)) {
|
|
119
|
+
return quotient;
|
|
120
|
+
}
|
|
121
|
+
return quotient - 1n;
|
|
122
|
+
}
|
|
123
|
+
// rounds not at all: throws RoundingError unless the division is exact
|
|
124
|
+
case 'unnecessary': {
|
|
125
|
+
throw new RoundingError(ROUNDING_NECESSARY);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
throw new RangeError(`Unknown rounding mode "${String(mode)}"`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* The same switch over `number`: rounds the truncated `quotient` of `dividend / divisor`, where
|
|
133
|
+
* `remainder = dividend - quotient * divisor` exactly and `divisor` is positive. Every input must be a safe
|
|
134
|
+
* integer. This copy is not proved; test/kernel.test.ts compares it with the `bigint` one.
|
|
135
|
+
*/
|
|
136
|
+
export function roundTruncatedQuotient(
|
|
137
|
+
dividend: number,
|
|
138
|
+
divisor: number,
|
|
139
|
+
quotient: number,
|
|
140
|
+
remainder: number,
|
|
141
|
+
mode: RoundingMode,
|
|
142
|
+
): number {
|
|
143
|
+
if (remainder === 0) {
|
|
144
|
+
return quotient;
|
|
145
|
+
}
|
|
146
|
+
const twiceRemainder = remainder < 0 ? -2 * remainder : 2 * remainder;
|
|
147
|
+
|
|
148
|
+
switch (mode) {
|
|
149
|
+
// rounds to the nearest integer, ties away from zero
|
|
150
|
+
case 'halfExpand': {
|
|
151
|
+
if (divisor <= twiceRemainder) {
|
|
152
|
+
if (dividend < 0) {
|
|
153
|
+
return quotient - 1;
|
|
154
|
+
}
|
|
155
|
+
return quotient + 1;
|
|
156
|
+
}
|
|
157
|
+
return quotient;
|
|
158
|
+
}
|
|
159
|
+
// rounds to the nearest integer, ties to the even neighbour
|
|
160
|
+
case 'halfEven': {
|
|
161
|
+
if (divisor < twiceRemainder || (twiceRemainder === divisor && quotient % 2 !== 0)) {
|
|
162
|
+
if (dividend < 0) {
|
|
163
|
+
return quotient - 1;
|
|
164
|
+
}
|
|
165
|
+
return quotient + 1;
|
|
166
|
+
}
|
|
167
|
+
return quotient;
|
|
168
|
+
}
|
|
169
|
+
// rounds to the nearest integer, ties towards zero
|
|
170
|
+
case 'halfTrunc': {
|
|
171
|
+
if (divisor < twiceRemainder) {
|
|
172
|
+
if (dividend < 0) {
|
|
173
|
+
return quotient - 1;
|
|
174
|
+
}
|
|
175
|
+
return quotient + 1;
|
|
176
|
+
}
|
|
177
|
+
return quotient;
|
|
178
|
+
}
|
|
179
|
+
// rounds to the nearest integer, ties towards +infinity
|
|
180
|
+
case 'halfCeil': {
|
|
181
|
+
if (divisor < twiceRemainder || (twiceRemainder === divisor && !(dividend < 0))) {
|
|
182
|
+
if (dividend < 0) {
|
|
183
|
+
return quotient - 1;
|
|
184
|
+
}
|
|
185
|
+
return quotient + 1;
|
|
186
|
+
}
|
|
187
|
+
return quotient;
|
|
188
|
+
}
|
|
189
|
+
// rounds to the nearest integer, ties towards -infinity
|
|
190
|
+
case 'halfFloor': {
|
|
191
|
+
if (divisor < twiceRemainder || (twiceRemainder === divisor && dividend < 0)) {
|
|
192
|
+
if (dividend < 0) {
|
|
193
|
+
return quotient - 1;
|
|
194
|
+
}
|
|
195
|
+
return quotient + 1;
|
|
196
|
+
}
|
|
197
|
+
return quotient;
|
|
198
|
+
}
|
|
199
|
+
// rounds towards zero
|
|
200
|
+
case 'trunc': {
|
|
201
|
+
return quotient;
|
|
202
|
+
}
|
|
203
|
+
// rounds away from zero
|
|
204
|
+
case 'expand': {
|
|
205
|
+
if (dividend < 0) {
|
|
206
|
+
return quotient - 1;
|
|
207
|
+
}
|
|
208
|
+
return quotient + 1;
|
|
209
|
+
}
|
|
210
|
+
// rounds towards +infinity
|
|
211
|
+
case 'ceil': {
|
|
212
|
+
if (dividend < 0) {
|
|
213
|
+
return quotient;
|
|
214
|
+
}
|
|
215
|
+
return quotient + 1;
|
|
216
|
+
}
|
|
217
|
+
// rounds towards -infinity
|
|
218
|
+
case 'floor': {
|
|
219
|
+
if (!(dividend < 0)) {
|
|
220
|
+
return quotient;
|
|
221
|
+
}
|
|
222
|
+
return quotient - 1;
|
|
223
|
+
}
|
|
224
|
+
// rounds not at all: throws RoundingError unless the division is exact
|
|
225
|
+
case 'unnecessary': {
|
|
226
|
+
throw new RoundingError(ROUNDING_NECESSARY);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
throw new RangeError(`Unknown rounding mode "${String(mode)}"`);
|
|
230
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-currencies.mjs from data/klarna.json (https://docs.klarna.com/acquirer/klarna/get-started/integration-resilience/data-types/, retrieved 2026-11-07). Do not edit by hand.
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
/** Klarna purchase currencies and their ISO 4217 exponents (amounts are integer minor units). */
|
|
5
|
+
export const KLARNA_EXPONENTS: Readonly<Record<string, number>> = {
|
|
6
|
+
AUD: 2,
|
|
7
|
+
CAD: 2,
|
|
8
|
+
CHF: 2,
|
|
9
|
+
CZK: 2,
|
|
10
|
+
DKK: 2,
|
|
11
|
+
EUR: 2,
|
|
12
|
+
GBP: 2,
|
|
13
|
+
HUF: 2,
|
|
14
|
+
MXN: 2,
|
|
15
|
+
NOK: 2,
|
|
16
|
+
NZD: 2,
|
|
17
|
+
PLN: 2,
|
|
18
|
+
RON: 2,
|
|
19
|
+
SEK: 2,
|
|
20
|
+
USD: 2,
|
|
21
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-currencies.mjs from data/paypal.json (https://developer.paypal.com/api/rest/reference/currency-codes/, retrieved 2026-11-07). Do not edit by hand.
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
/** PayPal decimals per currency (`value` is a decimal string). HUF, JPY and TWD take none. */
|
|
5
|
+
export const PAYPAL_EXPONENTS: Readonly<Record<string, number>> = {
|
|
6
|
+
AUD: 2,
|
|
7
|
+
BRL: 2,
|
|
8
|
+
CAD: 2,
|
|
9
|
+
CHF: 2,
|
|
10
|
+
CNY: 2,
|
|
11
|
+
CZK: 2,
|
|
12
|
+
DKK: 2,
|
|
13
|
+
EUR: 2,
|
|
14
|
+
GBP: 2,
|
|
15
|
+
HKD: 2,
|
|
16
|
+
HUF: 0,
|
|
17
|
+
ILS: 2,
|
|
18
|
+
JPY: 0,
|
|
19
|
+
MXN: 2,
|
|
20
|
+
MYR: 2,
|
|
21
|
+
NOK: 2,
|
|
22
|
+
NZD: 2,
|
|
23
|
+
PHP: 2,
|
|
24
|
+
PLN: 2,
|
|
25
|
+
RUB: 2,
|
|
26
|
+
SEK: 2,
|
|
27
|
+
SGD: 2,
|
|
28
|
+
THB: 2,
|
|
29
|
+
TWD: 0,
|
|
30
|
+
USD: 2,
|
|
31
|
+
};
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-currencies.mjs from data/stripe.json (https://docs.stripe.com/currencies, retrieved 2026-11-07). Do not edit by hand.
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Stripe presentment currencies: [API exponent, charge amount multiple, payout amount multiple].
|
|
6
|
+
* A multiple of 100 means "send a two-decimal value whose decimal part is always 00" (ISK, UGX)
|
|
7
|
+
* or, for payouts only, whole units (HUF, TWD). A multiple of 10 is the three-decimal rule
|
|
8
|
+
* (last digit must be 0).
|
|
9
|
+
*/
|
|
10
|
+
export const STRIPE_RULES: Readonly<Record<string, readonly [exponent: number, chargeMultiple: number, payoutMultiple: number]>> = {
|
|
11
|
+
AED: [2,1,1],
|
|
12
|
+
AFN: [2,1,1],
|
|
13
|
+
ALL: [2,1,1],
|
|
14
|
+
AMD: [2,1,1],
|
|
15
|
+
ANG: [2,1,1],
|
|
16
|
+
AOA: [2,1,1],
|
|
17
|
+
ARS: [2,1,1],
|
|
18
|
+
AUD: [2,1,1],
|
|
19
|
+
AWG: [2,1,1],
|
|
20
|
+
AZN: [2,1,1],
|
|
21
|
+
BAM: [2,1,1],
|
|
22
|
+
BBD: [2,1,1],
|
|
23
|
+
BDT: [2,1,1],
|
|
24
|
+
BHD: [3,10,10],
|
|
25
|
+
BIF: [0,1,1],
|
|
26
|
+
BMD: [2,1,1],
|
|
27
|
+
BND: [2,1,1],
|
|
28
|
+
BOB: [2,1,1],
|
|
29
|
+
BRL: [2,1,1],
|
|
30
|
+
BSD: [2,1,1],
|
|
31
|
+
BWP: [2,1,1],
|
|
32
|
+
BYN: [2,1,1],
|
|
33
|
+
BZD: [2,1,1],
|
|
34
|
+
CAD: [2,1,1],
|
|
35
|
+
CDF: [2,1,1],
|
|
36
|
+
CHF: [2,1,1],
|
|
37
|
+
CLP: [0,1,1],
|
|
38
|
+
CNY: [2,1,1],
|
|
39
|
+
COP: [2,1,1],
|
|
40
|
+
CRC: [2,1,1],
|
|
41
|
+
CVE: [2,1,1],
|
|
42
|
+
CZK: [2,1,1],
|
|
43
|
+
DJF: [0,1,1],
|
|
44
|
+
DKK: [2,1,1],
|
|
45
|
+
DOP: [2,1,1],
|
|
46
|
+
DZD: [2,1,1],
|
|
47
|
+
EGP: [2,1,1],
|
|
48
|
+
ETB: [2,1,1],
|
|
49
|
+
EUR: [2,1,1],
|
|
50
|
+
FJD: [2,1,1],
|
|
51
|
+
FKP: [2,1,1],
|
|
52
|
+
GBP: [2,1,1],
|
|
53
|
+
GEL: [2,1,1],
|
|
54
|
+
GIP: [2,1,1],
|
|
55
|
+
GMD: [2,1,1],
|
|
56
|
+
GNF: [0,1,1],
|
|
57
|
+
GTQ: [2,1,1],
|
|
58
|
+
GYD: [2,1,1],
|
|
59
|
+
HKD: [2,1,1],
|
|
60
|
+
HNL: [2,1,1],
|
|
61
|
+
HTG: [2,1,1],
|
|
62
|
+
HUF: [2,1,100],
|
|
63
|
+
IDR: [2,1,1],
|
|
64
|
+
ILS: [2,1,1],
|
|
65
|
+
INR: [2,1,1],
|
|
66
|
+
ISK: [2,100,100],
|
|
67
|
+
JMD: [2,1,1],
|
|
68
|
+
JOD: [3,10,10],
|
|
69
|
+
JPY: [0,1,1],
|
|
70
|
+
KES: [2,1,1],
|
|
71
|
+
KGS: [2,1,1],
|
|
72
|
+
KHR: [2,1,1],
|
|
73
|
+
KMF: [0,1,1],
|
|
74
|
+
KRW: [0,1,1],
|
|
75
|
+
KWD: [3,10,10],
|
|
76
|
+
KYD: [2,1,1],
|
|
77
|
+
KZT: [2,1,1],
|
|
78
|
+
LAK: [2,1,1],
|
|
79
|
+
LBP: [2,1,1],
|
|
80
|
+
LKR: [2,1,1],
|
|
81
|
+
LRD: [2,1,1],
|
|
82
|
+
LSL: [2,1,1],
|
|
83
|
+
MAD: [2,1,1],
|
|
84
|
+
MDL: [2,1,1],
|
|
85
|
+
MGA: [0,1,1],
|
|
86
|
+
MKD: [2,1,1],
|
|
87
|
+
MMK: [2,1,1],
|
|
88
|
+
MNT: [2,1,1],
|
|
89
|
+
MOP: [2,1,1],
|
|
90
|
+
MUR: [2,1,1],
|
|
91
|
+
MVR: [2,1,1],
|
|
92
|
+
MWK: [2,1,1],
|
|
93
|
+
MXN: [2,1,1],
|
|
94
|
+
MYR: [2,1,1],
|
|
95
|
+
MZN: [2,1,1],
|
|
96
|
+
NAD: [2,1,1],
|
|
97
|
+
NGN: [2,1,1],
|
|
98
|
+
NIO: [2,1,1],
|
|
99
|
+
NOK: [2,1,1],
|
|
100
|
+
NPR: [2,1,1],
|
|
101
|
+
NZD: [2,1,1],
|
|
102
|
+
OMR: [3,10,10],
|
|
103
|
+
PAB: [2,1,1],
|
|
104
|
+
PEN: [2,1,1],
|
|
105
|
+
PGK: [2,1,1],
|
|
106
|
+
PHP: [2,1,1],
|
|
107
|
+
PKR: [2,1,1],
|
|
108
|
+
PLN: [2,1,1],
|
|
109
|
+
PYG: [0,1,1],
|
|
110
|
+
QAR: [2,1,1],
|
|
111
|
+
RON: [2,1,1],
|
|
112
|
+
RSD: [2,1,1],
|
|
113
|
+
RUB: [2,1,1],
|
|
114
|
+
RWF: [0,1,1],
|
|
115
|
+
SAR: [2,1,1],
|
|
116
|
+
SBD: [2,1,1],
|
|
117
|
+
SCR: [2,1,1],
|
|
118
|
+
SEK: [2,1,1],
|
|
119
|
+
SGD: [2,1,1],
|
|
120
|
+
SHP: [2,1,1],
|
|
121
|
+
SLE: [2,1,1],
|
|
122
|
+
SOS: [2,1,1],
|
|
123
|
+
SRD: [2,1,1],
|
|
124
|
+
STD: [2,1,1],
|
|
125
|
+
SZL: [2,1,1],
|
|
126
|
+
THB: [2,1,1],
|
|
127
|
+
TJS: [2,1,1],
|
|
128
|
+
TND: [3,10,10],
|
|
129
|
+
TOP: [2,1,1],
|
|
130
|
+
TRY: [2,1,1],
|
|
131
|
+
TTD: [2,1,1],
|
|
132
|
+
TWD: [2,1,100],
|
|
133
|
+
TZS: [2,1,1],
|
|
134
|
+
UAH: [2,1,1],
|
|
135
|
+
UGX: [2,100,100],
|
|
136
|
+
USD: [2,1,1],
|
|
137
|
+
UYU: [2,1,1],
|
|
138
|
+
UZS: [2,1,1],
|
|
139
|
+
VND: [0,1,1],
|
|
140
|
+
VUV: [0,1,1],
|
|
141
|
+
WST: [2,1,1],
|
|
142
|
+
XAF: [0,1,1],
|
|
143
|
+
XCD: [2,1,1],
|
|
144
|
+
XCG: [2,1,1],
|
|
145
|
+
XOF: [0,1,1],
|
|
146
|
+
XPF: [0,1,1],
|
|
147
|
+
YER: [2,1,1],
|
|
148
|
+
ZAR: [2,1,1],
|
|
149
|
+
ZMW: [2,1,1],
|
|
150
|
+
};
|
package/src/historic.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
|
|
13
|
+
export { ISO_4217_LIST_THREE_PUBLISHED };
|
|
14
|
+
|
|
15
|
+
/** A code in the historic table. */
|
|
16
|
+
export type HistoricCurrencyCode = keyof typeof HISTORIC_CURRENCY_TABLE;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Every historic code, for the `CurrencyCode` type:
|
|
20
|
+
*
|
|
21
|
+
* declare module '@ducatjs/money' {
|
|
22
|
+
* interface CustomCurrencies extends HistoricCurrencies {}
|
|
23
|
+
* }
|
|
24
|
+
*/
|
|
25
|
+
export type HistoricCurrencies = { readonly [Code in HistoricCurrencyCode]: true };
|
|
26
|
+
|
|
27
|
+
/** One entry of the historic table. */
|
|
28
|
+
export interface HistoricCurrency {
|
|
29
|
+
readonly code: HistoricCurrencyCode;
|
|
30
|
+
/** The name ISO 4217 List Three gives it (for non-ISO codes, a descriptive name). */
|
|
31
|
+
readonly name: string;
|
|
32
|
+
/** Its minor-unit exponent while it was current: what stored minor units of it mean. */
|
|
33
|
+
readonly exponent: number;
|
|
34
|
+
/** The ISO 4217 numeric code; absent for codes that were never ISO (CNH). */
|
|
35
|
+
readonly numeric?: string;
|
|
36
|
+
/**
|
|
37
|
+
* The year and month ISO 4217 withdrew it ('2023-01'), from List Three. A code withdrawn
|
|
38
|
+
* country by country has the last date. Absent for codes that were never ISO.
|
|
39
|
+
*/
|
|
40
|
+
readonly withdrawn?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const table: Readonly<Record<string, Omit<HistoricCurrency, 'code'>>> = HISTORIC_CURRENCY_TABLE;
|
|
44
|
+
|
|
45
|
+
/** The table entry for a code, or undefined for a code that isn't in it. */
|
|
46
|
+
export function historicCurrency(code: string): HistoricCurrency | undefined {
|
|
47
|
+
// own properties only, so 'toString' and friends are not currencies
|
|
48
|
+
if (!Object.hasOwn(table, code)) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return { code: code as HistoricCurrencyCode, ...table[code]! };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Every entry of the table, by code. */
|
|
55
|
+
export function historicCurrencies(): HistoricCurrency[] {
|
|
56
|
+
return Object.keys(table).map((code) => historicCurrency(code)!);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Registers historic codes with `defineCurrency`, so Money can hold them: all of them, or only
|
|
61
|
+
* `codes`. Registering one again is harmless; a code already defined with another exponent throws,
|
|
62
|
+
* as `defineCurrency` does.
|
|
63
|
+
*/
|
|
64
|
+
export function defineHistoricCurrencies(codes?: readonly HistoricCurrencyCode[]): void {
|
|
65
|
+
const selected: readonly string[] = codes ?? Object.keys(table);
|
|
66
|
+
|
|
67
|
+
// check every code first, so a typo registers nothing
|
|
68
|
+
for (const code of selected) {
|
|
69
|
+
if (!Object.hasOwn(table, code)) {
|
|
70
|
+
throw new RangeError(`${code} is not in the historic currency table`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
for (const code of selected) {
|
|
75
|
+
defineCurrency(code, table[code]!.exponent);
|
|
76
|
+
}
|
|
77
|
+
}
|