UNPKG

@mixxtor/currencyx-js

Version:

Modern TypeScript currency converter with type inference and multiple providers (Google Finance, Fixer.io). Framework agnostic with clean architecture.

507 lines (503 loc) 56.9 kB
import axios from 'axios'; import * as cheerio from 'cheerio'; // CurrencyX.js - Modern TypeScript currency converter // src/data/currencies.ts var CURRENCIES = [ { code: "AED", numeric_code: "784", name: "United Arab Emirates dirham", symbol: "\u062F.\u0625", round: 1, decimal: 2, delimiter: ".", short_format: "Dhs. {{amount}}", explicit_format: "Dhs. {{amount}} AED", countries: ["AE"] }, { code: "AFN", numeric_code: "971", name: "Afghan afghani", symbol: "\u060B", round: 100, decimal: 2, delimiter: ",", short_format: "{{amount}}\u060B", explicit_format: "{{amount}}\u060B AFN", countries: ["AF"] }, { code: "ALL", numeric_code: "008", name: "Albanian lek", symbol: "Lek", round: 100, decimal: 2, delimiter: ",", short_format: "Lek {{amount}}", explicit_format: "Lek {{amount}} ALL", countries: ["AL"] }, { code: "AMD", numeric_code: "051", name: "Armenian dram", symbol: "\u058F", round: 100, decimal: 2, delimiter: ",", short_format: "{{amount}} AMD", explicit_format: "{{amount}} AMD", countries: ["AM"] }, { code: "ANG", numeric_code: "532", name: "Netherlands Antillean guilder", symbol: "\u0192", round: 1, decimal: 2, delimiter: ",", short_format: "\u0192;{{amount}}", explicit_format: "{{amount}} NA\u0192;", countries: ["CW", "SX"] }, { code: "AOA", numeric_code: "973", name: "Angolan kwanza", symbol: "Kz", round: 100, decimal: 2, delimiter: ",", short_format: "Kz{{amount}}", explicit_format: "Kz{{amount}} AOA", countries: ["AO"] }, { code: "ARS", numeric_code: "032", name: "Argentine peso", symbol: "AR$", round: 1, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} ARS", countries: ["AR"] }, { code: "AUD", numeric_code: "036", name: "Australian dollar", symbol: "AU$", round: 1, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} AUD", countries: ["AU", "CX", "CC", "HM", "KI", "NR", "NF", "TV"] }, { code: "AWG", numeric_code: "533", name: "Aruban florin", symbol: "Afl.", round: 1, decimal: 2, delimiter: ",", short_format: "Afl{{amount}}", explicit_format: "Afl{{amount}} AWG", countries: ["AW"] }, { code: "AZN", numeric_code: "944", name: "Azerbaijani manat", symbol: "\u20BC", round: 1, decimal: 2, delimiter: ",", short_format: "m.{{amount}}", explicit_format: "m.{{amount}} AZN", countries: ["AZ"] }, { code: "BAM", numeric_code: "977", name: "Bosnia and Herzegovina convertible mark", symbol: "KM", round: 1, decimal: 2, delimiter: ",", short_format: "KM {{amount}}", explicit_format: "KM {{amount}} BAM", countries: ["BA"] }, { code: "BBD", numeric_code: "052", name: "Barbados dollar", symbol: "$", round: 1, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} Bds", countries: ["BB"] }, { code: "BDT", numeric_code: "050", name: "Bangladeshi taka", symbol: "\u09F3", round: 100, decimal: 2, delimiter: ",", short_format: "Tk {{amount}}", explicit_format: "Tk {{amount}} BDT", countries: ["BD"] }, { code: "BGN", numeric_code: "975", name: "Bulgarian lev", symbol: "\u043B\u0432", round: 1, decimal: 2, delimiter: ",", short_format: "{{amount}} \u043B\u0432", explicit_format: "{{amount}} \u043B\u0432 BGN", countries: ["BG"] }, { code: "BHD", numeric_code: "048", name: "Bahraini dinar", symbol: ".\u062F.\u0628", round: 0, decimal: 0, delimiter: ",", short_format: "{{amount}} BD", explicit_format: "{{amount}} BHD", countries: ["BH"] }, { code: "BIF", numeric_code: "108", name: "Burundian franc", symbol: "FBu", round: 1e3, decimal: 0, delimiter: ",", short_format: "FBu. {{amount}}", explicit_format: "FBu. {{amount}} BIF", countries: ["BI"] }, { code: "BMD", numeric_code: "060", name: "Bermudian dollar", symbol: "$", round: 1, decimal: 2, delimiter: ",", short_format: "BD${{amount}}", explicit_format: "BD${{amount}} BMD", countries: ["BM"] }, { code: "BND", numeric_code: "096", name: "Brunei dollar", symbol: "BN$", round: 1, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} BND", countries: ["BN"] }, { code: "BOB", numeric_code: "068", name: "Boliviano", symbol: "Bs", round: 1, decimal: 2, delimiter: ",", short_format: "Bs{{amount}}", explicit_format: "Bs{{amount}} BOB", countries: ["BO"] }, // { code: "BOV", numeric_code: "984", name: "Bolivian Mvdol (funds code)", symbol: "", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["BO"] }, { code: "BRL", numeric_code: "986", name: "Brazilian real", symbol: "R$", round: 1, decimal: 2, delimiter: ",", short_format: "R$ {{amount}}", explicit_format: "R$ {{amount}} BRL", countries: ["BR"] }, { code: "BSD", numeric_code: "044", name: "Bahamian dollar", symbol: "$", round: 1, decimal: 2, delimiter: ",", short_format: "BS${{amount}}", explicit_format: "BS${{amount}} BSD", countries: ["BS"] }, { code: "BTC", numeric_code: "BTC", name: "Bitcoin", symbol: "\u20BF", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, { code: "BTN", numeric_code: "064", name: "Bhutanese ngultrum", symbol: "Nu.", round: 0, decimal: 0, delimiter: ",", short_format: "Nu {{amount}}", explicit_format: "Nu {{amount}} BTN", countries: ["BT"] }, { code: "BWP", numeric_code: "072", name: "Botswana pula", symbol: "P", round: 1, decimal: 2, delimiter: ",", short_format: "P{{amount}}", explicit_format: "P{{amount}} BWP", countries: ["BW"] }, { code: "BYR", numeric_code: "974", name: "Belarusian ruble (pre-2016)", symbol: "Rbl", round: 0, decimal: 0, delimiter: ",", short_format: "Br {{amount}}", explicit_format: "Br {{amount}} BYR", countries: ["BY"] }, { code: "BYN", numeric_code: "933", name: "Belarusian ruble", symbol: "Rbl", round: 0, decimal: 0, delimiter: ",", short_format: "Br {{amount}}", explicit_format: "Br {{amount}} BYN", countries: ["BY"] }, { code: "BZD", numeric_code: "084", name: "Belize dollar", symbol: "BZ$", round: 1, decimal: 2, delimiter: ",", short_format: "BZ${{amount}}", explicit_format: "BZ${{amount}} BZD", countries: ["BZ"] }, { code: "CAD", numeric_code: "124", name: "Canadian dollar", symbol: "CA$", round: 1, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} CAD", countries: ["CA"] }, { code: "CDF", numeric_code: "976", name: "Congolese franc", symbol: "FC", round: 1e3, decimal: 2, delimiter: ",", short_format: "FC{{amount}}", explicit_format: "FC{{amount}} CDF", countries: ["CD"] }, // { code: "CHE", numeric_code: "947", name: "WIR euro (complementary currency)", symbol: "CHE", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["CH"] }, { code: "CHF", numeric_code: "756", name: "Swiss franc", symbol: "S\u20A3", round: 1, decimal: 2, delimiter: ",", short_format: "S\u20A3{{amount}}", explicit_format: "S\u20A3{{amount}} CHF", countries: ["CH", "LI"] }, // { code: "CHW", numeric_code: "948", name: "WIR franc (complementary currency)", symbol: "CHW", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["CH"] }, { code: "CLF", numeric_code: "990", name: "Chilean Unit of Account (UF)", symbol: "UF", round: 0, decimal: 0, delimiter: ",", short_format: "UF {{amount}}", explicit_format: "UF{{amount}} CLF", countries: ["CL"] }, { code: "CLP", numeric_code: "152", name: "Chilean peso", symbol: "CL$", round: 100, decimal: 0, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} CLP", countries: ["CL"] }, { code: "CNY", numeric_code: "156", name: "Renminbi", symbol: "CN\xA5", round: 1, decimal: 2, delimiter: ",", short_format: "\xA5{{amount}}", explicit_format: "\xA5{{amount}} CNY", countries: ["CN"] }, { code: "COP", numeric_code: "170", name: "Colombian peso", symbol: "CO$", round: 1e3, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} COP", countries: ["CO"] }, // { code: "COU", numeric_code: "970", name: "Unidad de Valor Real (UVR) (funds code)", symbol: "COU", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["CO"] }, { code: "CRC", numeric_code: "188", name: "Costa Rican colon", symbol: "\u20A1", round: 100, decimal: 2, delimiter: ",", short_format: "\u20A1{{amount}}", explicit_format: "\u20A1 {{amount}} CRC", countries: ["CR"] }, { code: "CUC", numeric_code: "931", name: "Cuban convertible peso (pre-2022)", symbol: "$", round: 0, decimal: 0, delimiter: ",", short_format: "${{amount}}", explicit_format: "CUC${{amount}} CUC", countries: ["CU"] }, { code: "CUP", numeric_code: "192", name: "Cuban peso", symbol: "$", round: 10, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "$MN {{amount}} CUP", countries: ["CU"] }, { code: "CVE", numeric_code: "132", name: "Cape Verdean escudo", symbol: "CV$", round: 100, decimal: 2, delimiter: ",", short_format: "{{amount}}$", explicit_format: "{{amount}}$ CVE", countries: ["CV"] }, { code: "CZK", numeric_code: "203", name: "Czech koruna", symbol: "K\u010D", round: 1, decimal: 2, delimiter: ",", short_format: "{{amount}} K\u010D", explicit_format: "{{amount}} K\u010D", countries: ["CZ"] }, { code: "DJF", numeric_code: "262", name: "Djiboutian franc", symbol: "Fdj", round: 100, decimal: 0, delimiter: ",", short_format: "{{amount}} Fdj", explicit_format: "{{amount}} DJF", countries: ["DJ"] }, { code: "DKK", numeric_code: "208", name: "Danish krone", symbol: "kr.", round: 1, decimal: 2, delimiter: ",", short_format: "{{amount}} kr", explicit_format: "{{amount}} DKK", countries: ["DK", "FO", "GL"] }, { code: "DOP", numeric_code: "214", name: "Dominican peso", symbol: "RD$", round: 100, decimal: 2, delimiter: ",", short_format: "RD$ {{amount}}", explicit_format: "RD$ {{amount}}", countries: ["DO"] }, { code: "DZD", numeric_code: "012", name: "Algerian dinar", symbol: "DA", round: 100, decimal: 2, delimiter: ",", short_format: "DA {{amount}}", explicit_format: "DA {{amount}} DZD", countries: ["DZ"] }, { code: "EGP", numeric_code: "818", name: "Egyptian pound", symbol: "E\xA3", round: 1, decimal: 2, delimiter: ",", short_format: "LE {{amount}}", explicit_format: "LE {{amount}} EGP", countries: ["EG"] }, { code: "ERN", numeric_code: "232", name: "Eritrean nakfa", symbol: "Nfk", round: 1, decimal: 2, delimiter: ",", short_format: "Nkf {{amount}}", explicit_format: "Nkf {{amount}} ERN", countries: ["ER"] }, { code: "ETB", numeric_code: "230", name: "Ethiopian birr", symbol: "Br", round: 1, decimal: 2, delimiter: ",", short_format: "Br{{amount}}", explicit_format: "Br{{amount}} ETB", countries: ["ET"] }, { code: "EUR", numeric_code: "978", name: "Euro", symbol: "\u20AC", round: 0.95, decimal: 2, delimiter: ",", short_format: "\u20AC{{amount}}", explicit_format: "\u20AC{{amount}} EUR", countries: ["AX", "EU", "AD", "AT", "BE", "HR", "CY", "EE", "FI", "FR", "GF", "TF", "DE", "GR", "GP", "IE", "IT", "XK", "LV", "LT", "LU", "MT", "MQ", "YT", "MC", "ME", "NL", "PT", "RE", "BL", "MF", "PM", "SM", "SK", "SI", "ES", "VA"] }, { code: "FJD", numeric_code: "242", name: "Fiji dollar", symbol: "$", round: 1, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "FJ${{amount}}", countries: ["FJ"] }, { code: "FKP", numeric_code: "238", name: "Falkland Islands pound", symbol: "\xA3", round: 1, decimal: 2, delimiter: ",", short_format: "\xA3{{amount}}", explicit_format: "\xA3{{amount}} FKP", countries: ["FK"] }, { code: "GBP", numeric_code: "826", name: "Pound sterling", symbol: "\xA3", round: 1, decimal: 2, delimiter: ",", short_format: "\xA3{{amount}}", explicit_format: "\xA3{{amount}} GBP", countries: ["UK", "IM", "JE", "GG", "SH-TA"] }, { code: "GEL", numeric_code: "981", name: "Georgian lari", symbol: "\u20BE", round: 1, decimal: 2, delimiter: ",", short_format: "\u20BE{{amount}}", explicit_format: "\u20BE{{amount}} GEL", countries: ["GE"] }, { code: "GHS", numeric_code: "936", name: "Ghanaian cedi", symbol: "GH\u20B5", round: 1, decimal: 2, delimiter: ",", short_format: "GH\u20B5{{amount}}", explicit_format: "GH\u20B5{{amount}}", countries: ["GH"] }, { code: "GIP", numeric_code: "292", name: "Gibraltar pound", symbol: "\xA3", round: 1, decimal: 2, delimiter: ",", short_format: "\xA3{{amount}}", explicit_format: "\xA3{{amount}} GIP", countries: ["GI"] }, { code: "GMD", numeric_code: "270", name: "Gambian dalasi", symbol: "D", round: 1, decimal: 2, delimiter: ",", short_format: "D {{amount}}", explicit_format: "D {{amount}} GMD", countries: ["GM"] }, { code: "GNF", numeric_code: "324", name: "Guinean franc", symbol: "FG", round: 1e3, decimal: 0, delimiter: ",", short_format: "FG {{amount}}", explicit_format: "FG {{amount}} GNF", countries: ["GN"] }, { code: "GTQ", numeric_code: "320", name: "Guatemalan quetzal", symbol: "Q", round: 1, decimal: 2, delimiter: ",", short_format: "Q {{amount}}", explicit_format: "Q{{amount}} GTQ", countries: ["GT"] }, { code: "GYD", numeric_code: "328", name: "Guyanese dollar", symbol: "G$", round: 100, decimal: 2, delimiter: ",", short_format: "G$ ${{amount}}", explicit_format: "${{amount}} GYD", countries: ["GY"] }, { code: "HKD", numeric_code: "344", name: "Hong Kong dollar", symbol: "HK$", round: 1, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "HK${{amount}}", countries: ["HK"] }, { code: "HNL", numeric_code: "340", name: "Honduran lempira", symbol: "L", round: 1, decimal: 2, delimiter: ",", short_format: "L{{amount}}", explicit_format: "L {{amount}} HNL", countries: ["HN"] }, { code: "HRK", numeric_code: "191", name: "Croatian dinar (pre-2023)", symbol: "kn", round: 1, decimal: 2, delimiter: ",", short_format: "kn{{amount}}", explicit_format: "kn{{amount}} HRK", countries: ["HR"] }, { code: "HTG", numeric_code: "332", name: "Haitian gourde", symbol: "G", round: 100, decimal: 2, delimiter: ",", short_format: "G {{amount}}", explicit_format: "{{amount}} HTG", countries: ["HT"] }, { code: "HUF", numeric_code: "348", name: "Hungarian forint", symbol: "Ft", round: 100, decimal: 2, delimiter: ",", short_format: "{{amount}} Ft", explicit_format: "{{amount}} Ft", countries: ["HU"] }, { code: "IDR", numeric_code: "360", name: "Indonesian rupiah", symbol: "Rp", round: 1e3, decimal: 2, delimiter: ",", short_format: "Rp {{amount}}", explicit_format: "Rp {{amount}} IDR", countries: ["ID"] }, { code: "ILS", numeric_code: "376", name: "Israeli new shekel", symbol: "\u20AA", round: 1, decimal: 2, delimiter: ",", short_format: "\u20AA{{amount}}", explicit_format: "{{amount}} NIS", countries: ["IL"] }, { code: "INR", numeric_code: "356", name: "Indian rupee", symbol: "\u20B9", round: 100, decimal: 2, delimiter: ",", short_format: "\u20B9{{amount}}", explicit_format: "Rs. {{amount}}", countries: ["IN", "BT"] }, { code: "IQD", numeric_code: "368", name: "Iraqi dinar", symbol: "\u062F.\u0639", round: 0, decimal: 0, delimiter: ",", short_format: "{{amount}} IQD", explicit_format: "{{amount}} IQD", countries: ["IQ"] }, { code: "IRR", numeric_code: "364", name: "Iranian rial", symbol: "\uFDFC", round: 1e3, decimal: 0, delimiter: ",", short_format: "\uFDFC {{amount}}", explicit_format: "\uFDFC {{amount}} IRR", countries: ["IR"] }, { code: "ISK", numeric_code: "352", name: "Icelandic kr\xF3na (plural: kr\xF3nur)", symbol: "Ikr", round: 100, decimal: 0, delimiter: ",", short_format: "{{amount}} kr", explicit_format: "{{amount}} ISK", countries: ["IS"] }, { code: "JMD", numeric_code: "388", name: "Jamaican dollar", symbol: "J$", round: 100, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} JMD", countries: ["JM"] }, { code: "JOD", numeric_code: "400", name: "Jordanian dinar", symbol: "\u062F.\u0623", round: 0, decimal: 0, delimiter: ",", short_format: "{{amount}} JD", explicit_format: "{{amount}} JOD", countries: ["JO"] }, { code: "JPY", numeric_code: "392", name: "Japanese yen", symbol: "\xA5", round: 100, decimal: 0, delimiter: ",", short_format: "\xA5{{amount}}", explicit_format: "\xA5{{amount}} JPY", countries: ["JP"] }, { code: "KES", numeric_code: "404", name: "Kenyan shilling", symbol: "Ksh", round: 100, decimal: 2, delimiter: ",", short_format: "KSh{{amount}}", explicit_format: "KSh{{amount}}", countries: ["KE"] }, { code: "KGS", numeric_code: "417", name: "Kyrgyzstani som", symbol: "\u043B\u0432", round: 100, decimal: 2, delimiter: ",", short_format: "\u043B\u0432{{amount}}", explicit_format: "\u043B\u0432{{amount}}", countries: ["KG"] }, { code: "KHR", numeric_code: "116", name: "Cambodian riel", symbol: "\u17DB", round: 1e3, decimal: 2, delimiter: ",", short_format: "KHR{{amount}}", explicit_format: "KHR{{amount}}", countries: ["KH"] }, { code: "KMF", numeric_code: "174", name: "Comoro franc", symbol: "CF", round: 100, decimal: 0, delimiter: ",", short_format: "{{amount}} CF", explicit_format: "{{amount}} CF", countries: ["KM"] }, { code: "KPW", numeric_code: "408", name: "North Korean won", symbol: "\u20A9", round: 0, decimal: 0, delimiter: ",", short_format: "\u20A9{{amount}}", explicit_format: "\u20A9{{amount}} KPW", countries: ["KP"] }, { code: "KRW", numeric_code: "410", name: "South Korean won", symbol: "\u20A9", round: 1e3, decimal: 0, delimiter: ",", short_format: "\u20A9{{amount}}", explicit_format: "\u20A9{{amount}} KRW", countries: ["KR"] }, { code: "KWD", numeric_code: "414", name: "Kuwaiti dinar", symbol: "KD", round: 0, decimal: 0, delimiter: ",", short_format: "{{amount}} KD", explicit_format: "{{amount}} KWD", countries: ["KW"] }, { code: "KYD", numeric_code: "136", name: "Cayman Islands dollar", symbol: "CI$", round: 1, decimal: 2, delimiter: ",", short_format: "${{amount}}", explicit_format: "${{amount}} KYD", countries: ["KY"] }, { code: "KZT", numeric_code: "398", name: "Kazakhstani tenge", symbol: "\u20B8", round: 100, decimal: 2, delimiter: ",", short_format: "\u20B8{{amount}}", explicit_format: "\u20B8{{amount}} KZT", countries: ["KZ"] }, { code: "LAK", numeric_code: "418", name: "Lao kip", symbol: "\u20AD", round: 1e3, decimal: 2, delimiter: ",", short_format: "\u20AD{{amount}}", explicit_format: "\u20AD{{amount}} LAK", countries: ["LA"] }, { code: "LBP", numeric_code: "422", name: "Lebanese pound", symbol: "\u0644", round: 1e3, decimal: 2, delimiter: ",", short_format: "L\xA3{{amount}}", explicit_format: "L\xA3{{amount}} LBP", countries: ["LB"] }, { code: "LKR", numeric_code: "144", name: "Sri Lankan rupee", symbol: "\u0DBB\u0DD4", round: 100, decimal: 2, delimiter: ",", short_format: "Rs {{amount}}", explicit_format: "Rs {{amount}} LKR", countries: ["LK"] }, { code: "LRD", numeric_code: "430", name: "Liberian dollar", symbol: "L$", round: 100, decimal: 2, delimiter: ",", short_format: "L${{amount}}", explicit_format: "L${{amount}} LRD", countries: ["LR"] }, { code: "LSL", numeric_code: "426", name: "Lesotho loti", symbol: "M", round: 1, decimal: 2, delimiter: ",", short_format: "M{{amount}}", explicit_format: "M{{amount}} LSL", countries: ["LS"] }, { code: "LTL", numeric_code: "440", name: "Lithuanian litas (pre-1993)", symbol: "Lt", round: 0, decimal: 0, delimiter: ",", short_format: "Lt {{amount}}", explicit_format: "Lt {{amount}} LTL", countries: ["LT"] }, { code: "LVL", numeric_code: "428", name: "Latvian lats (pre-1993)", symbol: "\u2112\uFE01\u{1D4C8}", round: 0, decimal: 0, delimiter: ",", short_format: "Ls {{amount}}", explicit_format: "Ls {{amount}} LVL", countries: ["LV"] }, { code: "LYD", numeric_code: "434", name: "Libyan dinar", symbol: "\u0644.\u062F", round: 0, decimal: 0, delimiter: ",", short_format: "LD {{amount}}", explicit_format: "LD {{amount}} LYD", countries: ["LY"] }, { code: "MAD", numeric_code: "504", name: "Moroccan dirham", symbol: ".\u062F.\u0645", round: 1, decimal: 2, delimiter: ",", short_format: "{{amount}} dh", explicit_format: "Dh {{amount}} MAD", countries: ["MA", "EH"] }, { code: "MDL", numeric_code: "498", name: "Moldovan leu", symbol: "MDL", round: 1, decimal: 2, delimiter: ",", short_format: "{{amount}} MDL", explicit_format: "{{amount}} MDL", countries: ["MD"] }, { code: "MGA", numeric_code: "969", name: "Malagasy ariary", symbol: "Ar", round: 0, decimal: 0, delimiter: ",", short_format: "Ar {{amount}}", explicit_format: "Ar {{amount}} MGA", countries: ["MG"] }, { code: "MKD", numeric_code: "807", name: "Macedonian denar", symbol: "MKD", round: 100, decimal: 2, delimiter: ",", short_format: "\u0434\u0435\u043D{{amount}}", explicit_format: "\u0434\u0435\u043D{{amount}} MKD", countries: ["MK"] }, { code: "MMK", numeric_code: "104", name: "Myanmar kyat", symbol: "K", round: 1e3, decimal: 2, delimiter: ",", short_format: "K{{amount}}", explicit_format: "K{{amount}} MMK", countries: ["MM"] }, { code: "MNT", numeric_code: "496", name: "Mongolian t\xF6gr\xF6g", symbol: "\u20AE", round: 1e3, decimal: 2, delimiter: ",", short_format: "{{amount}} \u20AE", explicit_format: "{{amount}} MNT", countries: ["MN"] }, { code: "MOP", numeric_code: "446", name: "Macanese pataca", symbol: "MOP$", round: 1, decimal: 2, delimiter: ",", short_format: "MOP${{amount}}", explicit_format: "MOP${{amount}}", countries: ["MO"] }, // { code: "MRU", numeric_code: "929", name: "Mauritanian ouguiya", symbol: "UM", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MR"] }, { code: "MRO", numeric_code: "478", name: "Mauritanian ouguiya (legacy code) [1973\u20132017]", symbol: "UM", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MR"] }, { code: "MUR", numeric_code: "480", name: "Mauritian rupee", symbol: "MURs", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MU"] }, { code: "MVR", numeric_code: "462", name: "Maldivian rufiyaa", symbol: "MVR", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MV"] }, { code: "MWK", numeric_code: "454", name: "Malawian kwacha", symbol: "MWK", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MW"] }, { code: "MXN", numeric_code: "484", name: "Mexican peso", symbol: "MX$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MX"] }, // { code: "MXV", numeric_code: "979", name: "Mexican Unidad de Inversion (UDI) (funds code)", symbol: "MXV", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MX"] }, { code: "MYR", numeric_code: "458", name: "Malaysian ringgit", symbol: "RM", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MY"] }, { code: "MZN", numeric_code: "943", name: "Mozambican metical", symbol: "MTn", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["MZ"] }, { code: "NAD", numeric_code: "516", name: "Namibian dollar", symbol: "N$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["NA"] }, { code: "NGN", numeric_code: "566", name: "Nigerian naira", symbol: "\u20A6", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["NG"] }, { code: "NIO", numeric_code: "558", name: "Nicaraguan c\xF3rdoba", symbol: "C$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["NI"] }, { code: "NOK", numeric_code: "578", name: "Norwegian krone", symbol: "Nkr", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["NO", "SJ", "BV"] }, { code: "NPR", numeric_code: "524", name: "Nepalese rupee", symbol: "NPRs", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["NP"] }, { code: "NZD", numeric_code: "554", name: "New Zealand dollar", symbol: "NZ$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["NZ", "CK", "NU", "PN", "TK"] }, { code: "OMR", numeric_code: "512", name: "Omani rial", symbol: "OMR", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["OM"] }, { code: "PAB", numeric_code: "590", name: "Panamanian balboa", symbol: "B/.", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["PA"] }, { code: "PEN", numeric_code: "604", name: "Peruvian sol", symbol: "S/.", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["PE"] }, { code: "PGK", numeric_code: "598", name: "Papua New Guinean kina", symbol: "PGK", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["PG"] }, { code: "PHP", numeric_code: "608", name: "Philippine peso", symbol: "\u20B1", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["PH"] }, { code: "PKR", numeric_code: "586", name: "Pakistani rupee", symbol: "PKRs", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["PK"] }, { code: "PLN", numeric_code: "985", name: "Polish z\u0142oty", symbol: "z\u0142", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["PL"] }, { code: "PYG", numeric_code: "600", name: "Paraguayan guaran\xED", symbol: "\u20B2", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["PY"] }, { code: "QAR", numeric_code: "634", name: "Qatari riyal", symbol: "QR", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["QA"] }, { code: "RON", numeric_code: "946", name: "Romanian leu", symbol: "RON", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["RO"] }, // { code: "RSD", numeric_code: "941", name: "Serbian dinar", symbol: "RSD", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["RS"] }, { code: "RUB", numeric_code: "643", name: "Russian ruble", symbol: "RUB", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["RU"] }, { code: "RWF", numeric_code: "646", name: "Rwandan franc", symbol: "RWF", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["RW"] }, { code: "SAR", numeric_code: "682", name: "Saudi riyal", symbol: "SR", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SA"] }, { code: "SBD", numeric_code: "090", name: "Solomon Islands dollar", symbol: "SBD", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SB"] }, { code: "SCR", numeric_code: "690", name: "Seychelles rupee", symbol: "SCR", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SC"] }, { code: "SDG", numeric_code: "938", name: "Sudanese pound", symbol: "SDG", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SD"] }, { code: "SEK", numeric_code: "752", name: "Swedish krona (plural: kronor)", symbol: "Skr", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SE"] }, { code: "SGD", numeric_code: "702", name: "Singapore dollar", symbol: "S$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SG"] }, { code: "SHP", numeric_code: "654", name: "Saint Helena pound", symbol: "SHP", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SH", "SH-AC"] }, // { code: "SLE", numeric_code: "925", name: "Sierra Leonean leone (new leone)", symbol: "SLE", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SL"] }, // { code: "SLL", numeric_code: "694", name: "Sierra Leonean leone (old leone)", symbol: "SLL", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SL"] }, { code: "SOS", numeric_code: "706", name: "Somali shilling", symbol: "Ssh", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SO"] }, { code: "SRD", numeric_code: "968", name: "Surinamese dollar", symbol: "SRD", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SR"] }, // { code: "SSP", numeric_code: "728", name: "South Sudanese pound", symbol: "SSP", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["South Sudan"] }, { code: "STN", numeric_code: "930", name: "S\xE3o Tom\xE9 and Pr\xEDncipe dobra", symbol: "STN", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["ST"] }, { code: "STD", numeric_code: "678", name: "S\xE3o Tom\xE9 and Pr\xEDncipe dobra (legacy code) [1977\u20132018]", symbol: "STD", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["ST"] }, { code: "SVC", numeric_code: "222", name: "Salvadoran col\xF3n", symbol: "SVC", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SV"] }, { code: "SYP", numeric_code: "760", name: "Syrian pound", symbol: "SY\xA3", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SY"] }, { code: "SZL", numeric_code: "748", name: "Swazi lilangeni", symbol: "SZL", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SZ"] }, { code: "THB", numeric_code: "764", name: "Thai baht", symbol: "\u0E3F", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TH"] }, { code: "TJS", numeric_code: "972", name: "Tajikistani somoni", symbol: "TJS", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TJ"] }, { code: "TMT", numeric_code: "934", name: "Turkmenistan manat", symbol: "TMT", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TM"] }, { code: "TND", numeric_code: "788", name: "Tunisian dinar", symbol: "DT", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TN"] }, { code: "TOP", numeric_code: "776", name: "Tongan pa\u02BBanga", symbol: "T$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TO"] }, { code: "TRY", numeric_code: "949", name: "Turkish lira", symbol: "\u20BA", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TR"] }, { code: "TTD", numeric_code: "780", name: "Trinidad and Tobago dollar", symbol: "TT$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TT"] }, { code: "TWD", numeric_code: "901", name: "New Taiwan dollar", symbol: "NT$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TW"] }, { code: "TZS", numeric_code: "834", name: "Tanzanian shilling", symbol: "TSh", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["TZ"] }, { code: "UAH", numeric_code: "980", name: "Ukrainian hryvnia", symbol: "\u20B4", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["UA"] }, { code: "UGX", numeric_code: "800", name: "Ugandan shilling", symbol: "USh", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["UG"] }, { code: "USD", numeric_code: "840", name: "United States dollar", symbol: "$", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["US", "AS", "IO", "VG", "BQ", "EC", "SV", "GU", "MH", "FM", "MP", "PW", "PA", "PR", "TL", "TC", "VI", "UM"] }, // { code: "USN", numeric_code: "997", name: "United States dollar (next day) (funds code)", symbol: "USN", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["US"] }, // { code: "UYI", numeric_code: "940", name: "Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code)", symbol: "UYI", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["UY"] }, { code: "UYU", numeric_code: "858", name: "Uruguayan peso", symbol: "$U", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["UY"] }, // { code: "UYW", numeric_code: "927", name: "Unidad previsional", symbol: "UYW", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["UY"] }, { code: "UZS", numeric_code: "860", name: "Uzbekistan sum", symbol: "UZS", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["UZ"] }, { code: "VED", numeric_code: "926", name: "Venezuelan digital bol\xEDvar", symbol: "VED", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["VE"] }, { code: "VEF", numeric_code: "937", name: "Venezuelan bol\xEDvar fuerte (pre-2018)", symbol: "Bs.F.", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["VE"] }, // { code: "VES", numeric_code: "928", name: "Venezuelan sovereign bolívar", symbol: "VES", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["VE"] }, // ???????? now? { code: "VND", numeric_code: "704", name: "Vietnamese \u0111\u1ED3ng", symbol: "\u20AB", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["VN"] }, { code: "VUV", numeric_code: "548", name: "Vanuatu vatu", symbol: "VUV", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["VU"] }, { code: "WST", numeric_code: "882", name: "Samoan tala", symbol: "WST", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["WS"] }, { code: "XAF", numeric_code: "950", name: "CFA franc BEAC", symbol: "FCFA", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["CM", "CF", "CG", "TD", "GQ", "GA"] }, { code: "XAG", numeric_code: "961", name: "Silver (one troy ounce)", symbol: "XAG", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, { code: "XAU", numeric_code: "959", name: "Gold (one troy ounce)", symbol: "XAU", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, // { code: "XBA", numeric_code: "955", name: "European Composite Unit (EURCO) (bond market unit)", symbol: "XBA", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, // { code: "XBB", numeric_code: "956", name: "European Monetary Unit (E.M.U.-6) (bond market unit)", symbol: "XBB", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, // { code: "XBC", numeric_code: "957", name: "European Unit of Account 9 (E.U.A.-9) (bond market unit)", symbol: "XBC", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, // { code: "XBD", numeric_code: "958", name: "European Unit of Account 17 (E.U.A.-17) (bond market unit)", symbol: "XBD", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, { code: "XCD", numeric_code: "951", name: "East Caribbean dollar", symbol: "XCD", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["AI", "AG", "DM", "GD", "MS", "KN", "LC", "VC"] }, { code: "XDR", numeric_code: "960", name: "Special drawing rights", symbol: "XDR", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["International Monetary Fund"] }, { code: "XOF", numeric_code: "952", name: "CFA franc BCEAO", symbol: "CFA", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["BJ", "BF", "CI", "GW", "ML", "NE", "SN", "TG"] }, // { code: "XPD", numeric_code: "964", name: "Palladium (one troy ounce)", symbol: "XPD", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, { code: "XPF", numeric_code: "953", name: "CFP franc (franc Pacifique)", symbol: "XPF", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["PF", "NC", "WF"] }, // { code: "XPT", numeric_code: "962", name: "Platinum (one troy ounce)", symbol: "XPT", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, // { code: "XSU", numeric_code: "994", name: "SUCRE", symbol: "XSU", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["AG", "BO", "CU", "DM", "GD", "NI", "KN", "LC", "VC", "VE"] }, // { code: "XTS", numeric_code: "963", name: "Code reserved for testing", symbol: "XTS", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, // { code: "XUA", numeric_code: "965", name: "ADB Unit of Account", symbol: "XUA", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["African Development Bank"] }, // { code: "XXX", numeric_code: "999", name: "No currency", symbol: "XXX", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: [] }, { code: "YER", numeric_code: "886", name: "Yemeni rial", symbol: "YR", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["YE"] }, { code: "ZAR", numeric_code: "710", name: "South African rand", symbol: "R", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["SZ", "LS", "NA", "ZA"] }, { code: "ZMK", numeric_code: "894", name: "Zambian kwacha (pre-2013)", symbol: "ZMK", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["ZM"] }, { code: "ZMW", numeric_code: "967", name: "Zambian kwacha", symbol: "ZK", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["ZM"] }, { code: "ZWL", numeric_code: "932", name: "Zimbabwean dollar (fifth)", symbol: "ZWL", round: 9999999, decimal: 111111, delimiter: "DE_LI", short_format: "FORSHRT", explicit_format: "FORMEX", countries: ["ZW"] } ]; function getList() { return CURRENCIES; } // src/exchanges/base_exchange.ts var BaseCurrencyExchange = class { /** * Base currency code. Default is 'USD'. */ base = "USD"; /** * Get all supported currency codes */ get currencies() { return getList().map((c) => c.code); } /** * Get all constant currencies */ getList() { return getList(); } filterByName(name) { return this.getList().filter((c) => c.name.includes(name)); } /** * Filter constant currencies by country * @param {string} iso2 - Country ISO2 code */ filterByCountry(iso2) { return this.getList().filter((c) => c.countries.find((c2) => c2 === iso2.toUpperCase())); } getByCountry(iso2) { return this.getList().find((c) => c.countries.find((c2) => c2 === iso2.toUpperCase())); } /** * Get constant currency info by ISO code (e.g., 'USD') * @param {string} code - Currency ISO code */ getByCode(code) { return this.getList().find((c) => c.code === code); } getBySymbol(symbol) { return this.getList().find((c) => c.symbol === symbol); } getByNumericCode(numCode) { return this.getList().find((c) => c.numeric_code === numCode); } /** * Set base currency */ setBase(currency) { this.base = currency || "USD"; return this; } /** * Set API key (default implementation - can be overridden) * Default does implementation does nothing. * Exchanges that need API keys should override this */ setKey(_key) { return this; } /** * Round currency value according to currency rules * * @param {number} amount - Currency value * @param {TRoundOptions} options * @param {number} options.precision - Decimal precision. Default is 2 * @param {string} options.direction - Round direction. Default is 'up' */ round(amount, options = { precision: 2, direction: "up" }) { const { precision } = options; if (options?.precision !== void 0) { return Math.round(Number(amount) * Math.pow(10, precision)) / Math.pow(10, precision); } return Math.round((Number(amount) + Number.EPSILON) * 100) / 100; } /** * Rounds a given money amount to the nearest roundable value for the given currency. * * @param {number} amount - The amount of money to round. * @param {CurrencyCode} [currency='USD'] - The currency to determine the rounding for. * @return {number} The rounded amount. */ roundMoney(amount, currency = "USD") { const data = this.getByCode(currency); if (data && data?.round > 1) { return data.round == 100 && data.decimal != 0 ? Math.round(amount * data?.round) / data?.round : Math.round(amount / data?.round) * data?.round; } return this.round(amount); } /** * Create standardized conversion result */ createConversionResult(amount, from, to, result, rate, error) { return { success: !error && result !== void 0, query: { from, to, amount }, info: { timestamp: Date.now(), rate }, date: (/* @__PURE__ */ new Date()).toISOString(), result, error }; } /** * Create standardized exchange rates result */ createExchangeRatesResult(base, rates, error) { return { success: !error && Object.keys(rates).length > 0, timestamp: Date.now(), date: (/* @__PURE__ */ new Date()).toISOString(), base, rates, error }; } }; var GoogleFinanceExchange = class extends BaseCurrencyExchange { name = "google"; baseUrl = "https://www.google.com/finance"; timeout; constructor(config = {}) { super(); this.base = config.base || "USD"; this.timeout = config.timeout || 5e3; } /** * Get latest exchange rates */ async latestRates(params) { const rates = {}; const currenciesToFetch = params?.codes || this.currencies; try { for (const code of currenciesToFetch) { if (code === this.base) { rates[code] = 1; continue; } const rate = await this.#getRate(this.base, code); if (rate) { rates[code] = rate; } } return this.createExchangeRatesResult(this.base, rates); } catch (error) { return this.createExchangeRatesResult( this.base, {}, { info: error instanceof Error ? error.message : "Failed to fetch exchange rates", type: "FETCH_ERROR" } ); } } /** * Convert currency amount */ async convert(params) { const { amount, from, to } = params; try { if (from === to) { return this.createConversionResult(amount, from, to, amount, 1); } const rate = await this.#getRate(from, to); if (!rate) { return this.createConversionResult(amount, from, to, void 0, void 0, { info: `Failed to get exchange rate for ${from}-${to}`, type: "RATE_NOT_FOUND" }); } const result = rate * amount; return this.createConversionResult(amount, from, to, result, rate); } catch (error) { return this.createConversionResult(amount, from, to, void 0, void 0, { info: error instanceof Error ? error.message : "Conversion failed", type: "CONVERSION_ERROR" }); } } /** * Get conversion rate between two currencies */ async getConvertRate(from, to) { return await this.#getRate(from, to); } /** * Get exchange rate from Google Finance */ async #getRate(from, to) { try { const url = `${this.baseUrl}/quote/${from}-${to}`; const timeout = 2e3; const userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"; const response = await axios.get(url, { headers: { "User-Agent": userAgent }, timeout }); const $ = cheerio.load(response.data); const block = $(`div[data-source="${from}"][data-target="${to}"]`); const rateString = block.children().first().text(); const stringWithoutCommas = rateString.replace(/,/g, ""); const rate = Number.parseFloat(stringWithoutCommas); if (rate && !isNaN(rate)) { return rate; } else { console.error(`Google Finance: Failed to get ${from}-${to} rate.`); } } catch (error) { console.error(error); } } /** * Parse exchange rate from Google Finance HTML */ #parseRateFromHtml(html, from, to) { try { const patterns = [ // Pattern for data-source and data-target attributes new RegExp(`data-source="${from}"[^>]*data-target="${to}"[^>]*>([^<]*<[^>]*>)*([0-9,]+\\.?[0-9]*)`, "i"), // Pattern for currency pair in title or aria-label new RegExp(`${from}\\s*-\\s*${to}[^0-9]*([0-9,]+\\.?[0-9]*)`, "i"), // Pattern for rate value in common Google Finance structure new RegExp(`"${from}-${to}"[^}]*"price"[^:]*:[^"]*"([0-9,]+\\.?[0-9]*)"`, "i"), // Fallback pattern for any number after currency pair new RegExp(`${from}/${to}[^0-9]*([0-9,]+\\.?[0-9]*)`, "i") ]; for (const pattern of patterns) { const match = html.match(pattern); if (match && match[2]) { const rateString = match[2].replace(/,/g, ""); const rate = parseFloat(rateString); if (!isNaN(rate) && rate > 0) { return rate; } } } return void 0; } catch (error) { console.error("Error parsing rate from HTML:", error); return void 0; } } }; // src/exchanges/fixer.ts var FixerExchange = class extends BaseCurrencyExchange { name = "fixer"; baseUrl = "http://data.fixer.io/api"; accessKey; timeout; constructor(config) { super(); this.accessKey = config.accessKey; this.base = config.base || "EUR"; this.timeout = config.timeout || 5e3; } /** * Set API key */ setKey(key) { this.accessKey = key; return this; } /** * Get latest exchange rates */ async latestRates(params) { const codes = params?.codes || this.currencies; try { const url = new URL(`${this.baseUrl}/latest`); url.searchParams.set("access_key", this.accessKey); url.searchParams.set("base", this.base); if (codes && codes.length > 0) { url.searchParams.set("symbols", codes.join(",")); } const response = await fetch(url.toString(), { signal: AbortSignal.timeout(this.timeout) }); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } const data = await response.json(); if (!data.success) { return this.createExchangeRatesResult( this.base, {}, { code: data.error?.code, info: data.error?.info || "Unknown error from Fixer.io", type: data.error?.type || "API_ERROR" } ); } return this.createExchangeRatesResult(this.base, data.rates || {}); } catch (error) { return this.createExchangeRatesResult( this.base, {}, { info: error instanceof Error ? error.message : "Failed to fetch exchange rates", type: "FETCH_ERROR" } ); } } /** * Convert cu