easy-currencies 1.8.0 → 1.8.2
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/dist/converter.js +11 -4
- package/dist/parts/providers.d.ts +1 -1
- package/dist/parts/providers.js +15 -2
- package/package.json +2 -2
- package/src/converter.ts +12 -3
- package/src/parts/providers.ts +18 -2
- package/src/parts/requester.ts +2 -2
- package/.editorconfig +0 -6
- package/.env +0 -7
- package/.env.example +0 -5
- package/.github/workflows/nodejs.yaml +0 -55
- package/.prettierrc +0 -10
- package/_config.yml +0 -4
- package/jest.config.js +0 -13
- package/typedoc.json +0 -4
package/dist/converter.js
CHANGED
|
@@ -77,10 +77,17 @@ class Converter {
|
|
|
77
77
|
* @returns
|
|
78
78
|
*/
|
|
79
79
|
this.convertRate = (amount, to, rates = undefined) => {
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
const keys = Object.keys(rates);
|
|
81
|
+
const rateKey = keys.find(key => key.toLowerCase() === to.toLowerCase());
|
|
82
|
+
const rate = rateKey ? rates[rateKey] : undefined;
|
|
83
|
+
if (!rate) {
|
|
84
|
+
throw new Error(`No '${to}' present in rates: ${JSON.stringify(rates, null, 2)}`);
|
|
82
85
|
}
|
|
83
|
-
|
|
86
|
+
const numericRate = parseFloat(rate);
|
|
87
|
+
if (isNaN(numericRate)) {
|
|
88
|
+
throw new Error(`Invalid rate value for '${to}': ${rate}`);
|
|
89
|
+
}
|
|
90
|
+
return amount * numericRate;
|
|
84
91
|
};
|
|
85
92
|
/**
|
|
86
93
|
* Rate fetch function
|
|
@@ -145,4 +152,4 @@ class Converter {
|
|
|
145
152
|
}
|
|
146
153
|
}
|
|
147
154
|
exports.Converter = Converter;
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBK0M7QUFFL0MsMkNBQTREO0FBQzVELDJDQUFxRDtBQUE1QyxrR0FBQSxPQUFPLE9BQVc7QUFDM0IseUNBQW9DO0FBQ3BDLGtEQUEwQjtBQVkxQjs7Ozs7R0FLRztBQUNILE1BQWEsU0FBUztJQVNwQjs7OztPQUlHO0lBQ0gsWUFBWSxHQUFHLE1BQW9EO1FBcUNuRTs7O1dBR0c7UUFDSCwwQkFBcUIsR0FBRyxDQUFDLGtCQUFzQyxFQUFFLEVBQUU7WUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUM7UUFFRjs7Ozs7Ozs7Ozs7OztXQWFHO1FBQ0gsWUFBTyxHQUFHLG9DQUtTLEVBQUUseUVBSm5CLE1BQWMsRUFDZCxJQUFZLEVBQ1osRUFBVSxFQUNWLFFBQWEsU0FBUztZQUV0Qiw0Q0FBNEM7WUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUVELG9EQUFvRDtZQUNwRCxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sSUFBQSxXQUFHLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFOUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENB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
|
package/dist/parts/providers.js
CHANGED
|
@@ -114,7 +114,20 @@ exports.providers = {
|
|
|
114
114
|
503: "Invalid API key or Malformed query."
|
|
115
115
|
},
|
|
116
116
|
errorHandler: function (data) {
|
|
117
|
-
|
|
117
|
+
if (!data) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
// AlphaVantage does not return error codes in the response,
|
|
121
|
+
// so we have to check if the response contains error messages
|
|
122
|
+
// and translate them to error codes if possible.
|
|
123
|
+
const hasError = data["Error Message"] || data["Information"];
|
|
124
|
+
if (hasError === null || hasError === void 0 ? void 0 : hasError.includes("API rate limit")) {
|
|
125
|
+
return 429;
|
|
126
|
+
}
|
|
127
|
+
if (hasError) {
|
|
128
|
+
return hasError;
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
118
131
|
}
|
|
119
132
|
},
|
|
120
133
|
Fixer: {
|
|
@@ -137,4 +150,4 @@ exports.providers = {
|
|
|
137
150
|
}
|
|
138
151
|
}
|
|
139
152
|
};
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL3Byb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnR0E7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQTJCO0lBQ3pELE1BQU0sZ0JBQWdCLEdBQUcsaUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdEIsTUFBTSxzRkFBc0YsQ0FBQztJQUMvRixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGdCQUFnQixDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO0lBQ3BDLE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQVRELDBDQVNDO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLFNBQVMsR0FBYztJQUNsQyxlQUFlLEVBQUU7UUFDZixRQUFRLEVBQUU7WUFDUixJQUFJLEVBQUUsNkNBQTZDO1lBQ25ELE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFFBQVEsRUFBRSxRQUFRO1NBQ25CO1FBQ0QsR0FBRyxFQUFFLFNBQVM7UUFDZCxPQUFPLEVBQUUsVUFBVSxJQUFTO1lBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRTtRQUM5RCxZQUFZLEVBQUUsVUFBVSxJQUFTO1lBQy9CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO0tBQ0Y7SUFDRCxrQkFBa0IsRUFBRTtRQUNsQixRQUFRLEVBQUU7WUFDUixJQUFJLEVBQUUsd0RBQXdEO1lBQzlELE1BQU0sRUFBRSwyQkFBMkI7WUFDbkMsUUFBUSxFQUFFLGNBQWM7U0FDekI7UUFDRCxNQUFNLEVBQUU7WUFDTixHQUFHLEVBQUUsZ0VBQWdFO1lBQ3JFLEdB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
|
package/package.json
CHANGED
package/src/converter.ts
CHANGED
|
@@ -132,11 +132,20 @@ export class Converter {
|
|
|
132
132
|
to: string,
|
|
133
133
|
rates: any = undefined
|
|
134
134
|
): number => {
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
const keys = Object.keys(rates);
|
|
136
|
+
const rateKey = keys.find(key => key.toLowerCase() === to.toLowerCase());
|
|
137
|
+
const rate = rateKey ? rates[rateKey] : undefined;
|
|
138
|
+
|
|
139
|
+
if (!rate) {
|
|
140
|
+
throw new Error(`No '${to}' present in rates: ${JSON.stringify(rates, null, 2)}`);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const numericRate = parseFloat(rate);
|
|
144
|
+
if (isNaN(numericRate)) {
|
|
145
|
+
throw new Error(`Invalid rate value for '${to}': ${rate}`);
|
|
137
146
|
}
|
|
138
147
|
|
|
139
|
-
return amount *
|
|
148
|
+
return amount * numericRate;
|
|
140
149
|
};
|
|
141
150
|
|
|
142
151
|
/**
|
package/src/parts/providers.ts
CHANGED
|
@@ -80,7 +80,7 @@ export interface Provider {
|
|
|
80
80
|
* @type {Function}
|
|
81
81
|
* @memberof Provider
|
|
82
82
|
*/
|
|
83
|
-
errorHandler:
|
|
83
|
+
errorHandler: (data: any) => number | string | null;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
/**
|
|
@@ -208,7 +208,23 @@ export const providers: Providers = {
|
|
|
208
208
|
503: "Invalid API key or Malformed query."
|
|
209
209
|
},
|
|
210
210
|
errorHandler: function (data: any) {
|
|
211
|
-
|
|
211
|
+
if (!data) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
// AlphaVantage does not return error codes in the response,
|
|
215
|
+
// so we have to check if the response contains error messages
|
|
216
|
+
// and translate them to error codes if possible.
|
|
217
|
+
|
|
218
|
+
const hasError = data["Error Message"] || data["Information"];
|
|
219
|
+
|
|
220
|
+
if (hasError?.includes("API rate limit")) {
|
|
221
|
+
return 429;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (hasError) {
|
|
225
|
+
return hasError;
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
212
228
|
}
|
|
213
229
|
},
|
|
214
230
|
Fixer: {
|
package/src/parts/requester.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AxiosError, AxiosInstance } from "axios";
|
|
1
|
+
import { AxiosError, AxiosInstance, AxiosResponse } from "axios";
|
|
2
2
|
import { Provider } from "./providers";
|
|
3
3
|
import { _to } from "../parts/utils"
|
|
4
4
|
|
|
@@ -30,7 +30,7 @@ export async function fetchRates(
|
|
|
30
30
|
): Promise<any> {
|
|
31
31
|
const [err, result] = (await _to(client.get(formatUrl(provider, query)))) as [
|
|
32
32
|
AxiosError,
|
|
33
|
-
|
|
33
|
+
AxiosResponse
|
|
34
34
|
];
|
|
35
35
|
|
|
36
36
|
// resolving error
|
package/.editorconfig
DELETED
package/.env
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
CURRENCY_LAYER_KEY=e5113cc49c4480382c0aab75792d6c59
|
|
2
|
-
FIXER_KEY=4bb4c28f5722234a69c90c15d5da1fa5
|
|
3
|
-
ALPHA_VANTAGE_KEY=9IR1DDDKG00TQNFL
|
|
4
|
-
EXCHANGERATESAPI_IO_KEY=13f38c755ac19cb527ba2f0766bd8e67
|
|
5
|
-
OPEN_EXCHANGE_RATES_KEY=5954ab116efa45a5b1801c3828b2266b
|
|
6
|
-
COVERALLS_REPO_TOKEN=bCkNK2oZ7eMGLyhzy248m6ALWvmJi7vYQ
|
|
7
|
-
#COVERALLS_TOKEN=HYEdzGHqGizqFHgvTAMoJUOT6JnLitjf2UFH
|
package/.env.example
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
name: Node.js CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- master
|
|
7
|
-
pull_request:
|
|
8
|
-
branches:
|
|
9
|
-
- master
|
|
10
|
-
|
|
11
|
-
jobs:
|
|
12
|
-
build:
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
strategy:
|
|
15
|
-
matrix:
|
|
16
|
-
node-version: [16.x]
|
|
17
|
-
|
|
18
|
-
steps:
|
|
19
|
-
- uses: actions/checkout@v2
|
|
20
|
-
- name: Use Node.js ${{ matrix.node-version }}
|
|
21
|
-
uses: actions/setup-node@v2
|
|
22
|
-
with:
|
|
23
|
-
node-version: ${{ matrix.node-version }}
|
|
24
|
-
- name: Cache node modules
|
|
25
|
-
uses: actions/cache@v2
|
|
26
|
-
env:
|
|
27
|
-
cache-name: cache-node-modules
|
|
28
|
-
with:
|
|
29
|
-
# npm cache files are stored in `~/.npm` on Linux/macOS
|
|
30
|
-
path: ~/.npm
|
|
31
|
-
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
|
|
32
|
-
restore-keys: |
|
|
33
|
-
${{ runner.os }}-build-${{ env.cache-name }}-
|
|
34
|
-
${{ runner.os }}-build-
|
|
35
|
-
${{ runner.os }}-
|
|
36
|
-
- name: Install dependencies
|
|
37
|
-
run: npm install
|
|
38
|
-
- name: Run tests
|
|
39
|
-
run: npm test
|
|
40
|
-
env:
|
|
41
|
-
CURRENCY_LAYER_KEY: ${{ secrets.CURRENCY_LAYER_KEY }}
|
|
42
|
-
FIXER_KEY: ${{ secrets.FIXER_KEY }}
|
|
43
|
-
ALPHA_VANTAGE_KEY: ${{ secrets.ALPHA_VANTAGE_KEY }}
|
|
44
|
-
EXCHANGERATESAPI_IO_KEY: ${{ secrets.EXCHANGERATESAPI_IO_KEY }}
|
|
45
|
-
OPEN_EXCHANGE_RATES_KEY: ${{ secrets.OPEN_EXCHANGE_RATES_KEY }}
|
|
46
|
-
- name: Run coveralls
|
|
47
|
-
if: github.ref == 'refs/heads/master'
|
|
48
|
-
run: npm run coveralls
|
|
49
|
-
env:
|
|
50
|
-
CURRENCY_LAYER_KEY: ${{ secrets.CURRENCY_LAYER_KEY }}
|
|
51
|
-
FIXER_KEY: ${{ secrets.FIXER_KEY }}
|
|
52
|
-
ALPHA_VANTAGE_KEY: ${{ secrets.ALPHA_VANTAGE_KEY }}
|
|
53
|
-
EXCHANGERATESAPI_IO_KEY: ${{ secrets.EXCHANGERATESAPI_IO_KEY }}
|
|
54
|
-
OPEN_EXCHANGE_RATES_KEY: ${{ secrets.OPEN_EXCHANGE_RATES_KEY }}
|
|
55
|
-
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
|
package/.prettierrc
DELETED
package/_config.yml
DELETED
package/jest.config.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// jest.config.js
|
|
2
|
-
module.exports = {
|
|
3
|
-
preset: "ts-jest",
|
|
4
|
-
testEnvironment: "node",
|
|
5
|
-
transform: {
|
|
6
|
-
"^.+\\.(ts|tsx)$": "ts-jest"
|
|
7
|
-
},
|
|
8
|
-
extensionsToTreatAsEsm: [".ts"],
|
|
9
|
-
moduleNameMapper: {
|
|
10
|
-
"^(\\.{1,2}/.*)\\.js$": "$1"
|
|
11
|
-
},
|
|
12
|
-
transformIgnorePatterns: ["node_modules/(?!axios)"]
|
|
13
|
-
};
|
package/typedoc.json
DELETED