@ducatjs/money 0.2.1 → 0.3.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/NOTICE +47 -11
- package/README.md +346 -44
- package/data/cldr-territories.json +2791 -0
- package/data/crypto-units.json +68 -0
- package/data/rbnf/de.txt +243 -0
- package/data/rbnf/en.txt +166 -0
- package/data/rbnf/es.txt +261 -0
- package/data/rbnf/fr.txt +159 -0
- package/data/rbnf/it.txt +502 -0
- package/data/rbnf/nl.txt +103 -0
- package/data/rbnf/pt.txt +171 -0
- package/dist/adyen-fx.js +1 -1
- package/dist/adyen-fx.js.map +1 -1
- package/dist/allocate.d.ts.map +1 -1
- package/dist/allocate.js +2 -3
- package/dist/allocate.js.map +1 -1
- package/dist/cash.d.ts +15 -0
- package/dist/cash.d.ts.map +1 -1
- package/dist/cash.js +17 -0
- package/dist/cash.js.map +1 -1
- package/dist/convert.d.ts.map +1 -1
- package/dist/convert.js +2 -3
- package/dist/convert.js.map +1 -1
- package/dist/crypto.d.ts +54 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +89 -0
- package/dist/crypto.js.map +1 -0
- package/dist/currencies.d.ts +43 -0
- package/dist/currencies.d.ts.map +1 -0
- package/dist/currencies.js +91 -0
- package/dist/currencies.js.map +1 -0
- package/dist/currency.d.ts +9 -1
- package/dist/currency.d.ts.map +1 -1
- package/dist/currency.js +41 -14
- package/dist/currency.js.map +1 -1
- package/dist/decimal.d.ts +25 -3
- package/dist/decimal.d.ts.map +1 -1
- package/dist/decimal.js +78 -8
- package/dist/decimal.js.map +1 -1
- package/dist/ecb.d.ts +23 -8
- package/dist/ecb.d.ts.map +1 -1
- package/dist/ecb.js +46 -15
- package/dist/ecb.js.map +1 -1
- package/dist/entries/adyen-fx.d.ts +3 -0
- package/dist/entries/adyen-fx.d.ts.map +1 -0
- package/dist/entries/adyen-fx.js +5 -0
- package/dist/entries/adyen-fx.js.map +1 -0
- package/dist/entries/boc.d.ts +3 -0
- package/dist/entries/boc.d.ts.map +1 -0
- package/dist/entries/boc.js +5 -0
- package/dist/entries/boc.js.map +1 -0
- package/dist/entries/boe.d.ts +3 -0
- package/dist/entries/boe.d.ts.map +1 -0
- package/dist/entries/boe.js +5 -0
- package/dist/entries/boe.js.map +1 -0
- package/dist/entries/crypto.d.ts +3 -0
- package/dist/entries/crypto.d.ts.map +1 -0
- package/dist/entries/crypto.js +5 -0
- package/dist/entries/crypto.js.map +1 -0
- package/dist/entries/currencies.d.ts +3 -0
- package/dist/entries/currencies.d.ts.map +1 -0
- package/dist/entries/currencies.js +5 -0
- package/dist/entries/currencies.js.map +1 -0
- package/dist/entries/drizzle-mysql.d.ts +3 -0
- package/dist/entries/drizzle-mysql.d.ts.map +1 -0
- package/dist/entries/drizzle-mysql.js +5 -0
- package/dist/entries/drizzle-mysql.js.map +1 -0
- package/dist/entries/drizzle-pg.d.ts +3 -0
- package/dist/entries/drizzle-pg.d.ts.map +1 -0
- package/dist/entries/drizzle-pg.js +5 -0
- package/dist/entries/drizzle-pg.js.map +1 -0
- package/dist/entries/drizzle-sqlite.d.ts +3 -0
- package/dist/entries/drizzle-sqlite.d.ts.map +1 -0
- package/dist/entries/drizzle-sqlite.js +5 -0
- package/dist/entries/drizzle-sqlite.js.map +1 -0
- package/dist/entries/ecb.d.ts +3 -0
- package/dist/entries/ecb.d.ts.map +1 -0
- package/dist/entries/ecb.js +5 -0
- package/dist/entries/ecb.js.map +1 -0
- package/dist/entries/fed.d.ts +3 -0
- package/dist/entries/fed.d.ts.map +1 -0
- package/dist/entries/fed.js +5 -0
- package/dist/entries/fed.js.map +1 -0
- package/dist/entries/fetch.d.ts +3 -0
- package/dist/entries/fetch.d.ts.map +1 -0
- package/dist/entries/fetch.js +5 -0
- package/dist/entries/fetch.js.map +1 -0
- package/dist/entries/finance.d.ts +3 -0
- package/dist/entries/finance.d.ts.map +1 -0
- package/dist/entries/finance.js +5 -0
- package/dist/entries/finance.js.map +1 -0
- package/dist/entries/historic.d.ts +3 -0
- package/dist/entries/historic.d.ts.map +1 -0
- package/dist/entries/historic.js +5 -0
- package/dist/entries/historic.js.map +1 -0
- package/dist/entries/history.d.ts +3 -0
- package/dist/entries/history.d.ts.map +1 -0
- package/dist/entries/history.js +5 -0
- package/dist/entries/history.js.map +1 -0
- package/dist/entries/hmrc.d.ts +3 -0
- package/dist/entries/hmrc.d.ts.map +1 -0
- package/dist/entries/hmrc.js +5 -0
- package/dist/entries/hmrc.js.map +1 -0
- package/dist/entries/kysely.d.ts +3 -0
- package/dist/entries/kysely.d.ts.map +1 -0
- package/dist/entries/kysely.js +5 -0
- package/dist/entries/kysely.js.map +1 -0
- package/dist/entries/parse.d.ts +3 -0
- package/dist/entries/parse.d.ts.map +1 -0
- package/dist/entries/parse.js +5 -0
- package/dist/entries/parse.js.map +1 -0
- package/dist/entries/pg.d.ts +3 -0
- package/dist/entries/pg.d.ts.map +1 -0
- package/dist/entries/pg.js +5 -0
- package/dist/entries/pg.js.map +1 -0
- package/dist/entries/policy.d.ts +3 -0
- package/dist/entries/policy.d.ts.map +1 -0
- package/dist/entries/policy.js +5 -0
- package/dist/entries/policy.js.map +1 -0
- package/dist/entries/pricing.d.ts +3 -0
- package/dist/entries/pricing.d.ts.map +1 -0
- package/dist/entries/pricing.js +5 -0
- package/dist/entries/pricing.js.map +1 -0
- package/dist/entries/stripe-fx.d.ts +3 -0
- package/dist/entries/stripe-fx.d.ts.map +1 -0
- package/dist/entries/stripe-fx.js +5 -0
- package/dist/entries/stripe-fx.js.map +1 -0
- package/dist/entries/testing-arbitraries.d.ts +3 -0
- package/dist/entries/testing-arbitraries.d.ts.map +1 -0
- package/dist/entries/testing-arbitraries.js +5 -0
- package/dist/entries/testing-arbitraries.js.map +1 -0
- package/dist/entries/testing-index.d.ts +3 -0
- package/dist/entries/testing-index.d.ts.map +1 -0
- package/dist/entries/testing-index.js +5 -0
- package/dist/entries/testing-index.js.map +1 -0
- package/dist/entries/testing-jest.d.ts +3 -0
- package/dist/entries/testing-jest.d.ts.map +1 -0
- package/dist/entries/testing-jest.js +5 -0
- package/dist/entries/testing-jest.js.map +1 -0
- package/dist/entries/testing-vitest.d.ts +3 -0
- package/dist/entries/testing-vitest.d.ts.map +1 -0
- package/dist/entries/testing-vitest.js +5 -0
- package/dist/entries/testing-vitest.js.map +1 -0
- package/dist/entries/valibot.d.ts +3 -0
- package/dist/entries/valibot.d.ts.map +1 -0
- package/dist/entries/valibot.js +5 -0
- package/dist/entries/valibot.js.map +1 -0
- package/dist/entries/wire.d.ts +3 -0
- package/dist/entries/wire.d.ts.map +1 -0
- package/dist/entries/wire.js +5 -0
- package/dist/entries/wire.js.map +1 -0
- package/dist/entries/zod.d.ts +3 -0
- package/dist/entries/zod.d.ts.map +1 -0
- package/dist/entries/zod.js +5 -0
- package/dist/entries/zod.js.map +1 -0
- package/dist/exact.d.ts.map +1 -1
- package/dist/exact.js +3 -3
- package/dist/exact.js.map +1 -1
- package/dist/fetch.d.ts +7 -1
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +11 -2
- package/dist/fetch.js.map +1 -1
- package/dist/finance.d.ts +296 -0
- package/dist/finance.d.ts.map +1 -0
- package/dist/finance.js +825 -0
- package/dist/finance.js.map +1 -0
- package/dist/fixed-money.d.ts +12 -0
- package/dist/fixed-money.d.ts.map +1 -0
- package/dist/fixed-money.js +32 -0
- package/dist/fixed-money.js.map +1 -0
- package/dist/fixed.d.ts +26 -9
- package/dist/fixed.d.ts.map +1 -1
- package/dist/fixed.js +75 -49
- package/dist/fixed.js.map +1 -1
- package/dist/fn.d.ts +17 -1
- package/dist/fn.d.ts.map +1 -1
- package/dist/fn.js +17 -1
- package/dist/fn.js.map +1 -1
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +28 -9
- package/dist/format.js.map +1 -1
- package/dist/generated/crypto.d.ts +58 -0
- package/dist/generated/crypto.d.ts.map +1 -0
- package/dist/generated/crypto.js +15 -0
- package/dist/generated/crypto.js.map +1 -0
- package/dist/generated/iso/AED.d.ts +2 -0
- package/dist/generated/iso/AED.d.ts.map +1 -0
- package/dist/generated/iso/AED.js +5 -0
- package/dist/generated/iso/AED.js.map +1 -0
- package/dist/generated/iso/AFN.d.ts +2 -0
- package/dist/generated/iso/AFN.d.ts.map +1 -0
- package/dist/generated/iso/AFN.js +5 -0
- package/dist/generated/iso/AFN.js.map +1 -0
- package/dist/generated/iso/ALL.d.ts +2 -0
- package/dist/generated/iso/ALL.d.ts.map +1 -0
- package/dist/generated/iso/ALL.js +5 -0
- package/dist/generated/iso/ALL.js.map +1 -0
- package/dist/generated/iso/AMD.d.ts +2 -0
- package/dist/generated/iso/AMD.d.ts.map +1 -0
- package/dist/generated/iso/AMD.js +5 -0
- package/dist/generated/iso/AMD.js.map +1 -0
- package/dist/generated/iso/AOA.d.ts +2 -0
- package/dist/generated/iso/AOA.d.ts.map +1 -0
- package/dist/generated/iso/AOA.js +5 -0
- package/dist/generated/iso/AOA.js.map +1 -0
- package/dist/generated/iso/ARS.d.ts +2 -0
- package/dist/generated/iso/ARS.d.ts.map +1 -0
- package/dist/generated/iso/ARS.js +5 -0
- package/dist/generated/iso/ARS.js.map +1 -0
- package/dist/generated/iso/AUD.d.ts +2 -0
- package/dist/generated/iso/AUD.d.ts.map +1 -0
- package/dist/generated/iso/AUD.js +5 -0
- package/dist/generated/iso/AUD.js.map +1 -0
- package/dist/generated/iso/AWG.d.ts +2 -0
- package/dist/generated/iso/AWG.d.ts.map +1 -0
- package/dist/generated/iso/AWG.js +5 -0
- package/dist/generated/iso/AWG.js.map +1 -0
- package/dist/generated/iso/AZN.d.ts +2 -0
- package/dist/generated/iso/AZN.d.ts.map +1 -0
- package/dist/generated/iso/AZN.js +5 -0
- package/dist/generated/iso/AZN.js.map +1 -0
- package/dist/generated/iso/BAM.d.ts +2 -0
- package/dist/generated/iso/BAM.d.ts.map +1 -0
- package/dist/generated/iso/BAM.js +5 -0
- package/dist/generated/iso/BAM.js.map +1 -0
- package/dist/generated/iso/BBD.d.ts +2 -0
- package/dist/generated/iso/BBD.d.ts.map +1 -0
- package/dist/generated/iso/BBD.js +5 -0
- package/dist/generated/iso/BBD.js.map +1 -0
- package/dist/generated/iso/BDT.d.ts +2 -0
- package/dist/generated/iso/BDT.d.ts.map +1 -0
- package/dist/generated/iso/BDT.js +5 -0
- package/dist/generated/iso/BDT.js.map +1 -0
- package/dist/generated/iso/BHD.d.ts +2 -0
- package/dist/generated/iso/BHD.d.ts.map +1 -0
- package/dist/generated/iso/BHD.js +5 -0
- package/dist/generated/iso/BHD.js.map +1 -0
- package/dist/generated/iso/BIF.d.ts +2 -0
- package/dist/generated/iso/BIF.d.ts.map +1 -0
- package/dist/generated/iso/BIF.js +5 -0
- package/dist/generated/iso/BIF.js.map +1 -0
- package/dist/generated/iso/BMD.d.ts +2 -0
- package/dist/generated/iso/BMD.d.ts.map +1 -0
- package/dist/generated/iso/BMD.js +5 -0
- package/dist/generated/iso/BMD.js.map +1 -0
- package/dist/generated/iso/BND.d.ts +2 -0
- package/dist/generated/iso/BND.d.ts.map +1 -0
- package/dist/generated/iso/BND.js +5 -0
- package/dist/generated/iso/BND.js.map +1 -0
- package/dist/generated/iso/BOB.d.ts +2 -0
- package/dist/generated/iso/BOB.d.ts.map +1 -0
- package/dist/generated/iso/BOB.js +5 -0
- package/dist/generated/iso/BOB.js.map +1 -0
- package/dist/generated/iso/BOV.d.ts +2 -0
- package/dist/generated/iso/BOV.d.ts.map +1 -0
- package/dist/generated/iso/BOV.js +5 -0
- package/dist/generated/iso/BOV.js.map +1 -0
- package/dist/generated/iso/BRL.d.ts +2 -0
- package/dist/generated/iso/BRL.d.ts.map +1 -0
- package/dist/generated/iso/BRL.js +5 -0
- package/dist/generated/iso/BRL.js.map +1 -0
- package/dist/generated/iso/BSD.d.ts +2 -0
- package/dist/generated/iso/BSD.d.ts.map +1 -0
- package/dist/generated/iso/BSD.js +5 -0
- package/dist/generated/iso/BSD.js.map +1 -0
- package/dist/generated/iso/BTN.d.ts +2 -0
- package/dist/generated/iso/BTN.d.ts.map +1 -0
- package/dist/generated/iso/BTN.js +5 -0
- package/dist/generated/iso/BTN.js.map +1 -0
- package/dist/generated/iso/BWP.d.ts +2 -0
- package/dist/generated/iso/BWP.d.ts.map +1 -0
- package/dist/generated/iso/BWP.js +5 -0
- package/dist/generated/iso/BWP.js.map +1 -0
- package/dist/generated/iso/BYN.d.ts +2 -0
- package/dist/generated/iso/BYN.d.ts.map +1 -0
- package/dist/generated/iso/BYN.js +5 -0
- package/dist/generated/iso/BYN.js.map +1 -0
- package/dist/generated/iso/BZD.d.ts +2 -0
- package/dist/generated/iso/BZD.d.ts.map +1 -0
- package/dist/generated/iso/BZD.js +5 -0
- package/dist/generated/iso/BZD.js.map +1 -0
- package/dist/generated/iso/CAD.d.ts +2 -0
- package/dist/generated/iso/CAD.d.ts.map +1 -0
- package/dist/generated/iso/CAD.js +5 -0
- package/dist/generated/iso/CAD.js.map +1 -0
- package/dist/generated/iso/CDF.d.ts +2 -0
- package/dist/generated/iso/CDF.d.ts.map +1 -0
- package/dist/generated/iso/CDF.js +5 -0
- package/dist/generated/iso/CDF.js.map +1 -0
- package/dist/generated/iso/CHE.d.ts +2 -0
- package/dist/generated/iso/CHE.d.ts.map +1 -0
- package/dist/generated/iso/CHE.js +5 -0
- package/dist/generated/iso/CHE.js.map +1 -0
- package/dist/generated/iso/CHF.d.ts +2 -0
- package/dist/generated/iso/CHF.d.ts.map +1 -0
- package/dist/generated/iso/CHF.js +5 -0
- package/dist/generated/iso/CHF.js.map +1 -0
- package/dist/generated/iso/CHW.d.ts +2 -0
- package/dist/generated/iso/CHW.d.ts.map +1 -0
- package/dist/generated/iso/CHW.js +5 -0
- package/dist/generated/iso/CHW.js.map +1 -0
- package/dist/generated/iso/CLF.d.ts +2 -0
- package/dist/generated/iso/CLF.d.ts.map +1 -0
- package/dist/generated/iso/CLF.js +5 -0
- package/dist/generated/iso/CLF.js.map +1 -0
- package/dist/generated/iso/CLP.d.ts +2 -0
- package/dist/generated/iso/CLP.d.ts.map +1 -0
- package/dist/generated/iso/CLP.js +5 -0
- package/dist/generated/iso/CLP.js.map +1 -0
- package/dist/generated/iso/CNY.d.ts +2 -0
- package/dist/generated/iso/CNY.d.ts.map +1 -0
- package/dist/generated/iso/CNY.js +5 -0
- package/dist/generated/iso/CNY.js.map +1 -0
- package/dist/generated/iso/COP.d.ts +2 -0
- package/dist/generated/iso/COP.d.ts.map +1 -0
- package/dist/generated/iso/COP.js +5 -0
- package/dist/generated/iso/COP.js.map +1 -0
- package/dist/generated/iso/COU.d.ts +2 -0
- package/dist/generated/iso/COU.d.ts.map +1 -0
- package/dist/generated/iso/COU.js +5 -0
- package/dist/generated/iso/COU.js.map +1 -0
- package/dist/generated/iso/CRC.d.ts +2 -0
- package/dist/generated/iso/CRC.d.ts.map +1 -0
- package/dist/generated/iso/CRC.js +5 -0
- package/dist/generated/iso/CRC.js.map +1 -0
- package/dist/generated/iso/CUP.d.ts +2 -0
- package/dist/generated/iso/CUP.d.ts.map +1 -0
- package/dist/generated/iso/CUP.js +5 -0
- package/dist/generated/iso/CUP.js.map +1 -0
- package/dist/generated/iso/CVE.d.ts +2 -0
- package/dist/generated/iso/CVE.d.ts.map +1 -0
- package/dist/generated/iso/CVE.js +5 -0
- package/dist/generated/iso/CVE.js.map +1 -0
- package/dist/generated/iso/CZK.d.ts +2 -0
- package/dist/generated/iso/CZK.d.ts.map +1 -0
- package/dist/generated/iso/CZK.js +5 -0
- package/dist/generated/iso/CZK.js.map +1 -0
- package/dist/generated/iso/DJF.d.ts +2 -0
- package/dist/generated/iso/DJF.d.ts.map +1 -0
- package/dist/generated/iso/DJF.js +5 -0
- package/dist/generated/iso/DJF.js.map +1 -0
- package/dist/generated/iso/DKK.d.ts +2 -0
- package/dist/generated/iso/DKK.d.ts.map +1 -0
- package/dist/generated/iso/DKK.js +5 -0
- package/dist/generated/iso/DKK.js.map +1 -0
- package/dist/generated/iso/DOP.d.ts +2 -0
- package/dist/generated/iso/DOP.d.ts.map +1 -0
- package/dist/generated/iso/DOP.js +5 -0
- package/dist/generated/iso/DOP.js.map +1 -0
- package/dist/generated/iso/DZD.d.ts +2 -0
- package/dist/generated/iso/DZD.d.ts.map +1 -0
- package/dist/generated/iso/DZD.js +5 -0
- package/dist/generated/iso/DZD.js.map +1 -0
- package/dist/generated/iso/EGP.d.ts +2 -0
- package/dist/generated/iso/EGP.d.ts.map +1 -0
- package/dist/generated/iso/EGP.js +5 -0
- package/dist/generated/iso/EGP.js.map +1 -0
- package/dist/generated/iso/ERN.d.ts +2 -0
- package/dist/generated/iso/ERN.d.ts.map +1 -0
- package/dist/generated/iso/ERN.js +5 -0
- package/dist/generated/iso/ERN.js.map +1 -0
- package/dist/generated/iso/ETB.d.ts +2 -0
- package/dist/generated/iso/ETB.d.ts.map +1 -0
- package/dist/generated/iso/ETB.js +5 -0
- package/dist/generated/iso/ETB.js.map +1 -0
- package/dist/generated/iso/EUR.d.ts +2 -0
- package/dist/generated/iso/EUR.d.ts.map +1 -0
- package/dist/generated/iso/EUR.js +5 -0
- package/dist/generated/iso/EUR.js.map +1 -0
- package/dist/generated/iso/FJD.d.ts +2 -0
- package/dist/generated/iso/FJD.d.ts.map +1 -0
- package/dist/generated/iso/FJD.js +5 -0
- package/dist/generated/iso/FJD.js.map +1 -0
- package/dist/generated/iso/FKP.d.ts +2 -0
- package/dist/generated/iso/FKP.d.ts.map +1 -0
- package/dist/generated/iso/FKP.js +5 -0
- package/dist/generated/iso/FKP.js.map +1 -0
- package/dist/generated/iso/GBP.d.ts +2 -0
- package/dist/generated/iso/GBP.d.ts.map +1 -0
- package/dist/generated/iso/GBP.js +5 -0
- package/dist/generated/iso/GBP.js.map +1 -0
- package/dist/generated/iso/GEL.d.ts +2 -0
- package/dist/generated/iso/GEL.d.ts.map +1 -0
- package/dist/generated/iso/GEL.js +5 -0
- package/dist/generated/iso/GEL.js.map +1 -0
- package/dist/generated/iso/GHS.d.ts +2 -0
- package/dist/generated/iso/GHS.d.ts.map +1 -0
- package/dist/generated/iso/GHS.js +5 -0
- package/dist/generated/iso/GHS.js.map +1 -0
- package/dist/generated/iso/GIP.d.ts +2 -0
- package/dist/generated/iso/GIP.d.ts.map +1 -0
- package/dist/generated/iso/GIP.js +5 -0
- package/dist/generated/iso/GIP.js.map +1 -0
- package/dist/generated/iso/GMD.d.ts +2 -0
- package/dist/generated/iso/GMD.d.ts.map +1 -0
- package/dist/generated/iso/GMD.js +5 -0
- package/dist/generated/iso/GMD.js.map +1 -0
- package/dist/generated/iso/GNF.d.ts +2 -0
- package/dist/generated/iso/GNF.d.ts.map +1 -0
- package/dist/generated/iso/GNF.js +5 -0
- package/dist/generated/iso/GNF.js.map +1 -0
- package/dist/generated/iso/GTQ.d.ts +2 -0
- package/dist/generated/iso/GTQ.d.ts.map +1 -0
- package/dist/generated/iso/GTQ.js +5 -0
- package/dist/generated/iso/GTQ.js.map +1 -0
- package/dist/generated/iso/GYD.d.ts +2 -0
- package/dist/generated/iso/GYD.d.ts.map +1 -0
- package/dist/generated/iso/GYD.js +5 -0
- package/dist/generated/iso/GYD.js.map +1 -0
- package/dist/generated/iso/HKD.d.ts +2 -0
- package/dist/generated/iso/HKD.d.ts.map +1 -0
- package/dist/generated/iso/HKD.js +5 -0
- package/dist/generated/iso/HKD.js.map +1 -0
- package/dist/generated/iso/HNL.d.ts +2 -0
- package/dist/generated/iso/HNL.d.ts.map +1 -0
- package/dist/generated/iso/HNL.js +5 -0
- package/dist/generated/iso/HNL.js.map +1 -0
- package/dist/generated/iso/HTG.d.ts +2 -0
- package/dist/generated/iso/HTG.d.ts.map +1 -0
- package/dist/generated/iso/HTG.js +5 -0
- package/dist/generated/iso/HTG.js.map +1 -0
- package/dist/generated/iso/HUF.d.ts +2 -0
- package/dist/generated/iso/HUF.d.ts.map +1 -0
- package/dist/generated/iso/HUF.js +5 -0
- package/dist/generated/iso/HUF.js.map +1 -0
- package/dist/generated/iso/IDR.d.ts +2 -0
- package/dist/generated/iso/IDR.d.ts.map +1 -0
- package/dist/generated/iso/IDR.js +5 -0
- package/dist/generated/iso/IDR.js.map +1 -0
- package/dist/generated/iso/ILS.d.ts +2 -0
- package/dist/generated/iso/ILS.d.ts.map +1 -0
- package/dist/generated/iso/ILS.js +5 -0
- package/dist/generated/iso/ILS.js.map +1 -0
- package/dist/generated/iso/INR.d.ts +2 -0
- package/dist/generated/iso/INR.d.ts.map +1 -0
- package/dist/generated/iso/INR.js +5 -0
- package/dist/generated/iso/INR.js.map +1 -0
- package/dist/generated/iso/IQD.d.ts +2 -0
- package/dist/generated/iso/IQD.d.ts.map +1 -0
- package/dist/generated/iso/IQD.js +5 -0
- package/dist/generated/iso/IQD.js.map +1 -0
- package/dist/generated/iso/IRR.d.ts +2 -0
- package/dist/generated/iso/IRR.d.ts.map +1 -0
- package/dist/generated/iso/IRR.js +5 -0
- package/dist/generated/iso/IRR.js.map +1 -0
- package/dist/generated/iso/ISK.d.ts +2 -0
- package/dist/generated/iso/ISK.d.ts.map +1 -0
- package/dist/generated/iso/ISK.js +5 -0
- package/dist/generated/iso/ISK.js.map +1 -0
- package/dist/generated/iso/JMD.d.ts +2 -0
- package/dist/generated/iso/JMD.d.ts.map +1 -0
- package/dist/generated/iso/JMD.js +5 -0
- package/dist/generated/iso/JMD.js.map +1 -0
- package/dist/generated/iso/JOD.d.ts +2 -0
- package/dist/generated/iso/JOD.d.ts.map +1 -0
- package/dist/generated/iso/JOD.js +5 -0
- package/dist/generated/iso/JOD.js.map +1 -0
- package/dist/generated/iso/JPY.d.ts +2 -0
- package/dist/generated/iso/JPY.d.ts.map +1 -0
- package/dist/generated/iso/JPY.js +5 -0
- package/dist/generated/iso/JPY.js.map +1 -0
- package/dist/generated/iso/KES.d.ts +2 -0
- package/dist/generated/iso/KES.d.ts.map +1 -0
- package/dist/generated/iso/KES.js +5 -0
- package/dist/generated/iso/KES.js.map +1 -0
- package/dist/generated/iso/KGS.d.ts +2 -0
- package/dist/generated/iso/KGS.d.ts.map +1 -0
- package/dist/generated/iso/KGS.js +5 -0
- package/dist/generated/iso/KGS.js.map +1 -0
- package/dist/generated/iso/KHR.d.ts +2 -0
- package/dist/generated/iso/KHR.d.ts.map +1 -0
- package/dist/generated/iso/KHR.js +5 -0
- package/dist/generated/iso/KHR.js.map +1 -0
- package/dist/generated/iso/KMF.d.ts +2 -0
- package/dist/generated/iso/KMF.d.ts.map +1 -0
- package/dist/generated/iso/KMF.js +5 -0
- package/dist/generated/iso/KMF.js.map +1 -0
- package/dist/generated/iso/KPW.d.ts +2 -0
- package/dist/generated/iso/KPW.d.ts.map +1 -0
- package/dist/generated/iso/KPW.js +5 -0
- package/dist/generated/iso/KPW.js.map +1 -0
- package/dist/generated/iso/KRW.d.ts +2 -0
- package/dist/generated/iso/KRW.d.ts.map +1 -0
- package/dist/generated/iso/KRW.js +5 -0
- package/dist/generated/iso/KRW.js.map +1 -0
- package/dist/generated/iso/KWD.d.ts +2 -0
- package/dist/generated/iso/KWD.d.ts.map +1 -0
- package/dist/generated/iso/KWD.js +5 -0
- package/dist/generated/iso/KWD.js.map +1 -0
- package/dist/generated/iso/KYD.d.ts +2 -0
- package/dist/generated/iso/KYD.d.ts.map +1 -0
- package/dist/generated/iso/KYD.js +5 -0
- package/dist/generated/iso/KYD.js.map +1 -0
- package/dist/generated/iso/KZT.d.ts +2 -0
- package/dist/generated/iso/KZT.d.ts.map +1 -0
- package/dist/generated/iso/KZT.js +5 -0
- package/dist/generated/iso/KZT.js.map +1 -0
- package/dist/generated/iso/LAK.d.ts +2 -0
- package/dist/generated/iso/LAK.d.ts.map +1 -0
- package/dist/generated/iso/LAK.js +5 -0
- package/dist/generated/iso/LAK.js.map +1 -0
- package/dist/generated/iso/LBP.d.ts +2 -0
- package/dist/generated/iso/LBP.d.ts.map +1 -0
- package/dist/generated/iso/LBP.js +5 -0
- package/dist/generated/iso/LBP.js.map +1 -0
- package/dist/generated/iso/LKR.d.ts +2 -0
- package/dist/generated/iso/LKR.d.ts.map +1 -0
- package/dist/generated/iso/LKR.js +5 -0
- package/dist/generated/iso/LKR.js.map +1 -0
- package/dist/generated/iso/LRD.d.ts +2 -0
- package/dist/generated/iso/LRD.d.ts.map +1 -0
- package/dist/generated/iso/LRD.js +5 -0
- package/dist/generated/iso/LRD.js.map +1 -0
- package/dist/generated/iso/LSL.d.ts +2 -0
- package/dist/generated/iso/LSL.d.ts.map +1 -0
- package/dist/generated/iso/LSL.js +5 -0
- package/dist/generated/iso/LSL.js.map +1 -0
- package/dist/generated/iso/LYD.d.ts +2 -0
- package/dist/generated/iso/LYD.d.ts.map +1 -0
- package/dist/generated/iso/LYD.js +5 -0
- package/dist/generated/iso/LYD.js.map +1 -0
- package/dist/generated/iso/MAD.d.ts +2 -0
- package/dist/generated/iso/MAD.d.ts.map +1 -0
- package/dist/generated/iso/MAD.js +5 -0
- package/dist/generated/iso/MAD.js.map +1 -0
- package/dist/generated/iso/MDL.d.ts +2 -0
- package/dist/generated/iso/MDL.d.ts.map +1 -0
- package/dist/generated/iso/MDL.js +5 -0
- package/dist/generated/iso/MDL.js.map +1 -0
- package/dist/generated/iso/MGA.d.ts +2 -0
- package/dist/generated/iso/MGA.d.ts.map +1 -0
- package/dist/generated/iso/MGA.js +5 -0
- package/dist/generated/iso/MGA.js.map +1 -0
- package/dist/generated/iso/MKD.d.ts +2 -0
- package/dist/generated/iso/MKD.d.ts.map +1 -0
- package/dist/generated/iso/MKD.js +5 -0
- package/dist/generated/iso/MKD.js.map +1 -0
- package/dist/generated/iso/MMK.d.ts +2 -0
- package/dist/generated/iso/MMK.d.ts.map +1 -0
- package/dist/generated/iso/MMK.js +5 -0
- package/dist/generated/iso/MMK.js.map +1 -0
- package/dist/generated/iso/MNT.d.ts +2 -0
- package/dist/generated/iso/MNT.d.ts.map +1 -0
- package/dist/generated/iso/MNT.js +5 -0
- package/dist/generated/iso/MNT.js.map +1 -0
- package/dist/generated/iso/MOP.d.ts +2 -0
- package/dist/generated/iso/MOP.d.ts.map +1 -0
- package/dist/generated/iso/MOP.js +5 -0
- package/dist/generated/iso/MOP.js.map +1 -0
- package/dist/generated/iso/MRU.d.ts +2 -0
- package/dist/generated/iso/MRU.d.ts.map +1 -0
- package/dist/generated/iso/MRU.js +5 -0
- package/dist/generated/iso/MRU.js.map +1 -0
- package/dist/generated/iso/MUR.d.ts +2 -0
- package/dist/generated/iso/MUR.d.ts.map +1 -0
- package/dist/generated/iso/MUR.js +5 -0
- package/dist/generated/iso/MUR.js.map +1 -0
- package/dist/generated/iso/MVR.d.ts +2 -0
- package/dist/generated/iso/MVR.d.ts.map +1 -0
- package/dist/generated/iso/MVR.js +5 -0
- package/dist/generated/iso/MVR.js.map +1 -0
- package/dist/generated/iso/MWK.d.ts +2 -0
- package/dist/generated/iso/MWK.d.ts.map +1 -0
- package/dist/generated/iso/MWK.js +5 -0
- package/dist/generated/iso/MWK.js.map +1 -0
- package/dist/generated/iso/MXN.d.ts +2 -0
- package/dist/generated/iso/MXN.d.ts.map +1 -0
- package/dist/generated/iso/MXN.js +5 -0
- package/dist/generated/iso/MXN.js.map +1 -0
- package/dist/generated/iso/MXV.d.ts +2 -0
- package/dist/generated/iso/MXV.d.ts.map +1 -0
- package/dist/generated/iso/MXV.js +5 -0
- package/dist/generated/iso/MXV.js.map +1 -0
- package/dist/generated/iso/MYR.d.ts +2 -0
- package/dist/generated/iso/MYR.d.ts.map +1 -0
- package/dist/generated/iso/MYR.js +5 -0
- package/dist/generated/iso/MYR.js.map +1 -0
- package/dist/generated/iso/MZN.d.ts +2 -0
- package/dist/generated/iso/MZN.d.ts.map +1 -0
- package/dist/generated/iso/MZN.js +5 -0
- package/dist/generated/iso/MZN.js.map +1 -0
- package/dist/generated/iso/NAD.d.ts +2 -0
- package/dist/generated/iso/NAD.d.ts.map +1 -0
- package/dist/generated/iso/NAD.js +5 -0
- package/dist/generated/iso/NAD.js.map +1 -0
- package/dist/generated/iso/NGN.d.ts +2 -0
- package/dist/generated/iso/NGN.d.ts.map +1 -0
- package/dist/generated/iso/NGN.js +5 -0
- package/dist/generated/iso/NGN.js.map +1 -0
- package/dist/generated/iso/NIO.d.ts +2 -0
- package/dist/generated/iso/NIO.d.ts.map +1 -0
- package/dist/generated/iso/NIO.js +5 -0
- package/dist/generated/iso/NIO.js.map +1 -0
- package/dist/generated/iso/NOK.d.ts +2 -0
- package/dist/generated/iso/NOK.d.ts.map +1 -0
- package/dist/generated/iso/NOK.js +5 -0
- package/dist/generated/iso/NOK.js.map +1 -0
- package/dist/generated/iso/NPR.d.ts +2 -0
- package/dist/generated/iso/NPR.d.ts.map +1 -0
- package/dist/generated/iso/NPR.js +5 -0
- package/dist/generated/iso/NPR.js.map +1 -0
- package/dist/generated/iso/NZD.d.ts +2 -0
- package/dist/generated/iso/NZD.d.ts.map +1 -0
- package/dist/generated/iso/NZD.js +5 -0
- package/dist/generated/iso/NZD.js.map +1 -0
- package/dist/generated/iso/OMR.d.ts +2 -0
- package/dist/generated/iso/OMR.d.ts.map +1 -0
- package/dist/generated/iso/OMR.js +5 -0
- package/dist/generated/iso/OMR.js.map +1 -0
- package/dist/generated/iso/PAB.d.ts +2 -0
- package/dist/generated/iso/PAB.d.ts.map +1 -0
- package/dist/generated/iso/PAB.js +5 -0
- package/dist/generated/iso/PAB.js.map +1 -0
- package/dist/generated/iso/PEN.d.ts +2 -0
- package/dist/generated/iso/PEN.d.ts.map +1 -0
- package/dist/generated/iso/PEN.js +5 -0
- package/dist/generated/iso/PEN.js.map +1 -0
- package/dist/generated/iso/PGK.d.ts +2 -0
- package/dist/generated/iso/PGK.d.ts.map +1 -0
- package/dist/generated/iso/PGK.js +5 -0
- package/dist/generated/iso/PGK.js.map +1 -0
- package/dist/generated/iso/PHP.d.ts +2 -0
- package/dist/generated/iso/PHP.d.ts.map +1 -0
- package/dist/generated/iso/PHP.js +5 -0
- package/dist/generated/iso/PHP.js.map +1 -0
- package/dist/generated/iso/PKR.d.ts +2 -0
- package/dist/generated/iso/PKR.d.ts.map +1 -0
- package/dist/generated/iso/PKR.js +5 -0
- package/dist/generated/iso/PKR.js.map +1 -0
- package/dist/generated/iso/PLN.d.ts +2 -0
- package/dist/generated/iso/PLN.d.ts.map +1 -0
- package/dist/generated/iso/PLN.js +5 -0
- package/dist/generated/iso/PLN.js.map +1 -0
- package/dist/generated/iso/PYG.d.ts +2 -0
- package/dist/generated/iso/PYG.d.ts.map +1 -0
- package/dist/generated/iso/PYG.js +5 -0
- package/dist/generated/iso/PYG.js.map +1 -0
- package/dist/generated/iso/QAR.d.ts +2 -0
- package/dist/generated/iso/QAR.d.ts.map +1 -0
- package/dist/generated/iso/QAR.js +5 -0
- package/dist/generated/iso/QAR.js.map +1 -0
- package/dist/generated/iso/RON.d.ts +2 -0
- package/dist/generated/iso/RON.d.ts.map +1 -0
- package/dist/generated/iso/RON.js +5 -0
- package/dist/generated/iso/RON.js.map +1 -0
- package/dist/generated/iso/RSD.d.ts +2 -0
- package/dist/generated/iso/RSD.d.ts.map +1 -0
- package/dist/generated/iso/RSD.js +5 -0
- package/dist/generated/iso/RSD.js.map +1 -0
- package/dist/generated/iso/RUB.d.ts +2 -0
- package/dist/generated/iso/RUB.d.ts.map +1 -0
- package/dist/generated/iso/RUB.js +5 -0
- package/dist/generated/iso/RUB.js.map +1 -0
- package/dist/generated/iso/RWF.d.ts +2 -0
- package/dist/generated/iso/RWF.d.ts.map +1 -0
- package/dist/generated/iso/RWF.js +5 -0
- package/dist/generated/iso/RWF.js.map +1 -0
- package/dist/generated/iso/SAR.d.ts +2 -0
- package/dist/generated/iso/SAR.d.ts.map +1 -0
- package/dist/generated/iso/SAR.js +5 -0
- package/dist/generated/iso/SAR.js.map +1 -0
- package/dist/generated/iso/SBD.d.ts +2 -0
- package/dist/generated/iso/SBD.d.ts.map +1 -0
- package/dist/generated/iso/SBD.js +5 -0
- package/dist/generated/iso/SBD.js.map +1 -0
- package/dist/generated/iso/SCR.d.ts +2 -0
- package/dist/generated/iso/SCR.d.ts.map +1 -0
- package/dist/generated/iso/SCR.js +5 -0
- package/dist/generated/iso/SCR.js.map +1 -0
- package/dist/generated/iso/SDG.d.ts +2 -0
- package/dist/generated/iso/SDG.d.ts.map +1 -0
- package/dist/generated/iso/SDG.js +5 -0
- package/dist/generated/iso/SDG.js.map +1 -0
- package/dist/generated/iso/SEK.d.ts +2 -0
- package/dist/generated/iso/SEK.d.ts.map +1 -0
- package/dist/generated/iso/SEK.js +5 -0
- package/dist/generated/iso/SEK.js.map +1 -0
- package/dist/generated/iso/SGD.d.ts +2 -0
- package/dist/generated/iso/SGD.d.ts.map +1 -0
- package/dist/generated/iso/SGD.js +5 -0
- package/dist/generated/iso/SGD.js.map +1 -0
- package/dist/generated/iso/SHP.d.ts +2 -0
- package/dist/generated/iso/SHP.d.ts.map +1 -0
- package/dist/generated/iso/SHP.js +5 -0
- package/dist/generated/iso/SHP.js.map +1 -0
- package/dist/generated/iso/SLE.d.ts +2 -0
- package/dist/generated/iso/SLE.d.ts.map +1 -0
- package/dist/generated/iso/SLE.js +5 -0
- package/dist/generated/iso/SLE.js.map +1 -0
- package/dist/generated/iso/SOS.d.ts +2 -0
- package/dist/generated/iso/SOS.d.ts.map +1 -0
- package/dist/generated/iso/SOS.js +5 -0
- package/dist/generated/iso/SOS.js.map +1 -0
- package/dist/generated/iso/SRD.d.ts +2 -0
- package/dist/generated/iso/SRD.d.ts.map +1 -0
- package/dist/generated/iso/SRD.js +5 -0
- package/dist/generated/iso/SRD.js.map +1 -0
- package/dist/generated/iso/SSP.d.ts +2 -0
- package/dist/generated/iso/SSP.d.ts.map +1 -0
- package/dist/generated/iso/SSP.js +5 -0
- package/dist/generated/iso/SSP.js.map +1 -0
- package/dist/generated/iso/STN.d.ts +2 -0
- package/dist/generated/iso/STN.d.ts.map +1 -0
- package/dist/generated/iso/STN.js +5 -0
- package/dist/generated/iso/STN.js.map +1 -0
- package/dist/generated/iso/SVC.d.ts +2 -0
- package/dist/generated/iso/SVC.d.ts.map +1 -0
- package/dist/generated/iso/SVC.js +5 -0
- package/dist/generated/iso/SVC.js.map +1 -0
- package/dist/generated/iso/SYP.d.ts +2 -0
- package/dist/generated/iso/SYP.d.ts.map +1 -0
- package/dist/generated/iso/SYP.js +5 -0
- package/dist/generated/iso/SYP.js.map +1 -0
- package/dist/generated/iso/SZL.d.ts +2 -0
- package/dist/generated/iso/SZL.d.ts.map +1 -0
- package/dist/generated/iso/SZL.js +5 -0
- package/dist/generated/iso/SZL.js.map +1 -0
- package/dist/generated/iso/THB.d.ts +2 -0
- package/dist/generated/iso/THB.d.ts.map +1 -0
- package/dist/generated/iso/THB.js +5 -0
- package/dist/generated/iso/THB.js.map +1 -0
- package/dist/generated/iso/TJS.d.ts +2 -0
- package/dist/generated/iso/TJS.d.ts.map +1 -0
- package/dist/generated/iso/TJS.js +5 -0
- package/dist/generated/iso/TJS.js.map +1 -0
- package/dist/generated/iso/TMT.d.ts +2 -0
- package/dist/generated/iso/TMT.d.ts.map +1 -0
- package/dist/generated/iso/TMT.js +5 -0
- package/dist/generated/iso/TMT.js.map +1 -0
- package/dist/generated/iso/TND.d.ts +2 -0
- package/dist/generated/iso/TND.d.ts.map +1 -0
- package/dist/generated/iso/TND.js +5 -0
- package/dist/generated/iso/TND.js.map +1 -0
- package/dist/generated/iso/TOP.d.ts +2 -0
- package/dist/generated/iso/TOP.d.ts.map +1 -0
- package/dist/generated/iso/TOP.js +5 -0
- package/dist/generated/iso/TOP.js.map +1 -0
- package/dist/generated/iso/TRY.d.ts +2 -0
- package/dist/generated/iso/TRY.d.ts.map +1 -0
- package/dist/generated/iso/TRY.js +5 -0
- package/dist/generated/iso/TRY.js.map +1 -0
- package/dist/generated/iso/TTD.d.ts +2 -0
- package/dist/generated/iso/TTD.d.ts.map +1 -0
- package/dist/generated/iso/TTD.js +5 -0
- package/dist/generated/iso/TTD.js.map +1 -0
- package/dist/generated/iso/TWD.d.ts +2 -0
- package/dist/generated/iso/TWD.d.ts.map +1 -0
- package/dist/generated/iso/TWD.js +5 -0
- package/dist/generated/iso/TWD.js.map +1 -0
- package/dist/generated/iso/TZS.d.ts +2 -0
- package/dist/generated/iso/TZS.d.ts.map +1 -0
- package/dist/generated/iso/TZS.js +5 -0
- package/dist/generated/iso/TZS.js.map +1 -0
- package/dist/generated/iso/UAH.d.ts +2 -0
- package/dist/generated/iso/UAH.d.ts.map +1 -0
- package/dist/generated/iso/UAH.js +5 -0
- package/dist/generated/iso/UAH.js.map +1 -0
- package/dist/generated/iso/UGX.d.ts +2 -0
- package/dist/generated/iso/UGX.d.ts.map +1 -0
- package/dist/generated/iso/UGX.js +5 -0
- package/dist/generated/iso/UGX.js.map +1 -0
- package/dist/generated/iso/USD.d.ts +2 -0
- package/dist/generated/iso/USD.d.ts.map +1 -0
- package/dist/generated/iso/USD.js +5 -0
- package/dist/generated/iso/USD.js.map +1 -0
- package/dist/generated/iso/USN.d.ts +2 -0
- package/dist/generated/iso/USN.d.ts.map +1 -0
- package/dist/generated/iso/USN.js +5 -0
- package/dist/generated/iso/USN.js.map +1 -0
- package/dist/generated/iso/UYI.d.ts +2 -0
- package/dist/generated/iso/UYI.d.ts.map +1 -0
- package/dist/generated/iso/UYI.js +5 -0
- package/dist/generated/iso/UYI.js.map +1 -0
- package/dist/generated/iso/UYU.d.ts +2 -0
- package/dist/generated/iso/UYU.d.ts.map +1 -0
- package/dist/generated/iso/UYU.js +5 -0
- package/dist/generated/iso/UYU.js.map +1 -0
- package/dist/generated/iso/UYW.d.ts +2 -0
- package/dist/generated/iso/UYW.d.ts.map +1 -0
- package/dist/generated/iso/UYW.js +5 -0
- package/dist/generated/iso/UYW.js.map +1 -0
- package/dist/generated/iso/UZS.d.ts +2 -0
- package/dist/generated/iso/UZS.d.ts.map +1 -0
- package/dist/generated/iso/UZS.js +5 -0
- package/dist/generated/iso/UZS.js.map +1 -0
- package/dist/generated/iso/VED.d.ts +2 -0
- package/dist/generated/iso/VED.d.ts.map +1 -0
- package/dist/generated/iso/VED.js +5 -0
- package/dist/generated/iso/VED.js.map +1 -0
- package/dist/generated/iso/VES.d.ts +2 -0
- package/dist/generated/iso/VES.d.ts.map +1 -0
- package/dist/generated/iso/VES.js +5 -0
- package/dist/generated/iso/VES.js.map +1 -0
- package/dist/generated/iso/VND.d.ts +2 -0
- package/dist/generated/iso/VND.d.ts.map +1 -0
- package/dist/generated/iso/VND.js +5 -0
- package/dist/generated/iso/VND.js.map +1 -0
- package/dist/generated/iso/VUV.d.ts +2 -0
- package/dist/generated/iso/VUV.d.ts.map +1 -0
- package/dist/generated/iso/VUV.js +5 -0
- package/dist/generated/iso/VUV.js.map +1 -0
- package/dist/generated/iso/WST.d.ts +2 -0
- package/dist/generated/iso/WST.d.ts.map +1 -0
- package/dist/generated/iso/WST.js +5 -0
- package/dist/generated/iso/WST.js.map +1 -0
- package/dist/generated/iso/XAD.d.ts +2 -0
- package/dist/generated/iso/XAD.d.ts.map +1 -0
- package/dist/generated/iso/XAD.js +5 -0
- package/dist/generated/iso/XAD.js.map +1 -0
- package/dist/generated/iso/XAF.d.ts +2 -0
- package/dist/generated/iso/XAF.d.ts.map +1 -0
- package/dist/generated/iso/XAF.js +5 -0
- package/dist/generated/iso/XAF.js.map +1 -0
- package/dist/generated/iso/XCD.d.ts +2 -0
- package/dist/generated/iso/XCD.d.ts.map +1 -0
- package/dist/generated/iso/XCD.js +5 -0
- package/dist/generated/iso/XCD.js.map +1 -0
- package/dist/generated/iso/XCG.d.ts +2 -0
- package/dist/generated/iso/XCG.d.ts.map +1 -0
- package/dist/generated/iso/XCG.js +5 -0
- package/dist/generated/iso/XCG.js.map +1 -0
- package/dist/generated/iso/XOF.d.ts +2 -0
- package/dist/generated/iso/XOF.d.ts.map +1 -0
- package/dist/generated/iso/XOF.js +5 -0
- package/dist/generated/iso/XOF.js.map +1 -0
- package/dist/generated/iso/XPF.d.ts +2 -0
- package/dist/generated/iso/XPF.d.ts.map +1 -0
- package/dist/generated/iso/XPF.js +5 -0
- package/dist/generated/iso/XPF.js.map +1 -0
- package/dist/generated/iso/YER.d.ts +2 -0
- package/dist/generated/iso/YER.d.ts.map +1 -0
- package/dist/generated/iso/YER.js +5 -0
- package/dist/generated/iso/YER.js.map +1 -0
- package/dist/generated/iso/ZAR.d.ts +2 -0
- package/dist/generated/iso/ZAR.d.ts.map +1 -0
- package/dist/generated/iso/ZAR.js +5 -0
- package/dist/generated/iso/ZAR.js.map +1 -0
- package/dist/generated/iso/ZMW.d.ts +2 -0
- package/dist/generated/iso/ZMW.d.ts.map +1 -0
- package/dist/generated/iso/ZMW.js +5 -0
- package/dist/generated/iso/ZMW.js.map +1 -0
- package/dist/generated/iso/ZWG.d.ts +2 -0
- package/dist/generated/iso/ZWG.d.ts.map +1 -0
- package/dist/generated/iso/ZWG.js +5 -0
- package/dist/generated/iso/ZWG.js.map +1 -0
- package/dist/generated/iso4217-numeric.d.ts +3 -0
- package/dist/generated/iso4217-numeric.d.ts.map +1 -0
- package/dist/generated/iso4217-numeric.js +184 -0
- package/dist/generated/iso4217-numeric.js.map +1 -0
- package/dist/generated/rbnf-de.d.ts +3 -0
- package/dist/generated/rbnf-de.d.ts.map +1 -0
- package/dist/generated/rbnf-de.js +5 -0
- package/dist/generated/rbnf-de.js.map +1 -0
- package/dist/generated/rbnf-en.d.ts +3 -0
- package/dist/generated/rbnf-en.d.ts.map +1 -0
- package/dist/generated/rbnf-en.js +5 -0
- package/dist/generated/rbnf-en.js.map +1 -0
- package/dist/generated/rbnf-es.d.ts +3 -0
- package/dist/generated/rbnf-es.d.ts.map +1 -0
- package/dist/generated/rbnf-es.js +5 -0
- package/dist/generated/rbnf-es.js.map +1 -0
- package/dist/generated/rbnf-fr.d.ts +3 -0
- package/dist/generated/rbnf-fr.d.ts.map +1 -0
- package/dist/generated/rbnf-fr.js +5 -0
- package/dist/generated/rbnf-fr.js.map +1 -0
- package/dist/generated/rbnf-it.d.ts +3 -0
- package/dist/generated/rbnf-it.d.ts.map +1 -0
- package/dist/generated/rbnf-it.js +5 -0
- package/dist/generated/rbnf-it.js.map +1 -0
- package/dist/generated/rbnf-nl.d.ts +3 -0
- package/dist/generated/rbnf-nl.d.ts.map +1 -0
- package/dist/generated/rbnf-nl.js +5 -0
- package/dist/generated/rbnf-nl.js.map +1 -0
- package/dist/generated/rbnf-pt.d.ts +3 -0
- package/dist/generated/rbnf-pt.d.ts.map +1 -0
- package/dist/generated/rbnf-pt.js +5 -0
- package/dist/generated/rbnf-pt.js.map +1 -0
- package/dist/generated/territories.d.ts +6 -0
- package/dist/generated/territories.d.ts.map +1 -0
- package/dist/generated/territories.js +275 -0
- package/dist/generated/territories.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/kysely.d.ts.map +1 -1
- package/dist/kysely.js +2 -2
- package/dist/kysely.js.map +1 -1
- package/dist/math.d.ts +41 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +132 -0
- package/dist/math.js.map +1 -0
- package/dist/money.d.ts +39 -57
- package/dist/money.d.ts.map +1 -1
- package/dist/money.js +118 -128
- package/dist/money.js.map +1 -1
- package/dist/parse.js +7 -7
- package/dist/parse.js.map +1 -1
- package/dist/plugins/adyen.d.ts +2 -0
- package/dist/plugins/adyen.d.ts.map +1 -1
- package/dist/plugins/adyen.js +2 -0
- package/dist/plugins/adyen.js.map +1 -1
- package/dist/plugins/all.d.ts +18 -2
- package/dist/plugins/all.d.ts.map +1 -1
- package/dist/plugins/all.js +19 -2
- package/dist/plugins/all.js.map +1 -1
- package/dist/plugins/allocate.d.ts +1 -0
- package/dist/plugins/allocate.d.ts.map +1 -1
- package/dist/plugins/allocate.js +2 -0
- package/dist/plugins/allocate.js.map +1 -1
- package/dist/plugins/braintree.d.ts +1 -0
- package/dist/plugins/braintree.d.ts.map +1 -1
- package/dist/plugins/braintree.js +2 -0
- package/dist/plugins/braintree.js.map +1 -1
- package/dist/plugins/cash.d.ts +1 -0
- package/dist/plugins/cash.d.ts.map +1 -1
- package/dist/plugins/cash.js +2 -0
- package/dist/plugins/cash.js.map +1 -1
- package/dist/plugins/checkout.d.ts +1 -0
- package/dist/plugins/checkout.d.ts.map +1 -1
- package/dist/plugins/checkout.js +2 -0
- package/dist/plugins/checkout.js.map +1 -1
- package/dist/plugins/convert.d.ts +5 -0
- package/dist/plugins/convert.d.ts.map +1 -1
- package/dist/plugins/convert.js +2 -0
- package/dist/plugins/convert.js.map +1 -1
- package/dist/plugins/core.d.ts +78 -0
- package/dist/plugins/core.d.ts.map +1 -0
- package/dist/plugins/core.js +104 -0
- package/dist/plugins/core.js.map +1 -0
- package/dist/plugins/exact.d.ts +1 -0
- package/dist/plugins/exact.d.ts.map +1 -1
- package/dist/plugins/exact.js +2 -0
- package/dist/plugins/exact.js.map +1 -1
- package/dist/plugins/fixed-money.d.ts +31 -0
- package/dist/plugins/fixed-money.d.ts.map +1 -0
- package/dist/plugins/fixed-money.js +29 -0
- package/dist/plugins/fixed-money.js.map +1 -0
- package/dist/plugins/format.d.ts +5 -0
- package/dist/plugins/format.d.ts.map +1 -1
- package/dist/plugins/format.js +2 -0
- package/dist/plugins/format.js.map +1 -1
- package/dist/plugins/iso.d.ts +2 -0
- package/dist/plugins/iso.d.ts.map +1 -0
- package/dist/plugins/iso.js +9 -0
- package/dist/plugins/iso.js.map +1 -0
- package/dist/plugins/klarna.d.ts +1 -0
- package/dist/plugins/klarna.d.ts.map +1 -1
- package/dist/plugins/klarna.js +2 -0
- package/dist/plugins/klarna.js.map +1 -1
- package/dist/plugins/math.d.ts +20 -0
- package/dist/plugins/math.d.ts.map +1 -0
- package/dist/plugins/math.js +24 -0
- package/dist/plugins/math.js.map +1 -0
- package/dist/plugins/paypal.d.ts +5 -0
- package/dist/plugins/paypal.d.ts.map +1 -1
- package/dist/plugins/paypal.js +6 -0
- package/dist/plugins/paypal.js.map +1 -1
- package/dist/plugins/prisma.d.ts +5 -0
- package/dist/plugins/prisma.d.ts.map +1 -1
- package/dist/plugins/prisma.js +6 -0
- package/dist/plugins/prisma.js.map +1 -1
- package/dist/plugins/stripe.d.ts +5 -0
- package/dist/plugins/stripe.d.ts.map +1 -1
- package/dist/plugins/stripe.js +6 -0
- package/dist/plugins/stripe.js.map +1 -1
- package/dist/plugins/tax.d.ts +1 -0
- package/dist/plugins/tax.d.ts.map +1 -1
- package/dist/plugins/tax.js +6 -0
- package/dist/plugins/tax.js.map +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +5 -6
- package/dist/policy.js.map +1 -1
- package/dist/pricing.d.ts +52 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +100 -0
- package/dist/pricing.js.map +1 -0
- package/dist/prisma.d.ts.map +1 -1
- package/dist/prisma.js +6 -2
- package/dist/prisma.js.map +1 -1
- package/dist/provider.js +2 -2
- package/dist/provider.js.map +1 -1
- package/dist/rate-text.d.ts +6 -0
- package/dist/rate-text.d.ts.map +1 -1
- package/dist/rate-text.js +24 -1
- package/dist/rate-text.js.map +1 -1
- package/dist/rate.d.ts.map +1 -1
- package/dist/rate.js +2 -3
- package/dist/rate.js.map +1 -1
- package/dist/rbnf.d.ts +29 -0
- package/dist/rbnf.d.ts.map +1 -0
- package/dist/rbnf.js +301 -0
- package/dist/rbnf.js.map +1 -0
- package/dist/rounding.d.ts +15 -0
- package/dist/rounding.d.ts.map +1 -1
- package/dist/rounding.js +32 -0
- package/dist/rounding.js.map +1 -1
- package/dist/scale.d.ts +8 -0
- package/dist/scale.d.ts.map +1 -0
- package/dist/scale.js +34 -0
- package/dist/scale.js.map +1 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +4 -5
- package/dist/schema.js.map +1 -1
- package/dist/territories.d.ts +40 -0
- package/dist/territories.d.ts.map +1 -0
- package/dist/territories.js +71 -0
- package/dist/territories.js.map +1 -0
- package/dist/testing/arbitraries.d.ts.map +1 -1
- package/dist/testing/arbitraries.js +4 -4
- package/dist/testing/arbitraries.js.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/tiers.d.ts +95 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +173 -0
- package/dist/tiers.js.map +1 -0
- package/dist/valibot.d.ts.map +1 -1
- package/dist/valibot.js +4 -1
- package/dist/valibot.js.map +1 -1
- package/dist/wire.d.ts +105 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +212 -0
- package/dist/wire.js.map +1 -0
- package/dist/words/de.d.ts +4 -0
- package/dist/words/de.d.ts.map +1 -0
- package/dist/words/de.js +8 -0
- package/dist/words/de.js.map +1 -0
- package/dist/words/en.d.ts +4 -0
- package/dist/words/en.d.ts.map +1 -0
- package/dist/words/en.js +8 -0
- package/dist/words/en.js.map +1 -0
- package/dist/words/es.d.ts +4 -0
- package/dist/words/es.d.ts.map +1 -0
- package/dist/words/es.js +8 -0
- package/dist/words/es.js.map +1 -0
- package/dist/words/fr.d.ts +4 -0
- package/dist/words/fr.d.ts.map +1 -0
- package/dist/words/fr.js +8 -0
- package/dist/words/fr.js.map +1 -0
- package/dist/words/it.d.ts +4 -0
- package/dist/words/it.d.ts.map +1 -0
- package/dist/words/it.js +8 -0
- package/dist/words/it.js.map +1 -0
- package/dist/words/nl.d.ts +4 -0
- package/dist/words/nl.d.ts.map +1 -0
- package/dist/words/nl.js +8 -0
- package/dist/words/nl.js.map +1 -0
- package/dist/words/pt.d.ts +4 -0
- package/dist/words/pt.d.ts.map +1 -0
- package/dist/words/pt.js +8 -0
- package/dist/words/pt.js.map +1 -0
- package/dist/words.d.ts +63 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +107 -0
- package/dist/words.js.map +1 -0
- package/dist/zod.d.ts.map +1 -1
- package/dist/zod.js +1 -1
- package/dist/zod.js.map +1 -1
- package/package.json +312 -54
- package/src/adyen-fx.ts +1 -1
- package/src/allocate.ts +4 -3
- package/src/cash.ts +26 -0
- package/src/convert.ts +2 -3
- package/src/crypto.ts +129 -0
- package/src/currencies.ts +123 -0
- package/src/currency.ts +45 -14
- package/src/decimal.ts +98 -10
- package/src/ecb.ts +75 -16
- package/src/entries/adyen-fx.ts +5 -0
- package/src/entries/boc.ts +5 -0
- package/src/entries/boe.ts +5 -0
- package/src/entries/crypto.ts +5 -0
- package/src/entries/currencies.ts +5 -0
- package/src/entries/drizzle-mysql.ts +5 -0
- package/src/entries/drizzle-pg.ts +5 -0
- package/src/entries/drizzle-sqlite.ts +5 -0
- package/src/entries/ecb.ts +5 -0
- package/src/entries/fed.ts +5 -0
- package/src/entries/fetch.ts +5 -0
- package/src/entries/finance.ts +5 -0
- package/src/entries/historic.ts +5 -0
- package/src/entries/history.ts +5 -0
- package/src/entries/hmrc.ts +5 -0
- package/src/entries/kysely.ts +5 -0
- package/src/entries/parse.ts +5 -0
- package/src/entries/pg.ts +5 -0
- package/src/entries/policy.ts +5 -0
- package/src/entries/pricing.ts +5 -0
- package/src/entries/stripe-fx.ts +5 -0
- package/src/entries/testing-arbitraries.ts +5 -0
- package/src/entries/testing-index.ts +5 -0
- package/src/entries/testing-jest.ts +5 -0
- package/src/entries/testing-vitest.ts +5 -0
- package/src/entries/valibot.ts +5 -0
- package/src/entries/wire.ts +5 -0
- package/src/entries/zod.ts +5 -0
- package/src/exact.ts +3 -3
- package/src/fetch.ts +20 -4
- package/src/finance.ts +1219 -0
- package/src/fixed-money.ts +38 -0
- package/src/fixed.ts +86 -66
- package/src/fn.ts +17 -0
- package/src/format.ts +28 -9
- package/src/generated/crypto.ts +15 -0
- package/src/generated/iso/AED.ts +5 -0
- package/src/generated/iso/AFN.ts +5 -0
- package/src/generated/iso/ALL.ts +5 -0
- package/src/generated/iso/AMD.ts +5 -0
- package/src/generated/iso/AOA.ts +5 -0
- package/src/generated/iso/ARS.ts +5 -0
- package/src/generated/iso/AUD.ts +5 -0
- package/src/generated/iso/AWG.ts +5 -0
- package/src/generated/iso/AZN.ts +5 -0
- package/src/generated/iso/BAM.ts +5 -0
- package/src/generated/iso/BBD.ts +5 -0
- package/src/generated/iso/BDT.ts +5 -0
- package/src/generated/iso/BHD.ts +5 -0
- package/src/generated/iso/BIF.ts +5 -0
- package/src/generated/iso/BMD.ts +5 -0
- package/src/generated/iso/BND.ts +5 -0
- package/src/generated/iso/BOB.ts +5 -0
- package/src/generated/iso/BOV.ts +5 -0
- package/src/generated/iso/BRL.ts +5 -0
- package/src/generated/iso/BSD.ts +5 -0
- package/src/generated/iso/BTN.ts +5 -0
- package/src/generated/iso/BWP.ts +5 -0
- package/src/generated/iso/BYN.ts +5 -0
- package/src/generated/iso/BZD.ts +5 -0
- package/src/generated/iso/CAD.ts +5 -0
- package/src/generated/iso/CDF.ts +5 -0
- package/src/generated/iso/CHE.ts +5 -0
- package/src/generated/iso/CHF.ts +5 -0
- package/src/generated/iso/CHW.ts +5 -0
- package/src/generated/iso/CLF.ts +5 -0
- package/src/generated/iso/CLP.ts +5 -0
- package/src/generated/iso/CNY.ts +5 -0
- package/src/generated/iso/COP.ts +5 -0
- package/src/generated/iso/COU.ts +5 -0
- package/src/generated/iso/CRC.ts +5 -0
- package/src/generated/iso/CUP.ts +5 -0
- package/src/generated/iso/CVE.ts +5 -0
- package/src/generated/iso/CZK.ts +5 -0
- package/src/generated/iso/DJF.ts +5 -0
- package/src/generated/iso/DKK.ts +5 -0
- package/src/generated/iso/DOP.ts +5 -0
- package/src/generated/iso/DZD.ts +5 -0
- package/src/generated/iso/EGP.ts +5 -0
- package/src/generated/iso/ERN.ts +5 -0
- package/src/generated/iso/ETB.ts +5 -0
- package/src/generated/iso/EUR.ts +5 -0
- package/src/generated/iso/FJD.ts +5 -0
- package/src/generated/iso/FKP.ts +5 -0
- package/src/generated/iso/GBP.ts +5 -0
- package/src/generated/iso/GEL.ts +5 -0
- package/src/generated/iso/GHS.ts +5 -0
- package/src/generated/iso/GIP.ts +5 -0
- package/src/generated/iso/GMD.ts +5 -0
- package/src/generated/iso/GNF.ts +5 -0
- package/src/generated/iso/GTQ.ts +5 -0
- package/src/generated/iso/GYD.ts +5 -0
- package/src/generated/iso/HKD.ts +5 -0
- package/src/generated/iso/HNL.ts +5 -0
- package/src/generated/iso/HTG.ts +5 -0
- package/src/generated/iso/HUF.ts +5 -0
- package/src/generated/iso/IDR.ts +5 -0
- package/src/generated/iso/ILS.ts +5 -0
- package/src/generated/iso/INR.ts +5 -0
- package/src/generated/iso/IQD.ts +5 -0
- package/src/generated/iso/IRR.ts +5 -0
- package/src/generated/iso/ISK.ts +5 -0
- package/src/generated/iso/JMD.ts +5 -0
- package/src/generated/iso/JOD.ts +5 -0
- package/src/generated/iso/JPY.ts +5 -0
- package/src/generated/iso/KES.ts +5 -0
- package/src/generated/iso/KGS.ts +5 -0
- package/src/generated/iso/KHR.ts +5 -0
- package/src/generated/iso/KMF.ts +5 -0
- package/src/generated/iso/KPW.ts +5 -0
- package/src/generated/iso/KRW.ts +5 -0
- package/src/generated/iso/KWD.ts +5 -0
- package/src/generated/iso/KYD.ts +5 -0
- package/src/generated/iso/KZT.ts +5 -0
- package/src/generated/iso/LAK.ts +5 -0
- package/src/generated/iso/LBP.ts +5 -0
- package/src/generated/iso/LKR.ts +5 -0
- package/src/generated/iso/LRD.ts +5 -0
- package/src/generated/iso/LSL.ts +5 -0
- package/src/generated/iso/LYD.ts +5 -0
- package/src/generated/iso/MAD.ts +5 -0
- package/src/generated/iso/MDL.ts +5 -0
- package/src/generated/iso/MGA.ts +5 -0
- package/src/generated/iso/MKD.ts +5 -0
- package/src/generated/iso/MMK.ts +5 -0
- package/src/generated/iso/MNT.ts +5 -0
- package/src/generated/iso/MOP.ts +5 -0
- package/src/generated/iso/MRU.ts +5 -0
- package/src/generated/iso/MUR.ts +5 -0
- package/src/generated/iso/MVR.ts +5 -0
- package/src/generated/iso/MWK.ts +5 -0
- package/src/generated/iso/MXN.ts +5 -0
- package/src/generated/iso/MXV.ts +5 -0
- package/src/generated/iso/MYR.ts +5 -0
- package/src/generated/iso/MZN.ts +5 -0
- package/src/generated/iso/NAD.ts +5 -0
- package/src/generated/iso/NGN.ts +5 -0
- package/src/generated/iso/NIO.ts +5 -0
- package/src/generated/iso/NOK.ts +5 -0
- package/src/generated/iso/NPR.ts +5 -0
- package/src/generated/iso/NZD.ts +5 -0
- package/src/generated/iso/OMR.ts +5 -0
- package/src/generated/iso/PAB.ts +5 -0
- package/src/generated/iso/PEN.ts +5 -0
- package/src/generated/iso/PGK.ts +5 -0
- package/src/generated/iso/PHP.ts +5 -0
- package/src/generated/iso/PKR.ts +5 -0
- package/src/generated/iso/PLN.ts +5 -0
- package/src/generated/iso/PYG.ts +5 -0
- package/src/generated/iso/QAR.ts +5 -0
- package/src/generated/iso/RON.ts +5 -0
- package/src/generated/iso/RSD.ts +5 -0
- package/src/generated/iso/RUB.ts +5 -0
- package/src/generated/iso/RWF.ts +5 -0
- package/src/generated/iso/SAR.ts +5 -0
- package/src/generated/iso/SBD.ts +5 -0
- package/src/generated/iso/SCR.ts +5 -0
- package/src/generated/iso/SDG.ts +5 -0
- package/src/generated/iso/SEK.ts +5 -0
- package/src/generated/iso/SGD.ts +5 -0
- package/src/generated/iso/SHP.ts +5 -0
- package/src/generated/iso/SLE.ts +5 -0
- package/src/generated/iso/SOS.ts +5 -0
- package/src/generated/iso/SRD.ts +5 -0
- package/src/generated/iso/SSP.ts +5 -0
- package/src/generated/iso/STN.ts +5 -0
- package/src/generated/iso/SVC.ts +5 -0
- package/src/generated/iso/SYP.ts +5 -0
- package/src/generated/iso/SZL.ts +5 -0
- package/src/generated/iso/THB.ts +5 -0
- package/src/generated/iso/TJS.ts +5 -0
- package/src/generated/iso/TMT.ts +5 -0
- package/src/generated/iso/TND.ts +5 -0
- package/src/generated/iso/TOP.ts +5 -0
- package/src/generated/iso/TRY.ts +5 -0
- package/src/generated/iso/TTD.ts +5 -0
- package/src/generated/iso/TWD.ts +5 -0
- package/src/generated/iso/TZS.ts +5 -0
- package/src/generated/iso/UAH.ts +5 -0
- package/src/generated/iso/UGX.ts +5 -0
- package/src/generated/iso/USD.ts +5 -0
- package/src/generated/iso/USN.ts +5 -0
- package/src/generated/iso/UYI.ts +5 -0
- package/src/generated/iso/UYU.ts +5 -0
- package/src/generated/iso/UYW.ts +5 -0
- package/src/generated/iso/UZS.ts +5 -0
- package/src/generated/iso/VED.ts +5 -0
- package/src/generated/iso/VES.ts +5 -0
- package/src/generated/iso/VND.ts +5 -0
- package/src/generated/iso/VUV.ts +5 -0
- package/src/generated/iso/WST.ts +5 -0
- package/src/generated/iso/XAD.ts +5 -0
- package/src/generated/iso/XAF.ts +5 -0
- package/src/generated/iso/XCD.ts +5 -0
- package/src/generated/iso/XCG.ts +5 -0
- package/src/generated/iso/XOF.ts +5 -0
- package/src/generated/iso/XPF.ts +5 -0
- package/src/generated/iso/YER.ts +5 -0
- package/src/generated/iso/ZAR.ts +5 -0
- package/src/generated/iso/ZMW.ts +5 -0
- package/src/generated/iso/ZWG.ts +5 -0
- package/src/generated/iso4217-numeric.ts +184 -0
- package/src/generated/rbnf-de.ts +5 -0
- package/src/generated/rbnf-en.ts +5 -0
- package/src/generated/rbnf-es.ts +5 -0
- package/src/generated/rbnf-fr.ts +5 -0
- package/src/generated/rbnf-it.ts +5 -0
- package/src/generated/rbnf-nl.ts +5 -0
- package/src/generated/rbnf-pt.ts +5 -0
- package/src/generated/territories.ts +277 -0
- package/src/index.ts +3 -0
- package/src/kysely.ts +4 -3
- package/src/math.ts +167 -0
- package/src/money.ts +138 -140
- package/src/parse.ts +7 -7
- package/src/plugins/adyen.ts +2 -0
- package/src/plugins/all.ts +19 -1
- package/src/plugins/allocate.ts +2 -0
- package/src/plugins/braintree.ts +2 -0
- package/src/plugins/cash.ts +2 -0
- package/src/plugins/checkout.ts +2 -0
- package/src/plugins/convert.ts +2 -0
- package/src/plugins/core.ts +195 -0
- package/src/plugins/exact.ts +2 -0
- package/src/plugins/fixed-money.ts +57 -0
- package/src/plugins/format.ts +2 -0
- package/src/plugins/iso.ts +9 -0
- package/src/plugins/klarna.ts +2 -0
- package/src/plugins/math.ts +43 -0
- package/src/plugins/paypal.ts +2 -0
- package/src/plugins/prisma.ts +2 -0
- package/src/plugins/stripe.ts +2 -0
- package/src/plugins/tax.ts +2 -0
- package/src/policy.ts +5 -8
- package/src/pricing.ts +155 -0
- package/src/prisma.ts +6 -1
- package/src/provider.ts +2 -2
- package/src/rate-text.ts +27 -1
- package/src/rate.ts +2 -2
- package/src/rbnf.ts +389 -0
- package/src/rounding.ts +34 -0
- package/src/scale.ts +42 -0
- package/src/schema.ts +4 -7
- package/src/territories.ts +102 -0
- package/src/testing/arbitraries.ts +4 -4
- package/src/testing/index.ts +1 -1
- package/src/tiers.ts +284 -0
- package/src/valibot.ts +4 -1
- package/src/wire.ts +322 -0
- package/src/words/de.ts +9 -0
- package/src/words/en.ts +9 -0
- package/src/words/es.ts +9 -0
- package/src/words/fr.ts +9 -0
- package/src/words/it.ts +9 -0
- package/src/words/nl.ts +9 -0
- package/src/words/pt.ts +9 -0
- package/src/words.ts +168 -0
- package/src/zod.ts +1 -1
- package/dist/plugins/fixed.d.ts +0 -17
- package/dist/plugins/fixed.d.ts.map +0 -1
- package/dist/plugins/fixed.js +0 -13
- package/dist/plugins/fixed.js.map +0 -1
- package/src/plugins/fixed.ts +0 -29
package/dist/finance.js
ADDED
|
@@ -0,0 +1,825 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@ducatjs/money/finance`: day counts, simple and compound interest, loan schedules, NPV and IRR,
|
|
3
|
+
* and subscription proration, in exact arithmetic. Every amount that is paid or booked is rounded
|
|
4
|
+
* once from its exact value; nothing in between is rounded, and no floats are used. Dates are
|
|
5
|
+
* calendar dates ('YYYY-MM-DD' or `{ year, month, day }`, so a `Temporal.PlainDate` works), never
|
|
6
|
+
* `Date`. Free functions only: nothing is added to Money.
|
|
7
|
+
*/
|
|
8
|
+
import { currencyExponent } from './currency.js';
|
|
9
|
+
import { formatScaled, pow10n, ratio } from './decimal.js';
|
|
10
|
+
import { ExactMoney, exact } from './exact.js';
|
|
11
|
+
import { allocate, instalments } from './allocate.js';
|
|
12
|
+
import { add, compare, CurrencyMismatchError, make, multiplyByRatio, subtract, sum, } from './money.js';
|
|
13
|
+
import { DEFAULT_ROUNDING } from './rounding.js';
|
|
14
|
+
const DATE_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
15
|
+
function isLeapYear(year) {
|
|
16
|
+
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
17
|
+
}
|
|
18
|
+
function daysInMonth(year, month) {
|
|
19
|
+
if (month === 2) {
|
|
20
|
+
return isLeapYear(year) ? 29 : 28;
|
|
21
|
+
}
|
|
22
|
+
// April, June, September and November have 30 days
|
|
23
|
+
return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;
|
|
24
|
+
}
|
|
25
|
+
function daysInYear(year) {
|
|
26
|
+
return isLeapYear(year) ? 366 : 365;
|
|
27
|
+
}
|
|
28
|
+
/** The fields of a calendar date, or a RangeError for anything that is not a real date. */
|
|
29
|
+
function dateFields(date) {
|
|
30
|
+
let year;
|
|
31
|
+
let month;
|
|
32
|
+
let day;
|
|
33
|
+
if (typeof date === 'string') {
|
|
34
|
+
const match = DATE_RE.exec(date);
|
|
35
|
+
if (match === null) {
|
|
36
|
+
throw new RangeError(`Invalid date "${date}"; expected YYYY-MM-DD`);
|
|
37
|
+
}
|
|
38
|
+
year = Number(match[1]);
|
|
39
|
+
month = Number(match[2]);
|
|
40
|
+
day = Number(match[3]);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// a Temporal.PlainDate in another calendar has that calendar's fields, not Gregorian ones
|
|
44
|
+
const calendar = date.calendarId;
|
|
45
|
+
if (calendar !== undefined && calendar !== 'iso8601') {
|
|
46
|
+
throw new RangeError(`Dates must be in the ISO calendar; got ${String(calendar)}`);
|
|
47
|
+
}
|
|
48
|
+
year = date.year;
|
|
49
|
+
month = date.month;
|
|
50
|
+
day = date.day;
|
|
51
|
+
}
|
|
52
|
+
// years 0-9999, as 'YYYY-MM-DD' writes them, keep every day and second count exact
|
|
53
|
+
const valid = Number.isInteger(year) &&
|
|
54
|
+
year >= 0 &&
|
|
55
|
+
year <= 9999 &&
|
|
56
|
+
Number.isInteger(month) &&
|
|
57
|
+
Number.isInteger(day) &&
|
|
58
|
+
month >= 1 &&
|
|
59
|
+
month <= 12 &&
|
|
60
|
+
day >= 1 &&
|
|
61
|
+
day <= daysInMonth(year, month);
|
|
62
|
+
if (!valid) {
|
|
63
|
+
throw new RangeError(`Invalid date ${formatFields(year, month, day)}`);
|
|
64
|
+
}
|
|
65
|
+
return { year, month, day };
|
|
66
|
+
}
|
|
67
|
+
function formatFields(year, month, day) {
|
|
68
|
+
const pad = (value) => String(value).padStart(2, '0');
|
|
69
|
+
return `${String(year).padStart(4, '0')}-${pad(month)}-${pad(day)}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Days from 1970-01-01 to the date, in integers (Howard Hinnant's `days_from_civil`): the year is
|
|
73
|
+
* counted from March, so the leap day falls at the end of the counting year.
|
|
74
|
+
*/
|
|
75
|
+
function dayNumber({ year, month, day }) {
|
|
76
|
+
const shiftedYear = month <= 2 ? year - 1 : year;
|
|
77
|
+
const era = Math.floor(shiftedYear / 400);
|
|
78
|
+
const yearOfEra = shiftedYear - era * 400;
|
|
79
|
+
const monthFromMarch = month > 2 ? month - 3 : month + 9;
|
|
80
|
+
const dayOfYear = Math.floor((153 * monthFromMarch + 2) / 5) + day - 1;
|
|
81
|
+
const dayOfEra = yearOfEra * 365 + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100);
|
|
82
|
+
return era * 146_097 + dayOfEra + dayOfYear - 719_468;
|
|
83
|
+
}
|
|
84
|
+
/** Days from `start` to `end` (end exclusive): negative when `end` is earlier. */
|
|
85
|
+
function daysBetween(start, end) {
|
|
86
|
+
return dayNumber(end) - dayNumber(start);
|
|
87
|
+
}
|
|
88
|
+
function assertNotBefore(start, end) {
|
|
89
|
+
if (dayNumber(end) < dayNumber(start)) {
|
|
90
|
+
throw new RangeError('The end date is before the start date');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function isLastDayOfFebruary({ year, month, day }) {
|
|
94
|
+
return month === 2 && day === daysInMonth(year, 2);
|
|
95
|
+
}
|
|
96
|
+
/** The 30/360 family's day count: 360 × years + 30 × months + days, after adjusting the days. */
|
|
97
|
+
function thirty360Days(start, end, startDay, endDay) {
|
|
98
|
+
return 360 * (end.year - start.year) + 30 * (end.month - start.month) + (endDay - startDay);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The fraction of a year from `start` to `end` under `convention`, as an exact ratio. `end` may not
|
|
102
|
+
* be before `start`. This is not Excel's YEARFRAC: its basis 0 is the US (NASD) 30/360 with
|
|
103
|
+
* end-of-February rules rather than Bond Basis, its basis 1 divides by an average year length
|
|
104
|
+
* rather than splitting days by calendar year as ACT/ACT ISDA does, and it swaps reversed dates.
|
|
105
|
+
*
|
|
106
|
+
* yearFraction('2026-01-15', '2026-07-15', 'ACT/360') // 181/360
|
|
107
|
+
*/
|
|
108
|
+
export function yearFraction(start, end, convention, options) {
|
|
109
|
+
const from = dateFields(start);
|
|
110
|
+
const to = dateFields(end);
|
|
111
|
+
assertNotBefore(from, to);
|
|
112
|
+
switch (convention) {
|
|
113
|
+
case 'ACT/360':
|
|
114
|
+
return ratio(BigInt(daysBetween(from, to)), 360n);
|
|
115
|
+
case 'ACT/365F':
|
|
116
|
+
return ratio(BigInt(daysBetween(from, to)), 365n);
|
|
117
|
+
case 'ACT/ACT ISDA':
|
|
118
|
+
return actualActualIsda(from, to);
|
|
119
|
+
case '30/360': {
|
|
120
|
+
// §4.16(f): D1 = 31 becomes 30; D2 = 31 becomes 30 only when D1 is then 30 (or was 31)
|
|
121
|
+
const startDay = from.day === 31 ? 30 : from.day;
|
|
122
|
+
const endDay = to.day === 31 && startDay === 30 ? 30 : to.day;
|
|
123
|
+
return ratio(BigInt(thirty360Days(from, to, startDay, endDay)), 360n);
|
|
124
|
+
}
|
|
125
|
+
case '30E/360': {
|
|
126
|
+
// §4.16(g): a 31st on either side becomes the 30th
|
|
127
|
+
const startDay = from.day === 31 ? 30 : from.day;
|
|
128
|
+
const endDay = to.day === 31 ? 30 : to.day;
|
|
129
|
+
return ratio(BigInt(thirty360Days(from, to, startDay, endDay)), 360n);
|
|
130
|
+
}
|
|
131
|
+
case '30E/360 ISDA': {
|
|
132
|
+
// §4.16(h): the last day of a month becomes the 30th, except the last day of February when
|
|
133
|
+
// it is the termination date
|
|
134
|
+
const startDay = from.day === 31 || isLastDayOfFebruary(from) ? 30 : from.day;
|
|
135
|
+
let endDay = to.day === 31 ? 30 : to.day;
|
|
136
|
+
if (isLastDayOfFebruary(to)) {
|
|
137
|
+
const maturity = options?.maturity;
|
|
138
|
+
if (typeof maturity !== 'boolean') {
|
|
139
|
+
throw new RangeError("'30E/360 ISDA' ending on the last day of February needs the option maturity: true or false");
|
|
140
|
+
}
|
|
141
|
+
endDay = maturity ? to.day : 30;
|
|
142
|
+
}
|
|
143
|
+
return ratio(BigInt(thirty360Days(from, to, startDay, endDay)), 360n);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return invalid('day count', convention);
|
|
147
|
+
}
|
|
148
|
+
/** ACT/ACT ISDA: the days in each calendar year over that year's length, summed exactly. */
|
|
149
|
+
function actualActualIsda(from, to) {
|
|
150
|
+
if (from.year === to.year) {
|
|
151
|
+
return ratio(BigInt(daysBetween(from, to)), BigInt(daysInYear(from.year)));
|
|
152
|
+
}
|
|
153
|
+
const startYearEnd = { year: from.year + 1, month: 1, day: 1 };
|
|
154
|
+
const endYearStart = { year: to.year, month: 1, day: 1 };
|
|
155
|
+
const firstYearLength = BigInt(daysInYear(from.year));
|
|
156
|
+
const lastYearLength = BigInt(daysInYear(to.year));
|
|
157
|
+
const firstYearDays = BigInt(daysBetween(from, startYearEnd));
|
|
158
|
+
const lastYearDays = BigInt(daysBetween(endYearStart, to));
|
|
159
|
+
const wholeYears = BigInt(to.year - from.year - 1);
|
|
160
|
+
// firstYearDays/firstYearLength + wholeYears + lastYearDays/lastYearLength over one denominator
|
|
161
|
+
const denominator = firstYearLength * lastYearLength;
|
|
162
|
+
const numerator = firstYearDays * lastYearLength + wholeYears * denominator + lastYearDays * firstYearLength;
|
|
163
|
+
return ratio(numerator, denominator);
|
|
164
|
+
}
|
|
165
|
+
// ---------------------------------------------------------------------------------------------
|
|
166
|
+
// Rounding helpers
|
|
167
|
+
// ---------------------------------------------------------------------------------------------
|
|
168
|
+
/**
|
|
169
|
+
* numerator / denominator major units (denominator > 0) rounded once: with a mode, to the
|
|
170
|
+
* currency's exponent; with a policy, to the policy's scale and increment. The fraction is not
|
|
171
|
+
* reduced first: rounding divides once either way, and a gcd of the thousands-of-bits integers a
|
|
172
|
+
* long schedule or NPV builds would cost more than everything else.
|
|
173
|
+
*/
|
|
174
|
+
function roundQuotient(currency, numerator, denominator, rounding) {
|
|
175
|
+
// one major unit times the fraction, so the rounding applies to the fraction itself
|
|
176
|
+
return multiplyAndRound(make(currency, 1, 0), unreducedRatio(numerator, denominator), rounding);
|
|
177
|
+
}
|
|
178
|
+
/** money × factor rounded once, at the currency's exponent or the policy's scale. */
|
|
179
|
+
function multiplyAndRound(money, factor, rounding) {
|
|
180
|
+
return multiplyByRatio(money, factor, rounding, currencyExponent(money.currency));
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* A ratio built without a gcd, for rounding once: multiplyByRatio divides by it, which gives the
|
|
184
|
+
* same result for any representation of the fraction.
|
|
185
|
+
*/
|
|
186
|
+
function unreducedRatio(numerator, denominator) {
|
|
187
|
+
const toNumber = (value) => value <= 9007199254740991n && value >= -9007199254740991n ? Number(value) : NaN;
|
|
188
|
+
return { num: numerator, den: denominator, n: toNumber(numerator), d: toNumber(denominator) };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* The most periods a schedule or compounding may have: (1 + r)^n has about n times the bits of
|
|
192
|
+
* 1 + r, so this bounds the integers (a 30-year daily schedule is about 11,000 periods).
|
|
193
|
+
*/
|
|
194
|
+
const MAX_PERIODS = 100_000;
|
|
195
|
+
function assertPeriods(periods, minimum) {
|
|
196
|
+
if (!(Number.isInteger(periods) && periods >= minimum && periods <= MAX_PERIODS)) {
|
|
197
|
+
invalid('periods', periods);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/** Whether `money` is a whole number of `unit`s (both of one currency, unit positive). */
|
|
201
|
+
function isMultipleOf(money, unit) {
|
|
202
|
+
const scale = Math.max(money.scale, unit.scale);
|
|
203
|
+
const minor = BigInt(money.minor) * pow10n(scale - money.scale);
|
|
204
|
+
const unitMinor = BigInt(unit.minor) * pow10n(scale - unit.scale);
|
|
205
|
+
return minor % unitMinor === 0n;
|
|
206
|
+
}
|
|
207
|
+
/** Throws a RangeError naming the option and the value it was given. */
|
|
208
|
+
function invalid(name, value) {
|
|
209
|
+
throw new RangeError(`Invalid ${name} ${String(value)}`);
|
|
210
|
+
}
|
|
211
|
+
function assertPositiveInteger(value, name) {
|
|
212
|
+
if (!(Number.isSafeInteger(value) && value >= 1)) {
|
|
213
|
+
invalid(name, value);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function assertSameCurrency(money, other) {
|
|
217
|
+
if (money.currency !== other.currency) {
|
|
218
|
+
throw new CurrencyMismatchError(money.currency, other.currency);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Simple interest, `principal × rate × yearFraction`, exactly. `rate` is an annual rate as a
|
|
223
|
+
* `Factor` ('0.05' for 5%).
|
|
224
|
+
*/
|
|
225
|
+
export function interestExact(principal, rate, period) {
|
|
226
|
+
const fraction = yearFraction(period.from, period.to, period.dayCount, period);
|
|
227
|
+
return exact(principal).multiply(rate).multiply(fraction);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Simple interest, `principal × rate × yearFraction`, rounded once (to the currency's exponent with
|
|
231
|
+
* a mode, or to a policy's scale; default 'halfExpand').
|
|
232
|
+
*
|
|
233
|
+
* interest(money('10000', 'EUR'), '0.05',
|
|
234
|
+
* { from: '2026-01-15', to: '2026-07-15', dayCount: 'ACT/365F' }, 'halfEven') // 247.95 EUR
|
|
235
|
+
*/
|
|
236
|
+
export function interest(principal, rate, period, rounding = DEFAULT_ROUNDING) {
|
|
237
|
+
const fraction = yearFraction(period.from, period.to, period.dayCount, period);
|
|
238
|
+
const rateRatio = ratio(rate);
|
|
239
|
+
return multiplyAndRound(principal, ratio(rateRatio.num * fraction.num, rateRatio.den * fraction.den), rounding);
|
|
240
|
+
}
|
|
241
|
+
/** (1 + rate/perYear) as a reduced ratio, checked to be positive. */
|
|
242
|
+
function growthFactor(rate, perYear) {
|
|
243
|
+
assertPositiveInteger(perYear, 'perYear');
|
|
244
|
+
const rateRatio = ratio(rate);
|
|
245
|
+
const perYearBig = BigInt(perYear);
|
|
246
|
+
const growth = ratio(rateRatio.num + rateRatio.den * perYearBig, rateRatio.den * perYearBig);
|
|
247
|
+
if (growth.num <= 0n) {
|
|
248
|
+
throw new RangeError(`A rate of ${rate} per year loses everything in one period`);
|
|
249
|
+
}
|
|
250
|
+
return growth;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Periodic compounding: `principal × (1 + rate/perYear)^periods` (at most 100,000 periods), an
|
|
254
|
+
* exact integer power, rounded once. Fractional periods and continuous compounding are irrational, so they are not offered.
|
|
255
|
+
*
|
|
256
|
+
* compound(money('1000', 'EUR'), '0.05', { periods: 12, perYear: 12 }, 'halfEven') // 1051.16 EUR
|
|
257
|
+
*/
|
|
258
|
+
export function compound(principal, rate, options, rounding = DEFAULT_ROUNDING) {
|
|
259
|
+
const periods = options.periods;
|
|
260
|
+
assertPeriods(periods, 0);
|
|
261
|
+
const growth = growthFactor(rate, options.perYear);
|
|
262
|
+
const exponent = BigInt(periods);
|
|
263
|
+
// a power of a reduced ratio is reduced, so no gcd is needed on the large integers
|
|
264
|
+
const power = unreducedRatio(growth.num ** exponent, growth.den ** exponent);
|
|
265
|
+
return multiplyAndRound(principal, power, rounding);
|
|
266
|
+
}
|
|
267
|
+
/** The minor unit a rounding produces, for loans whose parts must be multiples of it. */
|
|
268
|
+
function roundingUnit(currency, rounding) {
|
|
269
|
+
if (typeof rounding === 'string') {
|
|
270
|
+
return make(currency, 1, currencyExponent(currency));
|
|
271
|
+
}
|
|
272
|
+
return make(currency, rounding.increment, rounding.scale ?? currencyExponent(currency));
|
|
273
|
+
}
|
|
274
|
+
/** The payment dates: monthly steps from the anchor date, clamped to month ends, or 7 or 14 days. */
|
|
275
|
+
function paymentDates(first, perYear, count) {
|
|
276
|
+
const anchor = dateFields(first);
|
|
277
|
+
const dates = [];
|
|
278
|
+
if (perYear === 26 || perYear === 52) {
|
|
279
|
+
const step = perYear === 52 ? 7 : 14;
|
|
280
|
+
const anchorDay = dayNumber(anchor);
|
|
281
|
+
for (let i = 0; i < count; i++) {
|
|
282
|
+
dates.push(dateFromDayNumber(anchorDay + i * step));
|
|
283
|
+
}
|
|
284
|
+
return checkedDates(dates);
|
|
285
|
+
}
|
|
286
|
+
if (!(Number.isSafeInteger(perYear) && 12 % perYear === 0)) {
|
|
287
|
+
// payment dates step by whole months, or by 7 or 14 days
|
|
288
|
+
invalid('perYear for payment dates', perYear);
|
|
289
|
+
}
|
|
290
|
+
const monthStep = 12 / perYear;
|
|
291
|
+
for (let i = 0; i < count; i++) {
|
|
292
|
+
const monthIndex = anchor.month - 1 + i * monthStep;
|
|
293
|
+
const year = anchor.year + Math.floor(monthIndex / 12);
|
|
294
|
+
const month = (monthIndex % 12) + 1;
|
|
295
|
+
const day = Math.min(anchor.day, daysInMonth(year, month));
|
|
296
|
+
dates.push(formatFields(year, month, day));
|
|
297
|
+
}
|
|
298
|
+
return checkedDates(dates);
|
|
299
|
+
}
|
|
300
|
+
/** The dates, unless the last (and latest) is past the year 9999, which dates can't hold. */
|
|
301
|
+
function checkedDates(dates) {
|
|
302
|
+
if (dates[dates.length - 1].length !== 10) {
|
|
303
|
+
throw new RangeError('The payment dates run past the year 9999');
|
|
304
|
+
}
|
|
305
|
+
return dates;
|
|
306
|
+
}
|
|
307
|
+
/** The inverse of `dayNumber` (Howard Hinnant's `civil_from_days`). */
|
|
308
|
+
function dateFromDayNumber(days) {
|
|
309
|
+
const shifted = days + 719_468;
|
|
310
|
+
const era = Math.floor(shifted / 146_097);
|
|
311
|
+
const dayOfEra = shifted - era * 146_097;
|
|
312
|
+
const yearOfEra = Math.floor((dayOfEra -
|
|
313
|
+
Math.floor(dayOfEra / 1460) +
|
|
314
|
+
Math.floor(dayOfEra / 36_524) -
|
|
315
|
+
Math.floor(dayOfEra / 146_096)) /
|
|
316
|
+
365);
|
|
317
|
+
const dayOfYear = dayOfEra - (365 * yearOfEra + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100));
|
|
318
|
+
const monthFromMarch = Math.floor((5 * dayOfYear + 2) / 153);
|
|
319
|
+
const day = dayOfYear - Math.floor((153 * monthFromMarch + 2) / 5) + 1;
|
|
320
|
+
const month = monthFromMarch < 10 ? monthFromMarch + 3 : monthFromMarch - 9;
|
|
321
|
+
const year = yearOfEra + era * 400 + (month <= 2 ? 1 : 0);
|
|
322
|
+
return formatFields(year, month, day);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* A loan's repayment schedule. Each period's interest is the balance times `rate / perYear`,
|
|
326
|
+
* rounded once; the principal part is the payment minus the interest. The principal parts sum
|
|
327
|
+
* exactly to the loan, the balance never goes negative, and it ends at exactly zero: the rounding
|
|
328
|
+
* residual goes to the last payment (or, with `residual: 'lastInterest'`, to the last interest). If
|
|
329
|
+
* rounded payments clear the loan early, the schedule ends with the payment that clears it, so it
|
|
330
|
+
* can have fewer rows than `periods`. With a zero rate, the payments are
|
|
331
|
+
* `instalments(loan, periods, { remainder: 'toLast' })` (there is no interest to take a residual).
|
|
332
|
+
* The loan and the balloon must be multiples of the rounding's unit (0.01 EUR, or a policy's
|
|
333
|
+
* increment), so that every amount in the schedule is too. At most 100,000 periods.
|
|
334
|
+
*
|
|
335
|
+
* amortise(money('200000', 'EUR'), { rate: '0.045', perYear: 12, periods: 300 }).payment
|
|
336
|
+
* // 1111.66 EUR
|
|
337
|
+
*/
|
|
338
|
+
export function amortise(loan, options) {
|
|
339
|
+
const periods = options.periods;
|
|
340
|
+
const perYear = options.perYear;
|
|
341
|
+
const method = options.method ?? 'annuity';
|
|
342
|
+
const rounding = options.rounding ?? DEFAULT_ROUNDING;
|
|
343
|
+
const residual = options.residual ?? 'lastPayment';
|
|
344
|
+
const currency = loan.currency;
|
|
345
|
+
const zeroAmount = make(currency, 0, currencyExponent(currency));
|
|
346
|
+
const balloon = options.balloon ?? zeroAmount;
|
|
347
|
+
assertPeriods(periods, 1);
|
|
348
|
+
assertPositiveInteger(perYear, 'perYear');
|
|
349
|
+
if (!(loan.minor > 0)) {
|
|
350
|
+
throw new RangeError(`The loan must be positive; got ${loan}`);
|
|
351
|
+
}
|
|
352
|
+
assertSameCurrency(loan, balloon);
|
|
353
|
+
if (balloon.minor < 0 || compare(balloon, loan) > 0) {
|
|
354
|
+
throw new RangeError(`The balloon must be between zero and the loan; got ${balloon}`);
|
|
355
|
+
}
|
|
356
|
+
if (options.balloon !== undefined && method === 'interestOnly') {
|
|
357
|
+
throw new RangeError("An 'interestOnly' loan repays all of it at the end; drop the balloon");
|
|
358
|
+
}
|
|
359
|
+
if (method !== 'annuity' && method !== 'linear' && method !== 'interestOnly') {
|
|
360
|
+
invalid('method', method);
|
|
361
|
+
}
|
|
362
|
+
if (residual !== 'lastPayment' && residual !== 'lastInterest') {
|
|
363
|
+
invalid('residual', residual);
|
|
364
|
+
}
|
|
365
|
+
const unit = roundingUnit(currency, rounding);
|
|
366
|
+
if (!isMultipleOf(loan, unit) || !isMultipleOf(balloon, unit)) {
|
|
367
|
+
throw new RangeError(`The loan and the balloon must be multiples of ${unit}`);
|
|
368
|
+
}
|
|
369
|
+
const rateRatio = ratio(options.rate);
|
|
370
|
+
if (rateRatio.num < 0n) {
|
|
371
|
+
throw new RangeError(`The rate must not be negative; got ${options.rate}`);
|
|
372
|
+
}
|
|
373
|
+
// with no interest to round, there is no residual to put in it
|
|
374
|
+
if (residual === 'lastInterest' && (method !== 'annuity' || rateRatio.num === 0n)) {
|
|
375
|
+
throw new RangeError("residual 'lastInterest' applies to annuities with a non-zero rate only");
|
|
376
|
+
}
|
|
377
|
+
const dates = options.firstPayment === undefined
|
|
378
|
+
? undefined
|
|
379
|
+
: paymentDates(options.firstPayment, perYear, periods);
|
|
380
|
+
const periodicRate = ratio(rateRatio.num, rateRatio.den * BigInt(perYear));
|
|
381
|
+
const rows = [];
|
|
382
|
+
const pushRow = (payment, interestPart, principal, balance) => {
|
|
383
|
+
const period = rows.length + 1;
|
|
384
|
+
const row = dates === undefined
|
|
385
|
+
? { period, payment, interest: interestPart, principal, balance }
|
|
386
|
+
: { period, date: dates[period - 1], payment, interest: interestPart, principal, balance };
|
|
387
|
+
rows.push(row);
|
|
388
|
+
};
|
|
389
|
+
// The principal parts of a linear loan, or of any loan at a zero rate: equal parts that sum to
|
|
390
|
+
// the loan exactly, each a multiple of the rounding's unit, the remainder in the last one.
|
|
391
|
+
const isZeroRate = rateRatio.num === 0n;
|
|
392
|
+
if (method === 'linear' || (method === 'annuity' && isZeroRate)) {
|
|
393
|
+
const parts = instalments(subtract(loan, balloon), periods, {
|
|
394
|
+
remainder: 'toLast',
|
|
395
|
+
unit,
|
|
396
|
+
});
|
|
397
|
+
let balance = loan;
|
|
398
|
+
for (let i = 0; i < periods; i++) {
|
|
399
|
+
const isLast = i === periods - 1;
|
|
400
|
+
const principal = isLast ? balance : parts[i];
|
|
401
|
+
const interestPart = multiplyAndRound(balance, periodicRate, rounding);
|
|
402
|
+
balance = subtract(balance, principal);
|
|
403
|
+
pushRow(add(principal, interestPart), interestPart, principal, balance);
|
|
404
|
+
}
|
|
405
|
+
return finish(rows, currency);
|
|
406
|
+
}
|
|
407
|
+
if (method === 'interestOnly') {
|
|
408
|
+
const interestPart = multiplyAndRound(loan, periodicRate, rounding);
|
|
409
|
+
for (let i = 0; i < periods; i++) {
|
|
410
|
+
const isLast = i === periods - 1;
|
|
411
|
+
const principal = isLast ? loan : zeroAmount;
|
|
412
|
+
const balance = isLast ? zeroAmount : loan;
|
|
413
|
+
pushRow(add(principal, interestPart), interestPart, principal, balance);
|
|
414
|
+
}
|
|
415
|
+
return { payment: interestPart, rows, totalInterest: sumInterest(rows, currency) };
|
|
416
|
+
}
|
|
417
|
+
// Annuity: payment = (P·g^n − B)·r / (g^n − 1), with r = a/b and g = 1 + r = (a + b)/b. With
|
|
418
|
+
// G = (a + b)^n and H = b^n that is (P·G − B·H)·a / (b·(G − H)), and P and B are minor units
|
|
419
|
+
// over 10^scale, so the exact payment is one fraction of integers, rounded once.
|
|
420
|
+
const scale = Math.max(loan.scale, balloon.scale);
|
|
421
|
+
const loanMinor = BigInt(loan.minor) * pow10n(scale - loan.scale);
|
|
422
|
+
const balloonMinor = BigInt(balloon.minor) * pow10n(scale - balloon.scale);
|
|
423
|
+
const exponent = BigInt(periods);
|
|
424
|
+
const growthPower = (periodicRate.num + periodicRate.den) ** exponent;
|
|
425
|
+
const basePower = periodicRate.den ** exponent;
|
|
426
|
+
const payment = roundQuotient(currency, (loanMinor * growthPower - balloonMinor * basePower) * periodicRate.num, pow10n(scale) * periodicRate.den * (growthPower - basePower), rounding);
|
|
427
|
+
let balance = loan;
|
|
428
|
+
for (let i = 0; i < periods; i++) {
|
|
429
|
+
const interestPart = multiplyAndRound(balance, periodicRate, rounding);
|
|
430
|
+
const isLast = i === periods - 1;
|
|
431
|
+
const owed = add(balance, interestPart);
|
|
432
|
+
// the last payment, or a regular payment that would clear more than is owed, settles the loan
|
|
433
|
+
if (isLast || compare(payment, owed) >= 0) {
|
|
434
|
+
if (isLast && residual === 'lastInterest') {
|
|
435
|
+
const lastPayment = add(payment, balloon);
|
|
436
|
+
const lastInterest = subtract(lastPayment, balance);
|
|
437
|
+
if (lastInterest.minor < 0) {
|
|
438
|
+
throw new RangeError("The residual exceeds the last interest; use residual 'lastPayment'");
|
|
439
|
+
}
|
|
440
|
+
pushRow(lastPayment, lastInterest, balance, subtract(balance, balance));
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
pushRow(owed, interestPart, balance, subtract(balance, balance));
|
|
444
|
+
}
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
const principal = subtract(payment, interestPart);
|
|
448
|
+
balance = subtract(balance, principal);
|
|
449
|
+
pushRow(payment, interestPart, principal, balance);
|
|
450
|
+
}
|
|
451
|
+
return { payment, rows, totalInterest: sumInterest(rows, currency) };
|
|
452
|
+
}
|
|
453
|
+
function sumInterest(rows, currency) {
|
|
454
|
+
// the rows share one currency, which the generic C cannot show the type checker
|
|
455
|
+
const interestColumn = rows.map((row) => row.interest);
|
|
456
|
+
return sum(interestColumn, currency);
|
|
457
|
+
}
|
|
458
|
+
function finish(rows, currency) {
|
|
459
|
+
return { payment: rows[0].payment, rows, totalInterest: sumInterest(rows, currency) };
|
|
460
|
+
}
|
|
461
|
+
// ---------------------------------------------------------------------------------------------
|
|
462
|
+
// NPV and IRR
|
|
463
|
+
// ---------------------------------------------------------------------------------------------
|
|
464
|
+
/** The flows' minor units at one common scale, checked to share a currency. */
|
|
465
|
+
function flowMinors(flows) {
|
|
466
|
+
if (flows.length === 0) {
|
|
467
|
+
throw new RangeError('At least one cash flow is needed');
|
|
468
|
+
}
|
|
469
|
+
const first = flows[0];
|
|
470
|
+
let scale = 0;
|
|
471
|
+
for (const flow of flows) {
|
|
472
|
+
assertSameCurrency(first, flow);
|
|
473
|
+
if (flow.scale > scale) {
|
|
474
|
+
scale = flow.scale;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
const minors = flows.map((flow) => BigInt(flow.minor) * pow10n(scale - flow.scale));
|
|
478
|
+
return { minors, scale };
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Σ flowₜ · bᵗ · q^(n−t) for a rate of (q − b)/b: the NPV times q^n, by Horner's rule. q^n is
|
|
482
|
+
* positive for a rate above −1, so this has the NPV's sign.
|
|
483
|
+
*/
|
|
484
|
+
function scaledPresentValue(minors, growthNumerator, base) {
|
|
485
|
+
let accumulator = minors[0];
|
|
486
|
+
let basePower = 1n;
|
|
487
|
+
for (let i = 1; i < minors.length; i++) {
|
|
488
|
+
basePower *= base;
|
|
489
|
+
accumulator = accumulator * growthNumerator + minors[i] * basePower;
|
|
490
|
+
}
|
|
491
|
+
return accumulator;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* The discounted sum of flows at periods 0, 1, 2…, `Σ flowₜ / (1 + rate)ᵗ`, exactly: the textbook
|
|
495
|
+
* NPV, with the first flow (an initial outlay, say) not discounted. `npvExact` is Excel's form. (Not
|
|
496
|
+
* Excel's PV, which is an annuity's present value.)
|
|
497
|
+
*/
|
|
498
|
+
export function discountedSumExact(rate, flows) {
|
|
499
|
+
const [numerator, denominator] = discountedValue(rate, flows, false);
|
|
500
|
+
return new ExactMoney(flows[0].currency, numerator, denominator);
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* The discounted sum of flows at periods 0, 1, 2…, exact and rounded once (to the currency's
|
|
504
|
+
* exponent with a mode, or to a policy's scale; default 'halfExpand'). The first flow is not
|
|
505
|
+
* discounted; this is `flows[0] + npv(rate, flows.slice(1))`.
|
|
506
|
+
*
|
|
507
|
+
* discountedSum('0.08', [money('-1000', 'EUR'), money('300', 'EUR'), money('400', 'EUR'),
|
|
508
|
+
* money('500', 'EUR')], 'halfEven') // 17.63 EUR
|
|
509
|
+
*/
|
|
510
|
+
export function discountedSum(rate, flows, rounding = DEFAULT_ROUNDING) {
|
|
511
|
+
const [numerator, denominator] = discountedValue(rate, flows, false);
|
|
512
|
+
return roundQuotient(flows[0].currency, numerator, denominator, rounding);
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Excel's NPV, exactly: `Σ flowᵢ / (1 + rate)ⁱ` for i = 1, 2…, so the first flow is at the end of
|
|
516
|
+
* period 1 and is discounted once. Like Excel, an initial outlay at period 0 goes outside:
|
|
517
|
+
* `flows[0] + npv(rate, rest)`, or use `discountedSumExact`.
|
|
518
|
+
*/
|
|
519
|
+
export function npvExact(rate, flows) {
|
|
520
|
+
const [numerator, denominator] = discountedValue(rate, flows, true);
|
|
521
|
+
return new ExactMoney(flows[0].currency, numerator, denominator);
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Excel's NPV: flows at the ends of periods 1, 2…, exact and rounded once (to the currency's
|
|
525
|
+
* exponent with a mode, or to a policy's scale; default 'halfExpand'), so it matches Excel to the
|
|
526
|
+
* cent. Like Excel, an initial outlay at period 0 goes outside: `flows[0] + npv(rate, rest)`, or use
|
|
527
|
+
* `discountedSum`, which takes flows from period 0.
|
|
528
|
+
*
|
|
529
|
+
* npv('0.1', [money('-10000', 'USD'), money('3000', 'USD'), money('4200', 'USD'),
|
|
530
|
+
* money('6800', 'USD')]) // 1188.44 USD, as Excel's NPV(10%, -10000, 3000, 4200, 6800)
|
|
531
|
+
*/
|
|
532
|
+
export function npv(rate, flows, rounding = DEFAULT_ROUNDING) {
|
|
533
|
+
const [numerator, denominator] = discountedValue(rate, flows, true);
|
|
534
|
+
return roundQuotient(flows[0].currency, numerator, denominator, rounding);
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* The flows' discounted value in major units as an unreduced fraction (denominator positive), the
|
|
538
|
+
* first flow at period 0, or at period 1 when `fromPeriodOne`.
|
|
539
|
+
*/
|
|
540
|
+
function discountedValue(rate, flows, fromPeriodOne) {
|
|
541
|
+
const { minors, scale } = flowMinors(flows);
|
|
542
|
+
const rateRatio = ratio(rate);
|
|
543
|
+
const growthNumerator = rateRatio.num + rateRatio.den;
|
|
544
|
+
if (growthNumerator <= 0n) {
|
|
545
|
+
throw new RangeError(`The rate must be above -1; got ${rate}`);
|
|
546
|
+
}
|
|
547
|
+
let numerator = scaledPresentValue(minors, growthNumerator, rateRatio.den);
|
|
548
|
+
let denominator = growthNumerator ** BigInt(minors.length - 1) * pow10n(scale);
|
|
549
|
+
if (fromPeriodOne) {
|
|
550
|
+
// one more period: divide by 1 + rate = growthNumerator / den
|
|
551
|
+
numerator *= rateRatio.den;
|
|
552
|
+
denominator *= growthNumerator;
|
|
553
|
+
}
|
|
554
|
+
return [numerator, denominator];
|
|
555
|
+
}
|
|
556
|
+
function signOf(value) {
|
|
557
|
+
if (value > 0n) {
|
|
558
|
+
return 1;
|
|
559
|
+
}
|
|
560
|
+
if (value < 0n) {
|
|
561
|
+
return -1;
|
|
562
|
+
}
|
|
563
|
+
return 0;
|
|
564
|
+
}
|
|
565
|
+
/** Sign changes in the flows, zeros skipped, and the sign of the first non-zero flow. */
|
|
566
|
+
function signChanges(minors) {
|
|
567
|
+
let changes = 0;
|
|
568
|
+
let firstSign = 0;
|
|
569
|
+
let previous = 0;
|
|
570
|
+
for (const minor of minors) {
|
|
571
|
+
const sign = signOf(minor);
|
|
572
|
+
if (sign === 0) {
|
|
573
|
+
continue;
|
|
574
|
+
}
|
|
575
|
+
if (firstSign === 0) {
|
|
576
|
+
firstSign = sign;
|
|
577
|
+
}
|
|
578
|
+
if (previous !== 0 && sign !== previous) {
|
|
579
|
+
changes++;
|
|
580
|
+
}
|
|
581
|
+
previous = sign;
|
|
582
|
+
}
|
|
583
|
+
return { changes, firstSign };
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Excel's IRR, exactly: the rate at which the NPV of flows at periods 0, 1, 2… (the first value
|
|
587
|
+
* undiscounted, as in Excel's IRR) is zero. The rate is exact to `digits` decimal places (default
|
|
588
|
+
* 10), floored: `rate` is `lower`, the IRR rounded down, and the IRR lies between `lower` and
|
|
589
|
+
* `upper`, 10^−digits apart. It is a polynomial root, irrational in general, so it is found by
|
|
590
|
+
* bisection in exact integer arithmetic on the grid of `digits`-place decimals, with no floats and
|
|
591
|
+
* no Newton steps; each step checks the NPV's sign alone, by Horner's rule on integers.
|
|
592
|
+
*
|
|
593
|
+
* Where Excel guesses, this throws a RangeError. The flows never change sign: there is no IRR
|
|
594
|
+
* (Excel returns #NUM!). They change sign more than once: there can be several IRRs, and Excel
|
|
595
|
+
* returns whichever its Newton iteration from `guess` finds; here a `bracket`, which replaces
|
|
596
|
+
* `guess`, must select one, and the IRR returned is one inside it. The IRR is within 10^−digits of
|
|
597
|
+
* −1, where the NPV is undefined: ask for more digits.
|
|
598
|
+
*
|
|
599
|
+
* irr([money('-1000', 'EUR'), money('300', 'EUR'), money('400', 'EUR'), money('500', 'EUR')],
|
|
600
|
+
* { digits: 8 }) // { rate: '0.08896339', lower: '0.08896339', upper: '0.08896340' }
|
|
601
|
+
*/
|
|
602
|
+
export function irr(flows, options) {
|
|
603
|
+
const digits = options?.digits ?? 10;
|
|
604
|
+
if (!(Number.isInteger(digits) && digits >= 0 && digits <= 100)) {
|
|
605
|
+
invalid('digits', digits);
|
|
606
|
+
}
|
|
607
|
+
const { minors } = flowMinors(flows);
|
|
608
|
+
const { changes, firstSign } = signChanges(minors);
|
|
609
|
+
const bracket = options?.bracket;
|
|
610
|
+
if (changes === 0) {
|
|
611
|
+
throw new RangeError('The cash flows never change sign, so they have no IRR');
|
|
612
|
+
}
|
|
613
|
+
if (changes > 1 && bracket === undefined) {
|
|
614
|
+
throw new RangeError(`The cash flows change sign ${changes} times, so they can have several IRRs; pass a bracket`);
|
|
615
|
+
}
|
|
616
|
+
// A rate of m / 10^digits: its growth factor's numerator is 10^digits + m over 10^digits.
|
|
617
|
+
const unit = pow10n(digits);
|
|
618
|
+
const signAt = (grid) => signOf(scaledPresentValue(minors, unit + grid, unit));
|
|
619
|
+
const result = (grid) => {
|
|
620
|
+
// the NPV is undefined at -1, so a lower end there is no answer
|
|
621
|
+
if (grid <= -unit) {
|
|
622
|
+
throw new RangeError(`The IRR is within 10^-${digits} of -1; ask for more digits`);
|
|
623
|
+
}
|
|
624
|
+
const lower = formatScaled(grid, digits);
|
|
625
|
+
return { rate: lower, lower, upper: formatScaled(grid + 1n, digits) };
|
|
626
|
+
};
|
|
627
|
+
let low;
|
|
628
|
+
let high;
|
|
629
|
+
let lowSign;
|
|
630
|
+
if (bracket !== undefined) {
|
|
631
|
+
const bracketed = bracketToGrid(bracket, minors, unit, signAt);
|
|
632
|
+
if (typeof bracketed === 'bigint') {
|
|
633
|
+
return result(bracketed);
|
|
634
|
+
}
|
|
635
|
+
[low, high, lowSign] = bracketed;
|
|
636
|
+
}
|
|
637
|
+
else {
|
|
638
|
+
// One sign change: exactly one IRR above −1 (Descartes' rule in 1/(1 + rate)). The NPV has the
|
|
639
|
+
// first flow's sign for large rates and the last flow's sign near −1.
|
|
640
|
+
const zeroSign = signAt(0n);
|
|
641
|
+
if (zeroSign === 0) {
|
|
642
|
+
return result(0n);
|
|
643
|
+
}
|
|
644
|
+
if (zeroSign === firstSign) {
|
|
645
|
+
// the IRR is negative: between −1 (excluded, where the NPV has the last flow's sign) and 0
|
|
646
|
+
low = -unit;
|
|
647
|
+
high = 0n;
|
|
648
|
+
lowSign = -firstSign;
|
|
649
|
+
}
|
|
650
|
+
else {
|
|
651
|
+
// the IRR is positive: double the upper end until the NPV takes the first flow's sign
|
|
652
|
+
low = 0n;
|
|
653
|
+
high = unit;
|
|
654
|
+
lowSign = zeroSign;
|
|
655
|
+
for (;;) {
|
|
656
|
+
const highSign = signAt(high);
|
|
657
|
+
if (highSign === 0) {
|
|
658
|
+
return result(high);
|
|
659
|
+
}
|
|
660
|
+
if (highSign !== lowSign) {
|
|
661
|
+
break;
|
|
662
|
+
}
|
|
663
|
+
low = high;
|
|
664
|
+
high *= 2n;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
// Bisection on the grid: the bracket's ends stay `digits`-place decimals, so the integers stay
|
|
669
|
+
// bounded by the digits asked for, and each step halves the bracket.
|
|
670
|
+
while (high - low > 1n) {
|
|
671
|
+
const middle = (low + high) / 2n;
|
|
672
|
+
const middleSign = signAt(middle);
|
|
673
|
+
if (middleSign === 0) {
|
|
674
|
+
return result(middle);
|
|
675
|
+
}
|
|
676
|
+
if (middleSign === lowSign) {
|
|
677
|
+
low = middle;
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
high = middle;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
return result(low);
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* The caller's bracket narrowed to the grid of `unit`ths: the NPV's signs are taken at the exact
|
|
687
|
+
* bracket ends first, so the root found is one inside the bracket. Returns the grid point at or
|
|
688
|
+
* below the root when the root is already pinned to one grid step, else the grid bracket to bisect
|
|
689
|
+
* and the sign at its lower end.
|
|
690
|
+
*/
|
|
691
|
+
function bracketToGrid(bracket, minors, unit, signAt) {
|
|
692
|
+
const lowRate = ratio(bracket[0]);
|
|
693
|
+
const highRate = ratio(bracket[1]);
|
|
694
|
+
if (!(lowRate.num * highRate.den < highRate.num * lowRate.den)) {
|
|
695
|
+
throw new RangeError('The bracket must be two increasing rates');
|
|
696
|
+
}
|
|
697
|
+
if (lowRate.num + lowRate.den <= 0n) {
|
|
698
|
+
throw new RangeError('The bracket must be above -1');
|
|
699
|
+
}
|
|
700
|
+
const signAtRate = (rate) => signOf(scaledPresentValue(minors, rate.num + rate.den, rate.den));
|
|
701
|
+
const lowSign = signAtRate(lowRate);
|
|
702
|
+
const highSign = signAtRate(highRate);
|
|
703
|
+
// an end that is itself a root: the grid point at or below it
|
|
704
|
+
if (lowSign === 0) {
|
|
705
|
+
return floorDivide(lowRate.num * unit, lowRate.den);
|
|
706
|
+
}
|
|
707
|
+
if (highSign === 0) {
|
|
708
|
+
return floorDivide(highRate.num * unit, highRate.den);
|
|
709
|
+
}
|
|
710
|
+
if (lowSign === highSign) {
|
|
711
|
+
throw new RangeError('The NPV has the same sign at both ends of the bracket');
|
|
712
|
+
}
|
|
713
|
+
// the grid points inside the bracket
|
|
714
|
+
const gridLow = -floorDivide(-lowRate.num * unit, lowRate.den);
|
|
715
|
+
const gridHigh = floorDivide(highRate.num * unit, highRate.den);
|
|
716
|
+
if (gridLow > gridHigh) {
|
|
717
|
+
// no grid point inside: the root is between the two around the bracket
|
|
718
|
+
return gridHigh;
|
|
719
|
+
}
|
|
720
|
+
const gridLowSign = signAt(gridLow);
|
|
721
|
+
if (gridLowSign === 0) {
|
|
722
|
+
return gridLow;
|
|
723
|
+
}
|
|
724
|
+
if (gridLowSign !== lowSign) {
|
|
725
|
+
// the sign changes between the bracket's low end and the first grid point
|
|
726
|
+
return gridLow - 1n;
|
|
727
|
+
}
|
|
728
|
+
const gridHighSign = gridHigh === gridLow ? gridLowSign : signAt(gridHigh);
|
|
729
|
+
if (gridHighSign === 0) {
|
|
730
|
+
return gridHigh;
|
|
731
|
+
}
|
|
732
|
+
if (gridHighSign === lowSign) {
|
|
733
|
+
// the sign changes between the last grid point and the bracket's high end
|
|
734
|
+
return gridHigh;
|
|
735
|
+
}
|
|
736
|
+
return [gridLow, gridHigh, lowSign];
|
|
737
|
+
}
|
|
738
|
+
function floorDivide(dividend, divisor) {
|
|
739
|
+
const quotient = dividend / divisor;
|
|
740
|
+
// bigint division truncates; step down when a negative quotient left a remainder
|
|
741
|
+
return dividend % divisor !== 0n && dividend < 0n !== divisor < 0n ? quotient - 1n : quotient;
|
|
742
|
+
}
|
|
743
|
+
const DATE_TIME_RE = /^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/;
|
|
744
|
+
/** The instant as a count of `unit`s since 1970-01-01T00:00:00Z. */
|
|
745
|
+
function instantCount(instant, unit) {
|
|
746
|
+
if (unit !== 'day' && unit !== 'second') {
|
|
747
|
+
invalid('unit', unit);
|
|
748
|
+
}
|
|
749
|
+
if (typeof instant === 'number') {
|
|
750
|
+
if (unit !== 'second' || !Number.isSafeInteger(instant)) {
|
|
751
|
+
throw new RangeError(`Unix time ${instant} needs whole seconds and unit 'second'`);
|
|
752
|
+
}
|
|
753
|
+
return instant;
|
|
754
|
+
}
|
|
755
|
+
if (typeof instant === 'string' && instant.length > 10) {
|
|
756
|
+
const match = DATE_TIME_RE.exec(instant);
|
|
757
|
+
if (unit !== 'second' || match === null) {
|
|
758
|
+
throw new RangeError(`Invalid instant "${instant}" (YYYY-MM-DDTHH:MM:SSZ, unit 'second')`);
|
|
759
|
+
}
|
|
760
|
+
const hours = Number(match[2]);
|
|
761
|
+
const minutes = Number(match[3]);
|
|
762
|
+
const seconds = Number(match[4]);
|
|
763
|
+
if (hours > 23 || minutes > 59 || seconds > 59) {
|
|
764
|
+
throw new RangeError(`Invalid instant "${instant}"`);
|
|
765
|
+
}
|
|
766
|
+
return dayNumber(dateFields(match[1])) * 86_400 + hours * 3600 + minutes * 60 + seconds;
|
|
767
|
+
}
|
|
768
|
+
const days = dayNumber(dateFields(instant));
|
|
769
|
+
return unit === 'day' ? days : days * 86_400;
|
|
770
|
+
}
|
|
771
|
+
function spanOf(period, unit) {
|
|
772
|
+
const start = instantCount(period.start, unit);
|
|
773
|
+
const end = instantCount(period.end, unit);
|
|
774
|
+
if (!(end > start)) {
|
|
775
|
+
throw new RangeError('A period must end after it starts');
|
|
776
|
+
}
|
|
777
|
+
return { start, end };
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* The part of `price` for the `used` part of a billing `period`: `price × used / period`, counted in
|
|
781
|
+
* days (or seconds), exact and rounded once (to the currency's exponent with a mode, or to a
|
|
782
|
+
* policy's scale; default 'halfExpand'). Periods are end-exclusive.
|
|
783
|
+
*
|
|
784
|
+
* prorate(money('30', 'EUR'), {
|
|
785
|
+
* period: { start: '2026-03-01', end: '2026-04-01' },
|
|
786
|
+
* used: { start: '2026-03-11', end: '2026-04-01' },
|
|
787
|
+
* }, 'halfEven') // 20.32 EUR (21 of 31 days)
|
|
788
|
+
*/
|
|
789
|
+
export function prorate(price, options, rounding = DEFAULT_ROUNDING) {
|
|
790
|
+
const unit = options.unit ?? 'day';
|
|
791
|
+
const period = spanOf(options.period, unit);
|
|
792
|
+
const usedStart = instantCount(options.used.start, unit);
|
|
793
|
+
const usedEnd = instantCount(options.used.end, unit);
|
|
794
|
+
if (!(usedStart >= period.start && usedEnd <= period.end && usedEnd >= usedStart)) {
|
|
795
|
+
throw new RangeError('The used part must lie inside the period');
|
|
796
|
+
}
|
|
797
|
+
const fraction = ratio(BigInt(usedEnd - usedStart), BigInt(period.end - period.start));
|
|
798
|
+
return multiplyAndRound(price, fraction, rounding);
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Splits one period's price at change points (plan changes), in proportion to the days (or seconds)
|
|
802
|
+
* in each piece, through `allocate`, so the pieces always sum exactly to the price.
|
|
803
|
+
*
|
|
804
|
+
* splitPeriod(money('30', 'EUR'), {
|
|
805
|
+
* period: { start: '2026-03-01', end: '2026-04-01' },
|
|
806
|
+
* at: ['2026-03-11', '2026-03-20'],
|
|
807
|
+
* }) // [9.68 EUR, 8.71 EUR, 11.61 EUR]
|
|
808
|
+
*/
|
|
809
|
+
export function splitPeriod(price, options) {
|
|
810
|
+
const unit = options.unit ?? 'day';
|
|
811
|
+
const period = spanOf(options.period, unit);
|
|
812
|
+
const weights = [];
|
|
813
|
+
let previous = period.start;
|
|
814
|
+
for (const point of options.at) {
|
|
815
|
+
const count = instantCount(point, unit);
|
|
816
|
+
if (!(count > previous && count < period.end)) {
|
|
817
|
+
throw new RangeError('Change points must increase and lie strictly inside the period');
|
|
818
|
+
}
|
|
819
|
+
weights.push(count - previous);
|
|
820
|
+
previous = count;
|
|
821
|
+
}
|
|
822
|
+
weights.push(period.end - previous);
|
|
823
|
+
return allocate(price, weights, { remainder: options.remainder ?? 'largest' });
|
|
824
|
+
}
|
|
825
|
+
//# sourceMappingURL=finance.js.map
|