easy-currencies 1.8.2 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/dist/converter.d.ts +8 -0
- package/dist/converter.js +25 -3
- package/dist/index.d.ts +4 -0
- package/dist/parts/chainer.d.ts +1 -2
- package/dist/parts/chainer.js +10 -1
- package/dist/parts/config.js +4 -2
- package/dist/parts/providers.js +32 -12
- package/dist/parts/requester.js +55 -10
- package/dist/parts/utils.d.ts +7 -0
- package/dist/parts/utils.js +12 -2
- package/package.json +27 -11
- package/readme.md +70 -26
- package/src/converter.ts +0 -204
- package/src/index.ts +0 -2
- package/src/parts/chainer.ts +0 -105
- package/src/parts/config.ts +0 -202
- package/src/parts/providers.ts +0 -249
- package/src/parts/requester.ts +0 -68
- package/src/parts/utils.ts +0 -50
- package/tsconfig.json +0 -16
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 Matas Rastenis
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15
|
+
PERFORMANCE OF THIS SOFTWARE.
|
package/dist/converter.d.ts
CHANGED
|
@@ -10,6 +10,14 @@ export { Chainer as Convert } from "./parts/chainer";
|
|
|
10
10
|
export interface rateObject {
|
|
11
11
|
[currencyName: string]: number;
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Marks a rate map with the base currency it was fetched for.
|
|
15
|
+
*
|
|
16
|
+
* A symbol, so it never collides with a currency code and never appears in
|
|
17
|
+
* Object.keys or JSON. Rates built by hand carry no marker and are accepted
|
|
18
|
+
* as before.
|
|
19
|
+
*/
|
|
20
|
+
export declare const RATES_BASE: unique symbol;
|
|
13
21
|
/**
|
|
14
22
|
* Regular converter class definition.
|
|
15
23
|
*
|
package/dist/converter.js
CHANGED
|
@@ -12,13 +12,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.Converter = exports.Convert = void 0;
|
|
15
|
+
exports.Converter = exports.RATES_BASE = exports.Convert = void 0;
|
|
16
16
|
const requester_1 = require("./parts/requester");
|
|
17
17
|
const config_1 = require("./parts/config");
|
|
18
18
|
var chainer_1 = require("./parts/chainer");
|
|
19
19
|
Object.defineProperty(exports, "Convert", { enumerable: true, get: function () { return chainer_1.Chainer; } });
|
|
20
20
|
const utils_1 = require("./parts/utils");
|
|
21
21
|
const axios_1 = __importDefault(require("axios"));
|
|
22
|
+
/**
|
|
23
|
+
* Marks a rate map with the base currency it was fetched for.
|
|
24
|
+
*
|
|
25
|
+
* A symbol, so it never collides with a currency code and never appears in
|
|
26
|
+
* Object.keys or JSON. Rates built by hand carry no marker and are accepted
|
|
27
|
+
* as before.
|
|
28
|
+
*/
|
|
29
|
+
exports.RATES_BASE = Symbol.for("easy-currencies.ratesBase");
|
|
22
30
|
/**
|
|
23
31
|
* Regular converter class definition.
|
|
24
32
|
*
|
|
@@ -56,6 +64,12 @@ class Converter {
|
|
|
56
64
|
this.convert = (amount_1, from_1, to_1, ...args_1) => __awaiter(this, [amount_1, from_1, to_1, ...args_1], void 0, function* (amount, from, to, rates = undefined) {
|
|
57
65
|
// Returining conversion from provided rates
|
|
58
66
|
if (typeof rates !== "undefined") {
|
|
67
|
+
const base = rates[exports.RATES_BASE];
|
|
68
|
+
if (typeof base === "string" &&
|
|
69
|
+
typeof from === "string" &&
|
|
70
|
+
base.toLowerCase() !== from.toLowerCase()) {
|
|
71
|
+
throw new Error(`Rates were fetched for base '${base}', but conversion asked for '${from}'.`);
|
|
72
|
+
}
|
|
59
73
|
return this.convertRate(amount, to, rates);
|
|
60
74
|
}
|
|
61
75
|
//Fetching conversion rates from the active provider
|
|
@@ -112,7 +126,15 @@ class Converter {
|
|
|
112
126
|
// if the error is in the list, but there are no backup providers, then throw.
|
|
113
127
|
// if the error is in the list and there is a backup, log the error and continue.
|
|
114
128
|
if (!err) {
|
|
115
|
-
|
|
129
|
+
const rates = provider.handler(data);
|
|
130
|
+
if (rates && typeof rates === "object") {
|
|
131
|
+
Object.defineProperty(rates, exports.RATES_BASE, {
|
|
132
|
+
value: from,
|
|
133
|
+
enumerable: false,
|
|
134
|
+
configurable: true
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return rates;
|
|
116
138
|
}
|
|
117
139
|
// unrecognized error
|
|
118
140
|
if (!err.handled) {
|
|
@@ -152,4 +174,4 @@ class Converter {
|
|
|
152
174
|
}
|
|
153
175
|
}
|
|
154
176
|
exports.Converter = Converter;
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBK0M7QUFFL0MsMkNBQTREO0FBQzVELDJDQUFxRDtBQUE1QyxrR0FBQSxPQUFPLE9BQVc7QUFDM0IseUNBQW9DO0FBQ3BDLGtEQUEwQjtBQVkxQjs7Ozs7O0dBTUc7QUFDVSxRQUFBLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFFbEU7Ozs7O0dBS0c7QUFDSCxNQUFhLFNBQVM7SUFTcEI7Ozs7T0FJRztJQUNILFlBQVksR0FBRyxNQUFvRDtRQXFDbkU7OztXQUdHO1FBQ0gsMEJBQXFCLEdBQUcsQ0FBQyxrQkFBc0MsRUFBRSxFQUFFO1lBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDO1FBRUY7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUNILFlBQU8sR0FBRyxvQ0FLUyxFQUFFLHlFQUpuQixNQUFjLEVBQ2QsSUFBWSxFQUNaLEVBQVUsRUFDVixRQUFhLFNBQVM7WUFFdEIsNENBQTRDO1lBQzVDLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxrQkFBVSxDQUFDLENBQUM7Z0JBQy9CLElBQ0UsT0FBTyxJQUFJLEtBQUssUUFBUTtvQkFDeEIsT0FBTyxJQUFJLEtBQUssUUFBUTtvQkFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDekMsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLGdDQUFnQyxJQUFJLGdDQUFnQyxJQUFJLElBQUksQ0FDN0UsQ0FBQztn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
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
export { Converter, Convert } from "./converter";
|
|
2
2
|
export { providers } from "./parts/providers";
|
|
3
|
+
export type { rateObject } from "./converter";
|
|
4
|
+
export type { Provider, ProviderErrors, ProviderReference, Providers, UserDefinedProvider } from "./parts/providers";
|
|
5
|
+
export type { Config, ProxyConfiguration } from "./parts/config";
|
|
6
|
+
export type { chainableConverter } from "./parts/chainer";
|
package/dist/parts/chainer.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { rateObject } from "../converter";
|
|
|
4
4
|
*
|
|
5
5
|
* @interface chainableConverter
|
|
6
6
|
*/
|
|
7
|
-
interface chainableConverter {
|
|
7
|
+
export interface chainableConverter {
|
|
8
8
|
from: (from: string) => chainableConverter;
|
|
9
9
|
to: (to: string) => Promise<number>;
|
|
10
10
|
fetch: () => Promise<chainableConverter>;
|
|
@@ -23,4 +23,3 @@ interface chainableConverter {
|
|
|
23
23
|
* @returns
|
|
24
24
|
*/
|
|
25
25
|
export declare function Chainer(amount?: number | undefined): chainableConverter;
|
|
26
|
-
export {};
|
package/dist/parts/chainer.js
CHANGED
|
@@ -27,6 +27,8 @@ function Chainer(amount = undefined) {
|
|
|
27
27
|
let _currentFrom = undefined;
|
|
28
28
|
let _currentTo = undefined;
|
|
29
29
|
let _currentRates = undefined;
|
|
30
|
+
// Base currency the cached rates were fetched for.
|
|
31
|
+
let _ratesBase = undefined;
|
|
30
32
|
// local converter
|
|
31
33
|
const _converter = new converter_1.Converter();
|
|
32
34
|
/**
|
|
@@ -50,6 +52,7 @@ function Chainer(amount = undefined) {
|
|
|
50
52
|
return __awaiter(this, void 0, void 0, function* () {
|
|
51
53
|
// fetching rates for the base currency
|
|
52
54
|
_currentRates = yield _converter.getRates(_currentFrom, "", true);
|
|
55
|
+
_ratesBase = _currentFrom;
|
|
53
56
|
return chainable;
|
|
54
57
|
});
|
|
55
58
|
}
|
|
@@ -72,6 +75,12 @@ function Chainer(amount = undefined) {
|
|
|
72
75
|
* @returns chainable object
|
|
73
76
|
*/
|
|
74
77
|
function _from(from) {
|
|
78
|
+
// Cached rates belong to the previous base. Keeping them would silently
|
|
79
|
+
// convert with the wrong ones, so drop them and let .to() refetch.
|
|
80
|
+
if (_ratesBase !== undefined && from !== _ratesBase) {
|
|
81
|
+
_currentRates = undefined;
|
|
82
|
+
_ratesBase = undefined;
|
|
83
|
+
}
|
|
75
84
|
_currentFrom = from;
|
|
76
85
|
return chainable;
|
|
77
86
|
}
|
|
@@ -91,4 +100,4 @@ function Chainer(amount = undefined) {
|
|
|
91
100
|
}
|
|
92
101
|
}
|
|
93
102
|
exports.Chainer = Chainer;
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXJ0cy9jaGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDRDQUFxRDtBQWdCckQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxTQUE2QixTQUFTO0lBQzVELElBQUksY0FBYyxHQUF1QixNQUFNLENBQUM7SUFDaEQsSUFBSSxZQUFZLEdBQXVCLFNBQVMsQ0FBQztJQUNqRCxJQUFJLFVBQVUsR0FBdUIsU0FBUyxDQUFDO0lBQy9DLElBQUksYUFBYSxHQUFvQixTQUFTLENBQUM7SUFDL0MsbURBQW1EO0lBQ25ELElBQUksVUFBVSxHQUF1QixTQUFTLENBQUM7SUFFL0Msa0JBQWtCO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO0lBRW5DOztPQUVHO0lBQ0gsTUFBTSxTQUFTLEdBQXVCO1FBQ3BDLElBQUksRUFBRSxLQUFLO1FBQ1gsRUFBRSxFQUFFLEdBQUc7UUFDUCxLQUFLLEVBQUUsTUFBTTtRQUNiLElBQUksS0FBSztZQUNQLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDO0lBRUY7Ozs7T0FJRztJQUNILFNBQWUsTUFBTTs7WUFDbkIsdUNBQXVDO1lBQ3ZDLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQVMsWUFBWSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRSxVQUFVLEdBQUcsWUFBWSxDQUFDO1lBQzFCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVELHNCQUFzQjtJQUN0QixPQUFPLFNBQVMsQ0FBQztJQUVqQjs7Ozs7T0FLRztJQUNILFNBQVMsT0FBTyxDQUFDLEdBQVc7UUFDMUIsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUNyQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLEtBQUssQ0FBQyxJQUFZO1FBQ3pCLHdFQUF3RTtRQUN4RSxtRUFBbUU7UUFDbkUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNwRCxhQUFhLEdBQUcsU0FBUyxDQUFDO1lBQzFCLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDekIsQ0FBQztRQUNELFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBZSxHQUFHLENBQUMsRUFBVTs7WUFDM0IsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUVoQixhQUFhO1lBQ2IsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUM3QixjQUFjLEVBQ2QsWUFBWSxFQUNaLFVBQVUsRUFDbEIsYUFBYSxDQUNkLENBQUM7WUFFRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQUE7QUFDSCxDQUFDO0FBdEZELDBCQXNGQyJ9
|
package/dist/parts/config.js
CHANGED
|
@@ -34,7 +34,9 @@ class Config {
|
|
|
34
34
|
*/
|
|
35
35
|
addProviders(providers, setActive) {
|
|
36
36
|
providers = providers.filter((p) => {
|
|
37
|
-
|
|
37
|
+
// Providers are copied per instance now, so object identity no longer
|
|
38
|
+
// identifies a duplicate; the endpoint does.
|
|
39
|
+
return !this._active.find((a) => a === p || a.endpoint.base === p.endpoint.base);
|
|
38
40
|
});
|
|
39
41
|
if (setActive) {
|
|
40
42
|
this._active.unshift(...providers);
|
|
@@ -151,4 +153,4 @@ function resolveProviders(...configuration) {
|
|
|
151
153
|
return initializationConfig.map((provider) => (0, providers_1.resolveProvider)(provider));
|
|
152
154
|
}
|
|
153
155
|
exports.resolveProviders = resolveProviders;
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBNkM7QUFDN0MsMkNBTXFCO0FBRXJCLG1DQUFxRDtBQVdyRDs7Ozs7O0dBTUc7QUFDSCxNQUFhLE1BQU07SUFTakI7Ozs7O09BS0c7SUFDSCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQXNCRDs7Ozs7OztPQU9HO0lBQ0ssWUFBWSxDQUFDLFNBQXFCLEVBQUUsU0FBa0I7UUFDNUQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqQyxzRUFBc0U7WUFDdEUsNkNBQTZDO1lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdkIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ3RELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNoQyxPQUFPO0lBQ1QsQ0FBQztJQXlERDs7Ozs7T0FLRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLEdBQUcsTUFBb0Q7UUFuSG5FOztXQUVHO1FBQ0ssWUFBTyxHQUFrQixlQUFLLENBQUMsTUFB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
|
package/dist/parts/providers.js
CHANGED
|
@@ -9,19 +9,22 @@ exports.providers = exports.resolveProvider = void 0;
|
|
|
9
9
|
* @returns {Provider} constructed provider
|
|
10
10
|
*/
|
|
11
11
|
function resolveProvider(provider) {
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
// Own-property check only. A plain lookup accepts "__proto__", "constructor"
|
|
13
|
+
// and every other inherited key, and assigning the key through "__proto__"
|
|
14
|
+
// writes it onto Object.prototype.
|
|
15
|
+
const name = provider === null || provider === void 0 ? void 0 : provider.name;
|
|
16
|
+
if (typeof name !== "string" ||
|
|
17
|
+
!Object.prototype.hasOwnProperty.call(exports.providers, name)) {
|
|
14
18
|
throw "No provider with this name. Please use a provider from the supported providers list.";
|
|
15
19
|
}
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
return existentProvider;
|
|
20
|
+
// Copy, so instances do not share a template and overwrite each other's key.
|
|
21
|
+
return Object.assign(Object.assign({}, exports.providers[name]), { key: provider.key });
|
|
19
22
|
}
|
|
20
23
|
exports.resolveProvider = resolveProvider;
|
|
21
24
|
/**
|
|
22
25
|
* Provider map initialization
|
|
23
26
|
*/
|
|
24
|
-
exports.providers = {
|
|
27
|
+
exports.providers = Object.assign(Object.create(null), {
|
|
25
28
|
ExchangeRateAPI: {
|
|
26
29
|
endpoint: {
|
|
27
30
|
base: "https://api.exchangerate-api.com/v4/latest/",
|
|
@@ -39,7 +42,7 @@ exports.providers = {
|
|
|
39
42
|
},
|
|
40
43
|
ExchangeRatesAPIIO: {
|
|
41
44
|
endpoint: {
|
|
42
|
-
base: "
|
|
45
|
+
base: "https://api.exchangeratesapi.io/latest?access_key=%KEY%",
|
|
43
46
|
single: "&base=%FROM%&symbols=%TO%",
|
|
44
47
|
multiple: "&base=%FROM%"
|
|
45
48
|
},
|
|
@@ -58,12 +61,17 @@ exports.providers = {
|
|
|
58
61
|
},
|
|
59
62
|
CurrencyLayer: {
|
|
60
63
|
endpoint: {
|
|
61
|
-
base: "
|
|
64
|
+
base: "https://apilayer.net/api/live?access_key=%KEY%",
|
|
62
65
|
single: "&source=%FROM%",
|
|
63
66
|
multiple: "&source=%FROM%¤cies=%TO%"
|
|
64
67
|
},
|
|
65
68
|
key: undefined,
|
|
66
69
|
handler: function (data) {
|
|
70
|
+
// An empty or unexpected 200 body would otherwise throw a TypeError out
|
|
71
|
+
// of the handler, which the caller reports as a missing response.
|
|
72
|
+
if (!data || typeof data.quotes !== "object" || data.quotes === null) {
|
|
73
|
+
return {};
|
|
74
|
+
}
|
|
67
75
|
const map = {};
|
|
68
76
|
Object.keys(data.quotes).map((key) => {
|
|
69
77
|
map[key.slice(3)] = data.quotes[key];
|
|
@@ -106,7 +114,11 @@ exports.providers = {
|
|
|
106
114
|
key: undefined,
|
|
107
115
|
handler: function (data) {
|
|
108
116
|
const map = {};
|
|
109
|
-
const o = data[Object.keys(data)[0]];
|
|
117
|
+
const o = data ? data[Object.keys(data)[0]] : undefined;
|
|
118
|
+
// Same guard: an empty 200 must not crash the handler.
|
|
119
|
+
if (!o || typeof o !== "object") {
|
|
120
|
+
return map;
|
|
121
|
+
}
|
|
110
122
|
map[o["3. To_Currency Code"]] = o["5. Exchange Rate"];
|
|
111
123
|
return map;
|
|
112
124
|
},
|
|
@@ -132,7 +144,7 @@ exports.providers = {
|
|
|
132
144
|
},
|
|
133
145
|
Fixer: {
|
|
134
146
|
endpoint: {
|
|
135
|
-
base: "
|
|
147
|
+
base: "https://data.fixer.io/api/latest?access_key=%KEY%",
|
|
136
148
|
single: "&base=%FROM%&symbols=%TO%",
|
|
137
149
|
multiple: "&base=%FROM%"
|
|
138
150
|
},
|
|
@@ -149,5 +161,13 @@ exports.providers = {
|
|
|
149
161
|
return data.error ? data.error.code : null;
|
|
150
162
|
}
|
|
151
163
|
}
|
|
152
|
-
};
|
|
153
|
-
|
|
164
|
+
});
|
|
165
|
+
// Templates are copied on resolve; freezing makes accidental mutation of the
|
|
166
|
+
// shared definitions fail loudly rather than silently affecting every future
|
|
167
|
+
// Converter.
|
|
168
|
+
for (const name of Object.keys(exports.providers)) {
|
|
169
|
+
Object.freeze(exports.providers[name].endpoint);
|
|
170
|
+
Object.freeze(exports.providers[name].errors);
|
|
171
|
+
Object.freeze(exports.providers[name]);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL3Byb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnR0E7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQTJCO0lBQ3pELDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsbUNBQW1DO0lBQ25DLE1BQU0sSUFBSSxHQUFHLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxJQUFJLENBQUM7SUFDNUIsSUFDRSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQ3hCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFTLEVBQUUsSUFBSSxDQUFDLEVBQ3RELENBQUM7UUFDRCxNQUFNLHNGQUFzRixDQUFDO0lBQy9GLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsdUNBQVksaUJBQVMsQ0FBQyxJQUFJLENBQUMsS0FBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBRztBQUNuRCxDQUFDO0FBZEQsMENBY0M7QUFFRDs7R0FFRztBQUNVLFFBQUEsU0FBUyxHQUFjLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUNyRSxlQUFlLEVBQUU7UUFDZixRQUFRLEVBQUU7WUFDUixJQUFJLEVBQUUsNkNBQTZDO1lBQ25ELE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFFBQVEsRUFBRSxRQUFRO1NBQ25CO1FBQ0QsR0FBRyxFQUFFLFNBQVM7UUFDZCxPQUFPLEVBQUUsVUFBVSxJQUFTO1lBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRTtRQUM5RCxZQUFZLEVBQUUsVUFBVSxJQUFTO1lBQy9CLE9BQU8sSUFBSSxDQUFDLE1B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
|
package/dist/parts/requester.js
CHANGED
|
@@ -22,19 +22,64 @@ const utils_1 = require("../parts/utils");
|
|
|
22
22
|
*/
|
|
23
23
|
function fetchRates(client, provider, query) {
|
|
24
24
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
var _a;
|
|
26
|
+
const maxRetries = 5;
|
|
27
|
+
let attempt = 0;
|
|
28
|
+
let delay = 1000; // initial delay in ms
|
|
29
|
+
while (true) {
|
|
30
|
+
const [err, result] = (yield (0, utils_1._to)(client.get(formatUrl(provider, query))));
|
|
31
|
+
if (((_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.status) === 429) {
|
|
32
|
+
if (attempt >= maxRetries) {
|
|
33
|
+
throw { handled: false, error: "Too many 429 responses, giving up." };
|
|
34
|
+
}
|
|
35
|
+
const jitter = Math.random() * 1000; // jitter between 0 and 1000ms
|
|
36
|
+
yield (0, utils_1.sleep)(delay + jitter);
|
|
37
|
+
attempt++;
|
|
38
|
+
delay *= 2;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// A transport failure — DNS, refused, timeout, abort — carries no response
|
|
42
|
+
// to inspect. Marked handled so the caller falls back to the next provider
|
|
43
|
+
// rather than surfacing a network blip as a fatal error.
|
|
44
|
+
if (err && !err.response) {
|
|
45
|
+
throw { handled: true, error: transportError(err) };
|
|
46
|
+
}
|
|
47
|
+
// resolving error
|
|
48
|
+
const error = provider.errorHandler(err ? err.response : result.data);
|
|
49
|
+
// returning either the meaning of the error (if registered in provider's definition), or the error itself.
|
|
50
|
+
if (error) {
|
|
51
|
+
throw provider.errors[error]
|
|
52
|
+
? { handled: true, error: provider.errors[error] }
|
|
53
|
+
: { handled: false, error };
|
|
54
|
+
}
|
|
55
|
+
// An HTTP failure the provider does not recognise still failed. Falling
|
|
56
|
+
// through here would read .data off an undefined result.
|
|
57
|
+
if (err) {
|
|
58
|
+
throw { handled: true, error: transportError(err) };
|
|
59
|
+
}
|
|
60
|
+
return result.data;
|
|
33
61
|
}
|
|
34
|
-
return result.data;
|
|
35
62
|
});
|
|
36
63
|
}
|
|
37
64
|
exports.fetchRates = fetchRates;
|
|
65
|
+
/**
|
|
66
|
+
* Reduces an axios error to a message and code.
|
|
67
|
+
*
|
|
68
|
+
* The raw AxiosError carries `config.url`, which embeds the provider API key.
|
|
69
|
+
* Callers log these errors, so returning the original would write credentials
|
|
70
|
+
* to the consumer's logs.
|
|
71
|
+
*
|
|
72
|
+
* @param {AxiosError} err - the axios error
|
|
73
|
+
* @returns {Error} - an error safe to log
|
|
74
|
+
*/
|
|
75
|
+
function transportError(err) {
|
|
76
|
+
var _a;
|
|
77
|
+
const status = (_a = err.response) === null || _a === void 0 ? void 0 : _a.status;
|
|
78
|
+
const detail = status ? `HTTP ${status}` : err.code || err.message;
|
|
79
|
+
const error = new Error(`Request to the provider failed: ${detail}`);
|
|
80
|
+
error.code = err.code;
|
|
81
|
+
return error;
|
|
82
|
+
}
|
|
38
83
|
/**
|
|
39
84
|
* URL formatting function
|
|
40
85
|
*
|
|
@@ -54,4 +99,4 @@ function formatUrl(provider, query) {
|
|
|
54
99
|
.replace("%TO%", query.TO)
|
|
55
100
|
.replace("%KEY%", provider.key || "");
|
|
56
101
|
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL3JlcXVlc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQSwwQ0FBMkM7QUFlM0M7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFzQixVQUFVLENBQzlCLE1BQXFCLEVBQ3JCLFFBQWtCLEVBQ2xCLEtBQVk7OztRQUVaLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsc0JBQXNCO1FBRXhDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFBLFdBQUcsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUd2RSxDQUFDO1lBRUYsSUFBSSxDQUFBLE1BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFFBQVEsMENBQUUsTUFBTSxNQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLG9DQUFvQyxFQUFFLENBQUM7Z0JBQ3hFLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLDhCQUE4QjtnQkFDbkUsTUFBTSxJQUFBLGFBQUssRUFBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ1gsU0FBUztZQUNYLENBQUM7WUFFRCwyRUFBMkU7WUFDM0UsMkVBQTJFO1lBQzNFLHlEQUF5RDtZQUN6RCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFFRCxrQkFBa0I7WUFDbEIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV0RSwyR0FBMkc7WUFDM0csSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUMxQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUNsRCxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2hDLENBQUM7WUFFRCx3RUFBd0U7WUFDeEUseURBQXlEO1lBQ3pELElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7Q0FBQTtBQW5ERCxnQ0FtREM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxHQUFlOztJQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFBLEdBQUcsQ0FBQyxRQUFRLDBDQUFFLE1BQU0sQ0FBQztJQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUNuRSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRSxLQUFhLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDL0IsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxTQUFTLENBQUMsUUFBa0IsRUFBRSxLQUFZO0lBQ2pELHdCQUF3QjtJQUN4QixpRUFBaUU7SUFDakUscUNBQXFDO0lBQ3JDLDZDQUE2QztJQUM3QyxJQUFJO0lBRUosK0RBQStEO0lBQy9ELE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUN2RCxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDN0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1NBQ3pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDIn0=
|
package/dist/parts/utils.d.ts
CHANGED
|
@@ -21,3 +21,10 @@ export declare function checkIfProvider(provider: Provider | any): provider is P
|
|
|
21
21
|
* @returns A promise that resolves to a tuple containing the error (if any) and the resolved value (if any).
|
|
22
22
|
*/
|
|
23
23
|
export declare function _to<T, U = Error>(promise: Promise<T>): Promise<[U | null, T | null]>;
|
|
24
|
+
/**
|
|
25
|
+
* Delays execution by the specified amount of time.
|
|
26
|
+
*
|
|
27
|
+
* @param ms - The number of milliseconds to wait.
|
|
28
|
+
* @returns A promise that resolves after the specified delay.
|
|
29
|
+
*/
|
|
30
|
+
export declare function sleep(ms: number): Promise<void>;
|
package/dist/parts/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports._to = exports.checkIfProvider = exports.checkIfUserDefinedProvider = void 0;
|
|
3
|
+
exports.sleep = exports._to = exports.checkIfProvider = exports.checkIfUserDefinedProvider = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Utility for typechecking UserDefinedProvider objects
|
|
6
6
|
*
|
|
@@ -39,4 +39,14 @@ function _to(promise) {
|
|
|
39
39
|
.catch((err) => [err, null]);
|
|
40
40
|
}
|
|
41
41
|
exports._to = _to;
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Delays execution by the specified amount of time.
|
|
44
|
+
*
|
|
45
|
+
* @param ms - The number of milliseconds to wait.
|
|
46
|
+
* @returns A promise that resolves after the specified delay.
|
|
47
|
+
*/
|
|
48
|
+
function sleep(ms) {
|
|
49
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
50
|
+
}
|
|
51
|
+
exports.sleep = sleep;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFydHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUE7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLG1CQUE4QztJQUU5QyxPQUFPLENBQ0osbUJBQTJDLENBQUMsSUFBSSxLQUFLLFNBQVM7UUFDL0QsZUFBZSxDQUFFLG1CQUEyQyxDQUFDLFFBQVEsQ0FBQyxDQUN2RSxDQUFDO0FBQ0osQ0FBQztBQVBELGdFQU9DO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixRQUF3QjtJQUV4QixPQUFPLENBQ0osUUFBcUIsQ0FBQyxRQUFRLEtBQUssU0FBUztRQUM1QyxRQUFxQixDQUFDLFlBQVksS0FBSyxTQUFTO1FBQ2hELFFBQXFCLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFDMUMsUUFBcUIsQ0FBQyxPQUFPLEtBQUssU0FBUztRQUMzQyxRQUFxQixDQUFDLEdBQUcsS0FBSyxTQUFTLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBVkQsMENBVUM7QUFHRDs7OztHQUlHO0FBQ0gsU0FBZ0IsR0FBRyxDQUNqQixPQUFtQjtJQUVuQixPQUFPLE9BQU87U0FDWCxJQUFJLENBQUMsQ0FBQyxJQUFPLEVBQWEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFDLEtBQUssQ0FBQyxDQUFDLEdBQU0sRUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBTkQsa0JBTUM7QUFHRDs7Ozs7R0FLRztBQUNILFNBQWdCLEtBQUssQ0FBQyxFQUFVO0lBQzlCLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUZELHNCQUVDIn0=
|
package/package.json
CHANGED
|
@@ -1,20 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "easy-currencies",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "A tool for easy conversion of currencies.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "commonjs",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=20"
|
|
13
|
+
},
|
|
6
14
|
"scripts": {
|
|
7
15
|
"build": "tsc",
|
|
8
16
|
"prepare": "npm run build",
|
|
9
17
|
"docs": "typedoc && cp ./_config.yml docs/_config.yml",
|
|
10
|
-
"prepublishOnly": "npm test",
|
|
11
|
-
"test": "jest --
|
|
12
|
-
"test:
|
|
13
|
-
"
|
|
18
|
+
"prepublishOnly": "npm run build && npm test && npm run api:check",
|
|
19
|
+
"test": "jest --selectProjects offline",
|
|
20
|
+
"test:live": "jest --selectProjects live --passWithNoTests --runInBand",
|
|
21
|
+
"test:all": "jest --passWithNoTests",
|
|
22
|
+
"test:coverage": "jest --selectProjects offline --coverage",
|
|
23
|
+
"api:check": "npm run build && api-extractor run",
|
|
24
|
+
"api:update": "npm run build && api-extractor run --local",
|
|
25
|
+
"lint:package": "publint",
|
|
26
|
+
"check:package": "attw --pack .",
|
|
27
|
+
"pretest": "npm run build",
|
|
28
|
+
"smoke:pack": "node scripts/smoke-test-tarball.js"
|
|
14
29
|
},
|
|
15
30
|
"repository": {
|
|
16
31
|
"type": "git",
|
|
17
|
-
"url": "git+https://github.com/
|
|
32
|
+
"url": "git+https://github.com/rastenis/easy-currencies.git"
|
|
18
33
|
},
|
|
19
34
|
"keywords": [
|
|
20
35
|
"currency",
|
|
@@ -25,19 +40,20 @@
|
|
|
25
40
|
"api",
|
|
26
41
|
"converter"
|
|
27
42
|
],
|
|
28
|
-
"author": "
|
|
43
|
+
"author": "rastenis",
|
|
29
44
|
"license": "ISC",
|
|
30
45
|
"bugs": {
|
|
31
|
-
"url": "https://github.com/
|
|
46
|
+
"url": "https://github.com/rastenis/easy-currencies/issues"
|
|
32
47
|
},
|
|
33
|
-
"homepage": "https://github.com/
|
|
48
|
+
"homepage": "https://github.com/rastenis/easy-currencies#readme",
|
|
34
49
|
"devDependencies": {
|
|
35
|
-
"@
|
|
50
|
+
"@arethetypeswrong/cli": "^0.18.5",
|
|
51
|
+
"@microsoft/api-extractor": "^7.59.0",
|
|
36
52
|
"@types/jest": "^29.5.12",
|
|
37
53
|
"@types/node": "^20.14.2",
|
|
38
|
-
"coveralls": "^3.1.1",
|
|
39
54
|
"dotenv": "^16.4.5",
|
|
40
55
|
"jest": "^29.7.0",
|
|
56
|
+
"publint": "^0.3.24",
|
|
41
57
|
"ts-jest": "^29.1.4",
|
|
42
58
|
"typedoc": "^0.25.13",
|
|
43
59
|
"typescript": "^5.4.5"
|