@odata2ts/http-client-fetch 0.6.2 → 0.7.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/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.7.0](https://github.com/odata2ts/http-client/compare/@odata2ts/http-client-fetch@0.6.2...@odata2ts/http-client-fetch@0.7.0) (2024-08-13)
7
+
8
+ ### Code Refactoring
9
+
10
+ * switch to vitest & ESM ([#18](https://github.com/odata2ts/http-client/issues/18)) ([748558f](https://github.com/odata2ts/http-client/commit/748558f1e3f699085ade1058b1459c843f60994f))
11
+
12
+ ### Features
13
+
14
+ * blob and stream support ([#12](https://github.com/odata2ts/http-client/issues/12)) ([ae6f062](https://github.com/odata2ts/http-client/commit/ae6f062371a0ad11707fa3f9edff9571998edb5b))
15
+
16
+ ### BREAKING CHANGES
17
+
18
+ * switch to ESM tends to break stuff
19
+
6
20
  ## [0.6.2](https://github.com/odata2ts/http-client/compare/@odata2ts/http-client-fetch@0.6.1...@odata2ts/http-client-fetch@0.6.2) (2023-09-13)
7
21
 
8
22
  **Note:** Version bump only for package @odata2ts/http-client-fetch
package/README.md CHANGED
@@ -1,50 +1,50 @@
1
- [![npm (scoped)](https://img.shields.io/npm/v/@odata2ts/http-client-fetch?style=for-the-badge)](https://www.npmjs.com/package/@odata2ts/http-client-fetch)
2
-
3
- # Fetch HTTP Client
4
-
5
- Fetch based HTTP client for [odata2ts](https://github.com/odata2ts/odata2ts).
6
- This client uses - as its name suggests - [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
7
- for realizing the HTTP communication.
8
-
9
- It supports:
10
-
11
- - request configuration
12
- - automatic CSRF token handling
13
-
14
- Works also for Node.js v18+, but is still marked as **experimental**.
15
-
16
- ## Installation
17
-
18
- Install package `@odata2ts/http-client-fetch` as runtime dependency:
19
-
20
- ```bash
21
- npm install --save @odata2ts/http-client-fetch
22
- ```
23
-
24
- ## Documentation
25
-
26
- [Fetch Client Documentation](https://odata2ts.github.io/docs/odata-client/http-client/fetch)
27
-
28
- Main documentation for the odata2ts eco system:
29
- [https://odata2ts.github.io](https://odata2ts.github.io/)
30
-
31
- ## Tests
32
-
33
- See folder [test](https://github.com/odata2ts/http-client/tree/main/packages/fetch/test)
34
- for unit tests.
35
-
36
- See folder [int-test](https://github.com/odata2ts/http-client/tree/main/packages/fetch/int-test) for
37
- integration tests.
38
-
39
- ## Support, Feedback, Contributing
40
-
41
- This project is open to feature requests, suggestions, bug reports, usage questions etc.
42
- via [GitHub issues](https://github.com/odata2ts/http-client/issues).
43
-
44
- Contributions and feedback are encouraged and always welcome.
45
-
46
- See the [contribution guidelines](https://github.com/odata2ts/http-client/blob/main/CONTRIBUTING.md) for further information.
47
-
48
- ## License
49
-
50
- MIT - see [License](./LICENSE).
1
+ [![npm (scoped)](https://img.shields.io/npm/v/@odata2ts/http-client-fetch?style=for-the-badge)](https://www.npmjs.com/package/@odata2ts/http-client-fetch)
2
+
3
+ # Fetch HTTP Client
4
+
5
+ Fetch based HTTP client for [odata2ts](https://github.com/odata2ts/odata2ts).
6
+ This client uses - as its name suggests - [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
7
+ for realizing the HTTP communication.
8
+
9
+ It supports:
10
+
11
+ - request configuration
12
+ - automatic CSRF token handling
13
+
14
+ Works also for Node.js v18+, but is still marked as **experimental**.
15
+
16
+ ## Installation
17
+
18
+ Install package `@odata2ts/http-client-fetch` as runtime dependency:
19
+
20
+ ```bash
21
+ npm install --save @odata2ts/http-client-fetch
22
+ ```
23
+
24
+ ## Documentation
25
+
26
+ [Fetch Client Documentation](https://odata2ts.github.io/docs/odata-client/http-client/fetch)
27
+
28
+ Main documentation for the odata2ts eco system:
29
+ [https://odata2ts.github.io](https://odata2ts.github.io/)
30
+
31
+ ## Tests
32
+
33
+ See folder [test](https://github.com/odata2ts/http-client/tree/main/packages/fetch/test)
34
+ for unit tests.
35
+
36
+ See folder [int-test](https://github.com/odata2ts/http-client/tree/main/packages/fetch/int-test) for
37
+ integration tests.
38
+
39
+ ## Support, Feedback, Contributing
40
+
41
+ This project is open to feature requests, suggestions, bug reports, usage questions etc.
42
+ via [GitHub issues](https://github.com/odata2ts/http-client/issues).
43
+
44
+ Contributions and feedback are encouraged and always welcome.
45
+
46
+ See the [contribution guidelines](https://github.com/odata2ts/http-client/blob/main/CONTRIBUTING.md) for further information.
47
+
48
+ ## License
49
+
50
+ MIT - see [License](./LICENSE).
@@ -8,6 +8,6 @@ export declare class FetchClient extends BaseHttpClient<FetchRequestConfig> impl
8
8
  protected readonly config: RequestInit;
9
9
  constructor(config?: FetchRequestConfig, clientOptions?: ClientOptions);
10
10
  protected executeRequest<ResponseModel>(method: HttpMethods, url: string, data: any, requestConfig?: FetchRequestConfig | undefined, internalConfig?: InternalHttpClientConfig): Promise<HttpResponseModel<ResponseModel>>;
11
- protected getResponseBody(response: Response, isFailedJsonFatal: boolean): Promise<any>;
11
+ protected getResponseBody(response: Response, options: InternalHttpClientConfig): Promise<any>;
12
12
  protected mapHeaders(headers: Headers): Record<string, string>;
13
13
  }
@@ -1,30 +1,28 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FetchClient = exports.DEFAULT_ERROR_MESSAGE = void 0;
4
- const tslib_1 = require("tslib");
5
- const http_client_base_1 = require("@odata2ts/http-client-base");
6
- const FetchClientError_1 = require("./FetchClientError");
7
- const FetchRequestConfig_1 = require("./FetchRequestConfig");
8
- exports.DEFAULT_ERROR_MESSAGE = "No error message!";
1
+ import { __awaiter, __rest } from "tslib";
2
+ import { BaseHttpClient, } from "@odata2ts/http-client-base";
3
+ import { FetchClientError } from "./FetchClientError";
4
+ import { getDefaultConfig, mergeFetchConfig } from "./FetchRequestConfig";
5
+ export const DEFAULT_ERROR_MESSAGE = "No error message!";
9
6
  const FETCH_FAILURE_MESSAGE = "OData request failed entirely: ";
10
7
  const JSON_RETRIEVAL_FAILURE_MESSAGE = "Retrieving JSON body from OData response failed: ";
8
+ const BLOB_RETRIEVAL_FAILURE_MESSAGE = "Retrieving blob from OData response failed: ";
11
9
  const RESPONSE_FAILURE_MESSAGE = "OData server responded with error: ";
12
10
  function buildErrorMessage(prefix, error) {
13
11
  const msg = typeof error === "string" ? error : error === null || error === void 0 ? void 0 : error.message;
14
- return prefix + (msg || exports.DEFAULT_ERROR_MESSAGE);
12
+ return prefix + (msg || DEFAULT_ERROR_MESSAGE);
15
13
  }
16
- class FetchClient extends http_client_base_1.BaseHttpClient {
14
+ export class FetchClient extends BaseHttpClient {
17
15
  constructor(config, clientOptions) {
18
16
  super(clientOptions);
19
- this.config = (0, FetchRequestConfig_1.getDefaultConfig)(config);
17
+ this.config = getDefaultConfig(config);
20
18
  }
21
19
  executeRequest(method, url, data, requestConfig = {}, internalConfig = {}) {
22
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
20
+ return __awaiter(this, void 0, void 0, function* () {
23
21
  const { headers, noBodyEvaluation } = internalConfig;
24
- const _a = (0, FetchRequestConfig_1.mergeFetchConfig)(this.config, { headers }, requestConfig), { params } = _a, config = tslib_1.__rest(_a, ["params"]);
22
+ const _a = mergeFetchConfig(this.config, { headers }, requestConfig), { params } = _a, config = __rest(_a, ["params"]);
25
23
  config.method = method;
26
24
  if (typeof data !== "undefined") {
27
- config.body = JSON.stringify(data);
25
+ config.body = internalConfig.dataType === "json" ? JSON.stringify(data) : data;
28
26
  }
29
27
  let finalUrl = url;
30
28
  if (params && Object.values(params).length) {
@@ -39,15 +37,28 @@ class FetchClient extends http_client_base_1.BaseHttpClient {
39
37
  response = yield fetch(finalUrl, config);
40
38
  }
41
39
  catch (fetchError) {
42
- throw new FetchClientError_1.FetchClientError(buildErrorMessage(FETCH_FAILURE_MESSAGE, fetchError), undefined, undefined, fetchError);
40
+ throw new FetchClientError(buildErrorMessage(FETCH_FAILURE_MESSAGE, fetchError), undefined, undefined, fetchError);
43
41
  }
44
42
  // error response
45
43
  if (!response.ok) {
46
- let responseData = yield this.getResponseBody(response, false);
44
+ let responseData;
45
+ try {
46
+ responseData = yield this.getResponseBody(response, internalConfig);
47
+ }
48
+ catch (e) {
49
+ responseData = undefined;
50
+ }
47
51
  const errMsg = this.retrieveErrorMessage(responseData);
48
- throw new FetchClientError_1.FetchClientError(buildErrorMessage(RESPONSE_FAILURE_MESSAGE, errMsg), response.status, this.mapHeaders(response.headers), new Error(errMsg || exports.DEFAULT_ERROR_MESSAGE), response);
52
+ throw new FetchClientError(buildErrorMessage(RESPONSE_FAILURE_MESSAGE, errMsg), response.status, this.mapHeaders(response.headers), new Error(errMsg || DEFAULT_ERROR_MESSAGE), response);
53
+ }
54
+ let responseData;
55
+ try {
56
+ responseData = noBodyEvaluation ? undefined : yield this.getResponseBody(response, internalConfig);
57
+ }
58
+ catch (error) {
59
+ const msg = internalConfig.dataType === "blob" ? BLOB_RETRIEVAL_FAILURE_MESSAGE : JSON_RETRIEVAL_FAILURE_MESSAGE;
60
+ throw new FetchClientError(buildErrorMessage(msg, error), response.status, this.mapHeaders(response.headers), error);
49
61
  }
50
- const responseData = noBodyEvaluation ? undefined : yield this.getResponseBody(response, true);
51
62
  return {
52
63
  status: response.status,
53
64
  statusText: response.statusText,
@@ -56,20 +67,20 @@ class FetchClient extends http_client_base_1.BaseHttpClient {
56
67
  };
57
68
  });
58
69
  }
59
- getResponseBody(response, isFailedJsonFatal) {
60
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
70
+ getResponseBody(response, options) {
71
+ return __awaiter(this, void 0, void 0, function* () {
61
72
  if (response.status === 204) {
62
73
  return undefined;
63
74
  }
64
- try {
65
- return yield response.json();
66
- }
67
- catch (error) {
68
- if (isFailedJsonFatal) {
69
- throw new FetchClientError_1.FetchClientError(buildErrorMessage(JSON_RETRIEVAL_FAILURE_MESSAGE, error), response.status, this.mapHeaders(response.headers), error);
70
- }
71
- return undefined;
75
+ switch (options.dataType) {
76
+ case "json":
77
+ return response.json();
78
+ case "blob":
79
+ return response.blob();
80
+ case "stream":
81
+ return response.body;
72
82
  }
83
+ return undefined;
73
84
  });
74
85
  }
75
86
  mapHeaders(headers) {
@@ -78,5 +89,4 @@ class FetchClient extends http_client_base_1.BaseHttpClient {
78
89
  return result;
79
90
  }
80
91
  }
81
- exports.FetchClient = FetchClient;
82
92
  //# sourceMappingURL=FetchClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FetchClient.js","sourceRoot":"","sources":["../src/FetchClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpResponseModel, ODataHttpClient } from \"@odata2ts/http-client-api\";\r\nimport {\r\n BaseHttpClient,\r\n BaseHttpClientOptions,\r\n HttpMethods,\r\n InternalHttpClientConfig,\r\n} from \"@odata2ts/http-client-base\";\r\n\r\nimport { FetchClientError } from \"./FetchClientError\";\r\nimport { FetchRequestConfig, getDefaultConfig, mergeFetchConfig } from \"./FetchRequestConfig\";\r\n\r\nexport interface ClientOptions extends BaseHttpClientOptions {}\r\n\r\nexport const DEFAULT_ERROR_MESSAGE = \"No error message!\";\r\nconst FETCH_FAILURE_MESSAGE = \"OData request failed entirely: \";\r\nconst JSON_RETRIEVAL_FAILURE_MESSAGE = \"Retrieving JSON body from OData response failed: \";\r\nconst RESPONSE_FAILURE_MESSAGE = \"OData server responded with error: \";\r\n\r\nfunction buildErrorMessage(prefix: string, error: any) {\r\n const msg = typeof error === \"string\" ? error : (error as Error)?.message;\r\n return prefix + (msg || DEFAULT_ERROR_MESSAGE);\r\n}\r\n\r\nexport class FetchClient extends BaseHttpClient<FetchRequestConfig> implements ODataHttpClient<FetchRequestConfig> {\r\n protected readonly config: RequestInit;\r\n\r\n constructor(config?: FetchRequestConfig, clientOptions?: ClientOptions) {\r\n super(clientOptions);\r\n this.config = getDefaultConfig(config);\r\n }\r\n\r\n protected async executeRequest<ResponseModel>(\r\n method: HttpMethods,\r\n url: string,\r\n data: any,\r\n requestConfig: FetchRequestConfig | undefined = {},\r\n internalConfig: InternalHttpClientConfig = {}\r\n ): Promise<HttpResponseModel<ResponseModel>> {\r\n const { headers, noBodyEvaluation } = internalConfig;\r\n const { params, ...config } = mergeFetchConfig(this.config, { headers }, requestConfig);\r\n config.method = method;\r\n if (typeof data !== \"undefined\") {\r\n config.body = JSON.stringify(data);\r\n }\r\n let finalUrl = url;\r\n if (params && Object.values(params).length) {\r\n finalUrl +=\r\n (url.match(/\\?/) ? \"&\" : \"?\") +\r\n // @ts-ignore\r\n new URLSearchParams(params).toString();\r\n }\r\n\r\n // the actual request\r\n let response: Response;\r\n try {\r\n response = await fetch(finalUrl, config);\r\n } catch (fetchError) {\r\n throw new FetchClientError(\r\n buildErrorMessage(FETCH_FAILURE_MESSAGE, fetchError),\r\n undefined,\r\n undefined,\r\n fetchError as Error\r\n );\r\n }\r\n\r\n // error response\r\n if (!response.ok) {\r\n let responseData = await this.getResponseBody(response, false);\r\n const errMsg = this.retrieveErrorMessage(responseData);\r\n\r\n throw new FetchClientError(\r\n buildErrorMessage(RESPONSE_FAILURE_MESSAGE, errMsg),\r\n response.status,\r\n this.mapHeaders(response.headers),\r\n new Error(errMsg || DEFAULT_ERROR_MESSAGE),\r\n response\r\n );\r\n }\r\n\r\n const responseData = noBodyEvaluation ? undefined : await this.getResponseBody(response, true);\r\n\r\n return {\r\n status: response.status,\r\n statusText: response.statusText,\r\n headers: this.mapHeaders(response.headers),\r\n data: responseData,\r\n };\r\n }\r\n\r\n protected async getResponseBody(response: Response, isFailedJsonFatal: boolean) {\r\n if (response.status === 204) {\r\n return undefined;\r\n }\r\n try {\r\n return await response.json();\r\n } catch (error) {\r\n if (isFailedJsonFatal) {\r\n throw new FetchClientError(\r\n buildErrorMessage(JSON_RETRIEVAL_FAILURE_MESSAGE, error),\r\n response.status,\r\n this.mapHeaders(response.headers),\r\n error as Error\r\n );\r\n }\r\n return undefined;\r\n }\r\n }\r\n\r\n protected mapHeaders(headers: Headers): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n headers.forEach((value, key) => (result[key] = value));\r\n\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"FetchClient.js","sourceRoot":"","sources":["../src/FetchClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpResponseModel, ODataHttpClient } from \"@odata2ts/http-client-api\";\nimport {\n BaseHttpClient,\n BaseHttpClientOptions,\n HttpMethods,\n InternalHttpClientConfig,\n} from \"@odata2ts/http-client-base\";\nimport { FetchClientError } from \"./FetchClientError\";\nimport { FetchRequestConfig, getDefaultConfig, mergeFetchConfig } from \"./FetchRequestConfig\";\n\nexport interface ClientOptions extends BaseHttpClientOptions {}\n\nexport const DEFAULT_ERROR_MESSAGE = \"No error message!\";\nconst FETCH_FAILURE_MESSAGE = \"OData request failed entirely: \";\nconst JSON_RETRIEVAL_FAILURE_MESSAGE = \"Retrieving JSON body from OData response failed: \";\nconst BLOB_RETRIEVAL_FAILURE_MESSAGE = \"Retrieving blob from OData response failed: \";\nconst RESPONSE_FAILURE_MESSAGE = \"OData server responded with error: \";\n\nfunction buildErrorMessage(prefix: string, error: any) {\n const msg = typeof error === \"string\" ? error : (error as Error)?.message;\n return prefix + (msg || DEFAULT_ERROR_MESSAGE);\n}\n\nexport class FetchClient extends BaseHttpClient<FetchRequestConfig> implements ODataHttpClient<FetchRequestConfig> {\n protected readonly config: RequestInit;\n\n constructor(config?: FetchRequestConfig, clientOptions?: ClientOptions) {\n super(clientOptions);\n this.config = getDefaultConfig(config);\n }\n\n protected async executeRequest<ResponseModel>(\n method: HttpMethods,\n url: string,\n data: any,\n requestConfig: FetchRequestConfig | undefined = {},\n internalConfig: InternalHttpClientConfig = {},\n ): Promise<HttpResponseModel<ResponseModel>> {\n const { headers, noBodyEvaluation } = internalConfig;\n const { params, ...config } = mergeFetchConfig(this.config, { headers }, requestConfig);\n config.method = method;\n if (typeof data !== \"undefined\") {\n config.body = internalConfig.dataType === \"json\" ? JSON.stringify(data) : data;\n }\n let finalUrl = url;\n if (params && Object.values(params).length) {\n finalUrl +=\n (url.match(/\\?/) ? \"&\" : \"?\") +\n // @ts-ignore\n new URLSearchParams(params).toString();\n }\n\n // the actual request\n let response: Response;\n try {\n response = await fetch(finalUrl, config);\n } catch (fetchError) {\n throw new FetchClientError(\n buildErrorMessage(FETCH_FAILURE_MESSAGE, fetchError),\n undefined,\n undefined,\n fetchError as Error,\n );\n }\n\n // error response\n if (!response.ok) {\n let responseData;\n try {\n responseData = await this.getResponseBody(response, internalConfig);\n } catch (e) {\n responseData = undefined;\n }\n const errMsg = this.retrieveErrorMessage(responseData);\n\n throw new FetchClientError(\n buildErrorMessage(RESPONSE_FAILURE_MESSAGE, errMsg),\n response.status,\n this.mapHeaders(response.headers),\n new Error(errMsg || DEFAULT_ERROR_MESSAGE),\n response,\n );\n }\n\n let responseData;\n try {\n responseData = noBodyEvaluation ? undefined : await this.getResponseBody(response, internalConfig);\n } catch (error) {\n const msg = internalConfig.dataType === \"blob\" ? BLOB_RETRIEVAL_FAILURE_MESSAGE : JSON_RETRIEVAL_FAILURE_MESSAGE;\n throw new FetchClientError(\n buildErrorMessage(msg, error),\n response.status,\n this.mapHeaders(response.headers),\n error as Error,\n );\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: this.mapHeaders(response.headers),\n data: responseData,\n };\n }\n\n protected async getResponseBody(response: Response, options: InternalHttpClientConfig) {\n if (response.status === 204) {\n return undefined;\n }\n switch (options.dataType) {\n case \"json\":\n return response.json();\n case \"blob\":\n return response.blob();\n case \"stream\":\n return response.body;\n }\n\n return undefined;\n }\n\n protected mapHeaders(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => (result[key] = value));\n\n return result;\n }\n}\n"]}
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FetchClientError = void 0;
4
- class FetchClientError extends Error {
1
+ export class FetchClientError extends Error {
5
2
  constructor(message, status, headers, cause, response) {
6
3
  // @ts-ignore: fetch requires lib "dom" or "webworker", but then the "cause" property becomes unknown to TS
7
4
  super(message, { cause });
@@ -12,5 +9,4 @@ class FetchClientError extends Error {
12
9
  this.name = this.constructor.name;
13
10
  }
14
11
  }
15
- exports.FetchClientError = FetchClientError;
16
12
  //# sourceMappingURL=FetchClientError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FetchClientError.js","sourceRoot":"","sources":["../src/FetchClientError.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAiB,SAAQ,KAAK;IACzC,YACE,OAAe,EACC,MAAe,EACf,OAAgC,EAChC,KAAa,EACb,QAAmB;QAEnC,2GAA2G;QAC3G,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QANV,WAAM,GAAN,MAAM,CAAS;QACf,YAAO,GAAP,OAAO,CAAyB;QAChC,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAW;QAInC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAZD,4CAYC","sourcesContent":["import { ODataClientError } from \"@odata2ts/http-client-api\";\r\n\r\nexport class FetchClientError extends Error implements ODataClientError {\r\n constructor(\r\n message: string,\r\n public readonly status?: number,\r\n public readonly headers?: Record<string, string>,\r\n public readonly cause?: Error,\r\n public readonly response?: Response\r\n ) {\r\n // @ts-ignore: fetch requires lib \"dom\" or \"webworker\", but then the \"cause\" property becomes unknown to TS\r\n super(message, { cause });\r\n this.name = this.constructor.name;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"FetchClientError.js","sourceRoot":"","sources":["../src/FetchClientError.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YACE,OAAe,EACC,MAAe,EACf,OAAgC,EAChC,KAAa,EACb,QAAmB;QAEnC,2GAA2G;QAC3G,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QANV,WAAM,GAAN,MAAM,CAAS;QACf,YAAO,GAAP,OAAO,CAAyB;QAChC,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAW;QAInC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF","sourcesContent":["import { ODataClientError } from \"@odata2ts/http-client-api\";\n\nexport class FetchClientError extends Error implements ODataClientError {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly headers?: Record<string, string>,\n public readonly cause?: Error,\n public readonly response?: Response,\n ) {\n // @ts-ignore: fetch requires lib \"dom\" or \"webworker\", but then the \"cause\" property becomes unknown to TS\n super(message, { cause });\n this.name = this.constructor.name;\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Available config options for end user when making a given request.
3
3
  */
4
- export interface FetchRequestConfig extends Pick<RequestInit, "credentials" | "cache" | "mode" | "redirect" | "referrerPolicy"> {
4
+ export interface FetchRequestConfig extends Partial<Pick<RequestInit, "credentials" | "cache" | "mode" | "redirect" | "referrerPolicy" | "signal">> {
5
5
  headers?: Record<string, string> | Headers;
6
6
  /**
7
7
  * Add query params.
@@ -1,26 +1,23 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mergeFetchConfig = exports.getDefaultConfig = void 0;
4
- const tslib_1 = require("tslib");
1
+ import { __rest } from "tslib";
5
2
  const DEFAULT_CONFIG = {
6
3
  // headers: { Accept: "application/json", "Content-Type": "application/json" },
7
4
  cache: "no-store",
8
5
  };
9
- function getDefaultConfig(config) {
6
+ export function getDefaultConfig(config) {
10
7
  return mergeFetchConfig(DEFAULT_CONFIG, config);
11
8
  }
12
- exports.getDefaultConfig = getDefaultConfig;
13
- function mergeFetchConfig(...configs) {
9
+ export function mergeFetchConfig(...configs) {
14
10
  if (!configs.length) {
15
11
  return undefined;
16
12
  }
17
13
  return configs
18
14
  .filter((c) => !!c)
19
15
  .reduce((collector, current) => {
20
- const { headers } = current, passThrough = tslib_1.__rest(current, ["headers"]);
16
+ const { headers } = current, passThrough = __rest(current, ["headers"]);
21
17
  const collectedHeaders = collector.headers;
22
18
  // headers as Headers object
23
19
  if (headers && headers instanceof Headers) {
20
+ // @ts-ignore: fails on CI test
24
21
  headers.forEach((val, key) => collectedHeaders.set(key, val));
25
22
  }
26
23
  // headers as plain Record<string,string>
@@ -30,5 +27,4 @@ function mergeFetchConfig(...configs) {
30
27
  return Object.assign(Object.assign({}, collector), passThrough);
31
28
  }, { headers: new Headers() });
32
29
  }
33
- exports.mergeFetchConfig = mergeFetchConfig;
34
30
  //# sourceMappingURL=FetchRequestConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FetchRequestConfig.js","sourceRoot":"","sources":["../src/FetchRequestConfig.ts"],"names":[],"mappings":";;;;AAAA,MAAM,cAAc,GAAgB;IAClC,+EAA+E;IAC/E,KAAK,EAAE,UAAU;CAClB,CAAC;AAkBF,SAAgB,gBAAgB,CAAC,MAA2B;IAC1D,OAAO,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAFD,4CAEC;AAID,SAAgB,gBAAgB,CAAC,GAAG,OAAuC;IACzE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;QACnB,OAAO,SAAS,CAAC;KAClB;IACD,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACpC,MAAM,CACL,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;QACrB,MAAM,EAAE,OAAO,KAAqB,OAAO,EAAvB,WAAW,kBAAK,OAAO,EAArC,WAA2B,CAAU,CAAC;QAC5C,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAkB,CAAC;QAEtD,4BAA4B;QAC5B,IAAI,OAAO,IAAI,OAAO,YAAY,OAAO,EAAE;YACzC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SAC/D;QACD,yCAAyC;aACpC,IAAI,OAAO,EAAE;YAChB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SACjF;QAED,uCAAY,SAAS,GAAK,WAAW,EAAG;IAC1C,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,CAC3B,CAAC;AACN,CAAC;AAxBD,4CAwBC","sourcesContent":["const DEFAULT_CONFIG: RequestInit = {\r\n // headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\r\n cache: \"no-store\",\r\n};\r\n\r\n/**\r\n * Available config options for end user when making a given request.\r\n */\r\nexport interface FetchRequestConfig\r\n extends Pick<RequestInit, \"credentials\" | \"cache\" | \"mode\" | \"redirect\" | \"referrerPolicy\"> {\r\n headers?: Record<string, string> | Headers;\r\n /**\r\n * Add query params.\r\n */\r\n params?: Record<string, string | number | boolean | Array<string | number | boolean>>;\r\n}\r\n\r\nexport interface InternalFetchConfig extends Omit<RequestInit, \"headers\">, Pick<FetchRequestConfig, \"params\"> {\r\n headers: Headers;\r\n}\r\n\r\nexport function getDefaultConfig(config?: FetchRequestConfig): RequestInit {\r\n return mergeFetchConfig(DEFAULT_CONFIG, config);\r\n}\r\n\r\nexport function mergeFetchConfig(): undefined;\r\nexport function mergeFetchConfig(...configs: Array<RequestInit | undefined>): InternalFetchConfig;\r\nexport function mergeFetchConfig(...configs: Array<RequestInit | undefined>) {\r\n if (!configs.length) {\r\n return undefined;\r\n }\r\n return configs\r\n .filter((c): c is RequestInit => !!c)\r\n .reduce<InternalFetchConfig>(\r\n (collector, current) => {\r\n const { headers, ...passThrough } = current;\r\n const collectedHeaders = collector.headers as Headers;\r\n\r\n // headers as Headers object\r\n if (headers && headers instanceof Headers) {\r\n headers.forEach((val, key) => collectedHeaders.set(key, val));\r\n }\r\n // headers as plain Record<string,string>\r\n else if (headers) {\r\n Object.entries(headers).forEach(([key, val]) => collectedHeaders.set(key, val));\r\n }\r\n\r\n return { ...collector, ...passThrough };\r\n },\r\n { headers: new Headers() }\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"FetchRequestConfig.js","sourceRoot":"","sources":["../src/FetchRequestConfig.ts"],"names":[],"mappings":";AAAA,MAAM,cAAc,GAAgB;IAClC,+EAA+E;IAC/E,KAAK,EAAE,UAAU;CAClB,CAAC;AAkBF,MAAM,UAAU,gBAAgB,CAAC,MAA2B;IAC1D,OAAO,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAID,MAAM,UAAU,gBAAgB,CAAC,GAAG,OAAuC;IACzE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;QACnB,OAAO,SAAS,CAAC;KAClB;IACD,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACpC,MAAM,CACL,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;QACrB,MAAM,EAAE,OAAO,KAAqB,OAAO,EAAvB,WAAW,UAAK,OAAO,EAArC,WAA2B,CAAU,CAAC;QAC5C,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAkB,CAAC;QAEtD,4BAA4B;QAC5B,IAAI,OAAO,IAAI,OAAO,YAAY,OAAO,EAAE;YACzC,+BAA+B;YAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SAC/D;QACD,yCAAyC;aACpC,IAAI,OAAO,EAAE;YAChB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SACjF;QAED,uCAAY,SAAS,GAAK,WAAW,EAAG;IAC1C,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,CAC3B,CAAC;AACN,CAAC","sourcesContent":["const DEFAULT_CONFIG: RequestInit = {\n // headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\n cache: \"no-store\",\n};\n\n/**\n * Available config options for end user when making a given request.\n */\nexport interface FetchRequestConfig\n extends Partial<Pick<RequestInit, \"credentials\" | \"cache\" | \"mode\" | \"redirect\" | \"referrerPolicy\" | \"signal\">> {\n headers?: Record<string, string> | Headers;\n /**\n * Add query params.\n */\n params?: Record<string, string | number | boolean | Array<string | number | boolean>>;\n}\n\nexport interface InternalFetchConfig extends Omit<RequestInit, \"headers\">, Pick<FetchRequestConfig, \"params\"> {\n headers: Headers;\n}\n\nexport function getDefaultConfig(config?: FetchRequestConfig): RequestInit {\n return mergeFetchConfig(DEFAULT_CONFIG, config);\n}\n\nexport function mergeFetchConfig(): undefined;\nexport function mergeFetchConfig(...configs: Array<RequestInit | undefined>): InternalFetchConfig;\nexport function mergeFetchConfig(...configs: Array<RequestInit | undefined>) {\n if (!configs.length) {\n return undefined;\n }\n return configs\n .filter((c): c is RequestInit => !!c)\n .reduce<InternalFetchConfig>(\n (collector, current) => {\n const { headers, ...passThrough } = current;\n const collectedHeaders = collector.headers as Headers;\n\n // headers as Headers object\n if (headers && headers instanceof Headers) {\n // @ts-ignore: fails on CI test\n headers.forEach((val, key) => collectedHeaders.set(key, val));\n }\n // headers as plain Record<string,string>\n else if (headers) {\n Object.entries(headers).forEach(([key, val]) => collectedHeaders.set(key, val));\n }\n\n return { ...collector, ...passThrough };\n },\n { headers: new Headers() },\n );\n}\n"]}
package/lib/index.js CHANGED
@@ -1,8 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FetchClientError = void 0;
4
- const tslib_1 = require("tslib");
5
- tslib_1.__exportStar(require("./FetchClient"), exports);
6
- var FetchClientError_1 = require("./FetchClientError");
7
- Object.defineProperty(exports, "FetchClientError", { enumerable: true, get: function () { return FetchClientError_1.FetchClientError; } });
1
+ export * from "./FetchClient";
2
+ export { FetchClientError } from "./FetchClientError";
8
3
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,wDAA8B;AAC9B,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA","sourcesContent":["export * from \"./FetchClient\";\r\nexport { FetchClientError } from \"./FetchClientError\";\r\nexport { FetchRequestConfig } from \"./FetchRequestConfig\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["export * from \"./FetchClient\";\nexport { FetchClientError } from \"./FetchClientError\";\nexport { FetchRequestConfig } from \"./FetchRequestConfig\";\n"]}
package/package.json CHANGED
@@ -1,48 +1,45 @@
1
1
  {
2
2
  "name": "@odata2ts/http-client-fetch",
3
- "version": "0.6.2",
4
- "publishConfig": {
5
- "access": "public"
6
- },
3
+ "version": "0.7.0",
7
4
  "description": "HTTP client based on fetch and consumable by odata2ts",
8
- "license": "MIT",
5
+ "keywords": [
6
+ "http client",
7
+ "fetch",
8
+ "odata",
9
+ "ts",
10
+ "odata2ts"
11
+ ],
9
12
  "repository": "git@github.com:odata2ts/http-client.git",
13
+ "license": "MIT",
10
14
  "author": "texttechne",
15
+ "type": "module",
11
16
  "main": "./lib/index.js",
17
+ "types": "./lib/index.d.ts",
18
+ "files": [
19
+ "*.md",
20
+ "lib",
21
+ "LICENSE"
22
+ ],
12
23
  "scripts": {
13
24
  "build": "yarn clean && yarn compile",
14
25
  "check-circular-deps": "madge ./src --extensions ts --circular",
15
26
  "clean": "rimraf lib coverage",
16
27
  "compile": "tsc",
17
- "int-test": "jest ./int-test",
28
+ "int-test": "vitest run int-test/**",
18
29
  "prepublish": "yarn build",
19
- "test": "jest ./test"
30
+ "test": "vitest run test/**"
20
31
  },
21
- "files": [
22
- "*.md",
23
- "lib",
24
- "LICENSE"
25
- ],
26
- "keywords": [
27
- "http client",
28
- "fetch",
29
- "odata",
30
- "ts",
31
- "odata2ts"
32
- ],
33
32
  "dependencies": {
34
- "@odata2ts/http-client-base": "^0.4.2"
33
+ "@odata2ts/http-client-base": "^0.5.0"
35
34
  },
36
35
  "devDependencies": {
37
36
  "@odata2ts/odata-core": "^0.3.7",
38
- "@types/jest": "^27.4.1",
39
37
  "@types/node": "^17.0.23",
40
- "jest": "^29.5.0",
41
38
  "rimraf": "^3.0.2",
42
- "ts-jest": "^29.1.0",
43
- "ts-node": "10.7.0",
44
39
  "typescript": "5.0.4"
45
40
  },
46
- "types": "./lib/index.d.ts",
47
- "gitHead": "0886c9e292a84560001d4c4e4503babf3809e1d7"
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "gitHead": "6a0905bd7f201a5c91d83a9319c2a0325a017651"
48
45
  }