UNPKG

exchain

Version:

A fast and flexible currency exchange package for handling multiple currencies.

1 lines 8.46 kB
{"version":3,"sources":["../src/services/router.ts","../src/services/errorHandler.ts","../src/index.ts"],"names":["RatesOptions"],"mappings":"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","file":"index.mjs","sourcesContent":["import nyro, { ResponseType } from 'nyro';\n\nexport default class Router {\n static async request(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n url: string,\n ) {\n return (nyro({\n method,\n url,\n responseType: ResponseType.Json\n }).then((response) => {\n return response.body;\n }).catch((error) => {\n throw new Error(error);\n })) as Promise<any>;\n }\n};\n","export default class ExchangeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ExchangeError';\n this.message = message;\n }\n}","import Router from \"./services/router\";\nimport {\n Currency,\n RatesOptions,\n CurrencyList,\n RatesResponse\n} from './services/types';\nimport ExchangeError from \"./services/errorHandler\";\n\nexport {\n Currency,\n RatesOptions,\n CurrencyList,\n RatesResponse,\n ExchangeError\n};\n\n\n/**\n * The main class for the Exchange module.\n */\nexport default class Exchange {\n\n/**\n * Retrieves exchange rates based on the provided options.\n * \n * @param RatesOptions - The options for fetching exchange rates.\n * @param RatesOptions.amount - The amount to convert. Defaults to 1 if not provided or invalid.\n * @param RatesOptions.base - The base currency code. Defaults to 'USD' if not provided or invalid.\n * @param RatesOptions.to - An array of target currency codes. Defaults to ['EUR', 'AUD', 'CAD', 'GBP', 'JPY', 'TRY'] if not provided or empty.\n * @param RatesOptions.startDate - The start date for historical rates (optional).\n * @param RatesOptions.endDate - The end date for historical rates (optional).\n * @param RatesOptions.toFixed - The number of decimal places to round the rates to (optional). Cannot be used with multiple dates.\n * \n * @returns A promise that resolves to a `RatesResponse` object containing the exchange rates.\n * \n * @throws {ExchangeError} If an error occurs during the request or if `toFixed` is used with multiple dates.\n */\n static async getRates(\n RatesOptions: RatesOptions\n ) {\n return new Promise<RatesResponse>(async (resolve, reject) => {\n if(\n !RatesOptions.amount || \n typeof RatesOptions.amount !== 'number'\n ) RatesOptions.amount = 1;\n if(\n !RatesOptions.base ||\n ['AUD','BGN','BRL','CAD','CHF','CNY','CZK','DKK','EUR','GBP','HKD','HUF','IDR','ILS','INR','ISK','JPY','KRW','MXN','MYR','NOK','NZD','PHP','PLN','RON','SEK','SGD','THB','TRY','USD','ZAR'].indexOf(RatesOptions.base) === -1\n ) RatesOptions.base = 'USD';\n if(\n !RatesOptions.to || \n RatesOptions.to.length == 0\n ) RatesOptions.to = ['EUR','AUD','CAD','GBP','JPY','TRY'];\n\n try {\n var response = await Router.request(\n 'GET',\n `https://api.frankfurter.app/${\n RatesOptions.startDate && \n RatesOptions.endDate\n ? `${\n RatesOptions.startDate\n }${\n RatesOptions.endDate ? \n `..${\n RatesOptions.endDate\n }`: ''\n }`\n : 'latest'\n }?base=${\n RatesOptions.base\n }&symbols=${\n RatesOptions.to && RatesOptions.to.length > 0 ?\n RatesOptions.to.join(',') :\n ''\n }&amount=${\n RatesOptions.amount\n }`\n ) as RatesResponse;\n\n if(RatesOptions.toFixed && RatesOptions.toFixed > 0) {\n if(\n RatesOptions.startDate || \n RatesOptions.endDate\n ) {\n throw new ExchangeError('Cannot use toFixed with multiple dates');\n } else {\n Object.keys(response.rates).forEach((key) => {\n response.rates[key] = Number(Number(response.rates[key]).toFixed(RatesOptions.toFixed)) as number;\n });\n }\n };\n\n resolve(response);\n } catch (error) {\n reject(new ExchangeError((error as Error)?.message));\n }\n });\n};\n\n \n\n/**\n * Retrieves a list of available currencies.\n * \n * @returns A promise that resolves to a `CurrencyList` object containing the available currencies.\n * \n * @throws {ExchangeError} If an error occurs during the request.\n */\n static async getCurrencies(): Promise<CurrencyList> {\n return new Promise<CurrencyList>(async (resolve, reject) => {\n try {\n var response = await Router.request('GET', 'https://api.frankfurter.app/currencies') as CurrencyList;\n resolve(response);\n } catch (error) {\n reject(new ExchangeError((error as Error)?.message));\n }\n });\n};\n\n};"]}