exchange-rate-sdk 0.0.1 → 1.0.1

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/README.md CHANGED
@@ -4,6 +4,12 @@
4
4
 
5
5
  A lightweight, cross-platform exchange rate JavaScript SDK for browser and Node.js.
6
6
 
7
+
8
+ ## 🎮 在线演示 / Playground
9
+
10
+ 体验 SDK 的所有功能:
11
+ 👉 [https://chengzuopeng.github.io/exchange-rate-sdk/](https://chengzuopeng.github.io/exchange-rate-sdk/)
12
+
7
13
  ## ✨ 特性 / Features
8
14
 
9
15
  - 🌍 **跨平台支持** - 同时支持浏览器和 Node.js 环境
@@ -22,36 +28,10 @@ npm install exchange-rate-sdk
22
28
  ```
23
29
 
24
30
  ## 🚀 快速开始 / Quick Start
25
-
26
- ### 浏览器 (ESM)
27
-
28
- ```html
29
- <script type="module">
30
- import { ExchangeRateClient } from 'https://unpkg.com/exchange-rate-sdk';
31
-
32
- const client = new ExchangeRateClient();
33
- const rate = await client.getRate('USD', 'CNY');
34
- console.log(`1 USD = ${rate} CNY`);
35
- </script>
36
- ```
37
-
38
- ### Node.js (CommonJS)
39
-
40
- ```javascript
41
- const { ExchangeRateClient } = require('exchange-rate-sdk');
42
-
43
- const client = new ExchangeRateClient();
44
- client.convert(100, 'USD', 'CNY').then(result => {
45
- console.log(`100 USD = ${result.amount} CNY`);
46
- });
47
- ```
48
-
49
- ### Node.js (ES Module)
50
-
51
31
  ```javascript
52
- import { ExchangeRateClient } from 'exchange-rate-sdk';
32
+ import { ExchangeRateSDK } from 'exchange-rate-sdk';
53
33
 
54
- const client = new ExchangeRateClient();
34
+ const client = new ExchangeRateSDK();
55
35
  const rate = await client.getRate('USD', 'CNY');
56
36
  console.log(`1 USD = ${rate} CNY`);
57
37
  ```
@@ -59,18 +39,15 @@ console.log(`1 USD = ${rate} CNY`);
59
39
  ## ⚙️ 配置选项 / Configuration
60
40
 
61
41
  ```typescript
62
- import { ExchangeRateClient } from 'exchange-rate-sdk';
42
+ import { ExchangeRateSDK } from 'exchange-rate-sdk';
63
43
 
64
- const client = new ExchangeRateClient({
44
+ const client = new ExchangeRateSDK({
65
45
  // 缓存过期时间(毫秒),默认 24 小时
66
46
  cacheTTL: 24 * 60 * 60 * 1000,
67
47
 
68
48
  // 请求超时时间(毫秒),默认 10 秒
69
49
  timeout: 10000,
70
-
71
- // API 基础 URL,默认使用 exchangerate-api.com
72
- baseUrl: 'https://api.exchangerate-api.com/v4/latest',
73
-
50
+
74
51
  // 最大重试次数,默认 3 次
75
52
  maxRetries: 3,
76
53
 
@@ -162,10 +139,9 @@ client.setCacheTTL(60 * 60 * 1000); // 设置为 1 小时
162
139
  ## 📋 类型定义 / Type Definitions
163
140
 
164
141
  ```typescript
165
- interface ExchangeRateClientOptions {
142
+ interface ExchangeRateSDKOptions {
166
143
  cacheTTL?: number; // 缓存过期时间(毫秒)
167
144
  timeout?: number; // 请求超时(毫秒)
168
- baseUrl?: string; // API 基础 URL
169
145
  maxRetries?: number; // 最大重试次数
170
146
  retryDelay?: number; // 重试延迟基数
171
147
  }
@@ -197,9 +173,9 @@ interface ConvertResult {
197
173
  SDK 使用统一的错误类型,所有错误都包含 `code` 属性:
198
174
 
199
175
  ```typescript
200
- import { ExchangeRateClient, isSDKError } from 'exchange-rate-sdk';
176
+ import { ExchangeRateSDK, isSDKError } from 'exchange-rate-sdk';
201
177
 
202
- const client = new ExchangeRateClient();
178
+ const client = new ExchangeRateSDK();
203
179
 
204
180
  try {
205
181
  await client.getRate('INVALID', 'USD');
@@ -249,7 +225,7 @@ SDK 内置了智能重试机制:
249
225
  - **重试策略**:使用指数退避算法,每次重试延迟加倍
250
226
 
251
227
  ```typescript
252
- const client = new ExchangeRateClient({
228
+ const client = new ExchangeRateSDK({
253
229
  maxRetries: 3, // 最多重试 3 次
254
230
  retryDelay: 1000, // 第一次重试等待 1 秒,第二次 2 秒,第三次 4 秒
255
231
  });
@@ -298,6 +274,10 @@ yarn test
298
274
  yarn test:coverage
299
275
  ```
300
276
 
277
+ ## 📝 更新日志 / Changelog
278
+
279
+ 查看完整的版本变更记录:[CHANGELOG.md](./CHANGELOG.md)
280
+
301
281
  ## 📄 许可证 / License
302
282
 
303
283
  ISC
package/dist/client.d.ts CHANGED
@@ -1,17 +1,16 @@
1
- import type { ExchangeRateClientOptions, Currency, RatesResponse, ConvertResult } from './types';
1
+ import type { ExchangeRateSDKOptions, Currency, RatesResponse, ConvertResult } from './types';
2
2
  /**
3
3
  * 汇率查询 SDK 核心类
4
4
  */
5
- export declare class ExchangeRateClient {
5
+ export declare class ExchangeRateSDK {
6
6
  private cacheTTL;
7
7
  private timeout;
8
- private baseUrl;
9
8
  private maxRetries;
10
9
  private retryDelay;
11
10
  private cache;
12
11
  private currencies;
13
12
  private currencyCodeSet;
14
- constructor(options?: ExchangeRateClientOptions);
13
+ constructor(options?: ExchangeRateSDKOptions);
15
14
  /**
16
15
  * 验证货币代码是否有效
17
16
  */
@@ -49,3 +48,4 @@ export declare class ExchangeRateClient {
49
48
  */
50
49
  setCacheTTL(ttl: number): void;
51
50
  }
51
+ export default ExchangeRateSDK;
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";const a="exchange_rate_sdk_";function n(){return"undefined"!=typeof window&&void 0!==window.localStorage}class e{constructor(a){this.memoryCache=new Map,this.ttl=a}get(e){const i=a+e,r=this.memoryCache.get(i);if(r){if(Date.now()<r.expiresAt)return r.data;this.memoryCache.delete(i)}if(n())try{const a=localStorage.getItem(i);if(a){const n=JSON.parse(a);if(Date.now()<n.expiresAt)return this.memoryCache.set(i,n),n.data;localStorage.removeItem(i)}}catch{}return null}set(e,i){const r=a+e,t={data:i,expiresAt:Date.now()+this.ttl};if(this.memoryCache.set(r,t),n())try{localStorage.setItem(r,JSON.stringify(t))}catch{}}delete(e){const i=a+e;if(this.memoryCache.delete(i),n())try{localStorage.removeItem(i)}catch{}}clear(){if(this.memoryCache.clear(),n())try{const n=[];for(let e=0;e<localStorage.length;e++){const i=localStorage.key(e);i&&i.startsWith(a)&&n.push(i)}n.forEach(a=>localStorage.removeItem(a))}catch{}}setTTL(a){this.ttl=a}}function i(a,n,e){const i=new Error(n);return i.code=a,i.name="ExchangeRateSDKError",void 0!==e&&(i.details=e),i}function r(a){return new Promise(n=>setTimeout(n,a))}async function t(a,n){const e=new AbortController,i=setTimeout(()=>e.abort(),n);try{return await fetch(a,{signal:e.signal,headers:{"User-Agent":"ExchangeRateSDK/1.0.0"}})}finally{clearTimeout(i)}}function o(a,n){if(a instanceof Error){if("AbortError"===a.name)return!0;if(a.message.includes("network"))return!0;if(a.message.includes("timeout"))return!0}return!!(n&&n>=500&&n<600)||429===n}exports.ExchangeRateClient=class{constructor(a={}){this.cacheTTL=a.cacheTTL??864e5,this.timeout=a.timeout??1e4,this.baseUrl=a.baseUrl??"https://api.exchangerate-api.com/v4/latest",this.maxRetries=a.maxRetries??3,this.retryDelay=a.retryDelay??1e3,this.cache=new e(this.cacheTTL),this.currencies=function(){const a="code,name,name_cn,country,country_cn\nAED,UAE Dirham,阿联酋迪拉姆,United Arab Emirates,阿联酋\nAFN,Afghan Afghani,阿富汗尼,Afghanistan,阿富汗\nALL,Albanian Lek,阿尔巴尼亚列克,Albania,阿尔巴尼亚\nAMD,Armenian Dram,亚美尼亚德拉姆,Armenia,亚美尼亚\nANG,Netherlands Antillian Guilder,荷属安的列斯盾,Netherlands Antilles,荷属安的列斯\nAOA,Angolan Kwanza,安哥拉宽扎,Angola,安哥拉\nARS,Argentine Peso,阿根廷比索,Argentina,阿根廷\nAUD,Australian Dollar,澳大利亚元,Australia,澳大利亚\nAWG,Aruban Florin,阿鲁巴弗罗林,Aruba,阿鲁巴\nAZN,Azerbaijani Manat,阿塞拜疆马纳特,Azerbaijan,阿塞拜疆\nBAM,Bosnia and Herzegovina Convertible Mark,波黑可兑换马克,Bosnia and Herzegovina,波斯尼亚和黑塞哥维那\nBBD,Barbados Dollar,巴巴多斯元,Barbados,巴巴多斯\nBDT,Bangladeshi Taka,孟加拉塔卡,Bangladesh,孟加拉国\nBGN,Bulgarian Lev,保加利亚列弗,Bulgaria,保加利亚\nBHD,Bahraini Dinar,巴林第纳尔,Bahrain,巴林\nBIF,Burundian Franc,布隆迪法郎,Burundi,布隆迪\nBMD,Bermudian Dollar,百慕大元,Bermuda,百慕大\nBND,Brunei Dollar,文莱元,Brunei,文莱\nBOB,Bolivian Boliviano,玻利维亚诺,Bolivia,玻利维亚\nBRL,Brazilian Real,巴西雷亚尔,Brazil,巴西\nBSD,Bahamian Dollar,巴哈马元,Bahamas,巴哈马\nBTN,Bhutanese Ngultrum,不丹努尔特鲁姆,Bhutan,不丹\nBWP,Botswana Pula,博茨瓦纳普拉,Botswana,博茨瓦纳\nBYN,Belarusian Ruble,白俄罗斯卢布,Belarus,白俄罗斯\nBZD,Belize Dollar,伯利兹元,Belize,伯利兹\nCAD,Canadian Dollar,加拿大元,Canada,加拿大\nCDF,Congolese Franc,刚果法郎,Democratic Republic of the Congo,刚果民主共和国\nCHF,Swiss Franc,瑞士法郎,Switzerland,瑞士\nCLF,Chilean Unidad de Fomento,智利发展单位,Chile,智利\nCLP,Chilean Peso,智利比索,Chile,智利\nCNH,Offshore Chinese Renminbi,离岸人民币,China,中国\nCNY,Chinese Renminbi,人民币,China,中国\nCOP,Colombian Peso,哥伦比亚比索,Colombia,哥伦比亚\nCRC,Costa Rican Colon,哥斯达黎加科朗,Costa Rica,哥斯达黎加\nCUP,Cuban Peso,古巴比索,Cuba,古巴\nCVE,Cape Verdean Escudo,佛得角埃斯库多,Cape Verde,佛得角\nCZK,Czech Koruna,捷克克朗,Czech Republic,捷克\nDJF,Djiboutian Franc,吉布提法郎,Djibouti,吉布提\nDKK,Danish Krone,丹麦克朗,Denmark,丹麦\nDOP,Dominican Peso,多米尼加比索,Dominican Republic,多米尼加\nDZD,Algerian Dinar,阿尔及利亚第纳尔,Algeria,阿尔及利亚\nEGP,Egyptian Pound,埃及镑,Egypt,埃及\nERN,Eritrean Nakfa,厄立特里亚纳克法,Eritrea,厄立特里亚\nETB,Ethiopian Birr,埃塞俄比亚比尔,Ethiopia,埃塞俄比亚\nEUR,Euro,欧元,European Union,欧盟\nFJD,Fiji Dollar,斐济元,Fiji,斐济\nFKP,Falkland Islands Pound,福克兰群岛镑,Falkland Islands,福克兰群岛\nFOK,Faroese Króna,法罗克朗,Faroe Islands,法罗群岛\nGBP,Pound Sterling,英镑,United Kingdom,英国\nGEL,Georgian Lari,格鲁吉亚拉里,Georgia,格鲁吉亚\nGGP,Guernsey Pound,根西岛镑,Guernsey,根西岛\nGHS,Ghanaian Cedi,加纳塞地,Ghana,加纳\nGIP,Gibraltar Pound,直布罗陀镑,Gibraltar,直布罗陀\nGMD,Gambian Dalasi,冈比亚达拉西,Gambia,冈比亚\nGNF,Guinean Franc,几内亚法郎,Guinea,几内亚\nGTQ,Guatemalan Quetzal,危地马拉格查尔,Guatemala,危地马拉\nGYD,Guyanese Dollar,圭亚那元,Guyana,圭亚那\nHKD,Hong Kong Dollar,港元,Hong Kong,中国香港\nHNL,Honduran Lempira,洪都拉斯伦皮拉,Honduras,洪都拉斯\nHRK,Croatian Kuna,克罗地亚库纳,Croatia,克罗地亚\nHTG,Haitian Gourde,海地古德,Haiti,海地\nHUF,Hungarian Forint,匈牙利福林,Hungary,匈牙利\nIDR,Indonesian Rupiah,印尼盾,Indonesia,印度尼西亚\nILS,Israeli New Shekel,以色列新谢克尔,Israel,以色列\nIMP,Manx Pound,马恩岛镑,Isle of Man,马恩岛\nINR,Indian Rupee,印度卢比,India,印度\nIQD,Iraqi Dinar,伊拉克第纳尔,Iraq,伊拉克\nIRR,Iranian Rial,伊朗里亚尔,Iran,伊朗\nISK,Icelandic Króna,冰岛克朗,Iceland,冰岛\nJEP,Jersey Pound,泽西岛镑,Jersey,泽西岛\nJMD,Jamaican Dollar,牙买加元,Jamaica,牙买加\nJOD,Jordanian Dinar,约旦第纳尔,Jordan,约旦\nJPY,Japanese Yen,日元,Japan,日本\nKES,Kenyan Shilling,肯尼亚先令,Kenya,肯尼亚\nKGS,Kyrgyzstani Som,吉尔吉斯斯坦索姆,Kyrgyzstan,吉尔吉斯斯坦\nKHR,Cambodian Riel,柬埔寨瑞尔,Cambodia,柬埔寨\nKID,Kiribati Dollar,基里巴斯元,Kiribati,基里巴斯\nKMF,Comorian Franc,科摩罗法郎,Comoros,科摩罗\nKRW,South Korean Won,韩元,South Korea,韩国\nKWD,Kuwaiti Dinar,科威特第纳尔,Kuwait,科威特\nKYD,Cayman Islands Dollar,开曼群岛元,Cayman Islands,开曼群岛\nKZT,Kazakhstani Tenge,哈萨克斯坦坚戈,Kazakhstan,哈萨克斯坦\nLAK,Lao Kip,老挝基普,Laos,老挝\nLBP,Lebanese Pound,黎巴嫩镑,Lebanon,黎巴嫩\nLKR,Sri Lanka Rupee,斯里兰卡卢比,Sri Lanka,斯里兰卡\nLRD,Liberian Dollar,利比里亚元,Liberia,利比里亚\nLSL,Lesotho Loti,莱索托洛蒂,Lesotho,莱索托\nLYD,Libyan Dinar,利比亚第纳尔,Libya,利比亚\nMAD,Moroccan Dirham,摩洛哥迪拉姆,Morocco,摩洛哥\nMDL,Moldovan Leu,摩尔多瓦列伊,Moldova,摩尔多瓦\nMGA,Malagasy Ariary,马达加斯加阿里亚里,Madagascar,马达加斯加\nMKD,Macedonian Denar,北马其顿第纳尔,North Macedonia,北马其顿\nMMK,Burmese Kyat,缅甸元,Myanmar,缅甸\nMNT,Mongolian Tögrög,蒙古图格里克,Mongolia,蒙古\nMOP,Macanese Pataca,澳门元,Macau,中国澳门\nMRU,Mauritanian Ouguiya,毛里塔尼亚乌吉亚,Mauritania,毛里塔尼亚\nMUR,Mauritian Rupee,毛里求斯卢比,Mauritius,毛里求斯\nMVR,Maldivian Rufiyaa,马尔代夫拉菲亚,Maldives,马尔代夫\nMWK,Malawian Kwacha,马拉维克瓦查,Malawi,马拉维\nMXN,Mexican Peso,墨西哥比索,Mexico,墨西哥\nMYR,Malaysian Ringgit,马来西亚林吉特,Malaysia,马来西亚\nMZN,Mozambican Metical,莫桑比克梅蒂卡尔,Mozambique,莫桑比克\nNAD,Namibian Dollar,纳米比亚元,Namibia,纳米比亚\nNGN,Nigerian Naira,尼日利亚奈拉,Nigeria,尼日利亚\nNIO,Nicaraguan Córdoba,尼加拉瓜科多巴,Nicaragua,尼加拉瓜\nNOK,Norwegian Krone,挪威克朗,Norway,挪威\nNPR,Nepalese Rupee,尼泊尔卢比,Nepal,尼泊尔\nNZD,New Zealand Dollar,新西兰元,New Zealand,新西兰\nOMR,Omani Rial,阿曼里亚尔,Oman,阿曼\nPAB,Panamanian Balboa,巴拿马巴波亚,Panama,巴拿马\nPEN,Peruvian Sol,秘鲁索尔,Peru,秘鲁\nPGK,Papua New Guinean Kina,巴布亚新几内亚基那,Papua New Guinea,巴布亚新几内亚\nPHP,Philippine Peso,菲律宾比索,Philippines,菲律宾\nPKR,Pakistani Rupee,巴基斯坦卢比,Pakistan,巴基斯坦\nPLN,Polish Złoty,波兰兹罗提,Poland,波兰\nPYG,Paraguayan Guaraní,巴拉圭瓜拉尼,Paraguay,巴拉圭\nQAR,Qatari Riyal,卡塔尔里亚尔,Qatar,卡塔尔\nRON,Romanian Leu,罗马尼亚列伊,Romania,罗马尼亚\nRSD,Serbian Dinar,塞尔维亚第纳尔,Serbia,塞尔维亚\nRUB,Russian Ruble,俄罗斯卢布,Russia,俄罗斯\nRWF,Rwandan Franc,卢旺达法郎,Rwanda,卢旺达\nSAR,Saudi Riyal,沙特里亚尔,Saudi Arabia,沙特阿拉伯\nSBD,Solomon Islands Dollar,所罗门群岛元,Solomon Islands,所罗门群岛\nSCR,Seychellois Rupee,塞舌尔卢比,Seychelles,塞舌尔\nSDG,Sudanese Pound,苏丹镑,Sudan,苏丹\nSEK,Swedish Krona,瑞典克朗,Sweden,瑞典\nSGD,Singapore Dollar,新加坡元,Singapore,新加坡\nSHP,Saint Helena Pound,圣赫勒拿镑,Saint Helena,圣赫勒拿\nSLE,Sierra Leonean Leone,塞拉利昂利昂,Sierra Leone,塞拉利昂\nSLL,Sierra Leonean Leone,塞拉利昂利昂(旧),Sierra Leone,塞拉利昂\nSOS,Somali Shilling,索马里先令,Somalia,索马里\nSRD,Surinamese Dollar,苏里南元,Suriname,苏里南\nSSP,South Sudanese Pound,南苏丹镑,South Sudan,南苏丹\nSTN,São Tomé and Príncipe Dobra,圣多美多布拉,São Tomé and Príncipe,圣多美和普林西比\nSYP,Syrian Pound,叙利亚镑,Syria,叙利亚\nSZL,Eswatini Lilangeni,斯威士兰里兰吉尼,Eswatini,斯威士兰\nTHB,Thai Baht,泰铢,Thailand,泰国\nTJS,Tajikistani Somoni,塔吉克斯坦索莫尼,Tajikistan,塔吉克斯坦\nTMT,Turkmenistan Manat,土库曼斯坦马纳特,Turkmenistan,土库曼斯坦\nTND,Tunisian Dinar,突尼斯第纳尔,Tunisia,突尼斯\nTOP,Tongan Paʻanga,汤加潘加,Tonga,汤加\nTRY,Turkish Lira,土耳其里拉,Turkey,土耳其\nTTD,Trinidad and Tobago Dollar,特立尼达和多巴哥元,Trinidad and Tobago,特立尼达和多巴哥\nTVD,Tuvaluan Dollar,图瓦卢元,Tuvalu,图瓦卢\nTWD,New Taiwan Dollar,新台币,Taiwan,中国台湾\nTZS,Tanzanian Shilling,坦桑尼亚先令,Tanzania,坦桑尼亚\nUAH,Ukrainian Hryvnia,乌克兰格里夫纳,Ukraine,乌克兰\nUGX,Ugandan Shilling,乌干达先令,Uganda,乌干达\nUSD,United States Dollar,美元,United States,美国\nUYU,Uruguayan Peso,乌拉圭比索,Uruguay,乌拉圭\nUZS,Uzbekistani So'm,乌兹别克斯坦苏姆,Uzbekistan,乌兹别克斯坦\nVES,Venezuelan Bolívar Soberano,委内瑞拉玻利瓦尔,Venezuela,委内瑞拉\nVND,Vietnamese Đồng,越南盾,Vietnam,越南\nVUV,Vanuatu Vatu,瓦努阿图瓦图,Vanuatu,瓦努阿图\nWST,Samoan Tālā,萨摩亚塔拉,Samoa,萨摩亚\nXAF,Central African CFA Franc,中非法郎,Central African States,中非国家\nXCD,East Caribbean Dollar,东加勒比元,East Caribbean States,东加勒比国家\nXCG,Caribbean Guilder,加勒比盾,Caribbean,加勒比地区\nXDR,Special Drawing Rights,特别提款权,International Monetary Fund,国际货币基金组织\nXOF,West African CFA franc,西非法郎,West African States,西非国家\nXPF,CFP Franc,太平洋法郎,French Pacific Territories,法属太平洋领地\nYER,Yemeni Rial,也门里亚尔,Yemen,也门\nZAR,South African Rand,南非兰特,South Africa,南非\nZMW,Zambian Kwacha,赞比亚克瓦查,Zambia,赞比亚\nZWG,Zimbabwean Dollar,津巴布韦元(新),Zimbabwe,津巴布韦\nZWL,Zimbabwean Dollar,津巴布韦元,Zimbabwe,津巴布韦\n".split(/\r?\n/),n=[];for(let e=0;e<a.length;e++){const i=a[e].trim();if(!i)continue;if(0===e&&i.toLowerCase().startsWith("code,"))continue;const r=i.split(",");r.length>=5&&n.push({code:r[0].trim(),name:r[1].trim(),name_cn:r[2].trim(),country:r[3].trim(),country_cn:r[4].trim()})}return n}(),this.currencyCodeSet=new Set(this.currencies.map(a=>a.code))}validateCurrencyCode(a){const n=a.toUpperCase();if(!this.currencyCodeSet.has(n))throw i("INVALID_CURRENCY_CODE",`Invalid currency code: ${a}. The currency code is not in the supported list.`,{code:a})}async getRates(a){const n=a.toUpperCase();this.validateCurrencyCode(n);const e=`rates_${n}`,s=this.cache.get(e);if(s)return s;const l=`${this.baseUrl}/${encodeURIComponent(n)}`,c=await async function(a,n){let e,s;for(let l=0;l<=n.maxRetries;l++)try{const e=await t(a,n.timeout);if(s=e.status,!e.ok){if(o(null,e.status)&&l<n.maxRetries){const a=n.retryDelay*Math.pow(2,l);await r(a);continue}throw i("API_ERROR",`API request failed with status ${e.status}`,{status:e.status})}return await e.json()}catch(a){if(e=a,a instanceof Error&&"ExchangeRateSDKError"===a.name&&!o(null,s))throw a;if(a instanceof Error&&"AbortError"===a.name&&(e=i("TIMEOUT_ERROR","Request timeout")),o(a,s)&&l<n.maxRetries){const a=n.retryDelay*Math.pow(2,l);await r(a);continue}if(a instanceof Error&&"ExchangeRateSDKError"===a.name)throw a;throw i("NETWORK_ERROR",a instanceof Error?a.message:"Network request failed",a)}if(e instanceof Error&&"ExchangeRateSDKError"===e.name)throw e;throw i("NETWORK_ERROR","All retry attempts failed",e)}(l,{timeout:this.timeout,maxRetries:this.maxRetries,retryDelay:this.retryDelay});if(!c||!c.rates||c.base!==n)throw i("API_ERROR","Invalid API response format",{response:c});return this.cache.set(e,c),c}async getRate(a,n){const e=a.toUpperCase(),r=n.toUpperCase();if(this.validateCurrencyCode(e),this.validateCurrencyCode(r),e===r)return 1;const t=(await this.getRates(e)).rates[r];if(void 0===t)throw i("API_ERROR",`Exchange rate not found for ${e} to ${r}`,{from:e,to:r});return t}async convert(a,n,e){const i=await this.getRate(n,e);return{amount:a*i,from:n.toUpperCase(),to:e.toUpperCase(),rate:i}}getCurrency(a){const n=a.toUpperCase();return this.validateCurrencyCode(n),this.currencies.find(a=>a.code===n)}getCurrencies(){return[...this.currencies]}searchCurrency(a){const n=a.toLowerCase();return this.currencies.filter(e=>e.code.toLowerCase().includes(n)||e.name.toLowerCase().includes(n)||e.name_cn.includes(a)||e.country.toLowerCase().includes(n)||e.country_cn.includes(a))}clearCache(){this.cache.clear()}setCacheTTL(a){this.cacheTTL=a,this.cache.setTTL(a)}},exports.createError=i,exports.isSDKError=function(a){return a instanceof Error&&"code"in a&&"ExchangeRateSDKError"===a.name};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const a="exchange_rate_sdk_";function n(){return"undefined"!=typeof window&&void 0!==window.localStorage}class e{constructor(a){this.memoryCache=new Map,this.ttl=a}get(e){const r=a+e,i=this.memoryCache.get(r);if(i){if(Date.now()<i.expiresAt)return i.data;this.memoryCache.delete(r)}if(n())try{const a=localStorage.getItem(r);if(a){const n=JSON.parse(a);if(Date.now()<n.expiresAt)return this.memoryCache.set(r,n),n.data;localStorage.removeItem(r)}}catch{}return null}set(e,r){const i=a+e,t={data:r,expiresAt:Date.now()+this.ttl};if(this.memoryCache.set(i,t),n())try{localStorage.setItem(i,JSON.stringify(t))}catch{}}delete(e){const r=a+e;if(this.memoryCache.delete(r),n())try{localStorage.removeItem(r)}catch{}}clear(){if(this.memoryCache.clear(),n())try{const n=[];for(let e=0;e<localStorage.length;e++){const r=localStorage.key(e);r&&r.startsWith(a)&&n.push(r)}n.forEach(a=>localStorage.removeItem(a))}catch{}}setTTL(a){this.ttl=a}}function r(a,n,e){const r=new Error(n);return r.code=a,r.name="ExchangeRateSDKError",void 0!==e&&(r.details=e),r}function i(a){return new Promise(n=>setTimeout(n,a))}async function t(a,n){const e=new AbortController,r=setTimeout(()=>e.abort(),n);try{return await fetch(a,{signal:e.signal,headers:{"User-Agent":"ExchangeRateSDK/1.0.0"}})}finally{clearTimeout(r)}}function o(a,n){if(a instanceof Error){if("AbortError"===a.name)return!0;if(a.message.includes("network"))return!0;if(a.message.includes("timeout"))return!0}return!!(n&&n>=500&&n<600)||429===n}class s{constructor(a={}){this.cacheTTL=a.cacheTTL??864e5,this.timeout=a.timeout??1e4,this.maxRetries=a.maxRetries??3,this.retryDelay=a.retryDelay??1e3,this.cache=new e(this.cacheTTL),this.currencies=function(){const a="code,name,name_cn,country,country_cn\nAED,UAE Dirham,阿联酋迪拉姆,United Arab Emirates,阿联酋\nAFN,Afghan Afghani,阿富汗尼,Afghanistan,阿富汗\nALL,Albanian Lek,阿尔巴尼亚列克,Albania,阿尔巴尼亚\nAMD,Armenian Dram,亚美尼亚德拉姆,Armenia,亚美尼亚\nANG,Netherlands Antillian Guilder,荷属安的列斯盾,Netherlands Antilles,荷属安的列斯\nAOA,Angolan Kwanza,安哥拉宽扎,Angola,安哥拉\nARS,Argentine Peso,阿根廷比索,Argentina,阿根廷\nAUD,Australian Dollar,澳大利亚元,Australia,澳大利亚\nAWG,Aruban Florin,阿鲁巴弗罗林,Aruba,阿鲁巴\nAZN,Azerbaijani Manat,阿塞拜疆马纳特,Azerbaijan,阿塞拜疆\nBAM,Bosnia and Herzegovina Convertible Mark,波黑可兑换马克,Bosnia and Herzegovina,波斯尼亚和黑塞哥维那\nBBD,Barbados Dollar,巴巴多斯元,Barbados,巴巴多斯\nBDT,Bangladeshi Taka,孟加拉塔卡,Bangladesh,孟加拉国\nBGN,Bulgarian Lev,保加利亚列弗,Bulgaria,保加利亚\nBHD,Bahraini Dinar,巴林第纳尔,Bahrain,巴林\nBIF,Burundian Franc,布隆迪法郎,Burundi,布隆迪\nBMD,Bermudian Dollar,百慕大元,Bermuda,百慕大\nBND,Brunei Dollar,文莱元,Brunei,文莱\nBOB,Bolivian Boliviano,玻利维亚诺,Bolivia,玻利维亚\nBRL,Brazilian Real,巴西雷亚尔,Brazil,巴西\nBSD,Bahamian Dollar,巴哈马元,Bahamas,巴哈马\nBTN,Bhutanese Ngultrum,不丹努尔特鲁姆,Bhutan,不丹\nBWP,Botswana Pula,博茨瓦纳普拉,Botswana,博茨瓦纳\nBYN,Belarusian Ruble,白俄罗斯卢布,Belarus,白俄罗斯\nBZD,Belize Dollar,伯利兹元,Belize,伯利兹\nCAD,Canadian Dollar,加拿大元,Canada,加拿大\nCDF,Congolese Franc,刚果法郎,Democratic Republic of the Congo,刚果民主共和国\nCHF,Swiss Franc,瑞士法郎,Switzerland,瑞士\nCLF,Chilean Unidad de Fomento,智利发展单位,Chile,智利\nCLP,Chilean Peso,智利比索,Chile,智利\nCNH,Offshore Chinese Renminbi,离岸人民币,China,中国\nCNY,Chinese Renminbi,人民币,China,中国\nCOP,Colombian Peso,哥伦比亚比索,Colombia,哥伦比亚\nCRC,Costa Rican Colon,哥斯达黎加科朗,Costa Rica,哥斯达黎加\nCUP,Cuban Peso,古巴比索,Cuba,古巴\nCVE,Cape Verdean Escudo,佛得角埃斯库多,Cape Verde,佛得角\nCZK,Czech Koruna,捷克克朗,Czech Republic,捷克\nDJF,Djiboutian Franc,吉布提法郎,Djibouti,吉布提\nDKK,Danish Krone,丹麦克朗,Denmark,丹麦\nDOP,Dominican Peso,多米尼加比索,Dominican Republic,多米尼加\nDZD,Algerian Dinar,阿尔及利亚第纳尔,Algeria,阿尔及利亚\nEGP,Egyptian Pound,埃及镑,Egypt,埃及\nERN,Eritrean Nakfa,厄立特里亚纳克法,Eritrea,厄立特里亚\nETB,Ethiopian Birr,埃塞俄比亚比尔,Ethiopia,埃塞俄比亚\nEUR,Euro,欧元,European Union,欧盟\nFJD,Fiji Dollar,斐济元,Fiji,斐济\nFKP,Falkland Islands Pound,福克兰群岛镑,Falkland Islands,福克兰群岛\nFOK,Faroese Króna,法罗克朗,Faroe Islands,法罗群岛\nGBP,Pound Sterling,英镑,United Kingdom,英国\nGEL,Georgian Lari,格鲁吉亚拉里,Georgia,格鲁吉亚\nGGP,Guernsey Pound,根西岛镑,Guernsey,根西岛\nGHS,Ghanaian Cedi,加纳塞地,Ghana,加纳\nGIP,Gibraltar Pound,直布罗陀镑,Gibraltar,直布罗陀\nGMD,Gambian Dalasi,冈比亚达拉西,Gambia,冈比亚\nGNF,Guinean Franc,几内亚法郎,Guinea,几内亚\nGTQ,Guatemalan Quetzal,危地马拉格查尔,Guatemala,危地马拉\nGYD,Guyanese Dollar,圭亚那元,Guyana,圭亚那\nHKD,Hong Kong Dollar,港元,Hong Kong,中国香港\nHNL,Honduran Lempira,洪都拉斯伦皮拉,Honduras,洪都拉斯\nHRK,Croatian Kuna,克罗地亚库纳,Croatia,克罗地亚\nHTG,Haitian Gourde,海地古德,Haiti,海地\nHUF,Hungarian Forint,匈牙利福林,Hungary,匈牙利\nIDR,Indonesian Rupiah,印尼盾,Indonesia,印度尼西亚\nILS,Israeli New Shekel,以色列新谢克尔,Israel,以色列\nIMP,Manx Pound,马恩岛镑,Isle of Man,马恩岛\nINR,Indian Rupee,印度卢比,India,印度\nIQD,Iraqi Dinar,伊拉克第纳尔,Iraq,伊拉克\nIRR,Iranian Rial,伊朗里亚尔,Iran,伊朗\nISK,Icelandic Króna,冰岛克朗,Iceland,冰岛\nJEP,Jersey Pound,泽西岛镑,Jersey,泽西岛\nJMD,Jamaican Dollar,牙买加元,Jamaica,牙买加\nJOD,Jordanian Dinar,约旦第纳尔,Jordan,约旦\nJPY,Japanese Yen,日元,Japan,日本\nKES,Kenyan Shilling,肯尼亚先令,Kenya,肯尼亚\nKGS,Kyrgyzstani Som,吉尔吉斯斯坦索姆,Kyrgyzstan,吉尔吉斯斯坦\nKHR,Cambodian Riel,柬埔寨瑞尔,Cambodia,柬埔寨\nKID,Kiribati Dollar,基里巴斯元,Kiribati,基里巴斯\nKMF,Comorian Franc,科摩罗法郎,Comoros,科摩罗\nKRW,South Korean Won,韩元,South Korea,韩国\nKWD,Kuwaiti Dinar,科威特第纳尔,Kuwait,科威特\nKYD,Cayman Islands Dollar,开曼群岛元,Cayman Islands,开曼群岛\nKZT,Kazakhstani Tenge,哈萨克斯坦坚戈,Kazakhstan,哈萨克斯坦\nLAK,Lao Kip,老挝基普,Laos,老挝\nLBP,Lebanese Pound,黎巴嫩镑,Lebanon,黎巴嫩\nLKR,Sri Lanka Rupee,斯里兰卡卢比,Sri Lanka,斯里兰卡\nLRD,Liberian Dollar,利比里亚元,Liberia,利比里亚\nLSL,Lesotho Loti,莱索托洛蒂,Lesotho,莱索托\nLYD,Libyan Dinar,利比亚第纳尔,Libya,利比亚\nMAD,Moroccan Dirham,摩洛哥迪拉姆,Morocco,摩洛哥\nMDL,Moldovan Leu,摩尔多瓦列伊,Moldova,摩尔多瓦\nMGA,Malagasy Ariary,马达加斯加阿里亚里,Madagascar,马达加斯加\nMKD,Macedonian Denar,北马其顿第纳尔,North Macedonia,北马其顿\nMMK,Burmese Kyat,缅甸元,Myanmar,缅甸\nMNT,Mongolian Tögrög,蒙古图格里克,Mongolia,蒙古\nMOP,Macanese Pataca,澳门元,Macau,中国澳门\nMRU,Mauritanian Ouguiya,毛里塔尼亚乌吉亚,Mauritania,毛里塔尼亚\nMUR,Mauritian Rupee,毛里求斯卢比,Mauritius,毛里求斯\nMVR,Maldivian Rufiyaa,马尔代夫拉菲亚,Maldives,马尔代夫\nMWK,Malawian Kwacha,马拉维克瓦查,Malawi,马拉维\nMXN,Mexican Peso,墨西哥比索,Mexico,墨西哥\nMYR,Malaysian Ringgit,马来西亚林吉特,Malaysia,马来西亚\nMZN,Mozambican Metical,莫桑比克梅蒂卡尔,Mozambique,莫桑比克\nNAD,Namibian Dollar,纳米比亚元,Namibia,纳米比亚\nNGN,Nigerian Naira,尼日利亚奈拉,Nigeria,尼日利亚\nNIO,Nicaraguan Córdoba,尼加拉瓜科多巴,Nicaragua,尼加拉瓜\nNOK,Norwegian Krone,挪威克朗,Norway,挪威\nNPR,Nepalese Rupee,尼泊尔卢比,Nepal,尼泊尔\nNZD,New Zealand Dollar,新西兰元,New Zealand,新西兰\nOMR,Omani Rial,阿曼里亚尔,Oman,阿曼\nPAB,Panamanian Balboa,巴拿马巴波亚,Panama,巴拿马\nPEN,Peruvian Sol,秘鲁索尔,Peru,秘鲁\nPGK,Papua New Guinean Kina,巴布亚新几内亚基那,Papua New Guinea,巴布亚新几内亚\nPHP,Philippine Peso,菲律宾比索,Philippines,菲律宾\nPKR,Pakistani Rupee,巴基斯坦卢比,Pakistan,巴基斯坦\nPLN,Polish Złoty,波兰兹罗提,Poland,波兰\nPYG,Paraguayan Guaraní,巴拉圭瓜拉尼,Paraguay,巴拉圭\nQAR,Qatari Riyal,卡塔尔里亚尔,Qatar,卡塔尔\nRON,Romanian Leu,罗马尼亚列伊,Romania,罗马尼亚\nRSD,Serbian Dinar,塞尔维亚第纳尔,Serbia,塞尔维亚\nRUB,Russian Ruble,俄罗斯卢布,Russia,俄罗斯\nRWF,Rwandan Franc,卢旺达法郎,Rwanda,卢旺达\nSAR,Saudi Riyal,沙特里亚尔,Saudi Arabia,沙特阿拉伯\nSBD,Solomon Islands Dollar,所罗门群岛元,Solomon Islands,所罗门群岛\nSCR,Seychellois Rupee,塞舌尔卢比,Seychelles,塞舌尔\nSDG,Sudanese Pound,苏丹镑,Sudan,苏丹\nSEK,Swedish Krona,瑞典克朗,Sweden,瑞典\nSGD,Singapore Dollar,新加坡元,Singapore,新加坡\nSHP,Saint Helena Pound,圣赫勒拿镑,Saint Helena,圣赫勒拿\nSLE,Sierra Leonean Leone,塞拉利昂利昂,Sierra Leone,塞拉利昂\nSLL,Sierra Leonean Leone,塞拉利昂利昂(旧),Sierra Leone,塞拉利昂\nSOS,Somali Shilling,索马里先令,Somalia,索马里\nSRD,Surinamese Dollar,苏里南元,Suriname,苏里南\nSSP,South Sudanese Pound,南苏丹镑,South Sudan,南苏丹\nSTN,São Tomé and Príncipe Dobra,圣多美多布拉,São Tomé and Príncipe,圣多美和普林西比\nSYP,Syrian Pound,叙利亚镑,Syria,叙利亚\nSZL,Eswatini Lilangeni,斯威士兰里兰吉尼,Eswatini,斯威士兰\nTHB,Thai Baht,泰铢,Thailand,泰国\nTJS,Tajikistani Somoni,塔吉克斯坦索莫尼,Tajikistan,塔吉克斯坦\nTMT,Turkmenistan Manat,土库曼斯坦马纳特,Turkmenistan,土库曼斯坦\nTND,Tunisian Dinar,突尼斯第纳尔,Tunisia,突尼斯\nTOP,Tongan Paʻanga,汤加潘加,Tonga,汤加\nTRY,Turkish Lira,土耳其里拉,Turkey,土耳其\nTTD,Trinidad and Tobago Dollar,特立尼达和多巴哥元,Trinidad and Tobago,特立尼达和多巴哥\nTVD,Tuvaluan Dollar,图瓦卢元,Tuvalu,图瓦卢\nTWD,New Taiwan Dollar,新台币,Taiwan,中国台湾\nTZS,Tanzanian Shilling,坦桑尼亚先令,Tanzania,坦桑尼亚\nUAH,Ukrainian Hryvnia,乌克兰格里夫纳,Ukraine,乌克兰\nUGX,Ugandan Shilling,乌干达先令,Uganda,乌干达\nUSD,United States Dollar,美元,United States,美国\nUYU,Uruguayan Peso,乌拉圭比索,Uruguay,乌拉圭\nUZS,Uzbekistani So'm,乌兹别克斯坦苏姆,Uzbekistan,乌兹别克斯坦\nVES,Venezuelan Bolívar Soberano,委内瑞拉玻利瓦尔,Venezuela,委内瑞拉\nVND,Vietnamese Đồng,越南盾,Vietnam,越南\nVUV,Vanuatu Vatu,瓦努阿图瓦图,Vanuatu,瓦努阿图\nWST,Samoan Tālā,萨摩亚塔拉,Samoa,萨摩亚\nXAF,Central African CFA Franc,中非法郎,Central African States,中非国家\nXCD,East Caribbean Dollar,东加勒比元,East Caribbean States,东加勒比国家\nXCG,Caribbean Guilder,加勒比盾,Caribbean,加勒比地区\nXDR,Special Drawing Rights,特别提款权,International Monetary Fund,国际货币基金组织\nXOF,West African CFA franc,西非法郎,West African States,西非国家\nXPF,CFP Franc,太平洋法郎,French Pacific Territories,法属太平洋领地\nYER,Yemeni Rial,也门里亚尔,Yemen,也门\nZAR,South African Rand,南非兰特,South Africa,南非\nZMW,Zambian Kwacha,赞比亚克瓦查,Zambia,赞比亚\nZWG,Zimbabwean Dollar,津巴布韦元(新),Zimbabwe,津巴布韦\nZWL,Zimbabwean Dollar,津巴布韦元,Zimbabwe,津巴布韦\n".split(/\r?\n/),n=[];for(let e=0;e<a.length;e++){const r=a[e].trim();if(!r)continue;if(0===e&&r.toLowerCase().startsWith("code,"))continue;const i=r.split(",");i.length>=5&&n.push({code:i[0].trim(),name:i[1].trim(),name_cn:i[2].trim(),country:i[3].trim(),country_cn:i[4].trim()})}return n}(),this.currencyCodeSet=new Set(this.currencies.map(a=>a.code))}validateCurrencyCode(a){const n=a.toUpperCase();if(!this.currencyCodeSet.has(n))throw r("INVALID_CURRENCY_CODE",`Invalid currency code: ${a}. The currency code is not in the supported list.`,{code:a})}async getRates(a){const n=a.toUpperCase();this.validateCurrencyCode(n);const e=`rates_${n}`,s=this.cache.get(e);if(s)return s;const l=`https://api.exchangerate-api.com/v4/latest/${encodeURIComponent(n)}`,c=await async function(a,n){let e,s;for(let l=0;l<=n.maxRetries;l++)try{const e=await t(a,n.timeout);if(s=e.status,!e.ok){if(o(null,e.status)&&l<n.maxRetries){const a=n.retryDelay*Math.pow(2,l);await i(a);continue}throw r("API_ERROR",`API request failed with status ${e.status}`,{status:e.status})}return await e.json()}catch(a){if(e=a,a instanceof Error&&"ExchangeRateSDKError"===a.name&&!o(null,s))throw a;if(a instanceof Error&&"AbortError"===a.name&&(e=r("TIMEOUT_ERROR","Request timeout")),o(a,s)&&l<n.maxRetries){const a=n.retryDelay*Math.pow(2,l);await i(a);continue}if(a instanceof Error&&"ExchangeRateSDKError"===a.name)throw a;throw r("NETWORK_ERROR",a instanceof Error?a.message:"Network request failed",a)}if(e instanceof Error&&"ExchangeRateSDKError"===e.name)throw e;throw r("NETWORK_ERROR","All retry attempts failed",e)}(l,{timeout:this.timeout,maxRetries:this.maxRetries,retryDelay:this.retryDelay});if(!c||!c.rates||c.base!==n)throw r("API_ERROR","Invalid API response format",{response:c});const u={base:c.base,date:c.date,rates:c.rates};return this.cache.set(e,u),u}async getRate(a,n){const e=a.toUpperCase(),i=n.toUpperCase();if(this.validateCurrencyCode(e),this.validateCurrencyCode(i),e===i)return 1;const t=(await this.getRates(e)).rates[i];if(void 0===t)throw r("API_ERROR",`Exchange rate not found for ${e} to ${i}`,{from:e,to:i});return t}async convert(a,n,e){const r=await this.getRate(n,e);return{amount:a*r,from:n.toUpperCase(),to:e.toUpperCase(),rate:r}}getCurrency(a){const n=a.toUpperCase();return this.validateCurrencyCode(n),this.currencies.find(a=>a.code===n)}getCurrencies(){return[...this.currencies]}searchCurrency(a){const n=a.toLowerCase();return this.currencies.filter(e=>e.code.toLowerCase().includes(n)||e.name.toLowerCase().includes(n)||e.name_cn.includes(a)||e.country.toLowerCase().includes(n)||e.country_cn.includes(a))}clearCache(){this.cache.clear()}setCacheTTL(a){this.cacheTTL=a,this.cache.setTTL(a)}}exports.ExchangeRateSDK=s,exports.createError=r,exports.default=s,exports.isSDKError=function(a){return a instanceof Error&&"code"in a&&"ExchangeRateSDKError"===a.name};
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- export { ExchangeRateClient } from './client';
1
+ export { ExchangeRateSDK } from './client';
2
+ export { default } from './client';
2
3
  export { createError, isSDKError } from './error';
3
- export type { ExchangeRateClientOptions, Currency, RatesResponse, ConvertResult, CacheEntry, ErrorCode, SDKError, } from './types';
4
+ export type { ExchangeRateSDKOptions, Currency, RatesResponse, ConvertResult, CacheEntry, ErrorCode, SDKError, } from './types';
package/dist/index.esm.js CHANGED
@@ -1 +1 @@
1
- const a="exchange_rate_sdk_";function n(){return"undefined"!=typeof window&&void 0!==window.localStorage}class e{constructor(a){this.memoryCache=new Map,this.ttl=a}get(e){const i=a+e,r=this.memoryCache.get(i);if(r){if(Date.now()<r.expiresAt)return r.data;this.memoryCache.delete(i)}if(n())try{const a=localStorage.getItem(i);if(a){const n=JSON.parse(a);if(Date.now()<n.expiresAt)return this.memoryCache.set(i,n),n.data;localStorage.removeItem(i)}}catch{}return null}set(e,i){const r=a+e,t={data:i,expiresAt:Date.now()+this.ttl};if(this.memoryCache.set(r,t),n())try{localStorage.setItem(r,JSON.stringify(t))}catch{}}delete(e){const i=a+e;if(this.memoryCache.delete(i),n())try{localStorage.removeItem(i)}catch{}}clear(){if(this.memoryCache.clear(),n())try{const n=[];for(let e=0;e<localStorage.length;e++){const i=localStorage.key(e);i&&i.startsWith(a)&&n.push(i)}n.forEach(a=>localStorage.removeItem(a))}catch{}}setTTL(a){this.ttl=a}}function i(a,n,e){const i=new Error(n);return i.code=a,i.name="ExchangeRateSDKError",void 0!==e&&(i.details=e),i}function r(a){return a instanceof Error&&"code"in a&&"ExchangeRateSDKError"===a.name}function t(a){return new Promise(n=>setTimeout(n,a))}async function o(a,n){const e=new AbortController,i=setTimeout(()=>e.abort(),n);try{return await fetch(a,{signal:e.signal,headers:{"User-Agent":"ExchangeRateSDK/1.0.0"}})}finally{clearTimeout(i)}}function s(a,n){if(a instanceof Error){if("AbortError"===a.name)return!0;if(a.message.includes("network"))return!0;if(a.message.includes("timeout"))return!0}return!!(n&&n>=500&&n<600)||429===n}class l{constructor(a={}){this.cacheTTL=a.cacheTTL??864e5,this.timeout=a.timeout??1e4,this.baseUrl=a.baseUrl??"https://api.exchangerate-api.com/v4/latest",this.maxRetries=a.maxRetries??3,this.retryDelay=a.retryDelay??1e3,this.cache=new e(this.cacheTTL),this.currencies=function(){const a="code,name,name_cn,country,country_cn\nAED,UAE Dirham,阿联酋迪拉姆,United Arab Emirates,阿联酋\nAFN,Afghan Afghani,阿富汗尼,Afghanistan,阿富汗\nALL,Albanian Lek,阿尔巴尼亚列克,Albania,阿尔巴尼亚\nAMD,Armenian Dram,亚美尼亚德拉姆,Armenia,亚美尼亚\nANG,Netherlands Antillian Guilder,荷属安的列斯盾,Netherlands Antilles,荷属安的列斯\nAOA,Angolan Kwanza,安哥拉宽扎,Angola,安哥拉\nARS,Argentine Peso,阿根廷比索,Argentina,阿根廷\nAUD,Australian Dollar,澳大利亚元,Australia,澳大利亚\nAWG,Aruban Florin,阿鲁巴弗罗林,Aruba,阿鲁巴\nAZN,Azerbaijani Manat,阿塞拜疆马纳特,Azerbaijan,阿塞拜疆\nBAM,Bosnia and Herzegovina Convertible Mark,波黑可兑换马克,Bosnia and Herzegovina,波斯尼亚和黑塞哥维那\nBBD,Barbados Dollar,巴巴多斯元,Barbados,巴巴多斯\nBDT,Bangladeshi Taka,孟加拉塔卡,Bangladesh,孟加拉国\nBGN,Bulgarian Lev,保加利亚列弗,Bulgaria,保加利亚\nBHD,Bahraini Dinar,巴林第纳尔,Bahrain,巴林\nBIF,Burundian Franc,布隆迪法郎,Burundi,布隆迪\nBMD,Bermudian Dollar,百慕大元,Bermuda,百慕大\nBND,Brunei Dollar,文莱元,Brunei,文莱\nBOB,Bolivian Boliviano,玻利维亚诺,Bolivia,玻利维亚\nBRL,Brazilian Real,巴西雷亚尔,Brazil,巴西\nBSD,Bahamian Dollar,巴哈马元,Bahamas,巴哈马\nBTN,Bhutanese Ngultrum,不丹努尔特鲁姆,Bhutan,不丹\nBWP,Botswana Pula,博茨瓦纳普拉,Botswana,博茨瓦纳\nBYN,Belarusian Ruble,白俄罗斯卢布,Belarus,白俄罗斯\nBZD,Belize Dollar,伯利兹元,Belize,伯利兹\nCAD,Canadian Dollar,加拿大元,Canada,加拿大\nCDF,Congolese Franc,刚果法郎,Democratic Republic of the Congo,刚果民主共和国\nCHF,Swiss Franc,瑞士法郎,Switzerland,瑞士\nCLF,Chilean Unidad de Fomento,智利发展单位,Chile,智利\nCLP,Chilean Peso,智利比索,Chile,智利\nCNH,Offshore Chinese Renminbi,离岸人民币,China,中国\nCNY,Chinese Renminbi,人民币,China,中国\nCOP,Colombian Peso,哥伦比亚比索,Colombia,哥伦比亚\nCRC,Costa Rican Colon,哥斯达黎加科朗,Costa Rica,哥斯达黎加\nCUP,Cuban Peso,古巴比索,Cuba,古巴\nCVE,Cape Verdean Escudo,佛得角埃斯库多,Cape Verde,佛得角\nCZK,Czech Koruna,捷克克朗,Czech Republic,捷克\nDJF,Djiboutian Franc,吉布提法郎,Djibouti,吉布提\nDKK,Danish Krone,丹麦克朗,Denmark,丹麦\nDOP,Dominican Peso,多米尼加比索,Dominican Republic,多米尼加\nDZD,Algerian Dinar,阿尔及利亚第纳尔,Algeria,阿尔及利亚\nEGP,Egyptian Pound,埃及镑,Egypt,埃及\nERN,Eritrean Nakfa,厄立特里亚纳克法,Eritrea,厄立特里亚\nETB,Ethiopian Birr,埃塞俄比亚比尔,Ethiopia,埃塞俄比亚\nEUR,Euro,欧元,European Union,欧盟\nFJD,Fiji Dollar,斐济元,Fiji,斐济\nFKP,Falkland Islands Pound,福克兰群岛镑,Falkland Islands,福克兰群岛\nFOK,Faroese Króna,法罗克朗,Faroe Islands,法罗群岛\nGBP,Pound Sterling,英镑,United Kingdom,英国\nGEL,Georgian Lari,格鲁吉亚拉里,Georgia,格鲁吉亚\nGGP,Guernsey Pound,根西岛镑,Guernsey,根西岛\nGHS,Ghanaian Cedi,加纳塞地,Ghana,加纳\nGIP,Gibraltar Pound,直布罗陀镑,Gibraltar,直布罗陀\nGMD,Gambian Dalasi,冈比亚达拉西,Gambia,冈比亚\nGNF,Guinean Franc,几内亚法郎,Guinea,几内亚\nGTQ,Guatemalan Quetzal,危地马拉格查尔,Guatemala,危地马拉\nGYD,Guyanese Dollar,圭亚那元,Guyana,圭亚那\nHKD,Hong Kong Dollar,港元,Hong Kong,中国香港\nHNL,Honduran Lempira,洪都拉斯伦皮拉,Honduras,洪都拉斯\nHRK,Croatian Kuna,克罗地亚库纳,Croatia,克罗地亚\nHTG,Haitian Gourde,海地古德,Haiti,海地\nHUF,Hungarian Forint,匈牙利福林,Hungary,匈牙利\nIDR,Indonesian Rupiah,印尼盾,Indonesia,印度尼西亚\nILS,Israeli New Shekel,以色列新谢克尔,Israel,以色列\nIMP,Manx Pound,马恩岛镑,Isle of Man,马恩岛\nINR,Indian Rupee,印度卢比,India,印度\nIQD,Iraqi Dinar,伊拉克第纳尔,Iraq,伊拉克\nIRR,Iranian Rial,伊朗里亚尔,Iran,伊朗\nISK,Icelandic Króna,冰岛克朗,Iceland,冰岛\nJEP,Jersey Pound,泽西岛镑,Jersey,泽西岛\nJMD,Jamaican Dollar,牙买加元,Jamaica,牙买加\nJOD,Jordanian Dinar,约旦第纳尔,Jordan,约旦\nJPY,Japanese Yen,日元,Japan,日本\nKES,Kenyan Shilling,肯尼亚先令,Kenya,肯尼亚\nKGS,Kyrgyzstani Som,吉尔吉斯斯坦索姆,Kyrgyzstan,吉尔吉斯斯坦\nKHR,Cambodian Riel,柬埔寨瑞尔,Cambodia,柬埔寨\nKID,Kiribati Dollar,基里巴斯元,Kiribati,基里巴斯\nKMF,Comorian Franc,科摩罗法郎,Comoros,科摩罗\nKRW,South Korean Won,韩元,South Korea,韩国\nKWD,Kuwaiti Dinar,科威特第纳尔,Kuwait,科威特\nKYD,Cayman Islands Dollar,开曼群岛元,Cayman Islands,开曼群岛\nKZT,Kazakhstani Tenge,哈萨克斯坦坚戈,Kazakhstan,哈萨克斯坦\nLAK,Lao Kip,老挝基普,Laos,老挝\nLBP,Lebanese Pound,黎巴嫩镑,Lebanon,黎巴嫩\nLKR,Sri Lanka Rupee,斯里兰卡卢比,Sri Lanka,斯里兰卡\nLRD,Liberian Dollar,利比里亚元,Liberia,利比里亚\nLSL,Lesotho Loti,莱索托洛蒂,Lesotho,莱索托\nLYD,Libyan Dinar,利比亚第纳尔,Libya,利比亚\nMAD,Moroccan Dirham,摩洛哥迪拉姆,Morocco,摩洛哥\nMDL,Moldovan Leu,摩尔多瓦列伊,Moldova,摩尔多瓦\nMGA,Malagasy Ariary,马达加斯加阿里亚里,Madagascar,马达加斯加\nMKD,Macedonian Denar,北马其顿第纳尔,North Macedonia,北马其顿\nMMK,Burmese Kyat,缅甸元,Myanmar,缅甸\nMNT,Mongolian Tögrög,蒙古图格里克,Mongolia,蒙古\nMOP,Macanese Pataca,澳门元,Macau,中国澳门\nMRU,Mauritanian Ouguiya,毛里塔尼亚乌吉亚,Mauritania,毛里塔尼亚\nMUR,Mauritian Rupee,毛里求斯卢比,Mauritius,毛里求斯\nMVR,Maldivian Rufiyaa,马尔代夫拉菲亚,Maldives,马尔代夫\nMWK,Malawian Kwacha,马拉维克瓦查,Malawi,马拉维\nMXN,Mexican Peso,墨西哥比索,Mexico,墨西哥\nMYR,Malaysian Ringgit,马来西亚林吉特,Malaysia,马来西亚\nMZN,Mozambican Metical,莫桑比克梅蒂卡尔,Mozambique,莫桑比克\nNAD,Namibian Dollar,纳米比亚元,Namibia,纳米比亚\nNGN,Nigerian Naira,尼日利亚奈拉,Nigeria,尼日利亚\nNIO,Nicaraguan Córdoba,尼加拉瓜科多巴,Nicaragua,尼加拉瓜\nNOK,Norwegian Krone,挪威克朗,Norway,挪威\nNPR,Nepalese Rupee,尼泊尔卢比,Nepal,尼泊尔\nNZD,New Zealand Dollar,新西兰元,New Zealand,新西兰\nOMR,Omani Rial,阿曼里亚尔,Oman,阿曼\nPAB,Panamanian Balboa,巴拿马巴波亚,Panama,巴拿马\nPEN,Peruvian Sol,秘鲁索尔,Peru,秘鲁\nPGK,Papua New Guinean Kina,巴布亚新几内亚基那,Papua New Guinea,巴布亚新几内亚\nPHP,Philippine Peso,菲律宾比索,Philippines,菲律宾\nPKR,Pakistani Rupee,巴基斯坦卢比,Pakistan,巴基斯坦\nPLN,Polish Złoty,波兰兹罗提,Poland,波兰\nPYG,Paraguayan Guaraní,巴拉圭瓜拉尼,Paraguay,巴拉圭\nQAR,Qatari Riyal,卡塔尔里亚尔,Qatar,卡塔尔\nRON,Romanian Leu,罗马尼亚列伊,Romania,罗马尼亚\nRSD,Serbian Dinar,塞尔维亚第纳尔,Serbia,塞尔维亚\nRUB,Russian Ruble,俄罗斯卢布,Russia,俄罗斯\nRWF,Rwandan Franc,卢旺达法郎,Rwanda,卢旺达\nSAR,Saudi Riyal,沙特里亚尔,Saudi Arabia,沙特阿拉伯\nSBD,Solomon Islands Dollar,所罗门群岛元,Solomon Islands,所罗门群岛\nSCR,Seychellois Rupee,塞舌尔卢比,Seychelles,塞舌尔\nSDG,Sudanese Pound,苏丹镑,Sudan,苏丹\nSEK,Swedish Krona,瑞典克朗,Sweden,瑞典\nSGD,Singapore Dollar,新加坡元,Singapore,新加坡\nSHP,Saint Helena Pound,圣赫勒拿镑,Saint Helena,圣赫勒拿\nSLE,Sierra Leonean Leone,塞拉利昂利昂,Sierra Leone,塞拉利昂\nSLL,Sierra Leonean Leone,塞拉利昂利昂(旧),Sierra Leone,塞拉利昂\nSOS,Somali Shilling,索马里先令,Somalia,索马里\nSRD,Surinamese Dollar,苏里南元,Suriname,苏里南\nSSP,South Sudanese Pound,南苏丹镑,South Sudan,南苏丹\nSTN,São Tomé and Príncipe Dobra,圣多美多布拉,São Tomé and Príncipe,圣多美和普林西比\nSYP,Syrian Pound,叙利亚镑,Syria,叙利亚\nSZL,Eswatini Lilangeni,斯威士兰里兰吉尼,Eswatini,斯威士兰\nTHB,Thai Baht,泰铢,Thailand,泰国\nTJS,Tajikistani Somoni,塔吉克斯坦索莫尼,Tajikistan,塔吉克斯坦\nTMT,Turkmenistan Manat,土库曼斯坦马纳特,Turkmenistan,土库曼斯坦\nTND,Tunisian Dinar,突尼斯第纳尔,Tunisia,突尼斯\nTOP,Tongan Paʻanga,汤加潘加,Tonga,汤加\nTRY,Turkish Lira,土耳其里拉,Turkey,土耳其\nTTD,Trinidad and Tobago Dollar,特立尼达和多巴哥元,Trinidad and Tobago,特立尼达和多巴哥\nTVD,Tuvaluan Dollar,图瓦卢元,Tuvalu,图瓦卢\nTWD,New Taiwan Dollar,新台币,Taiwan,中国台湾\nTZS,Tanzanian Shilling,坦桑尼亚先令,Tanzania,坦桑尼亚\nUAH,Ukrainian Hryvnia,乌克兰格里夫纳,Ukraine,乌克兰\nUGX,Ugandan Shilling,乌干达先令,Uganda,乌干达\nUSD,United States Dollar,美元,United States,美国\nUYU,Uruguayan Peso,乌拉圭比索,Uruguay,乌拉圭\nUZS,Uzbekistani So'm,乌兹别克斯坦苏姆,Uzbekistan,乌兹别克斯坦\nVES,Venezuelan Bolívar Soberano,委内瑞拉玻利瓦尔,Venezuela,委内瑞拉\nVND,Vietnamese Đồng,越南盾,Vietnam,越南\nVUV,Vanuatu Vatu,瓦努阿图瓦图,Vanuatu,瓦努阿图\nWST,Samoan Tālā,萨摩亚塔拉,Samoa,萨摩亚\nXAF,Central African CFA Franc,中非法郎,Central African States,中非国家\nXCD,East Caribbean Dollar,东加勒比元,East Caribbean States,东加勒比国家\nXCG,Caribbean Guilder,加勒比盾,Caribbean,加勒比地区\nXDR,Special Drawing Rights,特别提款权,International Monetary Fund,国际货币基金组织\nXOF,West African CFA franc,西非法郎,West African States,西非国家\nXPF,CFP Franc,太平洋法郎,French Pacific Territories,法属太平洋领地\nYER,Yemeni Rial,也门里亚尔,Yemen,也门\nZAR,South African Rand,南非兰特,South Africa,南非\nZMW,Zambian Kwacha,赞比亚克瓦查,Zambia,赞比亚\nZWG,Zimbabwean Dollar,津巴布韦元(新),Zimbabwe,津巴布韦\nZWL,Zimbabwean Dollar,津巴布韦元,Zimbabwe,津巴布韦\n".split(/\r?\n/),n=[];for(let e=0;e<a.length;e++){const i=a[e].trim();if(!i)continue;if(0===e&&i.toLowerCase().startsWith("code,"))continue;const r=i.split(",");r.length>=5&&n.push({code:r[0].trim(),name:r[1].trim(),name_cn:r[2].trim(),country:r[3].trim(),country_cn:r[4].trim()})}return n}(),this.currencyCodeSet=new Set(this.currencies.map(a=>a.code))}validateCurrencyCode(a){const n=a.toUpperCase();if(!this.currencyCodeSet.has(n))throw i("INVALID_CURRENCY_CODE",`Invalid currency code: ${a}. The currency code is not in the supported list.`,{code:a})}async getRates(a){const n=a.toUpperCase();this.validateCurrencyCode(n);const e=`rates_${n}`,r=this.cache.get(e);if(r)return r;const l=`${this.baseUrl}/${encodeURIComponent(n)}`,c=await async function(a,n){let e,r;for(let l=0;l<=n.maxRetries;l++)try{const e=await o(a,n.timeout);if(r=e.status,!e.ok){if(s(null,e.status)&&l<n.maxRetries){const a=n.retryDelay*Math.pow(2,l);await t(a);continue}throw i("API_ERROR",`API request failed with status ${e.status}`,{status:e.status})}return await e.json()}catch(a){if(e=a,a instanceof Error&&"ExchangeRateSDKError"===a.name&&!s(null,r))throw a;if(a instanceof Error&&"AbortError"===a.name&&(e=i("TIMEOUT_ERROR","Request timeout")),s(a,r)&&l<n.maxRetries){const a=n.retryDelay*Math.pow(2,l);await t(a);continue}if(a instanceof Error&&"ExchangeRateSDKError"===a.name)throw a;throw i("NETWORK_ERROR",a instanceof Error?a.message:"Network request failed",a)}if(e instanceof Error&&"ExchangeRateSDKError"===e.name)throw e;throw i("NETWORK_ERROR","All retry attempts failed",e)}(l,{timeout:this.timeout,maxRetries:this.maxRetries,retryDelay:this.retryDelay});if(!c||!c.rates||c.base!==n)throw i("API_ERROR","Invalid API response format",{response:c});return this.cache.set(e,c),c}async getRate(a,n){const e=a.toUpperCase(),r=n.toUpperCase();if(this.validateCurrencyCode(e),this.validateCurrencyCode(r),e===r)return 1;const t=(await this.getRates(e)).rates[r];if(void 0===t)throw i("API_ERROR",`Exchange rate not found for ${e} to ${r}`,{from:e,to:r});return t}async convert(a,n,e){const i=await this.getRate(n,e);return{amount:a*i,from:n.toUpperCase(),to:e.toUpperCase(),rate:i}}getCurrency(a){const n=a.toUpperCase();return this.validateCurrencyCode(n),this.currencies.find(a=>a.code===n)}getCurrencies(){return[...this.currencies]}searchCurrency(a){const n=a.toLowerCase();return this.currencies.filter(e=>e.code.toLowerCase().includes(n)||e.name.toLowerCase().includes(n)||e.name_cn.includes(a)||e.country.toLowerCase().includes(n)||e.country_cn.includes(a))}clearCache(){this.cache.clear()}setCacheTTL(a){this.cacheTTL=a,this.cache.setTTL(a)}}export{l as ExchangeRateClient,i as createError,r as isSDKError};
1
+ const a="exchange_rate_sdk_";function n(){return"undefined"!=typeof window&&void 0!==window.localStorage}class e{constructor(a){this.memoryCache=new Map,this.ttl=a}get(e){const i=a+e,r=this.memoryCache.get(i);if(r){if(Date.now()<r.expiresAt)return r.data;this.memoryCache.delete(i)}if(n())try{const a=localStorage.getItem(i);if(a){const n=JSON.parse(a);if(Date.now()<n.expiresAt)return this.memoryCache.set(i,n),n.data;localStorage.removeItem(i)}}catch{}return null}set(e,i){const r=a+e,t={data:i,expiresAt:Date.now()+this.ttl};if(this.memoryCache.set(r,t),n())try{localStorage.setItem(r,JSON.stringify(t))}catch{}}delete(e){const i=a+e;if(this.memoryCache.delete(i),n())try{localStorage.removeItem(i)}catch{}}clear(){if(this.memoryCache.clear(),n())try{const n=[];for(let e=0;e<localStorage.length;e++){const i=localStorage.key(e);i&&i.startsWith(a)&&n.push(i)}n.forEach(a=>localStorage.removeItem(a))}catch{}}setTTL(a){this.ttl=a}}function i(a,n,e){const i=new Error(n);return i.code=a,i.name="ExchangeRateSDKError",void 0!==e&&(i.details=e),i}function r(a){return a instanceof Error&&"code"in a&&"ExchangeRateSDKError"===a.name}function t(a){return new Promise(n=>setTimeout(n,a))}async function o(a,n){const e=new AbortController,i=setTimeout(()=>e.abort(),n);try{return await fetch(a,{signal:e.signal,headers:{"User-Agent":"ExchangeRateSDK/1.0.0"}})}finally{clearTimeout(i)}}function s(a,n){if(a instanceof Error){if("AbortError"===a.name)return!0;if(a.message.includes("network"))return!0;if(a.message.includes("timeout"))return!0}return!!(n&&n>=500&&n<600)||429===n}class l{constructor(a={}){this.cacheTTL=a.cacheTTL??864e5,this.timeout=a.timeout??1e4,this.maxRetries=a.maxRetries??3,this.retryDelay=a.retryDelay??1e3,this.cache=new e(this.cacheTTL),this.currencies=function(){const a="code,name,name_cn,country,country_cn\nAED,UAE Dirham,阿联酋迪拉姆,United Arab Emirates,阿联酋\nAFN,Afghan Afghani,阿富汗尼,Afghanistan,阿富汗\nALL,Albanian Lek,阿尔巴尼亚列克,Albania,阿尔巴尼亚\nAMD,Armenian Dram,亚美尼亚德拉姆,Armenia,亚美尼亚\nANG,Netherlands Antillian Guilder,荷属安的列斯盾,Netherlands Antilles,荷属安的列斯\nAOA,Angolan Kwanza,安哥拉宽扎,Angola,安哥拉\nARS,Argentine Peso,阿根廷比索,Argentina,阿根廷\nAUD,Australian Dollar,澳大利亚元,Australia,澳大利亚\nAWG,Aruban Florin,阿鲁巴弗罗林,Aruba,阿鲁巴\nAZN,Azerbaijani Manat,阿塞拜疆马纳特,Azerbaijan,阿塞拜疆\nBAM,Bosnia and Herzegovina Convertible Mark,波黑可兑换马克,Bosnia and Herzegovina,波斯尼亚和黑塞哥维那\nBBD,Barbados Dollar,巴巴多斯元,Barbados,巴巴多斯\nBDT,Bangladeshi Taka,孟加拉塔卡,Bangladesh,孟加拉国\nBGN,Bulgarian Lev,保加利亚列弗,Bulgaria,保加利亚\nBHD,Bahraini Dinar,巴林第纳尔,Bahrain,巴林\nBIF,Burundian Franc,布隆迪法郎,Burundi,布隆迪\nBMD,Bermudian Dollar,百慕大元,Bermuda,百慕大\nBND,Brunei Dollar,文莱元,Brunei,文莱\nBOB,Bolivian Boliviano,玻利维亚诺,Bolivia,玻利维亚\nBRL,Brazilian Real,巴西雷亚尔,Brazil,巴西\nBSD,Bahamian Dollar,巴哈马元,Bahamas,巴哈马\nBTN,Bhutanese Ngultrum,不丹努尔特鲁姆,Bhutan,不丹\nBWP,Botswana Pula,博茨瓦纳普拉,Botswana,博茨瓦纳\nBYN,Belarusian Ruble,白俄罗斯卢布,Belarus,白俄罗斯\nBZD,Belize Dollar,伯利兹元,Belize,伯利兹\nCAD,Canadian Dollar,加拿大元,Canada,加拿大\nCDF,Congolese Franc,刚果法郎,Democratic Republic of the Congo,刚果民主共和国\nCHF,Swiss Franc,瑞士法郎,Switzerland,瑞士\nCLF,Chilean Unidad de Fomento,智利发展单位,Chile,智利\nCLP,Chilean Peso,智利比索,Chile,智利\nCNH,Offshore Chinese Renminbi,离岸人民币,China,中国\nCNY,Chinese Renminbi,人民币,China,中国\nCOP,Colombian Peso,哥伦比亚比索,Colombia,哥伦比亚\nCRC,Costa Rican Colon,哥斯达黎加科朗,Costa Rica,哥斯达黎加\nCUP,Cuban Peso,古巴比索,Cuba,古巴\nCVE,Cape Verdean Escudo,佛得角埃斯库多,Cape Verde,佛得角\nCZK,Czech Koruna,捷克克朗,Czech Republic,捷克\nDJF,Djiboutian Franc,吉布提法郎,Djibouti,吉布提\nDKK,Danish Krone,丹麦克朗,Denmark,丹麦\nDOP,Dominican Peso,多米尼加比索,Dominican Republic,多米尼加\nDZD,Algerian Dinar,阿尔及利亚第纳尔,Algeria,阿尔及利亚\nEGP,Egyptian Pound,埃及镑,Egypt,埃及\nERN,Eritrean Nakfa,厄立特里亚纳克法,Eritrea,厄立特里亚\nETB,Ethiopian Birr,埃塞俄比亚比尔,Ethiopia,埃塞俄比亚\nEUR,Euro,欧元,European Union,欧盟\nFJD,Fiji Dollar,斐济元,Fiji,斐济\nFKP,Falkland Islands Pound,福克兰群岛镑,Falkland Islands,福克兰群岛\nFOK,Faroese Króna,法罗克朗,Faroe Islands,法罗群岛\nGBP,Pound Sterling,英镑,United Kingdom,英国\nGEL,Georgian Lari,格鲁吉亚拉里,Georgia,格鲁吉亚\nGGP,Guernsey Pound,根西岛镑,Guernsey,根西岛\nGHS,Ghanaian Cedi,加纳塞地,Ghana,加纳\nGIP,Gibraltar Pound,直布罗陀镑,Gibraltar,直布罗陀\nGMD,Gambian Dalasi,冈比亚达拉西,Gambia,冈比亚\nGNF,Guinean Franc,几内亚法郎,Guinea,几内亚\nGTQ,Guatemalan Quetzal,危地马拉格查尔,Guatemala,危地马拉\nGYD,Guyanese Dollar,圭亚那元,Guyana,圭亚那\nHKD,Hong Kong Dollar,港元,Hong Kong,中国香港\nHNL,Honduran Lempira,洪都拉斯伦皮拉,Honduras,洪都拉斯\nHRK,Croatian Kuna,克罗地亚库纳,Croatia,克罗地亚\nHTG,Haitian Gourde,海地古德,Haiti,海地\nHUF,Hungarian Forint,匈牙利福林,Hungary,匈牙利\nIDR,Indonesian Rupiah,印尼盾,Indonesia,印度尼西亚\nILS,Israeli New Shekel,以色列新谢克尔,Israel,以色列\nIMP,Manx Pound,马恩岛镑,Isle of Man,马恩岛\nINR,Indian Rupee,印度卢比,India,印度\nIQD,Iraqi Dinar,伊拉克第纳尔,Iraq,伊拉克\nIRR,Iranian Rial,伊朗里亚尔,Iran,伊朗\nISK,Icelandic Króna,冰岛克朗,Iceland,冰岛\nJEP,Jersey Pound,泽西岛镑,Jersey,泽西岛\nJMD,Jamaican Dollar,牙买加元,Jamaica,牙买加\nJOD,Jordanian Dinar,约旦第纳尔,Jordan,约旦\nJPY,Japanese Yen,日元,Japan,日本\nKES,Kenyan Shilling,肯尼亚先令,Kenya,肯尼亚\nKGS,Kyrgyzstani Som,吉尔吉斯斯坦索姆,Kyrgyzstan,吉尔吉斯斯坦\nKHR,Cambodian Riel,柬埔寨瑞尔,Cambodia,柬埔寨\nKID,Kiribati Dollar,基里巴斯元,Kiribati,基里巴斯\nKMF,Comorian Franc,科摩罗法郎,Comoros,科摩罗\nKRW,South Korean Won,韩元,South Korea,韩国\nKWD,Kuwaiti Dinar,科威特第纳尔,Kuwait,科威特\nKYD,Cayman Islands Dollar,开曼群岛元,Cayman Islands,开曼群岛\nKZT,Kazakhstani Tenge,哈萨克斯坦坚戈,Kazakhstan,哈萨克斯坦\nLAK,Lao Kip,老挝基普,Laos,老挝\nLBP,Lebanese Pound,黎巴嫩镑,Lebanon,黎巴嫩\nLKR,Sri Lanka Rupee,斯里兰卡卢比,Sri Lanka,斯里兰卡\nLRD,Liberian Dollar,利比里亚元,Liberia,利比里亚\nLSL,Lesotho Loti,莱索托洛蒂,Lesotho,莱索托\nLYD,Libyan Dinar,利比亚第纳尔,Libya,利比亚\nMAD,Moroccan Dirham,摩洛哥迪拉姆,Morocco,摩洛哥\nMDL,Moldovan Leu,摩尔多瓦列伊,Moldova,摩尔多瓦\nMGA,Malagasy Ariary,马达加斯加阿里亚里,Madagascar,马达加斯加\nMKD,Macedonian Denar,北马其顿第纳尔,North Macedonia,北马其顿\nMMK,Burmese Kyat,缅甸元,Myanmar,缅甸\nMNT,Mongolian Tögrög,蒙古图格里克,Mongolia,蒙古\nMOP,Macanese Pataca,澳门元,Macau,中国澳门\nMRU,Mauritanian Ouguiya,毛里塔尼亚乌吉亚,Mauritania,毛里塔尼亚\nMUR,Mauritian Rupee,毛里求斯卢比,Mauritius,毛里求斯\nMVR,Maldivian Rufiyaa,马尔代夫拉菲亚,Maldives,马尔代夫\nMWK,Malawian Kwacha,马拉维克瓦查,Malawi,马拉维\nMXN,Mexican Peso,墨西哥比索,Mexico,墨西哥\nMYR,Malaysian Ringgit,马来西亚林吉特,Malaysia,马来西亚\nMZN,Mozambican Metical,莫桑比克梅蒂卡尔,Mozambique,莫桑比克\nNAD,Namibian Dollar,纳米比亚元,Namibia,纳米比亚\nNGN,Nigerian Naira,尼日利亚奈拉,Nigeria,尼日利亚\nNIO,Nicaraguan Córdoba,尼加拉瓜科多巴,Nicaragua,尼加拉瓜\nNOK,Norwegian Krone,挪威克朗,Norway,挪威\nNPR,Nepalese Rupee,尼泊尔卢比,Nepal,尼泊尔\nNZD,New Zealand Dollar,新西兰元,New Zealand,新西兰\nOMR,Omani Rial,阿曼里亚尔,Oman,阿曼\nPAB,Panamanian Balboa,巴拿马巴波亚,Panama,巴拿马\nPEN,Peruvian Sol,秘鲁索尔,Peru,秘鲁\nPGK,Papua New Guinean Kina,巴布亚新几内亚基那,Papua New Guinea,巴布亚新几内亚\nPHP,Philippine Peso,菲律宾比索,Philippines,菲律宾\nPKR,Pakistani Rupee,巴基斯坦卢比,Pakistan,巴基斯坦\nPLN,Polish Złoty,波兰兹罗提,Poland,波兰\nPYG,Paraguayan Guaraní,巴拉圭瓜拉尼,Paraguay,巴拉圭\nQAR,Qatari Riyal,卡塔尔里亚尔,Qatar,卡塔尔\nRON,Romanian Leu,罗马尼亚列伊,Romania,罗马尼亚\nRSD,Serbian Dinar,塞尔维亚第纳尔,Serbia,塞尔维亚\nRUB,Russian Ruble,俄罗斯卢布,Russia,俄罗斯\nRWF,Rwandan Franc,卢旺达法郎,Rwanda,卢旺达\nSAR,Saudi Riyal,沙特里亚尔,Saudi Arabia,沙特阿拉伯\nSBD,Solomon Islands Dollar,所罗门群岛元,Solomon Islands,所罗门群岛\nSCR,Seychellois Rupee,塞舌尔卢比,Seychelles,塞舌尔\nSDG,Sudanese Pound,苏丹镑,Sudan,苏丹\nSEK,Swedish Krona,瑞典克朗,Sweden,瑞典\nSGD,Singapore Dollar,新加坡元,Singapore,新加坡\nSHP,Saint Helena Pound,圣赫勒拿镑,Saint Helena,圣赫勒拿\nSLE,Sierra Leonean Leone,塞拉利昂利昂,Sierra Leone,塞拉利昂\nSLL,Sierra Leonean Leone,塞拉利昂利昂(旧),Sierra Leone,塞拉利昂\nSOS,Somali Shilling,索马里先令,Somalia,索马里\nSRD,Surinamese Dollar,苏里南元,Suriname,苏里南\nSSP,South Sudanese Pound,南苏丹镑,South Sudan,南苏丹\nSTN,São Tomé and Príncipe Dobra,圣多美多布拉,São Tomé and Príncipe,圣多美和普林西比\nSYP,Syrian Pound,叙利亚镑,Syria,叙利亚\nSZL,Eswatini Lilangeni,斯威士兰里兰吉尼,Eswatini,斯威士兰\nTHB,Thai Baht,泰铢,Thailand,泰国\nTJS,Tajikistani Somoni,塔吉克斯坦索莫尼,Tajikistan,塔吉克斯坦\nTMT,Turkmenistan Manat,土库曼斯坦马纳特,Turkmenistan,土库曼斯坦\nTND,Tunisian Dinar,突尼斯第纳尔,Tunisia,突尼斯\nTOP,Tongan Paʻanga,汤加潘加,Tonga,汤加\nTRY,Turkish Lira,土耳其里拉,Turkey,土耳其\nTTD,Trinidad and Tobago Dollar,特立尼达和多巴哥元,Trinidad and Tobago,特立尼达和多巴哥\nTVD,Tuvaluan Dollar,图瓦卢元,Tuvalu,图瓦卢\nTWD,New Taiwan Dollar,新台币,Taiwan,中国台湾\nTZS,Tanzanian Shilling,坦桑尼亚先令,Tanzania,坦桑尼亚\nUAH,Ukrainian Hryvnia,乌克兰格里夫纳,Ukraine,乌克兰\nUGX,Ugandan Shilling,乌干达先令,Uganda,乌干达\nUSD,United States Dollar,美元,United States,美国\nUYU,Uruguayan Peso,乌拉圭比索,Uruguay,乌拉圭\nUZS,Uzbekistani So'm,乌兹别克斯坦苏姆,Uzbekistan,乌兹别克斯坦\nVES,Venezuelan Bolívar Soberano,委内瑞拉玻利瓦尔,Venezuela,委内瑞拉\nVND,Vietnamese Đồng,越南盾,Vietnam,越南\nVUV,Vanuatu Vatu,瓦努阿图瓦图,Vanuatu,瓦努阿图\nWST,Samoan Tālā,萨摩亚塔拉,Samoa,萨摩亚\nXAF,Central African CFA Franc,中非法郎,Central African States,中非国家\nXCD,East Caribbean Dollar,东加勒比元,East Caribbean States,东加勒比国家\nXCG,Caribbean Guilder,加勒比盾,Caribbean,加勒比地区\nXDR,Special Drawing Rights,特别提款权,International Monetary Fund,国际货币基金组织\nXOF,West African CFA franc,西非法郎,West African States,西非国家\nXPF,CFP Franc,太平洋法郎,French Pacific Territories,法属太平洋领地\nYER,Yemeni Rial,也门里亚尔,Yemen,也门\nZAR,South African Rand,南非兰特,South Africa,南非\nZMW,Zambian Kwacha,赞比亚克瓦查,Zambia,赞比亚\nZWG,Zimbabwean Dollar,津巴布韦元(新),Zimbabwe,津巴布韦\nZWL,Zimbabwean Dollar,津巴布韦元,Zimbabwe,津巴布韦\n".split(/\r?\n/),n=[];for(let e=0;e<a.length;e++){const i=a[e].trim();if(!i)continue;if(0===e&&i.toLowerCase().startsWith("code,"))continue;const r=i.split(",");r.length>=5&&n.push({code:r[0].trim(),name:r[1].trim(),name_cn:r[2].trim(),country:r[3].trim(),country_cn:r[4].trim()})}return n}(),this.currencyCodeSet=new Set(this.currencies.map(a=>a.code))}validateCurrencyCode(a){const n=a.toUpperCase();if(!this.currencyCodeSet.has(n))throw i("INVALID_CURRENCY_CODE",`Invalid currency code: ${a}. The currency code is not in the supported list.`,{code:a})}async getRates(a){const n=a.toUpperCase();this.validateCurrencyCode(n);const e=`rates_${n}`,r=this.cache.get(e);if(r)return r;const l=`https://api.exchangerate-api.com/v4/latest/${encodeURIComponent(n)}`,c=await async function(a,n){let e,r;for(let l=0;l<=n.maxRetries;l++)try{const e=await o(a,n.timeout);if(r=e.status,!e.ok){if(s(null,e.status)&&l<n.maxRetries){const a=n.retryDelay*Math.pow(2,l);await t(a);continue}throw i("API_ERROR",`API request failed with status ${e.status}`,{status:e.status})}return await e.json()}catch(a){if(e=a,a instanceof Error&&"ExchangeRateSDKError"===a.name&&!s(null,r))throw a;if(a instanceof Error&&"AbortError"===a.name&&(e=i("TIMEOUT_ERROR","Request timeout")),s(a,r)&&l<n.maxRetries){const a=n.retryDelay*Math.pow(2,l);await t(a);continue}if(a instanceof Error&&"ExchangeRateSDKError"===a.name)throw a;throw i("NETWORK_ERROR",a instanceof Error?a.message:"Network request failed",a)}if(e instanceof Error&&"ExchangeRateSDKError"===e.name)throw e;throw i("NETWORK_ERROR","All retry attempts failed",e)}(l,{timeout:this.timeout,maxRetries:this.maxRetries,retryDelay:this.retryDelay});if(!c||!c.rates||c.base!==n)throw i("API_ERROR","Invalid API response format",{response:c});const u={base:c.base,date:c.date,rates:c.rates};return this.cache.set(e,u),u}async getRate(a,n){const e=a.toUpperCase(),r=n.toUpperCase();if(this.validateCurrencyCode(e),this.validateCurrencyCode(r),e===r)return 1;const t=(await this.getRates(e)).rates[r];if(void 0===t)throw i("API_ERROR",`Exchange rate not found for ${e} to ${r}`,{from:e,to:r});return t}async convert(a,n,e){const i=await this.getRate(n,e);return{amount:a*i,from:n.toUpperCase(),to:e.toUpperCase(),rate:i}}getCurrency(a){const n=a.toUpperCase();return this.validateCurrencyCode(n),this.currencies.find(a=>a.code===n)}getCurrencies(){return[...this.currencies]}searchCurrency(a){const n=a.toLowerCase();return this.currencies.filter(e=>e.code.toLowerCase().includes(n)||e.name.toLowerCase().includes(n)||e.name_cn.includes(a)||e.country.toLowerCase().includes(n)||e.country_cn.includes(a))}clearCache(){this.cache.clear()}setCacheTTL(a){this.cacheTTL=a,this.cache.setTTL(a)}}export{l as ExchangeRateSDK,i as createError,l as default,r as isSDKError};
package/dist/types.d.ts CHANGED
@@ -1,13 +1,11 @@
1
1
  /**
2
2
  * SDK 配置选项
3
3
  */
4
- export interface ExchangeRateClientOptions {
4
+ export interface ExchangeRateSDKOptions {
5
5
  /** 缓存过期时间(毫秒),默认 24 小时 */
6
6
  cacheTTL?: number;
7
7
  /** 请求超时时间(毫秒),默认 10 秒 */
8
8
  timeout?: number;
9
- /** API 基础 URL */
10
- baseUrl?: string;
11
9
  /** 最大重试次数,默认 3 */
12
10
  maxRetries?: number;
13
11
  /** 重试延迟基数(毫秒),默认 1000 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exchange-rate-sdk",
3
- "version": "0.0.1",
3
+ "version": "1.0.1",
4
4
  "type": "module",
5
5
  "description": "A lightweight, cross-platform exchange rate JavaScript SDK for browser and Node.js",
6
6
  "main": "./dist/index.cjs.js",
@@ -45,7 +45,7 @@
45
45
  "bugs": {
46
46
  "url": "https://github.com/chengzuopeng/exchange-rate-sdk/issues"
47
47
  },
48
- "homepage": "https://github.com/chengzuopeng/exchange-rate-sdk#readme",
48
+ "homepage": "https://chengzuopeng.github.io/exchange-rate-sdk",
49
49
  "devDependencies": {
50
50
  "@rollup/plugin-node-resolve": "^15.2.3",
51
51
  "@rollup/plugin-terser": "^0.4.4",
@@ -56,5 +56,8 @@
56
56
  "ts-jest": "^29.2.5",
57
57
  "tslib": "^2.8.1",
58
58
  "typescript": "^5.7.2"
59
+ },
60
+ "publishConfig": {
61
+ "registry": "https://registry.npmjs.org/"
59
62
  }
60
63
  }