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 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.
@@ -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
- return provider.handler(data);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBK0M7QUFFL0MsMkNBQTREO0FBQzVELDJDQUFxRDtBQUE1QyxrR0FBQSxPQUFPLE9BQVc7QUFDM0IseUNBQW9DO0FBQ3BDLGtEQUEwQjtBQVkxQjs7Ozs7R0FLRztBQUNILE1BQWEsU0FBUztJQVNwQjs7OztPQUlHO0lBQ0gsWUFBWSxHQUFHLE1BQW9EO1FBcUNuRTs7O1dBR0c7UUFDSCwwQkFBcUIsR0FBRyxDQUFDLGtCQUFzQyxFQUFFLEVBQUU7WUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUM7UUFFRjs7Ozs7Ozs7Ozs7OztXQWFHO1FBQ0gsWUFBTyxHQUFHLG9DQUtTLEVBQUUseUVBSm5CLE1BQWMsRUFDZCxJQUFZLEVBQ1osRUFBVSxFQUNWLFFBQWEsU0FBUztZQUV0Qiw0Q0FBNEM7WUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUVELG9EQUFvRDtZQUNwRCxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sSUFBQSxXQUFHLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFOUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENB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
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";
@@ -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 {};
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXJ0cy9jaGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDRDQUFxRDtBQWdCckQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxTQUE2QixTQUFTO0lBQzVELElBQUksY0FBYyxHQUF1QixNQUFNLENBQUM7SUFDaEQsSUFBSSxZQUFZLEdBQXVCLFNBQVMsQ0FBQztJQUNqRCxJQUFJLFVBQVUsR0FBdUIsU0FBUyxDQUFDO0lBQy9DLElBQUksYUFBYSxHQUFvQixTQUFTLENBQUM7SUFFL0Msa0JBQWtCO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO0lBRW5DOztPQUVHO0lBQ0gsTUFBTSxTQUFTLEdBQXVCO1FBQ3BDLElBQUksRUFBRSxLQUFLO1FBQ1gsRUFBRSxFQUFFLEdBQUc7UUFDUCxLQUFLLEVBQUUsTUFBTTtRQUNiLElBQUksS0FBSztZQUNQLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDO0lBRUY7Ozs7T0FJRztJQUNILFNBQWUsTUFBTTs7WUFDbkIsdUNBQXVDO1lBQ3ZDLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQVMsWUFBWSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0tBQUE7SUFFRCxzQkFBc0I7SUFDdEIsT0FBTyxTQUFTLENBQUM7SUFFakI7Ozs7O09BS0c7SUFDSCxTQUFTLE9BQU8sQ0FBQyxHQUFXO1FBQzFCLGNBQWMsR0FBRyxHQUFHLENBQUM7UUFDckIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxLQUFLLENBQUMsSUFBWTtRQUN6QixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQWUsR0FBRyxDQUFDLEVBQVU7O1lBQzNCLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFFaEIsYUFBYTtZQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FDN0IsY0FBYyxFQUNkLFlBQVksRUFDWixVQUFVLEVBQ2xCLGFBQWEsQ0FDZCxDQUFDO1lBRUYsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUFBO0FBQ0gsQ0FBQztBQTdFRCwwQkE2RUMifQ==
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXJ0cy9jaGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDRDQUFxRDtBQWdCckQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxTQUE2QixTQUFTO0lBQzVELElBQUksY0FBYyxHQUF1QixNQUFNLENBQUM7SUFDaEQsSUFBSSxZQUFZLEdBQXVCLFNBQVMsQ0FBQztJQUNqRCxJQUFJLFVBQVUsR0FBdUIsU0FBUyxDQUFDO0lBQy9DLElBQUksYUFBYSxHQUFvQixTQUFTLENBQUM7SUFDL0MsbURBQW1EO0lBQ25ELElBQUksVUFBVSxHQUF1QixTQUFTLENBQUM7SUFFL0Msa0JBQWtCO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO0lBRW5DOztPQUVHO0lBQ0gsTUFBTSxTQUFTLEdBQXVCO1FBQ3BDLElBQUksRUFBRSxLQUFLO1FBQ1gsRUFBRSxFQUFFLEdBQUc7UUFDUCxLQUFLLEVBQUUsTUFBTTtRQUNiLElBQUksS0FBSztZQUNQLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxNQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDO0lBRUY7Ozs7T0FJRztJQUNILFNBQWUsTUFBTTs7WUFDbkIsdUNBQXVDO1lBQ3ZDLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQVMsWUFBWSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRSxVQUFVLEdBQUcsWUFBWSxDQUFDO1lBQzFCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVELHNCQUFzQjtJQUN0QixPQUFPLFNBQVMsQ0FBQztJQUVqQjs7Ozs7T0FLRztJQUNILFNBQVMsT0FBTyxDQUFDLEdBQVc7UUFDMUIsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUNyQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxTQUFTLEtBQUssQ0FBQyxJQUFZO1FBQ3pCLHdFQUF3RTtRQUN4RSxtRUFBbUU7UUFDbkUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNwRCxhQUFhLEdBQUcsU0FBUyxDQUFDO1lBQzFCLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDekIsQ0FBQztRQUNELFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBZSxHQUFHLENBQUMsRUFBVTs7WUFDM0IsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUVoQixhQUFhO1lBQ2IsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUM3QixjQUFjLEVBQ2QsWUFBWSxFQUNaLFVBQVUsRUFDbEIsYUFBYSxDQUNkLENBQUM7WUFFRixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQUE7QUFDSCxDQUFDO0FBdEZELDBCQXNGQyJ9
@@ -34,7 +34,9 @@ class Config {
34
34
  */
35
35
  addProviders(providers, setActive) {
36
36
  providers = providers.filter((p) => {
37
- return !this._active.find((a) => a == p);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBNkM7QUFDN0MsMkNBTXFCO0FBRXJCLG1DQUFxRDtBQVdyRDs7Ozs7O0dBTUc7QUFDSCxNQUFhLE1BQU07SUFTakI7Ozs7O09BS0c7SUFDSCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQXNCRDs7Ozs7OztPQU9HO0lBQ0ssWUFBWSxDQUFDLFNBQXFCLEVBQUUsU0FBa0I7UUFDNUQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNoQyxPQUFPO0lBQ1QsQ0FBQztJQXlERDs7Ozs7T0FLRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLEdBQUcsTUFBb0Q7UUEvR25FOztXQUVHO1FBQ0ssWUFBTyxHQUFrQixlQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFaEQ7OztXQUdHO1FBQ0gsY0FBUyxHQUFHLENBQUMsTUFBcUIsRUFBUSxFQUFFO1lBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcs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
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBNkM7QUFDN0MsMkNBTXFCO0FBRXJCLG1DQUFxRDtBQVdyRDs7Ozs7O0dBTUc7QUFDSCxNQUFhLE1BQU07SUFTakI7Ozs7O09BS0c7SUFDSCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQXNCRDs7Ozs7OztPQU9HO0lBQ0ssWUFBWSxDQUFDLFNBQXFCLEVBQUUsU0FBa0I7UUFDNUQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqQyxzRUFBc0U7WUFDdEUsNkNBQTZDO1lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdkIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ3RELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNoQyxPQUFPO0lBQ1QsQ0FBQztJQXlERDs7Ozs7T0FLRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLEdBQUcsTUFBb0Q7UUFuSG5FOztXQUVHO1FBQ0ssWUFBTyxHQUFrQixlQUFLLENBQUMsTUFB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
@@ -9,19 +9,22 @@ exports.providers = exports.resolveProvider = void 0;
9
9
  * @returns {Provider} constructed provider
10
10
  */
11
11
  function resolveProvider(provider) {
12
- const existentProvider = exports.providers[provider.name];
13
- if (!existentProvider) {
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
- // attaching key
17
- existentProvider.key = provider.key;
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: "http://api.exchangeratesapi.io/latest?access_key=%KEY%",
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: "http://apilayer.net/api/live?access_key=%KEY%",
64
+ base: "https://apilayer.net/api/live?access_key=%KEY%",
62
65
  single: "&source=%FROM%",
63
66
  multiple: "&source=%FROM%&currencies=%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: "http://data.fixer.io/api/latest?access_key=%KEY%",
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL3Byb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnR0E7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQTJCO0lBQ3pELE1BQU0sZ0JBQWdCLEdBQUcsaUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdEIsTUFBTSxzRkFBc0YsQ0FBQztJQUMvRixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGdCQUFnQixDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO0lBQ3BDLE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQVRELDBDQVNDO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLFNBQVMsR0FBYztJQUNsQyxlQUFlLEVBQUU7UUFDZixRQUFRLEVBQUU7WUFDUixJQUFJLEVBQUUsNkNBQTZDO1lBQ25ELE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFFBQVEsRUFBRSxRQUFRO1NBQ25CO1FBQ0QsR0FBRyxFQUFFLFNBQVM7UUFDZCxPQUFPLEVBQUUsVUFBVSxJQUFTO1lBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRTtRQUM5RCxZQUFZLEVBQUUsVUFBVSxJQUFTO1lBQy9CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO0tBQ0Y7SUFDRCxrQkFBa0IsRUFBRTtRQUNsQixRQUFRLEVBQUU7WUFDUixJQUFJLEVBQUUsd0RBQXdEO1lBQzlELE1BQU0sRUFBRSwyQkFBMkI7WUFDbkMsUUFBUSxFQUFFLGNBQWM7U0FDekI7UUFDRCxNQUFNLEVBQUU7WUFDTixHQUFHLEVBQUUsZ0VBQWdFO1lBQ3JFLEdB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
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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
@@ -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
- const [err, result] = (yield (0, utils_1._to)(client.get(formatUrl(provider, query))));
26
- // resolving error
27
- const error = provider.errorHandler(err ? err.response : result.data);
28
- // returning either the meaning of the error (if registered in provider's definition), or the error itself.
29
- if (error) {
30
- throw provider.errors[error]
31
- ? { handled: true, error: provider.errors[error] }
32
- : { handled: false, error };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL3JlcXVlc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQSwwQ0FBb0M7QUFjcEM7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFzQixVQUFVLENBQzlCLE1BQXFCLEVBQ3JCLFFBQWtCLEVBQ2xCLEtBQVk7O1FBRVosTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBQSxXQUFHLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FHdkUsQ0FBQztRQUVGLGtCQUFrQjtRQUNsQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRFLDJHQUEyRztRQUMzRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDMUIsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbEQsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7Q0FBQTtBQXJCRCxnQ0FxQkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxRQUFrQixFQUFFLEtBQVk7SUFDakQsd0JBQXdCO0lBQ3hCLGlFQUFpRTtJQUNqRSxxQ0FBcUM7SUFDckMsNkNBQTZDO0lBQzdDLElBQUk7SUFFSiwrREFBK0Q7SUFDL0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3ZELE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztTQUM3QixPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDekIsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUMifQ==
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnRzL3JlcXVlc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQSwwQ0FBMkM7QUFlM0M7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFzQixVQUFVLENBQzlCLE1BQXFCLEVBQ3JCLFFBQWtCLEVBQ2xCLEtBQVk7OztRQUVaLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsc0JBQXNCO1FBRXhDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFBLFdBQUcsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUd2RSxDQUFDO1lBRUYsSUFBSSxDQUFBLE1BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFFBQVEsMENBQUUsTUFBTSxNQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLG9DQUFvQyxFQUFFLENBQUM7Z0JBQ3hFLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLDhCQUE4QjtnQkFDbkUsTUFBTSxJQUFBLGFBQUssRUFBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ1gsU0FBUztZQUNYLENBQUM7WUFFRCwyRUFBMkU7WUFDM0UsMkVBQTJFO1lBQzNFLHlEQUF5RDtZQUN6RCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFFRCxrQkFBa0I7WUFDbEIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV0RSwyR0FBMkc7WUFDM0csSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUMxQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUNsRCxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2hDLENBQUM7WUFFRCx3RUFBd0U7WUFDeEUseURBQXlEO1lBQ3pELElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7Q0FBQTtBQW5ERCxnQ0FtREM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxHQUFlOztJQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFBLEdBQUcsQ0FBQyxRQUFRLDBDQUFFLE1BQU0sQ0FBQztJQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUNuRSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRSxLQUFhLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDL0IsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxTQUFTLENBQUMsUUFBa0IsRUFBRSxLQUFZO0lBQ2pELHdCQUF3QjtJQUN4QixpRUFBaUU7SUFDakUscUNBQXFDO0lBQ3JDLDZDQUE2QztJQUM3QyxJQUFJO0lBRUosK0RBQStEO0lBQy9ELE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUN2RCxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDN0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1NBQ3pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDIn0=
@@ -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>;
@@ -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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFydHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUE7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLG1CQUE4QztJQUU5QyxPQUFPLENBQ0osbUJBQTJDLENBQUMsSUFBSSxLQUFLLFNBQVM7UUFDL0QsZUFBZSxDQUFFLG1CQUEyQyxDQUFDLFFBQVEsQ0FBQyxDQUN2RSxDQUFDO0FBQ0osQ0FBQztBQVBELGdFQU9DO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixRQUF3QjtJQUV4QixPQUFPLENBQ0osUUFBcUIsQ0FBQyxRQUFRLEtBQUssU0FBUztRQUM1QyxRQUFxQixDQUFDLFlBQVksS0FBSyxTQUFTO1FBQ2hELFFBQXFCLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFDMUMsUUFBcUIsQ0FBQyxPQUFPLEtBQUssU0FBUztRQUMzQyxRQUFxQixDQUFDLEdBQUcsS0FBSyxTQUFTLENBQ3pDLENBQUM7QUFDSixDQUFDO0FBVkQsMENBVUM7QUFHRDs7OztHQUlHO0FBQ0gsU0FBZ0IsR0FBRyxDQUNqQixPQUFtQjtJQUVuQixPQUFPLE9BQU87U0FDWCxJQUFJLENBQUMsQ0FBQyxJQUFPLEVBQWEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFDLEtBQUssQ0FBQyxDQUFDLEdBQU0sRUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBTkQsa0JBTUMifQ==
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.8.2",
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 --config jest.config.js --setupFiles dotenv/config",
12
- "test:coverage": "jest --config jest.config.js --setupFiles dotenv/config --coverage",
13
- "coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls"
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/Scharkee/easy-currencies.git"
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": "Scharkee",
43
+ "author": "rastenis",
29
44
  "license": "ISC",
30
45
  "bugs": {
31
- "url": "https://github.com/Scharkee/easy-currencies/issues"
46
+ "url": "https://github.com/rastenis/easy-currencies/issues"
32
47
  },
33
- "homepage": "https://github.com/Scharkee/easy-currencies#readme",
48
+ "homepage": "https://github.com/rastenis/easy-currencies#readme",
34
49
  "devDependencies": {
35
- "@types/dotenv": "^8.2.0",
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"