@sap-cloud-sdk/resilience 2.11.1-20221215201002.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/README.md ADDED
@@ -0,0 +1,61 @@
1
+ <!-- sap-cloud-sdk-logo -->
2
+ <!-- This block is inserted by scripts/replace-common-readme.ts. Do not adjust it manually. -->
3
+ <a href="https://sap.com/s4sdk"><img src="https://help.sap.com/doc/2324e9c3b28748a4ae2ad08166d77675/1.0/en-US/logo-with-js.svg" alt="SAP Cloud SDK for JavaScript Logo" height="122.92" width="226.773"/></a>
4
+ <!-- sap-cloud-sdk-logo-stop -->
5
+
6
+ # @sap-cloud-sdk/resilience
7
+
8
+ This package contains implementations for the resilience middlewares like a timeout or circuit breaker middleware.
9
+ This concept of middlewares is totally generic, and you can use it for non-resilience use cases.
10
+
11
+ ## Installation
12
+
13
+ ```
14
+ $ npm install @sap-cloud-sdk/resilience
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ Add a timeout middleware to a request.
20
+
21
+ ```
22
+ executeHttpRequest(destination, { middleware: [ timeout() ] }, httpRequestOptions);
23
+ ```
24
+ <!-- TODO v3 put better link when documentation is done -->
25
+ For more detailed overview visit our [resilience documentation](https://sap.github.io/cloud-sdk/docs/js/).
26
+
27
+ <!-- sap-cloud-sdk-common-readme -->
28
+ <!-- This block is inserted by scripts/replace-common-readme.ts. Do not adjust it manually. -->
29
+ ## Support
30
+
31
+ The recommended way to get in touch with us is to create an issue on [GitHub](https://github.com/SAP/cloud-sdk-js/issues).
32
+ Select the issue category **Bug**, **Feature**, or **Question** depending on the nature of your request.
33
+ We try to provide fixes, features and answers as soon as possible.
34
+
35
+ ## Contribute
36
+
37
+ If you would like to contribute to the SAP Cloud SDK, please make yourself familiar with our [contributing guidelines](https://github.com/SAP/cloud-sdk-js/blob/main/CONTRIBUTING.md) and follow the given instructions.
38
+
39
+ ## Links
40
+ - [Official support channel](https://github.com/SAP/cloud-sdk-js/issues/new/choose)
41
+
42
+ <br>
43
+
44
+ - [Github](https://github.com/SAP/cloud-sdk-js)
45
+
46
+ <br>
47
+
48
+ - [SAP Cloud SDK Documentation portal](https://sap.github.io/cloud-sdk)
49
+ - [SAP Cloud SDK Documentation portal - Getting started guide](https://sap.github.io/cloud-sdk/docs/js/getting-started)
50
+ - [SAP Cloud SDK Documentation portal - API documentation](https://sap.github.io/cloud-sdk/api/latest)
51
+ - [SAP Cloud SDK Documentation portal - Error handling](https://sap.github.io/cloud-sdk/docs/js/features/error-handling)
52
+ - [SAP Cloud SDK Documentation portal - Release notes](https://sap.github.io/cloud-sdk/docs/js/release-notes-sap-cloud-sdk-for-javascript-and-typescript)
53
+
54
+ <br>
55
+
56
+ - [Sample repository](https://github.com/SAP-samples/cloud-sdk-js)
57
+
58
+ ## License
59
+
60
+ The SAP Cloud SDK is released under the [Apache License Version 2.0.](http://www.apache.org/licenses/)
61
+ <!-- sap-cloud-sdk-common-readme-stop -->
@@ -0,0 +1,3 @@
1
+ export { timeout } from './timeout';
2
+ export { Middleware, MiddlewareIn, MiddlewareOut, Context, SkipNext } from './middleware';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,OAAO,EACP,QAAQ,EACT,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.timeout = void 0;
4
+ var timeout_1 = require("./timeout");
5
+ Object.defineProperty(exports, "timeout", { enumerable: true, get: function () { return timeout_1.timeout; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAoC;AAA3B,kGAAA,OAAO,OAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './timeout';
2
+ export * from './middleware';
3
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./timeout"), exports);
18
+ __exportStar(require("./middleware"), exports);
19
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,+CAA6B"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Input parameter of a middleware.
3
+ */
4
+ export interface MiddlewareIn<ReturnT, ContextT extends Context> {
5
+ /**
6
+ * Initial function enriched by the middleware e.g. axios request getting a timeout.
7
+ */
8
+ fn: () => Promise<ReturnT>;
9
+ /**
10
+ * Context of the execution e.g. the request context or URL.
11
+ */
12
+ context: ContextT;
13
+ /**
14
+ * Call this method to disable all following middlewares.
15
+ */
16
+ skipNext: SkipNext;
17
+ }
18
+ /**
19
+ * Type of the skip next method.
20
+ */
21
+ export interface SkipNext {
22
+ (): void;
23
+ /**
24
+ * Initially the called property is false and becomes true after invocation.
25
+ */
26
+ called: boolean;
27
+ }
28
+ /**
29
+ * Return type of middlewares.
30
+ */
31
+ export type MiddlewareOut<ReturnT> = () => Promise<ReturnT>;
32
+ /**
33
+ * Minimal Context of the middleware.
34
+ */
35
+ export interface Context {
36
+ /**
37
+ * Arguments used in the function.
38
+ */
39
+ args: unknown[];
40
+ /**
41
+ * URI of the function passed to the middleware.
42
+ */
43
+ uri: string;
44
+ }
45
+ /**
46
+ * Middleware type - This function takes some initial function and returns a function.
47
+ * The input is the MiddlewareIn containing the initial function and some context information e.g. axios request and the request context.
48
+ * It returns a new functions with some additional feature e.g. timeout.
49
+ */
50
+ export type Middleware<ReturnT, ContextT extends Context> = (options: MiddlewareIn<ReturnT, ContextT>) => MiddlewareOut<ReturnT>;
51
+ /**
52
+ * Helper function to join a list of middlewares given an initial input.
53
+ * @param middlewares - Middlewares to be layered around the function.
54
+ * @param context - Context for the middleware execution.
55
+ * @param fn - Function around which the middlewares are added.
56
+ * @returns Function with middlewares layered around it.
57
+ * @internal
58
+ */
59
+ export declare function executeWithMiddleware<ReturnT, ContextT extends Context>(middlewares: Middleware<ReturnT, ContextT>[] | undefined, context: ContextT, fn: () => Promise<ReturnT>): Promise<ReturnT>;
60
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,OAAO,EAAE,QAAQ,SAAS,OAAO;IAC7D;;OAEG;IACH,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B;;OAEG;IACH,OAAO,EAAE,QAAQ,CAAC;IAClB;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,IAAI,CAAC;IAET;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,OAAO,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,OAAO,EAAE,QAAQ,SAAS,OAAO,IAAI,CAC1D,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,KACrC,aAAa,CAAC,OAAO,CAAC,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,QAAQ,SAAS,OAAO,EACrE,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,GAAG,SAAS,EACxD,OAAO,EAAE,QAAQ,EACjB,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GACzB,OAAO,CAAC,OAAO,CAAC,CAiBlB"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWithMiddleware = void 0;
4
+ /**
5
+ * Helper function to join a list of middlewares given an initial input.
6
+ * @param middlewares - Middlewares to be layered around the function.
7
+ * @param context - Context for the middleware execution.
8
+ * @param fn - Function around which the middlewares are added.
9
+ * @returns Function with middlewares layered around it.
10
+ * @internal
11
+ */
12
+ function executeWithMiddleware(middlewares, context, fn) {
13
+ if (!middlewares?.length) {
14
+ return fn();
15
+ }
16
+ // The skipNext function is called in the middleware to skip the next middlewares
17
+ const skipNext = function () {
18
+ skipNext.called = true;
19
+ };
20
+ skipNext.called = false;
21
+ const initial = { context, fn, skipNext };
22
+ const functionWithMiddlewares = addMiddlewaresToInitialFunction(middlewares, initial);
23
+ return functionWithMiddlewares();
24
+ }
25
+ exports.executeWithMiddleware = executeWithMiddleware;
26
+ /**
27
+ * .
28
+ *
29
+ * This functions adds the middlewares to the initial functions.
30
+ * You start with a function (axios request function) and add a timeout, circuit-breaker etc..
31
+ * The result is new a function containing a timeout, circuit-breaker etc..
32
+ * Note that the actual function is not executed.
33
+ * @param middlewares - Middlwares added to the function.
34
+ * @param initial - Initial function and context.
35
+ * @returns The funciton with the middlewares added.
36
+ */
37
+ function addMiddlewaresToInitialFunction(middlewares, initial) {
38
+ const { context, skipNext } = initial;
39
+ const functionWithMiddlewares = middlewares.reduce((prev, curr) => {
40
+ const middlewareAdded = skipNext.called ? prev.fn : curr(prev);
41
+ return { fn: middlewareAdded, context, skipNext };
42
+ }, initial);
43
+ return functionWithMiddlewares.fn;
44
+ }
45
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":";;;AA0DA;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CACnC,WAAwD,EACxD,OAAiB,EACjB,EAA0B;IAE1B,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;QACxB,OAAO,EAAE,EAAE,CAAC;KACb;IAED,iFAAiF;IACjF,MAAM,QAAQ,GAAG;QACf,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;IACzB,CAAC,CAAC;IACF,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;IAExB,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IAC1C,MAAM,uBAAuB,GAAG,+BAA+B,CAC7D,WAAW,EACX,OAAO,CACR,CAAC;IACF,OAAO,uBAAuB,EAAE,CAAC;AACnC,CAAC;AArBD,sDAqBC;AAED;;;;;;;;;;GAUG;AACH,SAAS,+BAA+B,CACtC,WAA4C,EAC5C,OAAwC;IAExC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEtC,MAAM,uBAAuB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpD,CAAC,EAAE,OAAO,CAAC,CAAC;IACZ,OAAO,uBAAuB,CAAC,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Context, Middleware } from './middleware';
2
+ /**
3
+ * Helper method to build a timout middleware.
4
+ * @param timeoutValue - Timeout in milliseconds. Default value are 10 seconds.
5
+ * @returns The middleware adding a timeout to the function.
6
+ */
7
+ export declare function timeout<ReturnType, ContextType extends Context>(timeoutValue?: number): Middleware<ReturnType, ContextType>;
8
+ /**
9
+ * TODO make non public once change to middleware is complete.
10
+ * @param promise - Promise
11
+ * @param timeoutValue - Value for the timeout in milliseconds.
12
+ * @internal
13
+ */
14
+ export declare function wrapInTimeout<T>(promise: Promise<T>, timeoutValue: number, message: string): Promise<T>;
15
+ //# sourceMappingURL=timeout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../src/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAA+B,MAAM,cAAc,CAAC;AAIhF;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,UAAU,EAAE,WAAW,SAAS,OAAO,EAC7D,YAAY,GAAE,MAAuB,GACpC,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,CAOrC;AAoBD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAWZ"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapInTimeout = exports.timeout = void 0;
4
+ const defaultTimeout = 10000;
5
+ /**
6
+ * Helper method to build a timout middleware.
7
+ * @param timeoutValue - Timeout in milliseconds. Default value are 10 seconds.
8
+ * @returns The middleware adding a timeout to the function.
9
+ */
10
+ function timeout(timeoutValue = defaultTimeout) {
11
+ return function (options) {
12
+ const message = `Request to URL: ${options.context.uri} ran into a timeout after ${timeoutValue}ms.`;
13
+ return () => wrapInTimeout(options.fn(), timeoutValue, message);
14
+ };
15
+ }
16
+ exports.timeout = timeout;
17
+ /**
18
+ * Creates a promise for a timeout race.
19
+ * @internal
20
+ * @param timeoutValue - Value for the timeout in milliseconds.
21
+ * message: string - Error message thrown when timeout is exceeded.
22
+ * @returns A promise which times out after the given time and the node timout instance to clear the timeout if not needed anymore.
23
+ */
24
+ function getTimeoutPromise(timeoutValue, message) {
25
+ let timeoutNode;
26
+ const promise = new Promise((resolve, reject) => {
27
+ timeoutNode = setTimeout(() => reject(new Error(message)), timeoutValue);
28
+ });
29
+ return [promise, timeoutNode];
30
+ }
31
+ /**
32
+ * TODO make non public once change to middleware is complete.
33
+ * @param promise - Promise
34
+ * @param timeoutValue - Value for the timeout in milliseconds.
35
+ * @internal
36
+ */
37
+ async function wrapInTimeout(promise, timeoutValue, message) {
38
+ const [timeoutPromise, timeoutInstance] = getTimeoutPromise(timeoutValue, message);
39
+ // Clear the timeout if the original promise is resolve or reject to avoid open handlers.
40
+ const withClearTimeout = promise.finally(() => {
41
+ clearTimeout(timeoutInstance);
42
+ });
43
+ return Promise.race([withClearTimeout, timeoutPromise]);
44
+ }
45
+ exports.wrapInTimeout = wrapInTimeout;
46
+ //# sourceMappingURL=timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../src/timeout.ts"],"names":[],"mappings":";;;AAEA,MAAM,cAAc,GAAG,KAAK,CAAC;AAE7B;;;;GAIG;AACH,SAAgB,OAAO,CACrB,eAAuB,cAAc;IAErC,OAAO,UACL,OAA8C;QAE9C,MAAM,OAAO,GAAG,mBAAmB,OAAO,CAAC,OAAO,CAAC,GAAG,6BAA6B,YAAY,KAAK,CAAC;QACrG,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC;AATD,0BASC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,YAAoB,EACpB,OAAe;IAEf,IAAI,WAAuC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjD,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CACjC,OAAmB,EACnB,YAAoB,EACpB,OAAe;IAEf,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,GAAG,iBAAiB,CACzD,YAAY,EACZ,OAAO,CACR,CAAC;IACF,yFAAyF;IACzF,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;QAC5C,YAAY,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1D,CAAC;AAfD,sCAeC"}
package/internal.js ADDED
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+ function __export(m) {
3
+ for (const p in m) {
4
+ if (!exports.hasOwnProperty(p)) {
5
+ exports[p] = m[p];
6
+ }
7
+ }
8
+ }
9
+ Object.defineProperty(exports, '__esModule', { value: true });
10
+ /**
11
+ * @packageDocumentation
12
+ * @experimental The internal module is related to sdk-metadata types which are used only internally.
13
+ */
14
+ __export(require('./dist/internal'));
15
+ // # sourceMappingURL=internal.js.map
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@sap-cloud-sdk/resilience",
3
+ "version": "2.11.1-20221215201002.0",
4
+ "description": "SAP Cloud SDK for JavaScript resilience",
5
+ "homepage": "https://sap.github.io/cloud-sdk/docs/js/overview-cloud-sdk-for-javascript",
6
+ "license": "Apache-2.0",
7
+ "keywords": [
8
+ "sap-cloud-sdk",
9
+ "cloud-sdk",
10
+ "sap-cloud-platform",
11
+ "middlewares",
12
+ "resilience"
13
+ ],
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "files": [
20
+ "dist/**/*.js",
21
+ "dist/**/*.js.map",
22
+ "dist/**/*.d.ts",
23
+ "dist/**/*.d.ts.map",
24
+ "internal.js",
25
+ "internal.d.ts"
26
+ ],
27
+ "repository": "github:SAP/cloud-sdk-js",
28
+ "scripts": {
29
+ "compile": "tsc -b",
30
+ "prepublishOnly": "yarn compile && yarn readme",
31
+ "test": "yarn test:unit",
32
+ "test:unit": "jest",
33
+ "coverage": "jest --coverage",
34
+ "lint": "eslint --ext .ts . && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c",
35
+ "lint:fix": "set TIMING=1 && eslint --ext .ts . --fix --quiet && prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --loglevel error",
36
+ "check:dependencies": "depcheck .",
37
+ "check:public-api": "ts-node ../../scripts/check-public-api-cli.ts",
38
+ "readme": "ts-node ../../scripts/replace-common-readme.ts"
39
+ },
40
+ "dependencies": {},
41
+ "devDependencies": {
42
+ "axios": "^0.27.1",
43
+ "nock": "^13.2.9",
44
+ "typescript": "~4.9.4"
45
+ }
46
+ }